v1

package
v0.12.0 Latest Latest
Warning

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

Go to latest
Published: Sep 9, 2026 License: Apache-2.0 Imports: 6 Imported by: 0

Documentation

Overview

Package v1 contains API types for the workspaces.exalsius.ai API group. +kubebuilder:object:generate=true +groupName=workspaces.exalsius.ai

Index

Constants

View Source
const (
	WorkspaceDeploymentKind      = "WorkspaceDeployment"
	WorkspaceDeploymentFinalizer = "workspaces.exalsius.ai/deployment"
)
View Source
const (
	ConditionReady            = "Ready"
	ConditionClassResolved    = "ClassResolved"
	ConditionPrerequisitesMet = "PrerequisitesMet"
	ConditionHelmReleaseReady = "HelmReleaseReady"
	// ConditionClusterDeploymentResolved reports whether the referenced
	// ClusterDeployment exists. Non-terminal: a missing CD keeps the
	// workspace Pending and requeues, so it self-heals if the cluster is
	// still provisioning or applied out of order.
	ConditionClusterDeploymentResolved = "ClusterDeploymentResolved"
	// ConditionRoutesReady reports whether all declared access endpoints
	// have programmed routes. Only set when the WorkspaceClass declares
	// access endpoints and a routing provider is configured.
	ConditionRoutesReady = "RoutesReady"
	// ConditionFeasible reports whether the cluster currently has enough
	// capacity to deploy the workspace. Set during pre-deploy phases; not
	// updated once the workspace is Running.
	ConditionFeasible = "Feasible"
	// ConditionResourcesInjected surfaces the result of resolving spec.resources
	// into Helm values. Status=True is the steady state; Status=False signals
	// that the operator overwrote user-supplied paths in spec.values to align
	// them with the structured spec.resources channel — i.e., a likely user
	// configuration error worth surfacing.
	ConditionResourcesInjected = "ResourcesInjected"
)

Condition types for WorkspaceDeployment.

View Source
const (
	ReasonClassNotFound             = "ClassNotFound"
	ReasonClassResolved             = "ClassResolved"
	ReasonClusterDeploymentResolved = "ClusterDeploymentResolved"
	ReasonClusterDeploymentNotFound = "ClusterDeploymentNotFound"
	ReasonPrerequisitesNotReady     = "PrerequisitesNotReady"
	ReasonPrerequisitesMet          = "PrerequisitesMet"
	ReasonInstallingPrerequisites   = "InstallingPrerequisites"
	ReasonHelmReleaseNotReady       = "HelmReleaseNotReady"
	ReasonHelmReleaseDeployed       = "HelmReleaseDeployed"
	ReasonHelmReleaseFailed         = "HelmReleaseFailed"
	ReasonDeploymentReady           = "DeploymentReady"
	ReasonDeletionInProgress        = "DeletionInProgress"
	ReasonInternalError             = "InternalError"
	ReasonSuspended                 = "Suspended"
	ReasonInvalidPrerequisite       = "InvalidPrerequisite"
	// ReasonPrerequisiteNamespaceConflict signals that a class explicitly
	// requested a prerequisite namespace that disagrees with where the shared
	// singleton already lives (installed by another class's ServiceSet or
	// provided by the colony). Terminal: an admin resolves it by aligning the
	// class with the incumbent namespace (ADR-0007).
	ReasonPrerequisiteNamespaceConflict = "PrerequisiteNamespaceConflict"
	ReasonResourcesAvailable            = "ResourcesAvailable"
	ReasonInsufficientResources         = "InsufficientResources"
	ReasonFeasibilityUnknown            = "FeasibilityUnknown"
	ReasonResourcesInjected             = "ResourcesInjected"
	ReasonUserPathsOverwritten          = "UserPathsOverwritten"
	ReasonInvalidWorkspaceClass         = "InvalidWorkspaceClass"
	ReasonRoutesReady                   = "RoutesReady"
	ReasonRoutingInProgress             = "RoutingInProgress"
	ReasonRoutingError                  = "RoutingError"
	// ReasonRoutingInfraNotReady signals that the tenant's routing
	// infrastructure (regional cluster, gateway, listeners) is missing or
	// unprogrammed — an admin-fixable condition (remediation: contact_admin).
	ReasonRoutingInfraNotReady = "RoutingInfraNotReady"
	// ReasonGpuOfferingUnavailable signals that the requested GPU model is not
	// present on the target ClusterDeployment at all (ADR-0002). Terminal: the
	// user fixes the request (or has the GPU provisioned) and recreates.
	ReasonGpuOfferingUnavailable = "GpuOfferingUnavailable"
	// ReasonWaitingForGpuCapacity signals that the requested GPU model exists
	// on the target cluster but none are free right now (ADR-0002). Transient:
	// the workspace is held in the Waiting phase and proceeds once capacity
	// frees.
	ReasonWaitingForGpuCapacity = "WaitingForGpuCapacity"
	// ReasonCleanupAbandoned signals that a deletion step depending on a
	// remote cluster kept failing past remoteCleanupGracePeriod and was given
	// up on so the WorkspaceDeployment could be deleted. Emitted as a Warning
	// event: it is the only record that resources may have been left behind.
	ReasonCleanupAbandoned = "CleanupAbandoned"
)

