{
  "description": "GPUCluster is the Schema for the gpuclusters API",
  "properties": {
    "apiVersion": {
      "description": "APIVersion defines the versioned schema of this representation of an object.\nServers should convert recognized schemas to the latest internal value, and\nmay reject unrecognized values.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
      "type": "string"
    },
    "kind": {
      "description": "Kind is a string value representing the REST resource this object represents.\nServers may infer this from the endpoint the client submits requests to.\nCannot be updated.\nIn CamelCase.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
      "type": "string"
    },
    "metadata": {
      "type": "object"
    },
    "spec": {
      "description": "GPUClusterSpec defines the desired state of GPUCluster, the DRA-based\nsoftware-enablement stack. Unlike ClusterPolicy, it does not manage the NVIDIA driver\nor the device-plugin; the driver is installed separately (host-installed or via an\nNVIDIADriver CR) and GPUCluster waits for driver readiness before proceeding.",
      "properties": {
        "daemonsets": {
          "description": "Daemonsets defines the common configuration applied to all DaemonSets deployed\nby the GPUCluster controller.",
          "properties": {
            "annotations": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "Optional: Annotations is an unstructured key value map stored with a resource that may be\nset by external tools to store and retrieve arbitrary metadata. They are not\nqueryable and should be preserved when modifying objects.",
              "type": "object"
            },
            "labels": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "Optional: Map of string keys and values that can be used to organize and categorize\n(scope and select) objects. May match selectors of replication controllers\nand services.",
              "type": "object"
            },
            "podSecurityContext": {
              "description": "Optional: Set pod-level security context for all DaemonSet pods (applies as defaults to all containers)",
              "properties": {
                "appArmorProfile": {
                  "description": "appArmorProfile is the AppArmor options to use by the containers in this pod.\nNote that this field cannot be set when spec.os.name is windows.",
                  "properties": {
                    "localhostProfile": {
                      "description": "localhostProfile indicates a profile loaded on the node that should be used.\nThe profile must be preconfigured on the node to work.\nMust match the loaded name of the profile.\nMust be set if and only if type is \"Localhost\".",
                      "type": "string"
                    },
                    "type": {
                      "description": "type indicates which kind of AppArmor profile will be applied.\nValid options are:\n  Localhost - a profile pre-loaded on the node.\n  RuntimeDefault - the container runtime's default profile.\n  Unconfined - no AppArmor enforcement.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type"
                  ],
                  "type": "object",
                  "additionalProperties": false
                },
                "fsGroup": {
                  "description": "A special supplemental group that applies to all containers in a pod.\nSome volume types allow the Kubelet to change the ownership of that volume\nto be owned by the pod:\n\n1. The owning GID will be the FSGroup\n2. The setgid bit is set (new files created in the volume will be owned by FSGroup)\n3. The permission bits are OR'd with rw-rw----\n\nIf unset, the Kubelet will not modify the ownership and permissions of any volume.\nNote that this field cannot be set when spec.os.name is windows.",
                  "format": "int64",
                  "type": "integer"
                },
                "fsGroupChangePolicy": {
                  "description": "fsGroupChangePolicy defines behavior of changing ownership and permission of the volume\nbefore being exposed inside Pod. This field will only apply to\nvolume types which support fsGroup based ownership(and permissions).\nIt will have no effect on ephemeral volume types such as: secret, configmaps\nand emptydir.\nValid values are \"OnRootMismatch\" and \"Always\". If not specified, \"Always\" is used.\nNote that this field cannot be set when spec.os.name is windows.",
                  "type": "string"
                },
                "runAsGroup": {
                  "description": "The GID to run the entrypoint of the container process.\nUses runtime default if unset.\nMay also be set in SecurityContext.  If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence\nfor that container.\nNote that this field cannot be set when spec.os.name is windows.",
                  "format": "int64",
                  "type": "integer"
                },
                "runAsNonRoot": {
                  "description": "Indicates that the container must run as a non-root user.\nIf true, the Kubelet will validate the image at runtime to ensure that it\ndoes not run as UID 0 (root) and fail to start the container if it does.\nIf unset or false, no such validation will be performed.\nMay also be set in SecurityContext.  If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence.",
                  "type": "boolean"
                },
                "runAsUser": {
                  "description": "The UID to run the entrypoint of the container process.\nDefaults to user specified in image metadata if unspecified.\nMay also be set in SecurityContext.  If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence\nfor that container.\nNote that this field cannot be set when spec.os.name is windows.",
                  "format": "int64",
                  "type": "integer"
                },
                "seLinuxChangePolicy": {
                  "description": "seLinuxChangePolicy defines how the container's SELinux label is applied to all volumes used by the Pod.\nIt has no effect on nodes that do not support SELinux or to volumes does not support SELinux.\nValid values are \"MountOption\" and \"Recursive\".\n\n\"Recursive\" means relabeling of all files on all Pod volumes by the container runtime.\nThis may be slow for large volumes, but allows mixing privileged and unprivileged Pods sharing the same volume on the same node.\n\n\"MountOption\" mounts all eligible Pod volumes with `-o context` mount option.\nThis requires all Pods that share the same volume to use the same SELinux label.\nIt is not possible to share the same volume among privileged and unprivileged Pods.\nEligible volumes are in-tree FibreChannel and iSCSI volumes, and all CSI volumes\nwhose CSI driver announces SELinux support by setting spec.seLinuxMount: true in their\nCSIDriver instance. Other volumes are always re-labelled recursively.\n\"MountOption\" value is allowed only when SELinuxMount feature gate is enabled.\n\nIf not specified and SELinuxMount feature gate is enabled, \"MountOption\" is used.\nIf not specified and SELinuxMount feature gate is disabled, \"MountOption\" is used for ReadWriteOncePod volumes\nand \"Recursive\" for all other volumes.\n\nThis field affects only Pods that have SELinux label set, either in PodSecurityContext or in SecurityContext of all containers.\n\nAll Pods that use the same volume should use the same seLinuxChangePolicy, otherwise some pods can get stuck in ContainerCreating state.\nNote that this field cannot be set when spec.os.name is windows.",
                  "type": "string"
                },
                "seLinuxOptions": {
                  "description": "The SELinux context to be applied to all containers.\nIf unspecified, the container runtime will allocate a random SELinux context for each\ncontainer.  May also be set in SecurityContext.  If set in\nboth SecurityContext and PodSecurityContext, the value specified in SecurityContext\ntakes precedence for that container.\nNote that this field cannot be set when spec.os.name is windows.",
                  "properties": {
                    "level": {
                      "description": "Level is SELinux level label that applies to the container.",
                      "type": "string"
                    },
                    "role": {
                      "description": "Role is a SELinux role label that applies to the container.",
                      "type": "string"
                    },
                    "type": {
                      "description": "Type is a SELinux type label that applies to the container.",
                      "type": "string"
                    },
                    "user": {
                      "description": "User is a SELinux user label that applies to the container.",
                      "type": "string"
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                },
                "seccompProfile": {
                  "description": "The seccomp options to use by the containers in this pod.\nNote that this field cannot be set when spec.os.name is windows.",
                  "properties": {
                    "localhostProfile": {
                      "description": "localhostProfile indicates a profile defined in a file on the node should be used.\nThe profile must be preconfigured on the node to work.\nMust be a descending path, relative to the kubelet's configured seccomp profile location.\nMust be set if type is \"Localhost\". Must NOT be set for any other type.",
                      "type": "string"
                    },
                    "type": {
                      "description": "type indicates which kind of seccomp profile will be applied.\nValid options are:\n\nLocalhost - a profile defined in a file on the node should be used.\nRuntimeDefault - the container runtime default profile should be used.\nUnconfined - no profile should be applied.",
                      "type": "string"
                    }
                  },
                  "required": [
                    "type"
                  ],
                  "type": "object",
                  "additionalProperties": false
                },
                "supplementalGroups": {
                  "description": "A list of groups applied to the first process run in each container, in\naddition to the container's primary GID and fsGroup (if specified).  If\nthe SupplementalGroupsPolicy feature is enabled, the\nsupplementalGroupsPolicy field determines whether these are in addition\nto or instead of any group memberships defined in the container image.\nIf unspecified, no additional groups are added, though group memberships\ndefined in the container image may still be used, depending on the\nsupplementalGroupsPolicy field.\nNote that this field cannot be set when spec.os.name is windows.",
                  "items": {
                    "format": "int64",
                    "type": "integer"
                  },
                  "type": "array",
                  "x-kubernetes-list-type": "atomic"
                },
                "supplementalGroupsPolicy": {
                  "description": "Defines how supplemental groups of the first container processes are calculated.\nValid values are \"Merge\" and \"Strict\". If not specified, \"Merge\" is used.\n(Alpha) Using the field requires the SupplementalGroupsPolicy feature gate to be enabled\nand the container runtime must implement support for this feature.\nNote that this field cannot be set when spec.os.name is windows.",
                  "type": "string"
                },
                "sysctls": {
                  "description": "Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported\nsysctls (by the container runtime) might fail to launch.\nNote that this field cannot be set when spec.os.name is windows.",
                  "items": {
                    "description": "Sysctl defines a kernel parameter to be set",
                    "properties": {
                      "name": {
                        "description": "Name of a property to set",
                        "type": "string"
                      },
                      "value": {
                        "description": "Value of a property to set",
                        "type": "string"
                      }
                    },
                    "required": [
                      "name",
                      "value"
                    ],
                    "type": "object",
                    "additionalProperties": false
                  },
                  "type": "array",
                  "x-kubernetes-list-type": "atomic"
                },
                "windowsOptions": {
                  "description": "The Windows specific settings applied to all containers.\nIf unspecified, the options within a container's SecurityContext will be used.\nIf set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.\nNote that this field cannot be set when spec.os.name is linux.",
                  "properties": {
                    "gmsaCredentialSpec": {
                      "description": "GMSACredentialSpec is where the GMSA admission webhook\n(https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the\nGMSA credential spec named by the GMSACredentialSpecName field.",
                      "type": "string"
                    },
                    "gmsaCredentialSpecName": {
                      "description": "GMSACredentialSpecName is the name of the GMSA credential spec to use.",
                      "type": "string"
                    },
                    "hostProcess": {
                      "description": "HostProcess determines if a container should be run as a 'Host Process' container.\nAll of a Pod's containers must have the same effective HostProcess value\n(it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\nIn addition, if HostProcess is true then HostNetwork must also be set to true.",
                      "type": "boolean"
                    },
                    "runAsUserName": {
                      "description": "The UserName in Windows to run the entrypoint of the container process.\nDefaults to the user specified in image metadata if unspecified.\nMay also be set in PodSecurityContext. If set in both SecurityContext and\nPodSecurityContext, the value specified in SecurityContext takes precedence.",
                      "type": "string"
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "priorityClassName": {
              "type": "string"
            },
            "rollingUpdate": {
              "description": "Optional: Configuration for rolling update of all DaemonSet pods",
              "properties": {
                "maxUnavailable": {
                  "type": "string"
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "tolerations": {
              "description": "Optional: Set tolerations",
              "items": {
                "description": "The pod this Toleration is attached to tolerates any taint that matches\nthe triple <key,value,effect> using the matching operator <operator>.",
                "properties": {
                  "effect": {
                    "description": "Effect indicates the taint effect to match. Empty means match all taint effects.\nWhen specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.",
                    "type": "string"
                  },
                  "key": {
                    "description": "Key is the taint key that the toleration applies to. Empty means match all taint keys.\nIf the key is empty, operator must be Exists; this combination means to match all values and all keys.",
                    "type": "string"
                  },
                  "operator": {
                    "description": "Operator represents a key's relationship to the value.\nValid operators are Exists, Equal, Lt, and Gt. Defaults to Equal.\nExists is equivalent to wildcard for value, so that a pod can\ntolerate all taints of a particular category.\nLt and Gt perform numeric comparisons (requires feature gate TaintTolerationComparisonOperators).",
                    "type": "string"
                  },
                  "tolerationSeconds": {
                    "description": "TolerationSeconds represents the period of time the toleration (which must be\nof effect NoExecute, otherwise this field is ignored) tolerates the taint. By default,\nit is not set, which means tolerate the taint forever (do not evict). Zero and\nnegative values will be treated as 0 (evict immediately) by the system.",
                    "format": "int64",
                    "type": "integer"
                  },
                  "value": {
                    "description": "Value is the taint value the toleration matches to.\nIf the operator is Exists, the value should be empty, otherwise just a regular string.",
                    "type": "string"
                  }
                },
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            },
            "updateStrategy": {
              "default": "RollingUpdate",
              "enum": [
                "RollingUpdate",
                "OnDelete"
              ],
              "type": "string"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "dcgm": {
          "description": "DCGM defines the spec for the standalone NVIDIA DCGM hostengine. Disabled by default;\nwhen disabled, dcgm-exporter uses its embedded nv-hostengine. NOTE: the reused enabled\nfield carries no server-side default and its IsEnabled() treats nil as enabled, so the\ncontroller must default nil enabled to disabled here.",
          "properties": {
            "args": {
              "description": "Optional: List of arguments",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "enabled": {
              "description": "Enabled indicates if deployment of NVIDIA DCGM Hostengine as a separate pod is enabled.",
              "type": "boolean"
            },
            "env": {
              "description": "Optional: List of environment variables",
              "items": {
                "description": "EnvVar represents an environment variable present in a Container.",
                "properties": {
                  "name": {
                    "description": "Name of the environment variable.",
                    "type": "string"
                  },
                  "value": {
                    "description": "Value of the environment variable.",
                    "type": "string"
                  }
                },
                "required": [
                  "name"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            },
            "hostNetwork": {
              "description": "HostNetwork indicates whether the DCGM pod uses the host's network namespace.",
              "type": "boolean"
            },
            "hostPort": {
              "description": "Deprecated: HostPort represents host port that needs to be bound for DCGM engine (Default: 5555)",
              "format": "int32",
              "type": "integer"
            },
            "image": {
              "description": "NVIDIA DCGM image name",
              "pattern": "[a-zA-Z0-9\\-]+",
              "type": "string"
            },
            "imagePullPolicy": {
              "description": "Image pull policy",
              "type": "string"
            },
            "imagePullSecrets": {
              "description": "Image pull secrets",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "repository": {
              "description": "NVIDIA DCGM image repository",
              "type": "string"
            },
            "resources": {
              "description": "Optional: Define resources requests and limits for each pod",
              "properties": {
                "limits": {
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "integer"
                      },
                      {
                        "type": "string"
                      }
                    ],
                    "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                    "x-kubernetes-int-or-string": true
                  },
                  "description": "Limits describes the maximum amount of compute resources allowed.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/",
                  "type": "object"
                },
                "requests": {
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "integer"
                      },
                      {
                        "type": "string"
                      }
                    ],
                    "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                    "x-kubernetes-int-or-string": true
                  },
                  "description": "Requests describes the minimum amount of compute resources required.\nIf Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\notherwise to an implementation-defined value. Requests cannot exceed Limits.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/",
                  "type": "object"
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "version": {
              "description": "NVIDIA DCGM image tag",
              "type": "string"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "dcgmExporter": {
          "description": "DCGMExporter defines the spec for NVIDIA DCGM Exporter. Enabled by default, but the\nreused enabled field carries no server-side default; the controller defaults nil enabled.",
          "properties": {
            "annotations": {
              "additionalProperties": {
                "type": "string"
              },
              "description": "Optional: Annotations is an unstructured key value map stored with a resource that may be\nset by external tools to store and retrieve arbitrary metadata. They are not\nqueryable and should be preserved when modifying objects.",
              "type": "object"
            },
            "args": {
              "description": "Optional: List of arguments",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "config": {
              "description": "Optional: Custom metrics configuration for NVIDIA DCGM Exporter",
              "properties": {
                "name": {
                  "description": "ConfigMap name with file dcgm-metrics.csv for metrics to be collected by NVIDIA DCGM Exporter",
                  "type": "string"
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "enablePodLabels": {
              "description": "Enable Kubernetes pod labels as Prometheus label dimensions in DCGM exporter metrics.\n(Requires cluster-level read access to pods.)",
              "type": "boolean"
            },
            "enablePodUID": {
              "description": "Enable Kubernetes pod UID as a Prometheus label dimension in DCGM exporter metrics.\n(Requires cluster-level read access to pods.)",
              "type": "boolean"
            },
            "enabled": {
              "description": "Enabled indicates if deployment of NVIDIA DCGM Exporter through operator is enabled",
              "type": "boolean"
            },
            "env": {
              "description": "Optional: List of environment variables",
              "items": {
                "description": "EnvVar represents an environment variable present in a Container.",
                "properties": {
                  "name": {
                    "description": "Name of the environment variable.",
                    "type": "string"
                  },
                  "value": {
                    "description": "Value of the environment variable.",
                    "type": "string"
                  }
                },
                "required": [
                  "name"
                ],
                "type": "object",
                "additionalProperties": false
              },
              "type": "array"
            },
            "hostNetwork": {
              "description": "HostNetwork allows the DCGM-Exporter daemon set to expose metrics port on the host's network namespace.",
              "type": "boolean"
            },
            "hostPID": {
              "description": "HostPID allows the DCGM-Exporter daemon set to access the host's PID namespace",
              "type": "boolean"
            },
            "hpcJobMapping": {
              "description": "Optional: HPC job mapping configuration for NVIDIA DCGM Exporter",
              "properties": {
                "directory": {
                  "description": "Directory path where HPC job mapping files are created by the workload manager\nDefaults to /var/lib/dcgm-exporter/job-mapping if not specified",
                  "type": "string"
                },
                "enabled": {
                  "description": "Enable HPC job mapping for DCGM Exporter",
                  "type": "boolean"
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "image": {
              "description": "NVIDIA DCGM Exporter image name",
              "pattern": "[a-zA-Z0-9\\-]+",
              "type": "string"
            },
            "imagePullPolicy": {
              "description": "Image pull policy",
              "type": "string"
            },
            "imagePullSecrets": {
              "description": "Image pull secrets",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "podLabelAllowlistRegex": {
              "description": "Regex list for filtering which Kubernetes pod labels are included in DCGM exporter metrics.\nEmpty means all pod labels are included.",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "repository": {
              "description": "NVIDIA DCGM Exporter image repository",
              "type": "string"
            },
            "resources": {
              "description": "Optional: Define resources requests and limits for each pod",
              "properties": {
                "limits": {
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "integer"
                      },
                      {
                        "type": "string"
                      }
                    ],
                    "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                    "x-kubernetes-int-or-string": true
                  },
                  "description": "Limits describes the maximum amount of compute resources allowed.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/",
                  "type": "object"
                },
                "requests": {
                  "additionalProperties": {
                    "anyOf": [
                      {
                        "type": "integer"
                      },
                      {
                        "type": "string"
                      }
                    ],
                    "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                    "x-kubernetes-int-or-string": true
                  },
                  "description": "Requests describes the minimum amount of compute resources required.\nIf Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\notherwise to an implementation-defined value. Requests cannot exceed Limits.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/",
                  "type": "object"
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "service": {
              "description": "Optional: Service configuration for NVIDIA DCGM Exporter",
              "properties": {
                "internalTrafficPolicy": {
                  "description": "InternalTrafficPolicy describes how nodes distribute service traffic they receive on the ClusterIP.",
                  "type": "string"
                },
                "type": {
                  "description": "Type represents the ServiceType which describes ingress methods for a service",
                  "type": "string"
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "serviceMonitor": {
              "description": "Optional: ServiceMonitor configuration for NVIDIA DCGM Exporter",
              "properties": {
                "additionalLabels": {
                  "additionalProperties": {
                    "type": "string"
                  },
                  "description": "AdditionalLabels to add to ServiceMonitor instance",
                  "type": "object"
                },
                "enabled": {
                  "description": "Enabled indicates if ServiceMonitor is deployed",
                  "type": "boolean"
                },
                "honorLabels": {
                  "description": "HonorLabels chooses the metric’s labels on collisions with target labels.",
                  "type": "boolean"
                },
                "interval": {
                  "description": "Interval at which metrics should be scraped. If not specified, Prometheus’ global scrape interval is used.\nSupported units: y, w, d, h, m, s, ms",
                  "pattern": "^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$",
                  "type": "string"
                },
                "relabelings": {
                  "description": "Relabelings allows to rewrite labels on metric sets",
                  "items": {
                    "description": "RelabelConfig allows dynamic rewriting of the label set for targets, alerts,\nscraped samples and remote write samples.\n\nMore info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config",
                    "properties": {
                      "action": {
                        "default": "replace",
                        "description": "action to perform based on the regex matching.\n\n`Uppercase` and `Lowercase` actions require Prometheus >= v2.36.0.\n`DropEqual` and `KeepEqual` actions require Prometheus >= v2.41.0.\n\nDefault: \"Replace\"",
                        "enum": [
                          "replace",
                          "Replace",
                          "keep",
                          "Keep",
                          "drop",
                          "Drop",
                          "hashmod",
                          "HashMod",
                          "labelmap",
                          "LabelMap",
                          "labeldrop",
                          "LabelDrop",
                          "labelkeep",
                          "LabelKeep",
                          "lowercase",
                          "Lowercase",
                          "uppercase",
                          "Uppercase",
                          "keepequal",
                          "KeepEqual",
                          "dropequal",
                          "DropEqual"
                        ],
                        "type": "string"
                      },
                      "modulus": {
                        "description": "modulus to take of the hash of the source label values.\n\nOnly applicable when the action is `HashMod`.",
                        "format": "int64",
                        "minimum": 0,
                        "type": "integer"
                      },
                      "regex": {
                        "description": "regex defines the regular expression against which the extracted value is matched.",
                        "type": "string"
                      },
                      "replacement": {
                        "description": "replacement value against which a Replace action is performed if the\nregular expression matches.\n\nRegex capture groups are available.",
                        "type": "string"
                      },
                      "separator": {
                        "description": "separator defines the string between concatenated SourceLabels.",
                        "type": "string"
                      },
                      "sourceLabels": {
                        "description": "sourceLabels defines the source labels select values from existing labels. Their content is\nconcatenated using the configured Separator and matched against the\nconfigured regular expression.",
                        "items": {
                          "description": "LabelName is a valid Prometheus label name.\nFor Prometheus 3.x, a label name is valid if it contains UTF-8 characters.\nFor Prometheus 2.x, a label name is only valid if it contains ASCII characters, letters, numbers, as well as underscores.",
                          "type": "string"
                        },
                        "type": "array"
                      },
                      "targetLabel": {
                        "description": "targetLabel defines the label to which the resulting string is written in a replacement.\n\nIt is mandatory for `Replace`, `HashMod`, `Lowercase`, `Uppercase`,\n`KeepEqual` and `DropEqual` actions.\n\nRegex capture groups are available.",
                        "type": "string"
                      }
                    },
                    "type": "object",
                    "additionalProperties": false
                  },
                  "type": "array"
                },
                "scrapeTimeout": {
                  "description": "ScrapeTimeout to use when scraping metrics. Must not be greater than Interval.\nIf not specified, Prometheus' global scrape timeout is used.\nSupported units: y, w, d, h, m, s, ms",
                  "pattern": "^(0|(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?)$",
                  "type": "string"
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "version": {
              "description": "NVIDIA DCGM Exporter image tag",
              "type": "string"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "draDriver": {
          "description": "DRADriver defines the spec for the NVIDIA DRA driver stack (gpus + computeDomains).",
          "properties": {
            "computeDomains": {
              "description": "ComputeDomains configures the compute-domain capability of the DRA driver.",
              "properties": {
                "controller": {
                  "description": "Controller configures the compute-domain controller Deployment.",
                  "properties": {
                    "env": {
                      "description": "Optional: List of environment variables",
                      "items": {
                        "description": "EnvVar represents an environment variable present in a Container.",
                        "properties": {
                          "name": {
                            "description": "Name of the environment variable.",
                            "type": "string"
                          },
                          "value": {
                            "description": "Value of the environment variable.",
                            "type": "string"
                          }
                        },
                        "required": [
                          "name"
                        ],
                        "type": "object",
                        "additionalProperties": false
                      },
                      "type": "array"
                    },
                    "resources": {
                      "description": "Optional: Define resources requests and limits for the controller container",
                      "properties": {
                        "limits": {
                          "additionalProperties": {
                            "anyOf": [
                              {
                                "type": "integer"
                              },
                              {
                                "type": "string"
                              }
                            ],
                            "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                            "x-kubernetes-int-or-string": true
                          },
                          "description": "Limits describes the maximum amount of compute resources allowed.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/",
                          "type": "object"
                        },
                        "requests": {
                          "additionalProperties": {
                            "anyOf": [
                              {
                                "type": "integer"
                              },
                              {
                                "type": "string"
                              }
                            ],
                            "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                            "x-kubernetes-int-or-string": true
                          },
                          "description": "Requests describes the minimum amount of compute resources required.\nIf Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\notherwise to an implementation-defined value. Requests cannot exceed Limits.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/",
                          "type": "object"
                        }
                      },
                      "type": "object",
                      "additionalProperties": false
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                },
                "enabled": {
                  "default": true,
                  "description": "Enabled indicates if the computeDomains capability of the DRA driver is enabled.",
                  "type": "boolean"
                },
                "kubeletPlugin": {
                  "description": "KubeletPlugin configures the kubelet-plugin workload for the computeDomains capability.",
                  "properties": {
                    "env": {
                      "description": "Optional: List of environment variables",
                      "items": {
                        "description": "EnvVar represents an environment variable present in a Container.",
                        "properties": {
                          "name": {
                            "description": "Name of the environment variable.",
                            "type": "string"
                          },
                          "value": {
                            "description": "Value of the environment variable.",
                            "type": "string"
                          }
                        },
                        "required": [
                          "name"
                        ],
                        "type": "object",
                        "additionalProperties": false
                      },
                      "type": "array"
                    },
                    "healthcheck": {
                      "description": "Optional: Configure the container's gRPC health service and its probes",
                      "properties": {
                        "enabled": {
                          "default": true,
                          "type": "boolean"
                        },
                        "port": {
                          "description": "Defaults to 51516 for the gpus container and 51515 for the computeDomains container.",
                          "format": "int32",
                          "maximum": 65535,
                          "minimum": 1,
                          "type": "integer"
                        }
                      },
                      "type": "object",
                      "additionalProperties": false
                    },
                    "resources": {
                      "description": "Optional: Define resources requests and limits for the kubelet-plugin container",
                      "properties": {
                        "limits": {
                          "additionalProperties": {
                            "anyOf": [
                              {
                                "type": "integer"
                              },
                              {
                                "type": "string"
                              }
                            ],
                            "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                            "x-kubernetes-int-or-string": true
                          },
                          "description": "Limits describes the maximum amount of compute resources allowed.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/",
                          "type": "object"
                        },
                        "requests": {
                          "additionalProperties": {
                            "anyOf": [
                              {
                                "type": "integer"
                              },
                              {
                                "type": "string"
                              }
                            ],
                            "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                            "x-kubernetes-int-or-string": true
                          },
                          "description": "Requests describes the minimum amount of compute resources required.\nIf Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\notherwise to an implementation-defined value. Requests cannot exceed Limits.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/",
                          "type": "object"
                        }
                      },
                      "type": "object",
                      "additionalProperties": false
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "featureGates": {
              "additionalProperties": {
                "type": "boolean"
              },
              "description": "FeatureGates is a map of feature gate names to a boolean enabling or disabling each.\nIt is rendered as the FEATURE_GATES environment variable on the DRA driver containers.",
              "type": "object"
            },
            "gpus": {
              "description": "GPUs configures the gpu.nvidia.com capability of the DRA driver.",
              "properties": {
                "kubeletPlugin": {
                  "description": "KubeletPlugin configures the kubelet-plugin workload for the gpus capability.",
                  "properties": {
                    "env": {
                      "description": "Optional: List of environment variables",
                      "items": {
                        "description": "EnvVar represents an environment variable present in a Container.",
                        "properties": {
                          "name": {
                            "description": "Name of the environment variable.",
                            "type": "string"
                          },
                          "value": {
                            "description": "Value of the environment variable.",
                            "type": "string"
                          }
                        },
                        "required": [
                          "name"
                        ],
                        "type": "object",
                        "additionalProperties": false
                      },
                      "type": "array"
                    },
                    "healthcheck": {
                      "description": "Optional: Configure the container's gRPC health service and its probes",
                      "properties": {
                        "enabled": {
                          "default": true,
                          "type": "boolean"
                        },
                        "port": {
                          "description": "Defaults to 51516 for the gpus container and 51515 for the computeDomains container.",
                          "format": "int32",
                          "maximum": 65535,
                          "minimum": 1,
                          "type": "integer"
                        }
                      },
                      "type": "object",
                      "additionalProperties": false
                    },
                    "resources": {
                      "description": "Optional: Define resources requests and limits for the kubelet-plugin container",
                      "properties": {
                        "limits": {
                          "additionalProperties": {
                            "anyOf": [
                              {
                                "type": "integer"
                              },
                              {
                                "type": "string"
                              }
                            ],
                            "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                            "x-kubernetes-int-or-string": true
                          },
                          "description": "Limits describes the maximum amount of compute resources allowed.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/",
                          "type": "object"
                        },
                        "requests": {
                          "additionalProperties": {
                            "anyOf": [
                              {
                                "type": "integer"
                              },
                              {
                                "type": "string"
                              }
                            ],
                            "pattern": "^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$",
                            "x-kubernetes-int-or-string": true
                          },
                          "description": "Requests describes the minimum amount of compute resources required.\nIf Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\notherwise to an implementation-defined value. Requests cannot exceed Limits.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/",
                          "type": "object"
                        }
                      },
                      "type": "object",
                      "additionalProperties": false
                    }
                  },
                  "type": "object",
                  "additionalProperties": false
                }
              },
              "type": "object",
              "additionalProperties": false
            },
            "image": {
              "description": "NVIDIA DRA driver image name",
              "pattern": "^[a-zA-Z0-9\\-]+$",
              "type": "string"
            },
            "imagePullPolicy": {
              "description": "Image pull policy",
              "type": "string"
            },
            "imagePullSecrets": {
              "description": "Image pull secrets",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "repository": {
              "description": "NVIDIA DRA driver image repository",
              "type": "string"
            },
            "version": {
              "description": "NVIDIA DRA driver image tag",
              "type": "string"
            }
          },
          "type": "object",
          "additionalProperties": false
        },
        "hostPaths": {
          "description": "HostPaths defines the host paths used in host-path volumes for various components.",
          "properties": {
            "driverInstallDir": {
              "description": "DriverInstallDir represents the root at which driver files including libraries,\nconfig files, and executables can be found.",
              "type": "string"
            },
            "kubeletRootDir": {
              "default": "/var/lib/kubelet",
              "description": "KubeletRootDir represents the location of the kubelet root directory.\nIf empty, it will default to \"/var/lib/kubelet\".",
              "type": "string"
            }
          },
          "type": "object",
          "additionalProperties": false
        }
      },
      "required": [
        "draDriver"
      ],
      "type": "object",
      "additionalProperties": false
    },
    "status": {
      "description": "GPUClusterStatus defines the observed state of GPUCluster",
      "properties": {
        "conditions": {
          "description": "Conditions is a list of conditions representing the GPUCluster's current state.",
          "items": {
            "description": "Condition contains details for one aspect of the current state of this API Resource.",
            "properties": {
              "lastTransitionTime": {
                "description": "lastTransitionTime is the last time the condition transitioned from one status to another.\nThis should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.",
                "format": "date-time",
                "type": "string"
              },
              "message": {
                "description": "message is a human readable message indicating details about the transition.\nThis may be an empty string.",
                "maxLength": 32768,
                "type": "string"
              },
              "observedGeneration": {
                "description": "observedGeneration represents the .metadata.generation that the condition was set based upon.\nFor instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\nwith respect to the current state of the instance.",
                "format": "int64",
                "minimum": 0,
                "type": "integer"
              },
              "reason": {
                "description": "reason contains a programmatic identifier indicating the reason for the condition's last transition.\nProducers of specific condition types may define expected values and meanings for this field,\nand whether the values are considered a guaranteed API.\nThe value should be a CamelCase string.\nThis field may not be empty.",
                "maxLength": 1024,
                "minLength": 1,
                "pattern": "^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$",
                "type": "string"
              },
              "status": {
                "description": "status of the condition, one of True, False, Unknown.",
                "enum": [
                  "True",
                  "False",
                  "Unknown"
                ],
                "type": "string"
              },
              "type": {
                "description": "type of condition in CamelCase or in foo.example.com/CamelCase.",
                "maxLength": 316,
                "pattern": "^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$",
                "type": "string"
              }
            },
            "required": [
              "lastTransitionTime",
              "message",
              "reason",
              "status",
              "type"
            ],
            "type": "object",
            "additionalProperties": false
          },
          "type": "array"
        },
        "namespace": {
          "description": "Namespace indicates the namespace in which the operator and operands are installed",
          "type": "string"
        },
        "state": {
          "description": "State indicates the status of the GPUCluster instance",
          "enum": [
            "ready",
            "notReady",
            "disabled"
          ],
          "type": "string"
        }
      },
      "required": [
        "state"
      ],
      "type": "object",
      "additionalProperties": false
    }
  },
  "type": "object",
  "x-kubernetes-validations": [
    {
      "message": "GPUCluster is a singleton, metadata.name must be 'gpu-cluster'",
      "rule": "self.metadata.name == 'gpu-cluster'"
    }
  ]
}
