v1alpha1

package
v0.2.0-rc.2 Latest Latest
Warning

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

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

Documentation

Overview

Package v1alpha1 contains API Schema definitions for the nvcre v1alpha1 API group. +kubebuilder:object:generate=true +groupName=nvcre.nvidia.com

Index

Constants

View Source
const (
	// BandwidthMeasurementMeasuring indicates that the measurement is in progress (the referenced Job is running).
	BandwidthMeasurementMeasuring = "Measuring"

	// BandwidthMeasurementComplete indicates that the measurement has completed (the referenced Job reached a terminal state).
	BandwidthMeasurementComplete = "Complete"
)

BandwidthMeasurement condition types.

View Source
const (
	// CertificationInProgress indicates the Certification is currently running.
	CertificationInProgress = "InProgress"

	// CertificationSucceeded indicates the Certification has completed successfully.
	CertificationSucceeded = "Succeeded"

	// CertificationFailed indicates the Certification has failed.
	CertificationFailed = "Failed"

	// CertificationValidationFailed indicates that one or more Workflows had
	// performance threshold violations. This condition is independent of the
	// execution state conditions and provides a quality signal.
	CertificationValidationFailed = "ValidationFailed"
)

Certification condition types. Only one of InProgress, Succeeded, or Failed can be True at any given time.

View Source
const (
	TestScaleIntraNode = "intra-node"
	TestScaleIntraRack = "intra-rack"
	TestScaleDiagnose  = "diagnose"
	TestScaleFullScale = "full-scale"
)

TestScale values for orchestration strategy.

View Source
const (
	// GoodputMeasurementMeasuring indicates that the measurement is in progress (the referenced Job is running).
	GoodputMeasurementMeasuring = "Measuring"

	// GoodputMeasurementComplete indicates that the measurement has completed (the referenced Job reached a terminal state).
	GoodputMeasurementComplete = "Complete"
)

GoodputMeasurement condition types.

View Source
const (
	// JobInProgress indicates the Job is currently running.
	// This is the initial state after the workload is created.
	JobInProgress string = "InProgress"

	// JobSucceeded indicates the Job has completed successfully.
	JobSucceeded string = "Succeeded"

	// JobFailed indicates the Job has failed.
	JobFailed string = "Failed"

	// JobHardwareFailed indicates a hardware failure was detected on one or more
	// nodes running the job's workload. This condition takes precedence over
	// InProgress and is not automatically cleared.
	JobHardwareFailed string = "HardwareFailed"

	// JobValidationFailed indicates that one or more performance thresholds
	// were not met after the workload completed successfully. This condition
	// is independent of the job execution state — the job may be Succeeded
	// (workload completed) while also having ValidationFailed=True (performance
	// below threshold). Status=False means thresholds were evaluated and passed.
	// Like HardwareFailed, it is set independently and
	// aggregated up by the Workflow and Certification controllers.
	JobValidationFailed string = "ValidationFailed"
)

Job condition types. Only one of these conditions can be True at any given time.

View Source
const (
	// WorkflowInProgress indicates the Workflow is currently running.
	WorkflowInProgress = "InProgress"

	// WorkflowSucceeded indicates the Workflow has completed successfully.
	WorkflowSucceeded = "Succeeded"

	// WorkflowFailed indicates the Workflow has failed.
	WorkflowFailed = "Failed"

	// WorkflowValidationFailed indicates that one or more Jobs had performance
	// threshold violations. This condition is independent of the execution state
	// conditions (InProgress/Succeeded/Failed) and provides a quality signal
	// that can be aggregated up to the Certification level.
	WorkflowValidationFailed = "ValidationFailed"
)

Workflow condition types. Only one of InProgress, Succeeded, or Failed can be True at any given time.

View Source
const (
	DiagnoseStageIntraScreening      = "intra-screening"
	DiagnoseStageIntraScreeningNoNVL = "intra-screening-no-nvl"
	DiagnoseStageInterScreening      = "inter-screening"
	DiagnoseStageBisection           = "bisection"
	DiagnoseStageConfirmation        = "confirmation"
	DiagnoseStageCrossBoundary       = "cross-boundary"
	DiagnoseStageComplete            = "complete"
)

Diagnose stage constants.

View Source
const (
	// WorkloadRunInProgress indicates the WorkloadRun is currently running.
	WorkloadRunInProgress = "InProgress"

	// WorkloadRunSucceeded indicates the WorkloadRun has completed successfully.
	WorkloadRunSucceeded = "Succeeded"

	// WorkloadRunFailed indicates the WorkloadRun has failed.
	WorkloadRunFailed = "Failed"

	// WorkloadRunValidationFailed indicates that one or more performance thresholds
	// were not met. This condition is independent of the execution state conditions.
	WorkloadRunValidationFailed = "ValidationFailed"
)

WorkloadRun condition types. Only one of InProgress, Succeeded, or Failed can be True at any given time.

Variables

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

	// SchemeBuilder is used to add go types to the GroupVersionKind scheme.
	SchemeBuilder = runtime.NewSchemeBuilder()

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

Functions

func Register

func Register(objects ...runtime.Object)

Register adds one or more types to the scheme for this group-version.

Types

type AppliedOverride

type AppliedOverride struct {
	// index is the zero-based position of the override in spec.overrides[].
	Index int `json:"index"`

	// when is a human-readable summary of the conditions that matched.
	// Example: "gpuArchitecture=h100, platform=aws"
	When string `json:"when"`

	// patches describes what the override modifies.
	// Example: "jobTemplate, 2 dependencies"
	Patches string `json:"patches"`

	// noOp is true when the override matched but produced no changes.
	// This usually indicates a misconfigured override with wrong field paths.
	// +optional
	NoOp bool `json:"noOp,omitempty"`
}

AppliedOverride records that a specific override was applied during reconciliation.

func (*AppliedOverride) DeepCopy

func (in *AppliedOverride) DeepCopy() *AppliedOverride

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

func (*AppliedOverride) DeepCopyInto

func (in *AppliedOverride) DeepCopyInto(out *AppliedOverride)

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

type BandwidthMeasurement

type BandwidthMeasurement struct {
	metav1.TypeMeta `json:",inline"`

	// metadata is a standard object metadata
	// +optional
	metav1.ObjectMeta `json:"metadata,omitzero"`

	// spec defines the desired state of BandwidthMeasurement
	// +required
	Spec BandwidthMeasurementSpec `json:"spec"`

	// status defines the observed state of BandwidthMeasurement
	// +optional
	Status BandwidthMeasurementStatus `json:"status,omitzero"`
}

BandwidthMeasurement is the Schema for the bandwidthmeasurements API

func (*BandwidthMeasurement) DeepCopy

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

func (*BandwidthMeasurement) DeepCopyInto

func (in *BandwidthMeasurement) DeepCopyInto(out *BandwidthMeasurement)

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

func (*BandwidthMeasurement) DeepCopyObject

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

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

type BandwidthMeasurementConfig

type BandwidthMeasurementConfig struct {
	// logProfileRef is the name of the cluster-scoped LogProfile to use for log parsing.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	LogProfileRef string `json:"logProfileRef"`

	// sampleInterval is how often to sample pod logs while the Job is running.
	// Default: 60s.
	// +optional
	SampleInterval *metav1.Duration `json:"sampleInterval,omitempty"`

	// testType identifies the NCCL collective operation (e.g., "all_reduce", "alltoall").
	// Propagated to the BandwidthMeasurement spec for Prometheus metric labeling.
	// +optional
	TestType string `json:"testType,omitempty"`
}

BandwidthMeasurementConfig configures automatic creation of a BandwidthMeasurement child resource for the Job. When set, the controller creates a BandwidthMeasurement that tracks NCCL bandwidth metrics by parsing pod logs.

func (*BandwidthMeasurementConfig) DeepCopy

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

func (*BandwidthMeasurementConfig) DeepCopyInto

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

type BandwidthMeasurementList

type BandwidthMeasurementList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitzero"`
	Items           []BandwidthMeasurement `json:"items"`
}

BandwidthMeasurementList contains a list of BandwidthMeasurement

func (*BandwidthMeasurementList) DeepCopy

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

func (*BandwidthMeasurementList) DeepCopyInto

func (in *BandwidthMeasurementList) DeepCopyInto(out *BandwidthMeasurementList)

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

func (*BandwidthMeasurementList) DeepCopyObject

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

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

type BandwidthMeasurementSpec

type BandwidthMeasurementSpec struct {
	// jobRef is the reference to the NVCRE Job for which bandwidth should be measured.
	// +optional
	JobRef corev1.TypedLocalObjectReference `json:"jobRef,omitempty"`

	// logProfileRef is the name of the cluster-scoped LogProfile to use for log parsing.
	// The LogProfile defines a bandwidthResult regex pattern for extracting NCCL bandwidth data.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	LogProfileRef string `json:"logProfileRef"`

	// sampleInterval is how often to sample pod logs while the Job is running.
	// Default: 60s.
	// +optional
	SampleInterval *metav1.Duration `json:"sampleInterval,omitempty"`

	// testType identifies the NCCL collective operation being measured (e.g., "all_reduce", "alltoall").
	// Used as the "nccl_test" Prometheus label to distinguish results on dashboards.
	// +optional
	TestType string `json:"testType,omitempty"`
}

BandwidthMeasurementSpec defines the desired state of BandwidthMeasurement

func (*BandwidthMeasurementSpec) DeepCopy

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

func (*BandwidthMeasurementSpec) DeepCopyInto

func (in *BandwidthMeasurementSpec) DeepCopyInto(out *BandwidthMeasurementSpec)

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

type BandwidthMeasurementStatus

type BandwidthMeasurementStatus struct {
	// results contains per-message-size average bandwidth measurements.
	// Each entry represents the running average of all observed measurements for that size.
	// +optional
	Results []BandwidthResult `json:"results,omitempty"`

	// startTime is the time when the measurement started (when the referenced Job began running).
	// +optional
	StartTime *metav1.Time `json:"startTime,omitempty"`

	// completionTime is the time when the measurement completed (when the referenced Job reached a terminal state).
	// +optional
	CompletionTime *metav1.Time `json:"completionTime,omitempty"`

	// conditions represent the current state of the BandwidthMeasurement resource.
	//
	// Condition types:
	// - "Measuring": the measurement is in progress (referenced Job is running)
	// - "Complete": the measurement has finished (referenced Job succeeded or failed)
	//
	// The status of each condition is one of True, False, or Unknown.
	// +listType=map
	// +listMapKey=type
	// +optional
	Conditions []metav1.Condition `json:"conditions,omitempty"`
}

BandwidthMeasurementStatus defines the observed state of BandwidthMeasurement.

func (*BandwidthMeasurementStatus) DeepCopy

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

func (*BandwidthMeasurementStatus) DeepCopyInto

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

type BandwidthResult

type BandwidthResult struct {
	// sizeBytes is the message size in bytes.
	SizeBytes int64 `json:"sizeBytes"`

	// algBW is the average algorithmic bandwidth in GB/s.
	AlgBW string `json:"algBW"`

	// busBW is the average bus bandwidth in GB/s.
	BusBW string `json:"busBW"`

	// samples is the number of measurements averaged for this size.
	Samples int `json:"samples"`
}

BandwidthResult stores the average bandwidth for a single message size.

func (*BandwidthResult) DeepCopy

func (in *BandwidthResult) DeepCopy() *BandwidthResult

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

func (*BandwidthResult) DeepCopyInto

func (in *BandwidthResult) DeepCopyInto(out *BandwidthResult)

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

type CELNodeHealthCheck

type CELNodeHealthCheck struct {
	// expression is the CEL expression to evaluate against Node objects.
	// Must return a boolean value. When true, the node is considered unhealthy.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	// +kubebuilder:validation:MaxLength=2048
	Expression string `json:"expression"`
}

CELNodeHealthCheck defines CEL-based node health checking.

func (*CELNodeHealthCheck) DeepCopy

func (in *CELNodeHealthCheck) DeepCopy() *CELNodeHealthCheck

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

func (*CELNodeHealthCheck) DeepCopyInto

func (in *CELNodeHealthCheck) DeepCopyInto(out *CELNodeHealthCheck)

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

type CategoryOptions