Condition reasons for WorkspaceDeployment.

Variables

View Source
var (
	// GroupVersion is group version used to register these objects.
	GroupVersion = schema.GroupVersion{Group: "workspaces.exalsius.ai", Version: "v1"}

	// 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 AccessEndpoint

type AccessEndpoint struct {
	// Name is a unique identifier for this endpoint within the class.
	// +kubebuilder:validation:MinLength=1
	// +kubebuilder:validation:MaxLength=63
	// +kubebuilder:validation:Pattern=`^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`
	Name string `json:"name"`
	// Protocol is the wire protocol for this endpoint.
	Protocol RouteProtocol `json:"protocol"`
	// Port is the Service port of the endpoint's Service — the routable
	// truth for the routing provider's mirror Service and route backends.
	// Usually identical to the container port; where they differ, the
	// Service port wins.
	// +kubebuilder:validation:Minimum=1
	// +kubebuilder:validation:Maximum=65535
	Port int32 `json:"port"`
	// ServiceName overrides the conventional `<release-name>-<endpoint-name>`
	// name of the endpoint's child-cluster Service. For charts whose Service
	// names don't derive from the release name (fullnameOverride, third-party
	// umbrella subcharts like jupyterhub's `proxy-public`). Unambiguous even
	// for fixed names because each workspace runs in its own namespace.
	// Same convention-plus-override pattern as resourceInjection.
	// +optional
	// +kubebuilder:validation:MaxLength=63
	// +kubebuilder:validation:Pattern=`^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`
	ServiceName string `json:"serviceName,omitempty"`
	// Description is a human-readable summary shown to users.
	// +optional
	Description string `json:"description,omitempty"`
}

AccessEndpoint declares a network endpoint that the workspace exposes.

func (*AccessEndpoint) DeepCopy

func (in *AccessEndpoint) DeepCopy() *AccessEndpoint

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

func (*AccessEndpoint) DeepCopyInto

func (in *AccessEndpoint) DeepCopyInto(out *AccessEndpoint)

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

type AccessEntry

type AccessEntry struct {
	// Name is the access endpoint name from the WorkspaceClass.
	Name string `json:"name"`
	// Protocol is the endpoint's wire protocol.
	Protocol RouteProtocol `json:"protocol"`
	// URL is where the endpoint is reachable, e.g.
	// https://thorsten-nb.dos-lab.ex.ls or ssh://dos-lab.ex.ls:2207.
	// Empty while the route is not yet resolvable.
	// +optional
	URL string `json:"url,omitempty"`
	// Ready reports whether the platform side of routing is programmed.
	// Application-level health remains the chart's readiness probes.
	Ready bool `json:"ready"`
	// Message explains why an entry is not ready (e.g. port pool exhausted).
	// +optional
	Message string `json:"message,omitempty"`
}

AccessEntry describes one externally reachable endpoint of a workspace, resolved by the routing provider. The exalsius API projects these entries into Workspace.access[] unchanged (ADR-0001).

func (*AccessEntry) DeepCopy

func (in *AccessEntry) DeepCopy() *AccessEntry

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

func (*AccessEntry) DeepCopyInto

func (in *AccessEntry) DeepCopyInto(out *AccessEntry)

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

type ClusterDeploymentRef

type ClusterDeploymentRef struct {
	// +kubebuilder:validation:MinLength=1
	// +kubebuilder:validation:MaxLength=253
	Name string `json:"name"`
	// +kubebuilder:validation:MinLength=1
	// +kubebuilder:validation:MaxLength=63
	Namespace string `json:"namespace"`
}

ClusterDeploymentRef references a k0rdent ClusterDeployment.

func (*ClusterDeploymentRef) DeepCopy

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

func (*ClusterDeploymentRef) DeepCopyInto

func (in *ClusterDeploymentRef) DeepCopyInto(out *ClusterDeploymentRef)

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

type ConfigFieldType

type ConfigFieldType string

ConfigFieldType identifies the input type for a user-facing config field. +kubebuilder:validation:Enum=string;int;bool;secret;publicKey

const (
	ConfigFieldTypeString    ConfigFieldType = "string"
	ConfigFieldTypeInt       ConfigFieldType = "int"
	ConfigFieldTypeBool      ConfigFieldType = "bool"
	ConfigFieldTypeSecret    ConfigFieldType = "secret"
	ConfigFieldTypePublicKey ConfigFieldType = "publicKey"
)

type EventSummary

type EventSummary struct {
	// LastSeen is when the event last occurred.
	// +optional
	LastSeen metav1.Time `json:"lastSeen,omitempty"`
	// Type is Normal or Warning.
	// +optional
	Type   string `json:"type,omitempty"`
	Reason string `json:"reason"`
	// +optional
	Message string `json:"message,omitempty"`
}

EventSummary is a compact view of a Kubernetes event.

func (*EventSummary) DeepCopy

func (in *EventSummary) DeepCopy() *EventSummary

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

func (*EventSummary) DeepCopyInto

func (in *EventSummary) DeepCopyInto(out *EventSummary)

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

type FailureContext

type FailureContext struct {
	// PhaseWhenFailed is the phase the workspace was in when it failed
	// (e.g. Deploying, InstallingPrerequisites).
	// +optional
	PhaseWhenFailed WorkspaceDeploymentPhase `json:"phaseWhenFailed,omitempty"`
	// Reason is the machine-readable failure reason, mirroring the failing
	// condition's reason (e.g. HelmReleaseFailed, PrerequisitesNotReady,
	// RoutingInfraNotReady).
	// +optional
	Reason string `json:"reason,omitempty"`
	// ServiceSetStatus snapshots the workspace ServiceSet's reported
	// service states at failure time.
	// +optional
	ServiceSetStatus *ServiceSetStatusSummary `json:"serviceSetStatus,omitempty"`
	// RecentEvents lists the most recent Kubernetes events recorded for
	// this WorkspaceDeployment, newest first.
	// +optional
	RecentEvents []EventSummary `json:"recentEvents,omitempty"`
}

FailureContext bundles operator-side context captured when the workspace transitioned to Failed. The exalsius API projects it into the error envelope's `details` so agents can pattern-match common failures without querying operator internals. Pod status from the child cluster is a planned (v1.1) addition; the shape accommodates new fields non-breaking.

func (*FailureContext) DeepCopy

func (in *FailureContext) DeepCopy() *FailureContext

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

func (*FailureContext) DeepCopyInto

func (in *FailureContext) DeepCopyInto(out *FailureContext)

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

type FeasibilityStatus

type FeasibilityStatus struct {
	// Fits is true when the demanded resources can be satisfied.
	Fits bool `json:"fits"`
	// EvaluatedAt is when this feasibility verdict was computed.
	EvaluatedAt metav1.Time `json:"evaluatedAt"`
	// Demanded is the total resource demand that was checked
	// (Replicas × PerReplica from the merged class+deployment spec).
	Demanded ResourceTotals `json:"demanded"`
	// Available is the cluster-wide free capacity at evaluation time.
	Available ResourceTotals `json:"available"`
	// Missing describes what's lacking when Fits=false. Nil when Fits=true.
	// +optional
	Missing *ResourceTotals `json:"missing,omitempty"`
	// Message is a human-readable summary.
	// +optional
	Message string `json:"message,omitempty"`
}

FeasibilityStatus reports whether the cluster has enough free capacity to satisfy this workspace's resource demand. Computed by the operator during pre-deploy phases against live cluster state. Not updated once the workspace is Running.

func (*FeasibilityStatus) DeepCopy

func (in *FeasibilityStatus) DeepCopy() *FeasibilityStatus

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

func (*FeasibilityStatus) DeepCopyInto

func (in *FeasibilityStatus) DeepCopyInto(out *FeasibilityStatus)

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

type GPUVendor

type GPUVendor string

GPUVendor enumerates supported GPU vendors. +kubebuilder:validation:Enum=NVIDIA;AMD

const (
	GPUVendorNVIDIA GPUVendor = "NVIDIA"
	GPUVendorAMD    GPUVendor = "AMD"
)

type InjectionPath

type InjectionPath string

InjectionPath is a JSONPath-lite path into the chart's Helm values tree. Dot-separated, with quoted bracket segments for keys containing dots or other special characters (e.g. 'jupyterhub.singleuser.extraResource.limits["nvidia.com/gpu"]'). +kubebuilder:validation:MinLength=1 +kubebuilder:validation:MaxLength=1024

type PrerequisitePhase

type PrerequisitePhase string

PrerequisitePhase reports the install state of a single prerequisite. +kubebuilder:validation:Enum=Pending;Installing;Satisfied;Failed

const (
	PrerequisitePhasePending    PrerequisitePhase = "Pending"
	PrerequisitePhaseInstalling PrerequisitePhase = "Installing"
	PrerequisitePhaseSatisfied  PrerequisitePhase = "Satisfied"
	PrerequisitePhaseFailed     PrerequisitePhase = "Failed"
)

type PrerequisiteSource

type PrerequisiteSource string

PrerequisiteSource identifies who is providing a prerequisite. +kubebuilder:validation:Enum=workspace;colony

const (
	// PrerequisiteSourceWorkspace means the workspace controller installed
	// the prerequisite via a wsprereq-* ServiceSet.
	PrerequisiteSourceWorkspace PrerequisiteSource = "workspace"
	// PrerequisiteSourceColony means the prerequisite is satisfied by a
	// service entry on the ClusterDeployment (managed by the colony controller).
	PrerequisiteSourceColony PrerequisiteSource = "colony"
)

type PrerequisiteSpec

type PrerequisiteSpec struct {
	// ServiceTemplate references the prerequisite ServiceTemplate.
	ServiceTemplate ServiceTemplateRef `json:"serviceTemplate"`
	// Namespace is the target namespace on the child cluster for this shared
	// prerequisite install. A prerequisite is a per-cluster singleton, so this
	// namespace is a cluster-global property even though it is authored per
	// class. When unset, the install lands in "default" and the class accepts
	// whatever namespace another provider (a colony service or another class's
	// install) already placed the prerequisite in; when set explicitly, the
	// namespace must match wherever the singleton actually lives or the
	// WorkspaceDeployment fails with a namespace conflict (ADR-0007).
	// +optional
	// +kubebuilder:validation:Pattern=`^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`
	// +kubebuilder:validation:MaxLength=63
	Namespace string `json:"namespace,omitempty"`
	// Values are optional Helm value overrides applied when installing this
	// prerequisite. When nil, chart defaults are used.
	// +optional
	Values *apiextensionsv1.JSON `json:"values,omitempty"`
}

PrerequisiteSpec declares a ServiceTemplate dependency with optional Helm value overrides applied when the operator auto-installs the prerequisite onto the target cluster.

func (*PrerequisiteSpec) DeepCopy

func (in *PrerequisiteSpec) DeepCopy() *PrerequisiteSpec

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

func (*PrerequisiteSpec) DeepCopyInto

func (in *PrerequisiteSpec) DeepCopyInto(out *PrerequisiteSpec)

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

type PrerequisiteStatus

type PrerequisiteStatus struct {
	// Name is the ServiceTemplate name from WorkspaceClass.spec.prerequisites.
	Name string `json:"name"`
	// Phase is the current state of this prerequisite.
	Phase PrerequisitePhase `json:"phase"`
	// Source identifies who is providing the prerequisite.
	// +optional
	Source PrerequisiteSource `json:"source,omitempty"`
	// Namespace is where the shared prerequisite install actually resides on
	// the child cluster: the incumbent's namespace when one exists, otherwise
	// the namespace this class would install into.
	// +optional
	Namespace string `json:"namespace,omitempty"`
	// Message is a human-readable detail (e.g., the underlying failure reason).
	// +optional
	Message string `json:"message,omitempty"`
}

PrerequisiteStatus reports the per-prerequisite install state.

func (*PrerequisiteStatus) DeepCopy

func (in *PrerequisiteStatus) DeepCopy() *PrerequisiteStatus

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

func (*PrerequisiteStatus) DeepCopyInto

func (in *PrerequisiteStatus) DeepCopyInto(out *PrerequisiteStatus)

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

type ResourceInjectionMap

type ResourceInjectionMap struct {
	// Replicas lists Helm value paths receiving the resolved replica count (int).
	// +optional
	// +listType=set
	Replicas []InjectionPath `json:"replicas,omitempty"`
	// CPU lists Helm value paths receiving the resolved per-replica CPU (string).
	// +optional
	// +listType=set
	CPU []InjectionPath `json:"cpu,omitempty"`
	// Memory lists Helm value paths receiving the resolved per-replica memory (string).
	// +optional
	// +listType=set
	Memory []InjectionPath `json:"memory,omitempty"`
	// Storage lists Helm value paths receiving the resolved per-replica storage (string).
	// +optional
	// +listType=set
	Storage []InjectionPath `json:"storage,omitempty"`
	// GPUCount lists Helm value paths receiving the resolved per-replica GPU count (int).
	// +optional
	// +listType=set
	GPUCount []InjectionPath `json:"gpuCount,omitempty"`
	// GPUVendor lists Helm value paths receiving the resolved GPU vendor (string).
	// +optional
	// +listType=set
	GPUVendor []InjectionPath `json:"gpuVendor,omitempty"`
	// GPUType lists Helm value paths receiving the resolved GPU type (string).
	// +optional
	// +listType=set
	GPUType []InjectionPath `json:"gpuType,omitempty"`
}

ResourceInjectionMap declares additional Helm value paths in spec.values that should receive the resolved per-replica resource fields at deploy time. Each list contains JSONPath-lite paths that get the corresponding value. All fields are optional; nil-resolved fields are skipped silently.

func (*ResourceInjectionMap) DeepCopy

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

func (*ResourceInjectionMap) DeepCopyInto

func (in *ResourceInjectionMap) DeepCopyInto(out *ResourceInjectionMap)

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

type ResourceRequirements

type ResourceRequirements struct {
	// CPU is the number of CPU cores requested (e.g. "4", "500m").
	// +optional
	CPU *resource.Quantity `json:"cpu,omitempty"`
	// Memory is the amount of memory requested (e.g. "16Gi").
	// +optional
	Memory *resource.Quantity `json:"memory,omitempty"`
	// Storage is the amount of persistent storage requested (e.g. "100Gi").
	// +optional
	Storage *resource.Quantity `json:"storage,omitempty"`
	// GPUCount is the number of GPUs requested per replica.
	// +optional
	// +kubebuilder:validation:Minimum=0
	GPUCount *int32 `json:"gpuCount,omitempty"`
	// GPUVendor constrains the GPU vendor (NVIDIA or AMD). Set on a
	// WorkspaceClass to express chart-level vendor compatibility (e.g. CUDA
	// vs ROCm); inheritable into a WorkspaceDeployment that doesn't override it.
	// +optional
	GPUVendor *GPUVendor `json:"gpuVendor,omitempty"`
	// GPUType is a deployment-time preference for a specific GPU model
	// (e.g. "H100", "A100", "L40"). When unset on a WorkspaceDeployment,
	// feasibility matches GPUs of any model. Cannot be set on a
	// WorkspaceClass — type is a per-deployment cluster-dependent choice.
	// +optional
	GPUType *string `json:"gpuType,omitempty"`
	// GPUNodeSelector is a raw, exact-match node-label selector for targeting a
	// GPU directly (e.g. a GFD/AMD label like {"nvidia.com/gpu.product":
	// "NVIDIA-H100-80GB-HBM3"}). It is the power-user/exact escape hatch
	// alongside gpuType: both compile to one GPU Selector that the operator
	// gate validates and the chart applies, so a request that passes the gate
	// is always placeable (ADR-0002). Usable even on clusters that lack the
	// canonical exalsius.ai/gpu-model label. Like gpuType, it is a
	// per-deployment cluster-dependent choice and cannot be set on a class.
	// +optional
	GPUNodeSelector map[string]string `json:"gpuNodeSelector,omitempty"`
}

ResourceRequirements specifies compute resource requirements for a single replica.

func (*ResourceRequirements) DeepCopy

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

func (*ResourceRequirements) DeepCopyInto

func (in *ResourceRequirements) DeepCopyInto(out *ResourceRequirements)

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

type ResourceTotals

type ResourceTotals struct {
	// CPU in cores (decimal-encoded resource.Quantity).
	// +optional
	CPU *resource.Quantity `json:"cpu,omitempty"`
	// Memory in bytes.
	// +optional
	Memory *resource.Quantity `json:"memory,omitempty"`
	// Storage in bytes.
	// +optional
	Storage *resource.Quantity `json:"storage,omitempty"`
	// GPUCount is the total number of GPUs.
	// +optional
	GPUCount *int32 `json:"gpuCount,omitempty"`
	// GPUVendor identifies the vendor that was matched (when feasibility
	// considered vendor as a constraint). Empty when wildcard.
	// +optional
	GPUVendor *GPUVendor `json:"gpuVendor,omitempty"`
	// GPUType identifies the GPU model that was matched. Empty when wildcard.
	// +optional
	GPUType *string `json:"gpuType,omitempty"`
}

ResourceTotals summarises a cluster-total resource view used for feasibility reporting.

func (*ResourceTotals) DeepCopy

func (in *ResourceTotals) DeepCopy() *ResourceTotals

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

func (*ResourceTotals) DeepCopyInto

func (in *ResourceTotals) DeepCopyInto(out *ResourceTotals)

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

type RouteProtocol

type RouteProtocol string

RouteProtocol is the wire protocol for an access endpoint. +kubebuilder:validation:Enum=HTTP;TCP;SSH

const (
	RouteProtocolHTTP RouteProtocol = "HTTP"
	RouteProtocolTCP  RouteProtocol = "TCP"
	RouteProtocolSSH  RouteProtocol = "SSH"
)

type ServiceSetStatusSummary

type ServiceSetStatusSummary struct {
	// Name of the ServiceSet.
	Name string `json:"name"`
	// Deployed mirrors ServiceSet.status.deployed.
	// +optional
	Deployed bool `json:"deployed,omitempty"`
	// Services lists the per-service states.
	// +optional
	Services []ServiceStateSummary `json:"services,omitempty"`
}

ServiceSetStatusSummary is a compact snapshot of a k0rdent ServiceSet status for failure forensics.

func (*ServiceSetStatusSummary) DeepCopy

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

func (*ServiceSetStatusSummary) DeepCopyInto

func (in *ServiceSetStatusSummary) DeepCopyInto(out *ServiceSetStatusSummary)

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

type ServiceStateSummary

type ServiceStateSummary struct {
	Name string `json:"name"`
	// State is the k0rdent service state (e.g. Deployed, Failed).
	// +optional
	State string `json:"state,omitempty"`
	// FailureMessage carries the underlying failure detail (e.g. the Helm
	// error).
	// +optional
	FailureMessage string `json:"failureMessage,omitempty"`
}

ServiceStateSummary is one service entry's state inside a ServiceSet.

func (*ServiceStateSummary) DeepCopy

func (in *ServiceStateSummary) DeepCopy() *ServiceStateSummary

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

func (*ServiceStateSummary) DeepCopyInto

func (in *ServiceStateSummary) DeepCopyInto(out *ServiceStateSummary)

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

type ServiceTemplateRef

type ServiceTemplateRef struct {
	// Name is the name of the ServiceTemplate CR.
	// +kubebuilder:validation:MinLength=1
	// +kubebuilder:validation:MaxLength=253
	Name string `json:"name"`
	// Namespace of the ServiceTemplate. When unspecified, the system namespace is implied.
	// +optional
	Namespace string `json:"namespace,omitempty"`
	// VersionConstraint is an optional SemVer constraint (e.g. ">=1.2.0").
	// +optional
	VersionConstraint string `json:"versionConstraint,omitempty"`
}

ServiceTemplateRef references a k0rdent ServiceTemplate CR.

func (*ServiceTemplateRef) DeepCopy

func (in *ServiceTemplateRef) DeepCopy() *ServiceTemplateRef

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

func (*ServiceTemplateRef) DeepCopyInto

func (in *ServiceTemplateRef) DeepCopyInto(out *ServiceTemplateRef)

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

type UserFacingConfigField

type UserFacingConfigField struct {
	// HelmValuePath is a dot-delimited path into values.yaml (e.g. "jupyter.password").
	// +kubebuilder:validation:MinLength=1
	HelmValuePath string `json:"helmValuePath"`
	// DisplayName is the label shown to the user in the CLI prompt.
	// +kubebuilder:validation:MinLength=1
	DisplayName string `json:"displayName"`
	// Description provides additional context shown as help text.
	// +optional
	Description string `json:"description,omitempty"`
	// Type is the input type for validation and display.
	// +kubebuilder:default=string
	Type ConfigFieldType `json:"type,omitempty"`
	// Required indicates the user must provide a value.
	// +optional
	Required bool `json:"required,omitempty"`
	// Default is the default value shown in the prompt.
	// +optional
	Default *apiextensionsv1.JSON `json:"default,omitempty"`
	// Options constrains the input to a closed set of allowed values.
	// +optional
	Options []string `json:"options,omitempty"`
}

UserFacingConfigField annotates a single Helm value path that the CLI should prompt users for during workspace creation.

func (*UserFacingConfigField) DeepCopy

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

func (*UserFacingConfigField) DeepCopyInto

func (in *UserFacingConfigField) DeepCopyInto(out *UserFacingConfigField)

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

type WorkspaceClass

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

	Spec   WorkspaceClassSpec   `json:"spec"`
	Status WorkspaceClassStatus `json:"status,omitempty"`
}

WorkspaceClass is a cluster-scoped catalog entry that defines a workspace type. Users reference it by name when creating a WorkspaceDeployment.

func (*WorkspaceClass) DeepCopy

func (in *WorkspaceClass) DeepCopy() *WorkspaceClass

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

func (*WorkspaceClass) DeepCopyInto

func (in *WorkspaceClass) DeepCopyInto(out *WorkspaceClass)

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

func (*WorkspaceClass) DeepCopyObject

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

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

type WorkspaceClassList

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

WorkspaceClassList contains a list of WorkspaceClass.

func (*WorkspaceClassList) DeepCopy

func (in *WorkspaceClassList) DeepCopy() *WorkspaceClassList

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

func (*WorkspaceClassList) DeepCopyInto

func (in *WorkspaceClassList) DeepCopyInto(out *WorkspaceClassList)

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

func (*WorkspaceClassList) DeepCopyObject

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

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

type WorkspaceClassSpec

type WorkspaceClassSpec struct {
	// DisplayName is the human-readable name shown in the workspace catalog.
	// +kubebuilder:validation:MinLength=1
	DisplayName string `json:"displayName"`
	// Description provides a user-facing summary of what this workspace type offers.
	// +optional
	Description string `json:"description,omitempty"`

	// ServiceTemplate references the k0rdent ServiceTemplate CR that wraps the
	// Helm chart for this workspace type.
	ServiceTemplate ServiceTemplateRef `json:"serviceTemplate"`

	// DefaultResources are applied when a WorkspaceDeployment does not override them.
	DefaultResources WorkspaceResourceSpec `json:"defaultResources"`

	// Prerequisites lists additional ServiceTemplates that must be healthy on the
	// target cluster before the workspace can be deployed.
	// +optional
	Prerequisites []PrerequisiteSpec `json:"prerequisites,omitempty"`

	// AccessEndpoints declares the network endpoints this workspace type exposes.
	// +optional
	// +listType=map
	// +listMapKey=name
	AccessEndpoints []AccessEndpoint `json:"accessEndpoints,omitempty"`

	// UserFacingConfig lists Helm value paths that the CLI should prompt for.
	// +optional
	// +listType=map
	// +listMapKey=helmValuePath
	UserFacingConfig []UserFacingConfigField `json:"userFacingConfig,omitempty"`

	// DeployTimeout is the maximum time to wait for the workspace Helm release
	// to become ready. Useful for workspaces with large images that take long to pull.
	// Defaults to 15 minutes if not set.
	// +optional
	DeployTimeout *metav1.Duration `json:"deployTimeout,omitempty"`

	// PrerequisiteDeployTimeout overrides DeployTimeout for prerequisite Helm
	// releases. Useful when prerequisite operators take noticeably longer or
	// shorter to install than the workspace itself. Defaults to DeployTimeout
	// when nil.
	// +optional
	PrerequisiteDeployTimeout *metav1.Duration `json:"prerequisiteDeployTimeout,omitempty"`

	// DefaultValues provides base Helm values that are always applied.
	// +optional
	DefaultValues *apiextensionsv1.JSON `json:"defaultValues,omitempty"`

	// ResourceInjection optionally maps resolved per-replica resource fields
	// to additional Helm value paths in spec.values. The standard
	// `_exalsius.resources` path is always populated automatically — this
	// field adds chart-specific paths, typically subchart paths in
	// umbrella charts. Paths use JSONPath-lite syntax: dot-separated, with
	// quoted bracket segments for keys containing dots or other special
	// characters (e.g. 'jupyterhub.singleuser.extraResource.limits["nvidia.com/gpu"]').
	// User-supplied spec.values at the same paths are overwritten by the
	// operator (a ResourcesInjected condition surfaces the override).
	// +optional
	ResourceInjection *ResourceInjectionMap `json:"resourceInjection,omitempty"`
}

WorkspaceClassSpec defines the catalog entry for a workspace type.

+kubebuilder:validation:XValidation:rule="!has(self.defaultResources.perReplica.gpuType)",message="gpuType cannot be set on a WorkspaceClass — it is a per-deployment cluster-dependent choice" +kubebuilder:validation:XValidation:rule="!has(self.defaultResources.perReplica.gpuNodeSelector)",message="gpuNodeSelector cannot be set on a WorkspaceClass — it is a per-deployment cluster-dependent choice"

func (*WorkspaceClassSpec) DeepCopy

func (in *WorkspaceClassSpec) DeepCopy() *WorkspaceClassSpec

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

func (*WorkspaceClassSpec) DeepCopyInto

func (in *WorkspaceClassSpec) DeepCopyInto(out *WorkspaceClassSpec)

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

type WorkspaceClassStatus

type WorkspaceClassStatus struct {
	// Conditions represent the latest observations.
	// +patchMergeKey=type
	// +patchStrategy=merge
	// +listType=map
	// +listMapKey=type
	Conditions []metav1.Condition `json:"conditions,omitempty"`
	// ObservedGeneration is the .metadata.generation that was last reconciled.
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`
	// Valid indicates whether the referenced ServiceTemplate is available and
	// itself reports valid=true.
	Valid bool `json:"valid"`
	// ValidationError describes why the WorkspaceClass is not valid.
	// Empty when Valid is true.
	ValidationError string `json:"validationError,omitempty"`
}

WorkspaceClassStatus reports the observed state of a WorkspaceClass.

func (*WorkspaceClassStatus) DeepCopy

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

func (*WorkspaceClassStatus) DeepCopyInto

func (in *WorkspaceClassStatus) DeepCopyInto(out *WorkspaceClassStatus)

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

type WorkspaceDeployment

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

	Spec   WorkspaceDeploymentSpec   `json:"spec"`
	Status WorkspaceDeploymentStatus `json:"status,omitempty"`
}

WorkspaceDeployment represents user intent to deploy a workspace instance onto a child cluster.

func (*WorkspaceDeployment) DeepCopy

func (in *WorkspaceDeployment) DeepCopy() *WorkspaceDeployment

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

func (*WorkspaceDeployment) DeepCopyInto

func (in *WorkspaceDeployment) DeepCopyInto(out *WorkspaceDeployment)

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

func (*WorkspaceDeployment) DeepCopyObject

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

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

type WorkspaceDeploymentList

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

WorkspaceDeploymentList contains a list of WorkspaceDeployment.

func (*WorkspaceDeploymentList) DeepCopy

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

func (*WorkspaceDeploymentList) DeepCopyInto

func (in *WorkspaceDeploymentList) DeepCopyInto(out *WorkspaceDeploymentList)

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

func (*WorkspaceDeploymentList) DeepCopyObject

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

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

type WorkspaceDeploymentPhase

type WorkspaceDeploymentPhase string

WorkspaceDeploymentPhase represents the lifecycle state of a deployment. +kubebuilder:validation:Enum=Pending;InstallingPrerequisites;Waiting;Deploying;Running;Failed;Deleting

const (
	WorkspaceDeploymentPhasePending                 WorkspaceDeploymentPhase = "Pending"
	WorkspaceDeploymentPhaseInstallingPrerequisites WorkspaceDeploymentPhase = "InstallingPrerequisites"
	// WorkspaceDeploymentPhaseWaiting means the requested GPU Offering exists
	// on the target cluster but none are free right now; the workspace is held
	// (no Helm release created) and retried until capacity frees (ADR-0002).
	// Transient and self-resolving — distinct from the terminal Failed.
	WorkspaceDeploymentPhaseWaiting   WorkspaceDeploymentPhase = "Waiting"
	WorkspaceDeploymentPhaseDeploying WorkspaceDeploymentPhase = "Deploying"
	WorkspaceDeploymentPhaseRunning   WorkspaceDeploymentPhase = "Running"
	WorkspaceDeploymentPhaseFailed    WorkspaceDeploymentPhase = "Failed"
	WorkspaceDeploymentPhaseDeleting  WorkspaceDeploymentPhase = "Deleting"
)

type WorkspaceDeploymentSpec

type WorkspaceDeploymentSpec struct {
	// WorkspaceClassRef is the name of the cluster-scoped WorkspaceClass.
	// +kubebuilder:validation:MinLength=1
	// +kubebuilder:validation:MaxLength=253
	WorkspaceClassRef string `json:"workspaceClassRef"`

	// ClusterDeploymentRef identifies the target child cluster.
	ClusterDeploymentRef ClusterDeploymentRef `json:"clusterDeploymentRef"`

	// Resources overrides the default resources from the WorkspaceClass.
	// +optional
	Resources *WorkspaceResourceSpec `json:"resources,omitempty"`

	// Values provides user-specified Helm values merged on top of class defaults.
	// +optional
	Values *apiextensionsv1.JSON `json:"values,omitempty"`

	// Suspend, when true, causes the operator to skip reconciliation.
	// +optional
	Suspend bool `json:"suspend,omitempty"`
}

WorkspaceDeploymentSpec defines user intent to deploy a workspace instance.

func (*WorkspaceDeploymentSpec) DeepCopy

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

func (*WorkspaceDeploymentSpec) DeepCopyInto

func (in *WorkspaceDeploymentSpec) DeepCopyInto(out *WorkspaceDeploymentSpec)

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

type WorkspaceDeploymentStatus

type WorkspaceDeploymentStatus struct {
	// Phase is a human-readable summary of the deployment lifecycle.
	// +optional
	Phase WorkspaceDeploymentPhase `json:"phase,omitempty"`

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

	// ObservedGeneration is the .metadata.generation that was last reconciled.
	ObservedGeneration int64 `json:"observedGeneration,omitempty"`

	// ServiceEntryName is the name of the service entry added to the ClusterDeployment.
	// +optional
	ServiceEntryName string `json:"serviceEntryName,omitempty"`

	// ResolvedResources captures the effective resources after merging.
	// +optional
	ResolvedResources *WorkspaceResourceSpec `json:"resolvedResources,omitempty"`

	// Prerequisites reports the per-prerequisite install state. Only populated
	// when the resolved WorkspaceClass declares prerequisites.
	// +optional
	// +listType=map
	// +listMapKey=name
	Prerequisites []PrerequisiteStatus `json:"prerequisites,omitempty"`

	// Feasibility reports whether the cluster has enough free capacity to
	// deploy this workspace. Refreshed on every reconcile while the
	// workspace is being deployed; not updated once the workspace is Running.
	// +optional
	Feasibility *FeasibilityStatus `json:"feasibility,omitempty"`

	// Access lists the externally reachable endpoints of this workspace,
	// resolved by the routing provider once the workspace is Running.
	// +optional
	// +listType=map
	// +listMapKey=name
	Access []AccessEntry `json:"access,omitempty"`

	// FailureContext bundles operator-side failure forensics, populated on
	// every transition into Failed and cleared when the workspace recovers.
	// +optional
	FailureContext *FailureContext `json:"failureContext,omitempty"`

	// Message is a human-readable error or status detail.
	// +optional
	Message string `json:"message,omitempty"`
}

WorkspaceDeploymentStatus defines the observed state of WorkspaceDeployment.

func (*WorkspaceDeploymentStatus) DeepCopy

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

func (*WorkspaceDeploymentStatus) DeepCopyInto

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

type WorkspaceResourceSpec

type WorkspaceResourceSpec struct {
	// Replicas is the number of pod-shaped instances the workspace deploys.
	// Defaults to 1.
	// +optional
	// +kubebuilder:validation:Minimum=1
	// +kubebuilder:default=1
	Replicas *int32 `json:"replicas,omitempty"`
	// PerReplica specifies resources requested per replica.
	PerReplica ResourceRequirements `json:"perReplica"`
}

WorkspaceResourceSpec defines the compute resources for a workspace. A workspace deploys Replicas pod-shaped instances, each with PerReplica resources. Whether replicas are spread across Kubernetes nodes or co-located is decided by the chart's affinity rules and the K8s scheduler; this spec only describes total demand (Replicas × PerReplica).

func (*WorkspaceResourceSpec) DeepCopy

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

func (*WorkspaceResourceSpec) DeepCopyInto

func (in *WorkspaceResourceSpec) DeepCopyInto(out *WorkspaceResourceSpec)

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