> This page is for version dev.
> For other versions, use one of these documentation indexes:
> - Latest (v1.6.1) (default): https://docs.nvidia.com/dynamo/latest/llms.txt
> - dev: https://docs.nvidia.com/dynamo/dev/llms.txt
> - v1.6.1: https://docs.nvidia.com/dynamo/v1.6.1/llms.txt
> - v1.6.0: https://docs.nvidia.com/dynamo/v1.6.0/llms.txt
> - v1.5.1: https://docs.nvidia.com/dynamo/v1.5.1/llms.txt
> - v1.5.0: https://docs.nvidia.com/dynamo/v1.5.0/llms.txt
> - v1.4.2: https://docs.nvidia.com/dynamo/v1.4.2/llms.txt
> - v1.4.1: https://docs.nvidia.com/dynamo/v1.4.1/llms.txt
> - v1.4.0: https://docs.nvidia.com/dynamo/v1.4.0/llms.txt
> - v1.3.0: https://docs.nvidia.com/dynamo/v1.3.0/llms.txt
> - v1.2.1: https://docs.nvidia.com/dynamo/v1.2.1/llms.txt
> - v1.2.0: https://docs.nvidia.com/dynamo/v1.2.0/llms.txt
> - v1.1.1: https://docs.nvidia.com/dynamo/v1.1.1/llms.txt
> - v1.1.0: https://docs.nvidia.com/dynamo/v1.1.0/llms.txt
> - v1.0.2: https://docs.nvidia.com/dynamo/v1.0.2/llms.txt
> - v1.0.1: https://docs.nvidia.com/dynamo/v1.0.1/llms.txt
> - v1.0.0: https://docs.nvidia.com/dynamo/v1.0.0/llms.txt
> - v0.9.1: https://docs.nvidia.com/dynamo/v-0-9-1/llms.txt
> - v0.9.0: https://docs.nvidia.com/dynamo/v-0-9-0/llms.txt
> - v0.8.1: https://docs.nvidia.com/dynamo/v-0-8-1/llms.txt
> - v0.8.0: https://docs.nvidia.com/dynamo/v-0-8-0/llms.txt
> - v0.7.1: https://docs.nvidia.com/dynamo/v-0-7-1/llms.txt
> - v0.7.0: https://docs.nvidia.com/dynamo/v-0-7-0/llms.txt

> For clean Markdown content of this page, append .md to this URL. For the complete documentation index, see https://docs.nvidia.com/dynamo/llms.txt. For full content including API reference and SDK examples, see https://docs.nvidia.com/dynamo/llms-full.txt.

# API Reference

> **Warning**
>
> **Auto-generated from source.** This page is regenerated from the Dynamo operator CRDs by `docs/fern/scripts/gen_kubernetes_api.py` and covers **every** type across all three API packages: the deprecated `nvidia.com/v1alpha1` surface, the supported `nvidia.com/v1beta1` surface, and the operator's own `operator.config.dynamo.nvidia.com/v1alpha1` configuration. The trimmed [DGD](/dynamo/dev/reference/api/kubernetes/dynamo-graph-deployment), [DGDR](/dynamo/dev/reference/api/kubernetes/dynamo-graph-deployment-request), and [DCD](/dynamo/dev/reference/api/kubernetes/dynamo-component-deployment) references cover only user-facing `v1beta1` fields. To edit the surface, change the Go types under `deploy/operator/api/` and let CI regenerate this page.

Dynamo publishes 4 Kubernetes API packages with 219 typed CRD and config sections.

#### [nvidia.com/v1alpha1](#nvidia-com-v1alpha1)

74 types

#### [nvidia.com/v1beta1](#nvidia-com-v1beta1)

76 types

#### [nvidia.com/v1beta2](#nvidia-com-v1beta2)

40 types

#### [operator.config.dynamo.nvidia.com/v1alpha1](#operator-config-dynamo-nvidia-com-v1alpha1)

29 types

## nvidia.com/v1alpha1

Package v1alpha1 contains API Schema definitions for the nvidia.com v1alpha1 API group.

This package defines the DynamoGraphDeploymentRequest (DGDR) custom resource, which provides
a high-level, SLA-driven interface for deploying machine learning models on Dynamo.

Package v1alpha1 contains API Schema definitions for the nvidia.com v1alpha1 API group.

**Resource Types**

#### [DynamoComponentDeployment](#dynamocomponentdeployment)

#### [DynamoGraphDeployment](#dynamographdeployment)

#### [DynamoGraphDeploymentRequest](#dynamographdeploymentrequest)

#### [DynamoGraphDeploymentScalingAdapter](#dynamographdeploymentscalingadapter)

#### [DynamoModel](#dynamomodel)

#### [DynamoPoolRelay](#dynamopoolrelay)

#### Autoscaling

Deprecated: This field is deprecated and ignored. Use DynamoGraphDeploymentScalingAdapter
with HPA, KEDA, or Planner for autoscaling instead. See docs/kubernetes/autoscaling.md
for migration guidance. This field will be removed in a future API version.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`enabled`** `boolean`

Deprecated: This field is ignored.

---

**`minReplicas`** `integer`

Deprecated: This field is ignored.

---

**`maxReplicas`** `integer`

Deprecated: This field is ignored.

---

**`behavior`** `HorizontalPodAutoscalerBehavior`