type CategoryOptions struct {
	// nodesPerJob is the number of nodes per job for multi-node workloads.
	// When nil at both global and per-category level, the controller auto-selects:
	//   - Entries with per-node-count configs (training): largest config <= matching nodes.
	//   - All other entries: all matching nodes.
	// When set, clamped to min(nodesPerJob, matchingNodes).
	// +optional
	// +kubebuilder:validation:Minimum=1
	NodesPerJob *int32 `json:"nodesPerJob,omitempty"`

	// enableCheckpoint enables checkpointing for training workloads.
	// When true, provisions a PVC for checkpoint storage, adds checkpoint config
	// (pvcName/maxRestarts), and enables --save/--load in training scripts.
	// When false (default), uses emptyDir and disables save/load.
	// Non-training entries ignore this field.
	// +optional
	EnableCheckpoint *bool `json:"enableCheckpoint,omitempty"`

	// maxSteps sets the maximum training steps. Maps to trainer.max_steps in the
	// NeMo config. Default: 50.
	// +optional
	// +kubebuilder:validation:Minimum=-1
	MaxSteps *int32 `json:"maxSteps,omitempty"`

	// exitDurationMins sets the training duration in minutes. Maps to
	// EXIT_DURATION_MINS env var. Default: 30.
	// +optional
	// +kubebuilder:validation:Minimum=1
	ExitDurationMins *int32 `json:"exitDurationMins,omitempty"`

	// gpusPerNode optionally overrides the number of GPUs per node used by catalog
	// workloads. If not specified, the controller derives the default from the GPU
	// architecture in target.nodeSelector (e.g., 4 for GB200/GB300, 8 for H100).
	// Use this field when your hardware has a non-standard GPU count per node.
	// +optional
	// +kubebuilder:validation:Minimum=1
	GpusPerNode *int32 `json:"gpusPerNode,omitempty"`

	// mlnxPerNode overrides the auto-detected Mellanox NIC count per node.
	// Used by platforms with InfiniBand or RoCE networking (Azure, OCI, TogetherAI).
	// If not specified, derived from GPU architecture and platform via the
	// catalog's gpu-defaults.yaml (e.g., 8 for most architectures, 2 for OCI L40s).
	// +optional
	// +kubebuilder:validation:Minimum=0
	MlnxPerNode *int32 `json:"mlnxPerNode,omitempty"`

	// resources overrides the CPU and memory resources of training workload
	// containers. Training entries default to DGX-class sizing (limits:
	// cpu "128" / memory "800Gi"; requests: cpu "64" / memory "500Gi") — set
	// this on smaller nodes so training pods can schedule. Each of the four
	// values independently falls back to its default when unset. GPU count is
	// controlled by gpusPerNode. Non-training entries ignore this field.
	// Platform-specific catalog overrides (for example AWS with H100 GPUs)
	// may supersede these values.
	// +optional
	Resources *CategoryResources `json:"resources,omitempty"`

	// enableMNNVL enables Multi-Node NVLink (NCCL_MNNVL_ENABLE=1) for training
	// and communication workloads. Defaults to false (NCCL_MNNVL_ENABLE=0).
	// Enable this when running on platforms with multi-node NVLink connectivity
	// (e.g., GB300 NVL72). Can be overridden per-category via
	// categories[].options.enableMNNVL.
	// +optional
	EnableMNNVL *bool `json:"enableMNNVL,omitempty"`

	// imagePullSecrets is an optional list of references to secrets for pulling
	// container images used by catalog workloads. If not specified, the cluster's
	// default image pull configuration (e.g., ServiceAccount) is used.
	// +optional
	ImagePullSecrets []corev1.LocalObjectReference `json:"imagePullSecrets,omitempty"`

	// storageClassName is the StorageClass to use for PersistentVolumeClaim
	// dependencies created by catalog entries. If not specified, catalog entries
	// that require PVCs will use the cluster's default StorageClass.
	// +optional
	StorageClassName *string `json:"storageClassName,omitempty"`

	// saveInterval sets the checkpoint save frequency in training steps.
	// NeMo 6: maps to --save-interval; NeMo 4: maps to every_n_train_steps.
	// Only used when enableCheckpoint is true. Default: 250.
	// +optional
	// +kubebuilder:validation:Minimum=1
	SaveInterval *int32 `json:"saveInterval,omitempty"`

	// saveRetainInterval retains checkpoints at multiples of this value,
	// deleting intermediate checkpoints (NeMo 6 only, --save-retain-interval).
	// The most recent checkpoint is always kept regardless.
	// Only used when enableCheckpoint is true. Default: 1000.
	// +optional
	// +kubebuilder:validation:Minimum=1
	SaveRetainInterval *int32 `json:"saveRetainInterval,omitempty"`

	// saveTopK keeps only the top K checkpoints by monitored metric
	// (NeMo 4 only, save_top_k). Older checkpoints that aren't the best
	// are deleted to save storage.
	// Only used when enableCheckpoint is true. Default: 1.
	// +optional
	// +kubebuilder:validation:Minimum=1
	SaveTopK *int32 `json:"saveTopK,omitempty"`

	// storageSize sets the PVC size for checkpoint storage (e.g., "10Ti", "500Gi").
	// Must be a valid Kubernetes resource quantity. Only used when enableCheckpoint
	// is true. Default: "10Ti".
	// +optional
	// +kubebuilder:validation:Pattern=`^([0-9]+(\.[0-9]+)?)(Ki|Mi|Gi|Ti|Pi|Ei)?$`
	StorageSize string `json:"storageSize,omitempty"`

	// maxRestarts sets the maximum number of checkpoint-based restarts for
	// training workloads. Maps to checkpoint.maxRestarts in the Job spec.
	// Only used when enableCheckpoint is true. Default: catalog-defined.
	// +optional
	// +kubebuilder:validation:Minimum=0
	MaxRestarts *int32 `json:"maxRestarts,omitempty"`

	// repeatCount sets the number of orchestration iterations for the Workflow.
	// Each iteration runs all groups and collects results. Multiple iterations
	// allow repeated testing for intermittent failures. Default: 1.
	// +optional
	// +kubebuilder:validation:Minimum=1
	RepeatCount *int32 `json:"repeatCount,omitempty"`

	// testScale controls the orchestration strategy for NCCL communication tests.
	// Supported values:
	//   - "intra-node": each node tested independently (nodesPerJob=1)
	//   - "intra-rack": topology-partitioned per nvidia.com/gpu.clique
	//   - "diagnose": adaptive fault isolation (topology-aware hierarchical group testing)
	//   - "full-scale": all nodes in a single group (default)
	// Non-communication entries ignore this field.
	// +optional
	// +kubebuilder:validation:Enum=intra-node;intra-rack;diagnose;full-scale
	TestScale string `json:"testScale,omitempty"`

	// maxBytes sets the maximum message size for NCCL tests (e.g., "16G", "32G").
	// Maps to the NCCL perf test `-e` flag. Default: "16G" (GB200/GB300 override: "32G").
	// +optional
	// +kubebuilder:validation:Pattern='^[0-9]+(K|M|G|T)?$'
	MaxBytes string `json:"maxBytes,omitempty"`

	// numIterations sets the number of timed iterations per message size for NCCL tests.
	// Maps to the NCCL perf test `-n` flag. Default: 100.
	// +optional
	// +kubebuilder:validation:Minimum=1
	NumIterations *int32 `json:"numIterations,omitempty"`

	// numCycles sets the number of run cycles for NCCL tests. Each cycle runs
	// numIterations iterations and prints results separately.
	// Maps to the NCCL perf test `-N` flag. Default: 10.
	// +optional
	// +kubebuilder:validation:Minimum=1
	NumCycles *int32 `json:"numCycles,omitempty"`

	// thresholds defines performance thresholds as CEL expressions.
	// Keys are metric names (e.g., "busBandwidthGBps", "goodputRatio").
	// Values are CEL expressions using a `value` variable (float64).
	// Example: {"busBandwidthGBps": "value >= 900", "avgStepTimeSec": "value <= 3.0"}
	// +optional
	Thresholds map[string]string `json:"thresholds,omitempty"`

	// maxConcurrent limits the number of simultaneously running jobs within
	// a Workflow. Useful for diagnose-mode parallel screening to avoid
	// fabric saturation. 0 means unlimited. Default: 0.
	// +optional
	MaxConcurrent *int32 `json:"maxConcurrent,omitempty"`

	// minGroupSize sets the smallest group size at which diagnose's internal
	// bisection stops splitting. Groups at this size that fail become suspects.
	// Default: 2.
	// +optional
	// +kubebuilder:validation:Minimum=1
	MinGroupSize *int32 `json:"minGroupSize,omitempty"`

	// timeoutPerJob is the maximum time to wait for each job to complete.
	// Accepts Go duration strings (e.g., "1h", "30m", "2h30m").
	// When not set, defaults to "1h" (or "15m" for diagnose test scale).
	// +optional
	// +kubebuilder:validation:Pattern=`^([0-9]+(h|m|s|ms))+$`
	TimeoutPerJob string `json:"timeoutPerJob,omitempty"`

	// measurementTimeout is the maximum time to wait after a Job succeeds for
	// measurement data (bandwidth, goodput, etc.) before failing threshold validation.
	// Accepts Go duration strings (e.g., "5m", "10m", "30m").
	// When not set, defaults to "5m".
	// +optional
	// +kubebuilder:validation:Pattern=`^([0-9]+(h|m|s|ms))+$`
	MeasurementTimeout string `json:"measurementTimeout,omitempty"`
}

CategoryOptions holds configuration for catalog workloads. Used as global defaults in CertificationSpec (embedded inline) and as per-category overrides in CertificateCategory.Options. Per-category values take precedence over globals. Nil means "use global" (or auto-select for nodesPerJob).

func (*CategoryOptions) DeepCopy

func (in *CategoryOptions) DeepCopy() *CategoryOptions

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

func (*CategoryOptions) DeepCopyInto

func (in *CategoryOptions) DeepCopyInto(out *CategoryOptions)

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

type CategoryResourceList

type CategoryResourceList struct {
	// cpu is the CPU quantity (e.g., "6", "1500m").
	// +optional
	// +kubebuilder:validation:XIntOrString
	// +kubebuilder:validation:MaxLength=32
	// +kubebuilder:validation:XValidation:rule="quantity(string(self)).compareTo(quantity(\"0\")) >= 0",message="cpu must be a non-negative quantity"
	CPU *resource.Quantity `json:"cpu,omitempty"`

	// memory is the memory quantity (e.g., "48Gi").
	// +optional
	// +kubebuilder:validation:XIntOrString
	// +kubebuilder:validation:MaxLength=32
	// +kubebuilder:validation:XValidation:rule="quantity(string(self)).compareTo(quantity(\"0\")) >= 0",message="memory must be a non-negative quantity"
	Memory *resource.Quantity `json:"memory,omitempty"`
}

CategoryResourceList holds CPU and memory quantities for one side (limits or requests) of a training container's resources. The MaxLength bounds keep the CEL request/limit comparison on CategoryResources within the API server's validation cost budget; any realistic quantity is far shorter.

func (*CategoryResourceList) DeepCopy

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

func (*CategoryResourceList) DeepCopyInto

func (in *CategoryResourceList) DeepCopyInto(out *CategoryResourceList)

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

type CategoryResources

type CategoryResources struct {
	// limits overrides the container resource limits.
	// +optional
	Limits *CategoryResourceList `json:"limits,omitempty"`

	// requests overrides the container resource requests.
	// +optional
	Requests *CategoryResourceList `json:"requests,omitempty"`
}

CategoryResources overrides the CPU and memory resources applied to training workload containers. Each value that is unset keeps the catalog default for that value. GPU count is controlled by gpusPerNode, not here. When a request and its matching limit are both set, the request must not exceed the limit; the CRD rejects the inverted pair at admission. A request set without its matching limit is only checked against the resolved default at pod admission, so raise the limit alongside the request when overriding upward. +kubebuilder:validation:XValidation:rule="!has(self.requests) || !has(self.limits) || !has(self.requests.cpu) || !has(self.limits.cpu) || quantity(string(self.requests.cpu)).compareTo(quantity(string(self.limits.cpu))) <= 0",message="requests.cpu must not exceed limits.cpu" +kubebuilder:validation:XValidation:rule="!has(self.requests) || !has(self.limits) || !has(self.requests.memory) || !has(self.limits.memory) || quantity(string(self.requests.memory)).compareTo(quantity(string(self.limits.memory))) <= 0",message="requests.memory must not exceed limits.memory"

func (*CategoryResources) DeepCopy

func (in *CategoryResources) DeepCopy() *CategoryResources

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

func (*CategoryResources) DeepCopyInto

func (in *CategoryResources) DeepCopyInto(out *CategoryResources)

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

type CertificateCategory

type CertificateCategory struct {
	// Domain is the high level Domain that the certificate belongs to like training, inference etc
	// +kubebuilder:validation:Required
	Domain string `json:"domain"`

	// Variant is the lower level type such as nemotron, deepseek, nccl etc.
	// +kubebuilder:validation:Required
	Variant string `json:"variant"`

	// options provides per-category configuration overrides.
	// Fields set here take precedence over their CertificationSpec counterparts.
	// +optional
	Options *CategoryOptions `json:"options,omitempty"`
}

func (*CertificateCategory) DeepCopy

func (in *CertificateCategory) DeepCopy() *CertificateCategory

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

func (*CertificateCategory) DeepCopyInto

func (in *CertificateCategory) DeepCopyInto(out *CertificateCategory)

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

type Certification

type Certification struct {
	metav1.TypeMeta `json:",inline"`

	// metadata is a standard object metadata
	// +optional
	metav1.ObjectMeta `json:"metadata,omitzero"`

	// spec defines the desired state of Certification.
	// The entire spec is immutable after creation: the controller never updates
	// an active Workflow from an edited parent, so accepting edits would either
	// silently ignore them or apply them only to later categories. To run with
	// different inputs, delete the Certification and create a new one.
	// +required
	// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="spec is immutable after creation"
	Spec CertificationSpec `json:"spec"`

	// status defines the observed state of Certification
	// +optional
	Status CertificationStatus `json:"status,omitzero"`
}

Certification is the Schema for the certifications API

func (*Certification) DeepCopy

func (in *Certification) DeepCopy() *Certification

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

func (*Certification) DeepCopyInto

func (in *Certification) DeepCopyInto(out *Certification)

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

func (*Certification) DeepCopyObject

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

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

type CertificationCategoryStatus

type CertificationCategoryStatus struct {
	// domain is the category domain.
	Domain string `json:"domain"`

	// variant is the category variant.
	Variant string `json:"variant"`

	// workflowRef references the Workflow created for this category.
	// +optional
	WorkflowRef *WorkflowReference `json:"workflowRef,omitempty"`

	// status is the current status of this category.
	// Values: "Pending", "InProgress", "Succeeded", "Failed"
	Status string `json:"status"`

	// succeededNodesRef references the ConfigMap holding this category's
	// succeeded-nodes list (comma-separated node names). Copied from the Workflow.
	// +optional
	SucceededNodesRef *corev1.TypedLocalObjectReference `json:"succeededNodesRef,omitempty"`

	// failedNodesRef references the ConfigMap holding this category's failed-nodes
	// list (name, reason, message). Copied from the Workflow.
	// +optional
	FailedNodesRef *corev1.TypedLocalObjectReference `json:"failedNodesRef,omitempty"`
}

CertificationCategoryStatus tracks the status of a single certification category.

func (*CertificationCategoryStatus) DeepCopy

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

func (*CertificationCategoryStatus) DeepCopyInto

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

type CertificationList

type CertificationList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitzero"`
	Items           []Certification `json:"items"`
}

CertificationList contains a list of Certification

func (*CertificationList) DeepCopy

func (in *CertificationList) DeepCopy() *CertificationList

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

func (*CertificationList) DeepCopyInto

func (in *CertificationList) DeepCopyInto(out *CertificationList)

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

func (*CertificationList) DeepCopyObject

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

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

type CertificationSpec

type CertificationSpec struct {
	// target specifies which nodes to include in the orchestration.
	// +kubebuilder:validation:Required
	Target TargetSpec `json:"target"`

	// Categories are the list of certificate categories required for the Target.
	// The MaxItems bound keeps the CEL rules nested under each category (the
	// resources request/limit comparison) within the API server's validation
	// cost budget; the catalog defines far fewer entries than 64.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinItems=1
	// +kubebuilder:validation:MaxItems=64
	Categories []CertificateCategory `json:"categories,omitempty"`

	// Global defaults for all categories. Per-category options override these.
	CategoryOptions `json:",inline"`
}

CertificationSpec defines the desired state of Certification

func (*CertificationSpec) DeepCopy

func (in *CertificationSpec) DeepCopy() *CertificationSpec

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

func (*CertificationSpec) DeepCopyInto

func (in *CertificationSpec) DeepCopyInto(out *CertificationSpec)

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

type CertificationStatus

type CertificationStatus struct {
	// conditions represent the current state of the Certification resource.
	//
	// Condition types:
	// - "InProgress": the Certification is currently running
	// - "Succeeded": the Certification completed successfully
	// - "Failed": the Certification has failed
	//
	// The status of each condition is one of True, False, or Unknown.
	// +listType=map
	// +listMapKey=type
	// +optional
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// categoryStatuses tracks the status of each certification category.
	// +optional
	CategoryStatuses []CertificationCategoryStatus `json:"categoryStatuses,omitempty"`
}

CertificationStatus defines the observed state of Certification.

func (*CertificationStatus) DeepCopy

func (in *CertificationStatus) DeepCopy() *CertificationStatus

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

func (*CertificationStatus) DeepCopyInto

func (in *CertificationStatus) DeepCopyInto(out *CertificationStatus)

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

type CheckpointConfig

type CheckpointConfig struct {
	// pvcName is the name of the PersistentVolumeClaim used for checkpoint storage.
	// Must match a PVC in the Workflow's dependencies.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	PVCName string `json:"pvcName"`

	// maxRestarts is the maximum number of times the Job will restart on failure
	// when a checkpoint exists. Default: 0 (no restarts).
	// +optional
	MaxRestarts *int32 `json:"maxRestarts,omitempty"`
}

CheckpointConfig configures checkpoint-based restart for the workload. The user is responsible for defining the PVC volume and mounts in their workload spec. The controller uses this config to validate the PVC exists in Workflow dependencies and to determine restart behavior.

func (*CheckpointConfig) DeepCopy

func (in *CheckpointConfig) DeepCopy() *CheckpointConfig

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

func (*CheckpointConfig) DeepCopyInto

func (in *CheckpointConfig) DeepCopyInto(out *CheckpointConfig)

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

type CrossBoundaryProbe

type CrossBoundaryProbe struct {
	// domain is the topology domain being investigated.
	Domain string `json:"domain"`
	// halfA is the first half of the bisection that passed.
	HalfA []string `json:"halfA"`
	// halfB is the second half of the bisection that passed.
	HalfB []string `json:"halfB"`
	// probeRound is the current probe round within this investigation.
	ProbeRound int `json:"probeRound"`
}

CrossBoundaryProbe tracks one cross-boundary investigation between two halves of a bisection group that both passed individually.

func (*CrossBoundaryProbe) DeepCopy

func (in *CrossBoundaryProbe) DeepCopy() *CrossBoundaryProbe

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

func (*CrossBoundaryProbe) DeepCopyInto

func (in *CrossBoundaryProbe) DeepCopyInto(out *CrossBoundaryProbe)

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

type CrossBoundaryState

type CrossBoundaryState struct {
	// pendingProbes are boundary investigations still in progress.
	// +optional
	PendingProbes []CrossBoundaryProbe `json:"pendingProbes,omitempty"`
	// originStage records which diagnose stage triggered the cross-boundary
	// probing, used to determine MNNVL settings for probe jobs.
	OriginStage string `json:"originStage"`
}

CrossBoundaryState tracks in-progress cross-boundary probing for infrastructure faults (both-halves-pass pattern in bisection).

func (*CrossBoundaryState) DeepCopy

func (in *CrossBoundaryState) DeepCopy() *CrossBoundaryState

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

func (*CrossBoundaryState) DeepCopyInto

func (in *CrossBoundaryState) DeepCopyInto(out *CrossBoundaryState)

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

type DependencyResourceRef

type DependencyResourceRef struct {
	// apiVersion of the created resource.
	APIVersion string `json:"apiVersion"`

	// kind of the created resource.
	Kind string `json:"kind"`

	// name of the created resource.
	Name string `json:"name"`

	// namespace of the created resource. Empty for cluster-scoped resources.
	// +optional
	Namespace string `json:"namespace,omitempty"`

	// scope is the lifecycle scope of this dependency (workflow, job).
	// +optional
	Scope string `json:"scope,omitempty"`

	// groupName identifies the group this dependency was created for (scope=job).
	// +optional
	GroupName string `json:"groupName,omitempty"`

	// iteration identifies the iteration this dependency was created for (scope=job).
	// +optional
	Iteration int `json:"iteration,omitempty"`
}

DependencyResourceRef tracks a dependency resource created by a Workflow.

func (*DependencyResourceRef) DeepCopy

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

func (*DependencyResourceRef) DeepCopyInto

func (in *DependencyResourceRef) DeepCopyInto(out *DependencyResourceRef)

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

type DependencySpec

type DependencySpec struct {
	// Resource definition (inline, any Kubernetes resource)
	// +kubebuilder:pruning:PreserveUnknownFields
	// +kubebuilder:validation:EmbeddedResource
	runtime.RawExtension `json:",inline"`

	// when defines conditions for creating this dependency.
	// If not specified, the dependency is always created.
	// +optional
	When WhenSpec `json:"when,omitempty"`
}

DependencySpec defines a resource that must be created before the workload.

func (*DependencySpec) DeepCopy

func (in *DependencySpec) DeepCopy() *DependencySpec

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

func (*DependencySpec) DeepCopyInto

func (in *DependencySpec) DeepCopyInto(out *DependencySpec)

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

func (DependencySpec) MarshalJSON

func (d DependencySpec) MarshalJSON() ([]byte, error)

MarshalJSON implements custom JSON serialization for DependencySpec. The inline runtime.RawExtension normally swallows all sibling fields during marshaling. This method merges the embedded resource JSON with the when field so it survives the round-trip through the API server.

func (*DependencySpec) UnmarshalJSON

func (d *DependencySpec) UnmarshalJSON(data []byte) error

UnmarshalJSON implements custom JSON deserialization for DependencySpec. The inline runtime.RawExtension normally consumes the entire JSON input, leaving sibling fields unpopulated. This method extracts the when field separately, then stores only the resource fields in RawExtension.

type DiagnoseSpec

type DiagnoseSpec struct {
	// minGroupSize is the smallest group at which bisection stops.
	// Nodes in failed groups of this size become suspects for confirmation.
	// +kubebuilder:validation:Minimum=1
	// +kubebuilder:default=2
	// +optional
	MinGroupSize int `json:"minGroupSize,omitempty"`

	// topologyKey is the node label key for topology-aware screening.
	// When set, Stage 1 groups nodes by this label (e.g., one group per clique).
	// When empty, nodes are grouped into disjoint chunks of ceil(sqrt(N)).
	// Example: "nvidia.com/gpu.clique"
	// +optional
	TopologyKey string `json:"topologyKey,omitempty"`
}

DiagnoseSpec configures adaptive fault isolation using topology-aware hierarchical group testing. The algorithm runs three stages: intra-domain screening, inter-domain screening, bisection, and confirmation.

func (*DiagnoseSpec) DeepCopy

func (in *DiagnoseSpec) DeepCopy() *DiagnoseSpec

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

func (*DiagnoseSpec) DeepCopyInto

func (in *DiagnoseSpec) DeepCopyInto(out *DiagnoseSpec)

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

type DiagnoseStatus

type DiagnoseStatus struct {
	// stage is the current stage of the diagnose algorithm.
	// Values: "intra-screening", "inter-screening", "bisection", "confirmation"
	Stage string `json:"stage"`

	// round is the total number of completed rounds across all stages.
	Round int `json:"round"`

	// healthyNodes are nodes confirmed healthy at any stage (accumulated).
	// +listType=set
	// +optional
	HealthyNodes []string `json:"healthyNodes,omitempty"`

	// suspectNodes are nodes in minGroupSize groups that failed bisection,
	// pending confirmation in Stage 3.
	// +listType=set
	// +optional
	SuspectNodes []string `json:"suspectNodes,omitempty"`

	// noNVLSuspectNodes are suspect nodes that originated from the
	// intra-screening-no-nvl stage. Confirmation tests for these nodes
	// run with NCCL_MNNVL_ENABLE=0 to isolate fabric issues.
	// +listType=set
	// +optional
	NoNVLSuspectNodes []string `json:"noNVLSuspectNodes,omitempty"`

	// representativeNodes are one healthy node per topology domain, selected
	// after intra-domain screening for inter-domain fabric testing.
	// +optional
	RepresentativeNodes []string `json:"representativeNodes,omitempty"`

	// screeningResults preserves per-domain screening outcomes across stages.
	// Key is the domain name (e.g., clique UUID), value is the domain's screening result.
	// +optional
	ScreeningResults map[string]DomainScreeningResult `json:"screeningResults,omitempty"`

	// noNVLScreeningResults preserves per-domain screening outcomes from the
	// intra-screening-no-nvl stage (MNNVL disabled). Same structure as screeningResults.
	// +optional
	NoNVLScreeningResults map[string]DomainScreeningResult `json:"noNVLScreeningResults,omitempty"`

	// infrastructureFaults records detected infrastructure-level faults where
	// bisection both-halves-pass but the full group fails. Each entry identifies
	// the node groups whose interconnecting infrastructure is suspected faulty.
	// +optional
	InfrastructureFaults []InfrastructureFault `json:"infrastructureFaults,omitempty"`

	// crossBoundaryState tracks in-progress cross-boundary probing.
	// Nil when not in cross-boundary stage.
	// +optional
	CrossBoundaryState *CrossBoundaryState `json:"crossBoundaryState,omitempty"`
}

DiagnoseStatus tracks the adaptive fault isolation algorithm's progress.

func (*DiagnoseStatus) DeepCopy

func (in *DiagnoseStatus) DeepCopy() *DiagnoseStatus

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

func (*DiagnoseStatus) DeepCopyInto

func (in *DiagnoseStatus) DeepCopyInto(out *DiagnoseStatus)

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

type DomainResult

type DomainResult struct {
	// nodeCount is the number of nodes in this domain.
	NodeCount int `json:"nodeCount"`

	// status is the overall status for this domain.
	// Examples: "Passed", "Failed", "Running"
	Status string `json:"status"`

	// averageTFLOPs is the average TFLOPs across all nodes in the domain as a string.
	// Example: "1500.5"
	// +optional
	AverageTFLOPs string `json:"averageTflops,omitempty"`
}

DomainResult contains aggregated metrics for a topology domain.

func (*DomainResult) DeepCopy

func (in *DomainResult) DeepCopy() *DomainResult

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

func (*DomainResult) DeepCopyInto

func (in *DomainResult) DeepCopyInto(out *DomainResult)

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

type DomainScreeningResult

type DomainScreeningResult struct {
	// nodes in this domain.
	Nodes []string `json:"nodes"`
	// passed is true if the screening test succeeded.
	Passed bool `json:"passed"`
}

DomainScreeningResult records the outcome of screening one topology domain.

func (*DomainScreeningResult) DeepCopy

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

func (*DomainScreeningResult) DeepCopyInto

func (in *DomainScreeningResult) DeepCopyInto(out *DomainScreeningResult)

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

type EventPattern

type EventPattern struct {
	// regex is the regular expression with Go named capture groups.
	// Uses (?P<name>...) syntax to name extracted fields.
	//
	// Well-known capture names used by the goodput calculator:
	//   Common:     timestamp
	//   Training:   globalStep, iteration, epoch, stepTiming, loss, tflops, elapsedTime
	//   Checkpoint: step, path, saveDuration
	//
	// The controller parses named captures into typed values:
	//   int:     globalStep, iteration, epoch, step
	//   float64: stepTiming, loss, tflops, elapsedTime, saveDuration
	//   string:  path
	//   time:    timestamp (parsed using LogProfile.spec.timestamp.layout)
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Regex string `json:"regex"`

	// example is a sample log line that the regex should match.
	// Serves as documentation and is validated when the LogProfile is loaded.
	// +optional
	Example string `json:"example,omitempty"`

	// units specifies the unit for duration/timing captures.
	// The controller normalizes all durations to seconds internally.
	// Supported values: "s" (seconds), "ms" (milliseconds), "us" (microseconds).
	//
	// Only needed for duration-type captures: stepTiming, elapsedTime, saveDuration.
	// If a duration capture is not listed here, it defaults to "s" (seconds).
	//
	// Example: {"elapsedTime": "ms"} means the captured value is in milliseconds.
	// +optional
	Units map[string]string `json:"units,omitempty"`
}

EventPattern defines a regex pattern for matching a specific training event. Uses Go named capture groups (?P<name>...) following the same convention as Promtail, FluentBit, and Vector for structured log extraction.

func (*EventPattern) DeepCopy

func (in *EventPattern) DeepCopy() *EventPattern

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

func (*EventPattern) DeepCopyInto

func (in *EventPattern) DeepCopyInto(out *EventPattern)

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

type ExecFramework

type ExecFramework struct {
	// command is the entrypoint array (e.g., ["/bin/bash", "/config/train.sh"]).
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinItems=1
	Command []string `json:"command"`

	// args are arguments to the command.
	// +optional
	Args []string `json:"args,omitempty"`
}

ExecFramework configures arbitrary command execution.

func (*ExecFramework) DeepCopy

func (in *ExecFramework) DeepCopy() *ExecFramework

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

func (*ExecFramework) DeepCopyInto

func (in *ExecFramework) DeepCopyInto(out *ExecFramework)

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

type ExecutionSpec

type ExecutionSpec struct {
	// maxConcurrent is the maximum number of jobs to run concurrently.
	// 0 means unlimited. Default is 0.
	// +kubebuilder:validation:Minimum=0
	// +kubebuilder:default=0
	// +optional
	MaxConcurrent int `json:"maxConcurrent,omitempty"`

	// timeoutPerJob is the maximum time to wait for each job to complete.
	// +optional
	TimeoutPerJob *metav1.Duration `json:"timeoutPerJob,omitempty"`

	// retryFailedGroups is the number of times to retry a failed group's job.
	// After the workload controller exhausts its own restarts (backoffLimit),
	// the orchestration re-creates the entire job up to this many times.
	// 0 means no retries. Default is 0.
	// +kubebuilder:validation:Minimum=0
	// +kubebuilder:default=0
	// +optional
	RetryFailedGroups int `json:"retryFailedGroups,omitempty"`
}

ExecutionSpec defines how jobs are scheduled across groups.

func (*ExecutionSpec) DeepCopy

func (in *ExecutionSpec) DeepCopy() *ExecutionSpec

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

func (*ExecutionSpec) DeepCopyInto

func (in *ExecutionSpec) DeepCopyInto(out *ExecutionSpec)

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

type FailedNode

type FailedNode struct {
	// name is the Kubernetes node name.
	// +kubebuilder:validation:Required
	Name string `json:"name"`

	// reason is the failure type for this node, matching the originating Job
	// condition reason.
	//   - HardwareFailureDetected: a node health check (CEL) flagged the node.
	//   - ThresholdViolation: a performance threshold (bandwidth/goodput) was not met.
	//   - WorkloadFailed: the workload exited non-zero, stalled, or otherwise failed.
	// +kubebuilder:validation:Required
	Reason NodeFailureReason `json:"reason"`

	// message is the detailed failure message for this node, matching the originating Job condition message.
	// +optional
	Message string `json:"message,omitempty"`
}

func (*FailedNode) DeepCopy

func (in *FailedNode) DeepCopy() *FailedNode

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

func (*FailedNode) DeepCopyInto

func (in *FailedNode) DeepCopyInto(out *FailedNode)

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

type FailureLog

type FailureLog struct {
	// podName is the name of the pod that failed.
	PodName string `json:"podName"`
	// nodeName is the node the failed pod was running on.
	NodeName string `json:"nodeName"`
	// exitCode is the container's exit code.
	ExitCode int32 `json:"exitCode"`
	// reason is the termination reason (e.g., "OOMKilled", "Error").
	// +optional
	Reason string `json:"reason,omitempty"`
	// tail is the end of the failed container's logs, up to 32 KB.
	// When no pod was available to read, this explains why instead.
	// +optional
	Tail string `json:"tail,omitempty"`
}

FailureLog captures diagnostic information from a failed workload pod.

func (*FailureLog) DeepCopy

func (in *FailureLog) DeepCopy() *FailureLog

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

func (*FailureLog) DeepCopyInto

func (in *FailureLog) DeepCopyInto(out *FailureLog)

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

type FrameworkSpec

type FrameworkSpec struct {
	// torch runs distributed training via torchrun.
	// Auto-generates a PyTorch TrainingRuntime with torch mlPolicy,
	// numProcPerNode, GPU resources, and shared memory.
	// +optional
	Torch *TorchFramework `json:"torch,omitempty"`

	// mpi runs MPI-based workloads (e.g., NCCL tests).
	// Auto-generates an MPI TrainingRuntime with launcher+worker pattern,
	// SSH auth, IPC_LOCK capability, and readiness probes.
	// +optional
	MPI *MPIFramework `json:"mpi,omitempty"`

	// exec runs an arbitrary command directly.
	// Auto-generates a simple TrainingRuntime with a single replicatedJob.
	// +optional
	Exec *ExecFramework `json:"exec,omitempty"`
}

FrameworkSpec is a discriminated union of workload framework types. Exactly one field must be set.

+kubebuilder:validation:MinProperties=1 +kubebuilder:validation:MaxProperties=1

func (*FrameworkSpec) DeepCopy

func (in *FrameworkSpec) DeepCopy() *FrameworkSpec

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

func (*FrameworkSpec) DeepCopyInto

func (in *FrameworkSpec) DeepCopyInto(out *FrameworkSpec)

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

type GangSchedulerSpec

type GangSchedulerSpec struct {
	// schedulerName is the name of the gang-aware scheduler to use (e.g. "kai-scheduler").
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	SchedulerName string `json:"schedulerName"`

	// queue is the scheduler queue to submit the workload to.
	// Defaults to "default-queue" if not specified.
	// When non-empty, must be a valid Kubernetes label value: at most 63 characters,
	// beginning and ending with an alphanumeric character, and containing only
	// alphanumerics, hyphens, underscores, or dots.
	// +optional
	// +kubebuilder:validation:MaxLength=63
	// +kubebuilder:validation:Pattern=`^$|^[a-zA-Z0-9]([a-zA-Z0-9._-]*[a-zA-Z0-9])?$`
	Queue string `json:"queue,omitempty"`
}

GangSchedulerSpec configures gang scheduling for WorkloadRun pods.

func (*GangSchedulerSpec) DeepCopy

func (in *GangSchedulerSpec) DeepCopy() *GangSchedulerSpec

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

func (*GangSchedulerSpec) DeepCopyInto

func (in *GangSchedulerSpec) DeepCopyInto(out *GangSchedulerSpec)

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

type GoodputMeasurement

type GoodputMeasurement struct {
	metav1.TypeMeta `json:",inline"`

	// metadata is a standard object metadata
	// +optional
	metav1.ObjectMeta `json:"metadata,omitzero"`

	// spec defines the desired state of GoodputMeasurement
	// +required
	Spec GoodputMeasurementSpec `json:"spec"`

	// status defines the observed state of GoodputMeasurement
	// +optional
	Status GoodputMeasurementStatus `json:"status,omitzero"`
}

GoodputMeasurement is the Schema for the goodputmeasurements API

func (*GoodputMeasurement) DeepCopy

func (in *GoodputMeasurement) DeepCopy() *GoodputMeasurement

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

func (*GoodputMeasurement) DeepCopyInto

func (in *GoodputMeasurement) DeepCopyInto(out *GoodputMeasurement)

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

func (*GoodputMeasurement) DeepCopyObject

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

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

type GoodputMeasurementConfig

type GoodputMeasurementConfig struct {
	// logProfileRef is the name of the cluster-scoped LogProfile to use for log parsing.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	LogProfileRef string `json:"logProfileRef"`

	// sampleInterval is how often to sample pod logs while the Job is running.
	// Default: 60s.
	// +optional
	SampleInterval *metav1.Duration `json:"sampleInterval,omitempty"`
}

GoodputMeasurementConfig configures automatic creation of a GoodputMeasurement child resource for the Job. When set, the controller creates a GoodputMeasurement that tracks training goodput metrics by parsing pod logs.

func (*GoodputMeasurementConfig) DeepCopy

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

func (*GoodputMeasurementConfig) DeepCopyInto

func (in *GoodputMeasurementConfig) DeepCopyInto(out *GoodputMeasurementConfig)

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

type GoodputMeasurementList

type GoodputMeasurementList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitzero"`
	Items           []GoodputMeasurement `json:"items"`
}

GoodputMeasurementList contains a list of GoodputMeasurement

func (*GoodputMeasurementList) DeepCopy

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

func (*GoodputMeasurementList) DeepCopyInto

func (in *GoodputMeasurementList) DeepCopyInto(out *GoodputMeasurementList)

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

func (*GoodputMeasurementList) DeepCopyObject

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

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

type GoodputMeasurementSpec

type GoodputMeasurementSpec struct {
	// jobRef is the reference to the NVCRE Job for which goodput should be calculated.
	// +optional
	JobRef corev1.TypedLocalObjectReference `json:"jobRef,omitempty"`

	// logProfileRef is the name of the cluster-scoped LogProfile to use for log parsing.
	// The LogProfile defines regex patterns for extracting training metrics from pod logs.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	LogProfileRef string `json:"logProfileRef"`

	// sampleInterval is how often to sample pod logs while the Job is running.
	// Default: 60s.
	// +optional
	SampleInterval *metav1.Duration `json:"sampleInterval,omitempty"`
}

GoodputMeasurementSpec defines the desired state of GoodputMeasurement

func (*GoodputMeasurementSpec) DeepCopy

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

func (*GoodputMeasurementSpec) DeepCopyInto

func (in *GoodputMeasurementSpec) DeepCopyInto(out *GoodputMeasurementSpec)

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

type GoodputMeasurementStatus

type GoodputMeasurementStatus struct {
	// result is the current runtime goodput ratio (0.0 to 1.0) as a string.
	// Formula: (t_w - t_ch - t_rm - t_re - t_save) / (t_w - t_re)
	// where t_w=trainingTime, t_ch=lostWorkTime, t_rm=resumeTime, t_re=rescheduleTime, t_save=checkpointSaveTime
	// +optional
	Result string `json:"result,omitempty"`

	// currentStep is the latest training step observed from logs.
	// +optional
	CurrentStep int `json:"currentStep,omitempty"`

	// highestStep is the highest training step ever reached (may be > currentStep after restart).
	// +optional
	HighestStep int `json:"highestStep,omitempty"`

	// trainingTimeSec is the total training wall-clock time in seconds (t_w).
	// +optional
	TrainingTimeSec string `json:"trainingTimeSec,omitempty"`

	// lostWorkTimeSec is cumulative lost work in seconds (sum of t_ch across all interruptions).
	// +optional
	LostWorkTimeSec string `json:"lostWorkTimeSec,omitempty"`

	// rescheduleTimeSec is cumulative scheduling delay in seconds (sum of t_re).
	// +optional
	RescheduleTimeSec string `json:"rescheduleTimeSec,omitempty"`

	// resumeTimeSec is cumulative resume time in seconds (sum of t_rm: checkpoint load + resume).
	// +optional
	ResumeTimeSec string `json:"resumeTimeSec,omitempty"`

	// checkpointSaveTimeSec is cumulative checkpoint save overhead in seconds (sum of t_save).
	// +optional
	CheckpointSaveTimeSec string `json:"checkpointSaveTimeSec,omitempty"`

	// interruptionCount is the number of interruptions detected.
	// +optional
	InterruptionCount int `json:"interruptionCount,omitempty"`

	// lastCheckpointStep is the step number of the last saved checkpoint.
	// +optional
	LastCheckpointStep int `json:"lastCheckpointStep,omitempty"`

	// lastCheckpointTime is the timestamp of the last saved checkpoint.
	// Persisted so lost work time (t_ch) can be computed after controller restarts.
	// +optional
	LastCheckpointTime *metav1.Time `json:"lastCheckpointTime,omitempty"`

	// startTime is the time when the measurement started (when the referenced Job began running).
	// +optional
	StartTime *metav1.Time `json:"startTime,omitempty"`

	// completionTime is the time when the measurement completed (when the referenced Job reached a terminal state).
	// +optional
	CompletionTime *metav1.Time `json:"completionTime,omitempty"`

	// lastStepTimestamp is the timestamp of the most recently observed training step.
	// Used by the Job controller for stall detection.
	// +optional
	LastStepTimestamp *metav1.Time `json:"lastStepTimestamp,omitempty"`

	// avgStepTimeSec is the average time per training step in seconds (excluding warmup).
	// Computed from observed step timings or consecutive step timestamps.
	// +optional
	AvgStepTimeSec string `json:"avgStepTimeSec,omitempty"`

	// logInterval is the training framework's log interval from the LogProfile.
	// Persisted so the Job controller can scale the stall detection threshold
	// by the number of iterations between consecutive logged steps.
	// +optional
	LogInterval int `json:"logInterval,omitempty"`

	// warmupBaseStep is the GlobalStep of the first training step after the most recent
	// run boundary (applicationStart or checkpointRestore). Steps within warmupSteps of
	// this base are warmup. Persisted so warmup detection survives across SinceTime-based
	// incremental log reads where applicationStart is no longer in the read window.
	// +optional
	WarmupBaseStep *int `json:"warmupBaseStep,omitempty"`

	// warmupTimeSec is the cumulative time spent on warmup steps in seconds (across all runs).
	// +optional
	WarmupTimeSec string `json:"warmupTimeSec,omitempty"`

	// nonWarmupTimeSec is the cumulative time spent on non-warmup steps in seconds (across all runs).
	// +optional
	NonWarmupTimeSec string `json:"nonWarmupTimeSec,omitempty"`

	// lastNonWarmupStep is the highest step whose timing has been accumulated into nonWarmupTimeSec.
	// Used as a watermark to avoid double-counting steps across reconcile cycles.
	// +optional
	LastNonWarmupStep int `json:"lastNonWarmupStep,omitempty"`

	// priorWarmupTimeSec is the accumulated warmup time from completed runs (before the current run).
	// +optional
	PriorWarmupTimeSec string `json:"priorWarmupTimeSec,omitempty"`

	// priorNonWarmupTimeSec is the accumulated non-warmup time from completed runs (before the current run).
	// +optional
	PriorNonWarmupTimeSec string `json:"priorNonWarmupTimeSec,omitempty"`

	// avgTFLOPSPerGPU is the average TFLOPS per GPU observed from training step logs (including warmup).
	// +optional
	AvgTFLOPSPerGPU string `json:"avgTFLOPSPerGPU,omitempty"`

	// applicationStartTime is the timestamp of the first application framework log marker.
	// Persisted so startup resume time can be computed even if the log line scrolls out of the tail window.
	// +optional
	ApplicationStartTime *metav1.Time `json:"applicationStartTime,omitempty"`

	// applicationStopTime is the timestamp of the last application log line observed.
	// Used as the interruption time for goodput calculations — more accurate than
	// container termination time or wall clock for stalls and crashes.
	// +optional
	ApplicationStopTime *metav1.Time `json:"applicationStopTime,omitempty"`

	// pendingInterruption stores an in-progress interruption event that hasn't been
	// completed by a job restart yet. Persisted so state survives controller restarts.
	// +optional
	PendingInterruption *PendingInterruptionStatus `json:"pendingInterruption,omitempty"`

	// conditions represent the current state of the GoodputMeasurement resource.
	//
	// Condition types:
	// - "Measuring": the measurement is in progress (referenced Job is running)
	// - "Complete": the measurement has finished (referenced Job succeeded or failed)
	//
	// The status of each condition is one of True, False, or Unknown.
	// +listType=map
	// +listMapKey=type
	// +optional
	Conditions []metav1.Condition `json:"conditions,omitempty"`
}

GoodputMeasurementStatus defines the observed state of GoodputMeasurement.

func (*GoodputMeasurementStatus) DeepCopy

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

func (*GoodputMeasurementStatus) DeepCopyInto

func (in *GoodputMeasurementStatus) DeepCopyInto(out *GoodputMeasurementStatus)

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

type GroupIterationResult

type GroupIterationResult struct {
	// name is the group identifier (matches GroupStatus.Name).
	Name string `json:"name"`
	// phase is the terminal phase (Succeeded or Failed).
	Phase GroupPhase `json:"phase"`
	// jobName is the Job that ran for this group in this iteration.
	// Empty if the Job was deleted before the snapshot.
	// +optional
	JobName string `json:"jobName,omitempty"`
	// startTime when the group's job started.
	// +optional
	StartTime *metav1.Time `json:"startTime,omitempty"`
	// completionTime when the group's job finished.
	// +optional
	CompletionTime *metav1.Time `json:"completionTime,omitempty"`
}

GroupIterationResult records one group's outcome for a single iteration.

func (*GroupIterationResult) DeepCopy

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

func (*GroupIterationResult) DeepCopyInto

func (in *GroupIterationResult) DeepCopyInto(out *GroupIterationResult)

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

type GroupPhase

type GroupPhase string

GroupPhase represents the phase of a scheduling group's job.

const (
	GroupPending   GroupPhase = "Pending"
	GroupRunning   GroupPhase = "Running"
	GroupSucceeded GroupPhase = "Succeeded"
	GroupFailed    GroupPhase = "Failed"
)

type GroupStatus

type GroupStatus struct {
	// name is a unique identifier (e.g., "group-0", "group-1-overflow").
	Name string `json:"name"`

	// nodes in this group.
	Nodes []string `json:"nodes"`

	// domains lists topology domain values this group spans.
	// +optional
	Domains []string `json:"domains,omitempty"`

	// domainNodeCounts records the number of nodes per topology domain in
	// this group, keyed by domain value. Populated at partition time so
	// reports can show per-clique node counts without fetching nodes.
	// +optional
	DomainNodeCounts map[string]int `json:"domainNodeCounts,omitempty"`

	// overflow indicates this group contains borrowed nodes and must wait
	// for the jobs using those nodes to complete before launching.
	// +optional
	Overflow bool `json:"overflow,omitempty"`

	// phase is the current phase of this group's job in the current iteration.
	// Reset to Pending at the start of each iteration.
	// +kubebuilder:validation:Enum=Pending;Running;Succeeded;Failed
	Phase GroupPhase `json:"phase"`

	// retries is the number of times the current iteration's job has been retried.
	// Reset to 0 at the start of each iteration.
	// +optional
	Retries int `json:"retries,omitempty"`

	// jobRef references the current job for this group.
	// +optional
	JobRef *WorkloadReference `json:"jobRef,omitempty"`

	// startTime when this group's job started in the current iteration.
	// +optional
	StartTime *metav1.Time `json:"startTime,omitempty"`

	// completionTime when this group's job finished in the current iteration.
	// +optional
	CompletionTime *metav1.Time `json:"completionTime,omitempty"`
}

GroupStatus tracks the state of a scheduling group's job within the current iteration.

func (*GroupStatus) DeepCopy

func (in *GroupStatus) DeepCopy() *GroupStatus

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

func (*GroupStatus) DeepCopyInto

func (in *GroupStatus) DeepCopyInto(out *GroupStatus)

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

type InfrastructureFault

type InfrastructureFault struct {
	// domain is the topology domain where the fault was detected.
	Domain string `json:"domain"`
	// groupA is one set of nodes on one side of the faulty boundary.
	GroupA []string `json:"groupA"`
	// groupB is the other set of nodes.
	GroupB []string `json:"groupB"`
	// stage is the diagnose stage where the fault was detected.
	Stage string `json:"stage"`
}

InfrastructureFault records a detected infrastructure-level fault between two node groups in the same topology domain. The fault is in the interconnect (NVSwitch trunk, spine switch, cable) rather than in individual nodes.

