v1alpha1

package
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 13, 2026 License: Apache-2.0 Imports: 8 Imported by: 1

Documentation

Overview

Package v1alpha1 contains API Schema definitions for the butler v1alpha1 API group. +kubebuilder:object:generate=true +groupName=butler.butlerlabs.dev

Index

Constants

View Source
const (
	// LabelTeam identifies the team that owns a resource.
	LabelTeam = "butler.butlerlabs.dev/team"

	// LabelTenant identifies the tenant cluster.
	LabelTenant = "butler.butlerlabs.dev/tenant"

	// LabelSourceNamespace indicates the source namespace for generated resources.
	LabelSourceNamespace = "butler.butlerlabs.dev/source-namespace"

	// LabelSourceName indicates the source name for generated resources.
	LabelSourceName = "butler.butlerlabs.dev/source-name"

	// LabelNetworkPool identifies the NetworkPool associated with a resource.
	LabelNetworkPool = "butler.butlerlabs.dev/network-pool"

	// LabelProviderConfig identifies the ProviderConfig associated with a resource.
	LabelProviderConfig = "butler.butlerlabs.dev/provider-config"
)

Butler-specific labels for resource tracking and multi-tenancy.

View Source
const (
	// AnnotationDescription provides a human-readable description.
	AnnotationDescription = "butler.butlerlabs.dev/description"

	// AnnotationCreatedBy indicates who created the resource.
	AnnotationCreatedBy = "butler.butlerlabs.dev/created-by"
)

Butler-specific annotations.

View Source
const (
	// FinalizerTeam is the finalizer for Team resources.
	FinalizerTeam = "butler.butlerlabs.dev/team"

	// FinalizerTenantCluster is the finalizer for TenantCluster resources.
	FinalizerTenantCluster = "butler.butlerlabs.dev/tenantcluster"

	// FinalizerTenantAddon is the finalizer for TenantAddon resources.
	FinalizerTenantAddon = "butler.butlerlabs.dev/tenantaddon"

	// FinalizerUser is the finalizer for User resources.
	FinalizerUser = "butler.butlerlabs.dev/user"

	// FinalizerNetworkPool is the finalizer for NetworkPool resources.
	FinalizerNetworkPool = "butler.butlerlabs.dev/networkpool"

	// FinalizerIPAllocation is the finalizer for IPAllocation resources.
	FinalizerIPAllocation = "butler.butlerlabs.dev/ipallocation"

	// FinalizerProviderConfig is the finalizer for ProviderConfig resources.
	FinalizerProviderConfig = "butler.butlerlabs.dev/providerconfig"
)

Finalizers.

View Source
const (
	// ConditionTypeReady indicates the resource is ready for use.
	ConditionTypeReady = "Ready"

	// ConditionTypeProgressing indicates the resource is making progress toward Ready.
	ConditionTypeProgressing = "Progressing"

	// ConditionTypeDegraded indicates the resource is in a degraded state.
	ConditionTypeDegraded = "Degraded"
)

Condition types following Kubernetes API conventions. See: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties

View Source
const (
	// ReasonPending indicates the request is waiting to be processed.
	ReasonPending = "Pending"

	// ReasonCreating indicates the resource is being created.
	ReasonCreating = "Creating"

	// ReasonCreated indicates the resource was successfully created.
	ReasonCreated = "Created"

	// ReasonRunning indicates the resource is running.
	ReasonRunning = "Running"

	// ReasonWaitingForIP indicates waiting for IP address assignment.
	ReasonWaitingForIP = "WaitingForIP"

	// ReasonFailed indicates the operation failed.
	ReasonFailed = "Failed"

	// ReasonDeleting indicates the resource is being deleted.
	ReasonDeleting = "Deleting"

	// ReasonDeleted indicates the resource was deleted.
	ReasonDeleted = "Deleted"

	// ReasonProviderError indicates an error from the infrastructure provider.
	ReasonProviderError = "ProviderError"

	// ReasonInvalidConfiguration indicates invalid configuration.
	ReasonInvalidConfiguration = "InvalidConfiguration"

	// ReasonReady indicates the resource is ready.
	ReasonReady = "Ready"

	// ReasonWaitingForDependencies indicates waiting for dependencies.
	ReasonWaitingForDependencies = "WaitingForDependencies"

	// ReasonReconciling indicates active reconciliation.
	ReasonReconciling = "Reconciling"

	// ReasonValidationFailed indicates validation failed.
	ReasonValidationFailed = "ValidationFailed"

	// ReasonQuotaExceeded indicates a resource quota was exceeded.
	ReasonQuotaExceeded = "QuotaExceeded"

	// ReasonPoolExhausted indicates a NetworkPool has no available IPs.
	ReasonPoolExhausted = "PoolExhausted"

	// ReasonAllocationFailed indicates an IP allocation failed.
	ReasonAllocationFailed = "AllocationFailed"

	// ReasonProviderAccessDenied indicates the team does not have access to the provider.
	ReasonProviderAccessDenied = "ProviderAccessDenied"

	// ReasonNetworkNotReady indicates the network is not ready.
	ReasonNetworkNotReady = "NetworkNotReady"

	// ReasonCredentialsInvalid indicates provider credentials are invalid.
	ReasonCredentialsInvalid = "CredentialsInvalid"

	// ReasonNetworkReachable indicates the network is reachable.
	ReasonNetworkReachable = "NetworkReachable"

	// ReasonPoolAvailable indicates the network pool has capacity.
	ReasonPoolAvailable = "PoolAvailable"
)

Condition reasons for MachineRequest.

View Source
const (
	// IdentityProviderConditionDiscovered indicates OIDC discovery succeeded.
	IdentityProviderConditionDiscovered = "Discovered"

	// IdentityProviderConditionSecretValid indicates the client secret is valid.
	IdentityProviderConditionSecretValid = "SecretValid"

	// IdentityProviderConditionReady indicates the provider is ready for use.
	IdentityProviderConditionReady = "Ready"
)

IdentityProvider condition types.

View Source
const (
	// TeamConditionNamespaceReady indicates the Team namespace exists.
	TeamConditionNamespaceReady = "NamespaceReady"

	// TeamConditionRBACReady indicates RBAC is configured.
	TeamConditionRBACReady = "RBACReady"

	// TeamConditionReady indicates the Team is fully ready.
	TeamConditionReady = "Ready"

	// TeamConditionQuotaExceeded indicates the Team has exceeded quota.
	TeamConditionQuotaExceeded = "QuotaExceeded"
)

Team condition types.

View Source
const (
	// TenantAddonConditionClusterReady indicates the target cluster is ready.
	TenantAddonConditionClusterReady = "ClusterReady"

	// TenantAddonConditionDependenciesMet indicates dependencies are satisfied.
	TenantAddonConditionDependenciesMet = "DependenciesMet"

	// TenantAddonConditionInstalled indicates the addon is installed.
	TenantAddonConditionInstalled = "Installed"

	// TenantAddonConditionHealthy indicates the addon is healthy.
	TenantAddonConditionHealthy = "Healthy"

	// TenantAddonConditionReady indicates the addon is fully ready.
	TenantAddonConditionReady = "Ready"
)

TenantAddon condition types.

View Source
const (
	// TenantClusterConditionInfrastructureReady indicates CAPI resources are ready.
	TenantClusterConditionInfrastructureReady = "InfrastructureReady"

	// TenantClusterConditionControlPlaneReady indicates the control plane is ready.
	TenantClusterConditionControlPlaneReady = "ControlPlaneReady"

	// TenantClusterConditionWorkersReady indicates workers are ready.
	TenantClusterConditionWorkersReady = "WorkersReady"

	// TenantClusterConditionAddonsReady indicates addons are installed.
	TenantClusterConditionAddonsReady = "AddonsReady"

	// TenantClusterConditionReady indicates the cluster is fully ready.
	TenantClusterConditionReady = "Ready"

	// TenantClusterConditionNetworkReady indicates IP allocation is complete.
	TenantClusterConditionNetworkReady = "NetworkReady"

	// TenantClusterConditionProviderAccessGranted indicates scope check passed.
	TenantClusterConditionProviderAccessGranted = "ProviderAccessGranted"
)

TenantCluster condition types.

View Source
const (
	// UserConditionReady indicates the user account is ready for login.
	UserConditionReady = "Ready"

	// UserConditionInvitePending indicates waiting for user to accept invite.
	UserConditionInvitePending = "InvitePending"

	// UserConditionInviteExpired indicates the invite has expired.
	UserConditionInviteExpired = "InviteExpired"
)

User condition types.

View Source
const (
	// LabelManagedBy indicates the tool managing the resource.
	// Uses the Kubernetes standard label for interoperability with
	// kubectl, Helm, ArgoCD, Prometheus, and other CNCF tools.
	LabelManagedBy = "app.kubernetes.io/managed-by"
)

Kubernetes recommended labels. See: https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/

Variables

View Source
var (
	// GroupVersion is group version used to register these objects.
	GroupVersion = schema.GroupVersion{Group: "butler.butlerlabs.dev", Version: "v1alpha1"}

	// SchemeBuilder is used to add go types to the GroupVersionKind scheme.
	SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}

	// AddToScheme adds the types in this group-version to the given scheme.
	AddToScheme = SchemeBuilder.AddToScheme
)

Functions

This section is empty.

Types

type AWSProviderConfig added in v0.3.0

type AWSProviderConfig struct {
	// Region is the AWS region.
	// +kubebuilder:validation:Required
	Region string `json:"region"`

	// VPCID is the VPC identifier.
	// +optional
	VPCID string `json:"vpcID,omitempty"`

	// SubnetIDs are the subnet identifiers for VM placement.
	// +optional
	SubnetIDs []string `json:"subnetIDs,omitempty"`

	// SecurityGroupIDs are the security group identifiers.
	// +optional
	SecurityGroupIDs []string `json:"securityGroupIDs,omitempty"`
}

AWSProviderConfig contains AWS-specific configuration.

func (*AWSProviderConfig) DeepCopy added in v0.3.0

func (in *AWSProviderConfig) DeepCopy() *AWSProviderConfig

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSProviderConfig.

func (*AWSProviderConfig) DeepCopyInto added in v0.3.0

func (in *AWSProviderConfig) DeepCopyInto(out *AWSProviderConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type AddonCategory

type AddonCategory string

AddonCategory defines the category of an addon for UI grouping. +kubebuilder:validation:Enum=cni;loadbalancer;storage;certmanager;ingress;observability;backup;gitops;security;other

const (
	AddonCategoryCNI           AddonCategory = "cni"
	AddonCategoryLoadBalancer  AddonCategory = "loadbalancer"
	AddonCategoryStorage       AddonCategory = "storage"
	AddonCategoryCertManager   AddonCategory = "certmanager"
	AddonCategoryIngress       AddonCategory = "ingress"
	AddonCategoryObservability AddonCategory = "observability"
	AddonCategoryBackup        AddonCategory = "backup"
	AddonCategoryGitOps        AddonCategory = "gitops"
	AddonCategorySecurity      AddonCategory = "security"
	AddonCategoryOther         AddonCategory = "other"
)

type AddonChartSpec

type AddonChartSpec struct {
	// Repository is the Helm repository URL.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^https?://`
	Repository string `json:"repository"`

	// Name is the chart name within the repository.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Name string `json:"name"`

	// DefaultVersion is the chart version used when TenantAddon
	// doesn't specify a version. Should be a stable, tested version.
	// +kubebuilder:validation:Required
	DefaultVersion string `json:"defaultVersion"`

	// AvailableVersions lists other versions known to work with Butler.
	// Used for version dropdown in UI. If empty, only defaultVersion shown.
	// +optional
	AvailableVersions []string `json:"availableVersions,omitempty"`
}

AddonChartSpec specifies the Helm chart to install.

func (*AddonChartSpec) DeepCopy

func (in *AddonChartSpec) DeepCopy() *AddonChartSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddonChartSpec.

func (*AddonChartSpec) DeepCopyInto

func (in *AddonChartSpec) DeepCopyInto(out *AddonChartSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type AddonDefaults

type AddonDefaults struct {
	// Namespace is the target namespace for installation.
	// If not specified, defaults to the addon name.
	// +optional
	Namespace string `json:"namespace,omitempty"`

	// ReleaseName is the Helm release name.
	// If not specified, defaults to the addon name.
	// +optional
	ReleaseName string `json:"releaseName,omitempty"`

	// CreateNamespace indicates whether to create the namespace.
	// +kubebuilder:default=true
	// +optional
	CreateNamespace bool `json:"createNamespace,omitempty"`

	// Values are default Helm values applied during installation.
	// These can be overridden in TenantAddon.spec.values.
	// +optional
	// +kubebuilder:pruning:PreserveUnknownFields
	Values *ExtensionValues `json:"values,omitempty"`

	// Timeout for Helm operations.
	// +kubebuilder:default="10m"
	// +optional
	Timeout string `json:"timeout,omitempty"`
}

AddonDefaults provides default installation settings.

func (*AddonDefaults) DeepCopy

func (in *AddonDefaults) DeepCopy() *AddonDefaults

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddonDefaults.

func (*AddonDefaults) DeepCopyInto

func (in *AddonDefaults) DeepCopyInto(out *AddonDefaults)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type AddonDefinition

type AddonDefinition struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec AddonDefinitionSpec `json:"spec,omitempty"`
}

AddonDefinition defines an addon available for installation in tenant clusters. AddonDefinitions are cluster-scoped resources that describe Helm charts that can be installed via TenantAddon resources.

Butler ships with built-in AddonDefinitions for common CNCF tools. Organizations can add custom AddonDefinitions for internal charts.

func (*AddonDefinition) DeepCopy

func (in *AddonDefinition) DeepCopy() *AddonDefinition

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddonDefinition.

func (*AddonDefinition) DeepCopyInto

func (in *AddonDefinition) DeepCopyInto(out *AddonDefinition)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*AddonDefinition) DeepCopyObject

func (in *AddonDefinition) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

func (*AddonDefinition) GetNamespace

func (a *AddonDefinition) GetNamespace() string

GetNamespace returns the target namespace, defaulting to addon name.

func (*AddonDefinition) GetReleaseName

func (a *AddonDefinition) GetReleaseName() string

GetReleaseName returns the release name, defaulting to addon name.

func (*AddonDefinition) IsBuiltIn

func (a *AddonDefinition) IsBuiltIn() bool

IsBuiltIn returns true if this is a Butler-maintained addon.

type AddonDefinitionList

type AddonDefinitionList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []AddonDefinition `json:"items"`
}

AddonDefinitionList contains a list of AddonDefinition.

func (*AddonDefinitionList) DeepCopy

func (in *AddonDefinitionList) DeepCopy() *AddonDefinitionList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddonDefinitionList.

func (*AddonDefinitionList) DeepCopyInto

func (in *AddonDefinitionList) DeepCopyInto(out *AddonDefinitionList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*AddonDefinitionList) DeepCopyObject

