From 70525ec1cb01daba55348b5762dd3125cf8dcdbd Mon Sep 17 00:00:00 2001 From: abhi Date: Fri, 15 May 2026 10:58:48 +0530 Subject: [PATCH] feat(dpf): Upgrade DPF 26.4 build with bfb 3.4.0 --- crates/api/src/cfg/file.rs | 2 +- crates/dpf/Makefile.toml | 2 +- ...tion_bfbs.provisioning.dpu.nvidia.com.yaml | 123 +++- ...softwares.provisioning.dpu.nvidia.com.yaml | 207 +++++++ ...eratorconfigs.operator.dpu.nvidia.com.yaml | 528 ++++++++++++++++-- ...uclusters.provisioning.dpu.nvidia.com.yaml | 10 +- ...ion_dpudeployments.svc.dpu.nvidia.com.yaml | 140 ++++- ...pudevices.provisioning.dpu.nvidia.com.yaml | 18 + ...puflavors.provisioning.dpu.nvidia.com.yaml | 72 ++- ...tion_dpus.provisioning.dpu.nvidia.com.yaml | 323 ++++++++++- ...n_dpuservicechains.svc.dpu.nvidia.com.yaml | 53 +- ...viceconfigurations.svc.dpu.nvidia.com.yaml | 6 +- ...credentialrequests.svc.dpu.nvidia.com.yaml | 3 + ...userviceinterfaces.svc.dpu.nvidia.com.yaml | 92 ++- ...on_dpuserviceipams.svc.dpu.nvidia.com.yaml | 95 +++- ...ion_dpuservicenads.svc.dpu.nvidia.com.yaml | 62 +- ...nition_dpuservices.svc.dpu.nvidia.com.yaml | 49 ++ ...n_dpusets.provisioning.dpu.nvidia.com.yaml | 126 ++++- ...nconfigs.noderesources.dpu.nvidia.com.yaml | 205 +++++++ ..._serviceinterfaces.svc.dpu.nvidia.com.yaml | 39 +- ...rviceinterfacesets.svc.dpu.nvidia.com.yaml | 41 +- crates/dpf/src/flavor.rs | 5 +- crates/dpf/src/sdk.rs | 54 +- crates/dpf/src/test/helpers.rs | 23 +- crates/dpf/src/test/sdk_initialization.rs | 2 + crates/dpf/src/types.rs | 4 + 26 files changed, 2126 insertions(+), 158 deletions(-) create mode 100644 crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_bluefieldsoftwares.provisioning.dpu.nvidia.com.yaml create mode 100644 crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_nodesriovdevicepluginconfigs.noderesources.dpu.nvidia.com.yaml diff --git a/crates/api/src/cfg/file.rs b/crates/api/src/cfg/file.rs index 6bf1a424cf..9c5e43d1ca 100644 --- a/crates/api/src/cfg/file.rs +++ b/crates/api/src/cfg/file.rs @@ -714,7 +714,7 @@ impl Default for DpfConfig { } fn default_dpf_bfb_url() -> String { - "https://content.mellanox.com/BlueField/BFBs/Ubuntu24.04/bf-bundle-3.2.1-34_25.11_ubuntu-24.04_64k_prod.bfb".to_string() + "https://content.mellanox.com/BlueField/BFBs/Ubuntu24.04/bf-bundle-3.2.2-125_26.02_ubuntu-24.04_64k_prod.bfb".to_string() } fn default_dpf_deployment_name() -> String { diff --git a/crates/dpf/Makefile.toml b/crates/dpf/Makefile.toml index 3a7e921f5a..38dd6ee131 100644 --- a/crates/dpf/Makefile.toml +++ b/crates/dpf/Makefile.toml @@ -8,7 +8,7 @@ default_to_workspace = false # DOCA_REPO_URL = "https://github.com/NVIDIA/doca-platform.git" # DOCA_BRANCH = "v0.1.0-carbide-47c105e2-nightly" DOCA_REPO_URL = "https://gitlab-master.nvidia.com/doca-platform-foundation/doca-platform-foundation" -DOCA_BRANCH = "integration-carbide" +DOCA_BRANCH = "v26.4.0-rc.1" DOCA_CLONE_DIR = "${CARGO_MAKE_WORKING_DIRECTORY}/doca-platform" CRD_SOURCE_PATH = "${DOCA_CLONE_DIR}/deploy/charts/dpf-operator/templates/crds" CRD_DEST_PATH = "${CARGO_MAKE_WORKING_DIRECTORY}/crds" diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_bfbs.provisioning.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_bfbs.provisioning.dpu.nvidia.com.yaml index 5f9d017ff4..a4778422be 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_bfbs.provisioning.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_bfbs.provisioning.dpu.nvidia.com.yaml @@ -17,7 +17,15 @@ spec: singular: bfb scope: Namespaced versions: - - name: v1alpha1 + - additionalPrinterColumns: + - description: phase of the bfb + jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 schema: openAPIV3Schema: description: BFB is the Schema for the bfbs API @@ -57,19 +65,132 @@ spec: x-kubernetes-validations: - message: Value is immutable rule: self == oldSelf + versions: + description: |- + Optionally specify BFB component versions. When set, these versions are + used directly in status instead of being extracted from the BFB file. + If set, all four fields (BSP, DOCA, UEFI, ATF) must be provided. + properties: + atf: + description: |- + ATF (Arm Trusted Firmware) version. + Contains the version of ATF, which provides a secure runtime environment + type: string + x-kubernetes-validations: + - message: ATF version is immutable + rule: self == oldSelf + bsp: + description: |- + BSP (Board Support Package) version. + This field stores the version of the BSP, which provides essential + support and drivers for the hardware platform. + type: string + x-kubernetes-validations: + - message: BSP version is immutable + rule: self == oldSelf + doca: + description: |- + DOCA version + Specifies the version of NVIDIA's Data Center-on-a-Chip Architecture (DOCA), + a platform for developing applications on DPUs + type: string + x-kubernetes-validations: + - message: DOCA version is immutable + rule: self == oldSelf + uefi: + description: |- + UEFI (Unified Extensible Firmware Interface) version. + Indicates the UEFI firmware version, which is responsible for booting + the operating system and initializing hardware components + type: string + x-kubernetes-validations: + - message: UEFI version is immutable + rule: self == oldSelf + type: object + x-kubernetes-validations: + - message: all four version fields (bsp, doca, uefi, atf) must be + provided when versions is set + rule: self.bsp != '' && self.doca != '' && self.uefi != '' && self.atf + != '' required: - url type: object + x-kubernetes-validations: + - message: versions cannot be removed once set + rule: '!has(oldSelf.versions) || has(self.versions)' status: default: phase: Initializing description: BFBStatus defines the observed state of BFB properties: + conditions: + description: Conditions represent the latest available observations + of BFB 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. + This 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. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with 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. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This 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 + type: array fileName: description: |- Filename is the name of the file where the BFB can be accessed on its volume. This is the same as `.spec.Filename` if set. type: string + observedGeneration: + description: ObservedGeneration records the Generation observed on + the object the last time it was patched. + format: int64 + type: integer phase: default: Initializing description: The current state of BFB. diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_bluefieldsoftwares.provisioning.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_bluefieldsoftwares.provisioning.dpu.nvidia.com.yaml new file mode 100644 index 0000000000..7f50121086 --- /dev/null +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_bluefieldsoftwares.provisioning.dpu.nvidia.com.yaml @@ -0,0 +1,207 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.19.0 + helm.sh/resource-policy: keep + labels: + app.kubernetes.io/part-of: dpf-operator-controller-manager + dpu.nvidia.com/component: dpf-operator-controller-manager + name: bluefieldsoftwares.provisioning.dpu.nvidia.com +spec: + group: provisioning.dpu.nvidia.com + names: + kind: BlueFieldSoftware + listKind: BlueFieldSoftwareList + plural: bluefieldsoftwares + singular: bluefieldsoftware + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: phase of the bluefieldsoftware + jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: BlueFieldSoftware is the Schema for the bluefieldsoftware API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More 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. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + properties: + osIso: + type: string + pldmFwBundle: + type: string + tmpFwComponents: + properties: + astraNicFw: + type: string + bmcErot: + type: string + bmcFw: + type: string + graceErot: + type: string + graceFw: + type: string + type: object + type: object + status: + default: + phase: Initializing + description: BlueFieldSoftwareStatus defines the observed state of BlueFieldSoftware + properties: + conditions: + description: Conditions represent the latest available observations + of BlueFieldSoftware 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. + This 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. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with 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. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This 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 + type: array + downloadedComponents: + description: DownloadedComponents tracks which components have been + successfully downloaded + properties: + astraNicFw: + type: string + bmcErot: + type: string + bmcFW: + type: string + graceErot: + type: string + graceFw: + type: string + osIso: + type: string + pldmFwBundle: + type: string + type: object + observedGeneration: + description: ObservedGeneration records the Generation observed on + the object the last time it was patched. + format: int64 + type: integer + phase: + default: Initializing + description: The current state of BlueFieldSoftware. + enum: + - Initializing + - Downloading + - Ready + - Deleting + - Error + type: string + versions: + description: Versions tracks the versions of the components + properties: + fwBundleVersion: + type: string + osISOVersion: + type: string + tmpFwComponentsVersions: + properties: + astraNicFwVersion: + type: string + bmcErotVersion: + type: string + bmcFwVersion: + type: string + graceErotVersion: + type: string + graceFwVersion: + type: string + type: object + required: + - tmpFwComponentsVersions + type: object + x-kubernetes-validations: + - message: fwBundleVersion is immutable + rule: self.fwBundleVersion == oldSelf.fwBundleVersion + - message: osISOVersion is immutable + rule: self.osISOVersion == oldSelf.osISOVersion + - message: tmpFwComponentsVersions is immutable + rule: self.tmpFwComponentsVersions == oldSelf.tmpFwComponentsVersions + required: + - phase + type: object + type: object + x-kubernetes-validations: + - message: name length can't be bigger than 187 chars + rule: self.metadata.name.size() <= 187 + served: true + storage: true + subresources: + status: {} diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpfoperatorconfigs.operator.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpfoperatorconfigs.operator.dpu.nvidia.com.yaml index 6393274788..a8d004cb1e 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpfoperatorconfigs.operator.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpfoperatorconfigs.operator.dpu.nvidia.com.yaml @@ -55,10 +55,6 @@ spec: cniInstaller: description: CNIInstaller is the configuration for the cni-installer properties: - deployInTargetCluster: - description: 'Deprecated: this field is not supported and will - be removed with v26.4.0.' - type: boolean disable: description: Disable ensures the component is not deployed when set to true. @@ -198,7 +194,7 @@ spec: description: |- Image overrides the container image used by the DPUDetector Container. - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. Use the new field `daemon` instead. pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ type: string @@ -282,10 +278,19 @@ spec: description: |- Image overrides the container image used by the DPUService controller. - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. Use the new field `controller` instead. pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ type: string + replicas: + default: 1 + description: |- + Replicas is the number of replicas for the controller deployment. + This is used for High Availability. Leader election is enabled by default. + format: int32 + maximum: 3 + minimum: 1 + type: integer type: object x-kubernetes-validations: - message: only either 'image' (deprecated) or 'controller.image' @@ -363,10 +368,6 @@ spec: type: object type: object type: object - deployInTargetCluster: - description: 'Deprecated: this field is not supported and will - be removed with v26.4.0.' - type: boolean disable: description: Disable ensures the component is not deployed when set to true. @@ -382,7 +383,7 @@ spec: description: |- Images overrides the container images used by flannel - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. Use the new fields `cni` and `daemon` instead. properties: flannelCNI: @@ -478,15 +479,270 @@ spec: description: |- Image overrides the container image used by the Kamaji Cluster Manager. - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. Use the new field `controller` instead. pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ type: string + replicas: + default: 2 + description: |- + Replicas is the number of replicas for the controller deployment. + This is used for High Availability. Leader election is enabled by default. + format: int32 + maximum: 3 + minimum: 1 + type: integer type: object x-kubernetes-validations: - message: only either 'image' (deprecated) or 'controller.image' can be set, but not both rule: '!has(self.image) || !has(self.controller) || !has(self.controller.image)' + monitoring: + description: Monitoring is the configuration for monitoring resources. + properties: + disable: + description: |- + Disable controls whether monitoring resources are installed. + When enabled (default), the controller: + - Creates ServiceMonitors for Kamaji clusters to scrape control-plane metrics. + - Deploys kube-state-metrics as a DPUService to expose metrics for custom resources. + - Deploys node-problem-detector as a DaemonSet on DPU nodes to detect and report node-level problems. + - Deploys opentelemetry-collector as a DaemonSet on DPU nodes to collect and forward logs. + type: boolean + kubeStateMetrics: + description: KubeStateMetrics is the configuration for kube-state-metrics + properties: + daemon: + description: |- + Daemon contains the configuration for the kube-state-metrics component. + It contains the image for kube-state-metrics and its resource requirements. + properties: + image: + description: Image is a reference to a container image. + pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ + type: string + resources: + description: |- + Resources defines the memory and CPU resource requests and limits for the component. + This field is optional, and if not set, the component will use the default resource. + properties: + limits: + description: Limits defines the resource limits for + the component. + properties: + cpu: + anyOf: + - type: integer + - type: string + description: CPU is the amount of CPU requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + memory: + anyOf: + - type: integer + - type: string + description: Memory is the amount of Memory requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + description: Requests defines the resource requests + for the component. + properties: + cpu: + anyOf: + - type: integer + - type: string + description: CPU is the amount of CPU requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + memory: + anyOf: + - type: integer + - type: string + description: Memory is the amount of Memory requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + type: object + disable: + description: Disable ensures the component is not deployed + when set to true. + type: boolean + helmChart: + description: |- + HelmChart overrides the helm chart used by the ServiceSet controller. + The URL must begin with either 'oci://' or 'https://', ensuring it points to a valid + OCI registry or a web-based repository. + pattern: ^(oci://|https://).+$ + type: string + type: object + nodeProblemDetector: + description: NodeProblemDetector is the configuration for node-problem-detector + properties: + daemon: + description: |- + Daemon contains the configuration for the node-problem-detector component. + It contains the image for node-problem-detector and its resource requirements. + properties: + image: + description: Image is a reference to a container image. + pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ + type: string + resources: + description: |- + Resources defines the memory and CPU resource requests and limits for the component. + This field is optional, and if not set, the component will use the default resource. + properties: + limits: + description: Limits defines the resource limits for + the component. + properties: + cpu: + anyOf: + - type: integer + - type: string + description: CPU is the amount of CPU requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + memory: + anyOf: + - type: integer + - type: string + description: Memory is the amount of Memory requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + description: Requests defines the resource requests + for the component. + properties: + cpu: + anyOf: + - type: integer + - type: string + description: CPU is the amount of CPU requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + memory: + anyOf: + - type: integer + - type: string + description: Memory is the amount of Memory requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + type: object + disable: + description: Disable ensures the component is not deployed + when set to true. + type: boolean + helmChart: + description: |- + HelmChart overrides the helm chart used by the ServiceSet controller. + The URL must begin with either 'oci://' or 'https://', ensuring it points to a valid + OCI registry or a web-based repository. + pattern: ^(oci://|https://).+$ + type: string + type: object + openTelemetryCollector: + description: OpenTelemetryCollector is the configuration for opentelemetry-collector + properties: + daemon: + description: |- + Daemon contains the configuration for the opentelemetry-collector component. + It contains the image for opentelemetry-collector and its resource requirements. + properties: + image: + description: Image is a reference to a container image. + pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ + type: string + resources: + description: |- + Resources defines the memory and CPU resource requests and limits for the component. + This field is optional, and if not set, the component will use the default resource. + properties: + limits: + description: Limits defines the resource limits for + the component. + properties: + cpu: + anyOf: + - type: integer + - type: string + description: CPU is the amount of CPU requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + memory: + anyOf: + - type: integer + - type: string + description: Memory is the amount of Memory requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + description: Requests defines the resource requests + for the component. + properties: + cpu: + anyOf: + - type: integer + - type: string + description: CPU is the amount of CPU requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + memory: + anyOf: + - type: integer + - type: string + description: Memory is the amount of Memory requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + type: object + disable: + description: Disable ensures the component is not deployed + when set to true. + type: boolean + helmChart: + description: |- + HelmChart overrides the helm chart used by the ServiceSet controller. + The URL must begin with either 'oci://' or 'https://', ensuring it points to a valid + OCI registry or a web-based repository. + pattern: ^(oci://|https://).+$ + type: string + logging: + description: |- + Logging contains the configuration for the opentelemetry-collector logging component. + If not specified, logging will not be streamed. + properties: + endpoint: + description: |- + Endpoint is the OTLP endpoint where the DPU cluster opentelemetry-collector sends data to. + This could be the management cluster's opentelemetry-collector endpoint. + If not specified, nothing will be forwarded from DPU clusters. + type: string + required: + - endpoint + type: object + type: object + type: object multus: description: Multus is the configuration for Multus properties: @@ -548,10 +804,6 @@ spec: type: object type: object type: object - deployInTargetCluster: - description: 'Deprecated: this field is not supported and will - be removed with v26.4.0.' - type: boolean disable: description: Disable ensures the component is not deployed when set to true. @@ -567,7 +819,7 @@ spec: description: |- Image overrides the container image used by the Multus Container. - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. Use the new field `cni` instead. pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ type: string @@ -599,6 +851,107 @@ spec: minimum: 1280 type: integer type: object + nodeSRIOVDevicePluginController: + description: |- + NodeSRIOVDevicePluginController is the configuration for the NodeSRIOVDevicePlugin controller. + This controller manages per-node SRIOV device plugin pods based on DPU configurations. + The controller is disabled by default. + properties: + controller: + description: |- + Controller contains the configuration for the NodeSRIOVDevicePlugin controller component. + It contains the image for the controller and its resource requirements. + properties: + image: + description: Image is a reference to a container image. + pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ + type: string + resources: + description: |- + Resources defines the memory and CPU resource requests and limits for the component. + This field is optional, and if not set, the component will use the default resource. + properties: + limits: + description: Limits defines the resource limits for the + component. + properties: + cpu: + anyOf: + - type: integer + - type: string + description: CPU is the amount of CPU requested by + the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + memory: + anyOf: + - type: integer + - type: string + description: Memory is the amount of Memory requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + description: Requests defines the resource requests for + the component. + properties: + cpu: + anyOf: + - type: integer + - type: string + description: CPU is the amount of CPU requested by + the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + memory: + anyOf: + - type: integer + - type: string + description: Memory is the amount of Memory requested + by the component. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + type: object + devicePlugin: + description: |- + DevicePlugin contains the configuration for the SRIOV device plugin pods + managed by this controller. + properties: + defaultResourcePrefix: + description: |- + DefaultResourcePrefix is the default resource prefix for the SRIOV device plugin resources. + Defaults to "nvidia.com". + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + image: + description: Image overrides the container image for the SRIOV + device plugin. + pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ + type: string + initImage: + description: |- + InitImage overrides the container image for the init container + that generates device plugin configuration. + pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ + type: string + type: object + disable: + description: Disable ensures the component is not deployed when + set to true. + type: boolean + replicas: + default: 1 + description: |- + Replicas is the number of replicas for the controller deployment. + This is used for High Availability. Leader election is enabled by default. + format: int32 + maximum: 3 + minimum: 1 + type: integer + type: object nvipam: description: NVIPAM is the configuration for NVIPAM properties: @@ -660,10 +1013,6 @@ spec: type: object type: object type: object - deployInTargetCluster: - description: 'Deprecated: this field is not supported and will - be removed with v26.4.0.' - type: boolean disable: description: Disable ensures the component is not deployed when set to true. @@ -679,7 +1028,7 @@ spec: description: |- Image overrides the container image used by the NVIPAM controller. - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. Use the new field `controller` instead. pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ type: string @@ -688,6 +1037,10 @@ spec: Node contains the configuration for the NVIPAM node component. It contains the image for the node and its resource requirements. properties: + image: + description: Image is a reference to a container image. + pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ + type: string resources: description: |- Resources defines the memory and CPU resource requests and limits for the component. @@ -747,6 +1100,14 @@ spec: Overrides exposes a set of fields which impact the recommended behavior of the DPF Operator. These fields should only be set for advanced use cases. The fields here have no stability guarantees. properties: + argoCDNamespace: + description: |- + ArgoCDNamespace is the namespace where ArgoCD is deployed. + AppProjects and cluster secrets required by DPF will be created in this namespace. + Defaults to the namespace of the DPFOperatorConfig. + maxLength: 63 + minLength: 1 + type: string dpuCNIBinPath: description: |- DPUCNIBinPath is the path at which the CNI binaries will be installed to on the DPU. @@ -870,10 +1231,6 @@ spec: type: object type: object type: object - deployInTargetCluster: - description: 'Deprecated: this field is not supported and will - be removed with v26.4.0.' - type: boolean disable: description: Disable ensures the component is not deployed when set to true. @@ -889,7 +1246,7 @@ spec: description: |- Image overrides the container image used by the OVS CNI. - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. Use the new field `cni` instead. pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ type: string @@ -906,11 +1263,14 @@ spec: BFCFGTemplateConfigMap is the name of a configMap containing a template for the BF.cfg file used by the DPU controller. By default the provisioning controller use a hardcoded BF.cfg e.g. https://github.com/NVIDIA/doca-platform/blob/release-v24.10/internal/provisioning/controllers/dpu/bfcfg/bf.cfg.template Note: Replacing the bf.cfg is an advanced use case. The default bf.cfg is designed for most use cases. + + Deprecated: BFCFGTemplateConfigMap is deprecated and will be removed in a future release. + Use enableDynamicBFCFGTemplates instead for custom bf.cfg templates. type: string bfbPVCName: - description: BFBPersistentVolumeClaimName is the name of the PersistentVolumeClaim - used by dpf-provisioning-controller - minLength: 1 + description: |- + BFBPersistentVolumeClaimName is the name of the PersistentVolumeClaim used by dpf-provisioning-controller + If not provided, the controller will use local host storage (hostPath) type: string controller: description: |- @@ -984,11 +1344,28 @@ spec: a DMS API must respond, 0 is unlimited minimum: 1 type: integer + enableDynamicBFCFGTemplates: + description: |- + EnableDynamicBFCFGTemplates enables runtime discovery of bf.cfg templates via ConfigMaps. + When enabled, the provisioning controller discovers ConfigMaps by matching labels for BFB + name/namespace and DPUCluster name/namespace. Mutually exclusive with bfCFGTemplateConfigMap. + type: boolean + hostAgentDNSPolicy: + description: |- + HostAgentDNSPolicy sets the DNS policy for the hostagent pod. + Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. + Defaults to 'ClusterFirstWithHostNet'. + enum: + - ClusterFirstWithHostNet + - ClusterFirst + - Default + - None + type: string image: description: |- Image overrides the container image used by the Provisioning controller. - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. Use the new field `controller` instead. pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ type: string @@ -1069,6 +1446,23 @@ spec: format: duration pattern: ^([0-9]+(h|m|s|ms|us|µs|ns))+$ type: string + nodeEffectRemovalTimeout: + default: 0s + description: |- + NodeEffectRemovalTimeout is the maximum time allowed for the Node Effect Removal phase. + If the DPUNodeMaintenance CR still has requestors after this timeout, the DPU will transition to an error state. + When set to "0s" (the default), the timeout is disabled and no time limit is enforced. + format: duration + pattern: ^([0-9]+(h|m|s|ms|us|µs|ns))+$ + type: string + osInstallTimeout: + default: 45m + description: |- + OSInstallTimeout is the maximum time allowed for OS installation in zero-trust mode. + If the installation exceeds this timeout, the DPU will transition to an error state. + format: duration + pattern: ^([0-9]+(h|m|s|ms|us|µs|ns))+$ + type: string registry: description: Registry is the configuration for the BFB Registry properties: @@ -1078,30 +1472,42 @@ spec: By default, the BFB Registry can be accessed via its Service. For non-kubernetes environments, this must be set due to the lack of kubelet on worker nodes. For zero-trust environments, this must be set so that the BFB Registry can be accessed from DPU BMC. + Deprecated: Address is deprecated and will be removed in a future release. + pattern: ^http:// + type: string + loadBalancerAddress: + description: |- + LoadBalancerAddress is the address of the load balancer for the BFB Registry which the hostagent/redfish use to fetch the BFB and generated bf.cfg. + To enable the load balancer, you need to deploy your own load balancer controller and configure the LoadBalancerAddress field. + Then check the bfb-registry nodeport service and make your load balancer controller to distribute the requests to the bfb-registry nodeport. pattern: ^http:// type: string port: - description: Port is the port on which the registry instances - will listen + description: |- + Port is the port on which the registry instances will listen + Deprecated: Address is deprecated and will be removed in a future release. maximum: 65535 minimum: 1 type: integer type: object - zeroTrustInstallTimeout: - default: 45m + replicas: + default: 2 description: |- - ZeroTrustInstallTimeout is the maximum time allowed for OS installation in zero-trust mode. - If the installation exceeds this timeout, the DPU will transition to an error state. - format: duration - pattern: ^([0-9]+(h|m|s|ms|us|µs|ns))+$ - type: string - required: - - bfbPVCName + Replicas is the number of replicas for the controller deployment. + This is used for High Availability. Leader election is enabled by default. + format: int32 + maximum: 3 + minimum: 1 + type: integer type: object x-kubernetes-validations: - message: only either 'image' (deprecated) or 'controller.image' can be set, but not both rule: '!has(self.image) || !has(self.controller) || !has(self.controller.image)' + - message: bfCFGTemplateConfigMap and enableDynamicBFCFGTemplates + are mutually exclusive + rule: '!(has(self.bfCFGTemplateConfigMap) && has(self.enableDynamicBFCFGTemplates) + && self.enableDynamicBFCFGTemplates)' serviceSetController: description: ServiceSetController is the configuration for the ServiceSetController properties: @@ -1163,10 +1569,6 @@ spec: type: object type: object type: object - deployInTargetCluster: - description: 'Deprecated: this field is not supported and will - be removed with v26.4.0.' - type: boolean disable: description: Disable ensures the component is not deployed when set to true. @@ -1182,10 +1584,19 @@ spec: description: |- Image overrides the container image used by the ServiceChainSet Controller. - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. Use the new field `controller` instead. pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ type: string + replicas: + default: 1 + description: |- + Replicas is the number of replicas for the controller deployment. + This is used for High Availability. Leader election is enabled by default. + format: int32 + maximum: 3 + minimum: 1 + type: integer type: object x-kubernetes-validations: - message: only either 'image' (deprecated) or 'controller.image' @@ -1252,10 +1663,6 @@ spec: type: object type: object type: object - deployInTargetCluster: - description: 'Deprecated: this field is not supported and will - be removed with v26.4.0.' - type: boolean disable: description: Disable ensures the component is not deployed when set to true. @@ -1271,7 +1678,7 @@ spec: description: |- Image overrides the container image used by the SFC controller. - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. Use the new field `controller` instead. pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ type: string @@ -1289,10 +1696,6 @@ spec: sriovDevicePlugin: description: SRIOVDevicePlugin is the configuration for the SRIOVDevicePlugin properties: - deployInTargetCluster: - description: 'Deprecated: this field is not supported and will - be removed with v26.4.0.' - type: boolean deviceplugin: description: |- DevicePlugin contains the configuration for the SRIOV Device Plugin component. @@ -1366,7 +1769,7 @@ spec: description: |- Image overrides the container image used by the SRIOV Device Plugin container. - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. Use the new field `deviceplugin` instead. pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ type: string @@ -1444,10 +1847,19 @@ spec: description: |- Image overrides the container image used by the Static Cluster Manager. - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. Use the new field `controller` instead. pattern: ^((?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))*|\[(?:[a-fA-F0-9:]+)\])(?::[0-9]+)?/)?[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|[-]+)[a-z0-9]+)*)*)(?::([\w][\w.-]{0,127}))?(?:@([A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xdigit:]]{32,}))?$ type: string + replicas: + default: 1 + description: |- + Replicas is the number of replicas for the controller deployment. + This is used for High Availability. Leader election is enabled by default. + format: int32 + maximum: 3 + minimum: 1 + type: integer type: object x-kubernetes-validations: - message: only either 'image' (deprecated) or 'controller.image' diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuclusters.provisioning.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuclusters.provisioning.dpu.nvidia.com.yaml index 95451fe5b4..58f07fab62 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuclusters.provisioning.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuclusters.provisioning.dpu.nvidia.com.yaml @@ -34,9 +34,13 @@ spec: name: MaxNodes type: integer - description: Kubernetes control-plane version - jsonPath: .spec.version + jsonPath: .status.version name: Version type: string + - description: number of assigned DPUs + jsonPath: .status.nodesCount + name: NodesCount + type: integer - jsonPath: .metadata.creationTimestamp name: Age type: date @@ -184,6 +188,10 @@ spec: - type type: object type: array + nodesCount: + description: NodesCount is the number of DPUs assigned to the cluster + minimum: 0 + type: integer phase: allOf: - enum: diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpudeployments.svc.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpudeployments.svc.dpu.nvidia.com.yaml index 148f0ffd68..0c480d2c74 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpudeployments.svc.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpudeployments.svc.dpu.nvidia.com.yaml @@ -77,16 +77,17 @@ spec: description: |- MaxUnavailable is the maximum number of DPUs that can be unavailable during the update. - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. x-kubernetes-int-or-string: true type: object type: - default: OnDelete description: Can be "OnDelete" or "RollingUpdate". enum: - OnDelete - RollingUpdate type: string + required: + - type type: object dpuSets: description: DPUSets contains configuration for each DPUSet that @@ -102,11 +103,118 @@ spec: to the DPU object created by the DPUSet. maxProperties: 50 type: object + dpuClusterSelector: + additionalProperties: + type: string + description: |- + DPUClusterSelector defines the selector for DPUClusters that the DPUs created by the DPUSets created by the + DPUDeployment should join + require multiple DPUServices, DPUServiceInterfaces, and DPUServiceChains to be created so that we can mathematically + cover the union of all the selectors across all the DPUSets. + type: object + dpuDeviceSelector: + description: DPUDeviceSelector defines the selector for + DPUDevices that the DPUSet should target and should create + a DPU for. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + dpuNodeSelector: + description: DPUNodeSelector defines the selector for DPUNodes + that the DPUSet should target and should create a DPU + for. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic dpuSelector: additionalProperties: type: string - description: DPUSelector defines the DPUs that the DPUSet - should target + description: |- + DPUSelector defines the DPUs that the DPUSet should target + + Deprecated: This field is deprecated and will be removed with v26.7.0. Use DPUDeviceSelector instead. type: object nameSuffix: description: NameSuffix is the suffix to be added to the @@ -115,8 +223,10 @@ spec: minLength: 1 type: string nodeSelector: - description: NodeSelector defines the nodes that the DPUSet - should target + description: |- + NodeSelector defines the nodes that the DPUSet should target + + Deprecated: This field is deprecated and will be removed with v26.7.0. Use DPUNodeSelector instead. properties: matchExpressions: description: matchExpressions is a list of label selector @@ -168,7 +278,14 @@ spec: - message: should not contain dpu.nvidia.com/ and should not end with dpu.nvidia.com rule: '!(has(self.dpuAnnotations) && (self.dpuAnnotations.exists(key, - key.contains(''dpu.nvidia.com/'') || key.endsWith(''dpu.nvidia.com'')))) ' + (key.contains(''dpu.nvidia.com/'') || key.endsWith(''dpu.nvidia.com'')) + && !key.startsWith(''noderesources.dpu.nvidia.com''))))' + - message: only one of nodeSelector or dpuNodeSelector can be + specified + rule: '!(has(self.nodeSelector) && has(self.dpuNodeSelector))' + - message: only one of dpuSelector or dpuDeviceSelector can + be specified + rule: '!(has(self.dpuSelector) && has(self.dpuDeviceSelector))' maxItems: 50 minItems: 1 type: array @@ -241,9 +358,15 @@ spec: - key type: object type: object + secureBoot: + description: SecureBoot specifies whether UEFI Secure Boot should + be enabled. + type: boolean required: - bfb + - dpuSetStrategy - flavor + - nodeEffect type: object revisionHistoryLimit: default: 10 @@ -251,6 +374,7 @@ spec: The maximum number of revisions that can be retained during upgrades. Defaults to 10. format: int32 + minimum: 1 type: integer serviceChains: description: ServiceChains contains the configuration related to the @@ -277,7 +401,7 @@ spec: interface: description: Interface name is the name of the interface as defined in the DPUServiceConfiguration - maxLength: 28 + maxLength: 15 minLength: 1 type: string ipam: diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpudevices.provisioning.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpudevices.provisioning.dpu.nvidia.com.yaml index 62361ba15d..b678ad97a3 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpudevices.provisioning.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpudevices.provisioning.dpu.nvidia.com.yaml @@ -121,6 +121,7 @@ spec: It's used to track the device's lifecycle and for inventory management. This value is immutable and should not be changed once set. Example: "MT_0001234567", "MT25066004C7" + minLength: 1 type: string x-kubernetes-validations: - message: Serial Number is immutable @@ -216,6 +217,15 @@ spec: default: dpu description: DPUMode is the mode of the DPU. type: string + dpuType: + default: Unknown + description: DPUType is the type of the DPU. + enum: + - Unknown + - BlueField2 + - BlueField3 + - BlueField4 + type: string opn: description: |- OPN is the Ordering Part Number of the device. @@ -247,6 +257,14 @@ spec: Example: "MT_0001234567", "MT25066004C7" pattern: ^MT_?[A-Z0-9]+$ type: string + secureBoot: + description: SecureBoot indicates the current UEFI Secure Boot state. + properties: + enabled: + description: Enabled indicates whether UEFI Secure Boot is currently + enabled on the DPU. + type: boolean + type: object serialNumber: description: |- SerialNumber is the serial number of the device. diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuflavors.provisioning.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuflavors.provisioning.dpu.nvidia.com.yaml index 7530044615..28cea8af06 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuflavors.provisioning.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuflavors.provisioning.dpu.nvidia.com.yaml @@ -80,8 +80,10 @@ spec: type: string type: object dpuMode: - default: dpu - description: 'Specifies the DPU Mode type: one of dpu,zero-trust' + description: |- + Specifies the DPU Mode type: one of dpu,zero-trust. + When not specified, defaults to "zero-trust" if the DPF deployment uses Redfish install interface, + otherwise defaults to "dpu". enum: - dpu - zero-trust @@ -134,22 +136,27 @@ spec: Both global and per-interface NVConfig settings can coexist without collision. properties: device: - description: Device is the device to which the configuration - applies. If not specified, the configuration applies to - all. - type: string - hostPowerCycleRequired: description: |- - HostPowerCycleRequired indicates if the host needs to be power cycled after applying the configuration. - - Deprecated: This field is unused and deprecated. It will be removed with the release v26.4.0. - type: boolean + Device is the device to which the configuration applies. If not specified, the configuration applies to all. + Supported values: "*" (wildcard for all devices), "p0"/"P0" (port 0), "p1"/"P1" (port 1). Case-insensitive. + enum: + - '*' + - p0 + - p1 + - P0 + - P1 + type: string parameters: description: Parameters are the parameters to be set for the device. items: + maxLength: 200 + pattern: ^[^=\s]+=[^\s]*$ type: string + maxItems: 32 + minItems: 1 type: array + x-kubernetes-list-type: atomic type: object portNumber: description: PortNumber identifies which port this configuration @@ -164,28 +171,51 @@ spec: type: array nvconfig: description: |- - NVConfig contains the global DPU-wide configuration (firmware settings, global device parameters). - This applies to the DPU device and should not overlap with per-interface NVConfig settings. + NVConfig contains the device-specific configuration (firmware settings, device parameters). + Each entry specifies a device (wildcard '*', or port identifiers 'p0'/'P0'/'p1'/'P1') and its parameters. + If device is '*' or unspecified (defaults to '*'), it applies to all devices and must be the only entry. + Each device (including unspecified as '*') must be unique across all nvconfig entries (case-insensitive). + Validation enforces: device enum values, parameter format (KEY=VALUE), case-insensitive uniqueness, and size limits. items: properties: device: - description: Device is the device to which the configuration - applies. If not specified, the configuration applies to all. - type: string - hostPowerCycleRequired: description: |- - HostPowerCycleRequired indicates if the host needs to be power cycled after applying the configuration. - - Deprecated: This field is unused and deprecated. It will be removed with the release v26.4.0. - type: boolean + Device is the device to which the configuration applies. If not specified, the configuration applies to all. + Supported values: "*" (wildcard for all devices), "p0"/"P0" (port 0), "p1"/"P1" (port 1). Case-insensitive. + enum: + - '*' + - p0 + - p1 + - P0 + - P1 + type: string parameters: description: Parameters are the parameters to be set for the device. items: + maxLength: 200 + pattern: ^[^=\s]+=[^\s]*$ type: string + maxItems: 32 + minItems: 1 type: array + x-kubernetes-list-type: atomic type: object + maxItems: 3 type: array + x-kubernetes-list-type: atomic + x-kubernetes-validations: + - message: when device is '*', it must be the only nvconfig entry + rule: size(self) == 0 || !self.exists(x, has(x.device) && x.device + == '*') || size(self) == 1 + - message: when device is unspecified (defaults to '*'), it must be + the only nvconfig entry + rule: size(self) == 0 || !self.exists(x, !has(x.device)) || size(self) + == 1 + - message: each nvconfig.device (including unspecified as '*') must + be unique (case-insensitive) + rule: 'self.all(p1, self.exists_one(p2, (has(p1.device) ? p1.device.lowerAscii() + : ''*'') == (has(p2.device) ? p2.device.lowerAscii() : ''*'')))' ovs: description: OVS contains the OVS configuration for the DPUFlavor. properties: diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpus.provisioning.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpus.provisioning.dpu.nvidia.com.yaml index 5ccb2d4968..eeb7e0aa00 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpus.provisioning.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpus.provisioning.dpu.nvidia.com.yaml @@ -31,7 +31,10 @@ spec: - jsonPath: .status.conditions[?(@.type=='Ready')].status name: Ready type: string - - description: phase of the cluster + - jsonPath: .status.operationalConditions[?(@.type=='OperationalReady')].status + name: Operational + type: string + - description: phase of the dpu jsonPath: .status.phase name: Phase type: string @@ -66,6 +69,10 @@ spec: bfb: description: Specifies name of the bfb CR to use for this DPU type: string + blueFieldSoftware: + description: Specifies the name of the BlueFieldSoftware CR to use + for this DPU + type: string bmcIP: description: |- BMCIP is the ip address of the DPU BMC @@ -91,9 +98,56 @@ spec: nodeLabels: additionalProperties: type: string - description: NodeLabels define the labels that will be added to - the nodes. + description: NodeLabels specifies the labels to be added to the + node. type: object + selector: + description: Selector defines the selector of the DPUClusters + the produced DPUs should join + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic type: object dpuDeviceName: description: Specifies the name of the DPUDevice this DPU is associated @@ -118,8 +172,6 @@ spec: - message: Value is immutable rule: self == oldSelf nodeEffect: - default: - drain: true description: Specifies how changes to the DPU should affect the Node properties: applyOnLabelChange: @@ -202,6 +254,13 @@ spec: Example: "0000-03-00", "03-00" pattern: ^([0-9a-fA-F]{4}[-])?[0-9a-fA-F]{2}[-][0-9a-fA-F]{2}$ type: string + secureBoot: + description: SecureBoot specifies whether UEFI Secure Boot should + be enabled. + type: boolean + x-kubernetes-validations: + - message: Value is immutable + rule: self == oldSelf serialNumber: description: The serial number of the DPU minLength: 1 @@ -212,7 +271,9 @@ spec: required: - bfb - dpuDeviceName + - dpuFlavor - dpuNodeName + - nodeEffect - serialNumber type: object status: @@ -237,6 +298,146 @@ spec: - type type: object type: array + agentLastStartupTime: + description: AgentLastStartupTime is the time when the DPU agent was + last started. This is copied from agentStatus.lastStartupTime. + format: date-time + type: string + agentStatus: + description: AgentStatus contains the information reported from inside + the DPU + properties: + conditions: + description: Conditions contains the conditions reported from + inside the DPU + 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. + This 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. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with 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. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This 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 + type: array + initialBootID: + description: InitialBootID is the boot ID of the DPU OS during + the first boot + type: string + kubeletVersion: + description: KubeletVersion represents the kubelet version running + on the DPU. + type: string + lastObservedPendingNvconfig: + description: |- + LastObservedPendingNVConfig stores the last pending NVConfig parameters seen + during reboot-method discovery on this boot. It is used on the next boot to + ignore repeated parameters that remained unchanged across boots. + properties: + bootID: + type: string + devices: + items: + properties: + device: + type: string + entries: + items: + properties: + current: + type: string + default: + type: string + name: + type: string + next_boot: + description: NextBoot uses the "next_boot" so + this type can be reused for parsing mlxfwrest + output + type: string + type: object + type: array + required: + - entries + type: object + type: array + type: object + lastStartupTime: + description: LastStartupTime is the time when the DPU was last + started + format: date-time + type: string + rebootMethod: + description: |- + RebootMethod is the type of reset/reboot set by the DPU agent + See enum values in RebootMethodType. + No default is set intentionally: nil means "check not run or not applicable" + (e.g. legacy flow, or agent has not run the check yet); + a non-nil value means the check ran and this is the result. + enum: + - Unknown + - NoAction + - PowerCycle + - SystemReboot + - SystemLevelReset + - FirmwareReset + - DPUWarmReboot + type: string + rebootSequenceCount: + description: |- + RebootSequenceCount is the length of the current non-NoAction RebootMethod sequence: + it increments on each agent run that reports a RebootMethod other than NoAction and + resets to 0 when the agent reports NoAction. Used with RebootMethod to bound host reboot loops. + format: int32 + minimum: 0 + type: integer + type: object bfCFGFile: description: BFCFGFile is the path to the bf.cfg type: string @@ -247,6 +448,7 @@ spec: description: bfb version of this DPU type: string conditions: + description: Conditions represents the provisioning lifecycle conditions. items: description: Condition contains details for one aspect of the current state of this API Resource. @@ -329,6 +531,15 @@ spec: default: dpu description: The mode of the DPU type: string + dpuType: + default: Unknown + description: The type of the DPU + enum: + - Unknown + - BlueField2 + - BlueField3 + - BlueField4 + type: string firmware: description: the firmware information of DPU properties: @@ -347,6 +558,69 @@ spec: the object the last time it was patched. format: int64 type: integer + operationalConditions: + description: |- + OperationalConditions represents aggregated operational readiness conditions. + These conditions reflect the runtime health and readiness of DPU services and node health, + separate from the provisioning lifecycle represented by Conditions. + 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. + This 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. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with 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. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This 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 + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map pciDevice: description: pci device information of this DPU type: string @@ -360,23 +634,60 @@ spec: - Config FW Parameters - Prepare BFB - OS Installing + - DPU Config - DPU Cluster Config - Host Network Configuration - Ready - Error - Deleting - Rebooting + - Perform ARM Force Restart - Initialize Interface - - Checking Host Reboot Required - Node Effect Removal + - Checking Host Reboot Required type: string postProvisioningNodeEffect: description: Indicates that node effect was triggered by post-provisioning label changes type: boolean + previousPhase: + description: |- + PreviousPhase is the last non-empty Phase before the current Phase, set by the controller + when Phase transitions. It may be unset during early initialization (empty Phase) or until + the first transition from a non-empty Phase. Internal controller tracking only. + enum: + - Initializing + - Node Effect + - Pending + - Config FW Parameters + - Prepare BFB + - OS Installing + - DPU Config + - DPU Cluster Config + - Host Network Configuration + - Ready + - Error + - Deleting + - Rebooting + - Perform ARM Force Restart + - Initialize Interface + - Node Effect Removal + - Checking Host Reboot Required + type: string + redfishTaskId: + description: The task ID of the last task performed on the DPU BMC + type: string requiredReset: description: whether require reset of DPU type: boolean + secureBoot: + description: SecureBoot indicates the current UEFI Secure Boot state. + properties: + enabled: + description: Enabled indicates whether UEFI Secure Boot is currently + enabled on the DPU. + type: boolean + type: object required: - phase type: object diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservicechains.svc.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservicechains.svc.dpu.nvidia.com.yaml index 2c00f92361..5f4d11d1e4 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservicechains.svc.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservicechains.svc.dpu.nvidia.com.yaml @@ -53,8 +53,57 @@ spec: description: DPUServiceChainSpec defines the desired state of DPUServiceChainSpec properties: clusterSelector: - description: Select the Clusters with specific labels, ServiceChainSet - CRs will be created only for these Clusters + description: |- + Select the Clusters with specific labels, ServiceChainSet CRs will be created only for these Clusters + + Deprecated: This field is deprecated and will be removed with v26.7.0. Use DPUClusterSelector instead. + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + dpuClusterSelector: + description: DPUClusterSelector determines in which clusters the DPUServiceChain + controller should apply the configuration. properties: matchExpressions: description: matchExpressions is a list of label selector requirements. diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuserviceconfigurations.svc.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuserviceconfigurations.svc.dpu.nvidia.com.yaml index 9d833d69b1..5010833df6 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuserviceconfigurations.svc.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuserviceconfigurations.svc.dpu.nvidia.com.yaml @@ -65,7 +65,7 @@ spec: properties: name: description: Name is the name of the interface - maxLength: 28 + maxLength: 15 minLength: 1 type: string network: @@ -307,8 +307,8 @@ spec: type: object x-kubernetes-validations: - message: interfaces are not supported when deploying in cluster - rule: '!has(self.interfaces) || (has(self.interfaces) && (self.serviceConfiguration.deployInCluster - == false || !has(self.serviceConfiguration.deployInCluster)))' + rule: '!has(self.interfaces) || (has(self.interfaces) && (!has(self.serviceConfiguration) + || self.serviceConfiguration.deployInCluster == false || !has(self.serviceConfiguration.deployInCluster)))' status: description: DPUServiceConfigurationStatus defines the observed state of DPUServiceConfiguration diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservicecredentialrequests.svc.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservicecredentialrequests.svc.dpu.nvidia.com.yaml index 45a84a1256..6ceb9cc0aa 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservicecredentialrequests.svc.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservicecredentialrequests.svc.dpu.nvidia.com.yaml @@ -233,6 +233,9 @@ spec: type: string type: object type: object + x-kubernetes-validations: + - message: name length can't be bigger than 63 chars + rule: self.metadata.name.size() <= 63 served: true storage: true subresources: diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuserviceinterfaces.svc.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuserviceinterfaces.svc.dpu.nvidia.com.yaml index 0adef86085..e038f42a3b 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuserviceinterfaces.svc.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuserviceinterfaces.svc.dpu.nvidia.com.yaml @@ -60,8 +60,57 @@ spec: description: DPUServiceInterfaceSpec defines the desired state of DPUServiceInterfaceSpec properties: clusterSelector: - description: Select the Clusters with specific labels, ServiceInterfaceSet - CRs will be created only for these Clusters + description: |- + Select the Clusters with specific labels, ServiceInterfaceSet CRs will be created only for these Clusters + + Deprecated: This field is deprecated and will be removed with v26.7.0. Use DPUClusterSelector instead. + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + dpuClusterSelector: + description: DPUClusterSelector determines in which clusters the DPUServiceInterface + controller should apply the configuration. properties: matchExpressions: description: matchExpressions is a list of label selector requirements. @@ -201,20 +250,24 @@ spec: properties: interfaceType: description: The interface type ("vlan", "physical", - "pf", "vf", "ovn", "service") + "pf", "vf", "ovn", "patch", "service") enum: - vlan - physical - pf - vf - ovn + - patch - service type: string node: description: Node where this interface exists type: string ovn: - description: The OVN definition + description: |- + The OVN definition + Deprecated: This field is deprecated and will be removed with v26.10.0. + Migrate to interfaceType="patch" with spec.patch.peerBridge and spec.patch.peerPatchName instead. properties: externalBridge: default: br-ovn @@ -222,6 +275,31 @@ spec: OVN bridge type: string type: object + patch: + description: The Patch definition + properties: + peerBridge: + description: |- + PeerBridge is the name of the bridge to which the patch port is connected. + This bridge must be created before the ServiceInterface is created. + type: string + peerExternalIDs: + additionalProperties: + type: string + description: PeerExternalIDs are the external + IDs used to identify the peer patch port. + type: object + peerPatchName: + description: |- + PeerPatchName is the name of the patch port on the peer bridge. + If not set, it is auto-generated in the format: `p__to__` + where bridge names have hyphens removed and `` is an 8-character FNV-1a hash + derived from the ServiceInterface's namespace/name. + Example: p_brovn_to_brsfc_7aea60f7 (for bridges br-ovn and br-sfc). + type: string + required: + - peerBridge + type: object pf: description: The PF definition properties: @@ -254,6 +332,8 @@ spec: properties: interfaceName: description: The interface name + maxLength: 15 + minLength: 1 type: string network: description: |- @@ -323,13 +403,13 @@ spec: for interfaceType=pf, pf must be set; for interfaceType=vf, vf must be set; for interfaceType=physical, physical must be set; for interfaceType=service, service must - be set`' + be set; for interfaceType=patch, patch must be set`' rule: (self.interfaceType == 'vlan' && has(self.vlan)) || (self.interfaceType == 'pf' && has(self.pf)) || (self.interfaceType == 'vf' && has(self.vf)) || (self.interfaceType == 'physical' && has(self.physical)) || (self.interfaceType == 'service' && has(self.service)) || (self.interfaceType - == 'ovn') + == 'ovn') || (self.interfaceType == 'patch' && has(self.patch)) required: - spec type: object diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuserviceipams.svc.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuserviceipams.svc.dpu.nvidia.com.yaml index 659d6471b0..e31497947e 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuserviceipams.svc.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuserviceipams.svc.dpu.nvidia.com.yaml @@ -53,7 +53,56 @@ spec: description: DPUServiceIPAMSpec defines the desired state of DPUServiceIPAM properties: clusterSelector: - description: ClusterSelector determines in which clusters the DPUServiceIPAM + description: |- + ClusterSelector determines in which clusters the DPUServiceIPAM controller should apply the configuration. + + Deprecated: This field is deprecated and will be removed with v26.7.0. Use DPUClusterSelector instead. + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + dpuClusterSelector: + description: DPUClusterSelector determines in which clusters the DPUServiceIPAM controller should apply the configuration. properties: matchExpressions: @@ -113,9 +162,30 @@ spec: description: DefaultGateway adds gateway as default gateway in the routes list if true. type: boolean + excludeRanges: + description: ExcludeRanges is a list of IP ranges that should + be excluded from the allocation. + items: + description: |- + ExcludeRange contains range of IP addresses to exclude from allocation + startIP and endIP are part of the Excluded range. + properties: + endIP: + description: EndIP is the end of the range. + type: string + startIP: + description: StartIP is the start of the range. + type: string + required: + - endIP + - startIP + type: object + type: array exclusions: - description: Exclusions is a list of IPs that should be excluded - when splitting the CIDR into subnets per node. + description: |- + Exclusions is a list of IPs that should be excluded when splitting the CIDR into subnets per node. + + Deprecated: This field is deprecated and will be removed with v26.10.0. Use ExcludeRanges instead. items: type: string type: array @@ -161,6 +231,25 @@ spec: if true, add gateway as default gateway in the routes list DefaultGateway adds gateway as default gateway in the routes list if true. type: boolean + excludeRanges: + description: ExcludeRanges is a list of IP ranges that should + be excluded from the allocation. + items: + description: |- + ExcludeRange contains range of IP addresses to exclude from allocation + startIP and endIP are part of the Excluded range. + properties: + endIP: + description: EndIP is the end of the range. + type: string + startIP: + description: StartIP is the start of the range. + type: string + required: + - endIP + - startIP + type: object + type: array gateway: description: Gateway is the IP in the subnet that should be the gateway of the subnet. diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservicenads.svc.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservicenads.svc.dpu.nvidia.com.yaml index a573e99857..1db84466f2 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservicenads.svc.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservicenads.svc.dpu.nvidia.com.yaml @@ -77,6 +77,53 @@ spec: - type type: object type: array + dpuClusterSelector: + description: DPUClusterSelector determines in which clusters the DPUServiceNAD + controller should apply the configuration. + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic ipam: description: |- IPAM enables IP Address Management for the network interfaces attached to this network @@ -85,21 +132,6 @@ spec: DPUServiceChain documentation for more. When set to false, the network interfaces attached to this network will not get an IP type: boolean - metadata: - description: 'Deprecated: This field is unused and will be removed - with v26.4.0.' - properties: - annotations: - additionalProperties: - type: string - description: Annotations is a map of string keys and values. - type: object - labels: - additionalProperties: - type: string - description: Labels is a map of string keys and values. - type: object - type: object resourceType: description: |- ResourceType specifies the type of network resource to allocate for pods using this NAD. diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservices.svc.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservices.svc.dpu.nvidia.com.yaml index 1e825db758..e26d88cb87 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservices.svc.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpuservices.svc.dpu.nvidia.com.yaml @@ -138,6 +138,53 @@ spec: DeployInCluster indicates if the DPUService Helm Chart will be deployed on the Host cluster. Default to false. type: boolean + dpuClusterSelector: + description: Select the Clusters with specific labels, Applications + will be created only for these Clusters + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic helmChart: description: HelmChart reflects the Helm related configuration properties: @@ -379,6 +426,8 @@ spec: && !has(self.serviceID)) || has(self.serviceID) - message: configPorts cannot be set when deployInCluster is true rule: '!(has(self.deployInCluster) && self.deployInCluster && has(self.configPorts))' + - message: dpuClusterSelector cannot be set when deployInCluster is true + rule: '!(has(self.deployInCluster) && self.deployInCluster && has(self.dpuClusterSelector))' status: description: DPUServiceStatus defines the observed state of DPUService properties: diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpusets.provisioning.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpusets.provisioning.dpu.nvidia.com.yaml index 6c2d9211ee..82e5dcdd82 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpusets.provisioning.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_dpusets.provisioning.dpu.nvidia.com.yaml @@ -17,7 +17,14 @@ spec: singular: dpuset scope: Namespaced versions: - - name: v1alpha1 + - additionalPrinterColumns: + - jsonPath: .status.conditions[?(@.type=='Ready')].status + name: Ready + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 schema: openAPIV3Schema: description: DPUSet is the Schema for the dpusets API @@ -42,6 +49,53 @@ spec: spec: description: DPUSetSpec defines the desired state of DPUSet properties: + dpuDeviceSelector: + description: DPUDeviceSelector defines the selector for DPUDevices + that the DPUSet should target and should create a DPU for. + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. + The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector applies + to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic dpuNodeSelector: description: Select the DPUNodes with specific labels properties: @@ -91,7 +145,10 @@ spec: dpuSelector: additionalProperties: type: string - description: Select the DPU with specific labels + description: |- + Select the DPU with specific labels + + Deprecated: This field is deprecated and will be removed with v26.7.0. Use DPUDeviceSelector instead. type: object dpuTemplate: description: Object that describes the DPU that will be created if @@ -112,6 +169,7 @@ spec: name: description: Specifies name of the bfb CR to use for this DPU + minLength: 1 type: string type: object cluster: @@ -123,14 +181,60 @@ spec: description: NodeLabels specifies the labels to be added to the node. type: object + selector: + description: Selector defines the selector of the DPUClusters + the produced DPUs should join + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic type: object dpuFlavor: description: DPUFlavor is the name of the DPUFlavor that will be used to deploy the DPU. + minLength: 1 type: string nodeEffect: - default: - drain: true description: Specifies how changes to the DPU should affect the Node properties: @@ -211,8 +315,13 @@ spec: 1 : 0) + (has(self.customLabel) ? 1 : 0) + (has(self.drain) ? 1 : 0) + (has(self.customAction) ? 1 : 0) + (has(self.hold) ? 1 : 0) == 1' + secureBoot: + description: SecureBoot specifies whether UEFI Secure Boot + should be enabled. + type: boolean required: - dpuFlavor + - nodeEffect type: object type: object strategy: @@ -230,20 +339,25 @@ spec: description: |- MaxUnavailable is the maximum number of DPUs that can be unavailable during the update. - Deprecated: This field is deprecated and will be removed with v26.4.0. + Deprecated: This field is deprecated and will be removed with v26.7.0. x-kubernetes-int-or-string: true type: object type: - default: OnDelete description: Can be "OnDelete" or "RollingUpdate". enum: - OnDelete - RollingUpdate type: string + required: + - type type: object required: - dpuTemplate + - strategy type: object + x-kubernetes-validations: + - message: only one of dpuSelector or dpuDeviceSelector can be specified + rule: '!(has(self.dpuSelector) && has(self.dpuDeviceSelector))' status: description: DPUSetStatus defines the observed state of DPUSet properties: diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_nodesriovdevicepluginconfigs.noderesources.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_nodesriovdevicepluginconfigs.noderesources.dpu.nvidia.com.yaml new file mode 100644 index 0000000000..097c4188b1 --- /dev/null +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_nodesriovdevicepluginconfigs.noderesources.dpu.nvidia.com.yaml @@ -0,0 +1,205 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.19.0 + labels: + app.kubernetes.io/part-of: dpf-operator-controller-manager + dpu.nvidia.com/component: dpf-operator-controller-manager + name: nodesriovdevicepluginconfigs.noderesources.dpu.nvidia.com +spec: + group: noderesources.dpu.nvidia.com + names: + kind: NodeSRIOVDevicePluginConfig + listKind: NodeSRIOVDevicePluginConfigList + plural: nodesriovdevicepluginconfigs + singular: nodesriovdevicepluginconfig + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.conditions[?(@.type=='Ready')].status + name: Ready + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: NodeSRIOVDevicePluginConfig is the Schema for the nodesriovdevicepluginconfigs + API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More 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. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: NodeSRIOVDevicePluginConfigSpec defines the desired state + of NodeSRIOVDevicePluginConfig + properties: + devicePluginResources: + description: DevicePluginResources is the list of device plugin resource + configurations. + items: + description: DevicePluginResource defines a single device plugin + resource configuration. + properties: + name: + description: |- + Name is the endpoint resource name for the device plugin. + Should contain only alphanumeric characters, underscores and hyphens. + The full extended resource name will be constructed as resource-prefix/name. + Example: pods_vf, ovnk_mgmt_vf + minLength: 1 + pattern: ^[a-zA-Z0-9_-]+$ + type: string + options: + description: Options contains additional options for the device + plugin resource. + properties: + isRdma: + description: IsRdma indicates whether RDMA is enabled for + this resource. + type: boolean + type: object + ranges: + description: Ranges specifies the VF ranges on PFs to be included + in this resource. + items: + description: VFRange defines a range of Virtual Functions + on a Physical Function. + properties: + end: + description: |- + End is the ending VF index (inclusive). + If not set, the range extends to the last VF on the PF. + format: int32 + minimum: 0 + type: integer + pfIndex: + description: PFIndex is the index of the Physical Function. + format: int32 + minimum: 0 + type: integer + start: + description: |- + Start is the starting VF index (inclusive). + If not set, the range starts from VF 0. + format: int32 + minimum: 0 + type: integer + required: + - pfIndex + type: object + x-kubernetes-validations: + - message: start must be less than or equal to end + rule: '!has(self.start) || !has(self.end) || self.start + <= self.end' + minItems: 1 + type: array + resourcePrefix: + description: |- + ResourcePrefix is the resource prefix used by the device plugin to prefix the resource name. + If not set, the default resource prefix will be used. + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + type: + description: Type specifies the type of the device plugin resource. + enum: + - vf + type: string + required: + - name + - ranges + - type + type: object + minItems: 1 + type: array + required: + - devicePluginResources + type: object + status: + description: NodeSRIOVDevicePluginConfigStatus defines the observed state + of NodeSRIOVDevicePluginConfig + properties: + conditions: + description: Conditions exposes the current state of the NodeSRIOVDevicePluginConfig. + 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. + This 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. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with 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. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This 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 + type: array + observedGeneration: + description: ObservedGeneration records the Generation observed on + the object the last time it was patched. + format: int64 + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_serviceinterfaces.svc.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_serviceinterfaces.svc.dpu.nvidia.com.yaml index af76f890ef..6feace41a7 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_serviceinterfaces.svc.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_serviceinterfaces.svc.dpu.nvidia.com.yaml @@ -63,26 +63,55 @@ spec: properties: interfaceType: description: The interface type ("vlan", "physical", "pf", "vf", "ovn", - "service") + "patch", "service") enum: - vlan - physical - pf - vf - ovn + - patch - service type: string node: description: Node where this interface exists type: string ovn: - description: The OVN definition + description: |- + The OVN definition + Deprecated: This field is deprecated and will be removed with v26.10.0. + Migrate to interfaceType="patch" with spec.patch.peerBridge and spec.patch.peerPatchName instead. properties: externalBridge: default: br-ovn description: ExternalBridge is the name of the OVN bridge type: string type: object + patch: + description: The Patch definition + properties: + peerBridge: + description: |- + PeerBridge is the name of the bridge to which the patch port is connected. + This bridge must be created before the ServiceInterface is created. + type: string + peerExternalIDs: + additionalProperties: + type: string + description: PeerExternalIDs are the external IDs used to identify + the peer patch port. + type: object + peerPatchName: + description: |- + PeerPatchName is the name of the patch port on the peer bridge. + If not set, it is auto-generated in the format: `p__to__` + where bridge names have hyphens removed and `` is an 8-character FNV-1a hash + derived from the ServiceInterface's namespace/name. + Example: p_brovn_to_brsfc_7aea60f7 (for bridges br-ovn and br-sfc). + type: string + required: + - peerBridge + type: object pf: description: The PF definition properties: @@ -115,6 +144,8 @@ spec: properties: interfaceName: description: The interface name + maxLength: 15 + minLength: 1 type: string network: description: |- @@ -182,11 +213,13 @@ spec: x-kubernetes-validations: - message: '`for interfaceType=vlan, vlan must be set; for interfaceType=pf, pf must be set; for interfaceType=vf, vf must be set; for interfaceType=physical, - physical must be set; for interfaceType=service, service must be set`' + physical must be set; for interfaceType=service, service must be set; + for interfaceType=patch, patch must be set`' rule: (self.interfaceType == 'vlan' && has(self.vlan)) || (self.interfaceType == 'pf' && has(self.pf)) || (self.interfaceType == 'vf' && has(self.vf)) || (self.interfaceType == 'physical' && has(self.physical)) || (self.interfaceType == 'service' && has(self.service)) || (self.interfaceType == 'ovn') + || (self.interfaceType == 'patch' && has(self.patch)) status: description: ServiceInterfaceStatus defines the observed state of ServiceInterface properties: diff --git a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_serviceinterfacesets.svc.dpu.nvidia.com.yaml b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_serviceinterfacesets.svc.dpu.nvidia.com.yaml index ed5866d82e..1c9770c6ae 100644 --- a/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_serviceinterfacesets.svc.dpu.nvidia.com.yaml +++ b/crates/dpf/crds/apiextensions.k8s.io_v1_customresourcedefinition_serviceinterfacesets.svc.dpu.nvidia.com.yaml @@ -129,26 +129,55 @@ spec: properties: interfaceType: description: The interface type ("vlan", "physical", "pf", - "vf", "ovn", "service") + "vf", "ovn", "patch", "service") enum: - vlan - physical - pf - vf - ovn + - patch - service type: string node: description: Node where this interface exists type: string ovn: - description: The OVN definition + description: |- + The OVN definition + Deprecated: This field is deprecated and will be removed with v26.10.0. + Migrate to interfaceType="patch" with spec.patch.peerBridge and spec.patch.peerPatchName instead. properties: externalBridge: default: br-ovn description: ExternalBridge is the name of the OVN bridge type: string type: object + patch: + description: The Patch definition + properties: + peerBridge: + description: |- + PeerBridge is the name of the bridge to which the patch port is connected. + This bridge must be created before the ServiceInterface is created. + type: string + peerExternalIDs: + additionalProperties: + type: string + description: PeerExternalIDs are the external IDs used + to identify the peer patch port. + type: object + peerPatchName: + description: |- + PeerPatchName is the name of the patch port on the peer bridge. + If not set, it is auto-generated in the format: `p__to__` + where bridge names have hyphens removed and `` is an 8-character FNV-1a hash + derived from the ServiceInterface's namespace/name. + Example: p_brovn_to_brsfc_7aea60f7 (for bridges br-ovn and br-sfc). + type: string + required: + - peerBridge + type: object pf: description: The PF definition properties: @@ -181,6 +210,8 @@ spec: properties: interfaceName: description: The interface name + maxLength: 15 + minLength: 1 type: string network: description: |- @@ -249,12 +280,14 @@ spec: - message: '`for interfaceType=vlan, vlan must be set; for interfaceType=pf, pf must be set; for interfaceType=vf, vf must be set; for interfaceType=physical, physical must be set; for interfaceType=service, - service must be set`' + service must be set; for interfaceType=patch, patch must be + set`' rule: (self.interfaceType == 'vlan' && has(self.vlan)) || (self.interfaceType == 'pf' && has(self.pf)) || (self.interfaceType == 'vf' && has(self.vf)) || (self.interfaceType == 'physical' && has(self.physical)) || (self.interfaceType == 'service' && has(self.service)) - || (self.interfaceType == 'ovn') + || (self.interfaceType == 'ovn') || (self.interfaceType == + 'patch' && has(self.patch)) required: - spec type: object diff --git a/crates/dpf/src/flavor.rs b/crates/dpf/src/flavor.rs index 6f450c0a8c..4357da8e19 100644 --- a/crates/dpf/src/flavor.rs +++ b/crates/dpf/src/flavor.rs @@ -21,7 +21,7 @@ use kube::core::ObjectMeta; use crate::crds::dpuflavors_generated::{ DPUFlavor, DpuFlavorConfigFiles, DpuFlavorConfigFilesOperation, DpuFlavorDpuMode, - DpuFlavorNvconfig, DpuFlavorSpec, + DpuFlavorNvconfig, DpuFlavorNvconfigDevice, DpuFlavorSpec, }; pub const DEFAULT_FLAVOR_NAME: &str = "dpu-flavor"; @@ -154,8 +154,7 @@ fn get_default_nvconfig() -> DpuFlavorNvconfig { DpuFlavorNvconfig { // DPF does not allow anyother wild card. It takes only '*' - device: Some("*".to_string()), - host_power_cycle_required: None, + device: Some(DpuFlavorNvconfigDevice::KopiumVariant0), //"*" parameters: Some(parameters), } } diff --git a/crates/dpf/src/sdk.rs b/crates/dpf/src/sdk.rs index 1b1c5101c0..e443362e41 100644 --- a/crates/dpf/src/sdk.rs +++ b/crates/dpf/src/sdk.rs @@ -29,9 +29,9 @@ use crate::crds::bfbs_generated::{BFB, BfbSpec}; use crate::crds::dpudeployments_generated::{ DPUDeployment, DpuDeploymentDpus, DpuDeploymentDpusDpuSetStrategy, DpuDeploymentDpusDpuSetStrategyType, DpuDeploymentDpusDpuSets, - DpuDeploymentDpusDpuSetsNodeSelector, DpuDeploymentDpusNodeEffect, DpuDeploymentServiceChains, - DpuDeploymentServiceChainsSwitches, DpuDeploymentServiceChainsSwitchesPorts, - DpuDeploymentServiceChainsSwitchesPortsService, + DpuDeploymentDpusDpuSetsDpuNodeSelector, DpuDeploymentDpusNodeEffect, + DpuDeploymentServiceChains, DpuDeploymentServiceChainsSwitches, + DpuDeploymentServiceChainsSwitchesPorts, DpuDeploymentServiceChainsSwitchesPortsService, DpuDeploymentServiceChainsSwitchesPortsServiceInterface, DpuDeploymentServiceChainsUpgradePolicy, DpuDeploymentServices, DpuDeploymentServicesDependsOn, DpuDeploymentSpec, @@ -425,6 +425,7 @@ async fn create_bfb( spec: BfbSpec { url: bfb_url.to_string(), file_name: None, + versions: None, }, status: None, }; @@ -614,7 +615,7 @@ pub fn build_service_nad(svc: &ServiceDefinition, namespace: &str) -> Option DpuServiceNadResourceType::Sf, ServiceNADResourceType::Vf => DpuServiceNadResourceType::Vf, @@ -738,13 +739,16 @@ pub fn build_deployment( dpu_annotations: None, dpu_selector: None, name_suffix: "default".to_string(), - node_selector: Some(DpuDeploymentDpusDpuSetsNodeSelector { + dpu_node_selector: Some(DpuDeploymentDpusDpuSetsDpuNodeSelector { match_expressions: None, match_labels: Some(node_labels), }), + dpu_cluster_selector: None, + dpu_device_selector: None, + node_selector: None, }]), flavor: flavor_name.to_string(), - node_effect: Some(DpuDeploymentDpusNodeEffect { + node_effect: DpuDeploymentDpusNodeEffect { custom_action: None, custom_label: None, drain: None, @@ -752,11 +756,12 @@ pub fn build_deployment( hold: Some(true), no_effect: None, taint: None, - }), - dpu_set_strategy: Some(DpuDeploymentDpusDpuSetStrategy { + }, + dpu_set_strategy: DpuDeploymentDpusDpuSetStrategy { rolling_update: None, - r#type: Some(DpuDeploymentDpusDpuSetStrategyType::OnDelete), - }), + r#type: DpuDeploymentDpusDpuSetStrategyType::OnDelete, + }, + secure_boot: None, }, revision_history_limit: None, service_chains, @@ -992,10 +997,12 @@ pub fn build_service_interface( service: None, vf, vlan: None, + patch: None, }, }, }, }, + dpu_cluster_selector: None, }, ); cr.metadata = ObjectMeta { @@ -1591,7 +1598,7 @@ impl DpfSdk name: d.metadata.name.clone().unwrap_or_default(), labels: d.metadata.labels.clone().unwrap_or_default(), spec_bfb: d.spec.bfb.clone(), - spec_dpu_flavor: d.spec.dpu_flavor.clone(), + spec_dpu_flavor: Some(d.spec.dpu_flavor.clone()), spec_dpu_device_name: d.spec.dpu_device_name.clone(), spec_dpu_node_name: d.spec.dpu_node_name.clone(), status_phase: d.status.as_ref().map(|s| format!("{:?}", s.phase)), @@ -1676,7 +1683,7 @@ mod tests { use super::*; use crate::crds::dpuflavors_generated::DPUFlavor; - use crate::crds::dpus_generated::DPU; + use crate::crds::dpus_generated::{DPU, DpuNodeEffect}; use crate::repository::{ DpuDeviceRepository, DpuFlavorRepository, DpuNodeRepository, DpuRepository, }; @@ -2256,11 +2263,23 @@ mod tests { bmc_ip: None, cluster: None, dpu_device_name: "dpu-001".to_string(), - dpu_flavor: Some(crate::flavor::DEFAULT_FLAVOR_NAME.to_string()), + dpu_flavor: crate::flavor::DEFAULT_FLAVOR_NAME.to_string(), dpu_node_name: "node-dpu-001".to_string(), - node_effect: None, + node_effect: DpuNodeEffect { + apply_on_label_change: None, + custom_action: None, + custom_label: None, + drain: None, + force: None, + hold: None, + no_effect: None, + node_maintenance_additional_requestors: None, + taint: None, + }, pci_address: None, serial_number: "SN123".to_string(), + blue_field_software: None, + secure_boot: None, }, status: Some(DpuStatus { phase: DpuStatusPhase::Ready, @@ -2277,6 +2296,13 @@ mod tests { pci_device: None, post_provisioning_node_effect: None, required_reset: None, + agent_last_startup_time: None, + agent_status: None, + dpu_type: None, + operational_conditions: None, + previous_phase: None, + redfish_task_id: None, + secure_boot: None, }), }; mock.dpus diff --git a/crates/dpf/src/test/helpers.rs b/crates/dpf/src/test/helpers.rs index 0a03539e83..2b9db6d822 100644 --- a/crates/dpf/src/test/helpers.rs +++ b/crates/dpf/src/test/helpers.rs @@ -206,6 +206,13 @@ pub(crate) fn make_status(phase: DpuStatusPhase) -> DpuStatus { phase, post_provisioning_node_effect: None, required_reset: None, + agent_last_startup_time: None, + agent_status: None, + dpu_type: None, + operational_conditions: None, + previous_phase: None, + redfish_task_id: None, + secure_boot: None, } } @@ -227,11 +234,23 @@ pub(crate) fn make_dpu( bmc_ip: Some("10.0.0.100".into()), cluster: None, dpu_device_name: device.into(), - dpu_flavor: Some("flavor".into()), + dpu_flavor: "flavor".to_string(), dpu_node_name: node.into(), - node_effect: None, + node_effect: DpuNodeEffect { + apply_on_label_change: None, + custom_action: None, + custom_label: None, + drain: None, + force: None, + hold: None, + no_effect: None, + node_maintenance_additional_requestors: None, + taint: None, + }, pci_address: None, serial_number: "SN".into(), + blue_field_software: None, + secure_boot: None, }, status: Some(make_status(phase)), } diff --git a/crates/dpf/src/test/sdk_initialization.rs b/crates/dpf/src/test/sdk_initialization.rs index 9085f92dd6..c937651710 100644 --- a/crates/dpf/src/test/sdk_initialization.rs +++ b/crates/dpf/src/test/sdk_initialization.rs @@ -87,6 +87,8 @@ impl BfbRepository for InitializationMock { file_name: None, phase: BfbStatusPhase::Ready, versions: None, + conditions: None, + observed_generation: None, }); self.bfbs .insert(resource_key(&bfb_with_status), bfb_with_status.clone()); diff --git a/crates/dpf/src/types.rs b/crates/dpf/src/types.rs index 3fe0712ea7..9466f26814 100644 --- a/crates/dpf/src/types.rs +++ b/crates/dpf/src/types.rs @@ -305,6 +305,10 @@ impl From for DpuPhase { DpuStatusPhase::InitializeInterface => Self::Provisioning("InitializeInterface".into()), DpuStatusPhase::CheckingHostRebootRequired => Self::Rebooting, DpuStatusPhase::NodeEffectRemoval => Self::NodeEffect, + DpuStatusPhase::DpuConfig => Self::Provisioning("DpuConfig".into()), + DpuStatusPhase::PerformArmForceRestart => { + Self::Provisioning("PerformArmForceRestart".into()) + } } } }