func (*InfrastructureFault) DeepCopy

func (in *InfrastructureFault) DeepCopy() *InfrastructureFault

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

func (*InfrastructureFault) DeepCopyInto

func (in *InfrastructureFault) DeepCopyInto(out *InfrastructureFault)

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

type IntMatchSpec

type IntMatchSpec struct {
	// equals checks for exact match.
	// +optional
	Equals *int `json:"equals,omitempty"`

	// greaterThan checks if value is greater than threshold.
	// +optional
	GreaterThan *int `json:"greaterThan,omitempty"`

	// lessThan checks if value is less than threshold.
	// +optional
	LessThan *int `json:"lessThan,omitempty"`
}

IntMatchSpec defines integer matching criteria.

func (*IntMatchSpec) DeepCopy

func (in *IntMatchSpec) DeepCopy() *IntMatchSpec

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

func (*IntMatchSpec) DeepCopyInto

func (in *IntMatchSpec) DeepCopyInto(out *IntMatchSpec)

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

type IterationMetrics

type IterationMetrics struct {
	// iterationNumber is the iteration index (1-based).
	IterationNumber int `json:"iterationNumber"`

	// tflops is the measured TFLOPs performance as a string.
	// Example: "1500.5"
	// +optional
	TFLOPs string `json:"tflops,omitempty"`

	// duration is the iteration duration in seconds as a string.
	// Example: "3600.5"
	// +optional
	Duration string `json:"duration,omitempty"`

	// memoryUsedGB is the peak GPU memory usage in GB as a string.
	// Example: "640.25"
	// +optional
	MemoryUsedGB string `json:"memoryUsedGB,omitempty"`

	// status is the status of this iteration.
	// Examples: "Succeeded", "Failed"
	Status string `json:"status"`
}

IterationMetrics contains performance metrics for one iteration.

func (*IterationMetrics) DeepCopy

func (in *IterationMetrics) DeepCopy() *IterationMetrics

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

func (*IterationMetrics) DeepCopyInto

func (in *IterationMetrics) DeepCopyInto(out *IterationMetrics)

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

type IterationResult

type IterationResult struct {
	// iteration is the 1-based iteration number.
	Iteration int `json:"iteration"`
	// groups contains the outcome of each group in this iteration.
	Groups []GroupIterationResult `json:"groups"`
}

IterationResult records the outcome of a completed iteration.

func (*IterationResult) DeepCopy

func (in *IterationResult) DeepCopy() *IterationResult

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

func (*IterationResult) DeepCopyInto

func (in *IterationResult) DeepCopyInto(out *IterationResult)

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

type Job

type Job struct {
	metav1.TypeMeta `json:",inline"`

	// metadata is a standard object metadata
	// +optional
	metav1.ObjectMeta `json:"metadata,omitzero"`

	// spec defines the desired state of Job
	// +required
	Spec JobSpec `json:"spec"`

	// status defines the observed state of Job
	// +optional
	Status JobStatus `json:"status,omitzero"`
}

Job is the Schema for the jobs API

func (*Job) DeepCopy

func (in *Job) DeepCopy() *Job

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

func (*Job) DeepCopyInto

func (in *Job) DeepCopyInto(out *Job)

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

func (*Job) DeepCopyObject

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

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

type JobList

type JobList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitzero"`
	Items           []Job `json:"items"`
}

JobList contains a list of Job

func (*JobList) DeepCopy

func (in *JobList) DeepCopy() *JobList

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

func (*JobList) DeepCopyInto

func (in *JobList) DeepCopyInto(out *JobList)

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

func (*JobList) DeepCopyObject

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

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

type JobSpec

type JobSpec struct {
	// workload defines the workload to run.
	// The workload is created as a child resource of the Job.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="workload is immutable"
	Workload WorkloadSpec `json:"workload"`

	// nodeHealthMonitor configures hardware failure detection for nodes
	// running this job's pods. When a failure is detected, the job will
	// be marked with the HardwareFailed condition.
	// +optional
	// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="nodeHealthMonitor is immutable"
	NodeHealthMonitor *NodeHealthMonitor `json:"nodeHealthMonitor,omitempty"`

	// checkpoint configures checkpoint-based restart for the workload.
	// When set, the Job controller restarts the workload on failure if a
	// checkpoint was logged by an associated GoodputMeasurement. The user
	// must define the PVC volume and mounts in the workload spec directly.
	// +optional
	Checkpoint *CheckpointConfig `json:"checkpoint,omitempty"`

	// stallMultiplier configures stall detection for the workload. When set,
	// the Job controller compares the time since the last training step against
	// stallMultiplier * avgStepTime (from the associated GoodputMeasurement).
	// If the elapsed time exceeds this product, the workload is marked as Failed
	// with reason "WorkloadStalled".
	// Requires a GoodputMeasurement for this Job; if none exists, stall
	// detection is skipped.
	// Example: a value of 10 means the job is stalled if no step has been
	// logged for 10x the average step duration.
	// +optional
	// +kubebuilder:validation:Minimum=1
	StallMultiplier *int32 `json:"stallMultiplier,omitempty"`

	// startupStallTimeoutSeconds is the maximum time (in seconds) to wait after
	// the application framework starts for the first training step. If no step
	// is observed within this timeout, the workload is marked Failed with reason
	// "WorkloadStalled". Only active when stallMultiplier is set.
	// Default: 1200 (20 minutes).
	// +optional
	// +kubebuilder:validation:Minimum=1
	StartupStallTimeoutSeconds *int32 `json:"startupStallTimeoutSeconds,omitempty"`

	// goodputMeasurement configures automatic creation of a GoodputMeasurement
	// child resource that tracks training goodput metrics by parsing pod logs.
	// When absent, no measurement is created (suitable for non-training jobs).
	// Manually-created GoodputMeasurements continue to work via the existing
	// List-based lookup.
	// +optional
	// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="goodputMeasurement is immutable"
	GoodputMeasurement *GoodputMeasurementConfig `json:"goodputMeasurement,omitempty"`

	// bandwidthMeasurement configures automatic creation of a BandwidthMeasurement
	// child resource that tracks NCCL bandwidth metrics by parsing pod logs.
	// When absent, no measurement is created (suitable for non-NCCL jobs).
	// +optional
	// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="bandwidthMeasurement is immutable"
	BandwidthMeasurement *BandwidthMeasurementConfig `json:"bandwidthMeasurement,omitempty"`

	// thresholds maps metric names to CEL expressions for performance validation.
	// Propagated from WorkflowSpec.Validation.Performance.Thresholds by the
	// Workflow controller during Job creation. The Job controller evaluates them
	// after workload success and sets ValidationFailed if any threshold is violated.
	// Keys: "busBandwidthGBps", "goodputRatio", "avgTFLOPsPerGPU", "avgStepTimeSec", etc.
	// Values: CEL expressions using `value` variable, e.g. "value >= 900"
	// +optional
	Thresholds map[string]string `json:"thresholds,omitempty"`

	// measurementTimeout is the maximum time to wait after the Job succeeds for
	// measurement data before failing threshold validation. Propagated from the
	// Workflow's ValidationSpec by the Workflow controller during Job creation.
	// When nil, the Job controller uses its default (5m).
	// +optional
	MeasurementTimeout *metav1.Duration `json:"measurementTimeout,omitempty"`
}

JobSpec defines the desired state of Job

func (*JobSpec) DeepCopy

func (in *JobSpec) DeepCopy() *JobSpec

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

func (*JobSpec) DeepCopyInto

func (in *JobSpec) DeepCopyInto(out *JobSpec)

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

type JobStatus

type JobStatus struct {
	// conditions represent the current state of the Job.
	// Only one of the following conditions can be True at any given time:
	// - "InProgress": the Job is currently running
	// - "Succeeded": the Job has completed successfully
	// - "Failed": the Job has failed
	// - "HardwareFailed": a hardware failure was detected on a node
	//
	// The condition message contains details about the current state for debugging.
	// +listType=map
	// +listMapKey=type
	// +optional
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// failedNodes lists nodes that failed during this Job, each with the reason
	// for failure. Populated when the Job fails, a hardware failure is detected,
	// or a performance threshold is violated. A node may appear multiple times
	// with different reasons; entries are keyed by the (name, reason) pair.
	// +listType=map
	// +listMapKey=name
	// +listMapKey=reason
	// +optional
	FailedNodes []FailedNode `json:"failedNodes,omitempty"`

	// workloadRef references the workload resource created by this Job.
	// Populated after the workload is created. Used to track workload status.
	// +optional
	WorkloadRef *WorkloadReference `json:"workloadRef,omitempty"`

	// workloadStartTime is when the workload was first observed running rather
	// than pending. A workload held by an admission controller (for example a
	// TrainJob suspended by Kueue until quota is available) is pending, and its
	// queued time does not count against timeoutPerJob or stall detection:
	// timeoutPerJob is measured from this timestamp, and the stall clock never
	// starts before it. Cleared on checkpoint restart so the replacement
	// workload gets a fresh budget.
	// +optional
	WorkloadStartTime *metav1.Time `json:"workloadStartTime,omitempty"`

	// restartCount tracks the number of times the workload has been restarted from checkpoint.
	// +optional
	RestartCount int32 `json:"restartCount,omitempty"`

	// failureLog captures the tail of pod logs from the most recent workload failure.
	// Populated when the Job transitions to Failed. Only the pod that caused the
	// failure (earliest non-zero exit code) is captured. Overwritten on each retry.
	// Always set on failure: when no pod was available to read, reason and tail
	// record why rather than leaving the field unset.
	// +optional
	FailureLog *FailureLog `json:"failureLog,omitempty"`
}

JobStatus defines the observed state of Job.

func (*JobStatus) DeepCopy

func (in *JobStatus) DeepCopy() *JobStatus

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

func (*JobStatus) DeepCopyInto

func (in *JobStatus) DeepCopyInto(out *JobStatus)

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

type JobTemplateSpec

type JobTemplateSpec struct {
	// metadata is standard object metadata applied to created Jobs.
	// +optional
	metav1.ObjectMeta `json:"metadata,omitzero"`

	// spec is the Job specification used as a template for each execution group.
	// +kubebuilder:validation:Required
	Spec JobSpec `json:"spec"`
}

JobTemplateSpec defines the template for Jobs created by a Workflow.

func (*JobTemplateSpec) DeepCopy

func (in *JobTemplateSpec) DeepCopy() *JobTemplateSpec

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

func (*JobTemplateSpec) DeepCopyInto

func (in *JobTemplateSpec) DeepCopyInto(out *JobTemplateSpec)

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

type LogPatternSet

type LogPatternSet struct {
	// trainingStep matches training iteration log lines.
	// Well-known captures: timestamp, globalStep, iteration, epoch,
	// stepTiming, loss, tflops, elapsedTime
	// +optional
	TrainingStep *EventPattern `json:"trainingStep,omitempty"`

	// checkpointSave matches checkpoint save start lines.
	// Well-known captures: timestamp, step, path, saveDuration
	// +optional
	CheckpointSave *EventPattern `json:"checkpointSave,omitempty"`

	// checkpointDone matches checkpoint save completion lines.
	// Well-known captures: timestamp, step, path
	// +optional
	CheckpointDone *EventPattern `json:"checkpointDone,omitempty"`

	// checkpointRestore matches checkpoint restore (load start) lines.
	// Well-known captures: timestamp, path, step
	// +optional
	CheckpointRestore *EventPattern `json:"checkpointRestore,omitempty"`

	// checkpointLoaded matches checkpoint load completed lines.
	// Well-known captures: timestamp, path, step
	// +optional
	CheckpointLoaded *EventPattern `json:"checkpointLoaded,omitempty"`

	// applicationStart matches a line indicating the application has started.
	// Well-known captures: timestamp
	// +optional
	ApplicationStart *EventPattern `json:"applicationStart,omitempty"`

	// warmupStep matches lines that indicate a warmup/startup iteration.
	// When a training step line also matches this pattern, the step is
	// flagged as warmup and excluded from average step time computation.
	// Well-known captures: none required (presence of match is sufficient).
	// +optional
	WarmupStep *EventPattern `json:"warmupStep,omitempty"`

	// bandwidthResult matches NCCL bandwidth test result lines.
	// Used by the BandwidthMeasurement controller (not the GoodputMeasurement controller).
	// Well-known captures: size (int, bytes), algBW (float, GB/s), busBW (float, GB/s)
	// +optional
	BandwidthResult *EventPattern `json:"bandwidthResult,omitempty"`
}

LogPatternSet defines the set of regex patterns for extracting training events. Each pattern uses Go named capture groups (?P<name>...) to extract typed fields.

func (*LogPatternSet) DeepCopy

func (in *LogPatternSet) DeepCopy() *LogPatternSet

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

func (*LogPatternSet) DeepCopyInto

func (in *LogPatternSet) DeepCopyInto(out *LogPatternSet)

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

type LogProfile

type LogProfile struct {
	metav1.TypeMeta `json:",inline"`

	// metadata is a standard object metadata
	// +optional
	metav1.ObjectMeta `json:"metadata,omitzero"`

	// spec defines the log parsing configuration
	// +required
	Spec LogProfileSpec `json:"spec"`
}

LogProfile is the Schema for the logprofiles API. A cluster-scoped resource that defines regex patterns for parsing training logs of a specific framework (e.g., Nemotron 4/NeMo, Nemotron 6/Megatron).

func (*LogProfile) DeepCopy

func (in *LogProfile) DeepCopy() *LogProfile

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

func (*LogProfile) DeepCopyInto

func (in *LogProfile) DeepCopyInto(out *LogProfile)

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

func (*LogProfile) DeepCopyObject

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

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

type LogProfileList

type LogProfileList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitzero"`
	Items           []LogProfile `json:"items"`
}

LogProfileList contains a list of LogProfile

func (*LogProfileList) DeepCopy

func (in *LogProfileList) DeepCopy() *LogProfileList

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

func (*LogProfileList) DeepCopyInto

func (in *LogProfileList) DeepCopyInto(out *LogProfileList)

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

func (*LogProfileList) DeepCopyObject

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

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

type LogProfileSpec

type LogProfileSpec struct {
	// timestamp configures how to parse timestamps captured by event patterns.
	// +kubebuilder:validation:Required
	Timestamp TimestampSpec `json:"timestamp"`

	// patterns defines regex patterns for extracting training events from log lines.
	// +kubebuilder:validation:Required
	Patterns LogPatternSet `json:"patterns"`

	// workerStrategy defines how to read logs from multi-worker jobs.
	// Default: single worker (read from worker-0 only).
	// +optional
	WorkerStrategy *WorkerStrategySpec `json:"workerStrategy,omitempty"`

	// containerName is the container to read logs from.
	// If empty, the controller auto-detects the container name from the workload.
	// +optional
	ContainerName string `json:"containerName,omitempty"`

	// warmupSteps is the number of initial training steps per run to flag as warmup.
	// Steps after applicationStart or checkpointRestore up to this count are marked
	// as warmup and excluded from average step time computation.
	// +optional
	WarmupSteps *int `json:"warmupSteps,omitempty"`

	// logInterval is the training framework's log interval (e.g., 10 for --log-interval 10).
	// When set, training steps whose GlobalStep is not a multiple of this value are
	// filtered out. This removes inflated "first after boundary" log lines that include
	// startup or restart overhead. Also used as the default step delta for the first
	// step in a window when computing total training time.
	// +optional
	LogInterval *int `json:"logInterval,omitempty"`
}

