Documentation
¶
Overview ¶
Package v1alpha1 contains API Schema definitions for the nvcre v1alpha1 API group. +kubebuilder:object:generate=true +groupName=nvcre.nvidia.com
Index ¶
- Constants
- Variables
- func Register(objects ...runtime.Object)
- type AppliedOverride
- type BandwidthMeasurement
- type BandwidthMeasurementConfig
- type BandwidthMeasurementList
- type BandwidthMeasurementSpec
- type BandwidthMeasurementStatus
- type BandwidthResult
- type CELNodeHealthCheck
- type CategoryOptions
- type CategoryResourceList
- type CategoryResources
- type CertificateCategory
- type Certification
- type CertificationCategoryStatus
- type CertificationList
- type CertificationSpec
- type CertificationStatus
- type CheckpointConfig
- type CrossBoundaryProbe
- type CrossBoundaryState
- type DependencyResourceRef
- type DependencySpec
- type DiagnoseSpec
- type DiagnoseStatus
- type DomainResult
- type DomainScreeningResult
- type EventPattern
- type ExecFramework
- type ExecutionSpec
- type FailedNode
- type FailureLog
- type FrameworkSpec
- type GangSchedulerSpec
- type GoodputMeasurement
- type GoodputMeasurementConfig
- type GoodputMeasurementList
- type GoodputMeasurementSpec
- type GoodputMeasurementStatus
- type GroupIterationResult
- type GroupPhase
- type GroupStatus
- type InfrastructureFault
- type IntMatchSpec
- type IterationMetrics
- type IterationResult
- type Job
- type JobList
- type JobSpec
- type JobStatus
- type JobTemplateSpec
- type LogPatternSet
- type LogProfile
- type LogProfileList
- type LogProfileSpec
- type MPIFramework
- type NodeFailureReason
- type NodeHealthMonitor
- type NodeResult
- type OrchestrationOverrideSpec
- type OrchestrationSpec
- type OrchestrationStatus
- type OverrideSpec
- type PendingInterruptionStatus
- type PerformanceValidationSpec
- type StringMatchSpec
- type TaintSelector
- type TargetSpec
- type ThresholdSpec
- type TimestampSpec
- type TopologyMatchSpec
- type TopologySpec
- type TorchFramework
- type TrackingSpec
- type ValidationSpec
- type WhenSpec
- type WorkerStrategySpec
- type Workflow
- type WorkflowList
- type WorkflowReference
- type WorkflowSpec
- type WorkflowStatus
- type WorkloadConfig
- type WorkloadOrchestration
- type WorkloadReference
- type WorkloadRun
- type WorkloadRunCheckpoint
- type WorkloadRunList
- type WorkloadRunSpec
- type WorkloadRunStatus
- type WorkloadSpec
Constants ¶
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.
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.
const ( TestScaleIntraNode = "intra-node" TestScaleIntraRack = "intra-rack" TestScaleDiagnose = "diagnose" TestScaleFullScale = "full-scale" )
TestScale values for orchestration strategy.
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.
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.
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.
const ( DiagnoseStageIntraScreening = "intra-screening" DiagnoseStageIntraScreeningNoNVL = "intra-screening-no-nvl" DiagnoseStageInterScreening = "inter-screening" DiagnoseStageBisection = "bisection" DiagnoseStageConfirmation = "confirmation" DiagnoseStageCrossBoundary = "cross-boundary" DiagnoseStageComplete = "complete" )
Diagnose stage constants.
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 ¶
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 ¶
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 ¶
func (in *BandwidthMeasurement) DeepCopy() *BandwidthMeasurement
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 ¶
func (in *BandwidthMeasurementConfig) DeepCopy() *BandwidthMeasurementConfig
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BandwidthMeasurementConfig.
func (*BandwidthMeasurementConfig) DeepCopyInto ¶
func (in *BandwidthMeasurementConfig) DeepCopyInto(out *BandwidthMeasurementConfig)
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 ¶
func (in *BandwidthMeasurementList) DeepCopy() *BandwidthMeasurementList
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 ¶
func (in *BandwidthMeasurementSpec) DeepCopy() *BandwidthMeasurementSpec
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 ¶
func (in *BandwidthMeasurementStatus) DeepCopy() *BandwidthMeasurementStatus
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BandwidthMeasurementStatus.
func (*BandwidthMeasurementStatus) DeepCopyInto ¶
func (in *BandwidthMeasurementStatus) DeepCopyInto(out *BandwidthMeasurementStatus)
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"`
// nicResourceName sets the Kubernetes extended resource name of the RDMA
// NIC devices requested on workload containers for on-prem GB200/GB300
// targets (e.g., "rdma/ib", "nvidia.com/mlnxnics"); the name depends on
// the RDMA device plugin the site runs, and the per-container count
// comes from mlnxPerNode. When unset, the controller auto-detects the
// name on on-prem GB200/GB300 targets: a single candidate resource
// (rdma/* or nvidia.com/mlnxnics) allocatable at the resolved
// mlnxPerNode count on every target node is requested; zero or several
// qualifying candidates inject nothing and emit a NICResourceDetection
// event explaining what was found. Offline nvcrectl render (without
// --dry-run) has no cluster to inspect and uses only this field. The
// value must be a fully qualified extended resource name: a
// DNS-subdomain domain, a slash, and a name segment of at most 63
// characters; the reserved kubernetes.io and k8s.io domains (including
// their subdomains) are rejected, matching what Kubernetes accepts as an
// extended resource.
// +optional
// +kubebuilder:validation:MaxLength=253
// +kubebuilder:validation:Pattern=`^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/[a-zA-Z0-9]([-A-Za-z0-9_.]{0,61}[a-zA-Z0-9])?$`
// +kubebuilder:validation:XValidation:rule="!self.contains('kubernetes.io/') && !self.startsWith('k8s.io/') && !self.contains('.k8s.io/')",message="nicResourceName must not use the reserved kubernetes.io or k8s.io domains"
NicResourceName *string `json:"nicResourceName,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"`
// image overrides the workload container image for catalog workloads.
// It replaces the trainer image in the rendered job template, the image
// of the primary workload container of every replicated job in the
// resolved TrainingRuntime dependencies, and the image of every init
// container in those pods whose image exactly equals the primary's
// pre-override image (the workload-derived inits such as
// fix-ssh-permissions and megatron-clone); init containers with a
// distinct image (such as GCP's tcpxo-daemon) and any additional
// containers keep their catalog images. Applied after catalog and
// platform overrides resolve, so it also replaces an image a platform
// override selects. Beware: on AWS EFA platforms (H100, GB200) the
// platform overrides land the workers on an nccl-tests image that ships
// the aws-ofi-nccl (EFA) plugin; setting image replaces that image, and
// the operator then owns the EFA OFI plugin being present in the
// replacement.
// +optional
// +kubebuilder:validation:MinLength=1
// +kubebuilder:validation:MaxLength=512
Image string `json:"image,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"`
// sourceRepo is the Git repository for the source checkout this category
// clones at pod start. Each catalog entry defines what its source is and
// its default upstream; point this at an internal mirror for air-gapped
// or restricted-egress clusters. Entries that clone no source ignore it.
// The URL must use an authenticated remote scheme (https:// or ssh://).
// http:// and git:// are intentionally rejected: the cloned source is
// executed by the workload, and those transports are unauthenticated.
// scp-style git@host:path syntax and file:// are intentionally rejected:
// the contract is a remote git mirror. Non-TLS mirrors and local source
// belong on the pre-seeded checkpoint PVC path or in the workload image
// instead.
// +optional
// +kubebuilder:validation:MaxLength=2048
// +kubebuilder:validation:Pattern=`^(https|ssh)://[A-Za-z0-9._~:/@%+-]+$`
SourceRepo string `json:"sourceRepo,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 ¶
func (in *CategoryResourceList) DeepCopy() *CategoryResourceList
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 ¶
func (in *CertificationCategoryStatus) DeepCopy() *CertificationCategoryStatus
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CertificationCategoryStatus.
func (*CertificationCategoryStatus) DeepCopyInto ¶
func (in *CertificationCategoryStatus) DeepCopyInto(out *CertificationCategoryStatus)
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"`
// gangScheduler opts every category's workload pods into a gang-aware
// scheduler such as KAI Scheduler. When set, schedulerName is injected into
// every pod template of every category's resolved TrainingRuntime and the
// queue label is applied, so the scheduler holds all pods until the full
// gang can be placed. Applied after catalog and platform overrides resolve,
// so it also replaces the scheduler a catalog entry hardcodes.
// +optional
GangScheduler *GangSchedulerSpec `json:"gangScheduler,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 ¶
func (in *DependencyResourceRef) DeepCopy() *DependencyResourceRef
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 ¶
func (in *DomainScreeningResult) DeepCopy() *DomainScreeningResult
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"`
// queueLabelKey is the label key the queue name is written under, for
// schedulers that read a different label than KAI Scheduler does.
// Defaults to "kai.scheduler/queue" if not specified. Set it to
// "runai/queue" (with schedulerName "runai-scheduler") on clusters running
// the NVIDIA Run:ai platform.
// When non-empty, must be a valid Kubernetes label key (qualified name): an
// optional DNS-subdomain prefix of at most 253 characters followed by "/",
// then a name of at most 63 characters beginning and ending with an
// alphanumeric character and containing only alphanumerics, hyphens,
// underscores, or dots.
// +optional
// +kubebuilder:validation:MaxLength=317
// +kubebuilder:validation:Pattern=`^$|^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?[a-zA-Z0-9]([-a-zA-Z0-9_.]{0,61}[a-zA-Z0-9])?$`
// +kubebuilder:validation:XValidation:rule="self.contains('/') ? self.split('/')[0].size() <= 253 : true",message="queueLabelKey prefix must be at most 253 characters"
QueueLabelKey string `json:"queueLabelKey,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 ¶
func (in *GoodputMeasurementConfig) DeepCopy() *GoodputMeasurementConfig
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 ¶
func (in *GoodputMeasurementList) DeepCopy() *GoodputMeasurementList
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 ¶
func (in *GoodputMeasurementSpec) DeepCopy() *GoodputMeasurementSpec
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 ¶
func (in *GoodputMeasurementStatus) DeepCopy() *GoodputMeasurementStatus
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 ¶
func (in *GroupIterationResult) DeepCopy() *GroupIterationResult
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Job.
func (*Job) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*Job) DeepCopyObject ¶
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JobList.
func (*JobList) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*JobList) DeepCopyObject ¶
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JobSpec.
func (*JobSpec) DeepCopyInto ¶
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JobStatus.
func (*JobStatus) DeepCopyInto ¶
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 ¶
func (in *OrchestrationOverrideSpec) DeepCopy() *OrchestrationOverrideSpec
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OrchestrationOverrideSpec.
func (*OrchestrationOverrideSpec) DeepCopyInto ¶
func (in *OrchestrationOverrideSpec) DeepCopyInto(out *OrchestrationOverrideSpec)
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 ¶
func (in *PendingInterruptionStatus) DeepCopy() *PendingInterruptionStatus
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PendingInterruptionStatus.
func (*PendingInterruptionStatus) DeepCopyInto ¶
func (in *PendingInterruptionStatus) DeepCopyInto(out *PendingInterruptionStatus)
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 ¶
func (in *PerformanceValidationSpec) DeepCopy() *PerformanceValidationSpec
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PerformanceValidationSpec.
func (*PerformanceValidationSpec) DeepCopyInto ¶
func (in *PerformanceValidationSpec) DeepCopyInto(out *PerformanceValidationSpec)
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. Nodes must also match
// nodeSelector and matchExpressions, if set.
// +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:
- If the regex captures (?P<timestamp>...), parse it using Layout
- 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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WhenSpec.
func (*WhenSpec) DeepCopyInto ¶
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 ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Workflow.
func (*Workflow) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*Workflow) DeepCopyObject ¶
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 ¶
func (in *WorkloadOrchestration) DeepCopy() *WorkloadOrchestration
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 ¶
func (in *WorkloadRunCheckpoint) DeepCopy() *WorkloadRunCheckpoint
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"`
// nicResourceName sets the Kubernetes extended resource name of the RDMA
// NIC devices requested on workload containers for on-prem GB200/GB300
// targets (e.g., "rdma/ib", "nvidia.com/mlnxnics"); the name depends on
// the RDMA device plugin the site runs, and the per-container count
// comes from mlnxPerNode. When unset, the controller auto-detects the
// name on on-prem GB200/GB300 targets: a single candidate resource
// (rdma/* or nvidia.com/mlnxnics) allocatable at the resolved
// mlnxPerNode count on every target node is requested; zero or several
// qualifying candidates inject nothing and emit a NICResourceDetection
// event explaining what was found. Offline nvcrectl render (without
// --dry-run) has no cluster to inspect and uses only this field. The
// value must be a fully qualified extended resource name: a
// DNS-subdomain domain, a slash, and a name segment of at most 63
// characters; the reserved kubernetes.io and k8s.io domains (including
// their subdomains) are rejected, matching what Kubernetes accepts as an
// extended resource.
// +optional
// +kubebuilder:validation:MaxLength=253
// +kubebuilder:validation:Pattern=`^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/[a-zA-Z0-9]([-A-Za-z0-9_.]{0,61}[a-zA-Z0-9])?$`
// +kubebuilder:validation:XValidation:rule="!self.contains('kubernetes.io/') && !self.startsWith('k8s.io/') && !self.contains('.k8s.io/')",message="nicResourceName must not use the reserved kubernetes.io or k8s.io domains"
NicResourceName *string `json:"nicResourceName,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.