Deprecated: This field is ignored.
See [HorizontalPodAutoscalerBehavior](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#horizontalpodautoscalerbehavior-v2-autoscaling).

---

**`metrics`** `MetricSpec array`

Deprecated: This field is ignored.
See [MetricSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#metricspec-v2-autoscaling).

---

#### CheckpointDeletionPolicy

CheckpointDeletionPolicy defines what happens to DGD-managed automatic
checkpoint resources when the owning DGD is deleted.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Delete Retain]
**Appears in:** [ServiceCheckpointConfig](#servicecheckpointconfig)

**Allowed values**

* Delete

  CheckpointDeletionPolicyDelete deletes DGD-managed automatic checkpoint CRs and artifacts when the owning DGD is deleted.
* Retain

  CheckpointDeletionPolicyRetain keeps DGD-managed automatic checkpoint CRs and artifacts after the owning DGD is deleted. Retained automatic checkpoints are not valid checkpointRef targets.

#### CheckpointMode

Deprecated: use checkpoint.enabled instead.
enabled=true without checkpointRef creates a DGD-managed automatic
checkpoint; checkpointRef restores the named PodSnapshot.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Auto Manual]
**Appears in:** [ServiceCheckpointConfig](#servicecheckpointconfig)

**Allowed values**

* Auto

  Deprecated: use checkpoint.enabled=true and omit checkpointRef.
* Manual

  Deprecated: use checkpointRef to restore an existing PodSnapshot.

#### CheckpointStartupPolicy

CheckpointStartupPolicy defines when worker pods should wait for a checkpoint.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Immediate WaitForCheckpoint]
**Appears in:** [ServiceCheckpointConfig](#servicecheckpointconfig)

**Allowed values**

* Immediate

  CheckpointStartupPolicyImmediate starts workers immediately. The SnapshotJob capture runs in the background, and only pods created after the checkpoint is Ready are restore-shaped by the pod-create mutating webhook.
* WaitForCheckpoint

  CheckpointStartupPolicyWaitForCheckpoint gates worker replicas until the component's checkpoint is Ready, then starts them from the checkpoint.

#### ComponentKind

ComponentKind represents the type of underlying Kubernetes resource.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[PodClique PodCliqueScalingGroup Deployment LeaderWorkerSet]
**Appears in:** [ServiceReplicaStatus](#servicereplicastatus)

**Allowed values**

* PodClique

  ComponentKindPodClique represents a PodClique resource.
* PodCliqueScalingGroup

  ComponentKindPodCliqueScalingGroup represents a PodCliqueScalingGroup resource.
* Deployment

  ComponentKindDeployment represents a Deployment resource.
* LeaderWorkerSet

  ComponentKindLeaderWorkerSet represents a LeaderWorkerSet resource.

#### ComponentRoleSpec

ComponentRoleSpec configures one named Pod-producing role inside a compound component.
The enclosing component type defines the allowed role names and cardinality.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec)

**`name`** `string` — required

Name identifies the role within the enclosing component independently of generated provider resource names.
**Validation:** MaxLength: 63  MinLength: 1  Pattern: `^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`  Required: \&#123;\&#125;

---

**`replicas`** `integer`

Replicas is the logical cardinality of this role in one complete component instance. The enclosing component type defines the cardinality. For multinode components, admission defaults and persists omitted values from Multinode.NodeCount; leader must be 1 and worker must be Multinode.NodeCount minus 1.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`providerOverride`** `ProviderOverride`

ProviderOverride configures the provider workload unit generated for this role. It is supported only for components embedded in a DGD.
See [ProviderOverride](#provideroverride).
**Validation:** Optional: \&#123;\&#125;

---

**`podTemplate`** `PodTemplateSpec`

PodTemplate defines the complete Pod configuration for this role. Admission permits it only when the enclosing component type supports role-specific Pod templates. For multinode components, every required role must supply one and the role templates own backend-specific leader and worker launch commands.
See [PodTemplateSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#podtemplatespec-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

#### ConfigMapKeySelector

ConfigMapKeySelector selects a specific key from a ConfigMap.
Used to reference external configuration data stored in ConfigMaps.

**Kind:** `type`
**Appears in:** [ProfilingConfigSpec](#profilingconfigspec)

**`name`** `string` — required

Name of the ConfigMap containing the desired data.
**Validation:** Required: \&#123;\&#125;

---

**`key`** `string` — default: disagg.yaml

Key in the ConfigMap to select. If not specified, defaults to "disagg.yaml".

---

#### DGDRState

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Initializing Pending Profiling Deploying Ready DeploymentDeleted Failed]
**Appears in:** [DynamoGraphDeploymentRequestNativeStatus](#dynamographdeploymentrequestnativestatus), [DynamoGraphDeploymentRequestStatus](#dynamographdeploymentrequeststatus)

**Allowed values**

* Initializing
* Pending
* Profiling
* Deploying
* Ready
* DeploymentDeleted
* Failed

#### DGDState

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[initializing pending successful failed]
**Appears in:** [DeploymentStatus](#deploymentstatus), [DynamoGraphDeploymentStatus](#dynamographdeploymentstatus)

**Allowed values**

* initializing
* pending
* successful
* failed

#### DeploymentOverridesSpec

DeploymentOverridesSpec allows users to customize metadata for auto-created DynamoGraphDeployments.
When autoApply is enabled, these overrides are applied to the generated DGD resource.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#dynamographdeploymentrequestspec)

**`name`** `string`

Name is the desired name for the created DynamoGraphDeployment. If not specified, defaults to the DGDR name.
**Validation:** Optional: \&#123;\&#125;

---

**`namespace`** `string`

Namespace is the desired namespace for the created DynamoGraphDeployment. If not specified, defaults to the DGDR namespace.
**Validation:** Optional: \&#123;\&#125;

---

**`labels`** `object (keys:string, values:string)`

Labels are additional labels to add to the DynamoGraphDeployment metadata. These are merged with auto-generated labels from the profiling process.
**Validation:** Optional: \&#123;\&#125;

---

**`annotations`** `object (keys:string, values:string)`

Annotations are additional annotations to add to the DynamoGraphDeployment metadata.
**Validation:** Optional: \&#123;\&#125;

---

**`workersImage`** `string`

WorkersImage specifies the container image to use for DynamoGraphDeployment worker components. This image is used for both temporary DGDs created during online profiling and the final DGD. If omitted, the image from the base config file (e.g., disagg.yaml) is used. Example: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0"
**Validation:** Optional: \&#123;\&#125;

---

#### DeploymentStatus

DeploymentStatus tracks the state of an auto-created DynamoGraphDeployment.
This status is populated when autoApply is enabled and a DGD is created.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeStatus](#dynamographdeploymentrequestnativestatus), [DynamoGraphDeploymentRequestStatus](#dynamographdeploymentrequeststatus)

**`name`** `string`

Name is the name of the created DynamoGraphDeployment.

---

**`namespace`** `string`

Namespace is the namespace of the created DynamoGraphDeployment.

---

**`state`** `DGDState` — default: initializing

State is the current state of the DynamoGraphDeployment. This value is mirrored from the DGD's status.state field.
See [DGDState](#dgdstate).
**Validation:** Enum: \[initializing pending successful failed]

---

**`created`** `boolean`

Created indicates whether the DGD has been successfully created. Used to prevent recreation if the DGD is manually deleted by users.

---

#### DynamoCheckpointIdentity

Deprecated: omit in DGD service checkpoint configs. Automatic capture
needs no replacement; use CheckpointRef to restore a PodSnapshot.

**Kind:** `type`
**Appears in:** [ServiceCheckpointConfig](#servicecheckpointconfig)

**`model`** `string` — required

Model is the model identifier (e.g., "meta-llama/Llama-3-70B"). Deprecated: legacy identity only.
**Validation:** Required: \&#123;\&#125;

---

**`backendFramework`** `string` — required

BackendFramework is the runtime framework (vllm, sglang, trtllm). Deprecated: legacy identity only.
**Validation:** Enum: \[vllm sglang trtllm]  Required: \&#123;\&#125;

---

**`dynamoVersion`** `string`

DynamoVersion is the Dynamo platform version. Deprecated: legacy identity only.
**Validation:** Optional: \&#123;\&#125;

---

**`tensorParallelSize`** `integer` — default: 1

TensorParallelSize is the tensor parallel configuration. Deprecated: automatic capture derives compatibility from the worker.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`pipelineParallelSize`** `integer` — default: 1

PipelineParallelSize is the pipeline parallel configuration. Deprecated: automatic capture derives compatibility from the worker.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`dtype`** `string`

Dtype is the data type (fp16, bf16, fp8, etc.). Deprecated: legacy identity only.
**Validation:** Optional: \&#123;\&#125;

---

**`maxModelLen`** `integer`

MaxModelLen is the maximum sequence length. Deprecated: legacy identity only.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`extraParameters`** `object (keys:string, values:string)`

ExtraParameters contains additional legacy identity parameters. Deprecated: legacy identity only.
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoComponentDeployment

DynamoComponentDeployment is the Schema for the dynamocomponentdeployments API

**Kind:** `resource`

**`apiVersion`** `string`

`nvidia.com/v1alpha1`

---

**`kind`** `string`

`DynamoComponentDeployment`

---

**`metadata`** `ObjectMeta`

Refer to Kubernetes API documentation for fields of `metadata`.
See [ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta).

---

**`spec`** `DynamoComponentDeploymentSpec`

Spec defines the desired state for this Dynamo component deployment.
See [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec).

---

#### DynamoComponentDeploymentSharedSpec

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentSpec](#dynamographdeploymentspec)

**`providerOverride`** `ProviderOverride`

ProviderOverride configures the primary Grove unit representing this DGD component. With apiVersion `grove.io/v1alpha1`, target is `PodCliqueTemplateSpec` for a single-node component or `PodCliqueScalingGroupConfig` for a PCSG-backed component; value may set `topologyConstraint` and `rollingUpdate.maxUnavailable`. Standalone DCD OpenAPI omits this field.
See [ProviderOverride](#provideroverride).
**Validation:** Optional: \&#123;\&#125;

---

**`annotations`** `object (keys:string, values:string)`

Annotations to add to generated Kubernetes resources for this component (such as Pod, Service, and Ingress when applicable).

---

**`labels`** `object (keys:string, values:string)`

Labels to add to generated Kubernetes resources for this component.

---

**`serviceName`** `string`

The name of the component

---

**`componentType`** `string`

ComponentType indicates the role of this component (for example, "main"). The DGD-only "lpx" type is experimental, requires the operator's lpx.enabled setting, and may change incompatibly.

---

**`subComponentType`** `string`

SubComponentType indicates the sub-role of this component (for example, "prefill").

---

**`runtimeVersionOverride`** `string`

RuntimeVersionOverride declares the Dynamo runtime version in this component's runtime image. Paths below are relative to the component spec. Use extraPodSpec.initContainers\[name=runtime].image when the Dynamo runtime sidecar is present, otherwise extraPodSpec.mainContainer.image, or the main image in each selected role PodTemplate. For frontend, worker, prefill, decode, planner, and epp components, DGD admission requires it when any selected runtime image has no parseable semantic-version tag; controller-generated DCDs may omit it. Untyped components and custom component types do not require it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0". It does not change the image. Setting or changing an override that resolves to version 1.5.0 or later may trigger a rollout. Keep it consistent with every selected template's runtime version.
**Validation:** Pattern: `^(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})$`  Optional: \&#123;\&#125;

---

**`globalDynamoNamespace`** `boolean`

GlobalDynamoNamespace indicates that the Component will be placed in the global Dynamo namespace

---

**`resources`** `Resources`

Resources requested and limits for this component, including CPU, memory, GPUs/devices, and any runtime-specific resources.
See [Resources](#resources).

---

**`autoscaling`** `Autoscaling`

Deprecated: This field is deprecated and ignored. Use DynamoGraphDeploymentScalingAdapter with HPA, KEDA, or Planner for autoscaling instead. See docs/kubernetes/autoscaling.md for migration guidance. This field will be removed in a future API version.
See [Autoscaling](#autoscaling).

---

**`envs`** `EnvVar array`

Envs defines additional environment variables to inject into the component containers.
See [EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#envvar-v1-core).

---

**`envFromSecret`** `string`

EnvFromSecret references a Secret whose key/value pairs will be exposed as environment variables in the component containers.

---

**`volumeMounts`** `VolumeMount array`

VolumeMounts references PVCs defined at the top level for volumes to be mounted by the component.
See [VolumeMount](#volumemount).

---

**`ingress`** `IngressSpec`

Ingress config to expose the component outside the cluster (or through a service mesh).
See [IngressSpec](#ingressspec).

---

**`modelRef`** `ModelReference`

ModelRef references a model that this component serves When specified, a headless service will be created for endpoint discovery
See [ModelReference](#modelreference).
**Validation:** Optional: \&#123;\&#125;

---

**`sharedMemory`** `SharedMemorySpec`

SharedMemory controls the tmpfs mounted at /dev/shm (enable/disable and size).
See [SharedMemorySpec](#sharedmemoryspec).

---

**`extraPodMetadata`** `ExtraPodMetadata`

ExtraPodMetadata adds labels/annotations to the created Pods.
See [ExtraPodMetadata](#extrapodmetadata).
**Validation:** Optional: \&#123;\&#125;

---

**`extraPodSpec`** `ExtraPodSpec`

ExtraPodSpec allows to override the main pod spec configuration. It is a k8s standard PodSpec. It also contains a MainContainer (standard k8s Container) field that allows overriding the main container configuration. New components must set extraPodSpec and provide a non-empty mainContainer image. Existing components created without extraPodSpec may remain unchanged.
See [ExtraPodSpec](#extrapodspec).
**Validation:** Optional: \&#123;\&#125;

---

**`livenessProbe`** `Probe`

LivenessProbe to detect and restart unhealthy containers.
See [Probe](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#probe-v1-core).

---

**`readinessProbe`** `Probe`

ReadinessProbe to signal when the container is ready to receive traffic.
See [Probe](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#probe-v1-core).

---

**`replicas`** `integer`

Replicas is the desired number of Pods for this component. When scalingAdapter is enabled, this field is managed by the DynamoGraphDeploymentScalingAdapter and should not be modified directly.
**Validation:** Minimum: 0

---

**`minAvailable`** `integer`

MinAvailable maps to Grove PodClique minAvailable for single-node and Grove PodCliqueScalingGroup minAvailable for multi-node components. This field determines 1) the minimum number of replicas guaranteed to be gang-scheduled, and 2) when violating minAvailable replicas triggers gang termination. Deprecated: use providerOverride.value.spec.minAvailable for a standalone Grove PodClique, or providerOverride.value.minAvailable for a scaling group. The effective minimum is immutable after creation; moving the same value to the new form is supported without changing the update strategy. Grove uses RollingRecreate unless a strategy annotation explicitly overrides it. New Grove deployments default the provider-native form to 1. Scale-to-zero preserves the minimum until replicas becomes positive again. For non-Grove deployments, setting this field will result in a validation error.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`multinode`** `MultinodeSpec`

Multinode configures worker, prefill, or decode components that span multiple Pods.
See [MultinodeSpec](#multinodespec).

---

**`roles`** `ComponentRoleSpec array`

Roles expose the named Pod-producing parts inside a compound component. When set for a multinode component, this list must contain exactly one leader and one worker role. Admission defaults omitted replicas to 1 for leader and multinode.nodeCount minus 1 for worker. Omitting the roles list preserves the implicit multinode role layout. LPX components each require an agent role. A DGD may contain independent LPX components, each serving through its own conductor role or agent runtime init container, or a draft and target pair in which only the target serves. Every LPX role requires its own podTemplate.
See [ComponentRoleSpec](#componentrolespec).
**Validation:** MaxItems: 2  Optional: \&#123;\&#125;

---

**`scalingAdapter`** `ScalingAdapter`

ScalingAdapter configures whether this service uses the DynamoGraphDeploymentScalingAdapter. When enabled, replicas are managed by the DGDSA and external autoscalers scale the service via the Scale subresource; when disabled, replicas are set directly. Opt in with `scalingAdapter: \{enabled: true\}` -- a bare `scalingAdapter: \{\}` is disabled because `enabled` defaults to false.
See [ScalingAdapter](#scalingadapter).
**Validation:** Optional: \&#123;\&#125;

---

**`eppConfig`** `EPPConfig`

EPPConfig defines legacy Go-EPP configuration for Endpoint Picker Plugin components. Only applicable when ComponentType is "epp". Deprecated: omit this field for the native Rust EPP. Presence of eppConfig keeps the Go EPP Pod contract until migration clears it.
See [EPPConfig](#eppconfig).
**Validation:** Optional: \&#123;\&#125;

---

**`frontendSidecar`** `FrontendSidecarSpec`

FrontendSidecar configures an auto-generated frontend sidecar container. When specified, the operator injects a fully configured frontend container with all standard Dynamo environment variables, health probes, and ports. This eliminates the need to manually specify these in extraPodSpec.containers. (GAIE)
See [FrontendSidecarSpec](#frontendsidecarspec).
**Validation:** Optional: \&#123;\&#125;

---

**`lpx`** `LPXConfig`

LPX holds LPX integration configuration. Only meaningful when ComponentType is "lpx". Experimental: requires the operator's lpx.enabled setting and may change incompatibly.
See [LPXConfig](#lpxconfig).
**Validation:** Optional: \&#123;\&#125;

---

**`checkpoint`** `ServiceCheckpointConfig`

Checkpoint configures container checkpointing for this service. When enabled, pods can be restored from a checkpoint files for faster cold start.
See [ServiceCheckpointConfig](#servicecheckpointconfig).
**Validation:** Optional: \&#123;\&#125;

---

**`topologyConstraint`** `TopologyConstraint`

TopologyConstraint for this service. packDomain is required. When both this and spec.topologyConstraint.packDomain are set, packDomain must be narrower than or equal to the spec-level packDomain.
See [TopologyConstraint](#topologyconstraint).
**Validation:** Optional: \&#123;\&#125;

---

**`gpuMemoryService`** `GPUMemoryServiceSpec`

GPUMemoryService configures the GPU Memory Service (GMS) sidecar. When enabled, a GMS sidecar is injected and GPU access is managed via DRA.
See [GPUMemoryServiceSpec](#gpumemoryservicespec).
**Validation:** Optional: \&#123;\&#125;

---

**`failover`** `FailoverSpec`

Failover configures GMS (GPU Memory Service) failover for this service. For intraPod mode: the main container is cloned into two engine containers (active + standby). For interPod mode: the operator creates a dedicated GMS weight server pod and multiple engine pods per rank that share GPUs via DRA resource claims.
See [FailoverSpec](#failoverspec).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoComponentDeploymentSpec

DynamoComponentDeploymentSpec defines the desired state of DynamoComponentDeployment

**Kind:** `type`
**Appears in:** [DynamoComponentDeployment](#dynamocomponentdeployment)

**`backendFramework`** `string`

BackendFramework specifies the backend framework (e.g., "sglang", "vllm", "trtllm")
**Validation:** Enum: \[sglang vllm trtllm]

---

**`annotations`** `object (keys:string, values:string)`

Annotations to add to generated Kubernetes resources for this component (such as Pod, Service, and Ingress when applicable).

---

**`labels`** `object (keys:string, values:string)`

Labels to add to generated Kubernetes resources for this component.

---

**`serviceName`** `string`

The name of the component

---

**`componentType`** `string`

ComponentType indicates the role of this component (for example, "main"). The DGD-only "lpx" type is experimental, requires the operator's lpx.enabled setting, and may change incompatibly.

---

**`subComponentType`** `string`

SubComponentType indicates the sub-role of this component (for example, "prefill").

---

**`runtimeVersionOverride`** `string`

RuntimeVersionOverride declares the Dynamo runtime version in this component's runtime image. Paths below are relative to the component spec. Use extraPodSpec.initContainers\[name=runtime].image when the Dynamo runtime sidecar is present, otherwise extraPodSpec.mainContainer.image, or the main image in each selected role PodTemplate. For frontend, worker, prefill, decode, planner, and epp components, DGD admission requires it when any selected runtime image has no parseable semantic-version tag; controller-generated DCDs may omit it. Untyped components and custom component types do not require it. Set it also when the parsed tag is not the Dynamo runtime version. Use the canonical MAJOR.MINOR.PATCH value, for example "1.4.0". It does not change the image. Setting or changing an override that resolves to version 1.5.0 or later may trigger a rollout. Keep it consistent with every selected template's runtime version.
**Validation:** Pattern: `^(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})$`  Optional: \&#123;\&#125;

---

**`globalDynamoNamespace`** `boolean`

GlobalDynamoNamespace indicates that the Component will be placed in the global Dynamo namespace

---

**`resources`** `Resources`

Resources requested and limits for this component, including CPU, memory, GPUs/devices, and any runtime-specific resources.
See [Resources](#resources).

---

**`autoscaling`** `Autoscaling`

Deprecated: This field is deprecated and ignored. Use DynamoGraphDeploymentScalingAdapter with HPA, KEDA, or Planner for autoscaling instead. See docs/kubernetes/autoscaling.md for migration guidance. This field will be removed in a future API version.
See [Autoscaling](#autoscaling).

---

**`envs`** `EnvVar array`

Envs defines additional environment variables to inject into the component containers.
See [EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#envvar-v1-core).

---

**`envFromSecret`** `string`

EnvFromSecret references a Secret whose key/value pairs will be exposed as environment variables in the component containers.

---

**`volumeMounts`** `VolumeMount array`

VolumeMounts references PVCs defined at the top level for volumes to be mounted by the component.
See [VolumeMount](#volumemount).

---

**`ingress`** `IngressSpec`

Ingress config to expose the component outside the cluster (or through a service mesh).
See [IngressSpec](#ingressspec).

---

**`modelRef`** `ModelReference`

ModelRef references a model that this component serves When specified, a headless service will be created for endpoint discovery
See [ModelReference](#modelreference).
**Validation:** Optional: \&#123;\&#125;

---

**`sharedMemory`** `SharedMemorySpec`

SharedMemory controls the tmpfs mounted at /dev/shm (enable/disable and size).
See [SharedMemorySpec](#sharedmemoryspec).

---

**`extraPodMetadata`** `ExtraPodMetadata`

ExtraPodMetadata adds labels/annotations to the created Pods.
See [ExtraPodMetadata](#extrapodmetadata).
**Validation:** Optional: \&#123;\&#125;

---

**`extraPodSpec`** `ExtraPodSpec`

ExtraPodSpec allows to override the main pod spec configuration. It is a k8s standard PodSpec. It also contains a MainContainer (standard k8s Container) field that allows overriding the main container configuration. New components must set extraPodSpec and provide a non-empty mainContainer image. Existing components created without extraPodSpec may remain unchanged.
See [ExtraPodSpec](#extrapodspec).
**Validation:** Optional: \&#123;\&#125;

---

**`livenessProbe`** `Probe`

LivenessProbe to detect and restart unhealthy containers.
See [Probe](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#probe-v1-core).

---

**`readinessProbe`** `Probe`

ReadinessProbe to signal when the container is ready to receive traffic.
See [Probe](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#probe-v1-core).

---

**`replicas`** `integer`

Replicas is the desired number of Pods for this component. When scalingAdapter is enabled, this field is managed by the DynamoGraphDeploymentScalingAdapter and should not be modified directly.
**Validation:** Minimum: 0

---

**`minAvailable`** `integer`

MinAvailable maps to Grove PodClique minAvailable for single-node and Grove PodCliqueScalingGroup minAvailable for multi-node components. This field determines 1) the minimum number of replicas guaranteed to be gang-scheduled, and 2) when violating minAvailable replicas triggers gang termination. Deprecated: use providerOverride.value.spec.minAvailable for a standalone Grove PodClique, or providerOverride.value.minAvailable for a scaling group. The effective minimum is immutable after creation; moving the same value to the new form is supported without changing the update strategy. Grove uses RollingRecreate unless a strategy annotation explicitly overrides it. New Grove deployments default the provider-native form to 1. Scale-to-zero preserves the minimum until replicas becomes positive again. For non-Grove deployments, setting this field will result in a validation error.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`multinode`** `MultinodeSpec`

Multinode configures worker, prefill, or decode components that span multiple Pods.
See [MultinodeSpec](#multinodespec).

---

**`roles`** `object array`

Roles expose the named Pod-producing parts inside a compound component. When set for a multinode component, this list must contain exactly one leader and one worker role. Admission defaults omitted replicas to 1 for leader and multinode.nodeCount minus 1 for worker. Omitting the roles list preserves the implicit multinode role layout. LPX components each require an agent role. A DGD may contain independent LPX components, each serving through its own conductor role or agent runtime init container, or a draft and target pair in which only the target serves. Every LPX role requires its own podTemplate. Standalone DCD roles support `name`, `replicas`, and `podTemplate`; `providerOverride` is a DGD-only provider context.
**Validation:** MaxItems: 2  Optional: \&#123;\&#125;

---

**`scalingAdapter`** `ScalingAdapter`

ScalingAdapter configures whether this service uses the DynamoGraphDeploymentScalingAdapter. When enabled, replicas are managed by the DGDSA and external autoscalers scale the service via the Scale subresource; when disabled, replicas are set directly. Opt in with `scalingAdapter: \{enabled: true\}` -- a bare `scalingAdapter: \{\}` is disabled because `enabled` defaults to false.
See [ScalingAdapter](#scalingadapter).
**Validation:** Optional: \&#123;\&#125;

---

**`eppConfig`** `EPPConfig`

EPPConfig defines legacy Go-EPP configuration for Endpoint Picker Plugin components. Only applicable when ComponentType is "epp". Deprecated: omit this field for the native Rust EPP. Presence of eppConfig keeps the Go EPP Pod contract until migration clears it.
See [EPPConfig](#eppconfig).
**Validation:** Optional: \&#123;\&#125;

---

**`frontendSidecar`** `FrontendSidecarSpec`

FrontendSidecar configures an auto-generated frontend sidecar container. When specified, the operator injects a fully configured frontend container with all standard Dynamo environment variables, health probes, and ports. This eliminates the need to manually specify these in extraPodSpec.containers. (GAIE)
See [FrontendSidecarSpec](#frontendsidecarspec).
**Validation:** Optional: \&#123;\&#125;

---

**`checkpoint`** `ServiceCheckpointConfig`

Checkpoint configures container checkpointing for this service. When enabled, pods can be restored from a checkpoint files for faster cold start.
See [ServiceCheckpointConfig](#servicecheckpointconfig).
**Validation:** Optional: \&#123;\&#125;

---

**`topologyConstraint`** `TopologyConstraint`

TopologyConstraint for this service. packDomain is required. When both this and spec.topologyConstraint.packDomain are set, packDomain must be narrower than or equal to the spec-level packDomain.
See [TopologyConstraint](#topologyconstraint).
**Validation:** Optional: \&#123;\&#125;

---

**`gpuMemoryService`** `GPUMemoryServiceSpec`

GPUMemoryService configures the GPU Memory Service (GMS) sidecar. When enabled, a GMS sidecar is injected and GPU access is managed via DRA.
See [GPUMemoryServiceSpec](#gpumemoryservicespec).
**Validation:** Optional: \&#123;\&#125;

---

**`failover`** `FailoverSpec`

Failover configures GMS (GPU Memory Service) failover for this service. For intraPod mode: the main container is cloned into two engine containers (active + standby). For interPod mode: the operator creates a dedicated GMS weight server pod and multiple engine pods per rank that share GPUs via DRA resource claims.
See [FailoverSpec](#failoverspec).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoGraphDeployment

DynamoGraphDeployment is the Schema for the dynamographdeployments API.

**Kind:** `resource`

**`apiVersion`** `string`

`nvidia.com/v1alpha1`

---

**`kind`** `string`

`DynamoGraphDeployment`

---

**`metadata`** `ObjectMeta`

Refer to Kubernetes API documentation for fields of `metadata`.
See [ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta).

---

**`spec`** `DynamoGraphDeploymentSpec`

Spec defines the desired state for this graph deployment.
See [DynamoGraphDeploymentSpec](#dynamographdeploymentspec).

---

**`status`** `DynamoGraphDeploymentStatus`

Status reflects the current observed state of this graph deployment.
See [DynamoGraphDeploymentStatus](#dynamographdeploymentstatus).

---

#### DynamoGraphDeploymentExperimentalSpec

DynamoGraphDeploymentExperimentalSpec groups graph-level opt-in preview
features. Component-level experimental features are represented separately
on component specs.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentSpec](#dynamographdeploymentspec)

**`kvTransferPolicy`** `KvTransferPolicy`

KvTransferPolicy configures topology-aware routing for KV-cache transfers between prefill and decode workers.
See [KvTransferPolicy](#kvtransferpolicy).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoGraphDeploymentRequest

DynamoGraphDeploymentRequest is the Schema for the dynamographdeploymentrequests API.
It serves as the primary interface for users to request model deployments with
specific performance and resource constraints, enabling SLA-driven deployments.

Lifecycle:

1. Initializing → Pending: Validates spec and prepares for profiling
2. Pending → Profiling: Creates and runs profiling job (online or AIC)
3. Profiling → Ready/Deploying: Generates DGD spec after profiling completes
4. Deploying → Ready: When autoApply=true, monitors DGD until Ready
5. Ready: Terminal state when DGD is operational or spec is available
6. DeploymentDeleted: Terminal state when auto-created DGD is manually deleted

The spec becomes immutable once profiling starts. Users must delete and recreate
the DGDR to modify configuration after this point.

DEPRECATION NOTICE: v1alpha1 DynamoGraphDeploymentRequest is deprecated.
Please migrate to nvidia.com/v1beta1 DynamoGraphDeploymentRequest.
v1alpha1 will be removed in a future release.

**Kind:** `resource`

**`apiVersion`** `string`

`nvidia.com/v1alpha1`

---

**`kind`** `string`

`DynamoGraphDeploymentRequest`

---

**`metadata`** `ObjectMeta`

Refer to Kubernetes API documentation for fields of `metadata`.
See [ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta).

---

**`spec`** `DynamoGraphDeploymentRequestSpec`

Spec defines the desired state for this deployment request.
See [DynamoGraphDeploymentRequestSpec](#dynamographdeploymentrequestspec).

---

**`status`** `DynamoGraphDeploymentRequestStatus`

Status reflects the current observed state of this deployment request.
See [DynamoGraphDeploymentRequestStatus](#dynamographdeploymentrequeststatus).

---

#### DynamoGraphDeploymentRequestNativeSpec

DynamoGraphDeploymentRequestNativeSpec contains the native v1alpha1 request fields.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestSpec](#dynamographdeploymentrequestspec)

**`model`** `string`

Model specifies the model to deploy (e.g., "Qwen/Qwen3-0.6B", "meta-llama/Llama-3-70b"). This is a high-level identifier for easy reference in kubectl output and logs. The controller automatically sets this value in profilingConfig.config.deployment.model.
**Validation:** Optional: \&#123;\&#125;

---

**`backend`** `string`

Backend specifies the inference backend for profiling. The controller automatically sets this value in profilingConfig.config.engine.backend. Profiling runs on real GPUs or via AIC simulation to collect performance data.
**Validation:** Enum: \[auto vllm sglang trtllm]  Optional: \&#123;\&#125;

---

**`useMocker`** `boolean`

UseMocker indicates whether to deploy a mocker DynamoGraphDeployment instead of a real backend deployment. When true, the deployment uses simulated engines that don't require GPUs, using the profiling data to simulate realistic timing behavior. Mocker is available in all backend images and useful for large-scale experiments. Profiling still runs against the real backend (specified above) to collect performance data.

---

**`profilingConfig`** `ProfilingConfigSpec`

ProfilingConfig provides the complete configuration for the profiling job. Note: GPU discovery is automatically attempted to detect GPU resources from Kubernetes cluster nodes. If the operator has node read permissions (cluster-wide or explicitly granted), discovered GPU configuration is used as defaults when hardware configuration is not manually specified (minNumGpusPerEngine, maxNumGpusPerEngine, numGpusPerNode). User-specified values always take precedence over auto-discovered values. If GPU discovery fails (e.g., namespace-restricted operator without node permissions), manual hardware config is required. This configuration is passed directly to the profiler. The structure matches the profile_sla config format exactly (see ProfilingConfigSpec for schema). Note: deployment.model and engine.backend are automatically set from the high-level modelName and backend fields and should not be specified in this config.
See [ProfilingConfigSpec](#profilingconfigspec).
**Validation:** Optional: \&#123;\&#125;

---

**`runtimeVersionOverride`** `string`

RuntimeVersionOverride explicitly sets the Dynamo runtime version for every component in the generated DynamoGraphDeployment. Set this when profilingConfig.profilerImage uses a non-semantic-version tag or digest, or when its tag does not identify the Dynamo runtime version.
**Validation:** Pattern: `^(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})$`  Optional: \&#123;\&#125;

---

**`enableGpuDiscovery`** `boolean`

EnableGPUDiscovery controls whether the operator attempts to discover GPU hardware from cluster nodes. DEPRECATED: This field is deprecated and will be removed in v1beta1. GPU discovery is now always attempted automatically. Setting this field has no effect - the operator will always try to discover GPU hardware when node read permissions are available. If discovery is unavailable (e.g., namespace-scoped operator without permissions), manual hardware configuration is required regardless of this setting.
**Validation:** Optional: \&#123;\&#125;

---

**`autoApply`** `boolean`

AutoApply indicates whether to automatically create a DynamoGraphDeployment after profiling completes. If false, only the spec is generated and stored in status. Users can then manually create a DGD using the generated spec.

---

**`deploymentOverrides`** `DeploymentOverridesSpec`

DeploymentOverrides allows customizing metadata for the auto-created DGD. Only applicable when AutoApply is true.
See [DeploymentOverridesSpec](#deploymentoverridesspec).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoGraphDeploymentRequestNativeStatus

DynamoGraphDeploymentRequestNativeStatus contains the native v1alpha1 status fields.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestStatus](#dynamographdeploymentrequeststatus)

**`state`** `DGDRState`

State is a high-level textual status of the deployment request lifecycle.
See [DGDRState](#dgdrstate).
**Validation:** Enum: \[Initializing Pending Profiling Deploying Ready DeploymentDeleted Failed]  Optional: \&#123;\&#125;

---

**`backend`** `string`

Backend is extracted from profilingConfig.config.engine.backend for display purposes. This field is populated by the controller and shown in kubectl output.
**Validation:** Optional: \&#123;\&#125;

---

**`observedGeneration`** `integer`

ObservedGeneration reflects the generation of the most recently observed spec. Used to detect spec changes and enforce immutability after profiling starts.

---

**`conditions`** `Condition array`

Conditions contains the latest observed conditions of the deployment request. Standard condition types include: Validation, Profiling, SpecGenerated, DeploymentReady. Conditions are merged by type on patch updates.
See [Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#condition-v1-meta).

---

**`profilingResults`** `string`

ProfilingResults contains a reference to the ConfigMap holding profiling data. Format: "configmap/\&lt;name\&gt;"
**Validation:** Optional: \&#123;\&#125;

---

**`generatedDeployment`** `RawExtension`

GeneratedDeployment contains the full generated DynamoGraphDeployment specification including metadata, based on profiling results. Users can extract this to create a DGD manually, or it's used automatically when autoApply is true. Stored as RawExtension to preserve all fields including metadata. For mocker backends, this contains the mocker DGD spec.
See [RawExtension](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#rawextension-runtime-pkg).
**Validation:** EmbeddedResource: \&#123;\&#125;  Optional: \&#123;\&#125;

---

**`deployment`** `DeploymentStatus`

Deployment tracks the auto-created DGD when AutoApply is true. Contains name, namespace, state, and creation status of the managed DGD.
See [DeploymentStatus](#deploymentstatus).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoGraphDeploymentRequestSpec

DynamoGraphDeploymentRequestSpec defines the desired state of a DynamoGraphDeploymentRequest.
This CRD serves as the primary interface for users to request model deployments with
specific performance constraints and resource requirements, enabling SLA-driven deployments.
Native v1alpha1 fields and the V1Beta2 conversion envelope are mutually exclusive.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequest](#dynamographdeploymentrequest)

**`model`** `string`

Model specifies the model to deploy (e.g., "Qwen/Qwen3-0.6B", "meta-llama/Llama-3-70b"). This is a high-level identifier for easy reference in kubectl output and logs. The controller automatically sets this value in profilingConfig.config.deployment.model.
**Validation:** Optional: \&#123;\&#125;

---

**`backend`** `string`

Backend specifies the inference backend for profiling. The controller automatically sets this value in profilingConfig.config.engine.backend. Profiling runs on real GPUs or via AIC simulation to collect performance data.
**Validation:** Enum: \[auto vllm sglang trtllm]  Optional: \&#123;\&#125;

---

**`useMocker`** `boolean`

UseMocker indicates whether to deploy a mocker DynamoGraphDeployment instead of a real backend deployment. When true, the deployment uses simulated engines that don't require GPUs, using the profiling data to simulate realistic timing behavior. Mocker is available in all backend images and useful for large-scale experiments. Profiling still runs against the real backend (specified above) to collect performance data.

---

**`profilingConfig`** `ProfilingConfigSpec`

ProfilingConfig provides the complete configuration for the profiling job. Note: GPU discovery is automatically attempted to detect GPU resources from Kubernetes cluster nodes. If the operator has node read permissions (cluster-wide or explicitly granted), discovered GPU configuration is used as defaults when hardware configuration is not manually specified (minNumGpusPerEngine, maxNumGpusPerEngine, numGpusPerNode). User-specified values always take precedence over auto-discovered values. If GPU discovery fails (e.g., namespace-restricted operator without node permissions), manual hardware config is required. This configuration is passed directly to the profiler. The structure matches the profile_sla config format exactly (see ProfilingConfigSpec for schema). Note: deployment.model and engine.backend are automatically set from the high-level modelName and backend fields and should not be specified in this config.
See [ProfilingConfigSpec](#profilingconfigspec).
**Validation:** Optional: \&#123;\&#125;

---

**`runtimeVersionOverride`** `string`

RuntimeVersionOverride explicitly sets the Dynamo runtime version for every component in the generated DynamoGraphDeployment. Set this when profilingConfig.profilerImage uses a non-semantic-version tag or digest, or when its tag does not identify the Dynamo runtime version.
**Validation:** Pattern: `^(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})$`  Optional: \&#123;\&#125;

---

**`enableGpuDiscovery`** `boolean`

EnableGPUDiscovery controls whether the operator attempts to discover GPU hardware from cluster nodes. DEPRECATED: This field is deprecated and will be removed in v1beta1. GPU discovery is now always attempted automatically. Setting this field has no effect - the operator will always try to discover GPU hardware when node read permissions are available. If discovery is unavailable (e.g., namespace-scoped operator without permissions), manual hardware configuration is required regardless of this setting.
**Validation:** Optional: \&#123;\&#125;

---

**`autoApply`** `boolean`

AutoApply indicates whether to automatically create a DynamoGraphDeployment after profiling completes. If false, only the spec is generated and stored in status. Users can then manually create a DGD using the generated spec.

---

**`deploymentOverrides`** `DeploymentOverridesSpec`

DeploymentOverrides allows customizing metadata for the auto-created DGD. Only applicable when AutoApply is true.
See [DeploymentOverridesSpec](#deploymentoverridesspec).
**Validation:** Optional: \&#123;\&#125;

---

**`v1beta2`** `JSON`

V1Beta2 losslessly preserves a native v1beta2 spec while this object is represented through v1alpha1. It is mutually exclusive with native fields. This field is a read-only conversion view; modify the request through the native v1beta2 API.
See [JSON](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#json-v1-apiextensions-k8s-io).
**Validation:** Type: object  Optional: \&#123;\&#125;

---

#### DynamoGraphDeploymentRequestStatus

DynamoGraphDeploymentRequestStatus represents the observed state of a DynamoGraphDeploymentRequest.
The controller updates this status as the DGDR progresses through its lifecycle.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequest](#dynamographdeploymentrequest)

**`state`** `DGDRState`

State is a high-level textual status of the deployment request lifecycle.
See [DGDRState](#dgdrstate).
**Validation:** Enum: \[Initializing Pending Profiling Deploying Ready DeploymentDeleted Failed]  Optional: \&#123;\&#125;

---

**`backend`** `string`

Backend is extracted from profilingConfig.config.engine.backend for display purposes. This field is populated by the controller and shown in kubectl output.
**Validation:** Optional: \&#123;\&#125;

---

**`observedGeneration`** `integer`

ObservedGeneration reflects the generation of the most recently observed spec. Used to detect spec changes and enforce immutability after profiling starts.

---

**`conditions`** `Condition array`

Conditions contains the latest observed conditions of the deployment request. Standard condition types include: Validation, Profiling, SpecGenerated, DeploymentReady. Conditions are merged by type on patch updates.
See [Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#condition-v1-meta).

---

**`profilingResults`** `string`

ProfilingResults contains a reference to the ConfigMap holding profiling data. Format: "configmap/\&lt;name\&gt;"
**Validation:** Optional: \&#123;\&#125;

---

**`generatedDeployment`** `RawExtension`

GeneratedDeployment contains the full generated DynamoGraphDeployment specification including metadata, based on profiling results. Users can extract this to create a DGD manually, or it's used automatically when autoApply is true. Stored as RawExtension to preserve all fields including metadata. For mocker backends, this contains the mocker DGD spec.
See [RawExtension](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#rawextension-runtime-pkg).
**Validation:** EmbeddedResource: \&#123;\&#125;  Optional: \&#123;\&#125;

---

**`deployment`** `DeploymentStatus`

Deployment tracks the auto-created DGD when AutoApply is true. Contains name, namespace, state, and creation status of the managed DGD.
See [DeploymentStatus](#deploymentstatus).
**Validation:** Optional: \&#123;\&#125;

---

**`v1beta2`** `JSON`

V1Beta2 losslessly preserves a native v1beta2 status while this object is represented through v1alpha1.
See [JSON](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#json-v1-apiextensions-k8s-io).
**Validation:** Type: object  Optional: \&#123;\&#125;

---

#### DynamoGraphDeploymentScalingAdapter

DynamoGraphDeploymentScalingAdapter provides a scaling interface for individual services
within a DynamoGraphDeployment. It implements the Kubernetes scale
subresource, enabling integration with HPA, KEDA, and custom autoscalers.

The adapter acts as an intermediary between autoscalers and the DGD,
ensuring that only the adapter controller modifies the DGD's service replicas.
This prevents conflicts when multiple autoscaling mechanisms are in play.

**Kind:** `resource`

**`apiVersion`** `string`

`nvidia.com/v1alpha1`

---

**`kind`** `string`

`DynamoGraphDeploymentScalingAdapter`

---

**`metadata`** `ObjectMeta`

Refer to Kubernetes API documentation for fields of `metadata`.
See [ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta).

---

**`spec`** `DynamoGraphDeploymentScalingAdapterSpec`

See [DynamoGraphDeploymentScalingAdapterSpec](#dynamographdeploymentscalingadapterspec).

---

**`status`** `DynamoGraphDeploymentScalingAdapterStatus`

See [DynamoGraphDeploymentScalingAdapterStatus](#dynamographdeploymentscalingadapterstatus).

---

#### DynamoGraphDeploymentScalingAdapterSpec

DynamoGraphDeploymentScalingAdapterSpec defines the desired state of DynamoGraphDeploymentScalingAdapter

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentScalingAdapter](#dynamographdeploymentscalingadapter)

**`replicas`** `integer` — required

Replicas is the desired number of replicas for the target service. This field is modified by external autoscalers (HPA/KEDA/Planner) or manually by users.
**Validation:** Minimum: 0  Required: \&#123;\&#125;

---

**`dgdRef`** `DynamoGraphDeploymentServiceRef` — required

DGDRef references the DynamoGraphDeployment and the specific service to scale.
See [DynamoGraphDeploymentServiceRef](#dynamographdeploymentserviceref).
**Validation:** Required: \&#123;\&#125;

---

#### DynamoGraphDeploymentScalingAdapterStatus

DynamoGraphDeploymentScalingAdapterStatus defines the observed state of DynamoGraphDeploymentScalingAdapter

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentScalingAdapter](#dynamographdeploymentscalingadapter)

**`replicas`** `integer`

Replicas is the current number of replicas for the target service. This is synced from the DGD's service replicas and is required for the scale subresource.
**Validation:** Optional: \&#123;\&#125;

---

**`selector`** `string`

Selector is a label selector string for the pods managed by this adapter. Required for HPA compatibility via the scale subresource.
**Validation:** Optional: \&#123;\&#125;

---

**`lastScaleTime`** `Time`

LastScaleTime is the last time the adapter scaled the target service.
See [Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoGraphDeploymentServiceRef

DynamoGraphDeploymentServiceRef identifies a specific service within a DynamoGraphDeployment

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentScalingAdapterSpec](#dynamographdeploymentscalingadapterspec)

**`name`** `string` — required

Name of the DynamoGraphDeployment
**Validation:** MinLength: 1  Required: \&#123;\&#125;

---

**`serviceName`** `string` — required

ServiceName is the key name of the service within the DGD's spec.services map to scale
**Validation:** MinLength: 1  Required: \&#123;\&#125;

---

#### DynamoGraphDeploymentSpec

DynamoGraphDeploymentSpec defines the desired state of DynamoGraphDeployment.

**Kind:** `type`
**Appears in:** [DynamoGraphDeployment](#dynamographdeployment)

**`providerOverride`** `ProviderOverride`

ProviderOverride configures the root resource generated by the selected graph-level workload provider. For Grove it uses apiVersion `grove.io/v1alpha1`, target `PodCliqueSet`, and may set only `spec.template.topologyConstraint`. It cannot select or change the provider.
See [ProviderOverride](#provideroverride).
**Validation:** Optional: \&#123;\&#125;

---

**`annotations`** `object (keys:string, values:string)`

Annotations to propagate to all child resources (PCS, DCD, Deployments, and pod templates). Service-level annotations take precedence over these values.
**Validation:** Optional: \&#123;\&#125;

---

**`labels`** `object (keys:string, values:string)`

Labels to propagate to all child resources (PCS, DCD, Deployments, and pod templates). Service-level labels take precedence over these values.
**Validation:** Optional: \&#123;\&#125;

---

**`priorityClassName`** `string`

PriorityClassName is the name of the PriorityClass to use for Grove PodCliqueSets. Requires the Grove pathway.
**Validation:** Optional: \&#123;\&#125;

---

**`pvcs`** `PVC array`

PVCs defines a list of persistent volume claims that can be referenced by components. Each PVC must have a unique name that can be referenced in component specifications.
See [PVC](#pvc).
**Validation:** MaxItems: 100  Optional: \&#123;\&#125;

---

**`services`** `object (keys:string, values:DynamoComponentDeploymentSharedSpec)`

Services are the services to deploy as part of this deployment.
See [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec).
**Validation:** MaxProperties: 25  Optional: \&#123;\&#125;

---

**`envs`** `EnvVar array`

Envs are environment variables applied to all services in the deployment unless overridden by service-specific configuration.
See [EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#envvar-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

**`backendFramework`** `string`

BackendFramework specifies the backend framework (e.g., "sglang", "vllm", "trtllm").
**Validation:** Enum: \[sglang vllm trtllm]

---

**`restart`** `Restart`

Restart specifies the restart policy for the graph deployment.
See [Restart](#restart).
**Validation:** Optional: \&#123;\&#125;

---

**`topologyConstraint`** `SpecTopologyConstraint`

TopologyConstraint is the deployment-level topology constraint. When set, topologyProfile is required and names the ClusterTopology CR to use. packDomain is optional here — it can be omitted when only services carry constraints. Services without their own topologyConstraint inherit from this value.
See [SpecTopologyConstraint](#spectopologyconstraint).
**Validation:** Optional: \&#123;\&#125;

---

**`experimental`** `DynamoGraphDeploymentExperimentalSpec`

Experimental groups graph-level preview features whose API shape and behavior may change in breaking ways between releases.
See [DynamoGraphDeploymentExperimentalSpec](#dynamographdeploymentexperimentalspec).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoGraphDeploymentStatus

DynamoGraphDeploymentStatus defines the observed state of DynamoGraphDeployment.

**Kind:** `type`
**Appears in:** [DynamoGraphDeployment](#dynamographdeployment)

**`observedGeneration`** `integer`

ObservedGeneration is the most recent generation observed by the controller.
**Validation:** Optional: \&#123;\&#125;

---

**`state`** `DGDState` — default: initializing

State is a high-level textual status of the graph deployment lifecycle.
See [DGDState](#dgdstate).
**Validation:** Enum: \[initializing pending successful failed]

---

**`conditions`** `Condition array`

Conditions contains the latest observed conditions of the graph deployment. The slice is merged by type on patch updates.
See [Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#condition-v1-meta).

---

**`services`** `object (keys:string, values:ServiceReplicaStatus)`

Services contains per-service replica status information. The map key is the service name from spec.services.
See [ServiceReplicaStatus](#servicereplicastatus).
**Validation:** Optional: \&#123;\&#125;

---

**`restart`** `RestartStatus`

Restart contains the status of the restart of the graph deployment.
See [RestartStatus](#restartstatus).
**Validation:** Optional: \&#123;\&#125;

---

**`checkpoints`** `object (keys:string, values:ServiceCheckpointStatus)`

Checkpoints contains per-service checkpoint status information. The map key is the service name from spec.services.
See [ServiceCheckpointStatus](#servicecheckpointstatus).
**Validation:** Optional: \&#123;\&#125;

---

**`rollingUpdate`** `RollingUpdateStatus`

RollingUpdate tracks the progress of operator manged rolling updates. Currently only supported for singl-node, non-Grove deployments (DCD/Deployment).
See [RollingUpdateStatus](#rollingupdatestatus).
**Validation:** Optional: \&#123;\&#125;

---

**`placement`** `PlacementStatus`

Placement groups DGD-level scheduler placement signals (score, reporting state, and any future placement fields).
See [PlacementStatus](#placementstatus).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoModel

DynamoModel is the Schema for the dynamo models API

**Kind:** `resource`

**`apiVersion`** `string`

`nvidia.com/v1alpha1`

---

**`kind`** `string`

`DynamoModel`

---

**`metadata`** `ObjectMeta`

Refer to Kubernetes API documentation for fields of `metadata`.
See [ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta).

---

**`spec`** `DynamoModelSpec`

See [DynamoModelSpec](#dynamomodelspec).

---

**`status`** `DynamoModelStatus`

See [DynamoModelStatus](#dynamomodelstatus).

---

#### DynamoModelSpec

DynamoModelSpec defines the desired state of DynamoModel

**Kind:** `type`
**Appears in:** [DynamoModel](#dynamomodel)

**`modelName`** `string` — required

ModelName is the full model identifier (e.g., "meta-llama/Llama-3.3-70B-Instruct-lora")
**Validation:** Required: \&#123;\&#125;

---

**`baseModelName`** `string` — required

BaseModelName is the base model identifier that matches the service label This is used to discover endpoints via headless services
**Validation:** Required: \&#123;\&#125;

---

**`modelType`** `string` — default: base

ModelType specifies the type of model (e.g., "base", "lora", "adapter")
**Validation:** Enum: \[base lora adapter]  Optional: \&#123;\&#125;

---

**`source`** `ModelSource`

Source specifies the model source location (only applicable for lora model type)
See [ModelSource](#modelsource).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoModelStatus

DynamoModelStatus defines the observed state of DynamoModel

**Kind:** `type`
**Appears in:** [DynamoModel](#dynamomodel)

**`endpoints`** `EndpointInfo array`

Endpoints is the current list of all endpoints for this model
See [EndpointInfo](#endpointinfo).
**Validation:** Optional: \&#123;\&#125;

---

**`readyEndpoints`** `integer`

ReadyEndpoints is the count of endpoints that are ready

---

**`loraFallbackCoveredEndpoints`** `integer`

LoRAFallbackCoveredEndpoints is the count of legacy prefill endpoints covered by a capable prefill during a rolling upgrade. These endpoints are excluded from ReadyEndpoints because they cannot serve the adapter directly.
**Validation:** Optional: \&#123;\&#125;

---

**`totalEndpoints`** `integer`

TotalEndpoints is the total count of endpoints

---

**`conditions`** `Condition array`

Conditions represents the latest available observations of the model's state
See [Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#condition-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoPoolRelay

DynamoPoolRelay deploys active-active Relay Pods for one DGD.
The resource name matches its DGD; the Service name adds the -pool-relay suffix.
The DGD needs Kubernetes pod-mode discovery and at least one worker component.
Worker and frontend components cannot use globalDynamoNamespace. The DGD name
must produce a DNS-1035 Service name, so it starts with a lowercase letter,
uses only lowercase letters, digits, and hyphens, and is at most 52 characters.

**Kind:** `resource`

**`apiVersion`** `string`

`nvidia.com/v1alpha1`

---

**`kind`** `string`

`DynamoPoolRelay`

---

**`metadata`** `ObjectMeta`

Refer to Kubernetes API documentation for fields of `metadata`.
See [ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta).

---

**`spec`** `DynamoPoolRelaySpec`

See [DynamoPoolRelaySpec](#dynamopoolrelayspec).

---

**`status`** `DynamoPoolRelayStatus`

See [DynamoPoolRelayStatus](#dynamopoolrelaystatus).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoPoolRelaySpec

DynamoPoolRelaySpec configures Relay Pods for the DGD with the same name and namespace.

**Kind:** `type`
**Appears in:** [DynamoPoolRelay](#dynamopoolrelay)

**`clusterId`** `string`

ClusterID is the Relay's stable logical cluster ID across restarts.
**Validation:** MaxLength: 128  MinLength: 1  Pattern: `^[^[:space:]\p\{Z\}\x85\x1c-\x1f](.*[^[:space:]\p\{Z\}\x85\x1c-\x1f])?$`

---

**`podTemplate`** `PodTemplateSpec` — required

PodTemplate configures Relay Pods. Its main container needs an image with dynamo.pool_relay and --sources-file support from the operator's revision. The controller sets the main command, listener probes, source volume, service account, and Relay identity and discovery environment variables. Reserved env names: DYN_NAMESPACE, DYN_DISCOVERY_BACKEND, DYN_KUBE_DISCOVERY_MODE, DYN_SYSTEM_PORT, DYN_TCP_RESPONSE_STREAM_HOST, DYN_TCP_RESPONSE_STREAM_PORT, DYN_CLUSTER_ID, DYN_RELAY_BIND, DYN_RELAY_CONNECTION_REVISION, DYN_RELAY_NAMESPACES, DYN_RELAY_WATCH_ALL, DYN_RELAY_ENDPOINT_PREFIXES, POD_NAME, POD_NAMESPACE, and POD_UID. The main container cannot use envFrom because it could override those values.
See [PodTemplateSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#podtemplatespec-v1-core).
**Validation:** Required: \&#123;\&#125;

---

**`replicas`** `integer` — default: 2

Replicas sets the number of active Relay Pods. Each watches the DGD.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

#### DynamoPoolRelayStatus

DynamoPoolRelayStatus reports listener availability. It does not report KV or model readiness.

**Kind:** `type`
**Appears in:** [DynamoPoolRelay](#dynamopoolrelay)

**`observedGeneration`** `integer`

ObservedGeneration is the Relay resource generation last reconciled by the operator.
**Validation:** Optional: \&#123;\&#125;

---

**`endpoint`** `string`

Endpoint is the cluster-local `<dgd>-pool-relay.<namespace>.svc:5561` address. It is empty after withdrawal or a failed reconciliation.
**Validation:** Optional: \&#123;\&#125;

---

**`availableReplicas`** `integer`

AvailableReplicas is the number of Relay Pods the Deployment reports available.
**Validation:** Optional: \&#123;\&#125;

---

**`conditions`** `Condition array`

Conditions includes Ready for listener availability, not model or KV readiness. Its reason is ListenerAvailable, DeploymentProgressing, DGDNotFound, DGDTerminating, UnsupportedDiscovery, UnsupportedSourceScope, NoWorkers, InvalidConfiguration, ReconcileFailed, or ResourceOwnershipConflict.
See [Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#condition-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

#### EPPConfig

EPPConfig contains configuration for the legacy Go EPP (Endpoint Picker Plugin).

Deprecated: Go EPP is deprecated. New EPP components should omit eppConfig and
use the native Rust EPP. Kept for round-trip and upgrade compatibility.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`configMapRef`** `ConfigMapKeySelector`

ConfigMapRef references a user-provided ConfigMap containing EPP configuration. The ConfigMap should contain EndpointPickerConfig YAML. Mutually exclusive with Config.
See [ConfigMapKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#configmapkeyselector-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

**`config`** `EndpointPickerConfig`

Config allows specifying EPP EndpointPickerConfig directly as a structured object. The operator will marshal this to YAML and create a ConfigMap automatically. Mutually exclusive with ConfigMapRef. One of ConfigMapRef or Config must be specified (no default configuration). Uses the upstream type from github.com/kubernetes-sigs/gateway-api-inference-extension
**Validation:** Type: object  Optional: \&#123;\&#125;

---

#### EndpointInfo

EndpointInfo represents a single endpoint (pod) serving the model

**Kind:** `type`
**Appears in:** [DynamoModelStatus](#dynamomodelstatus)

**`address`** `string`

Address is the full address of the endpoint (e.g., "[http://10.0.1.5:9090](http://10.0.1.5:9090)")

---

**`podName`** `string`

PodName is the name of the pod serving this endpoint
**Validation:** Optional: \&#123;\&#125;

---

**`ready`** `boolean`

Ready indicates whether this endpoint is ready to serve traffic. For LoRA models: true only if this endpoint's lifecycle request succeeded. For base models: always false (no probing performed).

---

**`loraFallbackCovered`** `boolean`

LoRAFallbackCovered indicates a legacy prefill endpoint that cannot manage LoRAs itself is covered by a capable prefill in the same topology during a rolling upgrade. It does not make this endpoint ready to serve the adapter.
**Validation:** Optional: \&#123;\&#125;

---

#### ExtraPodMetadata

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`annotations`** `object (keys:string, values:string)`

---

**`labels`** `object (keys:string, values:string)`

---

#### ExtraPodSpec

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`mainContainer`** `Container`

See [Container](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#container-v1-core).

---

#### FailoverSpec

FailoverSpec configures active-passive failover for a worker component.
For intraPod mode: requires gpuMemoryService.enabled; the main container is cloned
into engine containers (active + standby) within the same pod.
For interPod mode: the operator creates a dedicated GMS weight server pod and
multiple engine pods per rank that share GPUs via DRA resource claims.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`enabled`** `boolean`

Enabled activates failover mode.

---

**`mode`** `GPUMemoryServiceMode` — default: intraPod

Mode selects the failover deployment topology. intraPod: engine containers run within the same pod (requires gpuMemoryService.enabled). interPod: a dedicated GMS weight server pod + engine pods per rank (requires Grove).
See [GPUMemoryServiceMode](#gpumemoryservicemode).
**Validation:** Enum: \[intraPod interPod]  Optional: \&#123;\&#125;

---

**`numShadows`** `integer` — default: 1

NumShadows is the number of shadow (standby) engine pods per rank. Total engine pods per rank = NumShadows + 1 (1 primary + NumShadows shadows). NumShadows is only meaningful for mode=interPod; intraPod uses a fixed 1 primary + 1 shadow sidecar layout and any value other than 1 is rejected at admission time.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

#### FrontendSidecarSpec

FrontendSidecarSpec configures the auto-generated frontend sidecar container.
The operator uses these fields together with built-in frontend defaults (command, probes, ports,
and Dynamo env vars) to produce a fully configured sidecar container.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`image`** `string` — required

Image is the container image for the frontend sidecar.
**Validation:** Required: \&#123;\&#125;

---

**`args`** `string array`

Args overrides the default frontend arguments. When specified, these replace the default \["-m", "dynamo.frontend"] entirely. For example, \["-m", "dynamo.frontend", "--router-mode", "direct"] for GAIE deployments.
**Validation:** Optional: \&#123;\&#125;

---

**`envFromSecret`** `string`

EnvFromSecret references a Secret whose key/value pairs will be exposed as environment variables in the frontend sidecar container.
**Validation:** Optional: \&#123;\&#125;

---

**`envs`** `EnvVar array`

Envs defines additional environment variables for the frontend sidecar. These are merged with (and can override) the auto-generated Dynamo env vars.
See [EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#envvar-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

#### GMSClientPodSpec

GMSClientPodSpec declares an additional GMS client pod for inter-pod GMS.

**Kind:** `type`
**Appears in:** [GPUMemoryServiceSpec](#gpumemoryservicespec)

**`name`** `string`

Name identifies this client pod.
**Validation:** MaxLength: 63  MinLength: 1  Pattern: `^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`

---

**`podTemplate`** `PodTemplateSpec`

PodTemplate configures the pod to run as a GMS client.
See [PodTemplateSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#podtemplatespec-v1-core).
**Validation:** Schemaless: \&#123;\&#125;  Type: object

---

#### GPUMemoryServiceMode

GPUMemoryServiceMode selects the GMS deployment topology.

**Kind:** `enum`
**Underlying type:** `string`
**Appears in:** [FailoverSpec](#failoverspec), [GPUMemoryServiceSpec](#gpumemoryservicespec)

**Allowed values**

* intraPod

  GMSModeIntraPod runs GMS as a sidecar within the same pod.
* interPod

  GMSModeInterPod runs GMS as a separate weight server pod and one or more engine pods per rank, sharing GPUs via DRA ResourceClaims and a shared hostPath volume for UDS sockets. Extra client pod rendering is reserved for a follow-up change.

#### GPUMemoryServiceSpec

GPUMemoryServiceSpec configures the GPU Memory Service (GMS) for a worker component.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`enabled`** `boolean`

Enabled activates GMS wiring. GPU resources on client containers are replaced with a DRA ResourceClaim for shared GPU access.

---

**`mode`** `GPUMemoryServiceMode` — default: intraPod

Mode selects the GMS deployment topology.
See [GPUMemoryServiceMode](#gpumemoryservicemode).
**Validation:** Enum: \[intraPod interPod]  Optional: \&#123;\&#125;

---

**`deviceClassName`** `string` — default: gpu.nvidia.com

DeviceClassName is the DRA DeviceClass to request GPUs from.
**Validation:** Optional: \&#123;\&#125;

---

**`extraClientContainers`** `string array`

ExtraClientContainers lists additional user-declared containers that should be wired as GMS clients in pods rendered from the enclosing spec. DGD/DCD services apply this to service pods. Automatic captures apply SnapshotJob capture Pod clients before creating the SnapshotJob. Every name must match a user-declared container in the enclosing pod spec.
**Validation:** items:MaxLength: 63  items:MinLength: 1  items:Pattern: `^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`  Optional: \&#123;\&#125;

---

**`extraClientPods`** `GMSClientPodSpec array`

ExtraClientPods declares additional GMS client pods for inter-pod GMS. This field is reserved for future use and is rejected until inter-pod client orchestration is wired.
See [GMSClientPodSpec](#gmsclientpodspec).
**Validation:** Optional: \&#123;\&#125;

---

#### IngressSpec

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`enabled`** `boolean`

Enabled exposes the component through an ingress or virtual service when true.

---

**`host`** `string`

Host is the base host name to route external traffic to this component.

---

**`useVirtualService`** `boolean`

UseVirtualService indicates whether to configure a service-mesh VirtualService instead of a standard Ingress.

---

**`virtualServiceGateway`** `string`

VirtualServiceGateway optionally specifies the gateway name to attach the VirtualService to.

---

**`hostPrefix`** `string`

HostPrefix is an optional prefix added before the host.

---

**`annotations`** `object (keys:string, values:string)`

Annotations to set on the generated Ingress/VirtualService resources.

---

**`labels`** `object (keys:string, values:string)`

Labels to set on the generated Ingress/VirtualService resources.

---

**`tls`** `IngressTLSSpec`

TLS holds the TLS configuration used by the Ingress/VirtualService.
See [IngressTLSSpec](#ingresstlsspec).

---

**`hostSuffix`** `string`

HostSuffix is an optional suffix appended after the host.

---

**`ingressControllerClassName`** `string`

IngressControllerClassName selects the ingress controller class (e.g., "nginx").

---

#### IngressTLSSpec

**Kind:** `type`
**Appears in:** [IngressSpec](#ingressspec)

**`secretName`** `string`

SecretName is the name of a Kubernetes Secret containing the TLS certificate and key.

---

#### KvTransferEnforcement

KvTransferEnforcement controls how the selected prefill worker's topology is
applied to decode routing.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[required preferred]
**Appears in:** [KvTransferPolicy](#kvtransferpolicy)

**Allowed values**

* required

  KvTransferEnforcementRequired enforces same-domain decode worker selection.
* preferred

  KvTransferEnforcementPreferred biases decode worker selection toward the same domain.

#### KvTransferPolicy

KvTransferPolicy configures topology-aware routing for KV-cache transfers
between prefill and decode workers. This graph-wide policy lives under
`spec.experimental` while the API is incubating.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentExperimentalSpec](#dynamographdeploymentexperimentalspec)

**`clusterTopologyName`** `string`

ClusterTopologyName references a Grove ClusterTopology CR. The operator reads the CR's topology levels and projects them through Dynamo-owned pod labels for worker topology metadata.
**Validation:** MinLength: 1  Optional: \&#123;\&#125;

---

**`labelKey`** `string`

LabelKey is a Kubernetes node label key (e.g. "topology.kubernetes.io/zone") whose value identifies the topology domain for each worker. The operator copies the node label onto worker pods so the runtime can publish it as worker metadata. The label should correspond to the topology level named in `domain`.
**Validation:** MaxLength: 317  MinLength: 1  Pattern: `^(([a-z0-9]([-a-z0-9]\{0,61\}[a-z0-9])?)(\.[a-z0-9]([-a-z0-9]\{0,61\}[a-z0-9])?)*/)?([A-Za-z0-9]([-A-Za-z0-9_.]\{0,61\}[A-Za-z0-9])?)$`  Optional: \&#123;\&#125;

---

**`domain`** `TopologyDomain`

Domain is the logical name for the topology level to enforce (e.g. "zone", "rack"). The router uses this to match workers that share the same value for the label identified by `labelKey`.
See [TopologyDomain](#topologydomain).
**Validation:** Pattern: `^[a-z0-9]([a-z0-9-]*[a-z0-9])?$`

---

**`enforcement`** `KvTransferEnforcement` — default: required

Enforcement controls how the selected prefill worker's topology is applied to decode routing. "required" only allows decode workers in the same topology domain as the selected prefill worker. "preferred" keeps all decode workers eligible, but biases selection toward workers in the same topology domain. Defaults to "required".
See [KvTransferEnforcement](#kvtransferenforcement).
**Validation:** Enum: \[required preferred]  Optional: \&#123;\&#125;

---

**`preferredWeight`** `float`

PreferredWeight is required and used only when enforcement is "preferred". Higher values create a stronger same-domain routing preference, but do not guarantee same-domain selection. The value is not a probability; worker selection still depends on load and other routing inputs. A value of 0 disables the topology preference; 1 is the strongest supported preference.
**Validation:** Maximum: 1  Minimum: 0  Optional: \&#123;\&#125;

---

#### ModelReference

ModelReference identifies a model served by this component

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`name`** `string` — required

Name is the base model identifier (e.g., "llama-3-70b-instruct-v1")
**Validation:** Required: \&#123;\&#125;

---

**`revision`** `string`

Revision is the model revision/version (optional)
**Validation:** Optional: \&#123;\&#125;

---

#### ModelSource

ModelSource defines the source location of a model

**Kind:** `type`
**Appears in:** [DynamoModelSpec](#dynamomodelspec)

**`uri`** `string` — required

URI is the model source URI Supported formats: - S3: s3://bucket/path/to/model - HuggingFace: hf://org/model\@revision_sha - Local filesystem: file:///path/to/model
**Validation:** Required: \&#123;\&#125;

---

#### MultinodeSpec

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`nodeCount`** `integer` — default: 2

Indicates the number of nodes to deploy for multinode components. Total number of GPUs is NumberOfNodes \* GPU limit. Must be greater than 1 and is immutable after creation.
**Validation:** Minimum: 2

---

#### PVC

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentSpec](#dynamographdeploymentspec)

**`create`** `boolean`

Create indicates to create a new PVC

---

**`name`** `string` — required

Name is the name of the PVC
**Validation:** Required: \&#123;\&#125;

---

**`storageClass`** `string`

StorageClass to be used for PVC creation. Required when create is true.

---

**`size`** `Quantity`

Size of the volume in Gi, used during PVC creation. Required when create is true.
See [Quantity](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#quantity-resource-api).

---

**`volumeAccessMode`** `PersistentVolumeAccessMode`

VolumeAccessMode is the volume access mode of the PVC. Required when create is true.
See [PersistentVolumeAccessMode](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#persistentvolumeaccessmode-v1-core).

---

#### PlacementScoreState

PlacementScoreState describes whether placement score is available and how
complete the reported score is for a graph deployment. See the v1beta1
PlacementScoreState for the authoritative semantics of each value.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Reported Partial Unsupported Unknown]
**Appears in:** [PlacementStatus](#placementstatus)

**Allowed values**

* Reported
* Partial
* Unsupported
* Unknown

#### PlacementStatus

PlacementStatus groups DGD-level scheduler placement fields under a single
status object so future placement signals can be added without a schema
break. See the v1beta1 PlacementStatus for the authoritative field docs.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentStatus](#dynamographdeploymentstatus)

**`score`** `float`

Score is the DGD-level scheduler placement score. Normalized to \[0.0, 1.0] where higher is better and 1.0 is the best possible placement.
**Validation:** Maximum: 1  Minimum: 0  Optional: \&#123;\&#125;

---

**`state`** `PlacementScoreState`

State indicates placement score reporting state.
See [PlacementScoreState](#placementscorestate).
**Validation:** Enum: \[Reported Partial Unsupported Unknown]  Optional: \&#123;\&#125;

---

#### ProfilingConfigSpec

ProfilingConfigSpec defines configuration for the profiling process.
This structure maps directly to the profile_sla.py config format.
See dynamo/profiler/utils/profiler_argparse.py for the complete schema.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#dynamographdeploymentrequestspec)

**`config`** `JSON`

Config is the profiling configuration as arbitrary JSON/YAML. This will be passed directly to the profiler. The profiler will validate the configuration and report any errors.
See [JSON](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#json-v1-apiextensions-k8s-io).
**Validation:** Optional: \&#123;\&#125;  Type: object

---

**`configMapRef`** `ConfigMapKeySelector`

ConfigMapRef is an optional reference to a ConfigMap containing the DynamoGraphDeployment base config file (disagg.yaml). This is separate from the profiling config above. The path to this config will be set as engine.config in the profiling config.
See [ConfigMapKeySelector](#configmapkeyselector).
**Validation:** Optional: \&#123;\&#125;

---

**`profilerImage`** `string` — required

ProfilerImage specifies the container image to use for profiling jobs. This image contains the profiler code and dependencies needed for SLA-based profiling. Example: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0"
**Validation:** Required: \&#123;\&#125;

---

**`outputPVC`** `string`

OutputPVC is an optional PersistentVolumeClaim name for storing profiling output. If specified, all profiling artifacts (logs, plots, configs, raw data) will be written to this PVC instead of an ephemeral emptyDir volume. This allows users to access complete profiling results after the job completes by mounting the PVC. The PVC must exist in the same namespace as the DGDR. If not specified, profiling uses emptyDir and only essential data is saved to ConfigMaps. Note: ConfigMaps are still created regardless of this setting for planner integration.
**Validation:** Optional: \&#123;\&#125;

---

**`resources`** `ResourceRequirements`

Resources specifies the compute resource requirements for the profiling job container. If not specified, no resource requests or limits are set.
See [ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#resourcerequirements-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

**`tolerations`** `Toleration array`

Tolerations allows the profiling job to be scheduled on nodes with matching taints. For example, to schedule on GPU nodes, add a toleration for the nvidia.com/gpu taint.
See [Toleration](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#toleration-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

**`nodeSelector`** `object (keys:string, values:string)`

NodeSelector is a selector which must match a node's labels for the profiling pod to be scheduled on that node. For example, to schedule on ARM64 nodes, use \&#123;"kubernetes.io/arch": "arm64"\&#125;.
**Validation:** Optional: \&#123;\&#125;

---

#### ProviderOverride

ProviderOverride carries a sparse provider-native fragment for its DGD context.
Grove support is restricted as follows:

* apiVersion must be `grove.io/v1alpha1`.
* target is `PodCliqueSet`, `PodCliqueTemplateSpec`, or
  `PodCliqueScalingGroupConfig`, according to the field location and
  component shape.
* value may set topologyConstraint, and component contexts may set the
  native minAvailable field and rollingUpdate.maxUnavailable. Availability
  and rollout budgets are not supported at root or role scope.

All other providers, versions, targets, and fields are rejected.

**Kind:** `type`
**Appears in:** [ComponentRoleSpec](#componentrolespec), [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoGraphDeploymentSpec](#dynamographdeploymentspec)

**`apiVersion`** `string` — required

apiVersion is the Kubernetes API group and version of the provider schema. Grove requires `grove.io/v1alpha1`.
**Validation:** MinLength: 1  Required: \&#123;\&#125;

---

**`target`** `string`

target identifies the provider resource kind or embedded provider schema. It may be omitted on input when the DGD location has one unambiguous target; admission resolves and persists it.
**Validation:** Optional: \&#123;\&#125;

---

**`value`** `JSON` — required

value is a sparse fragment of the selected provider schema. For Grove, PodCliqueSet accepts only `spec.template.topologyConstraint`; embedded targets accept `topologyConstraint`. Component contexts also accept `spec.minAvailable` on PodCliqueTemplateSpec or `minAvailable` on PodCliqueScalingGroupConfig. The minimum is immutable; migrating from the deprecated component field preserves its value and leaves the update strategy unchanged. Component contexts also accept rollingUpdate.maxUnavailable.
See [JSON](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#json-v1-apiextensions-k8s-io).
**Validation:** Required: \&#123;\&#125;  Type: object

---

#### ResourceItem

**Kind:** `type`
**Appears in:** [Resources](#resources)

**`cpu`** `string`

CPU specifies the CPU resource request/limit (e.g., "1000m", "2")

---

**`memory`** `string`

Memory specifies the memory resource request/limit (e.g., "4Gi", "8Gi")

---

**`gpu`** `string`

GPU indicates the number of GPUs to request. Total number of GPUs is NumberOfNodes \* GPU in case of multinode deployment.

---

**`gpuType`** `string`

GPUType can specify a custom GPU type, e.g. "gpu.intel.com/xe" By default if not specified, the GPU type is "nvidia.com/gpu"

---

**`custom`** `object (keys:string, values:string)`

Custom specifies additional custom resource requests/limits

---

#### Resources

Resources defines requested and limits for a component, including CPU, memory,
GPUs/devices, and any runtime-specific resources.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`requests`** `ResourceItem`

Requests specifies the minimum resources required by the component
See [ResourceItem](#resourceitem).

---

**`limits`** `ResourceItem`

Limits specifies the maximum resources allowed for the component
See [ResourceItem](#resourceitem).

---

**`claims`** `ResourceClaim array`

Claims specifies resource claims for dynamic resource allocation
See [ResourceClaim](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#resourceclaim-v1-core).

---

#### Restart

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentSpec](#dynamographdeploymentspec)

**`id`** `string` — required

ID is an arbitrary string that triggers a restart when changed. Any modification to this value will initiate a restart of the graph deployment according to the strategy.
**Validation:** MinLength: 1  Required: \&#123;\&#125;

---

**`strategy`** `RestartStrategy`

Strategy specifies the restart strategy for the graph deployment.
See [RestartStrategy](#restartstrategy).
**Validation:** Optional: \&#123;\&#125;

---

#### RestartPhase

**Kind:** `enum`
**Underlying type:** `string`
**Appears in:** [RestartStatus](#restartstatus)

**Allowed values**

* Pending
* Restarting
* Completed
* Failed
* Superseded

#### RestartStatus

RestartStatus contains the status of the restart of the graph deployment.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentStatus](#dynamographdeploymentstatus)

**`observedID`** `string`

ObservedID is the restart ID that has been observed and is being processed. Matches the Restart.ID field in the spec.

---

**`phase`** `RestartPhase`

Phase is the phase of the restart.
See [RestartPhase](#restartphase).

---

**`inProgress`** `string array`

InProgress contains the names of the services that are currently being restarted.
**Validation:** Optional: \&#123;\&#125;

---

#### RestartStrategy

**Kind:** `type`
**Appears in:** [Restart](#restart)

**`type`** `RestartStrategyType` — default: Sequential

Type specifies the restart strategy type.
See [RestartStrategyType](#restartstrategytype).
**Validation:** Enum: \[Sequential Parallel]

---

**`order`** `string array`

Order specifies the order in which the services should be restarted.
**Validation:** Optional: \&#123;\&#125;

---

#### RestartStrategyType

**Kind:** `enum`
**Underlying type:** `string`
**Appears in:** [RestartStrategy](#restartstrategy)

**Allowed values**

* Sequential
* Parallel

#### RollingUpdatePhase

RollingUpdatePhase represents the current phase of a rolling update.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Pending InProgress Completed Failed ]
**Appears in:** [RollingUpdateStatus](#rollingupdatestatus)

**Allowed values**

* Pending
* InProgress
* Completed
* \`\`

#### RollingUpdateStatus

RollingUpdateStatus tracks the progress of a rolling update.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentStatus](#dynamographdeploymentstatus)

**`phase`** `RollingUpdatePhase`

Phase indicates the current phase of the rolling update.
See [RollingUpdatePhase](#rollingupdatephase).
**Validation:** Enum: \[Pending InProgress Completed Failed ]  Optional: \&#123;\&#125;

---

**`startTime`** `Time`

StartTime is when the rolling update began.
See [Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`endTime`** `Time`

EndTime is when the rolling update completed (successfully or failed).
See [Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`updatedServices`** `string array`

UpdatedServices is the list of services that have completed the rolling update. A service is considered updated when its new replicas are all ready and old replicas are fully scaled down. Only services of componentType Worker (or Prefill/Decode) are considered.
**Validation:** Optional: \&#123;\&#125;

---

#### ScalingAdapter

ScalingAdapter configures whether a service uses the DynamoGraphDeploymentScalingAdapter
(DGDSA) for replica management. When enabled, the DGDSA owns the replicas field so that
external autoscalers (HPA, KEDA, Planner) can drive scaling via the Scale subresource.

Enable it with `scalingAdapter: {enabled: true}`. Because `enabled` defaults to false, a
bare `scalingAdapter: {}` is disabled.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`enabled`** `boolean` — default: false

Enabled turns the ScalingAdapter on for this service. When true, a DGDSA is created and owns the replicas field. When false (the default), no DGDSA is created and replicas are set directly on the DGD -- so a bare `scalingAdapter: \{\}` is disabled; set `enabled: true` to opt in.
**Validation:** Optional: \&#123;\&#125;

---

#### ServiceCheckpointConfig

ServiceCheckpointConfig configures checkpointing for a DGD service

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`enabled`** `boolean` — default: false

Enabled indicates whether checkpointing is enabled for this service. When true, omit CheckpointRef for a DGD-managed automatic checkpoint or set CheckpointRef to restore a PodSnapshot in the same namespace.
**Validation:** Optional: \&#123;\&#125;

---

**`mode`** `CheckpointMode`

Deprecated: omit mode. Use enabled=true without checkpointRef for a DGD-managed automatic checkpoint, or use checkpointRef to restore the named PodSnapshot.
See [CheckpointMode](#checkpointmode).
**Validation:** Enum: \[Auto Manual]  Optional: \&#123;\&#125;

---

**`startupPolicy`** `CheckpointStartupPolicy` — default: Immediate

StartupPolicy defines when normal worker replicas are started relative to automatic checkpoint readiness. - Immediate: start workers cold immediately; later Pods restore from the   checkpoint once it is Ready. - WaitForCheckpoint: keep worker replicas at zero until the checkpoint is   Ready, then start them from the checkpoint.
See [CheckpointStartupPolicy](#checkpointstartuppolicy).
**Validation:** Enum: \[Immediate WaitForCheckpoint]  Optional: \&#123;\&#125;

---

**`deletionPolicy`** `CheckpointDeletionPolicy` — default: Delete

DeletionPolicy defines whether a DGD-managed automatic checkpoint CR and artifact are deleted or retained when the owning DGD is deleted. Explicit checkpointRef PodSnapshots are never owned or deleted by the DGD.
See [CheckpointDeletionPolicy](#checkpointdeletionpolicy).
**Validation:** Enum: \[Delete Retain]  Optional: \&#123;\&#125;

---

**`checkpointRef`** `string`

CheckpointRef references an existing PodSnapshot in the same namespace by metadata.name. If specified, this service's Identity is ignored and the referenced PodSnapshot is used directly. Standalone worker-class (worker, prefill, or decode) DynamoComponentDeployment resources cannot set this field; configure CheckpointRef on the owning DynamoGraphDeployment service.
**Validation:** Optional: \&#123;\&#125;

---

**`identity`** `DynamoCheckpointIdentity`

Deprecated: omit for DGD-managed checkpoints; the operator ignores this field. Use CheckpointRef to restore an existing PodSnapshot.
See [DynamoCheckpointIdentity](#dynamocheckpointidentity).
**Validation:** Optional: \&#123;\&#125;

---

**`targetContainerName`** `string` — default: main

TargetContainerName is the workload container to snapshot and restore.
**Validation:** MaxLength: 63  MinLength: 1  Pattern: `^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`  Optional: \&#123;\&#125;

---

**`job`** `ServiceCheckpointJobConfig`

Job customizes the DGD-managed SnapshotJob capture Pod.
See [ServiceCheckpointJobConfig](#servicecheckpointjobconfig).
**Validation:** Optional: \&#123;\&#125;

---

#### ServiceCheckpointJobConfig

ServiceCheckpointJobConfig customizes the SnapshotJob capture Pod created for a DGD service.

**Kind:** `type`
**Appears in:** [ServiceCheckpointConfig](#servicecheckpointconfig)

**`gmsClientContainers`** `string array`

GMSClientContainers lists SnapshotJob capture Pod containers that should receive GMS client wiring. Requires gpuMemoryService on the service.
**Validation:** items:MaxLength: 63  items:MinLength: 1  items:Pattern: `^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`  Optional: \&#123;\&#125;

---

**`podTemplate`** `PodTemplateSpec`

PodTemplate customizes the SnapshotJob capture Pod. The operator starts from the selected workload container and merges this template so users can add helper containers such as gms-saver.
See [PodTemplateSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#podtemplatespec-v1-core).
**Validation:** Schemaless: \&#123;\&#125;  Type: object  Optional: \&#123;\&#125;

---

#### ServiceCheckpointStatus

ServiceCheckpointStatus contains checkpoint information for a single service.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentStatus](#dynamographdeploymentstatus)

**`checkpointName`** `string`

CheckpointName is the name of the active PodSnapshot.
**Validation:** Optional: \&#123;\&#125;

---

**`checkpointID`** `string`

CheckpointID is a deprecated legacy Dynamo artifact ID. Native standalone snapshots leave this field empty.
**Validation:** Optional: \&#123;\&#125;

---

**`identityHash`** `string`

IdentityHash is a deprecated legacy checkpoint identity hash. Native standalone snapshots leave this field empty.
**Validation:** Optional: \&#123;\&#125;

---

**`ready`** `boolean`

Ready indicates the checkpoint artifact is ready for future pods to restore.
**Validation:** Optional: \&#123;\&#125;

---

#### ServiceReplicaStatus

ServiceReplicaStatus contains replica information for a single service.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentStatus](#dynamographdeploymentstatus)

**`componentKind`** `ComponentKind`

ComponentKind is the underlying resource kind (e.g., "PodClique", "PodCliqueScalingGroup", "Deployment", "LeaderWorkerSet").
See [ComponentKind](#componentkind).
**Validation:** Enum: \[PodClique PodCliqueScalingGroup Deployment LeaderWorkerSet]

---

**`componentName`** `string`

ComponentName is the name of the primary underlying resource. DEPRECATED: Use ComponentNames instead. This field will be removed in a future release. During rolling updates, this reflects the new (target) component name.

---

**`componentNames`** `string array`

ComponentNames is the list of underlying resource names for this service. During normal operation, this contains a single name. During rolling updates, this contains both old and new component names.
**Validation:** Optional: \&#123;\&#125;

---

**`runtimeNamespace`** `string`

RuntimeNamespace is the effective Dynamo runtime namespace for this component. Worker components may include a generation suffix; non-workers and Grove-backed workers use the base namespace. During rolling updates, worker status keeps the old active revision namespace until cutover completes.
**Validation:** Optional: \&#123;\&#125;

---

**`servedModelName`** `string`

ServedModelName is the effective primary model identity exposed by this component's serving role in combined mode. Native sidecars omit this field; Kubernetes Planner reads their registered model identity. During rolling updates, worker status keeps the old active revision until cutover completes.
**Validation:** Optional: \&#123;\&#125;

---

**`runtimeComponentName`** `string`

RuntimeComponentName is an explicit Dynamo runtime component identity resolved from the serving role's endpoint override in combined mode. Native sidecars omit this field; Kubernetes Planner reads their registered component identity. During rolling updates, worker status keeps the old active revision value until cutover completes.
**Validation:** Optional: \&#123;\&#125;

---

**`gpuPowerLimitWatts`** `integer`

GPUPowerLimitWatts is the effective per-GPU power limit propagated to the component's Pods. Omission means no power limit is configured.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`gpusPerEngine`** `integer`

GPUsPerEngine is the number of GPUs assigned to one inference engine in a service replica, across all of its nodes. Independent auxiliary GPU allocations are excluded. A present zero means the engine itself has no GPUs; consult GPUsPerReplica for auxiliary allocations.
**Validation:** Minimum: 0  Optional: \&#123;\&#125;

---

**`gpusPerReplica`** `integer`

GPUsPerReplica is the unique GPU allocation added when this service scales by one replica, across all nodes, application and initialization phases, and provider-owned Pods. Scalar GPUs use the Kubernetes effective Pod scheduling footprint; shared DRA claims are counted once. A present zero records a successful non-GPU resolution; omission means no current shape is available.
**Validation:** Minimum: 0  Optional: \&#123;\&#125;

---

**`replicas`** `integer`

Replicas is the total number of non-terminated replicas. Required for all component kinds.
**Validation:** Minimum: 0

---

**`updatedReplicas`** `integer`

UpdatedReplicas is the number of replicas at the current/desired revision. Required for all component kinds.
**Validation:** Minimum: 0

---

**`readyReplicas`** `integer`

ReadyReplicas is the number of ready replicas. Populated for PodClique, Deployment, and LeaderWorkerSet. Not available for PodCliqueScalingGroup. When nil, the field is omitted from the API response.
**Validation:** Minimum: 0  Optional: \&#123;\&#125;

---

**`availableReplicas`** `integer`

AvailableReplicas is the number of available replicas. For Deployment: replicas ready for >= minReadySeconds. For PodCliqueScalingGroup: replicas where all constituent PodCliques have >= MinAvailable ready pods. Not available for PodClique or LeaderWorkerSet. When nil, the field is omitted from the API response.
**Validation:** Minimum: 0  Optional: \&#123;\&#125;

---

**`scheduledReplicas`** `integer`

ScheduledReplicas is the number of replicas the backend scheduler has scheduled, in Dynamo component-replica units. Optional; omitted (nil) when the backend cannot derive it reliably. A nil value means "not reported", never "zero scheduled".
**Validation:** Minimum: 0  Optional: \&#123;\&#125;

---

#### SharedMemorySpec

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`disabled`** `boolean`

Disabled, when true, opts out of mounting a shared-memory medium for the component. When false (or unset), shared memory is enabled and Size is required (enforced by the validating webhook). Size is ignored when Disabled is true.

---

**`size`** `Quantity`

See [Quantity](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#quantity-resource-api).

---

#### SpecTopologyConstraint

SpecTopologyConstraint defines deployment-level topology placement requirements.
It carries both the topology profile (which ClusterTopology CR to use) and an
optional default pack domain that services without their own constraint inherit.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentSpec](#dynamographdeploymentspec)

**`topologyProfile`** `string`

TopologyProfile is the name of the ClusterTopology CR that defines the topology hierarchy for this deployment.
**Validation:** MinLength: 1

---

**`packDomain`** `TopologyDomain`

PackDomain is the default topology domain to pack pods within. Optional — omit when only services carry constraints.
See [TopologyDomain](#topologydomain).
**Validation:** Pattern: `^[a-z0-9]([a-z0-9-]*[a-z0-9])?$`  Optional: \&#123;\&#125;

---

#### TopologyConstraint

TopologyConstraint defines service-level topology placement requirements.
The topology profile is inherited from the deployment-level SpecTopologyConstraint;
only the pack domain is specified here.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`packDomain`** `TopologyDomain`

PackDomain is the topology domain to pack pods within. Must match a domain defined in the referenced ClusterTopology CR.
See [TopologyDomain](#topologydomain).
**Validation:** Pattern: `^[a-z0-9]([a-z0-9-]*[a-z0-9])?$`

---

#### TopologyDomain

TopologyDomain is a free-form topology level identifier.
Common examples: "region", "zone", "datacenter", "block", "rack", "host", "numa".
When used with a ClusterTopology CR, domain names are defined in the CR's
hierarchy; when used with `spec.experimental.kvTransferPolicy.labelKey`
alone, the value is a user-chosen logical name for the topology level.
Must match `^[a-z0-9]([a-z0-9-]*[a-z0-9])?$` (lowercase alphanumeric,
may contain hyphens but must not start or end with one).

**Kind:** `type`
**Underlying type:** `string`
**Validation:** Pattern: `^[a-z0-9]([a-z0-9-]*[a-z0-9])?$`
**Appears in:** [KvTransferPolicy](#kvtransferpolicy), [SpecTopologyConstraint](#spectopologyconstraint), [TopologyConstraint](#topologyconstraint)

#### VolumeMount

VolumeMount references a PVC defined at the top level for volumes to be mounted by the component

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#dynamocomponentdeploymentspec)

**`name`** `string` — required

Name references a PVC name defined in the top-level PVCs map
**Validation:** Required: \&#123;\&#125;

---

**`mountPoint`** `string`

MountPoint specifies where to mount the volume. If useAsCompilationCache is true and mountPoint is not specified, a backend-specific default will be used.

---

**`useAsCompilationCache`** `boolean` — default: false

UseAsCompilationCache indicates this volume should be used as a compilation cache. When true, backend-specific environment variables will be set and default mount points may be used.

---

## nvidia.com/v1beta1

Package v1beta1 contains API Schema definitions for the nvidia.com v1beta1 API group.

**Resource Types**

#### [DynamoComponentDeployment](#v1beta1-dynamocomponentdeployment)

#### [DynamoGraphDeployment](#v1beta1-dynamographdeployment)

#### [DynamoGraphDeploymentRequest](#v1beta1-dynamographdeploymentrequest)

#### [DynamoGraphDeploymentScalingAdapter](#v1beta1-dynamographdeploymentscalingadapter)

#### BackendType

BackendType specifies the inference backend.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[auto sglang trtllm vllm]
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta1-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta1-dynamographdeploymentrequestspec)

**Allowed values**

* auto
* sglang
* trtllm
* vllm

#### CheckpointDeletionPolicy

CheckpointDeletionPolicy defines what happens to DGD-managed automatic
checkpoint resources when the owning DGD is deleted.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Delete Retain]
**Appears in:** [ComponentCheckpointConfig](#componentcheckpointconfig)

**Allowed values**

* Delete

  CheckpointDeletionPolicyDelete deletes DGD-managed automatic checkpoint CRs and artifacts when the owning DGD is deleted.
* Retain

  CheckpointDeletionPolicyRetain keeps DGD-managed automatic checkpoint CRs and artifacts after the owning DGD is deleted. Retained automatic checkpoints are not valid checkpointRef targets.

#### CheckpointMode

Deprecated: use checkpoint.enabled instead.
enabled=true without checkpointRef creates a DGD-managed automatic
checkpoint; checkpointRef restores the named PodSnapshot.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Auto Manual]
**Appears in:** [ComponentCheckpointConfig](#componentcheckpointconfig)

**Allowed values**

* Auto

  Deprecated: use checkpoint.enabled=true and omit checkpointRef.
* Manual

  Deprecated: use checkpointRef to restore an existing PodSnapshot.

#### CheckpointStartupPolicy

CheckpointStartupPolicy defines when worker pods should wait for a checkpoint.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Immediate WaitForCheckpoint]
**Appears in:** [ComponentCheckpointConfig](#componentcheckpointconfig)

**Allowed values**

* Immediate

  CheckpointStartupPolicyImmediate starts workers immediately. The SnapshotJob capture runs in the background, and only pods created after the checkpoint is Ready are restore-shaped by the pod-create mutating webhook.
* WaitForCheckpoint

  CheckpointStartupPolicyWaitForCheckpoint gates worker replicas until the component's checkpoint is Ready, then starts them from the checkpoint.

#### CompilationCacheConfig

CompilationCacheConfig configures a PVC-backed compilation cache for a component.
The operator handles backend-specific mount paths and environment variables so
users do not need to hand-wire them into the pod template.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#v1beta1-dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#v1beta1-dynamocomponentdeploymentspec)

**`pvcName`** `string` — required

pvcName references a user-created PVC by name. The PVC must exist in the same namespace as the DynamoGraphDeployment.
**Validation:** MinLength: 1  Required: \&#123;\&#125;

---

**`mountPath`** `string`

mountPath overrides the backend-specific default mount path. When empty, the operator selects a default appropriate for the backend framework.
**Validation:** Optional: \&#123;\&#125;

---

#### ComponentCheckpointConfig

ComponentCheckpointConfig configures checkpointing for a DGD component.

**Kind:** `type`
**Appears in:** [ExperimentalSpec](#experimentalspec)

**`enabled`** `boolean` — required

enabled indicates whether checkpointing is enabled for this component. When true, omit checkpointRef for a DGD-managed automatic checkpoint or set checkpointRef to restore an existing PodSnapshot in the same namespace. Omit the checkpoint block, or set enabled=false, to disable checkpointing.
**Validation:** Required: \&#123;\&#125;

---

**`mode`** `CheckpointMode`

Deprecated: omit mode. Use enabled=true without checkpointRef for a DGD-managed automatic checkpoint, or use checkpointRef to restore the named PodSnapshot.
See [CheckpointMode](#v1beta1-checkpointmode).
**Validation:** Enum: \[Auto Manual]  Optional: \&#123;\&#125;

---

**`startupPolicy`** `CheckpointStartupPolicy` — default: Immediate

startupPolicy defines when normal worker replicas are started relative to automatic checkpoint readiness. `Immediate` (default): start workers cold immediately; later Pods restore from the checkpoint once it is Ready. `WaitForCheckpoint`: keep worker replicas at zero until the checkpoint is Ready, then start them from the checkpoint.
See [CheckpointStartupPolicy](#v1beta1-checkpointstartuppolicy).
**Validation:** Enum: \[Immediate WaitForCheckpoint]  Optional: \&#123;\&#125;

---

**`deletionPolicy`** `CheckpointDeletionPolicy` — default: Delete

DeletionPolicy defines whether a DGD-managed automatic checkpoint CR and artifact are deleted or retained when the owning DGD is deleted. Explicit checkpointRef PodSnapshots are never owned or deleted by the DGD.
See [CheckpointDeletionPolicy](#v1beta1-checkpointdeletionpolicy).
**Validation:** Enum: \[Delete Retain]  Optional: \&#123;\&#125;

---

**`checkpointRef`** `string`

checkpointRef references an existing PodSnapshot in the same namespace by metadata.name. When set, this component's `identity` is ignored and the referenced PodSnapshot is used directly. Standalone worker-class (worker, prefill, or decode) DynamoComponentDeployment resources cannot set this field; configure checkpointRef on the owning DynamoGraphDeployment component.
**Validation:** Optional: \&#123;\&#125;

---

**`identity`** `DynamoCheckpointIdentity`

Deprecated: omit for DGD-managed checkpoints; the operator ignores this field. Use checkpointRef to restore an existing PodSnapshot.
See [DynamoCheckpointIdentity](#v1beta1-dynamocheckpointidentity).
**Validation:** Optional: \&#123;\&#125;

---

**`targetContainerName`** `string` — default: main

targetContainerName is the workload container to snapshot and restore.
**Validation:** MaxLength: 63  MinLength: 1  Pattern: `^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`  Optional: \&#123;\&#125;

---

**`job`** `ComponentCheckpointJobConfig`

job customizes the DGD-managed SnapshotJob capture Pod.
See [ComponentCheckpointJobConfig](#componentcheckpointjobconfig).
**Validation:** Optional: \&#123;\&#125;

---

#### ComponentCheckpointJobConfig

ComponentCheckpointJobConfig customizes the SnapshotJob capture Pod created for a DGD component.

**Kind:** `type`
**Appears in:** [ComponentCheckpointConfig](#componentcheckpointconfig)

**`gmsClientContainers`** `string array`

gmsClientContainers lists SnapshotJob capture Pod containers that should receive GMS client wiring. Requires gpuMemoryService on the component.
**Validation:** items:MaxLength: 63  items:MinLength: 1  items:Pattern: `^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`  Optional: \&#123;\&#125;

---

**`podTemplate`** `PodTemplateSpec`

podTemplate customizes the SnapshotJob capture Pod. The operator starts from the selected workload container and merges this template so users can add helper containers such as gms-saver.
See [PodTemplateSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#podtemplatespec-v1-core).
**Validation:** Schemaless: \&#123;\&#125;  Type: object  Optional: \&#123;\&#125;

---

#### ComponentCheckpointStatus

ComponentCheckpointStatus contains checkpoint information for a single component.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentStatus](#v1beta1-dynamographdeploymentstatus)

**`checkpointName`** `string`

checkpointName is the name of the active PodSnapshot.
**Validation:** Optional: \&#123;\&#125;

---

**`checkpointID`** `string`

checkpointID is a deprecated legacy Dynamo artifact ID. Native standalone snapshots leave this field empty.
**Validation:** Optional: \&#123;\&#125;

---

**`identityHash`** `string`

identityHash is a deprecated legacy checkpoint identity hash. Native standalone snapshots leave this field empty.
**Validation:** Optional: \&#123;\&#125;

---

**`ready`** `boolean`

ready indicates the checkpoint artifact is ready for future pods to restore.
**Validation:** Optional: \&#123;\&#125;

---

#### ComponentKind

ComponentKind represents the type of underlying Kubernetes resource backing a DGD component.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[PodClique PodCliqueScalingGroup Deployment LeaderWorkerSet]
**Appears in:** [ComponentReplicaStatus](#componentreplicastatus)

**Allowed values**

* PodClique
* PodCliqueScalingGroup
* Deployment
* LeaderWorkerSet

#### ComponentReplicaStatus

ComponentReplicaStatus contains replica information for a single component.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentStatus](#v1beta1-dynamographdeploymentstatus)

**`componentKind`** `ComponentKind`

componentKind is the underlying resource kind (e.g. `PodClique`, `Deployment`, `LeaderWorkerSet`).
See [ComponentKind](#v1beta1-componentkind).
**Validation:** Enum: \[PodClique PodCliqueScalingGroup Deployment LeaderWorkerSet]

---

**`componentNames`** `string array`

componentNames is the list of underlying Kubernetes resource names for this Dynamo component. During normal operation this contains a single name; during rolling updates it contains both old and new resource names.
**Validation:** Optional: \&#123;\&#125;

---

**`runtimeNamespace`** `string`

runtimeNamespace is the effective Dynamo runtime namespace for this component. Worker components may include a generation suffix; non-workers use the base namespace. During rolling updates, worker status keeps the old active revision namespace until cutover completes.
**Validation:** Optional: \&#123;\&#125;

---

**`servedModelName`** `string`

servedModelName is the effective primary model identity exposed by this component's serving role in combined mode. Native sidecars omit this field; Kubernetes Planner reads their registered model identity. During rolling updates, worker status keeps the old active revision until cutover completes.
**Validation:** Optional: \&#123;\&#125;

---

**`runtimeComponentName`** `string`

runtimeComponentName is an explicit Dynamo runtime component identity resolved from the serving role's endpoint override in combined mode. Native sidecars omit this field; Kubernetes Planner reads their registered component identity. During rolling updates, worker status keeps the old active revision value until cutover completes.
**Validation:** Optional: \&#123;\&#125;

---

**`gpuPowerLimitWatts`** `integer`

gpuPowerLimitWatts is the effective per-GPU power limit propagated to the component's Pods. Omission means no power limit is configured.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`gpusPerEngine`** `integer`

gpusPerEngine is the number of GPUs assigned to one inference engine in a component replica, across all of its nodes. Independent auxiliary GPU allocations are excluded. A present zero means the engine itself has no GPUs; consult gpusPerReplica for auxiliary allocations.
**Validation:** Minimum: 0  Optional: \&#123;\&#125;

---

**`gpusPerReplica`** `integer`

gpusPerReplica is the unique GPU allocation added when this component scales by one replica, across all nodes, application and initialization phases, and provider-owned Pods. Scalar GPUs use the Kubernetes effective Pod scheduling footprint; shared DRA claims are counted once. A present zero records a successful non-GPU resolution; omission means no current shape is available.
**Validation:** Minimum: 0  Optional: \&#123;\&#125;

---

**`replicas`** `integer`

replicas is the total number of non-terminated replicas.
**Validation:** Minimum: 0

---

**`updatedReplicas`** `integer`

updatedReplicas is the number of replicas at the current/desired revision.
**Validation:** Minimum: 0

---

**`readyReplicas`** `integer`

readyReplicas is the number of ready replicas. Populated for `PodClique`, `Deployment`, and `LeaderWorkerSet`; not available for `PodCliqueScalingGroup`.
**Validation:** Minimum: 0  Optional: \&#123;\&#125;

---

**`availableReplicas`** `integer`

availableReplicas is the number of available replicas. Populated for `Deployment` and `PodCliqueScalingGroup`; not available for `PodClique` or `LeaderWorkerSet`.
**Validation:** Minimum: 0  Optional: \&#123;\&#125;

---

**`scheduledReplicas`** `integer`

scheduledReplicas is the number of replicas the backend scheduler has scheduled, expressed strictly in Dynamo component-replica units (not raw backend pod counts). It is a diagnostic aid for distinguishing capacity/scheduling shortfalls from runtime readiness. It is optional and omitted (nil) when the active backend cannot derive it reliably in component-replica units — for example before the backing resource's status has been observed, or for backends that do not report a scheduling count. A nil value therefore means "not reported", never "zero scheduled"; consumers must not treat absence as a scheduling failure.
**Validation:** Minimum: 0  Optional: \&#123;\&#125;

---

#### ComponentRoleSpec

ComponentRoleSpec configures one named Pod-producing role inside a compound component.
The enclosing component type defines the allowed role names and cardinality.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#v1beta1-dynamocomponentdeploymentsharedspec)

**`name`** `string` — required

name identifies the role within the enclosing component independently of generated provider resource names.
**Validation:** MaxLength: 63  MinLength: 1  Pattern: `^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`  Required: \&#123;\&#125;

---

**`replicas`** `integer`

replicas is the logical cardinality of this role in one complete component instance. The enclosing component type defines the cardinality. For multinode components, admission defaults and persists omitted values from multinode.nodeCount; leader must be 1 and worker must be multinode.nodeCount minus 1.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`providerOverride`** `ProviderOverride`

providerOverride configures the provider workload unit generated for this role. It is supported only for components embedded in a DGD.
See [ProviderOverride](#v1beta1-provideroverride).
**Validation:** Optional: \&#123;\&#125;

---

**`podTemplate`** `PodTemplateSpec`

podTemplate defines the complete Pod configuration for this role. Admission permits it only when the enclosing component type supports role-specific Pod templates. For multinode components, every required role must supply one and the role templates own backend-specific leader and worker launch commands.
See [PodTemplateSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#podtemplatespec-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

#### ComponentType

ComponentType identifies the role of a Dynamo component within a graph.
In v1beta1 this is a strict enum. Unlike v1alpha1 (where `subComponentType`
was used as a workaround for disaggregated serving), `prefill` and `decode`
are first-class values: users can set them directly and downstream consumers
(e.g., the EPP) can filter on the pod label `nvidia.com/dynamo-component-type`.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[frontend worker prefill decode planner epp lpx]
**Appears in:** [DynamoComponentDeploymentSharedSpec](#v1beta1-dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#v1beta1-dynamocomponentdeploymentspec)

**Allowed values**

* frontend
* worker
* prefill
* decode
* planner
* epp
* lpx

#### DGDRPhase

DGDRPhase represents the lifecycle phase of a DynamoGraphDeploymentRequest.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Pending Profiling Ready Deploying Deployed Failed]
**Appears in:** [DynamoGraphDeploymentRequestNativeStatus](#v1beta1-dynamographdeploymentrequestnativestatus), [DynamoGraphDeploymentRequestStatus](#v1beta1-dynamographdeploymentrequeststatus)

**Allowed values**

* Pending
* Profiling
* Ready
* Deploying
* Deployed
* Failed

#### DGDState

DGDState is the high-level lifecycle state of a DynamoGraphDeployment.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[initializing pending successful failed]
**Appears in:** [DynamoGraphDeploymentStatus](#v1beta1-dynamographdeploymentstatus)

**Allowed values**

* initializing
* pending
* successful
* failed

#### DeploymentInfoStatus

DeploymentInfoStatus tracks the state of the deployed DynamoGraphDeployment.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeStatus](#v1beta1-dynamographdeploymentrequestnativestatus), [DynamoGraphDeploymentRequestStatus](#v1beta1-dynamographdeploymentrequeststatus)

**`replicas`** `integer`

Replicas is the desired number of replicas.
**Validation:** Optional: \&#123;\&#125;

---

**`availableReplicas`** `integer`

AvailableReplicas is the number of replicas that are available and ready.
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoCheckpointIdentity

Deprecated: omit in DGD component checkpoint configs. Automatic capture
needs no replacement; use checkpointRef to restore a PodSnapshot.
Duplicated from v1alpha1 for conversion compatibility.

**Kind:** `type`
**Appears in:** [ComponentCheckpointConfig](#componentcheckpointconfig)

**`model`** `string` — required

model is the model identifier (e.g. "meta-llama/Llama-3-70B"). Deprecated: legacy identity only.
**Validation:** MinLength: 1  Required: \&#123;\&#125;

---

**`backendFramework`** `string` — required

backendFramework is the runtime framework (`vllm`, `sglang`, `trtllm`). Deprecated: legacy identity only.
**Validation:** Enum: \[vllm sglang trtllm]  Required: \&#123;\&#125;

---

**`dynamoVersion`** `string`

dynamoVersion is the Dynamo platform version. Deprecated: legacy identity only.
**Validation:** Optional: \&#123;\&#125;

---

**`tensorParallelSize`** `integer` — default: 1

tensorParallelSize is the tensor parallel configuration. Deprecated: checkpoint launch uses the pod template instead.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`pipelineParallelSize`** `integer` — default: 1

pipelineParallelSize is the pipeline parallel configuration. Deprecated: checkpoint launch uses the pod template instead.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`dtype`** `string`

dtype is the data type (`fp16`, `bf16`, `fp8`, etc.). Deprecated: legacy identity only.
**Validation:** Optional: \&#123;\&#125;

---

**`maxModelLen`** `integer`

maxModelLen is the maximum sequence length. Deprecated: legacy identity only.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`extraParameters`** `object (keys:string, values:string)`

extraParameters are additional parameters that affect the checkpoint hash. Deprecated: legacy identity only.
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoComponentDeployment

DynamoComponentDeployment is the Schema for the dynamocomponentdeployments API.

v1beta1 is the storage version. The API server transparently converts
to and from the served v1alpha1 version through
operator's conversion webhook; see api/v1alpha1/\*\_conversion.go.

**Kind:** `resource`

**`apiVersion`** `string`

`nvidia.com/v1beta1`

---

**`kind`** `string`

`DynamoComponentDeployment`

---

**`metadata`** `ObjectMeta`

Refer to Kubernetes API documentation for fields of `metadata`.
See [ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta).

---

**`spec`** `DynamoComponentDeploymentSpec`

spec defines the desired state for this Dynamo component deployment.
See [DynamoComponentDeploymentSpec](#v1beta1-dynamocomponentdeploymentspec).

---

#### v1beta1 DynamoComponentDeploymentSharedSpec

DynamoComponentDeploymentSharedSpec is the shared configuration used by both
standalone DCDs and by the components embedded in a DynamoGraphDeployment.

In v1beta1 the ten per-component pod-configuration fields that existed in
v1alpha1 (resources, envs, envFromSecret, livenessProbe, readinessProbe,
volumeMounts, annotations, labels, extraPodMetadata, extraPodSpec) are
replaced with a single `podTemplate` field holding a native
`corev1.PodTemplateSpec`. By default, the operator injects its defaults into
`podTemplate.spec.containers[name=main]` and merges user overrides using
strategic-merge-by-name semantics. In Dynamo sidecar mode, Dynamo defaults target
`podTemplate.spec.initContainers[name=runtime]` instead. Users can add sidecars,
init containers, and pod-level configuration directly in `podTemplate` without
any `extraPodSpec`-style escape hatch. Container paths are relative to the component spec.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentSpec](#v1beta1-dynamographdeploymentspec)

**`providerOverride`** `ProviderOverride`

providerOverride configures the primary Grove unit representing this DGD component. With apiVersion `grove.io/v1alpha1`, target is `PodCliqueTemplateSpec` for a single-node component or `PodCliqueScalingGroupConfig` for a PCSG-backed component; value may set `topologyConstraint` and `rollingUpdate.maxUnavailable`. Standalone DCD OpenAPI omits this field.
See [ProviderOverride](#v1beta1-provideroverride).
**Validation:** Optional: \&#123;\&#125;

---

**`name`** `string` — required

name is the stable logical identifier for this component within its DynamoGraphDeployment. It must be unique within the parent's `spec.components` list. For standalone DynamoComponentDeployment objects, the defaulting webhook populates `name` from `metadata.name` on admission, so users typically do not need to set it explicitly. `name` is decoupled from the underlying Kubernetes resource name so that the operator can rename child workloads (e.g. suffixing worker DCDs with a hash during rolling updates) without losing the stable identity that downstream consumers (labels, status maps, DGDSA references, planner RBAC, EPP filters) depend on.
**Validation:** MaxLength: 63  MinLength: 1  Pattern: `^[A-Za-z0-9]([-A-Za-z0-9]*[A-Za-z0-9])?$`  Required: \&#123;\&#125;

---

**`type`** `ComponentType`

type indicates the role of this component within a Dynamo graph. Drives port mapping, frontend detection, planner RBAC, and the pod label `nvidia.com/dynamo-component-type`. Because `prefill` and `decode` are first-class values, users can set them directly. The DGD-only "lpx" type is experimental, requires the operator's lpx.enabled setting, and may change incompatibly.
See [ComponentType](#componenttype).
**Validation:** Enum: \[frontend worker prefill decode planner epp lpx]  Optional: \&#123;\&#125;

---

**`runtimeVersionOverride`** `string`

RuntimeVersionOverride overrides the Dynamo runtime compatibility version inferred from podTemplate.spec.containers\[name=main].image. In sidecar mode, it instead overrides the version inferred from podTemplate.spec.initContainers\[name=runtime].image. The same rules apply to roles\[].podTemplate. For non-LPX components in sidecar mode, main container images are not used to infer Dynamo versions, including for roles without a runtime init container. This field does not change container images. For frontend, worker, prefill, decode, planner, and epp components, DGD admission requires this field when any runtime image tag lacks a parseable semantic version. Components without a type and controller-generated DCDs may omit it. An override is also needed when the parsed tag differs from the Dynamo runtime version. The value must use canonical MAJOR.MINOR.PATCH format, for example "1.4.0", and match the Dynamo version in every affected runtime container. Setting or changing an override of 1.5.0 or later may trigger a rollout.
**Validation:** Pattern: `^(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})$`  Optional: \&#123;\&#125;

---

**`globalDynamoNamespace`** `boolean`

globalDynamoNamespace places the component in the global Dynamo namespace rather than the per-deployment namespace derived from the DGD name.
**Validation:** Optional: \&#123;\&#125;

---

**`podTemplate`** `PodTemplateSpec`

PodTemplate supplies the Pod configuration shared by this component's roles. It is mutually exclusive with roles\[].podTemplate. New components using this template must include podTemplate.spec.containers\[name=main] with a non-empty image. Existing components without a podTemplate may retain that omission on update. By default, the operator merges Dynamo defaults into podTemplate.spec.containers\[name=main]. Declaring podTemplate.spec.initContainers\[name=runtime] enables Dynamo sidecar mode. The main container runs the inference engine, and the runtime init container receives Dynamo environment, identity, system port, and probe defaults. The operator does not create the runtime init container. Its declaration must include a non-empty image and restartPolicy: Always. Sidecar mode supports worker, prefill, and decode components. Multinode sidecars support backendFramework: sglang, vllm, and trtllm. Multinode sidecars require complete leader and worker roles\[].podTemplate definitions instead of this shared template. The leader must declare a runtime init container. The worker may omit it. Each role's template supplies the engine command and topology arguments. Declared runtime init containers still receive Dynamo defaults. Checkpoint, GPU memory service, and failover cannot be enabled in sidecar mode. Graph-level env applies to podTemplate.spec.containers\[name=main] and any declared podTemplate.spec.initContainers\[name=runtime]. Compilation cache and shared memory apply to the main container. Other containers require their own configuration, including an image. See runtimeVersionOverride for runtime image version requirements.
See [PodTemplateSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#podtemplatespec-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

**`replicas`** `integer`

replicas is the desired number of Pods for this component. When `scalingAdapter` is set on this component, this field is managed by the DynamoGraphDeploymentScalingAdapter and should not be modified directly.
**Validation:** Minimum: 0  Optional: \&#123;\&#125;

---

**`minAvailable`** `integer`

minAvailable maps to Grove PodCliqueScalingGroup minAvailable for components rendered as a scaling group (multi-node, inter-pod GMS, or `experimental.grove.forceScalingGroup`; see `UsesPCSG`) and to Grove PodClique minAvailable for all other single-node components. This field determines 1) the minimum number of replicas guaranteed to be gang-scheduled, and 2) when violating minAvailable replicas triggers gang termination. Deprecated: use providerOverride.value.spec.minAvailable for a standalone Grove PodClique, or providerOverride.value.minAvailable for a scaling group. The effective minimum is immutable after creation; moving the same value to the new form is supported without changing the update strategy. Grove uses RollingRecreate unless a strategy annotation explicitly overrides it. New Grove deployments default the provider-native form to 1. Scale-to-zero preserves the minimum until replicas becomes positive again. For non-Grove deployments, setting this field will result in a validation error.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`multinode`** `MultinodeSpec`

multinode configures worker, prefill, or decode components that span multiple Pods.
See [MultinodeSpec](#v1beta1-multinodespec).
**Validation:** Optional: \&#123;\&#125;

---

**`roles`** `ComponentRoleSpec array`

roles expose the named Pod-producing parts inside a compound component. When set for a multinode component, this list must contain exactly one leader and one worker role. Admission defaults omitted replicas to 1 for leader and multinode.nodeCount minus 1 for worker. Omitting the roles list preserves the implicit multinode role layout. LPX components each require an agent role. A DGD may contain independent LPX components, each serving through its own conductor role or agent runtime init container, or a draft and target pair in which only the target serves. Every LPX role requires its own podTemplate.
See [ComponentRoleSpec](#v1beta1-componentrolespec).
**Validation:** MaxItems: 2  Optional: \&#123;\&#125;

---

**`sharedMemorySize`** `Quantity`

sharedMemorySize controls the size of the tmpfs mounted at `/dev/shm`. `nil` selects the operator default (8Gi), a positive quantity sets a custom size, and `"0"` disables the shared-memory volume entirely. Simpler replacement for v1alpha1's `SharedMemorySpec` struct with its `disabled bool` + `size Quantity` pattern.
See [Quantity](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#quantity-resource-api).
**Validation:** Optional: \&#123;\&#125;

---

**`modelRef`** `ModelReference`

modelRef references a model served by this component. When specified, a headless service is created for endpoint discovery.
See [ModelReference](#v1beta1-modelreference).
**Validation:** Optional: \&#123;\&#125;

---

**`scalingAdapter`** `ScalingAdapter`

scalingAdapter opts this component into the DynamoGraphDeploymentScalingAdapter. Setting it (even as an empty object, `scalingAdapter: \{\}`) creates a DGDSA that owns the `replicas` field so that external autoscalers (HPA/KEDA/Planner) can drive scaling via the Scale subresource; omit the field to opt out.
See [ScalingAdapter](#v1beta1-scalingadapter).
**Validation:** Optional: \&#123;\&#125;

---

**`eppConfig`** `EPPConfig`

eppConfig holds legacy Go-EPP configuration for Endpoint Picker Plugin components. Only meaningful when `type` is `epp`. Deprecated: omit this field for the native Rust EPP. Presence of `eppConfig` selects the legacy Go EPP Pod contract (CLI flags + config mount) so existing DGDs keep running across operator upgrades until migration is started by clearing this field.
See [EPPConfig](#v1beta1-eppconfig).
**Validation:** Optional: \&#123;\&#125;

---

**`lpx`** `LPXConfig`

lpx holds LPX integration configuration. Only meaningful when `type` is `lpx`. Experimental: requires the operator's lpx.enabled setting and may change incompatibly.
See [LPXConfig](#lpxconfig).
**Validation:** Optional: \&#123;\&#125;

---

**`frontendSidecar`** `string`

frontendSidecar optionally designates a container in each selected PodTemplate as the frontend sidecar. The value must match the `name` of a container in the component-level podTemplate, or in every role podTemplate when those are used. The operator merges its frontend-sidecar defaults (auto-generated Dynamo env vars, ports, health probes) into that container the same way it merges into `podTemplate.spec.containers[name=main]`. The full container definition (image, args, envFrom, env) lives in `podTemplate` -- this eliminates the redundant `image`, `args`, `envFromSecret`, and `envs` fields from v1alpha1's `FrontendSidecarSpec`. The validation webhook rejects values that do not match the selected templates.
**Validation:** Optional: \&#123;\&#125;

---

**`compilationCache`** `CompilationCacheConfig`

compilationCache configures a PVC-backed compilation cache. The operator handles backend-specific mount paths and environment variables, so users do not need to hand-wire them into `podTemplate`. Extracted from v1alpha1's `volumeMount.useAsCompilationCache` flag.
See [CompilationCacheConfig](#compilationcacheconfig).
**Validation:** Optional: \&#123;\&#125;

---

**`topologyConstraint`** `TopologyConstraint`

topologyConstraint applies to this component. `topologyConstraint.packDomain` is required. When both this and `spec.topologyConstraint.packDomain` are set, this field's `packDomain` must be narrower than or equal to the spec-level value.
See [TopologyConstraint](#v1beta1-topologyconstraint).
**Validation:** Optional: \&#123;\&#125;

---

**`experimental`** `ExperimentalSpec`

experimental groups opt-in preview features whose API shape and behavior may change in breaking ways between v1beta1 releases, including disappearing without a name-preserving graduation path. In v1beta1 this block holds `gpuMemoryService` and `failover` (which remain tightly coupled -- failover requires GMS -- and are expected to evolve together as the DRA-based GPU sharing story matures); and `checkpoint` (whose API shape is still settling). Fields here are explicitly NOT covered by the normal v1beta1 deprecation policy; do not depend on them for production workloads.
See [ExperimentalSpec](#experimentalspec).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoComponentDeploymentSpec

DynamoComponentDeploymentSpec defines the desired state of a DynamoComponentDeployment.

**Kind:** `type`
**Appears in:** [DynamoComponentDeployment](#v1beta1-dynamocomponentdeployment)

**`backendFramework`** `string`

backendFramework specifies the backend framework.
**Validation:** Enum: \[sglang vllm trtllm]

---

**`name`** `string` — required

name is the stable logical identifier for this component within its DynamoGraphDeployment. It must be unique within the parent's `spec.components` list. For standalone DynamoComponentDeployment objects, the defaulting webhook populates `name` from `metadata.name` on admission, so users typically do not need to set it explicitly. `name` is decoupled from the underlying Kubernetes resource name so that the operator can rename child workloads (e.g. suffixing worker DCDs with a hash during rolling updates) without losing the stable identity that downstream consumers (labels, status maps, DGDSA references, planner RBAC, EPP filters) depend on.
**Validation:** MaxLength: 63  MinLength: 1  Pattern: `^[A-Za-z0-9]([-A-Za-z0-9]*[A-Za-z0-9])?$`  Required: \&#123;\&#125;

---

**`type`** `ComponentType`

type indicates the role of this component within a Dynamo graph. Drives port mapping, frontend detection, planner RBAC, and the pod label `nvidia.com/dynamo-component-type`. Because `prefill` and `decode` are first-class values, users can set them directly. The DGD-only "lpx" type is experimental, requires the operator's lpx.enabled setting, and may change incompatibly.
See [ComponentType](#componenttype).
**Validation:** Enum: \[frontend worker prefill decode planner epp lpx]  Optional: \&#123;\&#125;

---

**`runtimeVersionOverride`** `string`

RuntimeVersionOverride overrides the Dynamo runtime compatibility version inferred from podTemplate.spec.containers\[name=main].image. In sidecar mode, it instead overrides the version inferred from podTemplate.spec.initContainers\[name=runtime].image. The same rules apply to roles\[].podTemplate. For non-LPX components in sidecar mode, main container images are not used to infer Dynamo versions, including for roles without a runtime init container. This field does not change container images. For frontend, worker, prefill, decode, planner, and epp components, DGD admission requires this field when any runtime image tag lacks a parseable semantic version. Components without a type and controller-generated DCDs may omit it. An override is also needed when the parsed tag differs from the Dynamo runtime version. The value must use canonical MAJOR.MINOR.PATCH format, for example "1.4.0", and match the Dynamo version in every affected runtime container. Setting or changing an override of 1.5.0 or later may trigger a rollout.
**Validation:** Pattern: `^(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})$`  Optional: \&#123;\&#125;

---

**`globalDynamoNamespace`** `boolean`

globalDynamoNamespace places the component in the global Dynamo namespace rather than the per-deployment namespace derived from the DGD name.
**Validation:** Optional: \&#123;\&#125;

---

**`podTemplate`** `PodTemplateSpec`

PodTemplate supplies the Pod configuration shared by this component's roles. It is mutually exclusive with roles\[].podTemplate. New components using this template must include podTemplate.spec.containers\[name=main] with a non-empty image. Existing components without a podTemplate may retain that omission on update. By default, the operator merges Dynamo defaults into podTemplate.spec.containers\[name=main]. Declaring podTemplate.spec.initContainers\[name=runtime] enables Dynamo sidecar mode. The main container runs the inference engine, and the runtime init container receives Dynamo environment, identity, system port, and probe defaults. The operator does not create the runtime init container. Its declaration must include a non-empty image and restartPolicy: Always. Sidecar mode supports worker, prefill, and decode components. Multinode sidecars support backendFramework: sglang, vllm, and trtllm. Multinode sidecars require complete leader and worker roles\[].podTemplate definitions instead of this shared template. The leader must declare a runtime init container. The worker may omit it. Each role's template supplies the engine command and topology arguments. Declared runtime init containers still receive Dynamo defaults. Checkpoint, GPU memory service, and failover cannot be enabled in sidecar mode. Graph-level env applies to podTemplate.spec.containers\[name=main] and any declared podTemplate.spec.initContainers\[name=runtime]. Compilation cache and shared memory apply to the main container. Other containers require their own configuration, including an image. See runtimeVersionOverride for runtime image version requirements.
See [PodTemplateSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#podtemplatespec-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

**`replicas`** `integer`

replicas is the desired number of Pods for this component. When `scalingAdapter` is set on this component, this field is managed by the DynamoGraphDeploymentScalingAdapter and should not be modified directly.
**Validation:** Minimum: 0  Optional: \&#123;\&#125;

---

**`minAvailable`** `integer`

minAvailable maps to Grove PodCliqueScalingGroup minAvailable for components rendered as a scaling group (multi-node, inter-pod GMS, or `experimental.grove.forceScalingGroup`; see `UsesPCSG`) and to Grove PodClique minAvailable for all other single-node components. This field determines 1) the minimum number of replicas guaranteed to be gang-scheduled, and 2) when violating minAvailable replicas triggers gang termination. Deprecated: use providerOverride.value.spec.minAvailable for a standalone Grove PodClique, or providerOverride.value.minAvailable for a scaling group. The effective minimum is immutable after creation; moving the same value to the new form is supported without changing the update strategy. Grove uses RollingRecreate unless a strategy annotation explicitly overrides it. New Grove deployments default the provider-native form to 1. Scale-to-zero preserves the minimum until replicas becomes positive again. For non-Grove deployments, setting this field will result in a validation error.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`multinode`** `MultinodeSpec`

multinode configures worker, prefill, or decode components that span multiple Pods.
See [MultinodeSpec](#v1beta1-multinodespec).
**Validation:** Optional: \&#123;\&#125;

---

**`roles`** `object array`

roles expose the named Pod-producing parts inside a compound component. When set for a multinode component, this list must contain exactly one leader and one worker role. Admission defaults omitted replicas to 1 for leader and multinode.nodeCount minus 1 for worker. Omitting the roles list preserves the implicit multinode role layout. LPX components each require an agent role. A DGD may contain independent LPX components, each serving through its own conductor role or agent runtime init container, or a draft and target pair in which only the target serves. Every LPX role requires its own podTemplate. Standalone DCD roles support `name`, `replicas`, and `podTemplate`; `providerOverride` is a DGD-only provider context.
**Validation:** MaxItems: 2  Optional: \&#123;\&#125;

---

**`sharedMemorySize`** `Quantity`

sharedMemorySize controls the size of the tmpfs mounted at `/dev/shm`. `nil` selects the operator default (8Gi), a positive quantity sets a custom size, and `"0"` disables the shared-memory volume entirely. Simpler replacement for v1alpha1's `SharedMemorySpec` struct with its `disabled bool` + `size Quantity` pattern.
See [Quantity](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#quantity-resource-api).
**Validation:** Optional: \&#123;\&#125;

---

**`modelRef`** `ModelReference`

modelRef references a model served by this component. When specified, a headless service is created for endpoint discovery.
See [ModelReference](#v1beta1-modelreference).
**Validation:** Optional: \&#123;\&#125;

---

**`scalingAdapter`** `ScalingAdapter`

scalingAdapter opts this component into the DynamoGraphDeploymentScalingAdapter. Setting it (even as an empty object, `scalingAdapter: \{\}`) creates a DGDSA that owns the `replicas` field so that external autoscalers (HPA/KEDA/Planner) can drive scaling via the Scale subresource; omit the field to opt out.
See [ScalingAdapter](#v1beta1-scalingadapter).
**Validation:** Optional: \&#123;\&#125;

---

**`eppConfig`** `EPPConfig`

eppConfig holds legacy Go-EPP configuration for Endpoint Picker Plugin components. Only meaningful when `type` is `epp`. Deprecated: omit this field for the native Rust EPP. Presence of `eppConfig` selects the legacy Go EPP Pod contract (CLI flags + config mount) so existing DGDs keep running across operator upgrades until migration is started by clearing this field.
See [EPPConfig](#v1beta1-eppconfig).
**Validation:** Optional: \&#123;\&#125;

---

**`frontendSidecar`** `string`

frontendSidecar optionally designates a container in each selected PodTemplate as the frontend sidecar. The value must match the `name` of a container in the component-level podTemplate, or in every role podTemplate when those are used. The operator merges its frontend-sidecar defaults (auto-generated Dynamo env vars, ports, health probes) into that container the same way it merges into `podTemplate.spec.containers[name=main]`. The full container definition (image, args, envFrom, env) lives in `podTemplate` -- this eliminates the redundant `image`, `args`, `envFromSecret`, and `envs` fields from v1alpha1's `FrontendSidecarSpec`. The validation webhook rejects values that do not match the selected templates.
**Validation:** Optional: \&#123;\&#125;

---

**`compilationCache`** `CompilationCacheConfig`

compilationCache configures a PVC-backed compilation cache. The operator handles backend-specific mount paths and environment variables, so users do not need to hand-wire them into `podTemplate`. Extracted from v1alpha1's `volumeMount.useAsCompilationCache` flag.
See [CompilationCacheConfig](#compilationcacheconfig).
**Validation:** Optional: \&#123;\&#125;

---

**`topologyConstraint`** `TopologyConstraint`

topologyConstraint applies to this component. `topologyConstraint.packDomain` is required. When both this and `spec.topologyConstraint.packDomain` are set, this field's `packDomain` must be narrower than or equal to the spec-level value.
See [TopologyConstraint](#v1beta1-topologyconstraint).
**Validation:** Optional: \&#123;\&#125;

---

**`experimental`** `ExperimentalSpec`

experimental groups opt-in preview features whose API shape and behavior may change in breaking ways between v1beta1 releases, including disappearing without a name-preserving graduation path. In v1beta1 this block holds `gpuMemoryService` and `failover` (which remain tightly coupled -- failover requires GMS -- and are expected to evolve together as the DRA-based GPU sharing story matures); and `checkpoint` (whose API shape is still settling). Fields here are explicitly NOT covered by the normal v1beta1 deprecation policy; do not depend on them for production workloads.
See [ExperimentalSpec](#experimentalspec).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoGraphDeployment

DynamoGraphDeployment is the Schema for the dynamographdeployments API.

v1beta1 is the storage version. The API server transparently converts
to and from the served v1alpha1 version through
operator's conversion webhook; see api/v1alpha1/\*\_conversion.go.

**Kind:** `resource`

**`apiVersion`** `string`

`nvidia.com/v1beta1`

---

**`kind`** `string`

`DynamoGraphDeployment`

---

**`metadata`** `ObjectMeta`

Refer to Kubernetes API documentation for fields of `metadata`.
See [ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta).

---

**`spec`** `DynamoGraphDeploymentSpec`

spec defines the desired state for this graph deployment.
See [DynamoGraphDeploymentSpec](#v1beta1-dynamographdeploymentspec).

---

**`status`** `DynamoGraphDeploymentStatus`

status reflects the current observed state of this graph deployment.
See [DynamoGraphDeploymentStatus](#v1beta1-dynamographdeploymentstatus).

---

#### DynamoGraphDeploymentComponentRef

DynamoGraphDeploymentComponentRef identifies a specific component within a
DynamoGraphDeployment. Renamed from v1alpha1's `DynamoGraphDeploymentServiceRef`
to align with the v1beta1 `services -> components` and
`serviceName -> componentName` renames.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentScalingAdapterSpec](#v1beta1-dynamographdeploymentscalingadapterspec)

**`name`** `string` — required

name is the `metadata.name` of the target DynamoGraphDeployment.
**Validation:** MinLength: 1  Required: \&#123;\&#125;

---

**`componentName`** `string` — required

componentName is the `componentName` of the entry within the target DGD's `spec.components` list to scale.
**Validation:** MinLength: 1  Required: \&#123;\&#125;

---

#### DynamoGraphDeploymentExperimentalSpec

DynamoGraphDeploymentExperimentalSpec groups graph-level opt-in preview
features whose API shape and behavior may change in breaking ways between
v1beta1 releases. Component-level experimental features live under
`spec.components[*].experimental`.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentSpec](#v1beta1-dynamographdeploymentspec)

**`kvTransferPolicy`** `KvTransferPolicy`

kvTransferPolicy configures topology-aware routing for KV-cache transfers between prefill and decode workers.
See [KvTransferPolicy](#v1beta1-kvtransferpolicy).
**Validation:** Optional: \&#123;\&#125;

---

#### v1beta1 DynamoGraphDeploymentRequest

DynamoGraphDeploymentRequest is the Schema for the dynamographdeploymentrequests API.
It provides a simplified, SLA-driven interface for deploying inference models on Dynamo.
Users specify a model and optional performance targets; the controller handles profiling,
configuration selection, and deployment.

Lifecycle:

1. Pending: Spec validated, preparing for profiling
2. Profiling: Profiling job is running to discover optimal configurations
3. Ready: Profiling complete, generated DGD spec available in status
4. Deploying: DGD is being created and rolled out (when autoApply=true)
5. Deployed: DGD is running and healthy
6. Failed: An unrecoverable error occurred

**Kind:** `resource`

**`apiVersion`** `string`

`nvidia.com/v1beta1`

---

**`kind`** `string`

`DynamoGraphDeploymentRequest`

---

**`metadata`** `ObjectMeta`

Refer to Kubernetes API documentation for fields of `metadata`.
See [ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta).

---

**`spec`** `DynamoGraphDeploymentRequestSpec`

Spec defines the desired state for this deployment request.
See [DynamoGraphDeploymentRequestSpec](#v1beta1-dynamographdeploymentrequestspec).

---

**`status`** `DynamoGraphDeploymentRequestStatus`

Status reflects the current observed state of this deployment request.
See [DynamoGraphDeploymentRequestStatus](#v1beta1-dynamographdeploymentrequeststatus).

---

#### v1beta1 DynamoGraphDeploymentRequestNativeSpec

DynamoGraphDeploymentRequestNativeSpec contains the native v1beta1 request fields.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestSpec](#v1beta1-dynamographdeploymentrequestspec)

**`model`** `string`

Model specifies the model to deploy (e.g., "Qwen/Qwen3-0.6B", "meta-llama/Llama-3-70b"). Can be a HuggingFace ID or a private model name.
**Validation:** MinLength: 1  Optional: \&#123;\&#125;

---

**`backend`** `BackendType`

Backend specifies the inference backend to use for profiling and deployment.
See [BackendType](#backendtype).
**Validation:** Enum: \[auto sglang trtllm vllm]  Optional: \&#123;\&#125;

---

**`image`** `string`

Image is the container image reference for the profiling job (planner image). Example: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0". For Dynamo \< 1.1.0, use dynamo-frontend.
**Validation:** Optional: \&#123;\&#125;

---

**`runtimeVersionOverride`** `string`

RuntimeVersionOverride supplies the default Dynamo runtime version for generated DynamoGraphDeployment components that do not set their own override. Set this when Image uses a non-semantic-version tag or digest, or when its tag does not identify the Dynamo runtime version. An explicit component value in overrides.dgd takes precedence.
**Validation:** Pattern: `^(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})$`  Optional: \&#123;\&#125;

---

**`modelCache`** `ModelCacheSpec`

ModelCache provides optional PVC configuration for pre-downloaded model weights. When provided, weights are loaded from the PVC instead of downloading from HuggingFace.
See [ModelCacheSpec](#modelcachespec).
**Validation:** Optional: \&#123;\&#125;

---

**`hardware`** `HardwareSpec`

Hardware describes the hardware resources available for profiling and deployment. Typically auto-filled by the operator from cluster discovery.
See [HardwareSpec](#hardwarespec).
**Validation:** Optional: \&#123;\&#125;

---

**`workload`** `WorkloadSpec`

Workload defines the expected workload characteristics for SLA-based profiling.
See [WorkloadSpec](#workloadspec).
**Validation:** Optional: \&#123;\&#125;

---

**`sla`** `SLASpec`

SLA defines service-level agreement targets that drive profiling optimization.
See [SLASpec](#slaspec).
**Validation:** Optional: \&#123;\&#125;

---

**`overrides`** `OverridesSpec`

Overrides allows customizing the profiling job and the generated DynamoGraphDeployment.
See [OverridesSpec](#overridesspec).
**Validation:** Optional: \&#123;\&#125;

---

**`features`** `FeaturesSpec`

Features controls optional Dynamo platform features in the generated deployment.
See [FeaturesSpec](#featuresspec).
**Validation:** Optional: \&#123;\&#125;

---

**`searchStrategy`** `SearchStrategy`

SearchStrategy controls the profiling search depth. "rapid" performs a fast sweep; "thorough" explores more configurations.
See [SearchStrategy](#searchstrategy).
**Validation:** Enum: \[rapid thorough]  Optional: \&#123;\&#125;

---

**`autoApply`** `boolean`

AutoApply indicates whether to automatically create a DynamoGraphDeployment after profiling completes. If false, the generated spec is stored in status for manual review and application.
**Validation:** Optional: \&#123;\&#125;

---

#### v1beta1 DynamoGraphDeploymentRequestNativeStatus

DynamoGraphDeploymentRequestNativeStatus contains the native v1beta1 status fields.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestStatus](#v1beta1-dynamographdeploymentrequeststatus)

**`phase`** `DGDRPhase`

Phase is the high-level lifecycle phase of the deployment request.
See [DGDRPhase](#dgdrphase).
**Validation:** Enum: \[Pending Profiling Ready Deploying Deployed Failed]  Optional: \&#123;\&#125;

---

**`profilingPhase`** `ProfilingPhase`

ProfilingPhase indicates the current sub-phase of the profiling pipeline. Only meaningful when Phase is "Profiling". Cleared when profiling completes or fails.
See [ProfilingPhase](#profilingphase).
**Validation:** Enum: \[Initializing SweepingPrefill SweepingDecode SelectingConfig BuildingCurves GeneratingDGD Done]  Optional: \&#123;\&#125;

---

**`dgdName`** `string`

DGDName is the name of the generated or created DynamoGraphDeployment.
**Validation:** Optional: \&#123;\&#125;

---

**`profilingJobName`** `string`

ProfilingJobName is the name of the Kubernetes Job running the profiler.
**Validation:** Optional: \&#123;\&#125;

---

**`conditions`** `Condition array`

Conditions contains the latest observed conditions of the deployment request. Standard condition types include: Succeeded, Validation, Profiling, SpecGenerated, DeploymentReady.
See [Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#condition-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`profilingResults`** `ProfilingResultsStatus`

ProfilingResults contains the selected deployment configuration produced by profiling. Deprecated compatibility fields may remain on objects created by older releases.
See [ProfilingResultsStatus](#profilingresultsstatus).
**Validation:** Optional: \&#123;\&#125;

---

**`deploymentInfo`** `DeploymentInfoStatus`

DeploymentInfo tracks the state of the deployed DynamoGraphDeployment. Populated when a DGD has been created (either via autoApply or manually).
See [DeploymentInfoStatus](#deploymentinfostatus).
**Validation:** Optional: \&#123;\&#125;

---

**`observedGeneration`** `integer`

ObservedGeneration is the most recent generation observed by the controller.
**Validation:** Optional: \&#123;\&#125;

---

#### v1beta1 DynamoGraphDeploymentRequestSpec

DynamoGraphDeploymentRequestSpec defines the desired state of a DynamoGraphDeploymentRequest.
Native v1beta1 fields and the V1Beta2 conversion envelope are mutually exclusive.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequest](#v1beta1-dynamographdeploymentrequest)

**`model`** `string`

Model specifies the model to deploy (e.g., "Qwen/Qwen3-0.6B", "meta-llama/Llama-3-70b"). Can be a HuggingFace ID or a private model name.
**Validation:** MinLength: 1  Optional: \&#123;\&#125;

---

**`backend`** `BackendType`

Backend specifies the inference backend to use for profiling and deployment.
See [BackendType](#backendtype).
**Validation:** Enum: \[auto sglang trtllm vllm]  Optional: \&#123;\&#125;

---

**`image`** `string`

Image is the container image reference for the profiling job (planner image). Example: "nvcr.io/nvidia/ai-dynamo/dynamo-planner:1.4.0". For Dynamo \< 1.1.0, use dynamo-frontend.
**Validation:** Optional: \&#123;\&#125;

---

**`runtimeVersionOverride`** `string`

RuntimeVersionOverride supplies the default Dynamo runtime version for generated DynamoGraphDeployment components that do not set their own override. Set this when Image uses a non-semantic-version tag or digest, or when its tag does not identify the Dynamo runtime version. An explicit component value in overrides.dgd takes precedence.
**Validation:** Pattern: `^(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})\.(0|[1-9][0-9]\{0,3\})$`  Optional: \&#123;\&#125;

---

**`modelCache`** `ModelCacheSpec`

ModelCache provides optional PVC configuration for pre-downloaded model weights. When provided, weights are loaded from the PVC instead of downloading from HuggingFace.
See [ModelCacheSpec](#modelcachespec).
**Validation:** Optional: \&#123;\&#125;

---

**`hardware`** `HardwareSpec`

Hardware describes the hardware resources available for profiling and deployment. Typically auto-filled by the operator from cluster discovery.
See [HardwareSpec](#hardwarespec).
**Validation:** Optional: \&#123;\&#125;

---

**`workload`** `WorkloadSpec`

Workload defines the expected workload characteristics for SLA-based profiling.
See [WorkloadSpec](#workloadspec).
**Validation:** Optional: \&#123;\&#125;

---

**`sla`** `SLASpec`

SLA defines service-level agreement targets that drive profiling optimization.
See [SLASpec](#slaspec).
**Validation:** Optional: \&#123;\&#125;

---

**`overrides`** `OverridesSpec`

Overrides allows customizing the profiling job and the generated DynamoGraphDeployment.
See [OverridesSpec](#overridesspec).
**Validation:** Optional: \&#123;\&#125;

---

**`features`** `FeaturesSpec`

Features controls optional Dynamo platform features in the generated deployment.
See [FeaturesSpec](#featuresspec).
**Validation:** Optional: \&#123;\&#125;

---

**`searchStrategy`** `SearchStrategy`

SearchStrategy controls the profiling search depth. "rapid" performs a fast sweep; "thorough" explores more configurations.
See [SearchStrategy](#searchstrategy).
**Validation:** Enum: \[rapid thorough]  Optional: \&#123;\&#125;

---

**`autoApply`** `boolean`

AutoApply indicates whether to automatically create a DynamoGraphDeployment after profiling completes. If false, the generated spec is stored in status for manual review and application.
**Validation:** Optional: \&#123;\&#125;

---

**`v1beta2`** `JSON`

V1Beta2 losslessly preserves a native v1beta2 spec while this object is represented through v1beta1. It is mutually exclusive with native fields. This field is a read-only conversion view; modify the request through the native v1beta2 API.
See [JSON](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#json-v1-apiextensions-k8s-io).
**Validation:** Type: object  Optional: \&#123;\&#125;

---

#### v1beta1 DynamoGraphDeploymentRequestStatus

DynamoGraphDeploymentRequestStatus represents the observed state of a DynamoGraphDeploymentRequest.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequest](#v1beta1-dynamographdeploymentrequest)

**`phase`** `DGDRPhase`

Phase is the high-level lifecycle phase of the deployment request.
See [DGDRPhase](#dgdrphase).
**Validation:** Enum: \[Pending Profiling Ready Deploying Deployed Failed]  Optional: \&#123;\&#125;

---

**`profilingPhase`** `ProfilingPhase`

ProfilingPhase indicates the current sub-phase of the profiling pipeline. Only meaningful when Phase is "Profiling". Cleared when profiling completes or fails.
See [ProfilingPhase](#profilingphase).
**Validation:** Enum: \[Initializing SweepingPrefill SweepingDecode SelectingConfig BuildingCurves GeneratingDGD Done]  Optional: \&#123;\&#125;

---

**`dgdName`** `string`

DGDName is the name of the generated or created DynamoGraphDeployment.
**Validation:** Optional: \&#123;\&#125;

---

**`profilingJobName`** `string`

ProfilingJobName is the name of the Kubernetes Job running the profiler.
**Validation:** Optional: \&#123;\&#125;

---

**`conditions`** `Condition array`

Conditions contains the latest observed conditions of the deployment request. Standard condition types include: Succeeded, Validation, Profiling, SpecGenerated, DeploymentReady.
See [Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#condition-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`profilingResults`** `ProfilingResultsStatus`

ProfilingResults contains the selected deployment configuration produced by profiling. Deprecated compatibility fields may remain on objects created by older releases.
See [ProfilingResultsStatus](#profilingresultsstatus).
**Validation:** Optional: \&#123;\&#125;

---

**`deploymentInfo`** `DeploymentInfoStatus`

DeploymentInfo tracks the state of the deployed DynamoGraphDeployment. Populated when a DGD has been created (either via autoApply or manually).
See [DeploymentInfoStatus](#deploymentinfostatus).
**Validation:** Optional: \&#123;\&#125;

---

**`observedGeneration`** `integer`

ObservedGeneration is the most recent generation observed by the controller.
**Validation:** Optional: \&#123;\&#125;

---

**`v1beta2`** `JSON`

V1Beta2 losslessly preserves a native v1beta2 status while this object is represented through v1beta1.
See [JSON](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#json-v1-apiextensions-k8s-io).
**Validation:** Type: object  Optional: \&#123;\&#125;

---

#### DynamoGraphDeploymentScalingAdapter

DynamoGraphDeploymentScalingAdapter provides a scaling interface for individual
components within a DynamoGraphDeployment. It implements the Kubernetes scale
subresource, enabling integration with HPA, KEDA, and custom autoscalers.

The adapter acts as an intermediary between autoscalers and the DGD,
ensuring that only the adapter controller modifies the DGD's component replicas.
This prevents conflicts when multiple autoscaling mechanisms are in play.

v1beta1 is the storage version; conversion to and from the served v1alpha1
version is handled by the operator's conversion webhook
(see api/v1alpha1/dynamographdeploymentscalingadapter_conversion.go).

**Kind:** `resource`

**`apiVersion`** `string`

`nvidia.com/v1beta1`

---

**`kind`** `string`

`DynamoGraphDeploymentScalingAdapter`

---

**`metadata`** `ObjectMeta`

Refer to Kubernetes API documentation for fields of `metadata`.
See [ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta).

---

**`spec`** `DynamoGraphDeploymentScalingAdapterSpec`

See [DynamoGraphDeploymentScalingAdapterSpec](#v1beta1-dynamographdeploymentscalingadapterspec).

---

**`status`** `DynamoGraphDeploymentScalingAdapterStatus`

See [DynamoGraphDeploymentScalingAdapterStatus](#v1beta1-dynamographdeploymentscalingadapterstatus).

---

#### DynamoGraphDeploymentScalingAdapterSpec

DynamoGraphDeploymentScalingAdapterSpec defines the desired state of a
DynamoGraphDeploymentScalingAdapter.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentScalingAdapter](#v1beta1-dynamographdeploymentscalingadapter)

**`replicas`** `integer` — required

replicas is the desired number of replicas for the target component. This field is modified by external autoscalers (HPA/KEDA/Planner) or manually by users.
**Validation:** Minimum: 0  Required: \&#123;\&#125;

---

**`dgdRef`** `DynamoGraphDeploymentComponentRef` — required

dgdRef references the DynamoGraphDeployment and the specific component to scale.
See [DynamoGraphDeploymentComponentRef](#dynamographdeploymentcomponentref).
**Validation:** Required: \&#123;\&#125;

---

#### DynamoGraphDeploymentScalingAdapterStatus

DynamoGraphDeploymentScalingAdapterStatus defines the observed state of a
DynamoGraphDeploymentScalingAdapter.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentScalingAdapter](#v1beta1-dynamographdeploymentscalingadapter)

**`replicas`** `integer`

replicas is the current number of replicas for the target component. This is synced from the DGD's component replicas and is required for the scale subresource.

---

**`selector`** `string`

selector is a label selector string for the pods managed by this adapter. Required for HPA compatibility via the scale subresource.
**Validation:** Optional: \&#123;\&#125;

---

**`lastScaleTime`** `Time`

lastScaleTime is the last time the adapter scaled the target component.
See [Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

#### v1beta1 DynamoGraphDeploymentSpec

DynamoGraphDeploymentSpec defines the desired state of a DynamoGraphDeployment.

**Kind:** `type`
**Appears in:** [DynamoGraphDeployment](#v1beta1-dynamographdeployment)

**`providerOverride`** `ProviderOverride`

providerOverride configures the root resource generated by the selected graph-level workload provider. For Grove it uses apiVersion `grove.io/v1alpha1`, target `PodCliqueSet`, and may set only `spec.template.topologyConstraint`. It cannot select or change the provider.
See [ProviderOverride](#v1beta1-provideroverride).
**Validation:** Optional: \&#123;\&#125;

---

**`annotations`** `object (keys:string, values:string)`

annotations to propagate to all child resources (PCS, DCD, Deployments, and pod templates). Component-level (`podTemplate`) values take precedence on conflict.
**Validation:** Optional: \&#123;\&#125;

---

**`labels`** `object (keys:string, values:string)`

labels to propagate to all child resources. Same precedence rules as `annotations`.
**Validation:** Optional: \&#123;\&#125;

---

**`priorityClassName`** `string`

priorityClassName is the name of the PriorityClass to use for Grove PodCliqueSets. Requires the Grove pathway.
**Validation:** Optional: \&#123;\&#125;

---

**`components`** `DynamoComponentDeploymentSharedSpec array`

components are the components deployed as part of this graph. Each entry carries its own stable logical `name`, and names must be unique within the list. Component types are generally repeatable, except `type: epp` which may appear at most once.
See [DynamoComponentDeploymentSharedSpec](#v1beta1-dynamocomponentdeploymentsharedspec).
**Validation:** MaxItems: 25  Optional: \&#123;\&#125;

---

**`env`** `EnvVar array`

env is prepended to every component's environment. Component-specific env entries with the same name take precedence and may reference values from this list.
See [EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#envvar-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

**`backendFramework`** `string`

backendFramework specifies the backend framework (e.g. "sglang", "vllm", "trtllm").
**Validation:** Enum: \[sglang vllm trtllm]

---

**`restart`** `Restart`

restart specifies the restart policy for the graph deployment.
See [Restart](#v1beta1-restart).
**Validation:** Optional: \&#123;\&#125;

---

**`topologyConstraint`** `SpecTopologyConstraint`

topologyConstraint is the deployment-level topology constraint. When set, `spec.topologyConstraint.clusterTopologyName` names the ClusterTopology CR to use. `spec.topologyConstraint.packDomain` is optional at this level and can be omitted when only components carry constraints. Components without their own `topologyConstraint` inherit from this value.
See [SpecTopologyConstraint](#v1beta1-spectopologyconstraint).
**Validation:** Optional: \&#123;\&#125;

---

**`experimental`** `DynamoGraphDeploymentExperimentalSpec`

experimental groups graph-level preview features whose API shape and behavior may change in breaking ways between v1beta1 releases.
See [DynamoGraphDeploymentExperimentalSpec](#v1beta1-dynamographdeploymentexperimentalspec).
**Validation:** Optional: \&#123;\&#125;

---

#### v1beta1 DynamoGraphDeploymentStatus

DynamoGraphDeploymentStatus defines the observed state of a DynamoGraphDeployment.
Unchanged between v1alpha1 and v1beta1.

**Kind:** `type`
**Appears in:** [DynamoGraphDeployment](#v1beta1-dynamographdeployment)

**`observedGeneration`** `integer`

observedGeneration is the most recent generation observed by the controller.
**Validation:** Optional: \&#123;\&#125;

---

**`state`** `DGDState` — default: initializing

state is a high-level textual status of the graph deployment lifecycle.
See [DGDState](#v1beta1-dgdstate).
**Validation:** Enum: \[initializing pending successful failed]

---

**`conditions`** `Condition array`

conditions contains the latest observed conditions of the graph deployment. Merged by type on patch updates.
See [Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#condition-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`components`** `object (keys:string, values:ComponentReplicaStatus)`

components contains per-component replica status information, keyed by component name.
See [ComponentReplicaStatus](#componentreplicastatus).
**Validation:** Optional: \&#123;\&#125;

---

**`restart`** `RestartStatus`

restart contains the status of a graph-level restart.
See [RestartStatus](#v1beta1-restartstatus).
**Validation:** Optional: \&#123;\&#125;

---

**`checkpoints`** `object (keys:string, values:ComponentCheckpointStatus)`

checkpoints contains per-component checkpoint status, keyed by component name.
See [ComponentCheckpointStatus](#componentcheckpointstatus).
**Validation:** Optional: \&#123;\&#125;

---

**`rollingUpdate`** `RollingUpdateStatus`

rollingUpdate tracks the progress of operator-managed rolling updates. Currently only supported for single-node, non-Grove deployments (DCD/Deployment).
See [RollingUpdateStatus](#v1beta1-rollingupdatestatus).
**Validation:** Optional: \&#123;\&#125;

---

**`placement`** `PlacementStatus`

placement groups DGD-level scheduler placement signals (score, reporting state, and any future placement fields).
See [PlacementStatus](#v1beta1-placementstatus).
**Validation:** Optional: \&#123;\&#125;

---

#### EPPConfig

EPPConfig contains configuration for the legacy Go EPP (Endpoint Picker Plugin).

Deprecated: Go EPP is deprecated. New EPP components should omit `eppConfig`
and use the native Rust EPP (env-var configuration only). Existing DGDs that
still set `eppConfig` keep the Go EPP Pod contract until they migrate
explicitly by clearing `eppConfig` (and updating the image).

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#v1beta1-dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#v1beta1-dynamocomponentdeploymentspec)

**`configMapRef`** `ConfigMapKeySelector`

configMapRef references a user-provided ConfigMap containing EPP configuration. Mutually exclusive with `config`.
See [ConfigMapKeySelector](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#configmapkeyselector-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

**`config`** `EndpointPickerConfig`

config allows specifying EPP `EndpointPickerConfig` directly as a structured object. The operator marshals this to YAML and creates a ConfigMap automatically. Mutually exclusive with `configMapRef`. One of `configMapRef` or `config` must be specified.
**Validation:** Type: object  Optional: \&#123;\&#125;

---

#### ExperimentalSpec

ExperimentalSpec groups opt-in preview features whose API shape and behavior
may change in breaking ways between v1beta1 releases (including disappearing
without a name-preserving graduation path). Fields placed under
`experimental` are explicitly NOT covered by the normal v1beta1 deprecation
policy and should not be relied on for production workloads. Features
graduate out of this block (and become first-class fields on the shared
spec) once their API is considered stable.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#v1beta1-dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#v1beta1-dynamocomponentdeploymentspec)

**`gpuMemoryService`** `GPUMemoryServiceSpec`

gpuMemoryService configures the GPU Memory Service (GMS). When set, GPU access for GMS clients is managed via DRA.
See [GPUMemoryServiceSpec](#v1beta1-gpumemoryservicespec).
**Validation:** Optional: \&#123;\&#125;

---

**`failover`** `FailoverSpec`

failover configures active-passive GPU failover for this component. Requires `gpuMemoryService` to also be set, and `failover.mode` must match `gpuMemoryService.mode` (enforced by the validation webhook).
See [FailoverSpec](#v1beta1-failoverspec).
**Validation:** Optional: \&#123;\&#125;

---

**`grove`** `GroveSpec`

grove groups Grove-specific rendering options.
See [GroveSpec](#grovespec).
**Validation:** Optional: \&#123;\&#125;

---

**`checkpoint`** `ComponentCheckpointConfig`

checkpoint configures container-image snapshotting and restore for this component. Set `checkpoint.enabled: true` to opt in. Without checkpointRef, the DGD controller creates a DGD-scoped SnapshotJob and later restores pods in the same DGD generation from its PodSnapshot. With checkpointRef, the DGD restores from the named PodSnapshot in the same namespace. The user-facing shape of this field is still settling, which is why it lives under `experimental` in v1beta1 instead of at the top level.
See [ComponentCheckpointConfig](#componentcheckpointconfig).
**Validation:** Optional: \&#123;\&#125;

---

#### FailoverSpec

FailoverSpec configures active-passive failover for a worker component.
The main container is cloned into two engine containers (active + standby)
sharing GPUs via DRA, and the standby acquires the flock when the active
engine fails. Failover requires that gpuMemoryService is also set, and that
failover.mode matches gpuMemoryService.mode. Also requires the
`nvidia.com/dynamo-kube-discovery-mode: container` annotation on the DGD.
See ExperimentalSpec for the stability caveat.

**Kind:** `type`
**Appears in:** [ExperimentalSpec](#experimentalspec)

**`mode`** `GPUMemoryServiceMode` — default: IntraPod

mode selects the failover deployment topology. Must match `spec.experimental.gpuMemoryService.mode` (or `spec.components[*].experimental.gpuMemoryService.mode` inside a DynamoGraphDeployment).
See [GPUMemoryServiceMode](#v1beta1-gpumemoryservicemode).
**Validation:** Enum: \[IntraPod InterPod]  Optional: \&#123;\&#125;

---

**`numShadows`** `integer` — default: 1

numShadows is the number of shadow (standby) engine containers per rank. Reserved for future use; the operator currently creates exactly one shadow.
**Validation:** Maximum: 1  Minimum: 1  Optional: \&#123;\&#125;

---

#### FeaturesSpec

FeaturesSpec controls optional Dynamo platform features in the generated deployment.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta1-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta1-dynamographdeploymentrequestspec)

**`planner`** `RawExtension`

Planner contains the raw Planner configuration passed to the Planner service. Its schema is defined by dynamo.planner.config.planner_config.PlannerConfig. See [https://docs.nvidia.com/dynamo/dev/knowledge-base/modular-components/planner/planner-guide#plannerconfig-reference](https://docs.nvidia.com/dynamo/dev/knowledge-base/modular-components/planner/planner-guide#plannerconfig-reference). DGDR passes this object through without field-level validation; the Planner service validates it at startup. The presence of this field (non-null) enables the planner in the generated DGD.
See [RawExtension](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#rawextension-runtime-pkg).
**Validation:** Type: object  Optional: \&#123;\&#125;

---

**`kvRouter`** `KVRouterSpec`

KVRouter configures KV-cache-aware routing for the generated deployment. When enabled, DGDR sets DYN_ROUTER_MODE=kv on the generated Frontend. Settings in spec.overrides.dgd take precedence: an override can replace DYN_ROUTER_MODE or pass --router-mode. The flag takes precedence over the environment variable when both are present.
See [KVRouterSpec](#kvrouterspec).
**Validation:** Optional: \&#123;\&#125;

---

**`mocker`** `MockerSpec`

Mocker configures the simulated (mocker) backend for testing without GPUs.
See [MockerSpec](#mockerspec).
**Validation:** Optional: \&#123;\&#125;

---

#### GMSClientPodSpec

GMSClientPodSpec declares an additional GMS client pod for inter-pod GMS.

**Kind:** `type`
**Appears in:** [GPUMemoryServiceSpec](#v1beta1-gpumemoryservicespec)

**`name`** `string`

name identifies this client pod.
**Validation:** MaxLength: 63  MinLength: 1  Pattern: `^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`

---

**`podTemplate`** `PodTemplateSpec`

podTemplate configures the pod to run as a GMS client.
See [PodTemplateSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#podtemplatespec-v1-core).
**Validation:** Schemaless: \&#123;\&#125;  Type: object

---

#### GPUMemoryServiceMode

GPUMemoryServiceMode selects the GMS deployment topology.

**Kind:** `enum`
**Underlying type:** `string`
**Appears in:** [FailoverSpec](#v1beta1-failoverspec), [GPUMemoryServiceSpec](#v1beta1-gpumemoryservicespec)

**Allowed values**

* IntraPod

  GMSModeIntraPod runs GMS as a sidecar within the same pod.
* InterPod

  GMSModeInterPod runs GMS as rank-local pods that share GPUs through DRA. Extra client pod rendering is reserved for a follow-up change.

#### GPUMemoryServiceSpec

GPUMemoryServiceSpec configures the GPU Memory Service (GMS) for a
worker component. The operator injects GMS wiring and replaces the main
container's GPU resources with a DRA `ResourceClaim` for shared GPU access.
See ExperimentalSpec for the stability caveat.

**Kind:** `type`
**Appears in:** [ExperimentalSpec](#experimentalspec)

**`mode`** `GPUMemoryServiceMode` — default: IntraPod

mode selects the GMS deployment topology.
See [GPUMemoryServiceMode](#v1beta1-gpumemoryservicemode).
**Validation:** Enum: \[IntraPod InterPod]  Optional: \&#123;\&#125;

---

**`deviceClassName`** `string` — default: gpu.nvidia.com

deviceClassName is the DRA `DeviceClass` to request GPUs from.
**Validation:** Optional: \&#123;\&#125;

---

**`extraClientContainers`** `string array`

extraClientContainers lists additional user-declared containers that should be wired as GMS clients in service pods. SnapshotJob capture Pod clients are declared under checkpoint.job.gmsClientContainers. Every name must match a container in the enclosing component's podTemplate, or in every role podTemplate when those are used.
**Validation:** items:MaxLength: 63  items:MinLength: 1  items:Pattern: `^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`  Optional: \&#123;\&#125;

---

**`extraClientPods`** `GMSClientPodSpec array`

extraClientPods declares additional GMS client pods for inter-pod GMS. This field is reserved for future use and is rejected until inter-pod client orchestration is wired.
See [GMSClientPodSpec](#v1beta1-gmsclientpodspec).
**Validation:** Optional: \&#123;\&#125;

---

#### GPUSKUType

GPUSKUType identifies a supported GPU for discovery and profiling.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[vr_nvl72 gb200 gb200_sxm gb10 b300_sxm b200_sxm h200_sxm h100_sxm h100_pcie a100_sxm a100_pcie a30 l40s l40 l4 v100_sxm v100_pcie t4 mi200 mi300]
**Appears in:** [HardwareSpec](#hardwarespec)

**Allowed values**

* vr_nvl72

  \--- Vera Rubin ---
* gb200

  \--- Blackwell ---
* gb200_sxm

  Deprecated: use GPUSKUTypeGB200. GB200 systems use NVL rather than SXM.
* gb10
* b300_sxm
* b200_sxm
* h200_sxm

  \--- Hopper ---
* h100_sxm
* h100_pcie
* a100_sxm

  \--- Ampere ---
* a100_pcie
* a30
* l40s

  \--- Ada ---
* l40
* l4
* v100_sxm

  \--- Older NVIDIA ---
* v100_pcie
* t4
* mi200

  \--- AMD ---
* mi300

#### GroveSpec

GroveSpec groups experimental Grove-specific rendering options.

**Kind:** `type`
**Appears in:** [ExperimentalSpec](#experimentalspec)

**`forceScalingGroup`** `boolean`

forceScalingGroup opts a single-node component into rendering as a PodCliqueScalingGroup with one single-pod PodClique per replica. Scaling changes the scaling-group replica count. The first `minAvailable` replicas join the deployment's base PodGang together with its other base workloads; each replica beyond `minAvailable` gets its own PodGang, gang-scheduled separately from the rest of the deployment. `false` or omitted means automatic selection (multi-node and inter-pod GMS components use a scaling group, other single-node components a standalone PodClique), not "force PodClique". The pointer preserves field presence on the wire: `nil` and `false` are semantically identical, and consumers must dereference with `false`. Immutable after creation.
**Validation:** Optional: \&#123;\&#125;

---

#### HardwareSpec

HardwareSpec describes the GPU hardware for profiling and deployment.
All fields are auto-detected from cluster GPU nodes when omitted
(requires cluster-wide mode with GPU discovery enabled).
gpuSku is a selector (restricts which nodes are considered);
the other fields are pure overrides passed to the profiler.
If all four fields are set, discovery is skipped.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta1-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta1-dynamographdeploymentrequestspec)

**`gpuSku`** `GPUSKUType`

GPUSKU selects the GPU type to target. When omitted, auto-detected as the GPU type of the node with the most GPUs (ties broken by highest VRAM per GPU). In mixed-GPU clusters, set this to choose which GPU type to use. Discovery and totalGpus are then restricted to nodes matching this SKU. The legacy value gb200_sxm is deprecated; use gb200 instead.
See [GPUSKUType](#gpuskutype).
**Validation:** Enum: \[vr_nvl72 gb200 gb200_sxm gb10 b300_sxm b200_sxm h200_sxm h100_sxm h100_pcie a100_sxm a100_pcie a30 l40s l40 l4 v100_sxm v100_pcie t4 mi200 mi300]  Optional: \&#123;\&#125;

---

**`vramMb`** `float`

VRAMMB is the VRAM per GPU in MiB. When omitted, auto-detected from cluster GPU nodes. An explicit value within 10% of the auto-selected shape's measured VRAM permits automatic GPU-budget discovery. This tolerance applies only to the requested value; aggregating discovered nodes still requires equal measured VRAM. When this value differs by more than 10% and totalGpus is omitted, automatic GPU-budget discovery fails and the DGDR enters phase Failed before a profiling Job is created; set totalGpus explicitly to use that override.
**Validation:** Optional: \&#123;\&#125;

---

**`totalGpus`** `integer`

TotalGPUs is the GPU budget for profiling and deployment. The profiler uses this to determine parallelism and replica count. When omitted, computed by summing GPUs on nodes matching the auto-selected shape: GPU type, GPUs per node, and VRAM per GPU. The result is temporarily capped at 32 to limit profiler search space. For example, same-type nodes with 8 and 4 GPUs represent 12 GPUs of inventory, while the auto-selected 8-GPU shape yields an automatic budget of 8. This cap may be removed in a future release. Set this field explicitly to override the derived budget, use a different numGpusPerNode, or use a vramMb value more than 10% from the auto-selected shape's measured VRAM. These shape overrides require an explicit totalGpus.
**Validation:** Optional: \&#123;\&#125;

---

**`numGpusPerNode`** `integer`

NumGPUsPerNode is the number of GPUs per node. When omitted, auto-detected as the highest GPU count on any discovered node of the selected GPU type. In clusters whose nodes have different GPU counts, set this explicitly to the node size you intend to schedule on. When this value differs from the auto-selected shape and totalGpus is omitted, automatic GPU-budget discovery fails and the DGDR enters phase Failed before a profiling Job is created; set totalGpus explicitly to use that override.
**Validation:** Optional: \&#123;\&#125;

---

**`interconnect`** `string`

Interconnect describes the primary GPU-to-GPU interconnect *within a node*. Semantics / usage:   - This is capability metadata used for profiling, planning, and deployment decisions.   - It does NOT configure or enable any GPU interconnect; it only describes what is available/assumed.   - When omitted, the operator may attempt best-effort discovery (currently distinguishes "nvlink"     vs "pcie" based on DCGM NVLink link count). If discovery is unavailable, it may remain empty. Impact of wrong / missing values:   - If set more optimistically than reality (e.g., "nvlink" when only PCIe is present), performance     models may overestimate intra-node bandwidth and choose overly aggressive parallelism or layouts,     resulting in degraded performance compared to expectations.   - If set more pessimistically than reality (e.g., "pcie" when NVLink is present), the system may     choose conservative plans and leave performance on the table.   - If unset and undiscovered, consumers should treat the interconnect as unknown and fall back to     conservative assumptions. Example values: "pcie", "nvlink". Other values may be accepted but may not be auto-detected.
**Validation:** Optional: \&#123;\&#125;

---

**`rdma`** `boolean`

RDMA indicates whether the cluster has RDMA-capable networking available for Dynamo data movement. Semantics / usage:   - This is capability metadata used for profiling, planning, and deployment decisions.   - It does NOT install, enable, or configure RDMA (e.g., drivers, SR-IOV, NVIDIA network operator,     GPUDirect settings). It only expresses availability/intent.   - When omitted, the operator may attempt best-effort discovery (e.g., via node labels indicating     RDMA/SR-IOV capability and/or presence of NVIDIA network-operator RDMA components). If discovery     is unavailable, it may remain unset. Impact of wrong / missing values:   - False positive (set true when RDMA is not actually usable end-to-end) may cause plans or     deployments to assume RDMA is available; depending on the runtime transport selection and     fallback behavior, this can lead to connection/setup failures or performance regressions.   - False negative (set false when RDMA is available) will typically avoid RDMA-optimized paths and     fall back to non-RDMA transports, usually remaining functional but potentially slower.   - If unset and undiscovered, consumers should treat RDMA availability as unknown and use     conservative defaults / fallback transports.
**Validation:** Optional: \&#123;\&#125;

---

#### KVRouterSpec

KVRouterSpec configures KV-cache-aware routing.

**Kind:** `type`
**Appears in:** [FeaturesSpec](#featuresspec)

**`enabled`** `boolean`

Enabled indicates whether to enable KV-cache-aware routing in the generated DGD. KV routing optimizes request scheduling based on KV cache locality.
**Validation:** Optional: \&#123;\&#125;

---

#### KvTransferEnforcement

KvTransferEnforcement controls how the selected prefill worker's topology is
applied to decode routing.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[required preferred]
**Appears in:** [KvTransferPolicy](#v1beta1-kvtransferpolicy)

**Allowed values**

* required

  KvTransferEnforcementRequired enforces same-domain decode worker selection.
* preferred

  KvTransferEnforcementPreferred biases decode worker selection toward the same domain.

#### KvTransferPolicy

KvTransferPolicy configures topology-aware routing for KV-cache transfers
between prefill and decode workers. This is a graph-wide concern placed
under `spec.experimental` while the API is incubating.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentExperimentalSpec](#v1beta1-dynamographdeploymentexperimentalspec)

**`clusterTopologyName`** `string`

clusterTopologyName references a Grove ClusterTopology CR. The operator reads the CR's topology levels and projects them through Dynamo-owned pod labels for worker topology metadata.
**Validation:** MinLength: 1  Optional: \&#123;\&#125;

---

**`labelKey`** `string`

labelKey is a Kubernetes node label key (e.g. "topology.kubernetes.io/zone") whose value identifies the topology domain for each worker. The operator copies the node label onto worker pods so the runtime can publish it as worker metadata. The label should correspond to the topology level named in `domain`.
**Validation:** MaxLength: 317  MinLength: 1  Pattern: `^(([a-z0-9]([-a-z0-9]\{0,61\}[a-z0-9])?)(\.[a-z0-9]([-a-z0-9]\{0,61\}[a-z0-9])?)*/)?([A-Za-z0-9]([-A-Za-z0-9_.]\{0,61\}[A-Za-z0-9])?)$`  Optional: \&#123;\&#125;

---

**`domain`** `TopologyDomain`

domain is the logical name for the topology level to enforce (e.g. "zone", "rack"). The router uses this to match workers that share the same value for the label identified by `labelKey`.
See [TopologyDomain](#v1beta1-topologydomain).
**Validation:** Pattern: `^[a-z0-9]([a-z0-9-]*[a-z0-9])?$`

---

**`enforcement`** `KvTransferEnforcement` — default: required

enforcement controls how the selected prefill worker's topology is applied to decode routing. "required" only allows decode workers in the same topology domain as the selected prefill worker. "preferred" keeps all decode workers eligible, but biases selection toward workers in the same topology domain. Defaults to "required".
See [KvTransferEnforcement](#v1beta1-kvtransferenforcement).
**Validation:** Enum: \[required preferred]  Optional: \&#123;\&#125;

---

**`preferredWeight`** `float`

preferredWeight is required and used only when enforcement is "preferred". Higher values create a stronger same-domain routing preference, but do not guarantee same-domain selection. The value is not a probability; worker selection still depends on load and other routing inputs. A value of 0 disables the topology preference; 1 is the strongest supported preference.
**Validation:** Maximum: 1  Minimum: 0  Optional: \&#123;\&#125;

---

#### LPXConfig

LPXConfig identifies the component's compiled model and configures scheduling.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSharedSpec](#v1beta1-dynamocomponentdeploymentsharedspec)

**`buildId`** `string`

buildId references the immutable model build.
**Validation:** MinLength: 1

---

**`scheduling`** `SchedulingSpec`

scheduling configures this component's LPX scheduling attempts. Omission means no deadline.
See [SchedulingSpec](#schedulingspec).
**Validation:** Optional: \&#123;\&#125;

---

**`experimental`** `LPXExperimentalSpec`

experimental groups opt-in LPX options whose API shape may change in breaking ways between v1beta1 releases.
See [LPXExperimentalSpec](#lpxexperimentalspec).
**Validation:** Optional: \&#123;\&#125;

---

#### LPXExperimentalSpec

LPXExperimentalSpec groups experimental LPX options.

**Kind:** `type`
**Appears in:** [LPXConfig](#lpxconfig)

**`localPartitions`** `LPXLocalPartitions`

localPartitions selects partitions of a hybrid build that the Cyborg conductor runs on its own GPU. The operator schedules LPU Agents only for the remaining partitions, and schedules none when every partition is local. Omission runs every partition on LPUs.
See [LPXLocalPartitions](#lpxlocalpartitions).
**Validation:** Optional: \&#123;\&#125;

---

#### LPXLocalPartitions

LPXLocalPartitions selects the runtime partitions that run on the Cyborg GPU.
Partition IDs are the compiler partition IDs of the build's runtime
partitions. A selected prop-sync chain is identified by its first partition.

**Kind:** `type`
**Appears in:** [LPXExperimentalSpec](#lpxexperimentalspec)

**`mode`** `LPXLocalPartitionsMode` — required

mode selects the partitions that run on the Cyborg GPU. `All` runs every partition; `IDs` runs the partitions listed in ids.
See [LPXLocalPartitionsMode](#lpxlocalpartitionsmode).
**Validation:** Enum: \[All IDs]  Required: \&#123;\&#125;

---

**`ids`** `integer array`

ids lists the compiler partition IDs that run on the Cyborg GPU. Required when mode is `IDs` and forbidden otherwise.
**Validation:** MinItems: 1  items:Maximum: 4.294967295e+09  items:Minimum: 0  Optional: \&#123;\&#125;

---

#### LPXLocalPartitionsMode

LPXLocalPartitionsMode selects how LPXLocalPartitions chooses partitions.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[All IDs]
**Appears in:** [LPXLocalPartitions](#lpxlocalpartitions)

**Allowed values**

* All

  LPXLocalPartitionsModeAll runs every partition on the Cyborg GPU.
* IDs

  LPXLocalPartitionsModeIDs runs the partitions listed in ids on the Cyborg GPU.

#### MockerSpec

MockerSpec configures the simulated (mocker) backend.

**Kind:** `type`
**Appears in:** [FeaturesSpec](#featuresspec)

**`enabled`** `boolean`

Enabled indicates whether to deploy mocker workers instead of real inference workers. Useful for large-scale testing without GPUs.
**Validation:** Optional: \&#123;\&#125;

---

#### ModelCacheSpec

ModelCacheSpec references a PVC containing pre-downloaded model weights.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta1-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta1-dynamographdeploymentrequestspec)

**`pvcName`** `string`

PVCName is the name of the PersistentVolumeClaim containing model weights. The PVC must exist in the same namespace as the DGDR.
**Validation:** Optional: \&#123;\&#125;

---

**`pvcModelPath`** `string`

PVCModelPath is the path to the model checkpoint directory within the PVC (e.g. "deepseek-r1" or "models/Llama-3.1-405B-FP8"). It may also be a container-visible absolute path already under PVCMountPath. Such an absolute path is interpreted as container-visible; use the relative form without a leading slash to address the same path prefix within the PVC.
**Validation:** Optional: \&#123;\&#125;

---

**`pvcMountPath`** `string` — default: /opt/model-cache

PVCMountPath is the mount path for the PVC inside the container.
**Validation:** Optional: \&#123;\&#125;

---

#### ModelReference

ModelReference identifies a model served by a component.
When specified, a headless service is created for endpoint discovery.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#v1beta1-dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#v1beta1-dynamocomponentdeploymentspec)

**`name`** `string` — required

name is the base model identifier (e.g. "llama-3-70b-instruct-v1").
**Validation:** MinLength: 1  Required: \&#123;\&#125;

---

**`revision`** `string`

revision is the model revision/version.
**Validation:** Optional: \&#123;\&#125;

---

#### MultinodeSpec

MultinodeSpec configures a multinode component.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#v1beta1-dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#v1beta1-dynamocomponentdeploymentspec)

**`nodeCount`** `integer` — default: 2

nodeCount is the number of nodes to deploy for the multinode component. Total GPUs used is `nodeCount * container GPU request`. The value is immutable after creation.
**Validation:** Minimum: 2  Optional: \&#123;\&#125;

---

#### OptimizationType

OptimizationType defines the optimization target for SLA-based profiling.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[latency throughput]
**Appears in:** [SLASpec](#slaspec)

**Allowed values**

* latency
* throughput

#### OverridesSpec

OverridesSpec allows customizing the profiling job and the generated DynamoGraphDeployment.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta1-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta1-dynamographdeploymentrequestspec)

**`profilingJob`** `JobSpec`

ProfilingJob allows overriding the profiling Job specification. Fields set here are merged into the controller-generated Job spec. Security: creating a DGDR is workload-creation authority in its namespace — these overrides carry the same blast radius as creating a Job or Pod directly there, by design. Pod security is enforced centrally by Kubernetes Pod Security Admission on the resulting Pods once the namespace is labeled (see pod-security.kubernetes.io/enforce): it applies the full Pod Security Standards — covering privileged, host namespaces, and hostPath, not only securityContext — not this API. ServiceAccount identity is a separate layer: these overrides can set serviceAccountName and automountServiceAccountToken, which are bounded by RBAC and namespace membership rather than PSA — the same authority any Pod author in the namespace already holds. Grant create/update on DGDRs only to principals trusted to create Pods in the namespace. The profiling Job always runs in the DGDR's own namespace and overrides cannot change that — but namespace containment is not node or cross-tenant isolation. Dynamo's workloads, including this Job, satisfy the baseline standard, so enforce baseline (non-exempt) on every resulting Pod to close the privileged, host-namespace, host-device, and hostPath paths.
See [JobSpec](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#jobspec-v1-batch).
**Validation:** Optional: \&#123;\&#125;

---

**`trustRemoteCode`** `boolean` — default: false

TrustRemoteCode explicitly permits generated vLLM and SGLang workers to execute custom code from the configured model repository. When enabled, the profiler adds --trust-remote-code to every generated worker component after the deployment topology has been generated. Enable this setting only for model repositories you trust.
**Validation:** Optional: \&#123;\&#125;

---

**`dgd`** `RawExtension`

DGD provides a partial, versioned DynamoGraphDeployment override for the profiler-generated deployment. Set apiVersion to nvidia.com/v1alpha1 or nvidia.com/v1beta1 and kind to DynamoGraphDeployment. The profiler merges the override using the schema for its declared version. If the generated DGD uses another supported version, the complete DGD is converted before the merge and converted back afterward. The final DGD selected or created by a DGDR is nvidia.com/v1beta1. The override can update DGD fields, but topology entries are limited to services or components already present in the generated DGD. Metadata labels and annotations are merged, metadata.name selects the final DGD name, and other identity or runtime metadata is ignored. V1alpha1 worker argument lists retain legacy append behavior. V1beta1 follows structural schema merge behavior, including map-list merging and atomic-list replacement. The raw embedded resource preserves either supported schema. The API server validates that it has apiVersion and kind; override processing validates the DGD kind, supported version, and field schema.
See [RawExtension](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#rawextension-runtime-pkg).
**Validation:** EmbeddedResource: \&#123;\&#125;  Optional: \&#123;\&#125;

---

#### ParetoConfig

ParetoConfig is retained for compatibility with status objects produced by
older profiler releases.
Deprecated: The profiler no longer generates Pareto configurations.

**Kind:** `type`
**Appears in:** [ProfilingResultsStatus](#profilingresultsstatus)

**`config`** `RawExtension`

Config is the full deployment configuration for this Pareto point.
See [RawExtension](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#rawextension-runtime-pkg).
**Validation:** Type: object

---

#### PlacementScoreState

PlacementScoreState describes whether placement score is available and how
complete the reported score is for a graph deployment.

Every backend must set this field after the first reconciliation:

* Reported:    a score is available for every scored placement unit.
* Partial:     a score is available for some but not all placement units.
* Unsupported: the backend does not surface a placement score at all.
* Unknown:     the backend supports scores but the current value is
  indeterminate (e.g. read failure, not yet populated by the
  scheduler). When set, PlacementStatus.Score must be cleared.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Reported Partial Unsupported Unknown]
**Appears in:** [PlacementStatus](#v1beta1-placementstatus)

**Allowed values**

* Reported
* Partial
* Unsupported
* Unknown

#### PlacementStatus

PlacementStatus groups DGD-level scheduler placement fields under a single
status object so future placement signals (e.g. scheduler contract version,
last-report timestamp, per-unit reports) can be added without a schema break.

The score source is an open question in DEP #10064 (Grove mirror, typed Grove
scheduler API, or unstructured provider). Until a source is selected and
implemented, the DGD controller does not write this field; the schema and
conversion are landed here so downstream consumers can rely on the shape.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentStatus](#v1beta1-dynamographdeploymentstatus)

**`score`** `float`

score is the DGD-level scheduler placement score aggregated from relevant scheduler placement units. Normalized to \[0.0, 1.0] where higher is better and 1.0 represents the best possible placement. Aggregation uses the minimum across placement units so the value is a worst-placement signal for the graph. Scores are only comparable across DGDs that share the same scheduler scoring contract and version.
**Validation:** Maximum: 1  Minimum: 0  Optional: \&#123;\&#125;

---

**`state`** `PlacementScoreState`

state indicates placement score reporting state. See PlacementScoreState for the semantics of each value.
See [PlacementScoreState](#v1beta1-placementscorestate).
**Validation:** Enum: \[Reported Partial Unsupported Unknown]  Optional: \&#123;\&#125;

---

#### ProfilingPhase

ProfilingPhase represents a sub-phase within the profiling pipeline.
When the DGDR Phase is "Profiling", this value indicates which step
of the profiling pipeline is currently executing.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Initializing SweepingPrefill SweepingDecode SelectingConfig BuildingCurves GeneratingDGD Done]
**Appears in:** [DynamoGraphDeploymentRequestNativeStatus](#v1beta1-dynamographdeploymentrequestnativestatus), [DynamoGraphDeploymentRequestStatus](#v1beta1-dynamographdeploymentrequeststatus)

**Allowed values**

* Initializing

  Profiler is loading the DGD template, detecting GPU hardware, and resolving the model architecture from HuggingFace.
* SweepingPrefill

  Sweeping parallelization strategies (TP/TEP/DEP) across GPU counts for prefill, measuring TTFT at each configuration.
* SweepingDecode

  Sweeping parallelization strategies and concurrency levels for decode, measuring ITL at each configuration.
* SelectingConfig

  Filtering results against SLA targets and selecting the most cost-efficient configuration that meets TTFT/ITL requirements.
* BuildingCurves

  Building detailed interpolation curves (ISL→TTFT for prefill, KV-usage×context-length→ITL for decode) using the selected configs.
* GeneratingDGD

  Packaging profiling data into a ConfigMap and generating the final DGD YAML with planner integration.
* Done

  Profiling pipeline finished successfully.

#### ProfilingResultsStatus

ProfilingResultsStatus contains the output of the profiling process.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeStatus](#v1beta1-dynamographdeploymentrequestnativestatus), [DynamoGraphDeploymentRequestStatus](#v1beta1-dynamographdeploymentrequeststatus)

**`pareto`** `ParetoConfig array`

Pareto is retained for compatibility with existing status objects. Deprecated: The controller no longer populates this field.
See [ParetoConfig](#paretoconfig).
**Validation:** Optional: \&#123;\&#125;

---

**`selectedConfig`** `RawExtension`

SelectedConfig is the recommended configuration chosen by the profiler based on the SLA targets. This is the configuration used for deployment when autoApply is true.
See [RawExtension](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#rawextension-runtime-pkg).
**Validation:** Type: object  Optional: \&#123;\&#125;

---

#### ProviderOverride

ProviderOverride carries a sparse provider-native fragment for its DGD context.
Grove support is restricted as follows:

* apiVersion must be `grove.io/v1alpha1`.
* target is `PodCliqueSet`, `PodCliqueTemplateSpec`, or
  `PodCliqueScalingGroupConfig`, according to the field location and
  component shape.
* value may set topologyConstraint, and component contexts may set the
  native minAvailable field and rollingUpdate.maxUnavailable. Availability
  and rollout budgets are not supported at root or role scope.

All other providers, versions, targets, and fields are rejected.

**Kind:** `type`
**Appears in:** [ComponentRoleSpec](#v1beta1-componentrolespec), [DynamoComponentDeploymentSharedSpec](#v1beta1-dynamocomponentdeploymentsharedspec), [DynamoGraphDeploymentSpec](#v1beta1-dynamographdeploymentspec)

**`apiVersion`** `string` — required

apiVersion is the Kubernetes API group and version of the provider schema. Grove requires `grove.io/v1alpha1`.
**Validation:** MinLength: 1  Required: \&#123;\&#125;

---

**`target`** `string`

target identifies the provider resource kind or embedded provider schema. It may be omitted on input when the DGD location has one unambiguous target; admission resolves and persists it.
**Validation:** Optional: \&#123;\&#125;

---

**`value`** `JSON` — required

value is a sparse fragment of the selected provider schema. For Grove, PodCliqueSet accepts only `spec.template.topologyConstraint`; embedded targets accept `topologyConstraint`. Component contexts also accept `spec.minAvailable` on PodCliqueTemplateSpec or `minAvailable` on PodCliqueScalingGroupConfig. The minimum is immutable; migrating from the deprecated component field preserves its value and leaves the update strategy unchanged. Component contexts also accept rollingUpdate.maxUnavailable.
See [JSON](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#json-v1-apiextensions-k8s-io).
**Validation:** Required: \&#123;\&#125;  Type: object

---

#### Restart

Restart specifies the restart policy for a graph deployment.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentSpec](#v1beta1-dynamographdeploymentspec)

**`id`** `string` — required

id is an arbitrary string that triggers a restart when changed. Any modification to this value initiates a restart of the graph deployment according to the configured strategy.
**Validation:** MinLength: 1  Required: \&#123;\&#125;

---

**`strategy`** `RestartStrategy`

strategy specifies the restart strategy for the graph deployment.
See [RestartStrategy](#v1beta1-restartstrategy).
**Validation:** Optional: \&#123;\&#125;

---

#### RestartPhase

RestartPhase enumerates phases of a graph-level restart.

**Kind:** `enum`
**Underlying type:** `string`
**Appears in:** [RestartStatus](#v1beta1-restartstatus)

**Allowed values**

* Pending
* Restarting
* Completed
* Failed
* Superseded

#### RestartStatus

RestartStatus contains the status of a graph-level restart.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentStatus](#v1beta1-dynamographdeploymentstatus)

**`observedID`** `string`

observedID is the restart ID currently being processed. Matches `Restart.id` in the spec.

---

**`phase`** `RestartPhase`

phase is the phase of the restart.
See [RestartPhase](#v1beta1-restartphase).

---

**`inProgress`** `string array`

inProgress contains the names of the components currently being restarted.
**Validation:** Optional: \&#123;\&#125;

---

#### RestartStrategy

RestartStrategy defines how components are restarted.

**Kind:** `type`
**Appears in:** [Restart](#v1beta1-restart)

**`type`** `RestartStrategyType` — default: Sequential

type specifies the restart strategy type.
See [RestartStrategyType](#v1beta1-restartstrategytype).
**Validation:** Enum: \[Sequential Parallel]  Optional: \&#123;\&#125;

---

**`order`** `string array`

order is the complete ordered set of component names for sequential restarts. Omit or leave empty to use the controller's default order. This field must not be set for parallel restarts.
**Validation:** Optional: \&#123;\&#125;

---

#### RestartStrategyType

RestartStrategyType enumerates restart strategies.

**Kind:** `enum`
**Underlying type:** `string`
**Appears in:** [RestartStrategy](#v1beta1-restartstrategy)

**Allowed values**

* Sequential
* Parallel

#### RollingUpdatePhase

RollingUpdatePhase represents the current phase of a rolling update.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Pending InProgress Completed Failed ]
**Appears in:** [RollingUpdateStatus](#v1beta1-rollingupdatestatus)

**Allowed values**

* Pending
* InProgress
* Completed
* Failed
* \`\`

#### RollingUpdateStatus

RollingUpdateStatus tracks the progress of an operator-managed rolling update.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentStatus](#v1beta1-dynamographdeploymentstatus)

**`phase`** `RollingUpdatePhase`

phase indicates the current phase of the rolling update.
See [RollingUpdatePhase](#v1beta1-rollingupdatephase).
**Validation:** Enum: \[Pending InProgress Completed Failed ]  Optional: \&#123;\&#125;

---

**`startTime`** `Time`

startTime is when the rolling update began.
See [Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`endTime`** `Time`

endTime is when the rolling update completed (successfully or failed).
See [Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`updatedComponents`** `string array`

updatedComponents is the list of components that have completed the rolling update.
**Validation:** Optional: \&#123;\&#125;

---

#### SLASpec

SLASpec defines the service-level agreement targets for profiling optimization.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta1-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta1-dynamographdeploymentrequestspec)

**`ttft`** `float`

TTFT is the Time To First Token target in milliseconds.
**Validation:** Optional: \&#123;\&#125;

---

**`itl`** `float`

ITL is the Inter-Token Latency target in milliseconds.
**Validation:** Optional: \&#123;\&#125;

---

**`e2eLatency`** `float`

E2ELatency is the target end-to-end request latency in milliseconds. Alternative to specifying TTFT + ITL.
**Validation:** Optional: \&#123;\&#125;

---

**`optimizationType`** `OptimizationType`

OptimizationType is the optimization target for SLA profiling. Valid values: latency, throughput.
See [OptimizationType](#optimizationtype).
**Validation:** Enum: \[latency throughput]  Optional: \&#123;\&#125;

---

#### ScalingAdapter

ScalingAdapter opts a component into the DynamoGraphDeploymentScalingAdapter (DGDSA).
It is a marker struct: setting `scalingAdapter` at all -- even as the empty object
`scalingAdapter: {}` -- creates the DGDSA, which owns the `replicas` field so that
external autoscalers (HPA/KEDA/Planner) can drive scaling via the Scale subresource.
Omit the field to opt out.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#v1beta1-dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#v1beta1-dynamocomponentdeploymentspec)

#### SchedulingSpec

SchedulingSpec configures LPX scheduling attempts.

**Kind:** `type`
**Appears in:** [LPXConfig](#lpxconfig)

**`attemptDeadlineSeconds`** `integer`

attemptDeadlineSeconds limits how long each LPR may remain pending. Omission means unlimited; the value is not a solver budget.
**Validation:** Maximum: 9.223372036e+09  Minimum: 1  Optional: \&#123;\&#125;

---

#### SearchStrategy

SearchStrategy controls the profiling search depth.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[rapid thorough]
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta1-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta1-dynamographdeploymentrequestspec)

**Allowed values**

* rapid
* thorough

#### SpecTopologyConstraint

SpecTopologyConstraint defines deployment-level topology placement requirements.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentSpec](#v1beta1-dynamographdeploymentspec)

**`clusterTopologyName`** `string`

clusterTopologyName is the name of the ClusterTopology resource that defines the topology hierarchy for this deployment.
**Validation:** MinLength: 1

---

**`packDomain`** `TopologyDomain`

packDomain is the default topology domain to pack pods within. Optional; omit when only components carry constraints.
See [TopologyDomain](#v1beta1-topologydomain).
**Validation:** Pattern: `^[a-z0-9]([a-z0-9-]*[a-z0-9])?$`  Optional: \&#123;\&#125;

---

#### TopologyConstraint

TopologyConstraint defines component-level topology placement requirements.
The topology profile is inherited from the deployment-level
`SpecTopologyConstraint`.

**Kind:** `type`
**Appears in:** [DynamoComponentDeploymentSharedSpec](#v1beta1-dynamocomponentdeploymentsharedspec), [DynamoComponentDeploymentSpec](#v1beta1-dynamocomponentdeploymentspec)

**`packDomain`** `TopologyDomain`

packDomain is the topology domain to pack pods within. Must match a domain defined in the referenced ClusterTopology CR.
See [TopologyDomain](#v1beta1-topologydomain).
**Validation:** Pattern: `^[a-z0-9]([a-z0-9-]*[a-z0-9])?$`

---

#### TopologyDomain

TopologyDomain is a free-form topology level identifier.
Common examples: "region", "zone", "datacenter", "block", "rack", "host", "numa".
When used with a ClusterTopology CR, domain names are defined in the CR's
hierarchy; when used with `spec.experimental.kvTransferPolicy.labelKey`
alone, the value is a user-chosen logical name for the topology level.

**Kind:** `type`
**Underlying type:** `string`
**Validation:** Pattern: `^[a-z0-9]([a-z0-9-]*[a-z0-9])?$`
**Appears in:** [KvTransferPolicy](#v1beta1-kvtransferpolicy), [SpecTopologyConstraint](#v1beta1-spectopologyconstraint), [TopologyConstraint](#v1beta1-topologyconstraint)

#### WorkloadSpec

WorkloadSpec defines the workload characteristics for SLA-based profiling.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta1-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta1-dynamographdeploymentrequestspec)

**`isl`** `integer` — default: 4000

ISL is the Input Sequence Length (number of tokens).
**Validation:** Optional: \&#123;\&#125;

---

**`osl`** `integer` — default: 1000

OSL is the Output Sequence Length (number of tokens).
**Validation:** Optional: \&#123;\&#125;

---

**`concurrency`** `float`

Concurrency is the target concurrency level. Mutually exclusive with the requestRate field. When both fields are omitted and the planner is disabled, the profiler uses its default maximum-throughput selection.
**Validation:** Optional: \&#123;\&#125;

---

**`requestRate`** `float`

RequestRate is the target request rate (req/s). Mutually exclusive with the concurrency field. When both fields are omitted and the planner is disabled, the profiler uses its default maximum-throughput selection.
**Validation:** Optional: \&#123;\&#125;

---

## nvidia.com/v1beta2

Package v1beta2 contains API Schema definitions for the nvidia.com v1beta2 API group.

**Resource Types**

#### [DynamoGraphDeploymentCandidate](#dynamographdeploymentcandidate)

#### [DynamoGraphDeploymentRequest](#v1beta2-dynamographdeploymentrequest)

#### [DynamoGraphDeploymentRun](#dynamographdeploymentrun)

#### AISimRunStatus

AISimRunStatus reports the exact public recommendation input used for this execution.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRunStatus](#dynamographdeploymentrunstatus)

**`input`** `RawExtension`

Input is the fully lowered AISimulate input after typed fields, derived defaults and spec.aisim.inputOverrides have been merged. Field names and nesting use the upstream AISimulate JSON contract.
See [RawExtension](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#rawextension-runtime-pkg).
**Validation:** Type: object  Optional: \&#123;\&#125;

---

#### AISimSpec

AISimSpec supplies public recommendation input to the AISimulate version in the operator's configured
planner image.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta2-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta2-dynamographdeploymentrequestspec), [DynamoGraphDeploymentRunSpec](#dynamographdeploymentrunspec), [NativeSearchInput](#nativesearchinput)

**`inputOverrides`** `RawExtension`

InputOverrides is an RFC 7386 JSON Merge Patch over the input lowered from the typed fields. It uses the upstream AISimulate JSON contract, including snake_case names. Values here take precedence, and null deletes a lowered field. The dgdr_run member must remain an object, and its operator-owned transport, identity, and runtime fields name, max_candidates, snapshot_dir, runtime_image, runtime_version_override, derive_runtime_images, num_gpus_per_node, and namespace are operator-owned. Request and Run admission rejects them, and the Run controller enforces its values while lowering the immutable snapshot. A typed spec.workload.trace is an underlay like the other typed fields: it supplies the default traffic.source (type trace, format dynamo and the mounted trace file in paths) and the recorded-arrival traffic.load. Overrides can replace those values, including traffic.source.type, format, and paths, and null deletes the named field or parent object; the Run controller does not restore it. The typed PersistentVolumeClaim source alone decides the Run Job's trace mount and its claim dependency, so overriding a native path adds no volume mount. The operator runs the AISimulate version from its configured planner image; Requests and Runs cannot select a different image or version. Request and Run creation validate the merged input against the bundled AISimulate input schema. Request spec changes require the same validation; Run specs are immutable. Unchanged specs remain metadata-updatable after a bundled schema change.
See [RawExtension](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#rawextension-runtime-pkg).
**Validation:** Type: object  Optional: \&#123;\&#125;

---

#### Backend

Backend identifies an inference backend searched by AISimulate and used by generated candidates.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[vllm sglang trtllm]
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta2-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta2-dynamographdeploymentrequestspec), [DynamoGraphDeploymentRunSpec](#dynamographdeploymentrunspec), [NativeSearchInput](#nativesearchinput)

**Allowed values**

* vllm
* sglang
* trtllm

#### BranchProgress

BranchProgress reports progress for one independently optimized AISimulate branch.

**Kind:** `type`
**Appears in:** [DGDRRunProgress](#dgdrrunprogress)

**`name`** `string` — required

Name is the executor-defined stable branch identifier.
**Validation:** Required: \&#123;\&#125;

---

**`rounds`** `RoundProgress` — required

Rounds reports optimizer progress for this branch.
See [RoundProgress](#roundprogress).
**Validation:** Required: \&#123;\&#125;

---

#### CandidateProgress

CandidateProgress reports bounded Kubernetes publication, not all internal trials.

**Kind:** `type`
**Appears in:** [DGDRRunProgress](#dgdrrunprogress)

**`paretoFront`** `integer`

ParetoFront is the number of feasible points on the current Pareto front.
**Validation:** Optional: \&#123;\&#125;

---

**`published`** `integer`

Published is the number of Candidate resources currently referenced by this run.
**Validation:** Optional: \&#123;\&#125;

---

#### DGDRRunPhase

DGDRRunPhase is a concise presentation state. Conditions remain authoritative.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Pending Running Succeeded Failed]
**Appears in:** [DynamoGraphDeploymentRunStatus](#dynamographdeploymentrunstatus)

**Allowed values**

* Pending
* Running
* Succeeded
* Failed

#### DGDRRunProgress

DGDRRunProgress contains branch-aware optimizer and evaluation outcome counters.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRunStatus](#dynamographdeploymentrunstatus)

**`branches`** `BranchProgress array`

Branches reports independently optimized AISimulate branches.
See [BranchProgress](#branchprogress).
**Validation:** Optional: \&#123;\&#125;

---

**`evaluations`** `EvaluationProgress`

Evaluations reports unique candidate outcomes.
See [EvaluationProgress](#evaluationprogress).
**Validation:** Optional: \&#123;\&#125;

---

**`candidates`** `CandidateProgress`

Candidates reports bounded Kubernetes publication.
See [CandidateProgress](#candidateprogress).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoGraphDeploymentCandidate

DynamoGraphDeploymentCandidate is one bounded, user-visible search result.

**Kind:** `resource`

**`apiVersion`** `string`

`nvidia.com/v1beta2`

---

**`kind`** `string`

`DynamoGraphDeploymentCandidate`

---

**`metadata`** `ObjectMeta`

Refer to Kubernetes API documentation for fields of `metadata`.
See [ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`spec`** `RawExtension` — required

Spec is exactly the unpruned DGD spec, before dry-run defaulting or webhook mutation. It is opaque so invalid field types and unknown fields can be retained with Valid=False. A failed override leaves the generated spec unchanged. Immutability is enforced by admission because CEL cannot inspect fields in an opaque object.
See [RawExtension](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#rawextension-runtime-pkg).
**Validation:** Type: object  Required: \&#123;\&#125;

---

**`status`** `DynamoGraphDeploymentCandidateStatus`

See [DynamoGraphDeploymentCandidateStatus](#dynamographdeploymentcandidatestatus).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoGraphDeploymentCandidateStatus

DynamoGraphDeploymentCandidateStatus describes evaluation, never deployment health.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentCandidate](#dynamographdeploymentcandidate)

**`parameters`** `RawExtension`

Parameters are the original resolved evaluation inputs. Overrides do not change them.
See [RawExtension](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#rawextension-runtime-pkg).
**Validation:** Type: object  Optional: \&#123;\&#125;

---

**`metrics`** `RawExtension`

Metrics are the resolved evaluation metrics for this point. They describe the original evaluated configuration, not a deployment changed by overrides.
See [RawExtension](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#rawextension-runtime-pkg).
**Validation:** Type: object  Optional: \&#123;\&#125;

---

**`conditions`** `Condition array`

Conditions records the final Valid result for the Candidate's DGD: - Valid=True, ValidationSucceeded: atomic override application and strict server-side   dry-run succeeded; the API object is structurally valid and passed admission at checking time. - Valid=False, OverrideTargetNotFound: an override names a component absent from the generated DGD. - Valid=False, OverrideFailed: the override could not be applied in full, for example because   it changes reserved metadata or supplies an invalid merge directive. The original DGD is retained. - Valid=False, ValidationFailed: the resulting DGD was rejected by strict dry-run admission. Check for Valid=True before using spec as a DGD. An absent condition is not success. Valid reports API validity, not deployment readiness or successful image pulls and GPU scheduling. Invalid Candidates remain visible and count toward recommendation.maxCandidates.
See [Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#condition-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

#### v1beta2 DynamoGraphDeploymentRequest

DynamoGraphDeploymentRequest is the Schema for simulation-backed deployment searches.

**Kind:** `resource`

**`apiVersion`** `string`

`nvidia.com/v1beta2`

---

**`kind`** `string`

`DynamoGraphDeploymentRequest`

---

**`metadata`** `ObjectMeta`

Refer to Kubernetes API documentation for fields of `metadata`.
See [ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`spec`** `DynamoGraphDeploymentRequestSpec` — required

See [DynamoGraphDeploymentRequestSpec](#v1beta2-dynamographdeploymentrequestspec).
**Validation:** Required: \&#123;\&#125;

---

**`status`** `DynamoGraphDeploymentRequestStatus`

See [DynamoGraphDeploymentRequestStatus](#v1beta2-dynamographdeploymentrequeststatus).
**Validation:** Optional: \&#123;\&#125;

---

#### v1beta2 DynamoGraphDeploymentRequestNativeSpec

DynamoGraphDeploymentRequestNativeSpec contains the native v1beta2 request fields.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestSpec](#v1beta2-dynamographdeploymentrequestspec)

**`model`** `ModelSpec`

Model identifies the model whose deployment configurations are evaluated.
See [ModelSpec](#modelspec).
**Validation:** Optional: \&#123;\&#125;

---

**`backends`** `Backend array`

Backends lists one or more inference backends searched by AISimulate and used by generated candidates.
See [Backend](#backend).
**Validation:** Enum: \[vllm sglang trtllm]  MinItems: 1  Optional: \&#123;\&#125;

---

**`hardware`** `HardwareSpec`

Hardware bounds the accelerator configurations evaluated by the search. When omitted, admission discovers SKU, budget and node width. An exactly empty object opts out of operator hardware discovery and typed defaults. Admission completes every nonempty object with any missing hardware values; explicit values remain authoritative.
See [HardwareSpec](#v1beta2-hardwarespec).
**Validation:** Optional: \&#123;\&#125;

---

**`workload`** `WorkloadSpec`

Workload defines the traffic model used for every candidate evaluation: synthetic static traffic or a recorded trace. When omitted, admission supplies 1024 input tokens, 128 output tokens and concurrency 10; an explicit empty workload receives the same shape. workload.static: \&#123;\&#125; opts out of all traffic defaults. Any other static object is completed with its missing defaults, and a trace workload receives no static default. spec.aisim.inputOverrides is applied as an RFC 7386 JSON Merge Patch and wins over every lowered traffic field it names, including the fields a trace lowers. The default evaluates a fixed concurrency, so it does not create a KV-capacity-fraction search. Lowering independently defaults optimizer.max_trials to 320.
See [WorkloadSpec](#v1beta2-workloadspec).
**Validation:** Optional: \&#123;\&#125;

---

**`objective`** `ObjectiveSpec`

Objective defines scalar optimization. When omitted, admission supplies the object. Its mode defaults to Optimize, its scalar metric defaults to ThroughputPerGPU, and its absent SLA defaults to TTFT 2000 ms and ITL 30 ms.
See [ObjectiveSpec](#objectivespec).
**Validation:** Optional: \&#123;\&#125;

---

**`aisim`** `AISimSpec`

AISim supplies public recommendation input to the operator's AISimulate execution bundle.
See [AISimSpec](#aisimspec).
**Validation:** Optional: \&#123;\&#125;

---

**`recommendation`** `RecommendationSpec`

Recommendation controls bounded projection into DGDC resources.
See [RecommendationSpec](#recommendationspec).
**Validation:** Optional: \&#123;\&#125;

---

**`overrides`** `OverridesSpec`

Overrides customizes the generated DGD without changing AISimulate execution.
See [OverridesSpec](#v1beta2-overridesspec).
**Validation:** Optional: \&#123;\&#125;

---

#### v1beta2 DynamoGraphDeploymentRequestNativeStatus

DynamoGraphDeploymentRequestNativeStatus contains the native v1beta2 status fields.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestStatus](#v1beta2-dynamographdeploymentrequeststatus)

**`observedGeneration`** `integer`

ObservedGeneration is the most recent DGDR generation accepted by the controller.
**Validation:** Optional: \&#123;\&#125;

---

**`activeRunRef`** `LocalObjectReference`

ActiveRunRef identifies the reserved or active Run. During a spec change it continues to identify the superseded Run until foreground deletion completes, before a replacement is reserved.
See [LocalObjectReference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#localobjectreference-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

**`recentRunRefs`** `LocalObjectReference array`

RecentRunRefs identifies retained terminal runs in newest-first order.
See [LocalObjectReference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#localobjectreference-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

**`conditions`** `Condition array`

Conditions reports reconciliation of the persistent request, not run execution outcomes.
See [Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#condition-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

#### v1beta2 DynamoGraphDeploymentRequestSpec

DynamoGraphDeploymentRequestSpec defines persistent desired search intent.
Native v1beta2 fields and the V1Beta1 conversion envelope are mutually exclusive.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequest](#v1beta2-dynamographdeploymentrequest)

**`model`** `ModelSpec`

Model identifies the model whose deployment configurations are evaluated.
See [ModelSpec](#modelspec).
**Validation:** Optional: \&#123;\&#125;

---

**`backends`** `Backend array`

Backends lists one or more inference backends searched by AISimulate and used by generated candidates.
See [Backend](#backend).
**Validation:** Enum: \[vllm sglang trtllm]  MinItems: 1  Optional: \&#123;\&#125;

---

**`hardware`** `HardwareSpec`

Hardware bounds the accelerator configurations evaluated by the search. When omitted, admission discovers SKU, budget and node width. An exactly empty object opts out of operator hardware discovery and typed defaults. Admission completes every nonempty object with any missing hardware values; explicit values remain authoritative.
See [HardwareSpec](#v1beta2-hardwarespec).
**Validation:** Optional: \&#123;\&#125;

---

**`workload`** `WorkloadSpec`

Workload defines the traffic model used for every candidate evaluation: synthetic static traffic or a recorded trace. When omitted, admission supplies 1024 input tokens, 128 output tokens and concurrency 10; an explicit empty workload receives the same shape. workload.static: \&#123;\&#125; opts out of all traffic defaults. Any other static object is completed with its missing defaults, and a trace workload receives no static default. spec.aisim.inputOverrides is applied as an RFC 7386 JSON Merge Patch and wins over every lowered traffic field it names, including the fields a trace lowers. The default evaluates a fixed concurrency, so it does not create a KV-capacity-fraction search. Lowering independently defaults optimizer.max_trials to 320.
See [WorkloadSpec](#v1beta2-workloadspec).
**Validation:** Optional: \&#123;\&#125;

---

**`objective`** `ObjectiveSpec`

Objective defines scalar optimization. When omitted, admission supplies the object. Its mode defaults to Optimize, its scalar metric defaults to ThroughputPerGPU, and its absent SLA defaults to TTFT 2000 ms and ITL 30 ms.
See [ObjectiveSpec](#objectivespec).
**Validation:** Optional: \&#123;\&#125;

---

**`aisim`** `AISimSpec`

AISim supplies public recommendation input to the operator's AISimulate execution bundle.
See [AISimSpec](#aisimspec).
**Validation:** Optional: \&#123;\&#125;

---

**`recommendation`** `RecommendationSpec`

Recommendation controls bounded projection into DGDC resources.
See [RecommendationSpec](#recommendationspec).
**Validation:** Optional: \&#123;\&#125;

---

**`overrides`** `OverridesSpec`

Overrides customizes the generated DGD without changing AISimulate execution.
See [OverridesSpec](#v1beta2-overridesspec).
**Validation:** Optional: \&#123;\&#125;

---

**`v1beta1`** `JSON`

V1Beta1 losslessly preserves a native v1beta1 spec while this object is represented through v1beta2. It is mutually exclusive with native fields. This field is a read-only conversion view; modify the request through the native v1beta1 API.
See [JSON](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#json-v1-apiextensions-k8s-io).
**Validation:** Type: object  Optional: \&#123;\&#125;

---

#### v1beta2 DynamoGraphDeploymentRequestStatus

DynamoGraphDeploymentRequestStatus represents reconciliation of persistent search intent.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequest](#v1beta2-dynamographdeploymentrequest)

**`observedGeneration`** `integer`

ObservedGeneration is the most recent DGDR generation accepted by the controller.
**Validation:** Optional: \&#123;\&#125;

---

**`activeRunRef`** `LocalObjectReference`

ActiveRunRef identifies the reserved or active Run. During a spec change it continues to identify the superseded Run until foreground deletion completes, before a replacement is reserved.
See [LocalObjectReference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#localobjectreference-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

**`recentRunRefs`** `LocalObjectReference array`

RecentRunRefs identifies retained terminal runs in newest-first order.
See [LocalObjectReference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#localobjectreference-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

**`conditions`** `Condition array`

Conditions reports reconciliation of the persistent request, not run execution outcomes.
See [Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#condition-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`v1beta1`** `JSON`

V1Beta1 losslessly preserves a native v1beta1 status while this object is represented through v1beta2.
See [JSON](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#json-v1-apiextensions-k8s-io).
**Validation:** Type: object  Optional: \&#123;\&#125;

---

#### DynamoGraphDeploymentRun

DynamoGraphDeploymentRun is one immutable accepted DGDR request and its execution status.

**Kind:** `resource`

**`apiVersion`** `string`

`nvidia.com/v1beta2`

---

**`kind`** `string`

`DynamoGraphDeploymentRun`

---

**`metadata`** `ObjectMeta`

Refer to Kubernetes API documentation for fields of `metadata`.
See [ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#objectmeta-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`spec`** `DynamoGraphDeploymentRunSpec` — required

See [DynamoGraphDeploymentRunSpec](#dynamographdeploymentrunspec).
**Validation:** Required: \&#123;\&#125;

---

**`status`** `DynamoGraphDeploymentRunStatus`

See [DynamoGraphDeploymentRunStatus](#dynamographdeploymentrunstatus).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoGraphDeploymentRunSpec

DynamoGraphDeploymentRunSpec is an immutable snapshot of an accepted DGDR spec.
Request admission resolves its structural defaults before the Request controller copies it;
Request admission defaulting does not apply to Runs.

The Run reconciler lowers this immutable typed snapshot plus inputOverrides exactly once and
records the resulting public recommendation input in status.aisim.input.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRun](#dynamographdeploymentrun)

**`model`** `ModelSpec`

Model identifies the model whose deployment configurations are evaluated.
See [ModelSpec](#modelspec).
**Validation:** Optional: \&#123;\&#125;

---

**`backends`** `Backend array`

Backends lists one or more inference backends searched by AISimulate and used by generated candidates.
See [Backend](#backend).
**Validation:** Enum: \[vllm sglang trtllm]  MinItems: 1  Optional: \&#123;\&#125;

---

**`hardware`** `HardwareSpec`

Hardware bounds the accelerator configurations evaluated by the search. When omitted, admission discovers SKU, budget and node width. An exactly empty object opts out of operator hardware discovery and typed defaults. Admission completes every nonempty object with any missing hardware values; explicit values remain authoritative.
See [HardwareSpec](#v1beta2-hardwarespec).
**Validation:** Optional: \&#123;\&#125;

---

**`workload`** `WorkloadSpec`

Workload defines the traffic model used for every candidate evaluation: synthetic static traffic or a recorded trace. When omitted, admission supplies 1024 input tokens, 128 output tokens and concurrency 10; an explicit empty workload receives the same shape. workload.static: \&#123;\&#125; opts out of all traffic defaults. Any other static object is completed with its missing defaults, and a trace workload receives no static default. spec.aisim.inputOverrides is applied as an RFC 7386 JSON Merge Patch and wins over every lowered traffic field it names, including the fields a trace lowers. The default evaluates a fixed concurrency, so it does not create a KV-capacity-fraction search. Lowering independently defaults optimizer.max_trials to 320.
See [WorkloadSpec](#v1beta2-workloadspec).
**Validation:** Optional: \&#123;\&#125;

---

**`objective`** `ObjectiveSpec`

Objective defines scalar optimization. When omitted, admission supplies the object. Its mode defaults to Optimize, its scalar metric defaults to ThroughputPerGPU, and its absent SLA defaults to TTFT 2000 ms and ITL 30 ms.
See [ObjectiveSpec](#objectivespec).
**Validation:** Optional: \&#123;\&#125;

---

**`aisim`** `AISimSpec`

AISim supplies public recommendation input to the operator's AISimulate execution bundle.
See [AISimSpec](#aisimspec).
**Validation:** Optional: \&#123;\&#125;

---

**`recommendation`** `RecommendationSpec`

Recommendation controls bounded projection into DGDC resources.
See [RecommendationSpec](#recommendationspec).
**Validation:** Optional: \&#123;\&#125;

---

**`overrides`** `OverridesSpec`

Overrides customizes the generated DGD without changing AISimulate execution.
See [OverridesSpec](#v1beta2-overridesspec).
**Validation:** Optional: \&#123;\&#125;

---

#### DynamoGraphDeploymentRunStatus

DynamoGraphDeploymentRunStatus represents one search execution's observed state.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRun](#dynamographdeploymentrun)

**`phase`** `DGDRRunPhase`

Phase is a concise presentation state. Conditions remain authoritative.
See [DGDRRunPhase](#dgdrrunphase).
**Validation:** Enum: \[Pending Running Succeeded Failed]  Optional: \&#123;\&#125;

---

**`jobRef`** `ResourceReference`

JobRef identifies the controller-owned Job for this run.
See [ResourceReference](#resourcereference).
**Validation:** Optional: \&#123;\&#125;

---

**`progress`** `DGDRRunProgress`

Progress contains branch-aware optimizer and evaluation outcome counters.
See [DGDRRunProgress](#dgdrrunprogress).
**Validation:** Optional: \&#123;\&#125;

---

**`aisim`** `AISimRunStatus`

AISim reports the effective input executed by AISimulate.
See [AISimRunStatus](#aisimrunstatus).
**Validation:** Optional: \&#123;\&#125;

---

**`candidateRefs`** `LocalObjectReference array`

CandidateRefs identifies the current bounded DGDC projection. List order represents rank, best first, for scalar searches.
See [LocalObjectReference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#localobjectreference-v1-core).
**Validation:** Optional: \&#123;\&#125;

---

**`startTime`** `Time`

StartTime is when execution started.
See [Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`completionTime`** `Time`

CompletionTime is present only after a terminal outcome.
See [Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`lastProgressTime`** `Time`

LastProgressTime is the latest coarse-grained progress update or heartbeat. Writers should update it periodically, not for every evaluation.
See [Time](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#time-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

**`conditions`** `Condition array`

Conditions contains standard Kubernetes conditions merged by type. Completed is owned by the Run controller. Published is owned by the publisher: False reports a retryable Candidate preparation error, including a forbidden DGD dry-run; True means the current Candidate projection is published, including any invalid Candidates. A preparation error leaves the Run open and is retried until configuration is repaired or the Run is stopped. Published does not determine the Run's terminal outcome.
See [Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#condition-v1-meta).
**Validation:** Optional: \&#123;\&#125;

---

#### EvaluationProgress

EvaluationProgress reports unique candidate outcomes without creating one resource per trial.

**Kind:** `type`
**Appears in:** [DGDRRunProgress](#dgdrrunprogress)

**`scheduled`** `integer`

Scheduled is the number of unique evaluations accepted for execution.
**Validation:** Optional: \&#123;\&#125;

---

**`running`** `integer`

Running is the number of evaluations currently executing.
**Validation:** Optional: \&#123;\&#125;

---

**`feasible`** `integer`

Feasible is the number of completed evaluations that satisfy all constraints.
**Validation:** Optional: \&#123;\&#125;

---

**`infeasible`** `integer`

Infeasible is the number of completed evaluations that violate at least one constraint.
**Validation:** Optional: \&#123;\&#125;

---

**`failed`** `integer`

Failed is the number of evaluations that ended in an execution error.
**Validation:** Optional: \&#123;\&#125;

---

**`unsupported`** `integer`

Unsupported is the number of configurations rejected as unsupported before evaluation.
**Validation:** Optional: \&#123;\&#125;

---

**`cacheHits`** `integer`

CacheHits is the number of evaluations satisfied from a prior result.
**Validation:** Optional: \&#123;\&#125;

---

#### GPUHardwareSpec

GPUHardwareSpec describes accelerator identity and the maximum allocation per candidate.

**Kind:** `type`
**Appears in:** [HardwareSpec](#v1beta2-hardwarespec)

**`sku`** `string`

SKU identifies the accelerator using the AISimulate hardware catalog name. Known values in the bundled AISimulate release are `a100_pcie`, `a100_sxm`, `a30`, `b200_sxm`, `b300_sxm`, `b60`, `gb200`, `gb300`, `h100_pcie`, `h100_sxm`, `h200_sxm`, `l4`, `l40s`, and `rtx_pro_6000_server`. The field remains open so an external AISimulate systems catalog can add identifiers. Admission passes an unknown identifier through unchanged and warns when `budget` and the parent `numGpusPerNode` are also explicit. Without both, it rejects the identifier because cluster discovery cannot associate capacity or topology with it. When omitted from a nonempty hardware object, admission discovers the accelerator.
**Validation:** MinLength: 1  Optional: \&#123;\&#125;

---

**`budget`** `integer`

Budget is the maximum total number of GPUs one candidate may use. When omitted for a known SKU, admission derives the available GPU budget from the cluster. An SKU unknown to the bundled AISimulate catalog requires an explicit `budget` and an explicit `numGpusPerNode` in the parent hardware object.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

#### v1beta2 HardwareSpec

HardwareSpec bounds the accelerator configurations evaluated by the search. An exactly empty
object opts out of operator cluster discovery and typed hardware defaults.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta2-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta2-dynamographdeploymentrequestspec), [DynamoGraphDeploymentRunSpec](#dynamographdeploymentrunspec), [NativeSearchInput](#nativesearchinput)

**`gpu`** `GPUHardwareSpec`

GPU describes accelerator identity and the maximum allocation per candidate. In a nonempty hardware object, admission resolves an omitted SKU or budget from the cluster.
See [GPUHardwareSpec](#gpuhardwarespec).
**Validation:** Optional: \&#123;\&#125;

---

**`numGpusPerNode`** `integer`

NumGPUsPerNode is the number of GPUs available to one candidate on each node. It lowers to AISimulate's num_gpus_per_node input. An explicit value is authoritative. In a nonempty hardware object, admission discovers an omitted value from the selected cluster node shape. The Run controller never discovers this value. An exactly empty hardware object opts out of all operator hardware discovery and typed hardware defaults, leaving AISimulate input and defaults authoritative.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

#### KVCapacityFractionRange

KVCapacityFractionRange defines the searched fraction of a candidate's KV capacity.

**Kind:** `type`
**Appears in:** [KVCapacityFractionSpec](#kvcapacityfractionspec)

**`min`** `float` — required

Min is the lower end of the searched fraction range.
**Validation:** ExclusiveMinimum: true  Maximum: 1  Minimum: 0  Required: \&#123;\&#125;

---

**`max`** `float` — required

Max is the upper end of the searched fraction range.
**Validation:** ExclusiveMinimum: true  Maximum: 1  Minimum: 0  Required: \&#123;\&#125;

---

#### KVCapacityFractionSpec

KVCapacityFractionSpec selects either one fixed fraction or a searched range.

**Kind:** `type`
**Appears in:** [StaticLoadSpec](#staticloadspec)

**`value`** `float`

Value uses a fixed fraction of the candidate's KV capacity. A value of 1 uses its full estimated capacity.
**Validation:** ExclusiveMinimum: true  Maximum: 1  Minimum: 0  Optional: \&#123;\&#125;

---

**`range`** `KVCapacityFractionRange`

Range searches fractions between min and max.
See [KVCapacityFractionRange](#kvcapacityfractionrange).
**Validation:** Optional: \&#123;\&#125;

---

#### ModelSpec

ModelSpec identifies the model whose deployment configurations are evaluated.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta2-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta2-dynamographdeploymentrequestspec), [DynamoGraphDeploymentRunSpec](#dynamographdeploymentrunspec), [NativeSearchInput](#nativesearchinput)

**`name`** `string` — required

Name identifies the model in the syntax accepted by the selected backend.
**Validation:** MinLength: 1  Required: \&#123;\&#125;

---

#### NativeSearchInput

NativeSearchInput defines the v1beta2 search input shared by Requests and
immutable Runs.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta2-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta2-dynamographdeploymentrequestspec), [DynamoGraphDeploymentRunSpec](#dynamographdeploymentrunspec)

**`model`** `ModelSpec`

Model identifies the model whose deployment configurations are evaluated.
See [ModelSpec](#modelspec).
**Validation:** Optional: \&#123;\&#125;

---

**`backends`** `Backend array`

Backends lists one or more inference backends searched by AISimulate and used by generated candidates.
See [Backend](#backend).
**Validation:** Enum: \[vllm sglang trtllm]  MinItems: 1  Optional: \&#123;\&#125;

---

**`hardware`** `HardwareSpec`

Hardware bounds the accelerator configurations evaluated by the search. When omitted, admission discovers SKU, budget and node width. An exactly empty object opts out of operator hardware discovery and typed defaults. Admission completes every nonempty object with any missing hardware values; explicit values remain authoritative.
See [HardwareSpec](#v1beta2-hardwarespec).
**Validation:** Optional: \&#123;\&#125;

---

**`workload`** `WorkloadSpec`

Workload defines the traffic model used for every candidate evaluation: synthetic static traffic or a recorded trace. When omitted, admission supplies 1024 input tokens, 128 output tokens and concurrency 10; an explicit empty workload receives the same shape. workload.static: \&#123;\&#125; opts out of all traffic defaults. Any other static object is completed with its missing defaults, and a trace workload receives no static default. spec.aisim.inputOverrides is applied as an RFC 7386 JSON Merge Patch and wins over every lowered traffic field it names, including the fields a trace lowers. The default evaluates a fixed concurrency, so it does not create a KV-capacity-fraction search. Lowering independently defaults optimizer.max_trials to 320.
See [WorkloadSpec](#v1beta2-workloadspec).
**Validation:** Optional: \&#123;\&#125;

---

**`objective`** `ObjectiveSpec`

Objective defines scalar optimization. When omitted, admission supplies the object. Its mode defaults to Optimize, its scalar metric defaults to ThroughputPerGPU, and its absent SLA defaults to TTFT 2000 ms and ITL 30 ms.
See [ObjectiveSpec](#objectivespec).
**Validation:** Optional: \&#123;\&#125;

---

**`aisim`** `AISimSpec`

AISim supplies public recommendation input to the operator's AISimulate execution bundle.
See [AISimSpec](#aisimspec).
**Validation:** Optional: \&#123;\&#125;

---

**`recommendation`** `RecommendationSpec`

Recommendation controls bounded projection into DGDC resources.
See [RecommendationSpec](#recommendationspec).
**Validation:** Optional: \&#123;\&#125;

---

**`overrides`** `OverridesSpec`

Overrides customizes the generated DGD without changing AISimulate execution.
See [OverridesSpec](#v1beta2-overridesspec).
**Validation:** Optional: \&#123;\&#125;

---

#### ObjectiveMetric

ObjectiveMetric is a metric optimized by AISimulate.

**Kind:** `type`
**Underlying type:** `string`
**Validation:** Enum: \[Throughput ThroughputPerGPU ThroughputPerUser TTFT E2ELatency Goodput GoodputPerGPU]
**Appears in:** [ObjectiveSpec](#objectivespec)

#### ObjectiveMode

ObjectiveMode selects the optimization mode. Pareto is reserved for a future
release and is not admitted until Candidate publication supports Pareto fronts.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Optimize]
**Appears in:** [ObjectiveSpec](#objectivespec)

**Allowed values**

* Optimize
* Pareto

  ObjectiveModePareto is reserved for the future Pareto API implementation.

#### ObjectiveSLASpec

ObjectiveSLASpec defines per-request latency bounds used to calculate goodput.
An empty object disables SLA filtering.

**Kind:** `type`
**Appears in:** [ObjectiveSpec](#objectivespec)

**`ttftMs`** `float`

TTFTMs is the Time To First Token bound in milliseconds.
**Validation:** ExclusiveMinimum: true  Minimum: 0  Optional: \&#123;\&#125;

---

**`itlMs`** `float`

ITLMs is the Inter-Token Latency bound in milliseconds.
**Validation:** ExclusiveMinimum: true  Minimum: 0  Optional: \&#123;\&#125;

---

**`e2eMs`** `float`

E2EMs is an alternative end-to-end bound in milliseconds.
**Validation:** ExclusiveMinimum: true  Minimum: 0  Optional: \&#123;\&#125;

---

#### ObjectiveSpec

ObjectiveSpec defines scalar optimization. Pareto fields are reserved for a future release.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta2-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta2-dynamographdeploymentrequestspec), [DynamoGraphDeploymentRunSpec](#dynamographdeploymentrunspec), [NativeSearchInput](#nativesearchinput)

**`mode`** `ObjectiveMode`

Mode selects scalar optimization. Only Optimize is currently supported.
See [ObjectiveMode](#objectivemode).
**Validation:** Enum: \[Optimize]  Optional: \&#123;\&#125;

---

**`metric`** `ObjectiveMetric`

Metric is the scalar target when mode is Optimize. When omitted in Optimize mode, admission defaults it to ThroughputPerGPU.
See [ObjectiveMetric](#objectivemetric).
**Validation:** Enum: \[Throughput ThroughputPerGPU ThroughputPerUser TTFT E2ELatency Goodput GoodputPerGPU]  Optional: \&#123;\&#125;

---

**`metrics`** `ObjectiveMetric array`

Metrics is reserved for the future Pareto implementation.
See [ObjectiveMetric](#objectivemetric).
**Validation:** Enum: \[Throughput ThroughputPerGPU ThroughputPerUser TTFT E2ELatency Goodput GoodputPerGPU]  MaxItems: 2  MinItems: 2  Optional: \&#123;\&#125;

---

**`sla`** `ObjectiveSLASpec`

SLA defines per-request latency bounds used to calculate goodput. Admission defaults an omitted SLA to TTFT 2000 ms and ITL 30 ms. An explicit empty object opts out of those defaults. spec.aisim.inputOverrides.evaluation.sla overrides the bounds it names.
See [ObjectiveSLASpec](#objectiveslaspec).
**Validation:** Optional: \&#123;\&#125;

---

#### v1beta2 OverridesSpec

OverridesSpec patches the generated deployment independently for every selected Candidate.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta2-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta2-dynamographdeploymentrequestspec), [DynamoGraphDeploymentRunSpec](#dynamographdeploymentrunspec), [NativeSearchInput](#nativesearchinput)

**`dgd`** `RawExtension`

DGD is one partial nvidia.com/v1beta1 DynamoGraphDeployment applied by the publisher using the DGD schema's Server-Side Apply merge rules. Other API versions are not supported. Components must already exist; named containers may be added. Atomic lists, including container command and args, replace the generated lists. The supported customization $patch: \&#123;args: append\&#125; on a container appends to its explicit generated args list; both the container and its args must already exist. No other $patch operation is supported. Application is atomic: a merge failure retains the unchanged generated deployment with Valid=False. A successful merge is checked by strict server-side dry-run; the dry-run response and its defaults are discarded. The Candidate retains the unpruned payload from before the check. Invalid Candidates count toward maxCandidates. Overrides may change any deployment configuration. Evaluation metrics are not recomputed and continue to describe the original AISimulate configuration. DGD labels and annotations become Candidate labels and annotations. A failed merge retains only the original generated metadata; a successful merge followed by failed dry-run validation retains the merged metadata on the invalid Candidate. Other metadata and publisher-owned keys cannot be overridden; such attempts fail atomically. The complete Candidate metadata must satisfy Kubernetes limits, including generated and reserved annotations. An override that exceeds those limits fails atomically.
See [RawExtension](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#rawextension-runtime-pkg).
**Validation:** EmbeddedResource: \&#123;\&#125;  Optional: \&#123;\&#125;

---

#### RecommendationSpec

RecommendationSpec controls bounded projection into DGDC resources.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta2-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta2-dynamographdeploymentrequestspec), [DynamoGraphDeploymentRunSpec](#dynamographdeploymentrunspec), [NativeSearchInput](#nativesearchinput)

**`maxCandidates`** `integer`

MaxCandidates is the maximum number of DGDCs owned by one run. Scalar candidates are ordered best first. This field does not limit internal trials.
**Validation:** Maximum: 100  Minimum: 1  Optional: \&#123;\&#125;

---

#### ResourceReference

ResourceReference identifies a namespaced resource by name and UID.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRunStatus](#dynamographdeploymentrunstatus)

**`name`** `string` — required

Name is the resource name.
**Validation:** Required: \&#123;\&#125;

---

**`uid`** `UID`

UID is the resource UID.
See [UID](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#uid-types-pkg).
**Validation:** Optional: \&#123;\&#125;

---

#### RoundProgress

RoundProgress reports completed and planned optimizer rounds.

**Kind:** `type`
**Appears in:** [BranchProgress](#branchprogress)

**`completed`** `integer` — required

Completed is the number of finished rounds.
**Validation:** Required: \&#123;\&#125;

---

**`total`** `integer` — required

Total is the number of planned rounds.
**Validation:** Required: \&#123;\&#125;

---

#### StaticLoadSpec

StaticLoadSpec selects exactly one synthetic load model by field presence.

**Kind:** `type`
**Appears in:** [StaticWorkloadSpec](#staticworkloadspec)

**`requestsPerSecond`** `float`

RequestsPerSecond is a fixed open-loop arrival rate.
**Validation:** ExclusiveMinimum: true  Minimum: 0  Optional: \&#123;\&#125;

---

**`concurrency`** `integer`

Concurrency is a fixed closed-loop in-flight request cap.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`kvCapacityFraction`** `KVCapacityFractionSpec`

KVCapacityFraction derives concurrency from each candidate's estimated KV capacity.
See [KVCapacityFractionSpec](#kvcapacityfractionspec).
**Validation:** Optional: \&#123;\&#125;

---

#### StaticWorkloadSpec

StaticWorkloadSpec defines AISimulate synthetic traffic. Admission completes a nonempty
object with the omitted static defaults; an explicit empty object opts out of them.

**Kind:** `type`
**Appears in:** [WorkloadSpec](#v1beta2-workloadspec)

**`inputTokens`** `integer`

InputTokens is the synthetic request input length in tokens.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`outputTokens`** `integer`

OutputTokens is the synthetic request output length in tokens.
**Validation:** Minimum: 1  Optional: \&#123;\&#125;

---

**`load`** `StaticLoadSpec`

Load selects the synthetic load model. When omitted from a nonempty static workload, admission defaults it to concurrency 10.
See [StaticLoadSpec](#staticloadspec).
**Validation:** Optional: \&#123;\&#125;

---

#### TraceFormat

TraceFormat identifies the decoder of a recorded request trace. Lowering translates it to
AISimulate's native traffic.source.format.

**Kind:** `enum`
**Underlying type:** `string`
**Validation:** Enum: \[Dynamo]
**Appears in:** [TraceWorkloadSpec](#traceworkloadspec)

**Allowed values**

* Dynamo

  TraceFormatDynamo is the Dynamo request trace (dynamo.request.trace.v1) that the frontend records, as JSON Lines or gzip-compressed JSON Lines. It lowers to AISimulate's dynamo format.

#### TracePVCSource

TracePVCSource names one trace file on a PersistentVolumeClaim in the Request namespace.

**Kind:** `type`
**Appears in:** [TraceSourceSpec](#tracesourcespec)

**`claimName`** `string` — required

ClaimName is the PersistentVolumeClaim, in the Request namespace, that holds the trace. The Run Job mounts only the trace file from it, read-only, and only into the AISimulate container. Each Run protects the claim with the finalizer `nvidia.com/dgdr-run-<run-uid>` until the Run completes or, for a Run deleted before it completes, until no Job of the Run is left. Garbage collection deletes the Job of a deleted Run before the Job's pod, so the finalizer of a deleted Run can be released while that pod still stops; Kubernetes PersistentVolumeClaim protection keeps the claim until no pod uses it. Deleting the claim cancels the Runs that read it.
**Validation:** MaxLength: 253  MinLength: 1  Pattern: `^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$`  Required: \&#123;\&#125;

---

**`subPath`** `string` — required

SubPath names one trace file relative to the root of the claim; the Run Job mounts it as the subPath of the claim volume. It is neither a directory nor a glob. It must not start or end with '/' and must not contain empty, '.' or '..' segments or a NUL character, which no file name can hold. The file must be complete before the Request is created and must never be rewritten: every Run of the Request reads it when its Job starts.
**Validation:** MaxLength: 1024  MinLength: 1  Required: \&#123;\&#125;

---

#### TraceReplaySpec

TraceReplaySpec configures how AISimulate replays a decoded trace.

**Kind:** `type`
**Appears in:** [TraceWorkloadSpec](#traceworkloadspec)

**`arrivalSpeedupRatio`** `float`

ArrivalSpeedupRatio multiplies the recorded request-arrival rate. 1.0 preserves it. When omitted, the recorded arrival times are replayed unchanged.
**Validation:** ExclusiveMinimum: true  Minimum: 0  Optional: \&#123;\&#125;

---

#### TraceSourceSpec

TraceSourceSpec identifies exactly one trace artifact. A PersistentVolumeClaim is the only
source in this release.

**Kind:** `type`
**Appears in:** [TraceWorkloadSpec](#traceworkloadspec)

**`persistentVolumeClaim`** `TracePVCSource`

PersistentVolumeClaim reads the trace from a PersistentVolumeClaim in the Request namespace.
See [TracePVCSource](#tracepvcsource).
**Validation:** Optional: \&#123;\&#125;

---

#### TraceWorkloadSpec

TraceWorkloadSpec replays a recorded request trace open loop at its recorded arrival times.

**Kind:** `type`
**Appears in:** [WorkloadSpec](#v1beta2-workloadspec)

**`format`** `TraceFormat` — default: Dynamo

Format identifies the trace decoder. Defaults to Dynamo.
See [TraceFormat](#traceformat).
**Validation:** Enum: \[Dynamo]  Optional: \&#123;\&#125;

---

**`source`** `TraceSourceSpec` — required

Source identifies the trace artifact.
See [TraceSourceSpec](#tracesourcespec).
**Validation:** Required: \&#123;\&#125;

---

**`replay`** `TraceReplaySpec`

Replay configures how the decoded trace is replayed.
See [TraceReplaySpec](#tracereplayspec).
**Validation:** Optional: \&#123;\&#125;

---

#### v1beta2 WorkloadSpec

WorkloadSpec defines the traffic model used for every candidate evaluation. static and
trace are mutually exclusive.

**Kind:** `type`
**Appears in:** [DynamoGraphDeploymentRequestNativeSpec](#v1beta2-dynamographdeploymentrequestnativespec), [DynamoGraphDeploymentRequestSpec](#v1beta2-dynamographdeploymentrequestspec), [DynamoGraphDeploymentRunSpec](#dynamographdeploymentrunspec), [NativeSearchInput](#nativesearchinput)

**`static`** `StaticWorkloadSpec`

Static defines AISimulate synthetic traffic. When omitted without a trace, admission supplies the complete static default. An explicit empty object opts out; any nonempty object is completed with omitted inputTokens, outputTokens and load defaults.
See [StaticWorkloadSpec](#staticworkloadspec).
**Validation:** Optional: \&#123;\&#125;

---

**`trace`** `TraceWorkloadSpec`

Trace replays a recorded request trace from a PersistentVolumeClaim in the Request namespace. Admission supplies no static default when it is set. The Run Job mounts only the trace file, read-only through a subPath of the claim, at /var/run/aisimulate/trace/trace.jsonl, or trace.jsonl.gz when subPath ends in .gz. The trace lowers to the default traffic.source and traffic.load, which spec.aisim.inputOverrides can replace or delete.
See [TraceWorkloadSpec](#traceworkloadspec).
**Validation:** Optional: \&#123;\&#125;

---

## operator.config.dynamo.nvidia.com/v1alpha1

**Resource Types**

#### [OperatorConfiguration](#operatorconfiguration)

#### CertProvisionMode

CertProvisionMode controls how webhook TLS certificates are managed.

**Kind:** `enum`
**Underlying type:** `string`
**Appears in:** [WebhookServer](#webhookserver)

**Allowed values**

* auto

  CertProvisionModeAuto uses the built-in cert-controller to generate and rotate certificates.
* manual

  CertProvisionModeManual expects certificates to be provided externally (e.g., cert-manager, admin).

#### CheckpointConfiguration

CheckpointConfiguration holds checkpoint/restore settings.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`enabled`** `boolean`

Enabled indicates if checkpoint functionality is enabled

---

**`seccomp`** `CheckpointSeccompConfiguration`

Seccomp controls the localhost seccomp profile applied to checkpoint and restore pods. A nil value means "use the default profile"; set Seccomp.Disabled=true to disable seccomp injection entirely.
See [CheckpointSeccompConfiguration](#checkpointseccompconfiguration).

---

#### CheckpointSeccompConfiguration

CheckpointSeccompConfiguration controls the localhost seccomp profile applied
to checkpoint and restore pods. The profile blocks io_uring syscalls (which
CRIU cannot dump). Default behavior (zero-value substruct, or absent
substruct) applies DefaultSeccompProfile. Set Disabled=true on OpenShift
(custom localhost profiles require privileged SCC) or when using a CRIU
build with io_uring support. Set Profile to override the default path.

**Kind:** `type`
**Appears in:** [CheckpointConfiguration](#checkpointconfiguration)

**`disabled`** `boolean`

Disabled, when true, suppresses seccomp profile injection entirely. Use this for clusters where custom localhost profiles are not allowed (e.g. OpenShift's restricted-v2 SCC) or for CRIU builds that handle io_uring natively.

---

**`profile`** `string`

Profile is the localhost seccomp profile path. Empty falls back to DefaultSeccompProfile. Ignored when Disabled is true.

---

#### DRAConfiguration

DRAConfiguration holds Dynamic Resource Allocation (resource.k8s.io/v1) settings.

NOTE: auto-detection here only verifies that the resource.k8s.io/v1 API is
registered on the apiserver (Kubernetes 1.34+). It does NOT verify that a
GPU-specific DRA resource driver (e.g. nvidia/k8s-dra-driver-gpu) is
installed, that its DeviceClass exists, or that node-level GPU drivers are
compatible. An admin can use `enabled: false` to force-off DRA integration
on clusters where the API is present but the GPU driver stack is not wired
up — this makes the operator fail GMS / inter-pod failover admissions early
with a clear error instead of letting pods Pend with a confusing
"resourceclaim not found" at schedule time.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`enabled`** `boolean`

Enabled overrides auto-detection of the resource.k8s.io/v1 API. nil = auto-detect. Setting true requires detection to also succeed (the operator will exit at startup otherwise).

---

#### DiscoveryBackend

DiscoveryBackend is the type for the discovery backend.

**Kind:** `enum`
**Underlying type:** `string`
**Appears in:** [DiscoveryConfiguration](#discoveryconfiguration)

**Allowed values**

* kubernetes

  DiscoveryBackendKubernetes is the Kubernetes discovery backend
* etcd

  DiscoveryBackendEtcd is the etcd discovery backend

#### DiscoveryConfiguration

DiscoveryConfiguration holds discovery backend settings.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`backend`** `DiscoveryBackend` — default: kubernetes

Backend is the discovery backend: "kubernetes" or "etcd"
See [DiscoveryBackend](#discoverybackend).

---

#### GPUConfiguration

GPUConfiguration holds GPU discovery settings.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`discoveryEnabled`** `boolean` — default: true

DiscoveryEnabled indicates whether GPU discovery is enabled

---

#### GroveConfiguration

GroveConfiguration holds Grove orchestrator settings.

**Kind:** `type`
**Appears in:** [OrchestratorConfiguration](#orchestratorconfiguration)

**`enabled`** `boolean`

Enabled overrides auto-detection. nil = auto-detect.

---

**`terminationDelay`** `Duration` — default: 15m

TerminationDelay configures the termination delay for Grove PodCliqueSets
See [Duration](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#duration-v1-meta).

---

#### InfrastructureConfiguration

InfrastructureConfiguration holds service mesh and backend addresses.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`natsAddress`** `string`

NATSAddress is the address of the NATS server

---

**`etcdAddress`** `string`

ETCDAddress is the address of the etcd server

---

**`modelExpressURL`** `string`

ModelExpressURL is the URL of the Model Express server to inject into all pods

---

**`prometheusEndpoint`** `string`

PrometheusEndpoint is the URL of the Prometheus endpoint to use for metrics

---

**`natsTLSCAPath`** `string`

NATSTLSCAPath is the CA certificate path for verifying the NATS server

---

**`natsTLSClientCertPath`** `string`

NATSTLSClientCertPath is the client certificate path for NATS mTLS

---

**`natsTLSClientKeyPath`** `string`

NATSTLSClientKeyPath is the client private key path for NATS mTLS

---

**`tcpTLSCertPath`** `string`

TCPTLSCertPath is the server certificate path for TCP TLS

---

**`tcpTLSKeyPath`** `string`

TCPTLSKeyPath is the server private key path for TCP TLS

---

**`tcpTLSCAPath`** `string`

TCPTLSCAPath is the CA certificate path for verifying TCP peers

---

**`tcpTLSClientCertPath`** `string`

TCPTLSClientCertPath is the client certificate path for TCP mTLS

---

**`tcpTLSClientKeyPath`** `string`

TCPTLSClientKeyPath is the client private key path for TCP mTLS

---

**`tcpTLSClientCAPath`** `string`

TCPTLSClientCAPath is the CA certificate path for verifying TCP client certificates (mTLS)

---

**`tcpTLSServerName`** `string`

TCPTLSServerName overrides the TLS SNI hostname used by TCP clients when verifying the server certificate. Useful when dialing by IP (pod address) to a server whose certificate has a DNS SAN.

---

#### IngressConfiguration

IngressConfiguration holds ingress settings.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`virtualServiceGateway`** `string`

VirtualServiceGateway is the name of the Istio virtual service gateway

---

**`controllerClassName`** `string`

ControllerClassName is the ingress controller class name

---

**`controllerTLSSecretName`** `string`

ControllerTLSSecretName is the TLS secret for the ingress controller

---

**`hostSuffix`** `string`

HostSuffix is the suffix for ingress hostnames

---

#### IstioMeshConfiguration

IstioMeshConfiguration holds Istio-specific mesh settings.

**Kind:** `type`
**Appears in:** [ServiceMeshConfiguration](#servicemeshconfiguration)

**`tlsMode`** `string`

TLSMode is the Istio TLS mode for DestinationRules. Supported values: "DISABLE", "SIMPLE", "ISTIO_MUTUAL", "MUTUAL". Defaults to "SIMPLE".

---

**`insecureSkipVerify`** `boolean`

InsecureSkipVerify skips TLS certificate verification in DestinationRules. Defaults to true (matching upstream GAIE behavior with self-signed certs).

---

**`clientCertificate`** `string`

ClientCertificate is the path (in the istio-proxy sidecar's filesystem) to the file holding the client-side TLS certificate used for mTLS. REQUIRED when TLSMode is "MUTUAL"; ignored for other modes.

---

**`privateKey`** `string`

PrivateKey is the path (in the istio-proxy sidecar's filesystem) to the file holding the client-side TLS private key used for mTLS. REQUIRED when TLSMode is "MUTUAL"; ignored for other modes.

---

**`caCertificates`** `string`

CaCertificates is the optional path (in the istio-proxy sidecar's filesystem) to the file holding CA certificates used to verify the server certificate. Used only when TLSMode is "MUTUAL"; for other modes the field is ignored.

---

#### KaiSchedulerConfiguration

KaiSchedulerConfiguration holds Kai-scheduler settings.

**Kind:** `type`
**Appears in:** [OrchestratorConfiguration](#orchestratorconfiguration)

**`enabled`** `boolean`

Enabled overrides auto-detection. nil = auto-detect.

---

#### LPXConfiguration

LPXConfiguration holds LPX scheduler integration and model-registry settings.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`enabled`** `boolean` — default: false

Enabled opts the operator into LPX request production. When true, startup requires the scheduling.lpu.nvidia.com/v1alpha1 LpuPipelineRequest API to be installed separately.

---

**`modelRegistryURL`** `string`

ModelRegistryURL configures the location of the LPU model registry used by LPX. Supported values are an absolute local path (or file:// URL) and gs\:// URLs.

---

#### LWSConfiguration

LWSConfiguration holds LWS orchestrator settings.

**Kind:** `type`
**Appears in:** [OrchestratorConfiguration](#orchestratorconfiguration)

**`enabled`** `boolean`

Enabled overrides auto-detection. nil = auto-detect.

---

#### LeaderElectionConfiguration

LeaderElectionConfiguration holds leader election settings.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`enabled`** `boolean` — default: false

Enabled enables leader election for controller manager

---

**`id`** `string`

ID is the leader election resource identity

---

**`namespace`** `string`

Namespace is the namespace for the leader election resource

---

#### LoggingConfiguration

LoggingConfiguration holds logging settings.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`level`** `string` — default: info

Level is the log level (e.g., "info", "debug")

---

**`format`** `string` — default: json

Format is the log format (e.g., "json", "text")

---

#### MPIConfiguration

MPIConfiguration holds MPI SSH secret settings.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`sshSecretName`** `string`

SSHSecretName is the name of the secret containing the SSH key for MPI

---

**`sshSecretNamespace`** `string`

SSHSecretNamespace is the namespace where the MPI SSH secret is located

---

#### MetricsServer

MetricsServer extends Server with secure serving option.

**Kind:** `type`
**Appears in:** [ServerConfiguration](#serverconfiguration)

**`bindAddress`** `string`

BindAddress is the address the server binds to

---

**`port`** `integer`

Port is the port the server listens on

---

**`secure`** `boolean`

Secure enables secure serving for the metrics endpoint. nil = default to true (secure by default).

---

#### NamespaceConfiguration

NamespaceConfiguration determines operator namespace mode.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`restricted`** `string`

Restricted enables namespace-restricted mode for development and testing. Namespace-restricted mode is not supported for production.

---

**`scope`** `NamespaceScopeConfiguration`

Scope configures the namespace ownership claim in namespace-restricted mode.
See [NamespaceScopeConfiguration](#namespacescopeconfiguration).

---

#### NamespaceScopeConfiguration

NamespaceScopeConfiguration configures the development/test namespace ownership claim.

**Kind:** `type`
**Appears in:** [NamespaceConfiguration](#namespaceconfiguration)

**`leaseDuration`** `Duration` — default: 30s

LeaseDuration is the duration of namespace scope marker lease before expiration
See [Duration](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#duration-v1-meta).

---

**`leaseRenewInterval`** `Duration` — default: 10s

LeaseRenewInterval is the interval for renewing namespace scope marker lease
See [Duration](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.28/#duration-v1-meta).

---

#### OperatorConfiguration

OperatorConfiguration is the Schema for the operator configuration.

**Kind:** `resource`

**`apiVersion`** `string`

`operator.config.dynamo.nvidia.com/v1alpha1`

---

**`kind`** `string`

`OperatorConfiguration`

---

**`server`** `ServerConfiguration`

Server configuration (metrics, health probes, webhooks)
See [ServerConfiguration](#serverconfiguration).

---

**`leaderElection`** `LeaderElectionConfiguration`

Leader election configuration
See [LeaderElectionConfiguration](#leaderelectionconfiguration).

---

**`namespace`** `NamespaceConfiguration`

Namespace configuration (restricted vs cluster-wide)
See [NamespaceConfiguration](#namespaceconfiguration).

---

**`orchestrators`** `OrchestratorConfiguration`

Orchestrator configuration with optional overrides
See [OrchestratorConfiguration](#orchestratorconfiguration).

---

**`dra`** `DRAConfiguration`

DRA (Dynamic Resource Allocation) settings with optional override
See [DRAConfiguration](#draconfiguration).

---

**`infrastructure`** `InfrastructureConfiguration`

Service mesh and infrastructure addresses
See [InfrastructureConfiguration](#infrastructureconfiguration).

---

**`ingress`** `IngressConfiguration`

Ingress configuration
See [IngressConfiguration](#ingressconfiguration).

---

**`serviceMesh`** `ServiceMeshConfiguration`

ServiceMesh configures automatic generation of service-mesh resources (e.g., Istio DestinationRules) for EPP components.
See [ServiceMeshConfiguration](#servicemeshconfiguration).

---

**`rbac`** `RBACConfiguration`

RBAC configuration for cross-namespace resource management (cluster-wide mode)
See [RBACConfiguration](#rbacconfiguration).

---

**`mpi`** `MPIConfiguration`

MPI SSH secret configuration
See [MPIConfiguration](#mpiconfiguration).

---

**`checkpoint`** `CheckpointConfiguration`

Checkpoint/restore configuration
See [CheckpointConfiguration](#checkpointconfiguration).

---

**`discovery`** `DiscoveryConfiguration`

Discovery backend configuration
See [DiscoveryConfiguration](#discoveryconfiguration).

---

**`gpu`** `GPUConfiguration`

GPU discovery configuration
See [GPUConfiguration](#gpuconfiguration).

---

**`logging`** `LoggingConfiguration`

Logging configuration
See [LoggingConfiguration](#loggingconfiguration).

---

**`security`** `SecurityConfiguration`

HTTP/2 and TLS settings
See [SecurityConfiguration](#securityconfiguration).

---

**`lpx`** `LPXConfiguration`

LPX scheduler integration and model-registry configuration.
See [LPXConfiguration](#lpxconfiguration).

---

#### OrchestratorConfiguration

OrchestratorConfiguration holds orchestrator override settings.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`grove`** `GroveConfiguration`

Grove orchestrator configuration
See [GroveConfiguration](#groveconfiguration).

---

**`lws`** `LWSConfiguration`

LWS orchestrator configuration
See [LWSConfiguration](#lwsconfiguration).

---

**`kaiScheduler`** `KaiSchedulerConfiguration`

KaiScheduler configuration
See [KaiSchedulerConfiguration](#kaischedulerconfiguration).

---

**`volcanoScheduler`** `VolcanoSchedulerConfiguration`

VolcanoScheduler configuration
See [VolcanoSchedulerConfiguration](#volcanoschedulerconfiguration).

---

#### RBACConfiguration

RBACConfiguration holds RBAC settings for cluster-wide mode.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`plannerClusterRoleName`** `string`

PlannerClusterRoleName is the ClusterRole for planner

---

**`dgdrProfilingClusterRoleName`** `string`

DGDRProfilingClusterRoleName is the ClusterRole for DGDR profiling jobs

---

**`eppClusterRoleName`** `string`

EPPClusterRoleName is the ClusterRole for EPP

---

#### SecurityConfiguration

SecurityConfiguration holds HTTP/2 and TLS settings.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`enableHTTP2`** `boolean` — default: false

EnableHTTP2 enables HTTP/2 for metrics and webhook servers

---

#### Server

Server holds a bind address and port.

**Kind:** `type`
**Appears in:** [MetricsServer](#metricsserver), [ServerConfiguration](#serverconfiguration), [WebhookServer](#webhookserver)

**`bindAddress`** `string`

BindAddress is the address the server binds to

---

**`port`** `integer`

Port is the port the server listens on

---

#### ServerConfiguration

ServerConfiguration holds server bind addresses and ports.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`metrics`** `MetricsServer` — default: \\\{ bindAddress:0.0.0.0 port:8080 secure:true \\}

Metrics server configuration
See [MetricsServer](#metricsserver).

---

**`healthProbe`** `Server` — default: \\\{ bindAddress:0.0.0.0 port:8081 \\}

Health probe server configuration
See [Server](#server).

---

**`webhook`** `WebhookServer` — default: \\\{ certDir:/tmp/k8s-webhook-server/serving-certs host:0.0.0.0 port:9443 \\}

Webhook server configuration
See [WebhookServer](#webhookserver).

---

#### ServiceMeshConfiguration

ServiceMeshConfiguration holds service mesh integration settings.
The operator uses this to generate mesh-specific resources (e.g., Istio
DestinationRules) for EPP components so that sidecar proxies connect
correctly without double-TLS issues.

**Kind:** `type`
**Appears in:** [OperatorConfiguration](#operatorconfiguration)

**`enabled`** `boolean`

Enabled overrides service mesh auto-detection. nil = auto-detect.

---

**`provider`** `string`

Provider selects the service mesh implementation. Supported: "istio", "". Empty string disables service mesh resource generation.

---

**`istio`** `IstioMeshConfiguration`

Istio holds Istio-specific settings. Only used when Provider is "istio".
See [IstioMeshConfiguration](#istiomeshconfiguration).

---

#### VolcanoSchedulerConfiguration

VolcanoSchedulerConfiguration holds Volcano scheduler settings.

**Kind:** `type`
**Appears in:** [OrchestratorConfiguration](#orchestratorconfiguration)

**`enabled`** `boolean`

EXPERIMENTAL: Enabled controls Volcano scheduler integration for Grove PodCliqueSets.

---

#### WebhookServer

WebhookServer extends Server with host and certificate directory.

**Kind:** `type`
**Appears in:** [ServerConfiguration](#serverconfiguration)

**`bindAddress`** `string`

BindAddress is the address the server binds to

---

**`port`** `integer`

Port is the port the server listens on

---

**`host`** `string`

Host is the address the webhook server binds to

---

**`certDir`** `string`

CertDir is the directory containing TLS certificates

---

**`certProvisionMode`** `CertProvisionMode` — default: auto

CertProvisionMode controls certificate management: "auto" (built-in cert-controller) or "manual" (external)
See [CertProvisionMode](#certprovisionmode).

---

**`secretName`** `string` — default: webhook-server-cert

SecretName is the name of the Kubernetes Secret holding webhook TLS certificates

---

**`serviceName`** `string`

ServiceName is the name of the Kubernetes Service fronting the webhook server. Used to generate certificate SANs. Set by the Helm chart.

---

## Operator Default Values Injection

The Dynamo operator automatically applies default values to various fields when they are not explicitly specified in your deployments. These defaults include:

* **Health Probes**: Startup, liveness, and readiness probes are configured differently for frontend, worker, and planner components. For example, worker components receive a startup probe with a 2-hour timeout (720 failures × 10 seconds) to accommodate long model loading times.

* **Security Context**: All components receive `fsGroup: 1000` by default to ensure proper file permissions for mounted volumes. This can be overridden via the `extraPodSpec.securityContext` field.

* **Shared Memory**: All components receive an 8Gi shared memory volume mounted at `/dev/shm` by default (can be disabled or resized via the `sharedMemory` field).

* **Environment Variables**: Components automatically receive environment variables like `DYN_NAMESPACE`, `DYN_PARENT_DGD_K8S_NAME`, `DYNAMO_PORT`, and backend-specific variables.

* **Pod Configuration**: Default `terminationGracePeriodSeconds` of 60 seconds and `restartPolicy: Always`.

* **Autoscaling**: When enabled without explicit metrics, defaults to CPU-based autoscaling with 80% target utilization.

* **Backend-Specific Behavior**: For multinode deployments, probes are automatically modified or removed for worker nodes depending on the backend framework (VLLM, SGLang, or TensorRT-LLM).

### Pod Specification Defaults

All components receive the following pod-level defaults unless overridden:

* **`terminationGracePeriodSeconds`**: `60` seconds
* **`restartPolicy`**: `Always`

### Security Context

The operator automatically applies default security context settings to all components to ensure proper file permissions, particularly for mounted volumes:

* **`fsGroup`**: `1000` - Sets the group ownership of mounted volumes and any files created in those volumes

This default ensures that non-root containers can write to mounted volumes (like model caches or persistent storage) without permission issues. The `fsGroup` setting is particularly important for:

* Model downloads and caching
* Compilation cache directories
* Persistent volume claims (PVCs)
* SSH key generation in multinode deployments

#### Overriding Security Context

To override the default security context, specify your own `securityContext` in the `extraPodSpec` of your component:

```yaml
services:
  YourWorker:
    extraPodSpec:
      securityContext:
        fsGroup: 2000  # Custom group ID
        runAsUser: 1000
        runAsGroup: 1000
        runAsNonRoot: true
```

**Important**: When you provide *any* `securityContext` object in `extraPodSpec`, the operator will not inject any defaults. This gives you complete control over the security context, including the ability to run as root (by omitting `runAsNonRoot` or setting it to `false`).

#### OpenShift and Security Context Constraints

In OpenShift environments with Security Context Constraints (SCCs), you may need to omit explicit UID/GID values to allow OpenShift's admission controllers to assign them dynamically:

```yaml
services:
  YourWorker:
    extraPodSpec:
      securityContext:
        # Omit fsGroup to let OpenShift assign it based on SCC
        # OpenShift will inject the appropriate UID range
```

Alternatively, if you want to keep the default `fsGroup: 1000` behavior and are certain your cluster allows it, you don't need to specify anything - the operator defaults will work.

### Shared Memory Configuration

Shared memory is enabled by default for all components:

* **Enabled**: `true` (unless explicitly disabled via `sharedMemory.disabled`)
* **Size**: `8Gi`
* **Mount Path**: `/dev/shm`
* **Volume Type**: `emptyDir` with `memory` medium

To disable shared memory or customize the size, use the `sharedMemory` field in your component specification.

### Health Probes by Component Type

The operator applies different default health probes based on the component type.

#### Frontend Components

Frontend components receive the following HTTP GET probes on port `http` (8000):

| Probe                             | Path      | Initial delay | Period     | Timeout   | Failure threshold |
| --------------------------------- | --------- | ------------- | ---------- | --------- | ----------------- |
| Liveness                          | `/live`   | 15 seconds    | 10 seconds | 1 second  | 3                 |
| Readiness                         | `/health` | 10 seconds    | 10 seconds | 3 seconds | 3                 |
| Startup (runtime 1.6.0 and later) | `/live`   | 0 seconds     | 10 seconds | 1 second  | 30                |

The startup probe allows five minutes for the sequential NATS and etcd connection waits and initialization. It also applies to colocated frontends. Older runtimes and images whose runtime version cannot be resolved do not receive a default startup probe. User-specified probes replace these defaults. If you raise `NATS_STARTUP_CONNECT_TIMEOUT_SECONDS` or `ETCD_STARTUP_CONNECT_TIMEOUT_SECONDS`, raise the startup probe allowance to cover the combined connection windows and initialization.

#### Worker Components

Worker components receive the following probe configurations:

**Liveness Probe:**

* **Type**: HTTP GET
* **Path**: `/live`
* **Port**: `system` (9090)
* **Period**: 5 seconds
* **Timeout**: 30 seconds
* **Failure Threshold**: 1

**Readiness Probe:**

* **Type**: HTTP GET
* **Path**: `/health`
* **Port**: `system` (9090)
* **Period**: 10 seconds
* **Timeout**: 30 seconds
* **Failure Threshold**: 60

**Startup Probe:**

* **Type**: HTTP GET
* **Path**: `/live`
* **Port**: `system` (9090)
* **Period**: 10 seconds
* **Timeout**: 5 seconds
* **Failure Threshold**: 720 (allows up to 2 hours for startup: 10s × 720 = 7200s)

> **Note**
>
> For larger models (typically >70B parameters) or slower storage systems, you may need to increase the `failureThreshold` to allow more time for model loading. Calculate the required threshold based on your expected startup time: `failureThreshold = (expected_startup_seconds / period)`. Override the startup probe in your component specification if the default 2-hour window is insufficient.

#### Multinode Deployment Probe Modifications

For multinode deployments, the operator modifies probes based on the backend framework and node role:

##### VLLM Backend

The operator automatically applies distributed execution configuration based on parallelism settings:

**Tensor/Pipeline Parallel Mode (Recommended)** (when `world_size > GPUs_per_node`):

* Uses PyTorch multiprocessing (mp) backend for distributed execution (`--distributed-executor-backend mp`)
* Supports multi-node deployments with PyTorch's native distributed initialization
* **All nodes**: Run vLLM with proper `--nnodes`, `--node-rank`, `--master-addr` flags injected
* **Probes**: Worker probes adjusted; leader probes remain active

**Ray Backend**:

* Used for use cases such as Elastic EP
* Install with `pip install "ray>=2.55.0"` and configure `--distributed-executor-backend ray`

**Data Parallel Mode** (when `world_size × data_parallel_size > GPUs_per_node`):

* **Worker nodes**: All probes (liveness, readiness, startup) are removed
* **Leader nodes**: All probes remain active

##### SGLang Backend

* **Worker nodes**: All probes (liveness, readiness, startup) are removed

##### TensorRT-LLM Backend

* **Leader nodes**: All probes remain unchanged
* **Worker nodes**:
  * Liveness and startup probes are removed
  * Readiness probe is replaced with a TCP socket check on SSH port (2222):
    * **Initial Delay**: 20 seconds
    * **Period**: 20 seconds
    * **Timeout**: 5 seconds
    * **Failure Threshold**: 10

### Environment Variables

The operator automatically injects environment variables into component containers based on component type, backend framework, and operator configuration. User-provided `envs` values always take precedence over operator defaults.

#### All Components

These environment variables are injected into every component container regardless of type.

| Variable                       | Purpose                                                           | Default                                                             | Type     | Source                                              |
| ------------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------- | -------- | --------------------------------------------------- |
| `DYN_NAMESPACE`                | Dynamo service namespace used for service discovery and routing   | Derived from DGD spec                                               | `string` | Downward API annotation on checkpoint-restored pods |
| `DYN_COMPONENT`                | Identifies the component type for runtime behavior                | One of: `frontend`, `worker`, `prefill`, `decode`, `planner`, `epp` | `string` | Set from component spec                             |
| `DYN_PARENT_DGD_K8S_NAME`      | Kubernetes name of the parent DynamoGraphDeployment resource      | —                                                                   | `string` | Set from DGD metadata                               |
| `DYN_PARENT_DGD_K8S_NAMESPACE` | Kubernetes namespace of the parent DynamoGraphDeployment resource | —                                                                   | `string` | Set from DGD metadata                               |
| `POD_NAME`                     | Current pod name                                                  | —                                                                   | `string` | Downward API (`metadata.name`)                      |
| `POD_NAMESPACE`                | Current pod namespace                                             | —                                                                   | `string` | Downward API (`metadata.namespace`)                 |
| `POD_UID`                      | Current pod UID                                                   | —                                                                   | `string` | Downward API (`metadata.uid`)                       |
| `DYN_DISCOVERY_BACKEND`        | Service discovery backend for inter-component communication       | `kubernetes`                                                        | `string` | Options: `kubernetes`, `etcd`                       |

#### Infrastructure (Conditional)

These are injected into all components when the corresponding infrastructure service is configured in the operator's `OperatorConfiguration`.

| Variable              | Purpose                                        | Default | Type     | Condition                                                  |
| --------------------- | ---------------------------------------------- | ------- | -------- | ---------------------------------------------------------- |
| `NATS_SERVER`         | NATS messaging server address                  | —       | `string` | Set when `infrastructure.natsAddress` is configured        |
| `ETCD_ENDPOINTS`      | etcd endpoint addresses for distributed state  | —       | `string` | Set when `infrastructure.etcdAddress` is configured        |
| `MODEL_EXPRESS_URL`   | Model Express service URL for model management | —       | `string` | Set when `infrastructure.modelExpressURL` is configured    |
| `PROMETHEUS_ENDPOINT` | Prometheus endpoint for metrics collection     | —       | `string` | Set when `infrastructure.prometheusEndpoint` is configured |

#### Frontend Components

| Variable                      | Purpose                                                                                                                                        | Default                                        | Type               |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | ------------------ |
| `DYNAMO_PORT`                 | HTTP port the frontend listens on                                                                                                              | `8000`                                         | `int`              |
| `DYN_HTTP_PORT`               | HTTP port for the frontend service (alias)                                                                                                     | `8000`                                         | `int`              |
| `DYN_NAMESPACE_PREFIX`        | Namespace prefix used for frontend request routing                                                                                             | Same as `DYN_NAMESPACE`                        | `string`           |
| `DYN_NAMESPACE_PREFIX_STRICT` | Limits prefix discovery to the base namespace, eight-character lowercase hexadecimal worker generations, and the `legacy` migration generation | `true` for supported runtimes; otherwise unset | `string` (boolean) |

DGDs named `foo` and `foo-bar` in the same Kubernetes namespace can cross-discover workers: the frontend in `foo` can route requests to workers in `foo-bar`. Strict matching excludes the other deployment for ordinary overlapping names. This issue affects deployments sharing a name prefix in the same Kubernetes namespace.

Runtime image 1.6.0 introduces `DYN_NAMESPACE_PREFIX_STRICT`. Upgrade both the operator and affected frontend and native Rust EPP images to 1.6.0 or later; the operator enables strict matching for supported images. An operator-only upgrade leaves older runtime images affected. With a compatible older operator, set `DYN_NAMESPACE_PREFIX_STRICT=true` explicitly on those containers after upgrading their images. For custom images, set `runtimeVersionOverride` to the image's Dynamo runtime version when the tag does not identify it.

For frontend sidecars, support is determined from the sidecar's own image tag. The component's `runtimeVersionOverride` applies only to its runtime container. If a sidecar image tag does not identify the runtime version, set `DYN_NAMESPACE_PREFIX_STRICT=true` in that sidecar's environment when its image contains this fix.

Manual namespace prefixes retain literal matching unless strict mode is enabled. Exact frontend `DYN_NAMESPACE` selection and global frontend discovery are unchanged. EPP uses exact `DYN_NAMESPACE` selection when no prefix is provided, except that `dynamo` selects global discovery.

This filter follows the operator's namespace naming contract. A separate deployment whose name ends in an accepted worker-generation suffix can still produce an indistinguishable namespace, so do not use this filter as an authorization boundary.

#### Worker Components

| Variable                                | Purpose                                                                                                                                                                                                                                                                                   | Default        | Type                  |                                            |
| --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | --------------------- | ------------------------------------------ |
| `DYN_SYSTEM_ENABLED`                    | Enables the system HTTP server for health checks and metrics                                                                                                                                                                                                                              | `true`         | `string` (boolean)    |                                            |
| `DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS` | Endpoints whose health status is used for readiness                                                                                                                                                                                                                                       | `["generate"]` | `string` (JSON array) |                                            |
| `DYN_SYSTEM_PORT`                       | Port for the system HTTP server (health, metrics)                                                                                                                                                                                                                                         | `9090`         | `int`                 |                                            |
| `DYN_HEALTH_CHECK_ENABLED`              | Disables the legacy health check mechanism in favor of the system server                                                                                                                                                                                                                  | `false`        | `string` (boolean)    |                                            |
| `NIXL_TELEMETRY_ENABLE`                 | Enables or disables NIXL telemetry collection. Case-insensitive options: `y`, `1`, `yes`, `on`, `true`, `enable`, `n`, `0`, `no`, `off`, `false`, `disable`. Unrecognized values fail SGLang admission or worker validation. Use `y` to opt in to SGLang operator rank port declarations. | `n`            | `string`              |                                            |
| `NIXL_TELEMETRY_EXPORTER`               | Telemetry exporter format for NIXL metrics                                                                                                                                                                                                                                                | `prometheus`   | `string`              |                                            |
| `NIXL_TELEMETRY_PROMETHEUS_PORT`        | Port for NIXL Prometheus metrics endpoint                                                                                                                                                                                                                                                 | `19090`        | `int`                 |                                            |
| `DYN_NAMESPACE_WORKER_SUFFIX`           | Hash suffix appended to worker namespace for rolling updates                                                                                                                                                                                                                              | —              | `string`              | Only set during rolling update transitions |

#### Planner Components

| Variable                  | Purpose                                            | Default | Type  |
| ------------------------- | -------------------------------------------------- | ------- | ----- |
| `PLANNER_PROMETHEUS_PORT` | Port for the planner's Prometheus metrics endpoint | `9085`  | `int` |

#### EPP (Endpoint Picker Plugin) Components

| Variable                      | Purpose                                                                                                           | Default                                        | Type               |
| ----------------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | ------------------ |
| `USE_STREAMING`               | Enables streaming mode for inference request proxying                                                             | `true`                                         | `string` (boolean) |
| `RUST_LOG`                    | Rust log level and filter configuration                                                                           | `info`                                         | `string`           |
| `DYN_NAMESPACE_PREFIX`        | Namespace prefix used for EPP request routing                                                                     | Same as `DYN_NAMESPACE`                        | `string`           |
| `DYN_NAMESPACE_PREFIX_STRICT` | Limits prefix discovery to operator worker-generation namespaces; does not modify exact `DYN_NAMESPACE` selection | `true` for supported runtimes; otherwise unset | `string` (boolean) |

#### VLLM Backend

| Variable                      | Purpose                                                   | Default | Type     | Condition                                                 |
| ----------------------------- | --------------------------------------------------------- | ------- | -------- | --------------------------------------------------------- |
| `VLLM_CACHE_ROOT`             | Directory for vLLM compilation cache artifacts            | —       | `string` | Set when a volume mount has `useAsCompilationCache: true` |
| `VLLM_NIXL_SIDE_CHANNEL_HOST` | Host IP for the NIXL side channel in multiprocessing mode | Pod IP  | `string` | Multinode mp backend only (Downward API: `status.podIP`)  |

#### TensorRT-LLM Backend

| Variable                            | Purpose                                                                   | Default | Type     | Condition                  |
| ----------------------------------- | ------------------------------------------------------------------------- | ------- | -------- | -------------------------- |
| `OMPI_MCA_orte_keep_fqdn_hostnames` | Instructs OpenMPI to preserve FQDN hostnames for inter-node communication | `1`     | `string` | Multinode deployments only |

### Service Accounts

The following component types automatically receive dedicated service accounts:

* **Planner**: `planner-serviceaccount`
* **EPP**: `epp-serviceaccount`

### Image Pull Secrets

The operator automatically discovers and injects image pull secrets for container images. When a component specifies a container image, the operator:

1. Scans all Kubernetes secrets of type `kubernetes.io/dockerconfigjson` in the component's namespace
2. Extracts the docker registry server URLs from each secret's authentication configuration
3. Matches the container image's registry host against the discovered registry URLs
4. Automatically injects matching secrets as `imagePullSecrets` in the pod specification

This eliminates the need to manually specify image pull secrets for each component. The operator maintains an internal index of docker secrets and their associated registries, refreshing this index periodically.

**To disable automatic image pull secret discovery** for a specific component, add the following annotation:

```yaml
annotations:
  nvidia.com/disable-image-pull-secret-discovery: "true"
```

### Autoscaling Defaults

When autoscaling is enabled but no metrics are specified, the operator applies:

* **Default Metric**: CPU utilization
* **Target Average Utilization**: `80%`

### Port Configurations

Default container ports are configured based on component type:

#### Frontend Components

* **Port**: 8000
* **Protocol**: TCP
* **Name**: `http`

#### Worker Components

* **Port**: 9090 (system)
* **Protocol**: TCP
* **Name**: `system`
* **Port**: 19090 (NIXL)
* **Protocol**: TCP
* **Name**: `nixl`

#### Planner Components

* **Port**: 9085
* **Protocol**: TCP
* **Name**: `metrics`

#### EPP Components

* **Port**: 9002 (gRPC)
* **Protocol**: TCP
* **Name**: `grpc`
* **Port**: 9003 (gRPC health)
* **Protocol**: TCP
* **Name**: `grpc-health`
* **Port**: 9090 (metrics)
* **Protocol**: TCP
* **Name**: `metrics`

### Backend-Specific Configurations

#### VLLM

* **Ray Head Port**: 6379 (for Ray-based multinode deployments)
* **MP Master Port**: 29500 (for PyTorch distributed multinode TP/PP deployments with mp backend)
* **Data Parallel RPC Port**: 13445 (for data parallel multinode deployments)

#### SGLang

* **Distribution Init Port**: 29500 (for multinode deployments)

#### TensorRT-LLM

* **SSH Port**: 2222 (for multinode MPI communication)
* **OpenMPI Environment**: `OMPI_MCA_orte_keep_fqdn_hostnames=1`

### Implementation Reference

For users who want to understand the implementation details or contribute to the operator, the default values described in this document are set in the following source files:

* **Health Probes, Security Context & Pod Specifications**: [`internal/dynamo/graph.go`](https://github.com/ai-dynamo/dynamo/blob/main/deploy/operator/internal/dynamo/graph.go) - Contains the main logic for applying default probes, security context, environment variables, shared memory, and pod configurations
* **Component-Specific Defaults**:
  * [`internal/dynamo/component_common.go`](https://github.com/ai-dynamo/dynamo/blob/main/deploy/operator/internal/dynamo/component_common.go) - Base container and pod spec shared by all component types
  * [`internal/dynamo/component_frontend.go`](https://github.com/ai-dynamo/dynamo/blob/main/deploy/operator/internal/dynamo/component_frontend.go)
  * [`internal/dynamo/component_worker.go`](https://github.com/ai-dynamo/dynamo/blob/main/deploy/operator/internal/dynamo/component_worker.go)
  * [`internal/dynamo/component_planner.go`](https://github.com/ai-dynamo/dynamo/blob/main/deploy/operator/internal/dynamo/component_planner.go)
  * [`internal/dynamo/component_epp.go`](https://github.com/ai-dynamo/dynamo/blob/main/deploy/operator/internal/dynamo/component_epp.go)
* **Image Pull Secrets**: [`internal/secrets/docker.go`](https://github.com/ai-dynamo/dynamo/blob/main/deploy/operator/internal/secrets/docker.go) - Implements the docker secret indexer and automatic discovery
* **Backend-Specific Behavior**:
  * [`internal/dynamo/backend_vllm.go`](https://github.com/ai-dynamo/dynamo/blob/main/deploy/operator/internal/dynamo/backend_vllm.go)
  * [`internal/dynamo/backend_sglang.go`](https://github.com/ai-dynamo/dynamo/blob/main/deploy/operator/internal/dynamo/backend_sglang.go)
  * [`internal/dynamo/backend_trtllm.go`](https://github.com/ai-dynamo/dynamo/blob/main/deploy/operator/internal/dynamo/backend_trtllm.go)
* **Checkpoint / Restore**:
  * [`internal/checkpoint/podspec.go`](https://github.com/ai-dynamo/dynamo/blob/main/deploy/operator/internal/checkpoint/podspec.go) - Checkpoint env var injection and volume setup
  * [`internal/checkpoint/resolve.go`](https://github.com/ai-dynamo/dynamo/blob/main/deploy/operator/internal/checkpoint/resolve.go) - Checkpoint resolution logic
* **Constants & Annotations**: [`internal/consts/consts.go`](https://github.com/ai-dynamo/dynamo/blob/main/deploy/operator/internal/consts/consts.go) - Defines annotation keys and other constants

### Notes

* All these defaults can be overridden by explicitly specifying values in your DynamoComponentDeployment or DynamoGraphDeployment resources
* User-specified probes (via `livenessProbe`, `readinessProbe`, or `startupProbe` fields) take precedence over operator defaults
* For security context, if you provide *any* `securityContext` in `extraPodSpec`, no defaults will be injected, giving you full control
* For multinode deployments, some defaults are modified or removed as described above to accommodate distributed execution patterns
* The `extraPodSpec.mainContainer` field can be used to override probe configurations set by the operator

Raw generated Markdown source: `docs/fern/pages/reference/kubernetes-api/additional-resources/api-reference-k8s.md`