LogProfileSpec defines the desired state of LogProfile.

func (*LogProfileSpec) DeepCopy

func (in *LogProfileSpec) DeepCopy() *LogProfileSpec

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

func (*LogProfileSpec) DeepCopyInto

func (in *LogProfileSpec) DeepCopyInto(out *LogProfileSpec)

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

type MPIFramework

type MPIFramework struct {
	// binary is the MPI binary to run (e.g., "/usr/local/bin/all_reduce_perf_mpi").
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Binary string `json:"binary"`

	// args are arguments to the MPI binary (e.g., ["-b", "8", "-e", "32G"]).
	// +optional
	Args []string `json:"args,omitempty"`

	// mpiArgs are extra arguments to mpirun itself (e.g., ["--allow-run-as-root"]).
	// Standard args (--mca plm_rsh_args, -x NCCL vars) are auto-injected.
	// +optional
	MpiArgs []string `json:"mpiArgs,omitempty"`

	// mpiImplementation is the MPI implementation to use.
	// Default: "OpenMPI".
	// +optional
	// +kubebuilder:default="OpenMPI"
	MpiImplementation string `json:"mpiImplementation,omitempty"`

	// mpirunPath is the path to the mpirun binary in the container image.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	MpirunPath string `json:"mpirunPath"`
}

MPIFramework configures MPI-based workloads.

func (*MPIFramework) DeepCopy

func (in *MPIFramework) DeepCopy() *MPIFramework

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

func (*MPIFramework) DeepCopyInto

func (in *MPIFramework) DeepCopyInto(out *MPIFramework)

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

type NodeFailureReason

type NodeFailureReason string

FailedNode identifies a node that failed during execution along with the reason it was marked as failed. Failed nodes originate at the Job tier and propagate up through Workflow to Certification, preserving the per-node reason. NodeFailureReason enumerates why a node was attributed a failure in a FailedNode entry. It matches the originating Job condition reason. +kubebuilder:validation:Enum=HardwareFailureDetected;ThresholdViolation;WorkloadFailed

const (
	// NodeFailureHardwareDetected indicates a node health check (CEL) flagged the node.
	NodeFailureHardwareDetected NodeFailureReason = "HardwareFailureDetected"
	// NodeFailureThresholdViolation indicates a performance threshold (bandwidth/goodput) was not met.
	NodeFailureThresholdViolation NodeFailureReason = "ThresholdViolation"
	// NodeFailureWorkloadFailed indicates the workload exited non-zero, stalled, or otherwise failed.
	NodeFailureWorkloadFailed NodeFailureReason = "WorkloadFailed"
)

type NodeHealthMonitor

type NodeHealthMonitor struct {
	// cel defines a CEL expression evaluated against Node objects.
	// The expression must return a boolean. When it evaluates to true,
	// the node is considered to have a hardware failure.
	//
	// The full corev1.Node object is available via the 'node' variable:
	// - node.metadata: ObjectMeta (name, labels, annotations, etc.)
	// - node.spec: NodeSpec (taints, unschedulable, podCIDR, etc.)
	// - node.status: NodeStatus (conditions, addresses, capacity, allocatable, nodeInfo, etc.)
	//
	// Examples:
	// - "node.spec.taints.exists(t, t.key == 'nvidia.com/gpu-unhealthy')"
	// - "'gpud.nvidia.com/unhealthy' in node.metadata.labels"
	// - "node.status.conditions.exists(c, c.type == 'GPUHealthy' && c.status == 'False')"
	// - "node.spec.unschedulable == true"
	//
	// +optional
	CEL *CELNodeHealthCheck `json:"cel,omitempty"`
}

NodeHealthMonitor configures how the controller monitors nodes for hardware failures.

func (*NodeHealthMonitor) DeepCopy

func (in *NodeHealthMonitor) DeepCopy() *NodeHealthMonitor

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

func (*NodeHealthMonitor) DeepCopyInto

func (in *NodeHealthMonitor) DeepCopyInto(out *NodeHealthMonitor)

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

type NodeResult

type NodeResult struct {
	// domain is the topology domain this node belongs to.
	// For example, if using "nvidia.com/gpu.clique", this is the clique value.
	Domain string `json:"domain"`

	// group is the group name that ran on this node.
	Group string `json:"group"`

	// status is the validation status for this node.
	// Examples: "Passed", "Failed", "Running"
	Status string `json:"status"`

	// iterations contains metrics for each iteration on this node.
	// +optional
	Iterations []IterationMetrics `json:"iterations,omitempty"`
}

NodeResult contains performance metrics for a single node.

func (*NodeResult) DeepCopy

func (in *NodeResult) DeepCopy() *NodeResult

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

func (*NodeResult) DeepCopyInto

func (in *NodeResult) DeepCopyInto(out *NodeResult)

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

type OrchestrationOverrideSpec

type OrchestrationOverrideSpec struct {
	// target overrides which nodes to include in the orchestration.
	// +optional
	Target *TargetSpec `json:"target,omitempty"`

	// topology overrides rack/zone-aware placement configuration.
	// +optional
	Topology *TopologySpec `json:"topology,omitempty"`

	// execution overrides how jobs are scheduled across groups.
	// +optional
	Execution *ExecutionSpec `json:"execution,omitempty"`

	// iterations overrides the number of times to run all jobs.
	// +optional
	Iterations *int `json:"iterations,omitempty"`
}

OrchestrationOverrideSpec defines optional overrides for orchestration settings. All fields are pointers — nil means "don't change the base value."

func (*OrchestrationOverrideSpec) DeepCopy

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

func (*OrchestrationOverrideSpec) DeepCopyInto

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

type OrchestrationSpec

type OrchestrationSpec struct {
	// target specifies which nodes to include in the orchestration.
	// When nil, all nodes in the cluster are targeted.
	// +optional
	Target *TargetSpec `json:"target,omitempty"`

	// topology configures rack/zone-aware placement.
	// When set, jobs are packed into the minimum number of topology domains.
	// When nil, nodes are grouped by simple chunking (no topology awareness).
	// +optional
	Topology *TopologySpec `json:"topology,omitempty"`

	// diagnose enables adaptive fault isolation using topology-aware hierarchical
	// group testing. Stage 1a screens each topology domain in parallel, Stage 1b
	// tests inter-domain fabric, Stage 2 bisects failed groups, Stage 3 confirms
	// suspects. Identifies all faulty nodes in O(d log N) tests.
	// +optional
	Diagnose *DiagnoseSpec `json:"diagnose,omitempty"`

	// execution defines how jobs are scheduled across groups.
	// +optional
	Execution ExecutionSpec `json:"execution,omitempty"`

	// iterations is the number of times to run all jobs (one full pass = one iteration).
	// Default is 1.
	// +kubebuilder:validation:Minimum=1
	// +kubebuilder:default=1
	// +optional
	Iterations int `json:"iterations,omitempty"`
}

OrchestrationSpec defines topology-aware orchestration strategy.

func (*OrchestrationSpec) DeepCopy

func (in *OrchestrationSpec) DeepCopy() *OrchestrationSpec

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

func (*OrchestrationSpec) DeepCopyInto

func (in *OrchestrationSpec) DeepCopyInto(out *OrchestrationSpec)

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

type OrchestrationStatus

type OrchestrationStatus struct {
	// totalNodes discovered from target.
	TotalNodes int `json:"totalNodes"`

	// nodesPerJob auto-detected from workload template.
	NodesPerJob int `json:"nodesPerJob"`

	// totalGroups created.
	TotalGroups int `json:"totalGroups"`

	// currentIteration is the iteration currently in progress (1-based).
	// +optional
	CurrentIteration int `json:"currentIteration,omitempty"`

	// completedIterations is the number of iterations fully completed.
	// +optional
	CompletedIterations int `json:"completedIterations,omitempty"`

	// iterationHistory records per-group outcomes for each completed iteration.
	// Appended when an iteration completes and more iterations remain.
	// The final iteration's results stay in Groups (not duplicated here).
	// +optional
	IterationHistory []IterationResult `json:"iterationHistory,omitempty"`

	// detectedPlatform is the cloud platform detected from node labels.
	// Used by WhenSpec for conditional dependency creation.
	// Examples: "aws", "gcp", "onprem", "unknown"
	// +optional
	DetectedPlatform string `json:"detectedPlatform,omitempty"`

	// detectedGPUArchitecture is the GPU architecture detected from node labels.
	// Examples: "h100", "gb200", "a100", "l40s", "unknown"
	// +optional
	DetectedGPUArchitecture string `json:"detectedGPUArchitecture,omitempty"`

	// excludedNodes lists nodes that matched the target but were dropped before
	// scheduling, and exclusionReason says why. A Workflow can succeed while
	// excluding nodes, so these record what was left untested. Causes: the node
	// was cordoned, the target set has more than one GPU architecture and the
	// run continued on the primary architecture alone, or the node reports
	// fewer allocatable GPUs than the workload requests per node.
	// +optional
	ExcludedNodes []string `json:"excludedNodes,omitempty"`

	// exclusionReason explains why excludedNodes were dropped.
	// +optional
	ExclusionReason string `json:"exclusionReason,omitempty"`

	// appliedOverrides records which overrides from spec.overrides[] were applied
	// after platform and GPU architecture detection completed.
	// +optional
	AppliedOverrides []AppliedOverride `json:"appliedOverrides,omitempty"`

	// diagnose tracks adaptive fault isolation algorithm progress.
	// +optional
	Diagnose *DiagnoseStatus `json:"diagnose,omitempty"`

	// Group phases are reset to Pending at the start of each new iteration.
	// +optional
	Groups []GroupStatus `json:"groups,omitempty"`
}

OrchestrationStatus tracks the state of orchestration execution.

func (*OrchestrationStatus) DeepCopy

func (in *OrchestrationStatus) DeepCopy() *OrchestrationStatus

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

func (*OrchestrationStatus) DeepCopyInto

func (in *OrchestrationStatus) DeepCopyInto(out *OrchestrationStatus)

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

type OverrideSpec

type OverrideSpec struct {
	// when defines conditions for applying this override.
	// +kubebuilder:validation:Required
	When WhenSpec `json:"when"`

	// jobTemplate is a strategic merge patch applied to the base jobTemplate.
	// Maps merge recursively, named arrays (e.g., env vars) merge by key,
	// unnamed arrays (e.g., args) replace entirely.
	// Stored as raw JSON to avoid CRD validation cost budget issues.
	// +optional
	// +kubebuilder:pruning:PreserveUnknownFields
	// +kubebuilder:validation:Schemaless
	JobTemplate *apiextensionsv1.JSON `json:"jobTemplate,omitempty"`

	// jobTemplatePatch is an RFC 6902 JSON Patch applied to the base jobTemplate.
	// Use for precise operations: remove specific env vars, add at index,
	// test a value before patching (preconditions).
	// Applied AFTER the jobTemplate strategic merge patch.
	// +optional
	// +kubebuilder:pruning:PreserveUnknownFields
	// +kubebuilder:validation:Schemaless
	JobTemplatePatch *apiextensionsv1.JSON `json:"jobTemplatePatch,omitempty"`

	// dependencies are additional dependencies appended when this override matches.
	// +optional
	Dependencies []DependencySpec `json:"dependencies,omitempty"`

	// orchestration overrides orchestration settings (target, topology, execution, iterations).
	// Non-nil fields replace the base value; nil fields are preserved.
	// +optional
	Orchestration *OrchestrationOverrideSpec `json:"orchestration,omitempty"`
}

OverrideSpec defines a conditional patch to the base WorkflowSpec.

func (*OverrideSpec) DeepCopy

func (in *OverrideSpec) DeepCopy() *OverrideSpec

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

func (*OverrideSpec) DeepCopyInto

func (in *OverrideSpec) DeepCopyInto(out *OverrideSpec)

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

type PendingInterruptionStatus

type PendingInterruptionStatus struct {
	// tCheckpoint is the time of the last checkpoint before the interruption.
	// +optional
	TCheckpoint *metav1.Time `json:"tCheckpoint,omitempty"`

	// tInterrupt is the time the job was interrupted (workload failure time).
	// +optional
	TInterrupt *metav1.Time `json:"tInterrupt,omitempty"`

	// checkpointStep is the step number of the last saved checkpoint before interruption.
	// +optional
	CheckpointStep int `json:"checkpointStep,omitempty"`

	// lastStep is the last training step observed before interruption.
	// +optional
	LastStep int `json:"lastStep,omitempty"`

	// tCh is the lost work time in seconds (time between last checkpoint and interruption).
	// +optional
	TCh string `json:"tCh,omitempty"`

	// reason is the reason for the interruption.
	// +optional
	Reason string `json:"reason,omitempty"`
}

PendingInterruptionStatus stores an in-progress interruption event that hasn't been completed by a job restart yet. Persisted so state survives controller restarts.

func (*PendingInterruptionStatus) DeepCopy

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

func (*PendingInterruptionStatus) DeepCopyInto

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

type PerformanceValidationSpec

type PerformanceValidationSpec struct {
	// enabled determines if performance validation is active.
	// +kubebuilder:default=false
	Enabled bool `json:"enabled"`

	// plugin is the name of the benchmark plugin to use.
	// Examples: "nemo-training", "nccl-tests"
	// +optional
	Plugin string `json:"plugin,omitempty"`

	// config contains plugin-specific configuration parameters.
	// +optional
	// +kubebuilder:pruning:PreserveUnknownFields
	// +kubebuilder:validation:Schemaless
	Config *apiextensionsv1.JSON `json:"config,omitempty"`

	// tracking defines what results to track.
	// +optional
	Tracking TrackingSpec `json:"tracking,omitempty"`

	// thresholds defines minimum acceptable performance thresholds.
	// When set, the Workflow controller propagates these to each Job's
	// measurement configs during creation. The Job controller evaluates
	// them after the workload succeeds and sets the ValidationFailed
	// condition if any threshold is not met.
	// +optional
	Thresholds *ThresholdSpec `json:"thresholds,omitempty"`

	// measurementTimeout is the maximum time to wait after a Job succeeds for
	// measurement data before failing threshold validation. Propagated to each
	// Job's spec during creation.
	// +optional
	MeasurementTimeout *metav1.Duration `json:"measurementTimeout,omitempty"`
}

PerformanceValidationSpec defines performance validation configuration.

func (*PerformanceValidationSpec) DeepCopy

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

func (*PerformanceValidationSpec) DeepCopyInto

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

type StringMatchSpec

type StringMatchSpec struct {
	// equals checks for exact match.
	// +optional
	Equals string `json:"equals,omitempty"`

	// in checks if value is in the list.
	// +optional
	In []string `json:"in,omitempty"`

	// notIn checks if value is not in the list.
	// +optional
	NotIn []string `json:"notIn,omitempty"`
}

StringMatchSpec defines string matching criteria.

func (*StringMatchSpec) DeepCopy

func (in *StringMatchSpec) DeepCopy() *StringMatchSpec

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

func (*StringMatchSpec) DeepCopyInto

func (in *StringMatchSpec) DeepCopyInto(out *StringMatchSpec)

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

type TaintSelector

type TaintSelector struct {
	// key is the taint key to match.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Key string `json:"key"`

	// value is the taint value to match. If empty, matches any value.
	// +optional
	Value string `json:"value,omitempty"`

	// effect is the taint effect to match (NoSchedule, PreferNoSchedule, NoExecute).
	// If empty, matches any effect.
	// +optional
	Effect corev1.TaintEffect `json:"effect,omitempty"`
}

TaintSelector selects nodes by taint.

func (*TaintSelector) DeepCopy

func (in *TaintSelector) DeepCopy() *TaintSelector

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

func (*TaintSelector) DeepCopyInto

func (in *TaintSelector) DeepCopyInto(out *TaintSelector)

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

type TargetSpec

type TargetSpec struct {
	// nodeSelector selects nodes by label key-value pairs.
	// +optional
	NodeSelector map[string]string `json:"nodeSelector,omitempty"`

	// matchExpressions is a list of node selector requirements.
	// Supports In, NotIn, Exists, DoesNotExist operators.
	// All expressions must match (AND with nodeSelector).
	// +optional
	MatchExpressions []corev1.NodeSelectorRequirement `json:"matchExpressions,omitempty"`

	// nodeNames explicitly lists nodes to include.
	// If specified, nodeSelector is ignored.
	// +optional
	NodeNames []string `json:"nodeNames,omitempty"`

	// taintSelectors selects nodes that have ALL matching taints.
	// A node must have every taint in this list to be included.
	//
	// The controller auto-injects matching tolerations onto the workload pods so
	// they can schedule onto the selected tainted nodes. Setting this field is
	// the supported way to run training workloads (e.g. TrainJob) on tainted
	// nodes. When taintSelectors is set, the explicit tolerations replace the
	// blanket Operator: Exists toleration that MPI workloads (NCCL tests)
	// otherwise receive — declared selectors always win.
	// +optional
	TaintSelectors []TaintSelector `json:"taintSelectors,omitempty"`
}

TargetSpec specifies which nodes to include in orchestration.

func (*TargetSpec) DeepCopy

func (in *TargetSpec) DeepCopy() *TargetSpec

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

func (*TargetSpec) DeepCopyInto

func (in *TargetSpec) DeepCopyInto(out *TargetSpec)

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

type ThresholdSpec

type ThresholdSpec struct {
	// thresholds maps metric names to CEL expressions.
	// +optional
	Thresholds map[string]string `json:"thresholds,omitempty"`
}

ThresholdSpec defines performance thresholds as CEL expressions. These are propagated by the Workflow controller to each Job's measurement configs during Job creation. The Job controller evaluates them after workload success and sets the ValidationFailed condition if any threshold is violated.

Keys are standardized metric names (e.g., "busBandwidthGBps", "goodputRatio"). Values are CEL expressions using a `value` variable (float64). Example: {"busBandwidthGBps": "value >= 900", "avgStepTimeSec": "value <= 3.0"}

func (*ThresholdSpec) DeepCopy

func (in *ThresholdSpec) DeepCopy() *ThresholdSpec

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

func (*ThresholdSpec) DeepCopyInto

func (in *ThresholdSpec) DeepCopyInto(out *ThresholdSpec)

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

type TimestampSpec

type TimestampSpec struct {
	// layout is the Go time layout string for parsing (?P<timestamp>...) captures.
	// Examples: "2006-01-02T15:04:05.999999999Z" (NeMo/RFC3339),
	//           "2006-01-02 15:04:05.999999" (Megatron bracketed)
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Layout string `json:"layout"`
}

TimestampSpec configures timestamp parsing for captured (?P<timestamp>...) groups.

Timestamp Resolution Strategy

Pod logs are always read with Timestamps: true, so every line has a K8s RFC3339 prefix: "2026-02-05T15:30:00.123456Z <content>"

For each matched event:

  1. If the regex captures (?P<timestamp>...), parse it using Layout
  2. Otherwise, use the K8s RFC3339 prefix (always available)

For "last log timestamp" tracking (failure time detection):

  • The K8s RFC3339 prefix is extracted from every line regardless of pattern match

func (*TimestampSpec) DeepCopy

func (in *TimestampSpec) DeepCopy() *TimestampSpec

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

func (*TimestampSpec) DeepCopyInto

func (in *TimestampSpec) DeepCopyInto(out *TimestampSpec)

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

type TopologyMatchSpec

type TopologyMatchSpec struct {
	// mode matches against topology mode.
	// Examples: "single-rack", "multi-rack", "multi-zone"
	// +optional
	Mode string `json:"mode,omitempty"`

	// domainCount matches against the number of topology domains (racks, zones, etc.).
	// +optional
	DomainCount *IntMatchSpec `json:"domainCount,omitempty"`
}

TopologyMatchSpec defines topology matching criteria.

func (*TopologyMatchSpec) DeepCopy

func (in *TopologyMatchSpec) DeepCopy() *TopologyMatchSpec

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

func (*TopologyMatchSpec) DeepCopyInto

func (in *TopologyMatchSpec) DeepCopyInto(out *TopologyMatchSpec)

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

type TopologySpec

type TopologySpec struct {
	// topologyKey is the node label key that identifies the topology domain.
	// Examples: "nvidia.com/gpu.clique", "topology.kubernetes.io/zone"
	// Nodes with the same label value are in the same domain (rack/zone).
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	TopologyKey string `json:"topologyKey"`

	// strictDomain creates one group per topology domain at its natural size.
	// Groups never cross domain boundaries. Set by testScale=intra-rack.
	// +optional
	StrictDomain bool `json:"strictDomain,omitempty"`
}

TopologySpec configures topology-aware placement.

func (*TopologySpec) DeepCopy

func (in *TopologySpec) DeepCopy() *TopologySpec

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

func (*TopologySpec) DeepCopyInto

func (in *TopologySpec) DeepCopyInto(out *TopologySpec)

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

type TorchFramework

type TorchFramework struct {
	// script is the path to run (torchrun <script>).
	// Mutually exclusive with module.
	// +optional
	// +kubebuilder:validation:MinLength=1
	Script string `json:"script,omitempty"`

	// module is the Python module to run (torchrun -m <module>).
	// Mutually exclusive with script.
	// +optional
	// +kubebuilder:validation:MinLength=1
	Module string `json:"module,omitempty"`

	// args are additional arguments passed to the script or module.
	// +optional
	Args []string `json:"args,omitempty"`
}

TorchFramework configures distributed training via torchrun.

+kubebuilder:validation:XValidation:rule="!(has(self.script) && has(self.module))",message="script and module are mutually exclusive" +kubebuilder:validation:XValidation:rule="has(self.script) || has(self.module)",message="either script or module must be set"

func (*TorchFramework) DeepCopy

func (in *TorchFramework) DeepCopy() *TorchFramework

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

func (*TorchFramework) DeepCopyInto

func (in *TorchFramework) DeepCopyInto(out *TorchFramework)

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

type TrackingSpec

type TrackingSpec struct {
	// perNode tracks results for each individual node.
	// +kubebuilder:default=false
	// +optional
	PerNode bool `json:"perNode,omitempty"`

	// perDomain tracks aggregated results per topology domain.
	// Domains are defined by the topology key in orchestration.
	// For example, if using "nvidia.com/gpu.clique", results
	// are aggregated per unique clique value.
	// +kubebuilder:default=false
	// +optional
	PerDomain bool `json:"perDomain,omitempty"`
}

TrackingSpec defines what results to track.

func (*TrackingSpec) DeepCopy

func (in *TrackingSpec) DeepCopy() *TrackingSpec

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

func (*TrackingSpec) DeepCopyInto

func (in *TrackingSpec) DeepCopyInto(out *TrackingSpec)

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

type ValidationSpec

type ValidationSpec struct {
	// performance configures performance validation and metrics collection.
	// +optional
	Performance *PerformanceValidationSpec `json:"performance,omitempty"`
}

ValidationSpec defines performance validation and metrics collection.

func (*ValidationSpec) DeepCopy

func (in *ValidationSpec) DeepCopy() *ValidationSpec

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

func (*ValidationSpec) DeepCopyInto

func (in *ValidationSpec) DeepCopyInto(out *ValidationSpec)

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

type WhenSpec

type WhenSpec struct {
	// gpuArchitecture matches against detected GPU architecture.
	// +optional
	GPUArchitecture *StringMatchSpec `json:"gpuArchitecture,omitempty"`

	// platform matches against detected cloud platform.
	// +optional
	Platform *StringMatchSpec `json:"platform,omitempty"`

	// workloadKind matches against the workload kind.
	// Example: "TrainJob"
	// +optional
	WorkloadKind string `json:"workloadKind,omitempty"`

	// topology matches against cluster topology characteristics.
	// +optional
	Topology *TopologyMatchSpec `json:"topology,omitempty"`

	// config matches against values in validation.performance.config.
	// +optional
	// +kubebuilder:pruning:PreserveUnknownFields
	// +kubebuilder:validation:Schemaless
	Config *apiextensionsv1.JSON `json:"config,omitempty"`

	// expression is a CEL expression that evaluates to a boolean.
	// Available variables: gpuArchitecture, platform, workloadKind, topology, config
	// Example: "gpuArchitecture == 'gb200' && platform == 'aws'"
	// +optional
	Expression string `json:"expression,omitempty"`
}

WhenSpec defines conditions for conditional resource creation.

func (*WhenSpec) DeepCopy

func (in *WhenSpec) DeepCopy() *WhenSpec

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

func (*WhenSpec) DeepCopyInto

func (in *WhenSpec) DeepCopyInto(out *WhenSpec)

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

type WorkerStrategySpec

type WorkerStrategySpec struct {
	// type determines the log reading strategy.
	// "Single": read all data from worker-0.
	// "Multi": read lifecycle data from one pod, training steps from another.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Enum=Single;Multi
	Type string `json:"type"`

	// lifecyclePod specifies which worker has lifecycle data (checkpoints, app start).
	// "first" (worker-0) or "last" (highest index). Default: "first".
	// Only used when type is "Multi".
	// +kubebuilder:validation:Enum=first;last
	// +kubebuilder:default=first
	// +optional
	LifecyclePod string `json:"lifecyclePod,omitempty"`

	// trainingStepPod specifies which worker has training step data (iterations, metrics).
	// "first" or "last". Default: "first".
	// Only used when type is "Multi".
	// +kubebuilder:validation:Enum=first;last
	// +kubebuilder:default=first
	// +optional
	TrainingStepPod string `json:"trainingStepPod,omitempty"`

	// replicatedJobName selects which JobSet replicatedJob to read logs from.
	// For MPI workloads, set to "launcher" (output goes to the launcher pod).
	// For torch workloads, use the default "trainer".
	// Only applies to TrainJob workloads that use JobSet.
	// +kubebuilder:default=trainer
	// +optional
	ReplicatedJobName string `json:"replicatedJobName,omitempty"`
}

WorkerStrategySpec defines how to read logs from multi-worker jobs.

func (*WorkerStrategySpec) DeepCopy

func (in *WorkerStrategySpec) DeepCopy() *WorkerStrategySpec

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

func (*WorkerStrategySpec) DeepCopyInto

func (in *WorkerStrategySpec) DeepCopyInto(out *WorkerStrategySpec)

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

type Workflow

type Workflow struct {
	metav1.TypeMeta `json:",inline"`

	// metadata is a standard object metadata
	// +optional
	metav1.ObjectMeta `json:"metadata,omitzero"`

	// spec defines the desired state of Workflow
	// +required
	Spec WorkflowSpec `json:"spec"`

	// status defines the observed state of Workflow
	// +optional
	Status WorkflowStatus `json:"status,omitzero"`
}

Workflow is the Schema for the workflows API

func (*Workflow) DeepCopy

func (in *Workflow) DeepCopy() *Workflow

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

func (*Workflow) DeepCopyInto

func (in *Workflow) DeepCopyInto(out *Workflow)

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

func (*Workflow) DeepCopyObject

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

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

type WorkflowList

type WorkflowList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitzero"`
	Items           []Workflow `json:"items"`
}

WorkflowList contains a list of Workflow

func (*WorkflowList) DeepCopy

func (in *WorkflowList) DeepCopy() *WorkflowList

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

func (*WorkflowList) DeepCopyInto

func (in *WorkflowList) DeepCopyInto(out *WorkflowList)

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

func (*WorkflowList) DeepCopyObject

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

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

type WorkflowReference

type WorkflowReference struct {
	// name is the name of the Workflow resource.
	Name string `json:"name"`

	// namespace is the namespace of the Workflow resource.
	// +optional
	Namespace string `json:"namespace,omitempty"`
}

WorkflowReference references a Workflow resource created by the Certification.

func (*WorkflowReference) DeepCopy

func (in *WorkflowReference) DeepCopy() *WorkflowReference

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

func (*WorkflowReference) DeepCopyInto

func (in *WorkflowReference) DeepCopyInto(out *WorkflowReference)

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

type WorkflowSpec

type WorkflowSpec struct {
	// namespace is the target namespace for Jobs and dependencies created by this Workflow.
	// If not specified, the controller auto-generates one.
	// The controller creates the namespace if it doesn't exist and sets an owner reference
	// so it's cleaned up when the Workflow is deleted.
	// +optional
	Namespace string `json:"namespace,omitempty"`

	// jobTemplate defines the Job template used to create Jobs for each execution group.
	// +kubebuilder:validation:Required
	JobTemplate JobTemplateSpec `json:"jobTemplate"`

	// orchestration defines topology-aware orchestration strategy.
	// +kubebuilder:validation:Required
	Orchestration OrchestrationSpec `json:"orchestration"`

	// dependencies are resources required for the workload (ComputeDomain, etc.)
	// Resources are conditionally created based on "when" clauses.
	// +optional
	Dependencies []DependencySpec `json:"dependencies,omitempty"`

	// overrides defines conditional patches to the base spec.
	// Overrides are evaluated in order; all matching overrides are applied sequentially.
	// +optional
	Overrides []OverrideSpec `json:"overrides,omitempty"`

	// validation defines performance validation and metrics collection.
	// +optional
	Validation *ValidationSpec `json:"validation,omitempty"`
}

WorkflowSpec defines the desired state of Workflow.

func (*WorkflowSpec) DeepCopy

func (in *WorkflowSpec) DeepCopy() *WorkflowSpec

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

func (*WorkflowSpec) DeepCopyInto

func (in *WorkflowSpec) DeepCopyInto(out *WorkflowSpec)

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

type WorkflowStatus

type WorkflowStatus struct {
	// conditions represent the current state of the Workflow resource.
	//
	// Condition types:
	// - "InProgress": the Workflow is currently running
	// - "Succeeded": the Workflow completed successfully
	// - "Failed": the Workflow has failed
	//
	// The status of each condition is one of True, False, or Unknown.
	// +listType=map
	// +listMapKey=type
	// +optional
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// namespace is the resolved namespace where Jobs and dependencies are created.
	// +optional
	Namespace string `json:"namespace,omitempty"`

	// succeededNodesRef references the ConfigMap holding this Workflow's
	// succeeded-nodes list (comma-separated node names). It is written on terminal
	// success and on terminal failure (capturing the nodes that passed).
	// +optional
	SucceededNodesRef *corev1.TypedLocalObjectReference `json:"succeededNodesRef,omitempty"`

	// failedNodesRef references the ConfigMap holding this Workflow's failed-nodes
	// list (name, reason, message). It is written incrementally as Jobs
	// fail.
	// +optional
	FailedNodesRef *corev1.TypedLocalObjectReference `json:"failedNodesRef,omitempty"`

	// dependencyRefs lists the dependency resources created by this Workflow.
	// +optional
	DependencyRefs []DependencyResourceRef `json:"dependencyRefs,omitempty"`

	// orchestration contains the state of orchestration execution.
	// +optional
	Orchestration *OrchestrationStatus `json:"orchestration,omitempty"`

	// nodeResults contains per-node performance metrics.
	// Only populated when spec.validation.performance.tracking.perNode is true.
	// +optional
	NodeResults map[string]NodeResult `json:"nodeResults,omitempty"`

	// domainResults contains aggregated metrics grouped by topology domain values.
	// Key is the domain value (e.g., "clique-0", "rack-1", "zone-a").
	// Only populated when spec.validation.performance.tracking.perDomain is true.
	// +optional
	DomainResults map[string]DomainResult `json:"domainResults,omitempty"`
}

WorkflowStatus defines the observed state of Workflow.

func (*WorkflowStatus) DeepCopy

func (in *WorkflowStatus) DeepCopy() *WorkflowStatus

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

func (*WorkflowStatus) DeepCopyInto

func (in *WorkflowStatus) DeepCopyInto(out *WorkflowStatus)

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

type WorkloadConfig

type WorkloadConfig struct {
	// inline specifies config data as key-value pairs (filename -> content).
	// Creates a ConfigMap and mounts it at /config.
	// +optional
	Inline map[string]string `json:"inline,omitempty"`

	// configMapRef references an existing ConfigMap by name.
	// Mounted at /config.
	// +optional
	ConfigMapRef *corev1.LocalObjectReference `json:"configMapRef,omitempty"`
}

WorkloadConfig provides model configuration data to the workload.

+kubebuilder:validation:XValidation:rule="!(has(self.inline) && has(self.configMapRef))",message="inline and configMapRef are mutually exclusive"

func (*WorkloadConfig) DeepCopy

func (in *WorkloadConfig) DeepCopy() *WorkloadConfig

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

func (*WorkloadConfig) DeepCopyInto

func (in *WorkloadConfig) DeepCopyInto(out *WorkloadConfig)

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

type WorkloadOrchestration

type WorkloadOrchestration struct {
	// testScale controls the node grouping strategy.
	//   - "intra-node": each node tested independently (numNodes=1 per job)
	//   - "intra-rack": one job per topology domain (nvidia.com/gpu.clique)
	//   - "full-scale": all nodes in a single group (default)
	// +optional
	// +kubebuilder:validation:Enum=intra-node;intra-rack;full-scale
	TestScale string `json:"testScale,omitempty"`

	// repeatCount runs the entire orchestration N times. Default: 1.
	// +optional
	// +kubebuilder:validation:Minimum=1
	RepeatCount *int32 `json:"repeatCount,omitempty"`

	// maxConcurrent limits the number of simultaneously running jobs.
	// 0 means unlimited. Default: 0.
	// +optional
	// +kubebuilder:validation:Minimum=0
	MaxConcurrent *int32 `json:"maxConcurrent,omitempty"`

	// timeoutPerJob is the maximum time to wait for each job to complete.
	// Accepts Go duration strings (e.g., "30m", "1h"). Default: "1h".
	// +optional
	TimeoutPerJob string `json:"timeoutPerJob,omitempty"`
}

WorkloadOrchestration controls how nodes are grouped and tested.

func (*WorkloadOrchestration) DeepCopy

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

func (*WorkloadOrchestration) DeepCopyInto

func (in *WorkloadOrchestration) DeepCopyInto(out *WorkloadOrchestration)

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

type WorkloadReference

type WorkloadReference struct {
	// apiVersion is the API version of the workload resource.
	// +kubebuilder:validation:Required
	APIVersion string `json:"apiVersion"`

	// kind is the kind of the workload resource.
	// +kubebuilder:validation:Required
	Kind string `json:"kind"`

	// name is the name of the workload resource.
	// +kubebuilder:validation:Required
	Name string `json:"name"`

	// namespace is the namespace of the workload resource.
	// If not specified, defaults to the Job's namespace.
	// +optional
	Namespace string `json:"namespace,omitempty"`
}

WorkloadReference references a workload resource.

func (*WorkloadReference) DeepCopy

func (in *WorkloadReference) DeepCopy() *WorkloadReference

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

func (*WorkloadReference) DeepCopyInto

func (in *WorkloadReference) DeepCopyInto(out *WorkloadReference)

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

type WorkloadRun

type WorkloadRun struct {
	metav1.TypeMeta `json:",inline"`

	// metadata is a standard object metadata
	// +optional
	metav1.ObjectMeta `json:"metadata,omitzero"`

	// spec defines the desired state of WorkloadRun.
	// The entire spec is immutable after creation: once status.workflowRef is
	// set the controller only mirrors the existing Workflow and never rebuilds
	// it, so accepting edits would silently ignore them. To run with different
	// inputs, delete the WorkloadRun and create a new one.
	// +required
	// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="spec is immutable after creation"
	Spec WorkloadRunSpec `json:"spec"`

	// status defines the observed state of WorkloadRun
	// +optional
	Status WorkloadRunStatus `json:"status,omitzero"`
}

WorkloadRun is the Schema for the workloadruns API. It provides a simplified interface for running training, MPI, or arbitrary workloads on GPU clusters with automatic CSP and GPU architecture adaptation.

func (*WorkloadRun) DeepCopy

func (in *WorkloadRun) DeepCopy() *WorkloadRun

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

func (*WorkloadRun) DeepCopyInto

func (in *WorkloadRun) DeepCopyInto(out *WorkloadRun)

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

func (*WorkloadRun) DeepCopyObject

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

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

type WorkloadRunCheckpoint

type WorkloadRunCheckpoint struct {
	// storageSize is the PVC size (e.g., "10Ti", "500Gi").
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=`^([0-9]+(\.[0-9]+)?)(Ki|Mi|Gi|Ti|Pi|Ei)?$`
	StorageSize string `json:"storageSize"`

	// storageClassName is the StorageClass to use. Defaults to cluster default.
	// +optional
	StorageClassName *string `json:"storageClassName,omitempty"`

	// maxRestarts is how many times to restart from checkpoint on failure.
	// Default: 0.
	// +optional
	// +kubebuilder:validation:Minimum=0
	MaxRestarts *int32 `json:"maxRestarts,omitempty"`
}

WorkloadRunCheckpoint configures checkpoint storage for the workload.

func (*WorkloadRunCheckpoint) DeepCopy

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

func (*WorkloadRunCheckpoint) DeepCopyInto

func (in *WorkloadRunCheckpoint) DeepCopyInto(out *WorkloadRunCheckpoint)

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

type WorkloadRunList

type WorkloadRunList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitzero"`
	Items           []WorkloadRun `json:"items"`
}

WorkloadRunList contains a list of WorkloadRun

func (*WorkloadRunList) DeepCopy

func (in *WorkloadRunList) DeepCopy() *WorkloadRunList

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

func (*WorkloadRunList) DeepCopyInto

func (in *WorkloadRunList) DeepCopyInto(out *WorkloadRunList)

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

func (*WorkloadRunList) DeepCopyObject

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

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

type WorkloadRunSpec

type WorkloadRunSpec struct {
	// target specifies which nodes to run the workload on.
	// When omitted, all GPU nodes (nvidia.com/gpu.present=true) are selected.
	// GPU architecture and CSP platform are auto-detected from target nodes.
	// +optional
	Target *TargetSpec `json:"target,omitempty"`

	// image is the container image for the workload.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MinLength=1
	Image string `json:"image"`

	// framework specifies how to run the workload.
	// Exactly one of torch, mpi, or exec must be set.
	// +kubebuilder:validation:Required
	Framework FrameworkSpec `json:"framework"`

	// numNodes is the number of nodes to use for the workload.
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Minimum=1
	NumNodes int32 `json:"numNodes"`

	// config provides model configuration data.
	// When inline is specified, a ConfigMap is created and mounted at /config.
	// When configMapRef is specified, the referenced ConfigMap is mounted at /config.
	// +optional
	Config *WorkloadConfig `json:"config,omitempty"`

	// gpusPerNode overrides the auto-detected GPU count per node.
	// If not specified, derived from GPU architecture (8 for H100/A100, 4 for GB200/GB300).
	// +optional
	// +kubebuilder:validation:Minimum=1
	GpusPerNode *int32 `json:"gpusPerNode,omitempty"`

	// mlnxPerNode overrides the auto-detected Mellanox NIC count per node.
	// Used by platforms with InfiniBand or RoCE networking (Azure, OCI, TogetherAI).
	// If not specified, derived from GPU architecture and platform via the
	// catalog's gpu-defaults.yaml.
	// +optional
	// +kubebuilder:validation:Minimum=0
	MlnxPerNode *int32 `json:"mlnxPerNode,omitempty"`

	// imagePullSecrets references secrets for pulling the container image.
	// +optional
	ImagePullSecrets []corev1.LocalObjectReference `json:"imagePullSecrets,omitempty"`

	// env specifies additional environment variables for the workload container.
	// These are merged with auto-detected NCCL/platform env vars.
	// User-specified values take precedence over auto-detected values.
	// +optional
	Env []corev1.EnvVar `json:"env,omitempty"`

	// volumes defines additional volumes for the workload pods.
	// A shared-memory volume (/dev/shm) is always auto-created.
	// +optional
	Volumes []corev1.Volume `json:"volumes,omitempty"`

	// volumeMounts defines additional volume mounts for the workload container.
	// +optional
	VolumeMounts []corev1.VolumeMount `json:"volumeMounts,omitempty"`

	// enableMNNVL explicitly controls Multi-Node NVLink (NCCL_MNNVL_ENABLE).
	// If nil, auto-detected from GPU architecture (enabled for GB200/GB300).
	// +optional
	EnableMNNVL *bool `json:"enableMNNVL,omitempty"`

	// checkpoint configures checkpoint storage. When set, provisions a PVC
	// and enables checkpoint-based restart.
	// +optional
	Checkpoint *WorkloadRunCheckpoint `json:"checkpoint,omitempty"`

	// resources overrides GPU/memory/CPU resource requests and limits for the
	// workload container. If not specified, GPU resources are auto-set from gpusPerNode.
	// +optional
	Resources *corev1.ResourceRequirements `json:"resources,omitempty"`

	// initContainers specifies init containers to run before the workload.
	// +optional
	InitContainers []corev1.Container `json:"initContainers,omitempty"`

	// orchestration controls how nodes are grouped and tested.
	// +optional
	Orchestration *WorkloadOrchestration `json:"orchestration,omitempty"`

	// thresholds defines performance pass/fail criteria as CEL expressions.
	// Keys are metric names (e.g., "busBandwidthGBps", "avgTFLOPsPerGPU").
	// Values are CEL expressions using a `value` variable (e.g., "value >= 900").
	// +optional
	Thresholds map[string]string `json:"thresholds,omitempty"`

	// goodputMeasurement enables training goodput tracking.
	// When set, a GoodputMeasurement resource is auto-created for each Job.
	// +optional
	GoodputMeasurement *GoodputMeasurementConfig `json:"goodputMeasurement,omitempty"`

	// bandwidthMeasurement enables NCCL bandwidth tracking.
	// When set, a BandwidthMeasurement resource is auto-created for each Job.
	// +optional
	BandwidthMeasurement *BandwidthMeasurementConfig `json:"bandwidthMeasurement,omitempty"`

	// overrides allows advanced users to inject additional CSP/GPU-specific patches.
	// These are appended to the auto-generated platform overrides on the Workflow.
	// +optional
	Overrides []OverrideSpec `json:"overrides,omitempty"`

	// gangScheduler opts workload pods into a gang-aware scheduler such as KAI Scheduler.
	// When set, schedulerName is injected into every pod template and the queue label
	// is applied so the scheduler holds all pods until the full gang can be placed.
	// +optional
	GangScheduler *GangSchedulerSpec `json:"gangScheduler,omitempty"`
}

WorkloadRunSpec defines the desired state of WorkloadRun.

func (*WorkloadRunSpec) DeepCopy

func (in *WorkloadRunSpec) DeepCopy() *WorkloadRunSpec

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

func (*WorkloadRunSpec) DeepCopyInto

func (in *WorkloadRunSpec) DeepCopyInto(out *WorkloadRunSpec)

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

type WorkloadRunStatus

type WorkloadRunStatus struct {
	// conditions represent the current state of the WorkloadRun.
	// +listType=map
	// +listMapKey=type
	// +optional
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// workflowRef references the Workflow created by this WorkloadRun.
	// +optional
	WorkflowRef *WorkflowReference `json:"workflowRef,omitempty"`

	// detectedPlatform is the auto-detected CSP platform (e.g., "aws", "gcp", "azure").
	// +optional
	DetectedPlatform string `json:"detectedPlatform,omitempty"`

	// detectedGPUArchitecture is the auto-detected GPU type (e.g., "h100", "gb200").
	// +optional
	DetectedGPUArchitecture string `json:"detectedGPUArchitecture,omitempty"`

	// resolvedGpusPerNode is the final GPU count per node used for the workload.
	// +optional
	ResolvedGpusPerNode int32 `json:"resolvedGpusPerNode,omitempty"`

	// succeededNodesRef references the ConfigMap holding the underlying Workflow's
	// succeeded-nodes list (comma-separated node names).
	// +optional
	SucceededNodesRef *corev1.TypedLocalObjectReference `json:"succeededNodesRef,omitempty"`

	// failedNodesRef references the ConfigMap holding the underlying Workflow's
	// failed-nodes list (name, reason, message).
	// +optional
	FailedNodesRef *corev1.TypedLocalObjectReference `json:"failedNodesRef,omitempty"`
}

WorkloadRunStatus defines the observed state of WorkloadRun.

func (*WorkloadRunStatus) DeepCopy

func (in *WorkloadRunStatus) DeepCopy() *WorkloadRunStatus

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

func (*WorkloadRunStatus) DeepCopyInto

func (in *WorkloadRunStatus) DeepCopyInto(out *WorkloadRunStatus)

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

type WorkloadSpec

type WorkloadSpec struct {
	// trainJob configures a Kubeflow TrainJob workload.
	// +optional
	TrainJob *trainerv1alpha1.TrainJobSpec `json:"trainJob,omitempty"`
}

WorkloadSpec is a discriminated union of typed workload specs. Exactly one field must be set. +kubebuilder:validation:MinProperties=1 +kubebuilder:validation:MaxProperties=1

func (*WorkloadSpec) DeepCopy

func (in *WorkloadSpec) DeepCopy() *WorkloadSpec

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

func (*WorkloadSpec) DeepCopyInto

func (in *WorkloadSpec) DeepCopyInto(out *WorkloadSpec)

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