func (in *AddonDefinitionList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type AddonDefinitionSpec

type AddonDefinitionSpec struct {
	// DisplayName is the human-readable name shown in the Butler UI.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	// +kubebuilder:validation:MaxLength=64
	DisplayName string `json:"displayName"`

	// Description explains what this addon provides.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	// +kubebuilder:validation:MaxLength=512
	Description string `json:"description"`

	// Category groups addons in the UI for easier discovery.
	// +kubebuilder:validation:Required
	Category AddonCategory `json:"category"`

	// Icon is an emoji or icon identifier for UI display.
	// +kubebuilder:validation:MaxLength=8
	// +optional
	Icon string `json:"icon,omitempty"`

	// Chart specifies the Helm chart to install.
	// +kubebuilder:validation:Required
	Chart AddonChartSpec `json:"chart"`

	// Defaults provides installation defaults.
	// These can be overridden in TenantAddon.
	// +optional
	Defaults *AddonDefaults `json:"defaults,omitempty"`

	// Platform marks this as a core platform addon.
	// Platform addons are installed during cluster bootstrap and cannot
	// be uninstalled via the UI. They appear in a separate section.
	// +kubebuilder:default=false
	// +optional
	Platform bool `json:"platform,omitempty"`

	// DependsOn lists addon names that must be installed first.
	// The TenantAddon controller will wait for these dependencies
	// to be in Installed phase before proceeding.
	// +optional
	DependsOn []string `json:"dependsOn,omitempty"`

	// Maintainer identifies who maintains this addon definition.
	// +optional
	Maintainer *AddonMaintainer `json:"maintainer,omitempty"`

	// Links provides URLs for documentation, source, etc.
	// +optional
	Links *AddonLinks `json:"links,omitempty"`
}

AddonDefinitionSpec defines the desired state of AddonDefinition. An AddonDefinition is a cluster-scoped resource that defines an addon available for installation in tenant clusters.

func (*AddonDefinitionSpec) DeepCopy

func (in *AddonDefinitionSpec) DeepCopy() *AddonDefinitionSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddonDefinitionSpec.

func (*AddonDefinitionSpec) DeepCopyInto

func (in *AddonDefinitionSpec) DeepCopyInto(out *AddonDefinitionSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type AddonLinks struct {
	// Documentation URL.
	// +optional
	Documentation string `json:"documentation,omitempty"`

	// Source code URL.
	// +optional
	Source string `json:"source,omitempty"`

	// Project homepage URL.
	// +optional
	Homepage string `json:"homepage,omitempty"`
}

AddonLinks provides URLs related to the addon.

func (*AddonLinks) DeepCopy

func (in *AddonLinks) DeepCopy() *AddonLinks

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddonLinks.

func (*AddonLinks) DeepCopyInto

func (in *AddonLinks) DeepCopyInto(out *AddonLinks)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type AddonMaintainer

type AddonMaintainer struct {
	// Name of the maintainer.
	// +optional
	Name string `json:"name,omitempty"`

	// Email of the maintainer.
	// +optional
	Email string `json:"email,omitempty"`
}

AddonMaintainer identifies the maintainer of an addon definition.

func (*AddonMaintainer) DeepCopy

func (in *AddonMaintainer) DeepCopy() *AddonMaintainer

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddonMaintainer.

func (*AddonMaintainer) DeepCopyInto

func (in *AddonMaintainer) DeepCopyInto(out *AddonMaintainer)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type AddonStatus

type AddonStatus struct {
	// Name is the addon name.
	Name string `json:"name"`

	// Version is the installed version.
	Version string `json:"version"`

	// Status is the addon health status.
	// +kubebuilder:validation:Enum=Pending;Installing;Healthy;Degraded;Failed
	Status string `json:"status"`

	// ManagedBy indicates who manages this addon.
	// +kubebuilder:validation:Enum=butler;flux;argocd;manual
	ManagedBy string `json:"managedBy"`
}

AddonStatus shows the status of an installed addon.

func (*AddonStatus) DeepCopy

func (in *AddonStatus) DeepCopy() *AddonStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddonStatus.

func (*AddonStatus) DeepCopyInto

func (in *AddonStatus) DeepCopyInto(out *AddonStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type AddonVersions

type AddonVersions struct {
	// Cilium version.
	// +optional
	Cilium string `json:"cilium,omitempty"`

	// MetalLB version.
	// +optional
	MetalLB string `json:"metallb,omitempty"`

	// CertManager version.
	// +optional
	CertManager string `json:"certManager,omitempty"`

	// Longhorn version.
	// +optional
	Longhorn string `json:"longhorn,omitempty"`

	// Traefik version.
	// +optional
	Traefik string `json:"traefik,omitempty"`

	// FluxCD version.
	// +optional
	FluxCD string `json:"fluxcd,omitempty"`
}

AddonVersions specifies default versions for Butler-managed addons.

func (*AddonVersions) DeepCopy

func (in *AddonVersions) DeepCopy() *AddonVersions

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddonVersions.

func (*AddonVersions) DeepCopyInto

func (in *AddonVersions) DeepCopyInto(out *AddonVersions)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type AddonsSpec

type AddonsSpec struct {
	// CNI configures the Container Network Interface.
	// +optional
	CNI *CNISpec `json:"cni,omitempty"`

	// LoadBalancer configures the load balancer.
	// +optional
	LoadBalancer *LoadBalancerSpec `json:"loadBalancer,omitempty"`

	// CertManager configures cert-manager.
	// +optional
	CertManager *CertManagerSpec `json:"certManager,omitempty"`

	// Storage configures persistent storage.
	// +optional
	Storage *StorageSpec `json:"storage,omitempty"`

	// Ingress configures the ingress controller.
	// +optional
	Ingress *IngressSpec `json:"ingress,omitempty"`

	// GitOps configures GitOps (Flux or ArgoCD).
	// +optional
	GitOps *GitOpsSpec `json:"gitops,omitempty"`
}

AddonsSpec defines the addons to install.

func (*AddonsSpec) DeepCopy

func (in *AddonsSpec) DeepCopy() *AddonsSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddonsSpec.

func (*AddonsSpec) DeepCopyInto

func (in *AddonsSpec) DeepCopyInto(out *AddonsSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type AzureProviderConfig added in v0.3.0

type AzureProviderConfig struct {
	// SubscriptionID is the Azure subscription ID.
	// +kubebuilder:validation:Required
	SubscriptionID string `json:"subscriptionID"`

	// ResourceGroup is the Azure resource group.
	// +kubebuilder:validation:Required
	ResourceGroup string `json:"resourceGroup"`

	// Location is the Azure region.
	// +optional
	Location string `json:"location,omitempty"`

	// VNetName is the Azure Virtual Network name.
	// +optional
	VNetName string `json:"vnetName,omitempty"`

	// SubnetName is the subnet within the VNet.
	// +optional
	SubnetName string `json:"subnetName,omitempty"`
}

AzureProviderConfig contains Azure-specific configuration.

func (*AzureProviderConfig) DeepCopy added in v0.3.0

func (in *AzureProviderConfig) DeepCopy() *AzureProviderConfig

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureProviderConfig.

func (*AzureProviderConfig) DeepCopyInto added in v0.3.0

func (in *AzureProviderConfig) DeepCopyInto(out *AzureProviderConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ButlerConfig

type ButlerConfig struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   ButlerConfigSpec   `json:"spec,omitempty"`
	Status ButlerConfigStatus `json:"status,omitempty"`
}

ButlerConfig is the Schema for the butlerconfigs API. It is a singleton resource that configures platform-wide Butler settings. Only one ButlerConfig named "butler" should exist in the cluster.

func (*ButlerConfig) DeepCopy

func (in *ButlerConfig) DeepCopy() *ButlerConfig

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ButlerConfig.

func (*ButlerConfig) DeepCopyInto

func (in *ButlerConfig) DeepCopyInto(out *ButlerConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*ButlerConfig) DeepCopyObject

func (in *ButlerConfig) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

func (*ButlerConfig) GetControlPlaneExposureControllerType added in v0.2.0

func (c *ButlerConfig) GetControlPlaneExposureControllerType() string

GetControlPlaneExposureControllerType returns the ingress controller type for automatic TLS passthrough.

func (*ButlerConfig) GetControlPlaneExposureGatewayRef added in v0.2.0

func (c *ButlerConfig) GetControlPlaneExposureGatewayRef() string

GetControlPlaneExposureGatewayRef returns the Gateway reference for Gateway mode.

func (*ButlerConfig) GetControlPlaneExposureHostname added in v0.2.0

func (c *ButlerConfig) GetControlPlaneExposureHostname() string

GetControlPlaneExposureHostname returns the hostname pattern for tenant API servers.

func (*ButlerConfig) GetControlPlaneExposureIngressClassName added in v0.2.0

func (c *ButlerConfig) GetControlPlaneExposureIngressClassName() string

GetControlPlaneExposureIngressClassName returns the Ingress class name for Ingress mode.

func (*ButlerConfig) GetControlPlaneExposureMode added in v0.2.0

func (c *ButlerConfig) GetControlPlaneExposureMode() ControlPlaneExposureMode

GetControlPlaneExposureMode returns the control plane exposure mode, defaulting to LoadBalancer.

func (*ButlerConfig) GetGitProviderURL added in v0.2.0

func (c *ButlerConfig) GetGitProviderURL() string

GetGitProviderURL returns the Git provider URL with a sensible default.

func (*ButlerConfig) IsGitProviderConfigured added in v0.2.0

func (c *ButlerConfig) IsGitProviderConfigured() bool

IsGitProviderConfigured returns true if a Git provider is configured.

func (*ButlerConfig) IsTCPProxyRequired added in v0.2.0

func (c *ButlerConfig) IsTCPProxyRequired() bool

IsTCPProxyRequired returns true if tcp-proxy should be auto-enabled for tenants. This is true when the exposure mode is Ingress or Gateway.

type ButlerConfigList

type ButlerConfigList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []ButlerConfig `json:"items"`
}

ButlerConfigList contains a list of ButlerConfig.

func (*ButlerConfigList) DeepCopy

func (in *ButlerConfigList) DeepCopy() *ButlerConfigList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ButlerConfigList.

func (*ButlerConfigList) DeepCopyInto

func (in *ButlerConfigList) DeepCopyInto(out *ButlerConfigList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*ButlerConfigList) DeepCopyObject

func (in *ButlerConfigList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type ButlerConfigSpec

type ButlerConfigSpec struct {
	// MultiTenancy configures how multi-tenancy is handled.
	// +optional
	MultiTenancy MultiTenancyConfig `json:"multiTenancy,omitempty"`

	// DefaultNamespace is the namespace for TenantClusters when not using Teams.
	// Used in Disabled and Optional modes.
	// +kubebuilder:default="butler-tenants"
	// +optional
	DefaultNamespace string `json:"defaultNamespace,omitempty"`

	// DefaultProviderConfigRef references the default ProviderConfig.
	// Used when Teams or TenantClusters don't specify their own.
	// +optional
	DefaultProviderConfigRef *LocalObjectReference `json:"defaultProviderConfigRef,omitempty"`

	// DefaultTeamLimits are the default resource limits for new Teams.
	// Admins can override these when creating individual Teams.
	// +optional
	DefaultTeamLimits *ResourceLimits `json:"defaultTeamLimits,omitempty"`

	// DefaultAddonVersions specifies the default versions for addons.
	// Used when TenantCluster doesn't specify versions.
	// +optional
	DefaultAddonVersions *AddonVersions `json:"defaultAddonVersions,omitempty"`

	// GitProvider configures the default Git provider for GitOps operations.
	// This enables features like exporting clusters to GitOps, enabling Flux
	// on clusters, and managing addons via Git repositories.
	// +optional
	GitProvider *GitProviderConfig `json:"gitProvider,omitempty"`

	// ControlPlaneExposure configures how tenant control planes are exposed.
	// This is a platform-level setting populated from ClusterBootstrap during
	// initial setup and inherited by all TenantClusters.
	// +optional
	ControlPlaneExposure *ControlPlaneExposureSpec `json:"controlPlaneExposure,omitempty"`
}

ButlerConfigSpec defines the desired state of ButlerConfig.

func (*ButlerConfigSpec) DeepCopy

func (in *ButlerConfigSpec) DeepCopy() *ButlerConfigSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ButlerConfigSpec.

func (*ButlerConfigSpec) DeepCopyInto

func (in *ButlerConfigSpec) DeepCopyInto(out *ButlerConfigSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ButlerConfigStatus

type ButlerConfigStatus struct {
	// Conditions represent the latest available observations of the config's state.
	// +optional
	// +listType=map
	// +listMapKey=type
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// ObservedGeneration is the last observed generation.
	// +optional
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`

	// TeamCount is the current number of Teams.
	// +optional
	TeamCount int32 `json:"teamCount,omitempty"`

	// ClusterCount is the current number of TenantClusters.
	// +optional
	ClusterCount int32 `json:"clusterCount,omitempty"`

	// GitProvider shows the status of the configured Git provider.
	// +optional
	GitProvider *GitProviderStatus `json:"gitProvider,omitempty"`

	// ControlPlaneExposureMode is the active control plane exposure mode.
	// +optional
	ControlPlaneExposureMode ControlPlaneExposureMode `json:"controlPlaneExposureMode,omitempty"`

	// TCPProxyRequired indicates if tcp-proxy is auto-enabled for tenants.
	// True when ControlPlaneExposureMode is Ingress or Gateway.
	// +optional
	TCPProxyRequired bool `json:"tcpProxyRequired,omitempty"`
}

ButlerConfigStatus defines the observed state of ButlerConfig.

func (*ButlerConfigStatus) DeepCopy

func (in *ButlerConfigStatus) DeepCopy() *ButlerConfigStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ButlerConfigStatus.

func (*ButlerConfigStatus) DeepCopyInto

func (in *ButlerConfigStatus) DeepCopyInto(out *ButlerConfigStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ButlerControllerAddonSpec

type ButlerControllerAddonSpec struct {
	// Enabled controls whether butler-controller is installed
	// +kubebuilder:default=true
	// +optional
	Enabled *bool `json:"enabled,omitempty"`

	// Version is the butler-controller version (image tag)
	// +kubebuilder:default="latest"
	// +optional
	Version string `json:"version,omitempty"`

	// Image is the full image reference (overrides default)
	// +optional
	// +kubebuilder:default="ghcr.io/butlerdotdev/butler-controller"
	Image string `json:"image,omitempty"`
}

ButlerControllerAddonSpec defines Butler controller configuration

func (*ButlerControllerAddonSpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ButlerControllerAddonSpec.

func (*ButlerControllerAddonSpec) DeepCopyInto

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type CAPIAddonSpec

type CAPIAddonSpec struct {
	// Enabled controls whether CAPI is installed
	// +kubebuilder:default=true
	// +optional
	Enabled *bool `json:"enabled,omitempty"`

	// Version is the CAPI core version
	// +kubebuilder:default="v1.9.4"
	// +optional
	Version string `json:"version,omitempty"`

	// InfrastructureProviders lists additional infrastructure providers to install
	// The management cluster's provider is ALWAYS included automatically
	// +optional
	InfrastructureProviders []CAPIInfraProviderSpec `json:"infrastructureProviders,omitempty"`
}

CAPIAddonSpec defines Cluster API configuration

func (*CAPIAddonSpec) DeepCopy

func (in *CAPIAddonSpec) DeepCopy() *CAPIAddonSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CAPIAddonSpec.

func (*CAPIAddonSpec) DeepCopyInto

func (in *CAPIAddonSpec) DeepCopyInto(out *CAPIAddonSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type CAPIInfraProviderSpec

type CAPIInfraProviderSpec struct {
	// Name is the provider name
	// +kubebuilder:validation:Enum=harvester;nutanix;proxmox
	Name string `json:"name"`

	// Version overrides the default provider version
	// +optional
	Version string `json:"version,omitempty"`

	// CredentialsSecretRef points to provider credentials
	// Required for providers other than the management cluster's provider
	// +optional
	CredentialsSecretRef *SecretReference `json:"credentialsSecretRef,omitempty"`
}

CAPIInfraProviderSpec defines an infrastructure provider configuration

func (*CAPIInfraProviderSpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CAPIInfraProviderSpec.

func (*CAPIInfraProviderSpec) DeepCopyInto

func (in *CAPIInfraProviderSpec) DeepCopyInto(out *CAPIInfraProviderSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type CNIAddonSpec

type CNIAddonSpec struct {
	// Type is the CNI type
	// +kubebuilder:validation:Enum=cilium;none
	// +kubebuilder:default=cilium
	Type string `json:"type,omitempty"`

	// Version is the addon version
	// +optional
	Version string `json:"version,omitempty"`

	// HubbleEnabled enables Hubble observability (Cilium only)
	// +optional
	// +kubebuilder:default=true
	HubbleEnabled bool `json:"hubbleEnabled,omitempty"`
}

CNIAddonSpec defines CNI configuration

func (*CNIAddonSpec) DeepCopy

func (in *CNIAddonSpec) DeepCopy() *CNIAddonSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CNIAddonSpec.

func (*CNIAddonSpec) DeepCopyInto

func (in *CNIAddonSpec) DeepCopyInto(out *CNIAddonSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type CNISpec

type CNISpec struct {
	// Provider is the CNI provider.
	// +kubebuilder:validation:Enum=cilium
	// +kubebuilder:default="cilium"
	// +optional
	Provider string `json:"provider,omitempty"`

	// Version is the addon version.
	// +kubebuilder:validation:Required
	Version string `json:"version"`

	// Values are Helm values for customization.
	// +optional
	// +kubebuilder:pruning:PreserveUnknownFields
	Values *ExtensionValues `json:"values,omitempty"`
}

CNISpec configures the CNI addon.

func (*CNISpec) DeepCopy

func (in *CNISpec) DeepCopy() *CNISpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CNISpec.

func (*CNISpec) DeepCopyInto

func (in *CNISpec) DeepCopyInto(out *CNISpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type CertManagerAddonSpec

type CertManagerAddonSpec struct {
	// Enabled controls whether cert-manager is installed
	// +optional
	// +kubebuilder:default=true
	Enabled *bool `json:"enabled,omitempty"`

	// Version is the addon version
	// +optional
	Version string `json:"version,omitempty"`
}

CertManagerAddonSpec defines cert-manager configuration

func (*CertManagerAddonSpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CertManagerAddonSpec.

func (*CertManagerAddonSpec) DeepCopyInto

func (in *CertManagerAddonSpec) DeepCopyInto(out *CertManagerAddonSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type CertManagerSpec

type CertManagerSpec struct {
	// Enabled indicates whether cert-manager should be installed.
	// +kubebuilder:default=true
	// +optional
	Enabled bool `json:"enabled,omitempty"`

	// Version is the addon version.
	// +kubebuilder:validation:Required
	Version string `json:"version"`

	// Values are Helm values for customization.
	// +optional
	// +kubebuilder:pruning:PreserveUnknownFields
	Values *ExtensionValues `json:"values,omitempty"`
}

CertManagerSpec configures cert-manager.

func (*CertManagerSpec) DeepCopy

func (in *CertManagerSpec) DeepCopy() *CertManagerSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CertManagerSpec.

func (*CertManagerSpec) DeepCopyInto

func (in *CertManagerSpec) DeepCopyInto(out *CertManagerSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ClusterBootstrap

type ClusterBootstrap struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   ClusterBootstrapSpec   `json:"spec,omitempty"`
	Status ClusterBootstrapStatus `json:"status,omitempty"`
}

ClusterBootstrap is the Schema for the clusterbootstraps API

func (*ClusterBootstrap) AllMachinesRunning

func (c *ClusterBootstrap) AllMachinesRunning() bool

AllMachinesRunning returns true if all machines are in Running phase with IPs

func (*ClusterBootstrap) DeepCopy

func (in *ClusterBootstrap) DeepCopy() *ClusterBootstrap

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrap.

func (*ClusterBootstrap) DeepCopyInto

func (in *ClusterBootstrap) DeepCopyInto(out *ClusterBootstrap)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*ClusterBootstrap) DeepCopyObject

func (in *ClusterBootstrap) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

func (*ClusterBootstrap) GetControlPlaneExposureGatewayRef added in v0.2.0

func (c *ClusterBootstrap) GetControlPlaneExposureGatewayRef() string

GetControlPlaneExposureGatewayRef returns the Gateway reference for Gateway mode

func (*ClusterBootstrap) GetControlPlaneExposureHostname added in v0.2.0

func (c *ClusterBootstrap) GetControlPlaneExposureHostname() string

GetControlPlaneExposureHostname returns the hostname pattern for tenant API servers

func (*ClusterBootstrap) GetControlPlaneExposureIngressClassName added in v0.2.0

func (c *ClusterBootstrap) GetControlPlaneExposureIngressClassName() string

GetControlPlaneExposureIngressClassName returns the Ingress class name for Ingress mode

func (*ClusterBootstrap) GetControlPlaneExposureMode added in v0.2.0

func (c *ClusterBootstrap) GetControlPlaneExposureMode() ControlPlaneExposureMode

GetControlPlaneExposureMode returns the control plane exposure mode, defaulting to LoadBalancer

func (*ClusterBootstrap) GetControlPlaneIPs

func (c *ClusterBootstrap) GetControlPlaneIPs() []string

GetControlPlaneIPs returns the IP addresses of control plane nodes

func (*ClusterBootstrap) GetControlPlaneReplicas

func (c *ClusterBootstrap) GetControlPlaneReplicas() int32

GetControlPlaneReplicas returns the effective control plane replicas based on topology

func (*ClusterBootstrap) GetExpectedMachineCount

func (c *ClusterBootstrap) GetExpectedMachineCount() int

GetExpectedMachineCount returns the expected number of machines based on topology

func (*ClusterBootstrap) GetLoadBalancerAddressPool

func (c *ClusterBootstrap) GetLoadBalancerAddressPool() string

GetLoadBalancerAddressPool returns the address pool string for MetalLB Prefers network.loadBalancerPool (validated), falls back to addons.loadBalancer.addressPool (legacy)

func (*ClusterBootstrap) GetStorageReplicaCount

func (c *ClusterBootstrap) GetStorageReplicaCount() int32

GetStorageReplicaCount returns the effective storage replica count based on topology

func (*ClusterBootstrap) GetWorkerIPs

func (c *ClusterBootstrap) GetWorkerIPs() []string

GetWorkerIPs returns the IP addresses of worker nodes

func (*ClusterBootstrap) IsFailed

func (c *ClusterBootstrap) IsFailed() bool

IsFailed returns true if the cluster bootstrap has failed

func (*ClusterBootstrap) IsReady

func (c *ClusterBootstrap) IsReady() bool

IsReady returns true if the cluster bootstrap is complete

func (*ClusterBootstrap) IsSingleNode

func (c *ClusterBootstrap) IsSingleNode() bool

IsSingleNode returns true if this is a single-node topology

func (*ClusterBootstrap) IsTCPProxyRequired added in v0.2.0

func (c *ClusterBootstrap) IsTCPProxyRequired() bool

IsTCPProxyRequired returns true if tcp-proxy should be auto-enabled for tenants. This is true when the exposure mode is Ingress or Gateway.

type ClusterBootstrapAddonsSpec

type ClusterBootstrapAddonsSpec struct {
	// CNI defines the CNI configuration
	// +optional
	CNI *CNIAddonSpec `json:"cni,omitempty"`

	// Storage defines storage configuration
	// +optional
	Storage *StorageAddonSpec `json:"storage,omitempty"`

	// LoadBalancer defines load balancer configuration
	// +optional
	LoadBalancer *LoadBalancerAddonSpec `json:"loadBalancer,omitempty"`

	// GitOps defines GitOps configuration
	// +optional
	GitOps *GitOpsAddonSpec `json:"gitOps,omitempty"`

	// ControlPlaneHA defines control plane HA configuration
	// +optional
	ControlPlaneHA *ControlPlaneHAAddonSpec `json:"controlPlaneHA,omitempty"`

	// CertManager defines cert-manager configuration
	// +optional
	CertManager *CertManagerAddonSpec `json:"certManager,omitempty"`

	// Ingress defines ingress controller configuration
	// +optional
	Ingress *IngressAddonSpec `json:"ingress,omitempty"`

	// ControlPlaneProvider defines hosted control plane provider (Steward)
	// +optional
	ControlPlaneProvider *ControlPlaneProviderAddonSpec `json:"controlPlaneProvider,omitempty"`

	// CAPI defines Cluster API configuration
	// +optional
	CAPI *CAPIAddonSpec `json:"capi,omitempty"`

	// ButlerController defines butler-controller configuration
	// +optional
	ButlerController *ButlerControllerAddonSpec `json:"butlerController,omitempty"`

	// Console defines Butler Console configuration
	// +optional
	Console *ConsoleAddonSpec `json:"console,omitempty"`
}

ClusterBootstrapAddonsSpec defines which addons to install during bootstrap

func (*ClusterBootstrapAddonsSpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapAddonsSpec.

func (*ClusterBootstrapAddonsSpec) DeepCopyInto

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*ClusterBootstrapAddonsSpec) GetButlerControllerImage

func (s *ClusterBootstrapAddonsSpec) GetButlerControllerImage() string

GetButlerControllerImage returns the full butler-controller image reference

func (*ClusterBootstrapAddonsSpec) GetCAPIVersion

func (s *ClusterBootstrapAddonsSpec) GetCAPIVersion() string

GetCAPIVersion returns the CAPI version to install

func (*ClusterBootstrapAddonsSpec) GetConsoleIngressHost

func (s *ClusterBootstrapAddonsSpec) GetConsoleIngressHost(clusterName string) string

GetConsoleIngressHost returns the ingress host, with fallback to cluster name

func (*ClusterBootstrapAddonsSpec) GetConsoleVersion

func (s *ClusterBootstrapAddonsSpec) GetConsoleVersion() string

GetConsoleVersion returns the console version to install

func (*ClusterBootstrapAddonsSpec) IsButlerControllerEnabled

func (s *ClusterBootstrapAddonsSpec) IsButlerControllerEnabled() bool

IsButlerControllerEnabled returns whether butler-controller should be installed

func (*ClusterBootstrapAddonsSpec) IsCAPIEnabled

func (s *ClusterBootstrapAddonsSpec) IsCAPIEnabled() bool

IsCAPIEnabled returns whether CAPI should be installed

func (*ClusterBootstrapAddonsSpec) IsConsoleEnabled

func (s *ClusterBootstrapAddonsSpec) IsConsoleEnabled() bool

IsConsoleEnabled returns whether butler-console should be installed

type ClusterBootstrapClusterSpec

type ClusterBootstrapClusterSpec struct {
	// Name is the cluster name used for resource naming
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	// +kubebuilder:validation:MaxLength=63
	// +kubebuilder:validation:Pattern=`^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`
	Name string `json:"name"`

	// Topology defines the cluster topology
	// - "single-node": Single control plane node that also runs workloads (no workers needed)
	// - "ha": High-availability with separate control plane and worker nodes (default)
	// +kubebuilder:validation:Enum=single-node;ha
	// +kubebuilder:default=ha
	// +optional
	Topology ClusterTopology `json:"topology,omitempty"`

	// ControlPlane defines control plane node configuration
	// +kubebuilder:validation:Required
	ControlPlane ClusterBootstrapNodePool `json:"controlPlane"`

	// Workers defines worker node configuration
	// Ignored when topology is "single-node"
	// +optional
	Workers *ClusterBootstrapNodePool `json:"workers,omitempty"`
}

ClusterBootstrapClusterSpec defines the cluster topology for bootstrap

func (*ClusterBootstrapClusterSpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapClusterSpec.

func (*ClusterBootstrapClusterSpec) DeepCopyInto

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ClusterBootstrapList

type ClusterBootstrapList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []ClusterBootstrap `json:"items"`
}

ClusterBootstrapList contains a list of ClusterBootstrap

func (*ClusterBootstrapList) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapList.

func (*ClusterBootstrapList) DeepCopyInto

func (in *ClusterBootstrapList) DeepCopyInto(out *ClusterBootstrapList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*ClusterBootstrapList) DeepCopyObject

func (in *ClusterBootstrapList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type ClusterBootstrapMachineStatus

type ClusterBootstrapMachineStatus struct {
	// Name is the MachineRequest name
	Name string `json:"name"`

	// Role is the machine role (control-plane or worker)
	Role string `json:"role"`

	// Phase is the MachineRequest phase
	Phase string `json:"phase"`

	// IPAddress is the machine's IP address
	// +optional
	IPAddress string `json:"ipAddress,omitempty"`

	// TalosConfigured indicates if Talos config has been applied
	// +optional
	TalosConfigured bool `json:"talosConfigured,omitempty"`

	// Ready indicates if the node has joined the cluster
	// +optional
	Ready bool `json:"ready,omitempty"`
}

ClusterBootstrapMachineStatus tracks the status of a machine in the cluster

func (*ClusterBootstrapMachineStatus) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapMachineStatus.

func (*ClusterBootstrapMachineStatus) DeepCopyInto

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ClusterBootstrapNetworkSpec

type ClusterBootstrapNetworkSpec struct {
	// PodCIDR is the CIDR for pod networking
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$`
	PodCIDR string `json:"podCIDR"`

	// ServiceCIDR is the CIDR for service networking
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$`
	ServiceCIDR string `json:"serviceCIDR"`

	// VIP is the virtual IP for the control plane endpoint (kube-vip)
	// This IP is used ONLY for kube-apiserver HA and must NOT be in LoadBalancerPool
	// For single-node topology, the VIP still provides a stable endpoint for the API server
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^([0-9]{1,3}\.){3}[0-9]{1,3}$`
	VIP string `json:"vip"`

	// VIPInterface is the network interface for the VIP (optional, auto-detected)
	// +optional
	VIPInterface string `json:"vipInterface,omitempty"`

	// LoadBalancerPool defines the IP range for MetalLB LoadBalancer services
	// This range must NOT include the VIP address to avoid conflicts between
	// kube-vip (control plane) and MetalLB (services)
	// +optional
	LoadBalancerPool *LoadBalancerPoolSpec `json:"loadBalancerPool,omitempty"`
}

ClusterBootstrapNetworkSpec defines cluster networking for bootstrap

func (*ClusterBootstrapNetworkSpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapNetworkSpec.

func (*ClusterBootstrapNetworkSpec) DeepCopyInto

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*ClusterBootstrapNetworkSpec) Validate

func (n *ClusterBootstrapNetworkSpec) Validate() error

Validate validates the network configuration

type ClusterBootstrapNodePool

type ClusterBootstrapNodePool struct {
	// Replicas is the number of nodes in this pool
	// For single-node topology, controlPlane.replicas is forced to 1
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Minimum=1
	// +kubebuilder:validation:Maximum=10
	Replicas int32 `json:"replicas"`

	// CPU is the number of CPU cores per node
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Minimum=1
	// +kubebuilder:validation:Maximum=128
	CPU int32 `json:"cpu"`

	// MemoryMB is the memory in MB per node (matches MachineRequest)
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Minimum=2048
	MemoryMB int32 `json:"memoryMB"`

	// DiskGB is the root disk size in GB per node (matches MachineRequest)
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Minimum=20
	DiskGB int32 `json:"diskGB"`

	// ExtraDisks defines additional disks to attach to each node
	// Reuses DiskSpec from machinerequest_types.go
	// +optional
	ExtraDisks []DiskSpec `json:"extraDisks,omitempty"`

	// Labels to apply to nodes in this pool
	// +optional
	Labels map[string]string `json:"labels,omitempty"`
}

ClusterBootstrapNodePool defines a pool of nodes for bootstrap Uses same units as MachineRequest (MemoryMB, DiskGB) for consistency

func (*ClusterBootstrapNodePool) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapNodePool.

func (*ClusterBootstrapNodePool) DeepCopyInto

func (in *ClusterBootstrapNodePool) DeepCopyInto(out *ClusterBootstrapNodePool)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ClusterBootstrapPhase

type ClusterBootstrapPhase string

ClusterBootstrapPhase represents the current phase of bootstrap

const (
	ClusterBootstrapPhasePending              ClusterBootstrapPhase = "Pending"
	ClusterBootstrapPhaseProvisioningMachines ClusterBootstrapPhase = "ProvisioningMachines"
	ClusterBootstrapPhaseConfiguringTalos     ClusterBootstrapPhase = "ConfiguringTalos"
	ClusterBootstrapPhaseBootstrappingCluster ClusterBootstrapPhase = "BootstrappingCluster"
	ClusterBootstrapPhaseInstallingAddons     ClusterBootstrapPhase = "InstallingAddons"
	ClusterBootstrapPhasePivoting             ClusterBootstrapPhase = "Pivoting"
	ClusterBootstrapPhaseReady                ClusterBootstrapPhase = "Ready"
	ClusterBootstrapPhaseFailed               ClusterBootstrapPhase = "Failed"
)

type ClusterBootstrapSpec

type ClusterBootstrapSpec struct {
	// Provider is the infrastructure provider type (harvester, nutanix, proxmox)
	// +kubebuilder:validation:Enum=harvester;nutanix;proxmox
	Provider string `json:"provider"`

	// ProviderRef references the ProviderConfig to use for provisioning
	// Reuses existing ProviderReference from common_types.go
	// +kubebuilder:validation:Required
	ProviderRef ProviderReference `json:"providerRef"`

	// Cluster defines the cluster configuration
	// +kubebuilder:validation:Required
	Cluster ClusterBootstrapClusterSpec `json:"cluster"`

	// Network defines network configuration for the cluster
	// +kubebuilder:validation:Required
	Network ClusterBootstrapNetworkSpec `json:"network"`

	// Talos defines Talos-specific configuration
	// +kubebuilder:validation:Required
	Talos ClusterBootstrapTalosSpec `json:"talos"`

	// Addons defines which addons to install
	// +optional
	Addons ClusterBootstrapAddonsSpec `json:"addons,omitempty"`

	// ControlPlaneExposure configures how tenant control planes are exposed.
	// This is a platform-level setting written to ButlerConfig after bootstrap
	// and inherited by all TenantClusters.
	// Defaults to LoadBalancer mode if not specified.
	// +optional
	ControlPlaneExposure *ControlPlaneExposureSpec `json:"controlPlaneExposure,omitempty"`

	// Paused can be set to true to pause reconciliation
	// +optional
	Paused bool `json:"paused,omitempty"`
}

ClusterBootstrapSpec defines the desired state of ClusterBootstrap

func (*ClusterBootstrapSpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapSpec.

func (*ClusterBootstrapSpec) DeepCopyInto

func (in *ClusterBootstrapSpec) DeepCopyInto(out *ClusterBootstrapSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ClusterBootstrapStatus

type ClusterBootstrapStatus struct {
	// Phase is the current phase of bootstrap
	// +optional
	Phase ClusterBootstrapPhase `json:"phase,omitempty"`

	// ControlPlaneEndpoint is the endpoint for the control plane
	// +optional
	ControlPlaneEndpoint string `json:"controlPlaneEndpoint,omitempty"`

	// Kubeconfig contains the base64-encoded kubeconfig for the cluster
	// +optional
	Kubeconfig string `json:"kubeconfig,omitempty"`

	// TalosConfig contains the base64-encoded talosconfig for the cluster
	// +optional
	TalosConfig string `json:"talosconfig,omitempty"`

	// ConsoleURL is the URL to access the Butler Console
	// +optional
	ConsoleURL string `json:"consoleURL,omitempty"`

	// Machines contains the status of each machine
	// +optional
	Machines []ClusterBootstrapMachineStatus `json:"machines,omitempty"`

	// FailureReason indicates why bootstrap failed
	// +optional
	FailureReason string `json:"failureReason,omitempty"`

	// FailureMessage provides details about the failure
	// +optional
	FailureMessage string `json:"failureMessage,omitempty"`

	// Conditions represents the current conditions of the ClusterBootstrap
	// +optional
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// LastUpdated is the timestamp of the last status update
	// +optional
	LastUpdated metav1.Time `json:"lastUpdated,omitempty"`

	// ObservedGeneration is the last observed generation
	// +optional
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`

	// AddonsInstalled tracks which addons have been installed
	// +optional
	AddonsInstalled map[string]bool `json:"addonsInstalled,omitempty"`
}

ClusterBootstrapStatus defines the observed state of ClusterBootstrap

func (*ClusterBootstrapStatus) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapStatus.

func (*ClusterBootstrapStatus) DeepCopyInto

func (in *ClusterBootstrapStatus) DeepCopyInto(out *ClusterBootstrapStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ClusterBootstrapTalosSpec

type ClusterBootstrapTalosSpec struct {
	// Version is the Talos version to use
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^v[0-9]+\.[0-9]+\.[0-9]+$`
	Version string `json:"version"`

	// Schematic is the Talos factory schematic ID for the image
	// +kubebuilder:validation:Required
	Schematic string `json:"schematic"`

	// ConfigPatches allows inline Talos config patches
	// +optional
	ConfigPatches []TalosConfigPatch `json:"configPatches,omitempty"`

	// InstallDisk overrides the default install disk
	// +optional
	// +kubebuilder:default="/dev/vda"
	InstallDisk string `json:"installDisk,omitempty"`
}

ClusterBootstrapTalosSpec defines Talos configuration for bootstrap

func (*ClusterBootstrapTalosSpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapTalosSpec.

func (*ClusterBootstrapTalosSpec) DeepCopyInto

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ClusterDefaults

type ClusterDefaults struct {
	// KubernetesVersion is the default K8s version for new clusters.
	// +optional
	KubernetesVersion string `json:"kubernetesVersion,omitempty"`

	// WorkerCount is the default number of worker nodes.
	// +optional
	// +kubebuilder:validation:Minimum=0
	WorkerCount *int32 `json:"workerCount,omitempty"`

	// WorkerCPU is the default CPU cores per worker.
	// +optional
	// +kubebuilder:validation:Minimum=1
	WorkerCPU *int32 `json:"workerCPU,omitempty"`

	// WorkerMemoryGi is the default memory per worker in Gi.
	// +optional
	// +kubebuilder:validation:Minimum=1
	WorkerMemoryGi *int32 `json:"workerMemoryGi,omitempty"`

	// WorkerDiskGi is the default disk size per worker in Gi.
	// +optional
	// +kubebuilder:validation:Minimum=10
	WorkerDiskGi *int32 `json:"workerDiskGi,omitempty"`

	// DefaultAddons are addons automatically installed on new clusters.
	// +optional
	DefaultAddons []string `json:"defaultAddons,omitempty"`
}

ClusterDefaults defines default values for new TenantClusters.

func (*ClusterDefaults) DeepCopy

func (in *ClusterDefaults) DeepCopy() *ClusterDefaults

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterDefaults.

func (*ClusterDefaults) DeepCopyInto

func (in *ClusterDefaults) DeepCopyInto(out *ClusterDefaults)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ClusterTopology

type ClusterTopology string

ClusterTopology defines the cluster topology type

const (
	// ClusterTopologySingleNode is a single-node cluster where the control plane also runs workloads.
	// This is useful for development, testing, and edge deployments where resources are limited.
	// In single-node mode:
	// - Only 1 control plane node is created
	// - Workers section is ignored
	// - Control plane is configured to allow scheduling workloads
	// - etcd runs as a single member (not HA)
	ClusterTopologySingleNode ClusterTopology = "single-node"

	// ClusterTopologyHA is a high-availability cluster with separate control plane and worker nodes.
	// This is the default and recommended mode for production deployments.
	ClusterTopologyHA ClusterTopology = "ha"
)

type ConsoleAddonSpec

type ConsoleAddonSpec struct {
	// Enabled controls whether butler-console is installed
	// +kubebuilder:default=false
	// +optional
	Enabled *bool `json:"enabled,omitempty"`

	// Version is the console version (image tag)
	// +kubebuilder:default="latest"
	// +optional
	Version string `json:"version,omitempty"`

	// Ingress defines ingress configuration for the console
	// +optional
	Ingress *ConsoleIngressSpec `json:"ingress,omitempty"`
}

ConsoleAddonSpec defines Butler Console configuration

func (*ConsoleAddonSpec) DeepCopy

func (in *ConsoleAddonSpec) DeepCopy() *ConsoleAddonSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConsoleAddonSpec.

func (*ConsoleAddonSpec) DeepCopyInto

func (in *ConsoleAddonSpec) DeepCopyInto(out *ConsoleAddonSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ConsoleIngressSpec

type ConsoleIngressSpec struct {
	// Enabled controls whether to create an Ingress resource
	// +kubebuilder:default=false
	// +optional
	Enabled bool `json:"enabled,omitempty"`

	// Host is the hostname for the console (e.g., "butler.example.com")
	// If not set and ingress is enabled, uses "butler.<cluster-name>.local"
	// +optional
	Host string `json:"host,omitempty"`

	// ClassName is the ingress class (e.g., "traefik", "nginx")
	// +optional
	ClassName string `json:"className,omitempty"`

	// TLS enables TLS termination
	// +kubebuilder:default=false
	// +optional
	TLS bool `json:"tls,omitempty"`

	// TLSSecretName is the name of the TLS secret
	// +optional
	TLSSecretName string `json:"tlsSecretName,omitempty"`
}

ConsoleIngressSpec defines ingress configuration for the Butler Console

func (*ConsoleIngressSpec) DeepCopy

func (in *ConsoleIngressSpec) DeepCopy() *ConsoleIngressSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConsoleIngressSpec.

func (*ConsoleIngressSpec) DeepCopyInto

func (in *ConsoleIngressSpec) DeepCopyInto(out *ConsoleIngressSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ControlPlaneExposureMode added in v0.2.0

type ControlPlaneExposureMode string

ControlPlaneExposureMode defines how tenant control planes are exposed. +kubebuilder:validation:Enum=LoadBalancer;Ingress;Gateway

const (
	// ControlPlaneExposureModeLoadBalancer exposes each tenant API server via a dedicated
	// LoadBalancer IP. This is the default mode, providing direct access with 1 IP per tenant.
	// tcp-proxy is NOT required in this mode.
	ControlPlaneExposureModeLoadBalancer ControlPlaneExposureMode = "LoadBalancer"

	// ControlPlaneExposureModeIngress exposes tenant API servers through an Ingress controller
	// with TLS passthrough. Multiple tenants share a single IP with SNI-based routing.
	// tcp-proxy is auto-enabled to rewrite in-cluster kubernetes.default.svc endpoints.
	ControlPlaneExposureModeIngress ControlPlaneExposureMode = "Ingress"

	// ControlPlaneExposureModeGateway exposes tenant API servers through Gateway API TLSRoute.
	// Multiple tenants share a single IP with SNI-based routing via L4/L7 Gateway.
	// tcp-proxy is auto-enabled to rewrite in-cluster kubernetes.default.svc endpoints.
	ControlPlaneExposureModeGateway ControlPlaneExposureMode = "Gateway"
)

type ControlPlaneExposureSpec added in v0.2.0

type ControlPlaneExposureSpec struct {
	// Mode determines how tenant API servers are exposed.
	// LoadBalancer: 1 IP per tenant, direct access (default)
	// Ingress: L7 proxy via Ingress controller with TLS passthrough, shared IP
	// Gateway: L4/L7 via Gateway API TLSRoute, shared IP
	// +kubebuilder:default="LoadBalancer"
	// +optional
	Mode ControlPlaneExposureMode `json:"mode,omitempty"`

	// Hostname is the wildcard domain for tenant API servers.
	// Required when Mode is Ingress or Gateway.
	// Example: "*.k8s.platform.example.com"
	// Tenant clusters get: "{cluster}.{namespace}.k8s.platform.example.com"
	// +optional
	Hostname string `json:"hostname,omitempty"`

	// IngressClassName specifies the Ingress class when Mode is Ingress.
	// +optional
	IngressClassName string `json:"ingressClassName,omitempty"`

	// ControllerType specifies the ingress controller type for automatic TLS passthrough.
	// Used when Mode is Ingress. Supported values:
	// - "haproxy": Uses haproxy.org/ssl-passthrough annotation
	// - "nginx": Uses nginx.ingress.kubernetes.io/ssl-passthrough annotation
	// - "traefik": Creates IngressRouteTCP instead of standard Ingress
	// - "generic": No automatic annotations, use custom annotations in Steward config
	// +kubebuilder:validation:Enum=haproxy;nginx;traefik;generic
	// +optional
	ControllerType string `json:"controllerType,omitempty"`

	// GatewayRef references the Gateway resource when Mode is Gateway.
	// Format: "namespace/name"
	// +optional
	GatewayRef string `json:"gatewayRef,omitempty"`
}

ControlPlaneExposureSpec configures how tenant control planes are exposed. This is a platform-level setting inherited by all TenantClusters.

func (*ControlPlaneExposureSpec) DeepCopy added in v0.2.0

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ControlPlaneExposureSpec.

func (*ControlPlaneExposureSpec) DeepCopyInto added in v0.2.0

func (in *ControlPlaneExposureSpec) DeepCopyInto(out *ControlPlaneExposureSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ControlPlaneHAAddonSpec

type ControlPlaneHAAddonSpec struct {
	// Type is the control plane HA type
	// +kubebuilder:validation:Enum=kube-vip;none
	// +kubebuilder:default=kube-vip
	Type string `json:"type,omitempty"`

	// Version is the addon version
	// +optional
	Version string `json:"version,omitempty"`
}

ControlPlaneHAAddonSpec defines control plane HA configuration

func (*ControlPlaneHAAddonSpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ControlPlaneHAAddonSpec.

func (*ControlPlaneHAAddonSpec) DeepCopyInto

func (in *ControlPlaneHAAddonSpec) DeepCopyInto(out *ControlPlaneHAAddonSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ControlPlaneProviderAddonSpec

type ControlPlaneProviderAddonSpec struct {
	// Type is the control plane provider type
	// +kubebuilder:validation:Enum=steward;kamaji;none
	// +kubebuilder:default=steward
	Type string `json:"type,omitempty"`

	// Enabled controls whether Steward is installed
	// +optional
	// +kubebuilder:default=true
	Enabled *bool `json:"enabled,omitempty"`

	// Version is the addon version
	// +optional
	Version string `json:"version,omitempty"`
}

ControlPlaneProviderAddonSpec defines hosted control plane provider configuration

func (*ControlPlaneProviderAddonSpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ControlPlaneProviderAddonSpec.

func (*ControlPlaneProviderAddonSpec) DeepCopyInto

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ControlPlaneSpec

type ControlPlaneSpec struct {
	// Replicas is the number of API server replicas.
	// Steward manages high availability automatically.
	// +kubebuilder:default=1
	// +kubebuilder:validation:Minimum=1
	// +kubebuilder:validation:Maximum=3
	// +optional
	Replicas int32 `json:"replicas,omitempty"`

	// DataStoreRef references the Steward DataStore to use.
	// If not specified, the default DataStore is used.
	// +optional
	DataStoreRef *LocalObjectReference `json:"dataStoreRef,omitempty"`

	// ServiceType for the control plane endpoint.
	// If not specified, inherits from ButlerConfig.spec.controlPlaneExposure.mode.
	// Only set this to override the platform-level setting for this specific cluster.
	// +kubebuilder:validation:Enum=LoadBalancer;NodePort;ClusterIP
	// +optional
	ServiceType string `json:"serviceType,omitempty"`

	// CertSANs are additional Subject Alternative Names for the API server certificate.
	// Use this to add custom DNS names or IPs for API server access.
	// +optional
	CertSANs []string `json:"certSANs,omitempty"`

	// ExternalCloudProvider enables --cloud-provider=external on apiserver and controller-manager.
	// Required for Harvester, vSphere, and other infrastructure providers.
	// +kubebuilder:default=true
	// +optional
	ExternalCloudProvider *bool `json:"externalCloudProvider,omitempty"`
}

ControlPlaneSpec configures the Steward-hosted control plane.

func (*ControlPlaneSpec) DeepCopy

func (in *ControlPlaneSpec) DeepCopy() *ControlPlaneSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ControlPlaneSpec.

func (*ControlPlaneSpec) DeepCopyInto

func (in *ControlPlaneSpec) DeepCopyInto(out *ControlPlaneSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type DiskSpec

type DiskSpec struct {
	// SizeGB is the disk size in gigabytes.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Minimum=1
	SizeGB int32 `json:"sizeGB"`

	// StorageClass is the provider-specific storage class or tier.
	// +optional
	StorageClass string `json:"storageClass,omitempty"`
}

DiskSpec defines an additional disk to attach to a machine.

func (*DiskSpec) DeepCopy

func (in *DiskSpec) DeepCopy() *DiskSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DiskSpec.

func (*DiskSpec) DeepCopyInto

func (in *DiskSpec) DeepCopyInto(out *DiskSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ExtensionValues

type ExtensionValues struct {
	// Raw is the raw JSON/YAML values.
	// +optional
	Raw []byte `json:"-"`
}

ExtensionValues holds arbitrary Helm values. +kubebuilder:pruning:PreserveUnknownFields

func (*ExtensionValues) DeepCopy

func (in *ExtensionValues) DeepCopy() *ExtensionValues

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExtensionValues.

func (*ExtensionValues) DeepCopyInto

func (in *ExtensionValues) DeepCopyInto(out *ExtensionValues)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type GCPProviderConfig added in v0.3.0

type GCPProviderConfig struct {
	// ProjectID is the GCP project identifier.
	// +kubebuilder:validation:Required
	ProjectID string `json:"projectID"`

	// Region is the GCP region.
	// +kubebuilder:validation:Required
	Region string `json:"region"`

	// Network is the VPC network name.
	// +optional
	Network string `json:"network,omitempty"`

	// Subnetwork is the subnetwork name.
	// +optional
	Subnetwork string `json:"subnetwork,omitempty"`
}

GCPProviderConfig contains GCP-specific configuration.

func (*GCPProviderConfig) DeepCopy added in v0.3.0

func (in *GCPProviderConfig) DeepCopy() *GCPProviderConfig

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCPProviderConfig.

func (*GCPProviderConfig) DeepCopyInto added in v0.3.0

func (in *GCPProviderConfig) DeepCopyInto(out *GCPProviderConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type GitOpsAddonSpec

type GitOpsAddonSpec struct {
	// Type is the GitOps type
	// +kubebuilder:validation:Enum=flux;none
	// +kubebuilder:default=flux
	Type string `json:"type,omitempty"`

	// Enabled controls whether GitOps is installed
	// +optional
	// +kubebuilder:default=true
	Enabled *bool `json:"enabled,omitempty"`
}

GitOpsAddonSpec defines GitOps configuration

func (*GitOpsAddonSpec) DeepCopy

func (in *GitOpsAddonSpec) DeepCopy() *GitOpsAddonSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitOpsAddonSpec.

func (*GitOpsAddonSpec) DeepCopyInto

func (in *GitOpsAddonSpec) DeepCopyInto(out *GitOpsAddonSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type GitOpsDirectoryLayout added in v0.2.0

type GitOpsDirectoryLayout struct {
	// ClustersPath is the path for cluster-specific configurations.
	// +kubebuilder:default="clusters"
	// +optional
	ClustersPath string `json:"clustersPath,omitempty"`

	// InfrastructurePath is the path for infrastructure components.
	// +kubebuilder:default="infrastructure"
	// +optional
	InfrastructurePath string `json:"infrastructurePath,omitempty"`

	// AppsPath is the path for application workloads.
	// +kubebuilder:default="apps"
	// +optional
	AppsPath string `json:"appsPath,omitempty"`

	// PlatformPath is the path for platform components (observability, security, etc).
	// +kubebuilder:default="platform"
	// +optional
	PlatformPath string `json:"platformPath,omitempty"`
}

GitOpsDirectoryLayout defines the standard directory structure for GitOps repositories.

func DefaultGitOpsDirectoryLayout added in v0.2.0

func DefaultGitOpsDirectoryLayout() GitOpsDirectoryLayout

DefaultGitOpsDirectoryLayout returns the default directory layout.

func (*GitOpsDirectoryLayout) DeepCopy added in v0.2.0

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitOpsDirectoryLayout.

func (*GitOpsDirectoryLayout) DeepCopyInto added in v0.2.0

func (in *GitOpsDirectoryLayout) DeepCopyInto(out *GitOpsDirectoryLayout)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type GitOpsExportFormat added in v0.2.0

type GitOpsExportFormat string

GitOpsExportFormat defines the output format for GitOps exports. +kubebuilder:validation:Enum=flux;argocd;raw;kustomize

const (
	// GitOpsExportFormatFlux generates Flux HelmRelease and Kustomization resources.
	GitOpsExportFormatFlux GitOpsExportFormat = "flux"

	// GitOpsExportFormatArgoCD generates ArgoCD Application resources.
	GitOpsExportFormatArgoCD GitOpsExportFormat = "argocd"

	// GitOpsExportFormatRaw generates plain Kubernetes manifests.
	GitOpsExportFormatRaw GitOpsExportFormat = "raw"

	// GitOpsExportFormatKustomize generates Kustomization structure.
	GitOpsExportFormatKustomize GitOpsExportFormat = "kustomize"
)

type GitOpsSpec

type GitOpsSpec struct {
	// Provider is the GitOps provider.
	// +kubebuilder:validation:Enum=fluxcd;argocd
	// +optional
	Provider string `json:"provider,omitempty"`

	// Version is the addon version.
	// +optional
	Version string `json:"version,omitempty"`

	// Repository configures the Git repository for GitOps.
	// +optional
	Repository *GitRepositorySpec `json:"repository,omitempty"`
}

GitOpsSpec configures GitOps tooling.

func (*GitOpsSpec) DeepCopy

func (in *GitOpsSpec) DeepCopy() *GitOpsSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitOpsSpec.

func (*GitOpsSpec) DeepCopyInto

func (in *GitOpsSpec) DeepCopyInto(out *GitOpsSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type GitProviderConfig added in v0.2.0

type GitProviderConfig struct {
	// Type is the Git provider type.
	// +kubebuilder:validation:Required
	Type GitProviderType `json:"type"`

	// URL is the Git provider API URL.
	// For GitHub: https://api.github.com (or https://github.example.com/api/v3 for enterprise)
	// For GitLab: https://gitlab.com (or self-hosted URL)
	// +kubebuilder:default="https://api.github.com"
	// +optional
	URL string `json:"url,omitempty"`

	// Organization is the default organization/group for repositories.
	// When set, repository listings will be scoped to this org.
	// +optional
	Organization string `json:"organization,omitempty"`

	// SecretRef references the Secret containing credentials.
	// Required keys depend on provider type:
	// - GitHub: "token" (Personal Access Token with repo scope)
	// - GitLab: "token" (Personal Access Token with api scope)
	// - Bitbucket: "username" and "app-password"
	// +kubebuilder:validation:Required
	SecretRef LocalObjectReference `json:"secretRef"`
}

GitProviderConfig configures a Git provider for GitOps operations. This is stored in ButlerConfig and used as the default for all GitOps operations.

func (*GitProviderConfig) DeepCopy added in v0.2.0

func (in *GitProviderConfig) DeepCopy() *GitProviderConfig

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitProviderConfig.

func (*GitProviderConfig) DeepCopyInto added in v0.2.0

func (in *GitProviderConfig) DeepCopyInto(out *GitProviderConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type GitProviderStatus added in v0.2.0

type GitProviderStatus struct {
	// Connected indicates whether the provider credentials are valid.
	// +optional
	Connected bool `json:"connected,omitempty"`

	// Username is the authenticated username (from token validation).
	// +optional
	Username string `json:"username,omitempty"`

	// LastValidated is when the credentials were last validated.
	// +optional
	LastValidated *metav1.Time `json:"lastValidated,omitempty"`

	// Message provides additional status information.
	// +optional
	Message string `json:"message,omitempty"`
}

GitProviderStatus shows the status of the Git provider configuration.

func (*GitProviderStatus) DeepCopy added in v0.2.0

func (in *GitProviderStatus) DeepCopy() *GitProviderStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitProviderStatus.

func (*GitProviderStatus) DeepCopyInto added in v0.2.0

func (in *GitProviderStatus) DeepCopyInto(out *GitProviderStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type GitProviderType added in v0.2.0

type GitProviderType string

GitProviderType defines supported Git providers. +kubebuilder:validation:Enum=github;gitlab;bitbucket

const (
	// GitProviderTypeGitHub is GitHub.com or GitHub Enterprise.
	GitProviderTypeGitHub GitProviderType = "github"

	// GitProviderTypeGitLab is GitLab.com or self-hosted GitLab.
	GitProviderTypeGitLab GitProviderType = "gitlab"

	// GitProviderTypeBitbucket is Bitbucket Cloud or Server.
	GitProviderTypeBitbucket GitProviderType = "bitbucket"
)

type GitRepositorySpec

type GitRepositorySpec struct {
	// URL is the Git repository URL.
	// +kubebuilder:validation:Required
	URL string `json:"url"`

	// Branch is the branch to use.
	// +kubebuilder:default="main"
	// +optional
	Branch string `json:"branch,omitempty"`

	// Path is the path within the repository for this cluster's manifests.
	// +optional
	Path string `json:"path,omitempty"`

	// SecretRef references the Secret containing Git credentials.
	// +optional
	SecretRef *LocalObjectReference `json:"secretRef,omitempty"`
}

GitRepositorySpec configures a Git repository for GitOps.

func (*GitRepositorySpec) DeepCopy

func (in *GitRepositorySpec) DeepCopy() *GitRepositorySpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitRepositorySpec.

func (*GitRepositorySpec) DeepCopyInto

func (in *GitRepositorySpec) DeepCopyInto(out *GitRepositorySpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type GoogleWorkspaceConfig added in v0.2.0

type GoogleWorkspaceConfig struct {
	// ServiceAccountSecretRef references a Secret containing the service account
	// JSON key file. The Secret must contain a key named "service-account.json".
	// +kubebuilder:validation:Required
	ServiceAccountSecretRef SecretReference `json:"serviceAccountSecretRef"`

	// AdminEmail is the email address of a Google Workspace super admin.
	// The service account will impersonate this user to access the Admin SDK.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Format=email
	AdminEmail string `json:"adminEmail"`
}

GoogleWorkspaceConfig contains configuration for fetching groups from Google Workspace using the Admin SDK Directory API.

func (*GoogleWorkspaceConfig) DeepCopy added in v0.2.0

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GoogleWorkspaceConfig.

func (*GoogleWorkspaceConfig) DeepCopyInto added in v0.2.0

func (in *GoogleWorkspaceConfig) DeepCopyInto(out *GoogleWorkspaceConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type HarvesterOverride

type HarvesterOverride struct {
	// Namespace is the Harvester namespace for VMs.
	// +optional
	Namespace string `json:"namespace,omitempty"`

	// NetworkName is the Harvester network to use (format: namespace/name).
	// +optional
	NetworkName string `json:"networkName,omitempty"`

	// ImageName is the VM image to use (format: namespace/name).
	// +optional
	ImageName string `json:"imageName,omitempty"`
}

HarvesterOverride contains Harvester-specific settings.

func (*HarvesterOverride) DeepCopy

func (in *HarvesterOverride) DeepCopy() *HarvesterOverride

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HarvesterOverride.

func (*HarvesterOverride) DeepCopyInto

func (in *HarvesterOverride) DeepCopyInto(out *HarvesterOverride)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type HarvesterProviderConfig

type HarvesterProviderConfig struct {
	// Endpoint is the Harvester API server URL.
	// If not specified, extracted from the kubeconfig.
	// +optional
	Endpoint string `json:"endpoint,omitempty"`

	// Namespace is the Harvester namespace for VM resources.
	// +kubebuilder:default="default"
	// +optional
	Namespace string `json:"namespace,omitempty"`

	// NetworkName is the VM network in "namespace/name" format.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^[a-z0-9-]+/[a-z0-9-]+$`
	NetworkName string `json:"networkName"`

	// ImageName is the default OS image in "namespace/name" format.
	// Used when MachineRequest doesn't specify an image.
	// +optional
	ImageName string `json:"imageName,omitempty"`

	// StorageClassName is the default storage class for VM disks.
	// +optional
	StorageClassName string `json:"storageClassName,omitempty"`
}

HarvesterProviderConfig contains Harvester-specific configuration.

func (*HarvesterProviderConfig) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HarvesterProviderConfig.

func (*HarvesterProviderConfig) DeepCopyInto

func (in *HarvesterProviderConfig) DeepCopyInto(out *HarvesterProviderConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type HelmChartSpec

type HelmChartSpec struct {
	// Repository is the Helm repository URL.
	// +kubebuilder:validation:Required
	Repository string `json:"repository"`

	// Chart is the chart name within the repository.
	// +kubebuilder:validation:Required
	Chart string `json:"chart"`

	// ReleaseName is the Helm release name.
	// If not specified, defaults to the TenantAddon name.
	// +optional
	ReleaseName string `json:"releaseName,omitempty"`

	// Namespace is the target namespace for the Helm release.
	// If not specified, a namespace is chosen based on the chart.
	// +optional
	Namespace string `json:"namespace,omitempty"`

	// CreateNamespace creates the namespace if it doesn't exist.
	// +kubebuilder:default=true
	// +optional
	CreateNamespace bool `json:"createNamespace,omitempty"`
}

HelmChartSpec defines a custom Helm chart to install.

func (*HelmChartSpec) DeepCopy

func (in *HelmChartSpec) DeepCopy() *HelmChartSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HelmChartSpec.

func (*HelmChartSpec) DeepCopyInto

func (in *HelmChartSpec) DeepCopyInto(out *HelmChartSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type HelmReleaseStatus

type HelmReleaseStatus struct {
	// Name is the name of the Helm release
	// +optional
	Name string `json:"name,omitempty"`

	// Namespace is the namespace where the release is installed
	// +optional
	Namespace string `json:"namespace,omitempty"`

	// Version is the chart version
	// +optional
	Version string `json:"version,omitempty"`

	// Revision is the Helm release revision number
	// +optional
	Revision int `json:"revision,omitempty"`

	// Status is the Helm release status (deployed, failed, etc.)
	// +optional
	Status string `json:"status,omitempty"`
}

HelmReleaseStatus contains information about the Helm release

func (*HelmReleaseStatus) DeepCopy

func (in *HelmReleaseStatus) DeepCopy() *HelmReleaseStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HelmReleaseStatus.

func (*HelmReleaseStatus) DeepCopyInto

func (in *HelmReleaseStatus) DeepCopyInto(out *HelmReleaseStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type IPAllocation added in v0.3.0

type IPAllocation struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   IPAllocationSpec   `json:"spec,omitempty"`
	Status IPAllocationStatus `json:"status,omitempty"`
}

IPAllocation represents an individual IP allocation from a NetworkPool.

func (*IPAllocation) DeepCopy added in v0.3.0

func (in *IPAllocation) DeepCopy() *IPAllocation

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAllocation.

func (*IPAllocation) DeepCopyInto added in v0.3.0

func (in *IPAllocation) DeepCopyInto(out *IPAllocation)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*IPAllocation) DeepCopyObject added in v0.3.0

func (in *IPAllocation) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type IPAllocationList added in v0.3.0

type IPAllocationList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []IPAllocation `json:"items"`
}

IPAllocationList contains a list of IPAllocation.

func (*IPAllocationList) DeepCopy added in v0.3.0

func (in *IPAllocationList) DeepCopy() *IPAllocationList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAllocationList.

func (*IPAllocationList) DeepCopyInto added in v0.3.0

func (in *IPAllocationList) DeepCopyInto(out *IPAllocationList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*IPAllocationList) DeepCopyObject added in v0.3.0

func (in *IPAllocationList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type IPAllocationPhase added in v0.3.0

type IPAllocationPhase string

IPAllocationPhase represents the current phase of an IPAllocation. +kubebuilder:validation:Enum=Pending;Allocated;Released;Failed

const (
	// IPAllocationPhasePending indicates the allocation is waiting to be fulfilled.
	IPAllocationPhasePending IPAllocationPhase = "Pending"

	// IPAllocationPhaseAllocated indicates IPs have been assigned.
	IPAllocationPhaseAllocated IPAllocationPhase = "Allocated"

	// IPAllocationPhaseReleased indicates IPs have been released.
	IPAllocationPhaseReleased IPAllocationPhase = "Released"

	// IPAllocationPhaseFailed indicates the allocation failed.
	IPAllocationPhaseFailed IPAllocationPhase = "Failed"
)

type IPAllocationSpec added in v0.3.0

type IPAllocationSpec struct {
	// PoolRef references the NetworkPool to allocate from.
	// +kubebuilder:validation:Required
	PoolRef LocalObjectReference `json:"poolRef"`

	// TenantClusterRef references the TenantCluster this allocation is for.
	// +kubebuilder:validation:Required
	TenantClusterRef NamespacedObjectReference `json:"tenantClusterRef"`

	// Type specifies the purpose of the allocation.
	// +kubebuilder:validation:Required
	Type IPAllocationType `json:"type"`

	// Count is the number of IPs to allocate.
	// If not specified, defaults from the NetworkPool are used.
	// Ignored when PinnedRange is set.
	// +optional
	// +kubebuilder:validation:Minimum=1
	Count *int32 `json:"count,omitempty"`

	// PinnedRange requests a specific IP range instead of automatic allocation.
	// Used for migrating existing clusters to IPAM or reserving well-known addresses.
	// The allocator validates the range is within the pool and not already allocated.
	// +optional
	PinnedRange *PinnedIPRange `json:"pinnedRange,omitempty"`
}

IPAllocationSpec defines the desired state of IPAllocation.

func (*IPAllocationSpec) DeepCopy added in v0.3.0

func (in *IPAllocationSpec) DeepCopy() *IPAllocationSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAllocationSpec.

func (*IPAllocationSpec) DeepCopyInto added in v0.3.0

func (in *IPAllocationSpec) DeepCopyInto(out *IPAllocationSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type IPAllocationStatus added in v0.3.0

type IPAllocationStatus struct {
	// Phase represents the current phase of the allocation.
	// +optional
	Phase IPAllocationPhase `json:"phase,omitempty"`

	// Conditions represent the latest available observations.
	// +optional
	// +listType=map
	// +listMapKey=type
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// CIDR is the allocated range in CIDR notation if power-of-2 aligned.
	// +optional
	CIDR string `json:"cidr,omitempty"`

	// StartAddress is the first IP in the allocated range.
	// +optional
	StartAddress string `json:"startAddress,omitempty"`

	// EndAddress is the last IP in the allocated range.
	// +optional
	EndAddress string `json:"endAddress,omitempty"`

	// Addresses lists all individual IPs in the allocated range.
	// +optional
	Addresses []string `json:"addresses,omitempty"`

	// AllocatedCount is the number of IPs allocated.
	// +optional
	AllocatedCount int32 `json:"allocatedCount,omitempty"`

	// ObservedGeneration is the last observed generation.
	// +optional
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`

	// AllocatedAt is the timestamp when IPs were assigned.
	// +optional
	AllocatedAt *metav1.Time `json:"allocatedAt,omitempty"`

	// AllocatedBy identifies the controller that fulfilled the allocation.
	// +optional
	AllocatedBy string `json:"allocatedBy,omitempty"`

	// ReleasedAt is the timestamp when IPs were released.
	// +optional
	ReleasedAt *metav1.Time `json:"releasedAt,omitempty"`
}

IPAllocationStatus defines the observed state of IPAllocation.

func (*IPAllocationStatus) DeepCopy added in v0.3.0

func (in *IPAllocationStatus) DeepCopy() *IPAllocationStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPAllocationStatus.

func (*IPAllocationStatus) DeepCopyInto added in v0.3.0

func (in *IPAllocationStatus) DeepCopyInto(out *IPAllocationStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type IPAllocationType added in v0.3.0

type IPAllocationType string

IPAllocationType defines the purpose of an IP allocation. +kubebuilder:validation:Enum=nodes;loadbalancer

const (
	// IPAllocationTypeNodes is for worker node IPs.
	IPAllocationTypeNodes IPAllocationType = "nodes"

	// IPAllocationTypeLoadBalancer is for load balancer IPs.
	IPAllocationTypeLoadBalancer IPAllocationType = "loadbalancer"
)

type IPPool

type IPPool struct {
	// Start is the first IP in the pool.
	// +kubebuilder:validation:Required
	Start string `json:"start"`

	// End is the last IP in the pool.
	// +kubebuilder:validation:Required
	End string `json:"end"`
}

IPPool defines a range of IP addresses.

func (*IPPool) DeepCopy

func (in *IPPool) DeepCopy() *IPPool

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPPool.

func (*IPPool) DeepCopyInto

func (in *IPPool) DeepCopyInto(out *IPPool)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type IdentityProvider

type IdentityProvider struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   IdentityProviderSpec   `json:"spec,omitempty"`
	Status IdentityProviderStatus `json:"status,omitempty"`
}

IdentityProvider defines an external identity provider for authentication. Butler uses IdentityProviders to authenticate users via OIDC (OpenID Connect). Users are matched to Teams based on their email or group memberships.

Example for Google Workspace:

apiVersion: butler.butlerlabs.dev/v1alpha1
kind: IdentityProvider
metadata:
  name: google-workspace
spec:
  type: oidc
  displayName: "Google Workspace"
  oidc:
    issuerURL: "https://accounts.google.com"
    clientID: "xxx.apps.googleusercontent.com"
    clientSecretRef:
      name: google-oidc-secret
      namespace: butler-system
      key: client-secret
    redirectURL: "https://butler.example.com/api/auth/callback"
    hostedDomain: "example.com"

func (*IdentityProvider) DeepCopy

func (in *IdentityProvider) DeepCopy() *IdentityProvider

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IdentityProvider.

func (*IdentityProvider) DeepCopyInto

func (in *IdentityProvider) DeepCopyInto(out *IdentityProvider)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*IdentityProvider) DeepCopyObject

func (in *IdentityProvider) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

func (*IdentityProvider) GetDisplayName

func (idp *IdentityProvider) GetDisplayName() string

GetDisplayName returns the display name or a default based on issuer.

func (*IdentityProvider) GetEmailClaim

func (idp *IdentityProvider) GetEmailClaim() string

GetEmailClaim returns the configured email claim or default.

func (*IdentityProvider) GetGroupsClaim

func (idp *IdentityProvider) GetGroupsClaim() string

GetGroupsClaim returns the configured groups claim or default.

func (*IdentityProvider) GetScopes

func (idp *IdentityProvider) GetScopes() []string

GetScopes returns the configured scopes or defaults.

func (*IdentityProvider) IsReady

func (idp *IdentityProvider) IsReady() bool

IsReady returns true if the provider is in Ready phase.

type IdentityProviderList

type IdentityProviderList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []IdentityProvider `json:"items"`
}

IdentityProviderList contains a list of IdentityProvider.

func (*IdentityProviderList) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IdentityProviderList.

func (*IdentityProviderList) DeepCopyInto

func (in *IdentityProviderList) DeepCopyInto(out *IdentityProviderList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*IdentityProviderList) DeepCopyObject

func (in *IdentityProviderList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type IdentityProviderPhase

type IdentityProviderPhase string

IdentityProviderPhase represents the current phase of an IdentityProvider. +kubebuilder:validation:Enum=Pending;Ready;Failed

const (
	// IdentityProviderPhasePending indicates the provider is being validated.
	IdentityProviderPhasePending IdentityProviderPhase = "Pending"

	// IdentityProviderPhaseReady indicates the provider is validated and ready.
	IdentityProviderPhaseReady IdentityProviderPhase = "Ready"

	// IdentityProviderPhaseFailed indicates validation failed.
	IdentityProviderPhaseFailed IdentityProviderPhase = "Failed"
)

type IdentityProviderSpec

type IdentityProviderSpec struct {
	// Type specifies the identity provider type.
	// Currently only "oidc" is supported.
	// +kubebuilder:validation:Required
	Type IdentityProviderType `json:"type"`

	// DisplayName is a human-readable name for this provider.
	// Shown in the login UI when multiple providers are configured.
	// +optional
	DisplayName string `json:"displayName,omitempty"`

	// OIDC contains OpenID Connect configuration.
	// Required when type is "oidc".
	// +optional
	OIDC *OIDCConfig `json:"oidc,omitempty"`
}

IdentityProviderSpec defines the desired state of IdentityProvider.

func (*IdentityProviderSpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IdentityProviderSpec.

func (*IdentityProviderSpec) DeepCopyInto

func (in *IdentityProviderSpec) DeepCopyInto(out *IdentityProviderSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type IdentityProviderStatus

type IdentityProviderStatus struct {
	// Conditions represent the latest available observations.
	// +optional
	// +listType=map
	// +listMapKey=type
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// Phase represents the current phase of the provider.
	// +optional
	Phase IdentityProviderPhase `json:"phase,omitempty"`

	// ObservedGeneration is the last observed generation.
	// +optional
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`

	// LastValidatedTime is when the provider was last successfully validated.
	// +optional
	LastValidatedTime *metav1.Time `json:"lastValidatedTime,omitempty"`

	// DiscoveredEndpoints contains endpoints discovered via OIDC Discovery.
	// +optional
	DiscoveredEndpoints *OIDCDiscoveredEndpoints `json:"discoveredEndpoints,omitempty"`

	// Message provides additional status information.
	// +optional
	Message string `json:"message,omitempty"`
}

IdentityProviderStatus defines the observed state of IdentityProvider.

func (*IdentityProviderStatus) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IdentityProviderStatus.

func (*IdentityProviderStatus) DeepCopyInto

func (in *IdentityProviderStatus) DeepCopyInto(out *IdentityProviderStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type IdentityProviderType

type IdentityProviderType string

IdentityProviderType defines the type of identity provider. +kubebuilder:validation:Enum=oidc

const (
	// IdentityProviderTypeOIDC is an OpenID Connect provider.
	// Supports Google Workspace, Microsoft Entra ID, Okta, Auth0, Keycloak, etc.
	IdentityProviderTypeOIDC IdentityProviderType = "oidc"
)

type InfrastructureOverride

type InfrastructureOverride struct {
	// Harvester contains Harvester-specific overrides.
	// +optional
	Harvester *HarvesterOverride `json:"harvester,omitempty"`

	// Nutanix contains Nutanix-specific overrides.
	// +optional
	Nutanix *NutanixOverride `json:"nutanix,omitempty"`

	// Proxmox contains Proxmox-specific overrides.
	// +optional
	Proxmox *ProxmoxOverride `json:"proxmox,omitempty"`
}

InfrastructureOverride allows overriding provider-specific settings per-cluster.

func (*InfrastructureOverride) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureOverride.

func (*InfrastructureOverride) DeepCopyInto

func (in *InfrastructureOverride) DeepCopyInto(out *InfrastructureOverride)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type IngressAddonSpec

type IngressAddonSpec struct {
	// Type is the ingress controller type
	// +kubebuilder:validation:Enum=traefik;nginx;none
	// +kubebuilder:default=traefik
	Type string `json:"type,omitempty"`

	// Enabled controls whether the ingress controller is installed
	// +optional
	// +kubebuilder:default=true
	Enabled *bool `json:"enabled,omitempty"`

	// Version is the addon version
	// +optional
	Version string `json:"version,omitempty"`
}

IngressAddonSpec defines ingress controller configuration

func (*IngressAddonSpec) DeepCopy

func (in *IngressAddonSpec) DeepCopy() *IngressAddonSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressAddonSpec.

func (*IngressAddonSpec) DeepCopyInto

func (in *IngressAddonSpec) DeepCopyInto(out *IngressAddonSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type IngressSpec

type IngressSpec struct {
	// Provider is the ingress provider.
	// +kubebuilder:validation:Enum=traefik;nginx
	// +optional
	Provider string `json:"provider,omitempty"`

	// Version is the addon version.
	// +kubebuilder:validation:Required
	Version string `json:"version"`

	// Values are Helm values for customization.
	// +optional
	// +kubebuilder:pruning:PreserveUnknownFields
	Values *ExtensionValues `json:"values,omitempty"`
}

IngressSpec configures the ingress controller.

func (*IngressSpec) DeepCopy

func (in *IngressSpec) DeepCopy() *IngressSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressSpec.

func (*IngressSpec) DeepCopyInto

func (in *IngressSpec) DeepCopyInto(out *IngressSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type LoadBalancerAddonSpec

type LoadBalancerAddonSpec struct {
	// Type is the load balancer type
	// +kubebuilder:validation:Enum=metallb;none
	// +kubebuilder:default=metallb
	Type string `json:"type,omitempty"`

	// AddressPool is the IP address range for MetalLB
	// DEPRECATED: Use network.loadBalancerPool instead for proper validation
	// +optional
	AddressPool string `json:"addressPool,omitempty"`
}

LoadBalancerAddonSpec defines load balancer configuration

func (*LoadBalancerAddonSpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoadBalancerAddonSpec.

func (*LoadBalancerAddonSpec) DeepCopyInto

func (in *LoadBalancerAddonSpec) DeepCopyInto(out *LoadBalancerAddonSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type LoadBalancerPoolSpec

type LoadBalancerPoolSpec struct {
	// Start is the first IP in the pool (inclusive)
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^([0-9]{1,3}\.){3}[0-9]{1,3}$`
	Start string `json:"start"`

	// End is the last IP in the pool (inclusive)
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^([0-9]{1,3}\.){3}[0-9]{1,3}$`
	End string `json:"end"`
}

LoadBalancerPoolSpec defines an IP address range for LoadBalancer services

func (*LoadBalancerPoolSpec) ContainsIP

func (p *LoadBalancerPoolSpec) ContainsIP(ip string) bool

ContainsIP checks if the given IP is within the pool range

func (*LoadBalancerPoolSpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoadBalancerPoolSpec.

func (*LoadBalancerPoolSpec) DeepCopyInto

func (in *LoadBalancerPoolSpec) DeepCopyInto(out *LoadBalancerPoolSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*LoadBalancerPoolSpec) ToAddressRange

func (p *LoadBalancerPoolSpec) ToAddressRange() string

ToAddressRange returns the pool as "start-end" string for MetalLB

func (*LoadBalancerPoolSpec) Validate

func (p *LoadBalancerPoolSpec) Validate() error

Validate validates the LoadBalancerPoolSpec

type LoadBalancerSpec

type LoadBalancerSpec struct {
	// Provider is the load balancer provider.
	// +kubebuilder:validation:Enum=metallb
	// +kubebuilder:default="metallb"
	// +optional
	Provider string `json:"provider,omitempty"`

	// Version is the addon version.
	// +kubebuilder:validation:Required
	Version string `json:"version"`

	// Values are Helm values for customization.
	// +optional
	// +kubebuilder:pruning:PreserveUnknownFields
	Values *ExtensionValues `json:"values,omitempty"`
}

LoadBalancerSpec configures the load balancer addon.

func (*LoadBalancerSpec) DeepCopy

func (in *LoadBalancerSpec) DeepCopy() *LoadBalancerSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoadBalancerSpec.

func (*LoadBalancerSpec) DeepCopyInto

func (in *LoadBalancerSpec) DeepCopyInto(out *LoadBalancerSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type LocalObjectReference

type LocalObjectReference struct {
	// Name is the name of the resource.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Name string `json:"name"`
}

LocalObjectReference references a resource in the same namespace.

func (*LocalObjectReference) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LocalObjectReference.

func (*LocalObjectReference) DeepCopyInto

func (in *LocalObjectReference) DeepCopyInto(out *LocalObjectReference)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type MachinePhase

type MachinePhase string

MachinePhase represents the lifecycle phase of a MachineRequest. +kubebuilder:validation:Enum=Pending;Creating;Running;Failed;Deleting;Deleted;Unknown

const (
	// MachinePhasePending indicates the request has been received but not yet processed.
	MachinePhasePending MachinePhase = "Pending"

	// MachinePhaseCreating indicates the machine is being created.
	MachinePhaseCreating MachinePhase = "Creating"

	// MachinePhaseRunning indicates the machine is running and has an IP address.
	MachinePhaseRunning MachinePhase = "Running"

	// MachinePhaseFailed indicates the machine creation failed.
	MachinePhaseFailed MachinePhase = "Failed"

	// MachinePhaseDeleting indicates the machine is being deleted.
	MachinePhaseDeleting MachinePhase = "Deleting"

	// MachinePhaseDeleted indicates the machine has been deleted.
	MachinePhaseDeleted MachinePhase = "Deleted"

	// MachinePhaseUnknown indicates the machine state cannot be determined.
	MachinePhaseUnknown MachinePhase = "Unknown"
)

type MachineRequest

type MachineRequest struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   MachineRequestSpec   `json:"spec,omitempty"`
	Status MachineRequestStatus `json:"status,omitempty"`
}

MachineRequest is the Schema for the machinerequests API. It represents a request to create a virtual machine on an infrastructure provider. This resource serves as the interface contract between the Butler bootstrap controller and provider-specific controllers.

func (*MachineRequest) DeepCopy

func (in *MachineRequest) DeepCopy() *MachineRequest

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachineRequest.

func (*MachineRequest) DeepCopyInto

func (in *MachineRequest) DeepCopyInto(out *MachineRequest)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*MachineRequest) DeepCopyObject

func (in *MachineRequest) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

func (*MachineRequest) IsFailed

func (mr *MachineRequest) IsFailed() bool

IsFailed returns true if the machine is in a failed state.

func (*MachineRequest) IsReady

func (mr *MachineRequest) IsReady() bool

IsReady returns true if the machine is in the Running phase with an IP address.

func (*MachineRequest) IsTerminating

func (mr *MachineRequest) IsTerminating() bool

IsTerminating returns true if the machine is being deleted.

func (*MachineRequest) SetFailure

func (mr *MachineRequest) SetFailure(reason, message string)

SetFailure sets the failure reason and message.

func (*MachineRequest) SetPhase

func (mr *MachineRequest) SetPhase(phase MachinePhase)

SetPhase updates the phase and last updated timestamp.

type MachineRequestList

type MachineRequestList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []MachineRequest `json:"items"`
}

MachineRequestList contains a list of MachineRequest.

func (*MachineRequestList) DeepCopy

func (in *MachineRequestList) DeepCopy() *MachineRequestList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachineRequestList.

func (*MachineRequestList) DeepCopyInto

func (in *MachineRequestList) DeepCopyInto(out *MachineRequestList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*MachineRequestList) DeepCopyObject

func (in *MachineRequestList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type MachineRequestSpec

type MachineRequestSpec struct {
	// ProviderRef references the ProviderConfig to use for this machine.
	// +kubebuilder:validation:Required
	ProviderRef ProviderReference `json:"providerRef"`

	// MachineName is the desired name for the virtual machine.
	// Must be unique within the provider's namespace/project.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	// +kubebuilder:validation:MaxLength=63
	// +kubebuilder:validation:Pattern=`^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`
	MachineName string `json:"machineName"`

	// Role indicates the intended role of this machine in the cluster.
	// +kubebuilder:validation:Required
	Role MachineRole `json:"role"`

	// CPU is the number of virtual CPU cores.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Minimum=1
	// +kubebuilder:validation:Maximum=128
	CPU int32 `json:"cpu"`

	// MemoryMB is the amount of memory in megabytes.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Minimum=1024
	MemoryMB int32 `json:"memoryMB"`

	// DiskGB is the root disk size in gigabytes.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Minimum=10
	DiskGB int32 `json:"diskGB"`

	// ExtraDisks defines additional disks to attach to the machine.
	// +optional
	ExtraDisks []DiskSpec `json:"extraDisks,omitempty"`

	// Image overrides the default OS image from ProviderConfig.
	// Format is provider-specific:
	// - harvester: "namespace/image-name"
	// - nutanix: UUID
	// - proxmox: template ID or image name
	// +optional
	Image string `json:"image,omitempty"`

	// UserData is cloud-init user data to configure the machine.
	// This typically contains the Talos machine configuration.
	// +optional
	UserData string `json:"userData,omitempty"`

	// NetworkData is cloud-init network configuration.
	// +optional
	NetworkData string `json:"networkData,omitempty"`

	// Labels are key-value pairs to apply to the VM in the provider.
	// +optional
	Labels map[string]string `json:"labels,omitempty"`
}

MachineRequestSpec defines the desired state of MachineRequest. This is the interface contract between the bootstrap controller and infrastructure provider controllers.

func (*MachineRequestSpec) DeepCopy

func (in *MachineRequestSpec) DeepCopy() *MachineRequestSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachineRequestSpec.

func (*MachineRequestSpec) DeepCopyInto

func (in *MachineRequestSpec) DeepCopyInto(out *MachineRequestSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type MachineRequestStatus

type MachineRequestStatus struct {
	// Phase represents the current lifecycle phase of the machine.
	// +optional
	Phase MachinePhase `json:"phase,omitempty"`

	// ProviderID is the provider-specific identifier for the machine.
	// Format is provider-specific (e.g., Harvester VM UID, Nutanix VM UUID).
	// +optional
	ProviderID string `json:"providerID,omitempty"`

	// IPAddress is the primary IP address of the machine.
	// This is set when the machine reaches the Running phase.
	// +optional
	IPAddress string `json:"ipAddress,omitempty"`

	// IPAddresses contains all IP addresses assigned to the machine.
	// +optional
	IPAddresses []string `json:"ipAddresses,omitempty"`

	// MACAddress is the primary MAC address of the machine.
	// +optional
	MACAddress string `json:"macAddress,omitempty"`

	// FailureReason provides a machine-readable failure reason.
	// +optional
	FailureReason string `json:"failureReason,omitempty"`

	// FailureMessage provides a human-readable failure message.
	// +optional
	FailureMessage string `json:"failureMessage,omitempty"`

	// Conditions represent the latest available observations of the
	// MachineRequest's state.
	// +optional
	// +listType=map
	// +listMapKey=type
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// LastUpdated is the timestamp of the last status update.
	// +optional
	LastUpdated *metav1.Time `json:"lastUpdated,omitempty"`

	// ObservedGeneration is the generation most recently observed by the controller.
	// +optional
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`
}

MachineRequestStatus defines the observed state of MachineRequest.

func (*MachineRequestStatus) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachineRequestStatus.

func (*MachineRequestStatus) DeepCopyInto

func (in *MachineRequestStatus) DeepCopyInto(out *MachineRequestStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type MachineRole

type MachineRole string

MachineRole defines the role of a machine in a cluster. +kubebuilder:validation:Enum=control-plane;worker

const (
	// MachineRoleControlPlane is a control plane node.
	MachineRoleControlPlane MachineRole = "control-plane"

	// MachineRoleWorker is a worker node.
	MachineRoleWorker MachineRole = "worker"
)

type MachineTemplateSpec

type MachineTemplateSpec struct {
	// CPU is the number of CPU cores.
	// +kubebuilder:default=4
	// +kubebuilder:validation:Minimum=1
	// +optional
	CPU int32 `json:"cpu,omitempty"`

	// Memory is the amount of RAM.
	// +kubebuilder:default="16Gi"
	// +optional
	Memory resource.Quantity `json:"memory,omitempty"`

	// DiskSize is the root disk size.
	// +kubebuilder:default="100Gi"
	// +optional
	DiskSize resource.Quantity `json:"diskSize,omitempty"`

	// OS configures the operating system.
	// +optional
	OS OSSpec `json:"os,omitempty"`
}

MachineTemplateSpec defines VM specifications.

func (*MachineTemplateSpec) DeepCopy

func (in *MachineTemplateSpec) DeepCopy() *MachineTemplateSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachineTemplateSpec.

func (*MachineTemplateSpec) DeepCopyInto

func (in *MachineTemplateSpec) DeepCopyInto(out *MachineTemplateSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ManagementAddon

type ManagementAddon struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   ManagementAddonSpec   `json:"spec,omitempty"`
	Status ManagementAddonStatus `json:"status,omitempty"`
}

ManagementAddon is the Schema for the managementaddons API. It represents an addon to be installed on the management cluster.

func (*ManagementAddon) DeepCopy

func (in *ManagementAddon) DeepCopy() *ManagementAddon

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ManagementAddon.

func (*ManagementAddon) DeepCopyInto

func (in *ManagementAddon) DeepCopyInto(out *ManagementAddon)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*ManagementAddon) DeepCopyObject

func (in *ManagementAddon) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type ManagementAddonList

type ManagementAddonList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []ManagementAddon `json:"items"`
}

ManagementAddonList contains a list of ManagementAddon

func (*ManagementAddonList) DeepCopy

func (in *ManagementAddonList) DeepCopy() *ManagementAddonList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ManagementAddonList.

func (*ManagementAddonList) DeepCopyInto

func (in *ManagementAddonList) DeepCopyInto(out *ManagementAddonList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*ManagementAddonList) DeepCopyObject

func (in *ManagementAddonList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type ManagementAddonPhase

type ManagementAddonPhase string

ManagementAddonPhase represents the current phase of a management addon +kubebuilder:validation:Enum=Pending;Installing;Installed;Upgrading;Failed;Uninstalling

const (
	ManagementAddonPhasePending      ManagementAddonPhase = "Pending"
	ManagementAddonPhaseInstalling   ManagementAddonPhase = "Installing"
	ManagementAddonPhaseInstalled    ManagementAddonPhase = "Installed"
	ManagementAddonPhaseUpgrading    ManagementAddonPhase = "Upgrading"
	ManagementAddonPhaseFailed       ManagementAddonPhase = "Failed"
	ManagementAddonPhaseUninstalling ManagementAddonPhase = "Uninstalling"
)

type ManagementAddonSpec

type ManagementAddonSpec struct {
	// Addon is the name of the addon to install (must match an AddonDefinition)
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Addon string `json:"addon"`

	// Version is the specific version to install. If not specified, uses the
	// default version from the AddonDefinition.
	// +optional
	Version string `json:"version,omitempty"`

	// Values are the Helm values to use for installation.
	// These are merged with any default values from the AddonDefinition.
	// +optional
	// +kubebuilder:pruning:PreserveUnknownFields
	Values *runtime.RawExtension `json:"values,omitempty"`

	// Paused indicates whether reconciliation of this addon is paused.
	// When paused, the controller will not make any changes to the addon.
	// +optional
	Paused bool `json:"paused,omitempty"`
}

ManagementAddonSpec defines the desired state of ManagementAddon

func (*ManagementAddonSpec) DeepCopy

func (in *ManagementAddonSpec) DeepCopy() *ManagementAddonSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ManagementAddonSpec.

func (*ManagementAddonSpec) DeepCopyInto

func (in *ManagementAddonSpec) DeepCopyInto(out *ManagementAddonSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ManagementAddonStatus

type ManagementAddonStatus struct {
	// Phase represents the current phase of the addon installation
	// +optional
	Phase ManagementAddonPhase `json:"phase,omitempty"`

	// InstalledVersion is the currently installed version of the addon
	// +optional
	InstalledVersion string `json:"installedVersion,omitempty"`

	// HelmRelease contains information about the Helm release
	// +optional
	HelmRelease *HelmReleaseStatus `json:"helmRelease,omitempty"`

	// Message provides additional information about the current state
	// +optional
	Message string `json:"message,omitempty"`

	// LastAttemptedVersion is the version that was last attempted to install
	// +optional
	LastAttemptedVersion string `json:"lastAttemptedVersion,omitempty"`

	// Conditions represent the latest available observations of the addon's state
	// +optional
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// ObservedGeneration is the last observed generation of the ManagementAddon
	// +optional
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`
}

ManagementAddonStatus defines the observed state of ManagementAddon

func (*ManagementAddonStatus) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ManagementAddonStatus.

func (*ManagementAddonStatus) DeepCopyInto

func (in *ManagementAddonStatus) DeepCopyInto(out *ManagementAddonStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ManagementMode

type ManagementMode string

ManagementMode defines how Butler manages addons after initial installation. +kubebuilder:validation:Enum=Active;Observe;GitOps

const (
	// ManagementModeActive means Butler actively manages addons.
	// New addons in spec are installed. Removal is user-initiated.
	ManagementModeActive ManagementMode = "Active"

	// ManagementModeObserve means Butler only observes after initial install.
	// Changes to spec.addons are ignored after cluster is ready.
	ManagementModeObserve ManagementMode = "Observe"

	// ManagementModeGitOps means Butler bootstraps Flux and hands off.
	// Flux manages the cluster from the configured Git repository.
	ManagementModeGitOps ManagementMode = "GitOps"
)

type ManagementPolicySpec

type ManagementPolicySpec struct {
	// Mode determines how Butler manages addons.
	// +kubebuilder:default="Active"
	// +optional
	Mode ManagementMode `json:"mode,omitempty"`
}

ManagementPolicySpec defines how Butler manages the cluster.

func (*ManagementPolicySpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ManagementPolicySpec.

func (*ManagementPolicySpec) DeepCopyInto

func (in *ManagementPolicySpec) DeepCopyInto(out *ManagementPolicySpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type MultiTenancyConfig

type MultiTenancyConfig struct {
	// Mode determines how multi-tenancy is enforced.
	// +kubebuilder:default="Disabled"
	// +optional
	Mode MultiTenancyMode `json:"mode,omitempty"`
}

MultiTenancyConfig configures multi-tenancy behavior.

func (*MultiTenancyConfig) DeepCopy

func (in *MultiTenancyConfig) DeepCopy() *MultiTenancyConfig

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MultiTenancyConfig.

func (*MultiTenancyConfig) DeepCopyInto

func (in *MultiTenancyConfig) DeepCopyInto(out *MultiTenancyConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type MultiTenancyMode

type MultiTenancyMode string

MultiTenancyMode defines how multi-tenancy is enforced. +kubebuilder:validation:Enum=Enforced;Optional;Disabled

const (
	// MultiTenancyModeEnforced requires all TenantClusters to belong to a Team.
	// Teams must exist before TenantClusters can be created.
	// This is the recommended mode for enterprise deployments.
	MultiTenancyModeEnforced MultiTenancyMode = "Enforced"

	// MultiTenancyModeOptional allows Teams but doesn't require them.
	// TenantClusters can exist in the default namespace without a Team.
	MultiTenancyModeOptional MultiTenancyMode = "Optional"

	// MultiTenancyModeDisabled disables Team functionality.
	// All TenantClusters exist in the default namespace.
	// This is the simplest mode for demos and single-user deployments.
	MultiTenancyModeDisabled MultiTenancyMode = "Disabled"
)

type NamespacedObjectReference

type NamespacedObjectReference struct {
	// Name is the name of the resource.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Name string `json:"name"`

	// Namespace is the namespace of the resource.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Namespace string `json:"namespace"`
}

NamespacedObjectReference references a resource in any namespace.

func (*NamespacedObjectReference) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamespacedObjectReference.

func (*NamespacedObjectReference) DeepCopyInto

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type NetworkPool added in v0.3.0

type NetworkPool struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   NetworkPoolSpec   `json:"spec,omitempty"`
	Status NetworkPoolStatus `json:"status,omitempty"`
}

NetworkPool defines a platform-level IP pool for on-prem IPAM.

func (*NetworkPool) DeepCopy added in v0.3.0

func (in *NetworkPool) DeepCopy() *NetworkPool

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkPool.

func (*NetworkPool) DeepCopyInto added in v0.3.0

func (in *NetworkPool) DeepCopyInto(out *NetworkPool)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*NetworkPool) DeepCopyObject added in v0.3.0

func (in *NetworkPool) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type NetworkPoolList added in v0.3.0

type NetworkPoolList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []NetworkPool `json:"items"`
}

NetworkPoolList contains a list of NetworkPool.

func (*NetworkPoolList) DeepCopy added in v0.3.0

func (in *NetworkPoolList) DeepCopy() *NetworkPoolList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkPoolList.

func (*NetworkPoolList) DeepCopyInto added in v0.3.0

func (in *NetworkPoolList) DeepCopyInto(out *NetworkPoolList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*NetworkPoolList) DeepCopyObject added in v0.3.0

func (in *NetworkPoolList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type NetworkPoolSpec added in v0.3.0

type NetworkPoolSpec struct {
	// CIDR is the network range in CIDR notation.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^(\d{1,3}\.){3}\d{1,3}/\d{1,2}$`
	CIDR string `json:"cidr"`

	// Reserved defines ranges excluded from allocation.
	// +optional
	Reserved []ReservedRange `json:"reserved,omitempty"`

	// TenantAllocation configures the allocatable sub-range and defaults.
	// If not specified, the entire CIDR (minus reserved ranges) is allocatable.
	// +optional
	TenantAllocation *TenantAllocationConfig `json:"tenantAllocation,omitempty"`
}

NetworkPoolSpec defines the desired state of NetworkPool.

func (*NetworkPoolSpec) DeepCopy added in v0.3.0

func (in *NetworkPoolSpec) DeepCopy() *NetworkPoolSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkPoolSpec.

func (*NetworkPoolSpec) DeepCopyInto added in v0.3.0

func (in *NetworkPoolSpec) DeepCopyInto(out *NetworkPoolSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type NetworkPoolStatus added in v0.3.0

type NetworkPoolStatus struct {
	// Conditions represent the latest available observations.
	// +optional
	// +listType=map
	// +listMapKey=type
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// TotalIPs is the total number of usable IPs (excluding reserved).
	// +optional
	TotalIPs int32 `json:"totalIPs,omitempty"`

	// AllocatedIPs is the number of currently allocated IPs.
	// +optional
	AllocatedIPs int32 `json:"allocatedIPs,omitempty"`

	// AvailableIPs is the number of available IPs.
	// +optional
	AvailableIPs int32 `json:"availableIPs,omitempty"`

	// AllocationCount is the total number of IPAllocations from this pool.
	// +optional
	AllocationCount int32 `json:"allocationCount,omitempty"`

	// FragmentationPercent indicates how fragmented the free space is (0-100).
	// +optional
	// +kubebuilder:validation:Minimum=0
	// +kubebuilder:validation:Maximum=100
	FragmentationPercent *int32 `json:"fragmentationPercent,omitempty"`

	// LargestFreeBlock is the size of the largest contiguous free block.
	// +optional
	LargestFreeBlock int32 `json:"largestFreeBlock,omitempty"`

	// ObservedGeneration is the last observed generation.
	// +optional
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`
}

NetworkPoolStatus defines the observed state of NetworkPool.

func (*NetworkPoolStatus) DeepCopy added in v0.3.0

func (in *NetworkPoolStatus) DeepCopy() *NetworkPoolStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkPoolStatus.

func (*NetworkPoolStatus) DeepCopyInto added in v0.3.0

func (in *NetworkPoolStatus) DeepCopyInto(out *NetworkPoolStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type NetworkQuota added in v0.3.0

type NetworkQuota struct {
	// MaxNodeIPs limits the number of node IPs per tenant.
	// +optional
	// +kubebuilder:validation:Minimum=1
	MaxNodeIPs *int32 `json:"maxNodeIPs,omitempty"`

	// MaxLoadBalancerIPs limits the number of LB IPs per tenant.
	// +optional
	// +kubebuilder:validation:Minimum=1
	MaxLoadBalancerIPs *int32 `json:"maxLoadBalancerIPs,omitempty"`
}

NetworkQuota defines per-tenant network resource quotas.

func (*NetworkQuota) DeepCopy added in v0.3.0

func (in *NetworkQuota) DeepCopy() *NetworkQuota

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkQuota.

func (*NetworkQuota) DeepCopyInto added in v0.3.0

func (in *NetworkQuota) DeepCopyInto(out *NetworkQuota)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type NetworkingSpec

type NetworkingSpec struct {
	// PodCIDR is the CIDR for pod IPs.
	// +kubebuilder:default="10.244.0.0/16"
	// +optional
	PodCIDR string `json:"podCIDR,omitempty"`

	// ServiceCIDR is the CIDR for service IPs.
	// +kubebuilder:default="10.96.0.0/12"
	// +optional
	ServiceCIDR string `json:"serviceCIDR,omitempty"`

	// LoadBalancerPool defines the IP pool for LoadBalancer services.
	// When IPAM is active, this is populated automatically from IPAllocation.
	// +optional
	LoadBalancerPool *IPPool `json:"loadBalancerPool,omitempty"`

	// LBPoolSize overrides the default load balancer pool size from the provider.
	// Only used when the provider has network.mode=ipam.
	// +optional
	// +kubebuilder:validation:Minimum=1
	LBPoolSize *int32 `json:"lbPoolSize,omitempty"`
}

NetworkingSpec configures cluster networking.

func (*NetworkingSpec) DeepCopy

func (in *NetworkingSpec) DeepCopy() *NetworkingSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkingSpec.

func (*NetworkingSpec) DeepCopyInto

func (in *NetworkingSpec) DeepCopyInto(out *NetworkingSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type NutanixOverride

type NutanixOverride struct {
	// ClusterUUID is the Nutanix cluster UUID.
	// +optional
	ClusterUUID string `json:"clusterUUID,omitempty"`

	// SubnetUUID is the Nutanix subnet UUID.
	// +optional
	SubnetUUID string `json:"subnetUUID,omitempty"`

	// ImageUUID is the Nutanix image UUID.
	// +optional
	ImageUUID string `json:"imageUUID,omitempty"`

	// StorageContainerUUID is the Nutanix storage container UUID.
	// +optional
	StorageContainerUUID string `json:"storageContainerUUID,omitempty"`
}

NutanixOverride contains Nutanix-specific settings.

func (*NutanixOverride) DeepCopy

func (in *NutanixOverride) DeepCopy() *NutanixOverride

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixOverride.

func (*NutanixOverride) DeepCopyInto

func (in *NutanixOverride) DeepCopyInto(out *NutanixOverride)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type NutanixProviderConfig

type NutanixProviderConfig struct {
	// Endpoint is the Prism Central API URL.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^https?://`
	Endpoint string `json:"endpoint"`

	// Port is the Prism Central API port.
	// +kubebuilder:default=9440
	// +optional
	Port int32 `json:"port,omitempty"`

	// Insecure allows insecure TLS connections.
	// +kubebuilder:default=false
	// +optional
	Insecure bool `json:"insecure,omitempty"`

	// ClusterUUID is the target Nutanix cluster UUID.
	// +kubebuilder:validation:Required
	ClusterUUID string `json:"clusterUUID"`

	// SubnetUUID is the network subnet UUID for VMs.
	// +kubebuilder:validation:Required
	SubnetUUID string `json:"subnetUUID"`

	// ImageUUID is the default OS image UUID.
	// Used when MachineRequest doesn't specify an image.
	// +optional
	ImageUUID string `json:"imageUUID,omitempty"`

	// StorageContainerUUID is the storage container for VM disks.
	// +optional
	StorageContainerUUID string `json:"storageContainerUUID,omitempty"`
}

NutanixProviderConfig contains Nutanix-specific configuration.

func (*NutanixProviderConfig) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixProviderConfig.

func (*NutanixProviderConfig) DeepCopyInto

func (in *NutanixProviderConfig) DeepCopyInto(out *NutanixProviderConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type OIDCConfig

type OIDCConfig struct {
	// IssuerURL is the OIDC provider's issuer URL.
	// Butler appends /.well-known/openid-configuration for discovery.
	// Examples:
	//   - Google: https://accounts.google.com
	//   - Microsoft: https://login.microsoftonline.com/{tenant}/v2.0
	//   - Okta: https://{domain}.okta.com
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^https://`
	IssuerURL string `json:"issuerURL"`

	// ClientID is the OAuth2 client ID from the identity provider.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	ClientID string `json:"clientID"`

	// ClientSecretRef references a Secret containing the OAuth2 client secret.
	// The Secret must contain a key named "client-secret".
	// +kubebuilder:validation:Required
	ClientSecretRef SecretReference `json:"clientSecretRef"`

	// RedirectURL is the OAuth2 callback URL.
	// Must match the redirect URI configured in the identity provider.
	// Example: https://butler.example.com/api/auth/callback
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^https?://`
	RedirectURL string `json:"redirectURL"`

	// Scopes are the OAuth2 scopes to request.
	// Defaults to ["openid", "email", "profile"] if not specified.
	// Some providers require additional scopes for group information:
	//   - Microsoft: add "groups" or use Graph API
	//   - Okta: add "groups"
	//   - Google: groups require separate Cloud Identity API call
	// +optional
	Scopes []string `json:"scopes,omitempty"`

	// GroupsClaim is the JWT claim containing group memberships.
	// Defaults to "groups". Set to empty string to disable group extraction.
	// Note: Google Workspace doesn't include groups in the ID token by default.
	// +kubebuilder:default="groups"
	// +optional
	GroupsClaim string `json:"groupsClaim,omitempty"`

	// EmailClaim is the JWT claim containing the user's email.
	// Defaults to "email".
	// +kubebuilder:default="email"
	// +optional
	EmailClaim string `json:"emailClaim,omitempty"`

	// HostedDomain restricts authentication to a specific domain.
	// Only supported by Google Workspace. Users outside this domain
	// will see an error during Google authentication.
	// Example: "butlerlabs.dev"
	// +optional
	HostedDomain string `json:"hostedDomain,omitempty"`

	// InsecureSkipVerify disables TLS certificate verification.
	// WARNING: Only use for development with self-signed certificates.
	// +kubebuilder:default=false
	// +optional
	InsecureSkipVerify bool `json:"insecureSkipVerify,omitempty"`

	// GoogleWorkspace contains optional Google Workspace Admin SDK configuration
	// for fetching user group memberships. Required because Google OIDC tokens
	// don't include groups by default.
	// +optional
	GoogleWorkspace *GoogleWorkspaceConfig `json:"googleWorkspace,omitempty"`
}

OIDCConfig contains OpenID Connect provider configuration. Butler uses OIDC Discovery to automatically configure endpoints.

func (*OIDCConfig) DeepCopy

func (in *OIDCConfig) DeepCopy() *OIDCConfig

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OIDCConfig.

func (*OIDCConfig) DeepCopyInto

func (in *OIDCConfig) DeepCopyInto(out *OIDCConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type OIDCDiscoveredEndpoints

type OIDCDiscoveredEndpoints struct {
	// AuthorizationEndpoint is the OAuth2 authorization URL.
	// +optional
	AuthorizationEndpoint string `json:"authorizationEndpoint,omitempty"`

	// TokenEndpoint is the OAuth2 token URL.
	// +optional
	TokenEndpoint string `json:"tokenEndpoint,omitempty"`

	// UserInfoEndpoint is the OIDC userinfo URL.
	// +optional
	UserInfoEndpoint string `json:"userInfoEndpoint,omitempty"`

	// JWKSURI is the JSON Web Key Set URL for token validation.
	// +optional
	JWKSURI string `json:"jwksURI,omitempty"`
}

OIDCDiscoveredEndpoints contains endpoints from OIDC Discovery.

func (*OIDCDiscoveredEndpoints) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OIDCDiscoveredEndpoints.

func (*OIDCDiscoveredEndpoints) DeepCopyInto

func (in *OIDCDiscoveredEndpoints) DeepCopyInto(out *OIDCDiscoveredEndpoints)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type OSSpec

type OSSpec struct {
	// Type is the OS type.
	// +kubebuilder:default="rocky"
	// +optional
	Type OSType `json:"type,omitempty"`

	// Version is the OS version.
	// +kubebuilder:default="9.5"
	// +optional
	Version string `json:"version,omitempty"`

	// ImageRef references a specific image to use.
	// Overrides Type and Version if specified.
	// +optional
	ImageRef string `json:"imageRef,omitempty"`

	// Talos provides Talos-specific worker node configuration.
	// Required when type is "talos".
	// +optional
	Talos *TalosConfig `json:"talos,omitempty"`
}

OSSpec configures the operating system.

func (*OSSpec) DeepCopy

func (in *OSSpec) DeepCopy() *OSSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSSpec.

func (*OSSpec) DeepCopyInto

func (in *OSSpec) DeepCopyInto(out *OSSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type OSType

type OSType string

OSType defines the operating system for worker nodes. +kubebuilder:validation:Enum=rocky;flatcar;talos

const (
	// OSTypeRocky is Rocky Linux.
	OSTypeRocky OSType = "rocky"

	// OSTypeFlatcar is Flatcar Container Linux.
	OSTypeFlatcar OSType = "flatcar"

	// OSTypeTalos is Talos Linux (immutable OS).
	OSTypeTalos OSType = "talos"
)

type ObservedClusterState

type ObservedClusterState struct {
	// KubernetesVersion is the actual Kubernetes version running.
	// +optional
	KubernetesVersion string `json:"kubernetesVersion,omitempty"`

	// Workers shows worker node status.
	// +optional
	Workers *WorkerStatus `json:"workers,omitempty"`

	// Addons shows installed addon status.
	// +optional
	Addons []AddonStatus `json:"addons,omitempty"`
}

ObservedClusterState captures the current state of the cluster.

func (*ObservedClusterState) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObservedClusterState.

func (*ObservedClusterState) DeepCopyInto

func (in *ObservedClusterState) DeepCopyInto(out *ObservedClusterState)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type PinnedIPRange added in v0.3.0

type PinnedIPRange struct {
	// StartAddress is the first IP of the pinned range.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^(\d{1,3}\.){3}\d{1,3}$`
	StartAddress string `json:"startAddress"`

	// EndAddress is the last IP of the pinned range.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^(\d{1,3}\.){3}\d{1,3}$`
	EndAddress string `json:"endAddress"`
}

PinnedIPRange specifies an exact IP range to allocate.

func (*PinnedIPRange) DeepCopy added in v0.3.0

func (in *PinnedIPRange) DeepCopy() *PinnedIPRange

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PinnedIPRange.

func (*PinnedIPRange) DeepCopyInto added in v0.3.0

func (in *PinnedIPRange) DeepCopyInto(out *PinnedIPRange)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type PoolReference added in v0.3.0

type PoolReference struct {
	// Name is the name of the NetworkPool.
	// +kubebuilder:validation:Required
	Name string `json:"name"`

	// Priority determines allocation order (lower = higher priority).
	// Pools at the same priority are tried in list order.
	// +kubebuilder:default=0
	// +optional
	Priority *int32 `json:"priority,omitempty"`
}

PoolReference references a NetworkPool with a priority.

func (*PoolReference) DeepCopy added in v0.3.0

func (in *PoolReference) DeepCopy() *PoolReference

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PoolReference.

func (*PoolReference) DeepCopyInto added in v0.3.0

func (in *PoolReference) DeepCopyInto(out *PoolReference)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ProviderCapacity added in v0.3.0

type ProviderCapacity struct {
	// AvailableIPs is the number of available IPs across all pools.
	// +optional
	AvailableIPs int32 `json:"availableIPs,omitempty"`

	// EstimatedTenants is the estimated number of tenants that can be provisioned.
	// +optional
	EstimatedTenants int32 `json:"estimatedTenants,omitempty"`
}

ProviderCapacity reports the available capacity of a provider.

func (*ProviderCapacity) DeepCopy added in v0.3.0

func (in *ProviderCapacity) DeepCopy() *ProviderCapacity

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderCapacity.

func (*ProviderCapacity) DeepCopyInto added in v0.3.0

func (in *ProviderCapacity) DeepCopyInto(out *ProviderCapacity)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ProviderConfig

type ProviderConfig struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   ProviderConfigSpec   `json:"spec,omitempty"`
	Status ProviderConfigStatus `json:"status,omitempty"`
}

ProviderConfig defines the configuration for an infrastructure provider. It contains credentials and provider-specific settings needed to create and manage virtual machines.

func (*ProviderConfig) DeepCopy

func (in *ProviderConfig) DeepCopy() *ProviderConfig

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderConfig.

func (*ProviderConfig) DeepCopyInto

func (in *ProviderConfig) DeepCopyInto(out *ProviderConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*ProviderConfig) DeepCopyObject

func (in *ProviderConfig) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type ProviderConfigList

type ProviderConfigList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []ProviderConfig `json:"items"`
}

ProviderConfigList contains a list of ProviderConfig.

func (*ProviderConfigList) DeepCopy

func (in *ProviderConfigList) DeepCopy() *ProviderConfigList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderConfigList.

func (*ProviderConfigList) DeepCopyInto

func (in *ProviderConfigList) DeepCopyInto(out *ProviderConfigList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*ProviderConfigList) DeepCopyObject

func (in *ProviderConfigList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type ProviderConfigScope added in v0.3.0

type ProviderConfigScope struct {
	// Type is the scope type.
	// +kubebuilder:default="platform"
	// +optional
	Type ProviderConfigScopeType `json:"type,omitempty"`

	// TeamRef references the Team when type is "team".
	// Required when type is "team".
	// +optional
	TeamRef *LocalObjectReference `json:"teamRef,omitempty"`
}

ProviderConfigScope defines the visibility of a ProviderConfig.

func (*ProviderConfigScope) DeepCopy added in v0.3.0

func (in *ProviderConfigScope) DeepCopy() *ProviderConfigScope

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderConfigScope.

func (*ProviderConfigScope) DeepCopyInto added in v0.3.0

func (in *ProviderConfigScope) DeepCopyInto(out *ProviderConfigScope)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ProviderConfigScopeType added in v0.3.0

type ProviderConfigScopeType string

ProviderConfigScopeType defines the visibility scope. +kubebuilder:validation:Enum=platform;team

const (
	// ProviderConfigScopePlatform means the provider is available to all teams.
	ProviderConfigScopePlatform ProviderConfigScopeType = "platform"

	// ProviderConfigScopeTeam means the provider is restricted to a specific team.
	ProviderConfigScopeTeam ProviderConfigScopeType = "team"
)

type ProviderConfigSpec

type ProviderConfigSpec struct {
	// Provider specifies the infrastructure provider type.
	// +kubebuilder:validation:Required
	Provider ProviderType `json:"provider"`

	// CredentialsRef references the Secret containing provider credentials.
	// The Secret must contain the appropriate keys for the provider type:
	// - harvester: "kubeconfig" (Harvester kubeconfig)
	// - nutanix: "username", "password"
	// - proxmox: "username", "password" or "token"
	// +kubebuilder:validation:Required
	CredentialsRef SecretReference `json:"credentialsRef"`

	// Harvester contains Harvester-specific configuration.
	// Required when provider is "harvester".
	// +optional
	Harvester *HarvesterProviderConfig `json:"harvester,omitempty"`

	// Nutanix contains Nutanix-specific configuration.
	// Required when provider is "nutanix".
	// +optional
	Nutanix *NutanixProviderConfig `json:"nutanix,omitempty"`

	// Proxmox contains Proxmox-specific configuration.
	// Required when provider is "proxmox".
	// +optional
	Proxmox *ProxmoxProviderConfig `json:"proxmox,omitempty"`

	// Azure contains Azure-specific configuration.
	// Required when provider is "azure".
	// +optional
	Azure *AzureProviderConfig `json:"azure,omitempty"`

	// AWS contains AWS-specific configuration.
	// Required when provider is "aws".
	// +optional
	AWS *AWSProviderConfig `json:"aws,omitempty"`

	// GCP contains GCP-specific configuration.
	// Required when provider is "gcp".
	// +optional
	GCP *GCPProviderConfig `json:"gcp,omitempty"`

	// Scope defines the visibility of this ProviderConfig.
	// Platform-scoped providers are available to all teams.
	// Team-scoped providers are restricted to a specific team.
	// +optional
	Scope *ProviderConfigScope `json:"scope,omitempty"`

	// Network configures IPAM and network settings for this provider.
	// +optional
	Network *ProviderNetworkConfig `json:"network,omitempty"`

	// Limits defines resource limits enforced per-team on this provider.
	// +optional
	Limits *ProviderLimits `json:"limits,omitempty"`
}

ProviderConfigSpec defines the desired state of ProviderConfig.

func (*ProviderConfigSpec) DeepCopy

func (in *ProviderConfigSpec) DeepCopy() *ProviderConfigSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderConfigSpec.

func (*ProviderConfigSpec) DeepCopyInto

func (in *ProviderConfigSpec) DeepCopyInto(out *ProviderConfigSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ProviderConfigStatus

type ProviderConfigStatus struct {
	// Conditions represent the latest available observations of the ProviderConfig's state.
	// +optional
	// +listType=map
	// +listMapKey=type
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// Validated indicates whether the provider configuration has been validated.
	// +optional
	Validated bool `json:"validated,omitempty"`

	// LastValidationTime is the timestamp of the last successful validation.
	// +optional
	LastValidationTime *metav1.Time `json:"lastValidationTime,omitempty"`

	// ProviderVersion is the detected version of the infrastructure provider.
	// +optional
	ProviderVersion string `json:"providerVersion,omitempty"`

	// Ready indicates overall readiness of the provider.
	// +optional
	Ready bool `json:"ready,omitempty"`

	// LastProbeTime is the timestamp of the last health probe.
	// +optional
	LastProbeTime *metav1.Time `json:"lastProbeTime,omitempty"`

	// Capacity reports the available capacity of this provider.
	// +optional
	Capacity *ProviderCapacity `json:"capacity,omitempty"`
}

ProviderConfigStatus defines the observed state of ProviderConfig.

func (*ProviderConfigStatus) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderConfigStatus.

func (*ProviderConfigStatus) DeepCopyInto

func (in *ProviderConfigStatus) DeepCopyInto(out *ProviderConfigStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ProviderLBConfig added in v0.3.0

type ProviderLBConfig struct {
	// DefaultPoolSize is the default number of LB IPs per tenant.
	// +kubebuilder:default=8
	// +kubebuilder:validation:Minimum=1
	// +optional
	DefaultPoolSize *int32 `json:"defaultPoolSize,omitempty"`
}

ProviderLBConfig configures load balancer defaults.

func (*ProviderLBConfig) DeepCopy added in v0.3.0

func (in *ProviderLBConfig) DeepCopy() *ProviderLBConfig

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderLBConfig.

func (*ProviderLBConfig) DeepCopyInto added in v0.3.0

func (in *ProviderLBConfig) DeepCopyInto(out *ProviderLBConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ProviderLimits added in v0.3.0

type ProviderLimits struct {
	// MaxClustersPerTeam limits the number of clusters per team.
	// +optional
	// +kubebuilder:validation:Minimum=1
	MaxClustersPerTeam *int32 `json:"maxClustersPerTeam,omitempty"`

	// MaxNodesPerTeam limits the total nodes per team.
	// +optional
	// +kubebuilder:validation:Minimum=1
	MaxNodesPerTeam *int32 `json:"maxNodesPerTeam,omitempty"`
}

ProviderLimits defines per-team resource limits on a provider.

func (*ProviderLimits) DeepCopy added in v0.3.0

func (in *ProviderLimits) DeepCopy() *ProviderLimits

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderLimits.

func (*ProviderLimits) DeepCopyInto added in v0.3.0

func (in *ProviderLimits) DeepCopyInto(out *ProviderLimits)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ProviderNetworkConfig added in v0.3.0

type ProviderNetworkConfig struct {
	// Mode determines how IP addresses are managed.
	// "ipam" uses NetworkPool-based automated allocation.
	// "cloud" relies on the cloud provider's native networking.
	// +kubebuilder:validation:Enum=ipam;cloud
	// +kubebuilder:default="cloud"
	// +optional
	Mode string `json:"mode,omitempty"`

	// PoolRefs references NetworkPools for IPAM allocation, ordered by priority.
	// Required when mode is "ipam". Allocator tries first pool, falls back to next if exhausted.
	// +optional
	PoolRefs []PoolReference `json:"poolRefs,omitempty"`

	// Subnet is the network name for VM placement (e.g., "VM Network - VLAN 40").
	// +optional
	Subnet string `json:"subnet,omitempty"`

	// Gateway is the network gateway address.
	// +optional
	Gateway string `json:"gateway,omitempty"`

	// DNSServers are the DNS server addresses.
	// +optional
	DNSServers []string `json:"dnsServers,omitempty"`

	// LoadBalancer configures load balancer IP allocation defaults.
	// +optional
	LoadBalancer *ProviderLBConfig `json:"loadBalancer,omitempty"`

	// QuotaPerTenant defines per-tenant network resource quotas.
	// +optional
	QuotaPerTenant *NetworkQuota `json:"quotaPerTenant,omitempty"`
}

ProviderNetworkConfig configures IPAM and network settings.

func (*ProviderNetworkConfig) DeepCopy added in v0.3.0

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderNetworkConfig.

func (*ProviderNetworkConfig) DeepCopyInto added in v0.3.0

func (in *ProviderNetworkConfig) DeepCopyInto(out *ProviderNetworkConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ProviderReference

type ProviderReference struct {
	// Name is the name of the ProviderConfig resource.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Name string `json:"name"`

	// Namespace is the namespace of the ProviderConfig resource.
	// If not specified, the namespace of the referencing resource is used.
	// +optional
	Namespace string `json:"namespace,omitempty"`
}

ProviderReference references a ProviderConfig resource.

func (*ProviderReference) DeepCopy

func (in *ProviderReference) DeepCopy() *ProviderReference

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProviderReference.

func (*ProviderReference) DeepCopyInto

func (in *ProviderReference) DeepCopyInto(out *ProviderReference)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ProviderType

type ProviderType string

ProviderType defines the supported infrastructure providers. +kubebuilder:validation:Enum=harvester;nutanix;proxmox;azure;aws;gcp

const (
	// ProviderTypeHarvester is the Harvester HCI provider.
	ProviderTypeHarvester ProviderType = "harvester"

	// ProviderTypeNutanix is the Nutanix AHV provider.
	ProviderTypeNutanix ProviderType = "nutanix"

	// ProviderTypeProxmox is the Proxmox VE provider.
	ProviderTypeProxmox ProviderType = "proxmox"

	// ProviderTypeAzure is the Microsoft Azure provider.
	ProviderTypeAzure ProviderType = "azure"

	// ProviderTypeAWS is the Amazon Web Services provider.
	ProviderTypeAWS ProviderType = "aws"

	// ProviderTypeGCP is the Google Cloud Platform provider.
	ProviderTypeGCP ProviderType = "gcp"
)

type ProxmoxOverride

type ProxmoxOverride struct {
	// Node is the Proxmox node to deploy VMs on.
	// +optional
	Node string `json:"node,omitempty"`

	// Storage is the Proxmox storage to use.
	// +optional
	Storage string `json:"storage,omitempty"`

	// TemplateID is the VM template ID.
	// +optional
	TemplateID int `json:"templateID,omitempty"`
}

ProxmoxOverride contains Proxmox-specific settings.

func (*ProxmoxOverride) DeepCopy

func (in *ProxmoxOverride) DeepCopy() *ProxmoxOverride

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxmoxOverride.

func (*ProxmoxOverride) DeepCopyInto

func (in *ProxmoxOverride) DeepCopyInto(out *ProxmoxOverride)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ProxmoxProviderConfig

type ProxmoxProviderConfig struct {
	// Endpoint is the Proxmox API URL.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^https?://`
	Endpoint string `json:"endpoint"`

	// Insecure allows insecure TLS connections.
	// +kubebuilder:default=false
	// +optional
	Insecure bool `json:"insecure,omitempty"`

	// Nodes is the list of Proxmox nodes available for VM placement.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinItems=1
	Nodes []string `json:"nodes"`

	// Storage is the storage location for VM disks.
	// +kubebuilder:validation:Required
	Storage string `json:"storage"`

	// TemplateID is the VM template ID to clone.
	// +optional
	TemplateID int32 `json:"templateID,omitempty"`

	// VMIDRange defines the range of VM IDs to use.
	// +optional
	VMIDRange *VMIDRange `json:"vmidRange,omitempty"`
}

ProxmoxProviderConfig contains Proxmox-specific configuration.

func (*ProxmoxProviderConfig) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxmoxProviderConfig.

func (*ProxmoxProviderConfig) DeepCopyInto

func (in *ProxmoxProviderConfig) DeepCopyInto(out *ProxmoxProviderConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ReservedRange added in v0.3.0

type ReservedRange struct {
	// CIDR is the reserved range in CIDR notation.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^(\d{1,3}\.){3}\d{1,3}/\d{1,2}$`
	CIDR string `json:"cidr"`

	// Description explains why this range is reserved.
	// +optional
	Description string `json:"description,omitempty"`
}

ReservedRange defines a range of IPs excluded from allocation.

func (*ReservedRange) DeepCopy added in v0.3.0

func (in *ReservedRange) DeepCopy() *ReservedRange

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReservedRange.

func (*ReservedRange) DeepCopyInto added in v0.3.0

func (in *ReservedRange) DeepCopyInto(out *ReservedRange)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ResourceLimits

type ResourceLimits struct {
	// MaxClusters is the maximum number of TenantClusters a Team can create.
	// +kubebuilder:validation:Minimum=1
	// +optional
	MaxClusters *int32 `json:"maxClusters,omitempty"`

	// MaxWorkersPerCluster is the maximum workers per TenantCluster.
	// +kubebuilder:validation:Minimum=1
	// +optional
	MaxWorkersPerCluster *int32 `json:"maxWorkersPerCluster,omitempty"`

	// MaxTotalCPU is the maximum total CPU cores across all clusters.
	// +optional
	MaxTotalCPU *resource.Quantity `json:"maxTotalCPU,omitempty"`

	// MaxTotalMemory is the maximum total memory across all clusters.
	// +optional
	MaxTotalMemory *resource.Quantity `json:"maxTotalMemory,omitempty"`

	// MaxTotalStorage is the maximum total storage across all clusters.
	// +optional
	MaxTotalStorage *resource.Quantity `json:"maxTotalStorage,omitempty"`
}

ResourceLimits defines resource limits for Teams.

func (*ResourceLimits) DeepCopy

func (in *ResourceLimits) DeepCopy() *ResourceLimits

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceLimits.

func (*ResourceLimits) DeepCopyInto

func (in *ResourceLimits) DeepCopyInto(out *ResourceLimits)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type SecretReference

type SecretReference struct {
	// Name is the name of the Secret.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Name string `json:"name"`

	// Namespace is the namespace of the Secret.
	// If not specified, the namespace of the referencing resource is used.
	// +optional
	Namespace string `json:"namespace,omitempty"`

	// Key is the key within the Secret to reference.
	// If not specified, the entire Secret data is used.
	// +optional
	Key string `json:"key,omitempty"`
}

SecretReference references a Secret resource.

func (*SecretReference) DeepCopy

func (in *SecretReference) DeepCopy() *SecretReference

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretReference.

func (*SecretReference) DeepCopyInto

func (in *SecretReference) DeepCopyInto(out *SecretReference)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type StorageAddonSpec

type StorageAddonSpec struct {
	// Type is the storage type
	// +kubebuilder:validation:Enum=longhorn;none
	// +kubebuilder:default=longhorn
	Type string `json:"type,omitempty"`

	// Version is the addon version
	// +optional
	Version string `json:"version,omitempty"`

	// ReplicaCount is the default replica count for Longhorn volumes
	// For single-node topology, this is automatically set to 1
	// +optional
	// +kubebuilder:default=3
	ReplicaCount *int32 `json:"replicaCount,omitempty"`
}

StorageAddonSpec defines storage configuration

func (*StorageAddonSpec) DeepCopy

func (in *StorageAddonSpec) DeepCopy() *StorageAddonSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageAddonSpec.

func (*StorageAddonSpec) DeepCopyInto

func (in *StorageAddonSpec) DeepCopyInto(out *StorageAddonSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type StorageSpec

type StorageSpec struct {
	// Provider is the storage provider.
	// +kubebuilder:validation:Enum=longhorn;linstor
	// +optional
	Provider string `json:"provider,omitempty"`

	// Version is the addon version.
	// +kubebuilder:validation:Required
	Version string `json:"version"`

	// Values are Helm values for customization.
	// +optional
	// +kubebuilder:pruning:PreserveUnknownFields
	Values *ExtensionValues `json:"values,omitempty"`
}

StorageSpec configures persistent storage.

func (*StorageSpec) DeepCopy

func (in *StorageSpec) DeepCopy() *StorageSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageSpec.

func (*StorageSpec) DeepCopyInto

func (in *StorageSpec) DeepCopyInto(out *StorageSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TalosConfig added in v0.2.0

type TalosConfig struct {
	// InstallDisk is the disk where Talos will be installed.
	// +kubebuilder:default="/dev/vda"
	// +optional
	InstallDisk string `json:"installDisk,omitempty"`

	// InstallerImage is the Talos installer image
	// (e.g., factory.talos.dev/installer/<schematic>:v1.9.3).
	// +optional
	InstallerImage string `json:"installerImage,omitempty"`

	// Version is the Talos version.
	// +kubebuilder:default="v1.9.3"
	// +optional
	Version string `json:"version,omitempty"`
}

TalosConfig provides Talos-specific worker node configuration.

func (*TalosConfig) DeepCopy added in v0.2.0

func (in *TalosConfig) DeepCopy() *TalosConfig

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TalosConfig.

func (*TalosConfig) DeepCopyInto added in v0.2.0

func (in *TalosConfig) DeepCopyInto(out *TalosConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TalosConfigPatch

type TalosConfigPatch struct {
	// Op is the patch operation (add, remove, replace)
	// +kubebuilder:validation:Enum=add;remove;replace
	Op string `json:"op"`

	// Path is the JSON path to patch
	Path string `json:"path"`

	// Value is the value to set (for add/replace)
	// +optional
	Value string `json:"value,omitempty"`
}

TalosConfigPatch defines a Talos config patch

func (*TalosConfigPatch) DeepCopy

func (in *TalosConfigPatch) DeepCopy() *TalosConfigPatch

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TalosConfigPatch.

func (*TalosConfigPatch) DeepCopyInto

func (in *TalosConfigPatch) DeepCopyInto(out *TalosConfigPatch)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type Team

type Team struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   TeamSpec   `json:"spec,omitempty"`
	Status TeamStatus `json:"status,omitempty"`
}

Team is the Schema for the teams API. A Team represents a group of users who share access to TenantClusters. Each Team gets its own namespace where TenantClusters are created.

func (*Team) DeepCopy

func (in *Team) DeepCopy() *Team

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Team.

func (*Team) DeepCopyInto

func (in *Team) DeepCopyInto(out *Team)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*Team) DeepCopyObject

func (in *Team) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type TeamAccess

type TeamAccess struct {
	// Users is a list of users with access to this Team.
	// Users are identified by their email address.
	// +optional
	Users []TeamUser `json:"users,omitempty"`

	// Groups is a list of groups with access to this Team.
	// Groups are matched against OIDC groups or AD groups.
	// +optional
	Groups []TeamGroup `json:"groups,omitempty"`
}

TeamAccess defines users and groups that have access to the Team.

func (*TeamAccess) DeepCopy

func (in *TeamAccess) DeepCopy() *TeamAccess

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TeamAccess.

func (*TeamAccess) DeepCopyInto

func (in *TeamAccess) DeepCopyInto(out *TeamAccess)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TeamGroup

type TeamGroup struct {
	// Name is the group identifier (OIDC group, AD group DN, etc.).
	// This can be the full DN for AD groups or simple names for OIDC.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Name string `json:"name"`

	// Role is the group's role within the Team.
	// All members of the group inherit this role.
	// +kubebuilder:default="viewer"
	// +optional
	Role TeamRole `json:"role,omitempty"`

	// IdentityProvider is the name of the IdentityProvider CRD this group comes from.
	// If specified, only users authenticating through this IdP will be matched.
	// If not specified, the group name will be matched against groups from any IdP.
	// +optional
	IdentityProvider string `json:"identityProvider,omitempty"`
}

TeamGroup represents a group with access to a Team.

func (*TeamGroup) DeepCopy

func (in *TeamGroup) DeepCopy() *TeamGroup

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TeamGroup.

func (*TeamGroup) DeepCopyInto

func (in *TeamGroup) DeepCopyInto(out *TeamGroup)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TeamList

type TeamList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []Team `json:"items"`
}

TeamList contains a list of Team.

func (*TeamList) DeepCopy

func (in *TeamList) DeepCopy() *TeamList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TeamList.

func (*TeamList) DeepCopyInto

func (in *TeamList) DeepCopyInto(out *TeamList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*TeamList) DeepCopyObject

func (in *TeamList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type TeamPhase

type TeamPhase string

TeamPhase represents the current phase of a Team. +kubebuilder:validation:Enum=Pending;Ready;Terminating;Failed

const (
	// TeamPhasePending indicates the Team is being set up.
	TeamPhasePending TeamPhase = "Pending"

	// TeamPhaseReady indicates the Team is ready for use.
	TeamPhaseReady TeamPhase = "Ready"

	// TeamPhaseTerminating indicates the Team is being deleted.
	TeamPhaseTerminating TeamPhase = "Terminating"

	// TeamPhaseFailed indicates the Team setup failed.
	TeamPhaseFailed TeamPhase = "Failed"
)

type TeamResourceLimits

type TeamResourceLimits struct {

	// MaxClusters is the maximum number of TenantClusters this team can create.
	// +optional
	// +kubebuilder:validation:Minimum=0
	MaxClusters *int32 `json:"maxClusters,omitempty"`

	// MaxNodesPerCluster is the maximum worker nodes per cluster.
	// +optional
	// +kubebuilder:validation:Minimum=0
	MaxNodesPerCluster *int32 `json:"maxNodesPerCluster,omitempty"`

	// MaxTotalNodes is the maximum total worker nodes across all clusters.
	// +optional
	// +kubebuilder:validation:Minimum=0
	MaxTotalNodes *int32 `json:"maxTotalNodes,omitempty"`

	// MaxCPUCores is the maximum total CPU cores across all clusters.
	// +optional
	MaxCPUCores *resource.Quantity `json:"maxCPUCores,omitempty"`

	// MaxMemory is the maximum total memory across all clusters.
	// +optional
	MaxMemory *resource.Quantity `json:"maxMemory,omitempty"`

	// MaxStorage is the maximum total storage across all clusters.
	// +optional
	MaxStorage *resource.Quantity `json:"maxStorage,omitempty"`

	// DefaultNodeCount is the default worker count for new clusters.
	// +optional
	// +kubebuilder:validation:Minimum=0
	// +kubebuilder:default=3
	DefaultNodeCount *int32 `json:"defaultNodeCount,omitempty"`

	// DefaultCPUPerNode is the default CPU cores per worker node.
	// +optional
	DefaultCPUPerNode *resource.Quantity `json:"defaultCPUPerNode,omitempty"`

	// DefaultMemoryPerNode is the default memory per worker node.
	// +optional
	DefaultMemoryPerNode *resource.Quantity `json:"defaultMemoryPerNode,omitempty"`

	// AllowedKubernetesVersions restricts which K8s versions can be used.
	// If empty, all supported versions are allowed.
	// +optional
	AllowedKubernetesVersions []string `json:"allowedKubernetesVersions,omitempty"`

	// AllowedProviders restricts which ProviderConfigs can be used.
	// If empty, all providers the team has access to are allowed.
	// +optional
	AllowedProviders []string `json:"allowedProviders,omitempty"`

	// AllowedAddons restricts which addons can be installed.
	// If empty, all addons are allowed.
	// +optional
	AllowedAddons []string `json:"allowedAddons,omitempty"`

	// DeniedAddons explicitly denies certain addons.
	// Takes precedence over AllowedAddons.
	// +optional
	DeniedAddons []string `json:"deniedAddons,omitempty"`
}

TeamResourceLimits defines resource quotas and restrictions for a Team. This is separate from ResourceLimits in butlerconfig_types.go which defines platform-wide defaults. TeamResourceLimits includes additional fields for feature restrictions that are team-specific.

func (*TeamResourceLimits) DeepCopy

func (in *TeamResourceLimits) DeepCopy() *TeamResourceLimits

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TeamResourceLimits.

func (*TeamResourceLimits) DeepCopyInto

func (in *TeamResourceLimits) DeepCopyInto(out *TeamResourceLimits)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TeamResourceUsage

type TeamResourceUsage struct {
	// Clusters is the number of TenantClusters.
	// +optional
	Clusters int32 `json:"clusters,omitempty"`

	// TotalNodes is the total number of worker nodes.
	// +optional
	TotalNodes int32 `json:"totalNodes,omitempty"`

	// TotalCPU is the total CPU cores allocated.
	// +optional
	TotalCPU *resource.Quantity `json:"totalCPU,omitempty"`

	// TotalMemory is the total memory allocated.
	// +optional
	TotalMemory *resource.Quantity `json:"totalMemory,omitempty"`

	// TotalStorage is the total storage allocated.
	// +optional
	TotalStorage *resource.Quantity `json:"totalStorage,omitempty"`

	// ClusterUtilization is percentage of MaxClusters used.
	// +optional
	// +kubebuilder:validation:Minimum=0
	// +kubebuilder:validation:Maximum=100
	ClusterUtilization *int32 `json:"clusterUtilization,omitempty"`

	// NodeUtilization is percentage of MaxTotalNodes used.
	// +optional
	// +kubebuilder:validation:Minimum=0
	// +kubebuilder:validation:Maximum=100
	NodeUtilization *int32 `json:"nodeUtilization,omitempty"`

	// CPUUtilization is percentage of MaxCPUCores used.
	// +optional
	// +kubebuilder:validation:Minimum=0
	// +kubebuilder:validation:Maximum=100
	CPUUtilization *int32 `json:"cpuUtilization,omitempty"`

	// MemoryUtilization is percentage of MaxMemory used.
	// +optional
	// +kubebuilder:validation:Minimum=0
	// +kubebuilder:validation:Maximum=100
	MemoryUtilization *int32 `json:"memoryUtilization,omitempty"`
}

TeamResourceUsage shows current resource consumption for a Team.

func (*TeamResourceUsage) DeepCopy

func (in *TeamResourceUsage) DeepCopy() *TeamResourceUsage

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TeamResourceUsage.

func (*TeamResourceUsage) DeepCopyInto

func (in *TeamResourceUsage) DeepCopyInto(out *TeamResourceUsage)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TeamRole

type TeamRole string

TeamRole defines the role a user or group has within a Team. +kubebuilder:validation:Enum=admin;operator;viewer

const (
	// TeamRoleAdmin has full access to manage the team and all its resources.
	// Can: create/delete clusters, manage team members, change settings
	TeamRoleAdmin TeamRole = "admin"

	// TeamRoleOperator can create and manage clusters but cannot manage team settings.
	// Can: create/delete clusters, scale, install addons
	// Cannot: manage team members, change team settings
	TeamRoleOperator TeamRole = "operator"

	// TeamRoleViewer has read-only access to team resources.
	// Can: view clusters, view kubeconfigs, view logs
	// Cannot: create/modify/delete anything
	TeamRoleViewer TeamRole = "viewer"
)

type TeamSpec

type TeamSpec struct {
	// DisplayName is a human-readable name for the Team.
	// +optional
	DisplayName string `json:"displayName,omitempty"`

	// Description provides additional context about the Team.
	// +optional
	Description string `json:"description,omitempty"`

	// Access defines who can access this Team's resources.
	// +optional
	Access TeamAccess `json:"access,omitempty"`

	// ResourceLimits defines the resource quotas and restrictions for this Team.
	// If not specified, defaults from ButlerConfig are used.
	// If ButlerConfig has no defaults, no limits are enforced.
	// +optional
	ResourceLimits *TeamResourceLimits `json:"resourceLimits,omitempty"`

	// ProviderConfigRef references a Team-specific ProviderConfig.
	// If not specified, the platform default is used.
	// +optional
	ProviderConfigRef *LocalObjectReference `json:"providerConfigRef,omitempty"`

	// ClusterDefaults defines default values for new clusters in this team.
	// +optional
	ClusterDefaults *ClusterDefaults `json:"clusterDefaults,omitempty"`
}

TeamSpec defines the desired state of Team.

func (*TeamSpec) DeepCopy

func (in *TeamSpec) DeepCopy() *TeamSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TeamSpec.

func (*TeamSpec) DeepCopyInto

func (in *TeamSpec) DeepCopyInto(out *TeamSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TeamStatus

type TeamStatus struct {
	// Conditions represent the latest available observations of the Team's state.
	// +optional
	// +listType=map
	// +listMapKey=type
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// Phase represents the current phase of the Team.
	// +optional
	Phase TeamPhase `json:"phase,omitempty"`

	// Namespace is the namespace created for this Team.
	// +optional
	Namespace string `json:"namespace,omitempty"`

	// ObservedGeneration is the last observed generation.
	// +optional
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`

	// ClusterCount is the number of TenantClusters in this Team.
	// +optional
	ClusterCount int32 `json:"clusterCount,omitempty"`

	// MemberCount is the total number of users with access to this Team.
	// +optional
	MemberCount int32 `json:"memberCount,omitempty"`

	// ResourceUsage shows the current resource usage for this Team.
	// +optional
	ResourceUsage *TeamResourceUsage `json:"resourceUsage,omitempty"`

	// QuotaStatus indicates whether the team is within quota.
	// +optional
	// +kubebuilder:validation:Enum=OK;Warning;Exceeded
	QuotaStatus string `json:"quotaStatus,omitempty"`

	// QuotaMessage provides details about quota status.
	// +optional
	QuotaMessage string `json:"quotaMessage,omitempty"`
}

TeamStatus defines the observed state of Team.

func (*TeamStatus) DeepCopy

func (in *TeamStatus) DeepCopy() *TeamStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TeamStatus.

func (*TeamStatus) DeepCopyInto

func (in *TeamStatus) DeepCopyInto(out *TeamStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TeamUser

type TeamUser struct {
	// Name is the user identifier (email address).
	// For internal users, this is the email from User.spec.email.
	// For SSO users, this is the email from the OIDC token.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Name string `json:"name"`

	// Role is the user's role within the Team.
	// +kubebuilder:default="viewer"
	// +optional
	Role TeamRole `json:"role,omitempty"`
}

TeamUser represents a user with access to a Team.

func (*TeamUser) DeepCopy

func (in *TeamUser) DeepCopy() *TeamUser

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TeamUser.

func (*TeamUser) DeepCopyInto

func (in *TeamUser) DeepCopyInto(out *TeamUser)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TenantAddon

type TenantAddon struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   TenantAddonSpec   `json:"spec,omitempty"`
	Status TenantAddonStatus `json:"status,omitempty"`
}

TenantAddon is the Schema for the tenantaddons API. It represents an addon to be installed in a TenantCluster. Unlike addons defined in TenantCluster.spec.addons (which are monotonic), TenantAddons can be deleted to remove the addon from the cluster.

func (*TenantAddon) DeepCopy

func (in *TenantAddon) DeepCopy() *TenantAddon

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TenantAddon.

func (*TenantAddon) DeepCopyInto

func (in *TenantAddon) DeepCopyInto(out *TenantAddon)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*TenantAddon) DeepCopyObject

func (in *TenantAddon) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type TenantAddonList

type TenantAddonList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []TenantAddon `json:"items"`
}

TenantAddonList contains a list of TenantAddon.

func (*TenantAddonList) DeepCopy

func (in *TenantAddonList) DeepCopy() *TenantAddonList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TenantAddonList.

func (*TenantAddonList) DeepCopyInto

func (in *TenantAddonList) DeepCopyInto(out *TenantAddonList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*TenantAddonList) DeepCopyObject

func (in *TenantAddonList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type TenantAddonPhase

type TenantAddonPhase string

TenantAddonPhase represents the current phase of a TenantAddon. +kubebuilder:validation:Enum=Pending;Installing;Installed;Upgrading;Degraded;Failed;Deleting

const (
	// TenantAddonPhasePending indicates the addon is waiting to be installed.
	TenantAddonPhasePending TenantAddonPhase = "Pending"

	// TenantAddonPhaseInstalling indicates the addon is being installed.
	TenantAddonPhaseInstalling TenantAddonPhase = "Installing"

	// TenantAddonPhaseInstalled indicates the addon is installed and healthy.
	TenantAddonPhaseInstalled TenantAddonPhase = "Installed"

	// TenantAddonPhaseUpgrading indicates the addon is being upgraded.
	TenantAddonPhaseUpgrading TenantAddonPhase = "Upgrading"

	// TenantAddonPhaseDegraded indicates the addon is installed but unhealthy.
	TenantAddonPhaseDegraded TenantAddonPhase = "Degraded"

	// TenantAddonPhaseFailed indicates addon installation failed.
	TenantAddonPhaseFailed TenantAddonPhase = "Failed"

	// TenantAddonPhaseDeleting indicates the addon is being removed.
	TenantAddonPhaseDeleting TenantAddonPhase = "Deleting"
)

type TenantAddonSpec

type TenantAddonSpec struct {
	// ClusterRef references the TenantCluster to install this addon into.
	// +kubebuilder:validation:Required
	ClusterRef LocalObjectReference `json:"clusterRef"`

	// Addon specifies a known Butler addon name.
	// Use this for built-in addons like cilium, metallb, etc.
	// Mutually exclusive with Helm.
	// +optional
	Addon string `json:"addon,omitempty"`

	// Version is the addon version to install.
	// +kubebuilder:validation:Required
	Version string `json:"version"`

	// Helm specifies a custom Helm chart to install.
	// Use this for arbitrary Helm charts not built into Butler.
	// Mutually exclusive with Addon.
	// +optional
	Helm *HelmChartSpec `json:"helm,omitempty"`

	// Values are Helm values for customization.
	// +optional
	// +kubebuilder:pruning:PreserveUnknownFields
	Values *ExtensionValues `json:"values,omitempty"`

	// DependsOn specifies other TenantAddons that must be ready first.
	// +optional
	DependsOn []LocalObjectReference `json:"dependsOn,omitempty"`
}

TenantAddonSpec defines the desired state of TenantAddon.

func (*TenantAddonSpec) DeepCopy

func (in *TenantAddonSpec) DeepCopy() *TenantAddonSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TenantAddonSpec.

func (*TenantAddonSpec) DeepCopyInto

func (in *TenantAddonSpec) DeepCopyInto(out *TenantAddonSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TenantAddonStatus

type TenantAddonStatus struct {
	// Conditions represent the latest available observations.
	// +optional
	// +listType=map
	// +listMapKey=type
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// Phase represents the current phase of the addon.
	// +optional
	Phase TenantAddonPhase `json:"phase,omitempty"`

	// InstalledVersion is the currently installed version.
	// +optional
	InstalledVersion string `json:"installedVersion,omitempty"`

	// HelmRelease contains Helm release information.
	// +optional
	HelmRelease *HelmReleaseStatus `json:"helmRelease,omitempty"`

	// ObservedGeneration is the last observed generation.
	// +optional
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`

	// LastTransitionTime is when the phase last changed.
	// +optional
	LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"`

	// Message provides human-readable status information.
	// +optional
	Message string `json:"message,omitempty"`
}

TenantAddonStatus defines the observed state of TenantAddon.

func (*TenantAddonStatus) DeepCopy

func (in *TenantAddonStatus) DeepCopy() *TenantAddonStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TenantAddonStatus.

func (*TenantAddonStatus) DeepCopyInto

func (in *TenantAddonStatus) DeepCopyInto(out *TenantAddonStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TenantAllocationConfig added in v0.3.0

type TenantAllocationConfig struct {
	// Start is the first allocatable IP address.
	// +kubebuilder:validation:Required
	Start string `json:"start"`

	// End is the last allocatable IP address.
	// +kubebuilder:validation:Required
	End string `json:"end"`

	// Defaults defines default allocation sizes per tenant.
	// +optional
	Defaults TenantAllocationDefaults `json:"defaults,omitempty"`
}

TenantAllocationConfig defines the allocatable sub-range and defaults.

func (*TenantAllocationConfig) DeepCopy added in v0.3.0

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TenantAllocationConfig.

func (*TenantAllocationConfig) DeepCopyInto added in v0.3.0

func (in *TenantAllocationConfig) DeepCopyInto(out *TenantAllocationConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TenantAllocationDefaults added in v0.3.0

type TenantAllocationDefaults struct {
	// NodesPerTenant is the default number of node IPs per tenant.
	// +kubebuilder:default=5
	// +kubebuilder:validation:Minimum=1
	// +optional
	NodesPerTenant int32 `json:"nodesPerTenant,omitempty"`

	// LBPoolPerTenant is the default number of load balancer IPs per tenant.
	// +kubebuilder:default=8
	// +kubebuilder:validation:Minimum=1
	// +optional
	LBPoolPerTenant int32 `json:"lbPoolPerTenant,omitempty"`
}

TenantAllocationDefaults defines default allocation sizes per tenant.

func (*TenantAllocationDefaults) DeepCopy added in v0.3.0

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TenantAllocationDefaults.

func (*TenantAllocationDefaults) DeepCopyInto added in v0.3.0

func (in *TenantAllocationDefaults) DeepCopyInto(out *TenantAllocationDefaults)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TenantCluster

type TenantCluster struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   TenantClusterSpec   `json:"spec,omitempty"`
	Status TenantClusterStatus `json:"status,omitempty"`
}

TenantCluster is the Schema for the tenantclusters API. It represents a complete Kubernetes cluster managed by Butler.

func (*TenantCluster) DeepCopy

func (in *TenantCluster) DeepCopy() *TenantCluster

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TenantCluster.

func (*TenantCluster) DeepCopyInto

func (in *TenantCluster) DeepCopyInto(out *TenantCluster)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*TenantCluster) DeepCopyObject

func (in *TenantCluster) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type TenantClusterList

type TenantClusterList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []TenantCluster `json:"items"`
}

TenantClusterList contains a list of TenantCluster.

func (*TenantClusterList) DeepCopy

func (in *TenantClusterList) DeepCopy() *TenantClusterList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TenantClusterList.

func (*TenantClusterList) DeepCopyInto

func (in *TenantClusterList) DeepCopyInto(out *TenantClusterList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*TenantClusterList) DeepCopyObject

func (in *TenantClusterList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type TenantClusterPhase

type TenantClusterPhase string

TenantClusterPhase represents the current phase of a TenantCluster. +kubebuilder:validation:Enum=Pending;Provisioning;Installing;Ready;Updating;Deleting;Failed

const (
	// TenantClusterPhasePending indicates the cluster is pending creation.
	TenantClusterPhasePending TenantClusterPhase = "Pending"

	// TenantClusterPhaseProvisioning indicates infrastructure is being provisioned.
	TenantClusterPhaseProvisioning TenantClusterPhase = "Provisioning"

	// TenantClusterPhaseInstalling indicates addons are being installed.
	TenantClusterPhaseInstalling TenantClusterPhase = "Installing"

	// TenantClusterPhaseReady indicates the cluster is ready for use.
	TenantClusterPhaseReady TenantClusterPhase = "Ready"

	// TenantClusterPhaseUpdating indicates the cluster is being updated.
	TenantClusterPhaseUpdating TenantClusterPhase = "Updating"

	// TenantClusterPhaseDeleting indicates the cluster is being deleted.
	TenantClusterPhaseDeleting TenantClusterPhase = "Deleting"

	// TenantClusterPhaseFailed indicates a failure occurred.
	TenantClusterPhaseFailed TenantClusterPhase = "Failed"
)

type TenantClusterSpec

type TenantClusterSpec struct {
	// KubernetesVersion is the target Kubernetes version.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^v\d+\.\d+\.\d+$`
	KubernetesVersion string `json:"kubernetesVersion"`

	// TeamRef references the Team this cluster belongs to.
	// Required when multi-tenancy mode is Enforced.
	// +optional
	TeamRef *LocalObjectReference `json:"teamRef,omitempty"`

	// ProviderConfigRef references the ProviderConfig for infrastructure.
	// If not specified, defaults are used (Team's or platform's).
	// Namespace defaults to butler-system if not specified.
	// +optional
	ProviderConfigRef *ProviderReference `json:"providerConfigRef,omitempty"`

	// ControlPlane configures the Steward-hosted control plane.
	// +optional
	ControlPlane ControlPlaneSpec `json:"controlPlane,omitempty"`

	// Workers configures the worker nodes.
	// +kubebuilder:validation:Required
	Workers WorkersSpec `json:"workers"`

	// Networking configures cluster networking.
	// +optional
	Networking NetworkingSpec `json:"networking,omitempty"`

	// ManagementPolicy defines how Butler manages this cluster.
	// +optional
	ManagementPolicy ManagementPolicySpec `json:"managementPolicy,omitempty"`

	// Addons defines the initial addons to install.
	// These are installed at cluster creation time.
	// Additional addons can be added via TenantAddon resources.
	// +optional
	Addons AddonsSpec `json:"addons,omitempty"`

	// InfrastructureOverride allows overriding provider-specific settings.
	// These take precedence over ProviderConfig defaults.
	// +optional
	InfrastructureOverride *InfrastructureOverride `json:"infrastructureOverride,omitempty"`
}

TenantClusterSpec defines the desired state of TenantCluster.

func (*TenantClusterSpec) DeepCopy

func (in *TenantClusterSpec) DeepCopy() *TenantClusterSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TenantClusterSpec.

func (*TenantClusterSpec) DeepCopyInto

func (in *TenantClusterSpec) DeepCopyInto(out *TenantClusterSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type TenantClusterStatus

type TenantClusterStatus struct {
	// Conditions represent the latest available observations.
	// +optional
	// +listType=map
	// +listMapKey=type
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// Phase represents the current phase of the cluster.
	// +optional
	Phase TenantClusterPhase `json:"phase,omitempty"`

	// TenantNamespace is the namespace containing CAPI/Steward resources.
	// +optional
	TenantNamespace string `json:"tenantNamespace,omitempty"`

	// ControlPlaneEndpoint is the API server endpoint.
	// +optional
	ControlPlaneEndpoint string `json:"controlPlaneEndpoint,omitempty"`

	// KubeconfigSecretRef references the Secret containing the kubeconfig.
	// +optional
	KubeconfigSecretRef *LocalObjectReference `json:"kubeconfigSecretRef,omitempty"`

	// ObservedGeneration is the last observed generation.
	// +optional
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`

	// LastTransitionTime is when the phase last changed.
	// +optional
	LastTransitionTime *metav1.Time `json:"lastTransitionTime,omitempty"`

	// ObservedState is the observed state of the cluster.
	// +optional
	ObservedState *ObservedClusterState `json:"observedState,omitempty"`

	// WorkerNodesReady is the count of ready worker nodes
	// +optional
	WorkerNodesReady int32 `json:"workerNodesReady,omitempty"`

	// WorkerNodesDesired is the desired count of worker nodes
	// +optional
	WorkerNodesDesired int32 `json:"workerNodesDesired,omitempty"`

	// IPAllocationRef references the node IP allocation from IPAM.
	// +optional
	IPAllocationRef *LocalObjectReference `json:"ipAllocationRef,omitempty"`

	// LBAllocationRef references the load balancer IP allocation from IPAM.
	// +optional
	LBAllocationRef *LocalObjectReference `json:"lbAllocationRef,omitempty"`
}

TenantClusterStatus defines the observed state of TenantCluster.

func (*TenantClusterStatus) DeepCopy

func (in *TenantClusterStatus) DeepCopy() *TenantClusterStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TenantClusterStatus.

func (*TenantClusterStatus) DeepCopyInto

func (in *TenantClusterStatus) DeepCopyInto(out *TenantClusterStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type User

type User struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   UserSpec   `json:"spec,omitempty"`
	Status UserStatus `json:"status,omitempty"`
}

User represents a Butler user account. Users can authenticate via SSO (OIDC) or with email/password (internal).

SSO User Flow: 1. User clicks "Sign in with Google/Okta/etc" 2. Butler creates User CRD automatically on first login 3. User is matched to Teams by email address

Internal User Flow: 1. Admin creates User with email (no password) 2. Butler generates invite token, returns URL to admin 3. Admin shares invite URL with user (via Slack, email, etc.) 4. User clicks link, sets their own password 5. Password is hashed (bcrypt) and stored in a Secret 6. User status changes from Pending to Active

Platform Admin: Users with spec.isPlatformAdmin=true have full platform access, bypassing team-based RBAC. This should be used sparingly.

func (*User) DeepCopy

func (in *User) DeepCopy() *User

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new User.

func (*User) DeepCopyInto

func (in *User) DeepCopyInto(out *User)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*User) DeepCopyObject

func (in *User) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

func (*User) IsActive

func (u *User) IsActive() bool

IsActive returns true if the user can log in.

func (*User) IsDisabled

func (u *User) IsDisabled() bool

IsDisabled returns true if the user is disabled.

func (*User) IsInternal

func (u *User) IsInternal() bool

IsInternal returns true if this is an internal user.

func (*User) IsPlatformAdmin

func (u *User) IsPlatformAdmin() bool

IsPlatformAdmin returns true if this user has platform admin privileges.

func (*User) IsSSO

func (u *User) IsSSO() bool

IsSSO returns true if this is an SSO user.

type UserAuthType

type UserAuthType string

UserAuthType defines how a user authenticates. +kubebuilder:validation:Enum=sso;internal

const (
	// UserAuthTypeSSO indicates the user authenticates via SSO/OIDC.
	UserAuthTypeSSO UserAuthType = "sso"

	// UserAuthTypeInternal indicates the user authenticates with email/password.
	UserAuthTypeInternal UserAuthType = "internal"
)

type UserList

type UserList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []User `json:"items"`
}

UserList contains a list of Users.

func (*UserList) DeepCopy

func (in *UserList) DeepCopy() *UserList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UserList.

func (*UserList) DeepCopyInto

func (in *UserList) DeepCopyInto(out *UserList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*UserList) DeepCopyObject

func (in *UserList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type UserPhase

type UserPhase string

UserPhase represents the current phase of a user. +kubebuilder:validation:Enum=Pending;Active;Disabled;Locked

const (
	// UserPhasePending indicates the user has been invited but hasn't set password.
	UserPhasePending UserPhase = "Pending"

	// UserPhaseActive indicates the user can log in.
	UserPhaseActive UserPhase = "Active"

	// UserPhaseDisabled indicates the user has been disabled by an admin.
	UserPhaseDisabled UserPhase = "Disabled"

	// UserPhaseLocked indicates the user is temporarily locked due to failed attempts.
	UserPhaseLocked UserPhase = "Locked"
)

type UserSpec

type UserSpec struct {
	// Email is the user's email address, used for Team membership matching.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Format=email
	Email string `json:"email"`

	// DisplayName is the user's display name shown in the UI.
	// +optional
	DisplayName string `json:"displayName,omitempty"`

	// Disabled prevents the user from logging in.
	// +optional
	// +kubebuilder:default=false
	Disabled bool `json:"disabled,omitempty"`

	// Avatar is an optional URL to the user's avatar image.
	// +optional
	Avatar string `json:"avatar,omitempty"`

	// AuthType indicates how this user authenticates.
	// SSO users are created automatically on first login.
	// Internal users are created by admins and use email/password.
	// +kubebuilder:default="internal"
	// +optional
	AuthType UserAuthType `json:"authType,omitempty"`

	// SSOProvider is the name of the SSO provider (e.g., "Google", "Okta").
	// Only set for SSO users.
	// +optional
	SSOProvider string `json:"ssoProvider,omitempty"`

	// SSOSubject is the unique subject identifier from the SSO provider.
	// This is the "sub" claim from the OIDC token.
	// Only set for SSO users.
	// +optional
	SSOSubject string `json:"ssoSubject,omitempty"`

	// IsPlatformAdmin grants full platform access, bypassing team-based RBAC.
	// Platform admins can:
	// - Manage all teams, users, clusters, and providers
	// - Access all resources regardless of team membership
	// - Configure platform-wide settings
	// Use sparingly - most users should use team-based access control.
	// +optional
	// +kubebuilder:default=false
	IsPlatformAdmin bool `json:"isPlatformAdmin,omitempty"`
}

UserSpec defines the desired state of a Butler user. Note: Passwords are NEVER stored in spec - users set their own via invite flow.

func (*UserSpec) DeepCopy

func (in *UserSpec) DeepCopy() *UserSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UserSpec.

func (*UserSpec) DeepCopyInto

func (in *UserSpec) DeepCopyInto(out *UserSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type UserStatus

type UserStatus struct {
	// Phase represents the current state of the user.
	// +kubebuilder:validation:Enum=Pending;Active;Disabled;Locked
	Phase UserPhase `json:"phase,omitempty"`

	// PasswordSecretRef references the Secret containing the bcrypt password hash.
	// This is automatically created when the user sets their password.
	// Only used for internal users.
	// +optional
	PasswordSecretRef *SecretReference `json:"passwordSecretRef,omitempty"`

	// InviteTokenHash is the SHA256 hash of the invite token.
	// The raw token is only shown once when the user is created.
	// Only used for internal users.
	// +optional
	InviteTokenHash string `json:"inviteTokenHash,omitempty"`

	// InviteExpiresAt is when the invite token expires.
	// Only used for internal users.
	// +optional
	InviteExpiresAt *metav1.Time `json:"inviteExpiresAt,omitempty"`

	// InviteSentAt is when the invite was generated.
	// Only used for internal users.
	// +optional
	InviteSentAt *metav1.Time `json:"inviteSentAt,omitempty"`

	// PasswordChangedAt is when the password was last set/changed.
	// Only used for internal users.
	// +optional
	PasswordChangedAt *metav1.Time `json:"passwordChangedAt,omitempty"`

	// LastLoginTime is when the user last successfully logged in.
	// +optional
	LastLoginTime *metav1.Time `json:"lastLoginTime,omitempty"`

	// LoginCount is the total number of successful logins.
	// +optional
	LoginCount int64 `json:"loginCount,omitempty"`

	// FailedLoginAttempts is the number of consecutive failed login attempts.
	// Resets to 0 on successful login.
	// Only used for internal users.
	// +optional
	FailedLoginAttempts int32 `json:"failedLoginAttempts,omitempty"`

	// LockedUntil is set when the account is temporarily locked due to failed attempts.
	// Only used for internal users.
	// +optional
	LockedUntil *metav1.Time `json:"lockedUntil,omitempty"`

	// Teams lists the teams this user belongs to (resolved from Team CRDs).
	// This is informational and updated periodically.
	// +optional
	Teams []UserTeamMembership `json:"teams,omitempty"`

	// Conditions represent the latest available observations.
	// +optional
	Conditions []metav1.Condition `json:"conditions,omitempty"`
}

UserStatus defines the observed state of User.

func (*UserStatus) DeepCopy

func (in *UserStatus) DeepCopy() *UserStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UserStatus.

func (*UserStatus) DeepCopyInto

func (in *UserStatus) DeepCopyInto(out *UserStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type UserTeamMembership

type UserTeamMembership struct {
	// Name is the team name.
	Name string `json:"name"`

	// Role is the user's role in the team.
	Role string `json:"role"`
}

UserTeamMembership represents a user's membership in a team.

func (*UserTeamMembership) DeepCopy

func (in *UserTeamMembership) DeepCopy() *UserTeamMembership

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UserTeamMembership.

func (*UserTeamMembership) DeepCopyInto

func (in *UserTeamMembership) DeepCopyInto(out *UserTeamMembership)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type VMIDRange

type VMIDRange struct {
	// Start is the first VM ID in the range.
	// +kubebuilder:validation:Minimum=100
	Start int32 `json:"start"`

	// End is the last VM ID in the range.
	// +kubebuilder:validation:Minimum=100
	End int32 `json:"end"`
}

VMIDRange defines a range of VM IDs.

func (*VMIDRange) DeepCopy

func (in *VMIDRange) DeepCopy() *VMIDRange

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VMIDRange.

func (*VMIDRange) DeepCopyInto

func (in *VMIDRange) DeepCopyInto(out *VMIDRange)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type WorkerStatus

type WorkerStatus struct {
	// Desired is the desired number of workers.
	Desired int32 `json:"desired"`

	// Ready is the number of ready workers.
	Ready int32 `json:"ready"`

	// Nodes lists the worker nodes.
	// +optional
	Nodes []string `json:"nodes,omitempty"`
}

WorkerStatus shows worker node status.

func (*WorkerStatus) DeepCopy

func (in *WorkerStatus) DeepCopy() *WorkerStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkerStatus.

func (*WorkerStatus) DeepCopyInto

func (in *WorkerStatus) DeepCopyInto(out *WorkerStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type WorkersSpec

type WorkersSpec struct {
	// Replicas is the desired number of worker nodes.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Minimum=1
	Replicas int32 `json:"replicas"`

	// MachineTemplate defines the VM specification for workers.
	// +optional
	MachineTemplate MachineTemplateSpec `json:"machineTemplate,omitempty"`
}

WorkersSpec configures worker nodes.

func (*WorkersSpec) DeepCopy

func (in *WorkersSpec) DeepCopy() *WorkersSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkersSpec.

func (*WorkersSpec) DeepCopyInto

func (in *WorkersSpec) DeepCopyInto(out *WorkersSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL