Skip to content

Add ComputeDomain for running multi-node workloads #225

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 72 commits into from
Feb 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
cdc471e
Fix tooling versions
elezar Feb 14, 2025
d5dba3a
Remove +clientgen from GpuConfig, MigConfig, and ImexChannelConfig
klueska Jan 9, 2025
1bde3dc
Add CRD for creating a multi-node environment
klueska Jan 9, 2025
d04de6a
Update Makefile to generate MultiNodeEnvironment CRD, client, deepcopy
klueska Jan 9, 2025
267acfc
Add generated MultiNodeEnvironment CRD, client, and deepcopy
klueska Jan 9, 2025
04822e9
Make the nvidia.com client set available to the driver
klueska Jan 10, 2025
dbe6212
Add indirection of ImexManager through wrapping Controller abstraction
klueska Jan 10, 2025
9fcf823
Add a workqueue abstraction for processing objects pulled from informers
klueska Jan 12, 2025
9567a97
Add logic to autogenerate a ResourceClaim from a MultiNodeEnvironment
klueska Jan 10, 2025
c592906
Add logic to autogenerate a DeviceClass from a MultiNodeEnvironment
klueska Jan 12, 2025
3e35d7e
Allow either a resourceClaimName or a deviceClassName to be specified
klueska Jan 12, 2025
4e19938
Add Deployment support for MultiNodeEnvironments and completely refactor
klueska Jan 14, 2025
252ef56
Rename and copy cmds / helm charts to split GPU and IMEX drivers
klueska Jan 18, 2025
1599501
Strip GPU / IMEX drivers to remove corresponding devices
klueska Jan 20, 2025
e156811
Add ability to allocate a per-node IMEX deamon via a ResourceClaim
klueska Jan 22, 2025
def999d
Rename MultiNodeEnvironment to ComputeDomain
klueska Jan 22, 2025
a3ff033
Rename gpu.nvidia.com/v1alpha1 API to resource.nvidia.com/v1beta1
klueska Jan 22, 2025
899a701
Move to GetComputeDomainFunc instead of ComputeDomainExistsFunc
klueska Jan 23, 2025
c7f9061
Add ComputeDomainStatus and set it as its deployment pods come online
klueska Jan 23, 2025
62820f9
Update ImexDaemonSettingsManager to pull IPs from ComputeDomain status
klueska Jan 23, 2025
af8d432
Add the ability to set affinities as part of a ComputeDomain
klueska Jan 23, 2025
619f4d9
Move creation of IMEX channel pool to after the deployment is fully up
klueska Jan 24, 2025
ab0c8e9
Add placeholder for Delayed vs. Immediate mode for ComputeDomain
klueska Jan 24, 2025
f8b3265
Support ResourceClaimNames as a list in a ComputeDomain
klueska Jan 25, 2025
a9c2e90
Update vendored nvidia-container-toolkit to main
klueska Jan 25, 2025
38a5ab8
Remove explicit mounting of nvidia-imex and nvidia-imex-ctl
klueska Jan 25, 2025
b18e3ec
Add a finalizer to ComputeDomains to ensure they are the last removed
klueska Jan 27, 2025
301086b
Add optimization to avoid redundant Delete calls
klueska Jan 27, 2025
9d57625
Standardize on passing ComputeDomainUID to RemoveFinalizer calls
klueska Jan 27, 2025
8edb57b
Remove unnecessary code to check for ComputeDomain existence
klueska Jan 27, 2025
b78aeae
Pull RemoveFinalizer() out of Delete() and call it conditionally
klueska Jan 28, 2025
66e0680
Rename ImexDaemonSettingsManager and move CDI edits for Channeln there
klueska Jan 28, 2025
701b674
Skip injection of the IMEX channel device node if no cliqueID
klueska Jan 28, 2025
211bd3f
Add a status field for the ComputeDomain.Status
klueska Feb 4, 2025
f51c43c
Move channel pools out of deployment and into computedomain manager
klueska Feb 5, 2025
6a7adc8
Update validating admission policy to support allNodes in resource slice
klueska Feb 5, 2025
cbe7c4c
Add support for Delayed mode in ComputeDomains
klueska Feb 5, 2025
16671b6
Use workqueue to retry failed operations in plugin instead of retry loop
klueska Feb 5, 2025
4e59eef
Rename k8s-dra-driver to k8s-dra-driver-gpu
klueska Feb 6, 2025
0bbe353
Rename all helm references to 'fullname' to just 'name'
klueska Feb 6, 2025
820fc47
Rename helm chart name from k8s-dra-driver-gpu to nvidia-dra-driver-gpu
klueska Feb 6, 2025
dcfb94d
Remove helm chart for GPU DRA driver in favor of one for ComputeDomains
klueska Feb 6, 2025
ee553a1
Rename containers and commands inside them in consolidated helm chart
klueska Feb 6, 2025
f3afd1a
Remove all (appropriate) references to the term IMEX
klueska Feb 6, 2025
2956dba
Change to calendar versioning instead of semver
klueska Feb 6, 2025
5e58318
Add condition to helm chart to enable computeDomains and GPUs separately
klueska Feb 6, 2025
4b7441b
Advertise channel 0 from each node as a "default" channel to consume
klueska Feb 7, 2025
25b59ec
Remove the ability to define a custom deviceclass for a computedomain
klueska Feb 8, 2025
a390f15
Make ComputeDomain specs immutable
klueska Feb 8, 2025
baffbb1
Add a struct around the list of resource claims and specify names there
klueska Feb 8, 2025
381ee05
Limit Deployment's ResourceClaimTemplate to driver namespace
klueska Feb 8, 2025
d052490
Make the ResourceClaimTemplateManager specific to targeting daemons
klueska Feb 8, 2025
b082ab0
Move to ResourceClaimTemplates instead of global ResourceClaims
klueska Feb 9, 2025
45e0177
Remove ImmediateMode and make Delayed the only option
klueska Feb 9, 2025
75edd9b
Add waiting for dependent objects of ComputeDomain to be fully removed
klueska Feb 9, 2025
7821db4
Use a daemonset instead of a deployment to run ComputeDomain daemons
klueska Feb 9, 2025
e9c7101
Block ComputeDomain deletion while a workload is still running in it
klueska Feb 11, 2025
9cbc576
Add a liveness probe to the ComputeDomain daemon
klueska Feb 11, 2025
3373134
Ensure that ResourceClaim / ComputeDomain namespace are the same
klueska Feb 11, 2025
993b853
Add the notion of a "permanent" error to the kubelet plugin
klueska Feb 11, 2025
7783596
Harden logic around calling prepare / unprepare on allocated claims
klueska Feb 13, 2025
0e5611f
Abstract out getConfigResultsMap so it can be reused later
klueska Feb 13, 2025
ef25561
Unconditionally unprepare imex channels and daemons
klueska Feb 13, 2025
a37de39
Treat a ClusterUUID of all 0s to mean no IMEX support as well
klueska Feb 13, 2025
4625953
Add a level of indiraction with a new 'channel' field in ComputeDomain
klueska Feb 13, 2025
718e69d
Ensure that the fabric-imex-mgmt nvcap is created and injected always
klueska Feb 14, 2025
5a83bac
Recursively unmount /proc/driver/nvidia if it is mounted
klueska Feb 14, 2025
3ea7913
Add demo specs for working with compute domains
klueska Feb 14, 2025
578ab87
Only inject channel / daemon settings if running on an IMEX capable node
klueska Feb 17, 2025
4464442
Add periodic cleanup of stale objects owned by deleted ComputeDomains
klueska Feb 18, 2025
222df11
Allow the DRA driver for GPUs to be force installed if desired
klueska Feb 18, 2025
474f968
Determine cliqueID from NVML not node label
klueska Feb 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 4 additions & 4 deletions .common-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ trigger-pipeline:
.scan-base:
stage: scan
variables:
IMAGE: "${CI_REGISTRY_IMAGE}/k8s-dra-driver:${CI_COMMIT_SHORT_SHA}-${DIST}"
IMAGE_ARCHIVE: "k8s-dra-driver-${CI_COMMIT_SHORT_SHA}-${DIST}-${PLATFORM_ARCH}.tar"
IMAGE: "${CI_REGISTRY_IMAGE}/k8s-dra-driver-gpu:${CI_COMMIT_SHORT_SHA}-${DIST}"
IMAGE_ARCHIVE: "k8s-dra-driver-gpu-${CI_COMMIT_SHORT_SHA}-${DIST}-${PLATFORM_ARCH}.tar"
before_script:
- docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY}"
- docker pull --platform="${PLATFORM}" "${IMAGE}"
Expand Down Expand Up @@ -160,7 +160,7 @@ scan-ubi9-arm64:
stage: release
variables:
# Define the source image for the release
IMAGE_NAME: "${CI_REGISTRY_IMAGE}/k8s-dra-driver"
IMAGE_NAME: "${CI_REGISTRY_IMAGE}/k8s-dra-driver-gpu"
VERSION: "${CI_COMMIT_SHORT_SHA}"
# OUT_IMAGE_VERSION is overridden for external releases
OUT_IMAGE_VERSION: "${CI_COMMIT_SHORT_SHA}"
Expand Down Expand Up @@ -195,7 +195,7 @@ scan-ubi9-arm64:
OUT_REGISTRY_USER: "${CI_REGISTRY_USER}"
OUT_REGISTRY_TOKEN: "${CI_REGISTRY_PASSWORD}"
OUT_REGISTRY: "${CI_REGISTRY}"
OUT_IMAGE_NAME: "${CI_REGISTRY_IMAGE}/staging/k8s-dra-driver"
OUT_IMAGE_NAME: "${CI_REGISTRY_IMAGE}/staging/k8s-dra-driver-gpu"

# Define an external release step that pushes an image to an external repository.
# This includes a devlopment image off main.
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/image.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build image
env:
IMAGE_NAME: ghcr.io/${LOWERCASE_REPO_OWNER}/k8s-dra-driver
IMAGE_NAME: ghcr.io/${LOWERCASE_REPO_OWNER}/k8s-dra-driver-gpu
VERSION: ${COMMIT_SHORT_SHA}
run: |
echo "${VERSION}"
Expand Down
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
.cache/
.bash_history
/nvidia-dra-controller
/nvidia-dra-plugin
/compute-domain-controller
/compute-domain-kubelet-plugin
/gpu-kubelet-plugin
.idea
[._]*.sw[a-p]
coverage.out
2 changes: 1 addition & 1 deletion .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ unit-tests:
.image-build:
stage: image-build
variables:
IMAGE_NAME: "${CI_REGISTRY_IMAGE}/k8s-dra-driver"
IMAGE_NAME: "${CI_REGISTRY_IMAGE}/k8s-dra-driver-gpu"
VERSION: "${CI_COMMIT_SHORT_SHA}"
PUSH_ON_BUILD: "true"
before_script:
Expand Down
2 changes: 1 addition & 1 deletion .golangci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@ run:

linters-settings:
goimports:
local-prefixes: "github.com/NVIDIA/k8s-dra-driver"
local-prefixes: "github.com/NVIDIA/k8s-dra-driver-gpu"
6 changes: 3 additions & 3 deletions .nvidia-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,19 @@ variables:
# On the multi-arch builder we don't need the qemu setup.
SKIP_QEMU_SETUP: "1"
# Define the public staging registry
STAGING_REGISTRY: registry.gitlab.com/nvidia/cloud-native/k8s-dra-driver/staging
STAGING_REGISTRY: registry.gitlab.com/nvidia/cloud-native/k8s-dra-driver-gpu/staging
STAGING_VERSION: ${CI_COMMIT_SHORT_SHA}

.image-pull:
stage: image-build
variables:
IN_REGISTRY: "${STAGING_REGISTRY}"
IN_IMAGE_NAME: k8s-dra-driver
IN_IMAGE_NAME: k8s-dra-driver-gpu
IN_VERSION: "${STAGING_VERSION}"
OUT_REGISTRY_USER: "${CI_REGISTRY_USER}"
OUT_REGISTRY_TOKEN: "${CI_REGISTRY_PASSWORD}"
OUT_REGISTRY: "${CI_REGISTRY}"
OUT_IMAGE_NAME: "${CI_REGISTRY_IMAGE}/k8s-dra-driver"
OUT_IMAGE_NAME: "${CI_REGISTRY_IMAGE}/k8s-dra-driver-gpu"
PUSH_MULTIPLE_TAGS: "false"
# We delay the job start to allow the public pipeline to generate the required images.
when: delayed
Expand Down
70 changes: 67 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ goimports:
find . -name \*.go \
-not -name "zz_generated.deepcopy.go" \
-not -path "./vendor/*" \
-not -path "./pkg/nvidia.com/resource/clientset/versioned/*" \
-not -path "./$(PKG_BASE)/clientset/versioned/*" \
-exec goimports -local $(MODULE) -w {} \;

golangci-lint:
Expand All @@ -99,7 +99,19 @@ coverage: test
cat $(COVERAGE_FILE) | grep -v "_mock.go" > $(COVERAGE_FILE).no-mocks
go tool cover -func=$(COVERAGE_FILE).no-mocks

generate: generate-deepcopy fmt
generate: generate-crds generate-informers fmt

generate-crds: generate-deepcopy .remove-crds
for dir in $(CLIENT_SOURCES); do \
controller-gen crd:crdVersions=v1 \
paths=$(CURDIR)/$${dir} \
output:crd:dir=$(CURDIR)/deployments/helm/tmp_crds; \
done
mkdir -p $(CURDIR)/deployments/helm/$(HELM_DRIVER_NAME)/crds
cp -R $(CURDIR)/deployments/helm/tmp_crds/* \
$(CURDIR)/deployments/helm/$(HELM_DRIVER_NAME)/crds
rm -rf $(CURDIR)/deployments/helm/tmp_crds


generate-deepcopy: .remove-deepcopy
for dir in $(DEEPCOPY_SOURCES); do \
Expand All @@ -109,14 +121,66 @@ generate-deepcopy: .remove-deepcopy
output:object:dir=$(CURDIR)/$${dir}; \
done

generate-informers: .remove-informers generate-listers
informer-gen \
--go-header-file=$(CURDIR)/hack/boilerplate.go.txt \
--output-package "$(MODULE)/$(PKG_BASE)/informers" \
--input-dirs "$(shell for api in $(CLIENT_APIS); do echo -n "$(MODULE)/$(API_BASE)/$$api,"; done | sed 's/,$$//')" \
--output-base "$(CURDIR)/pkg/tmp_informers" \
--versioned-clientset-package "$(MODULE)/$(PKG_BASE)/clientset/versioned" \
--listers-package "$(MODULE)/$(PKG_BASE)/listers"
mkdir -p $(CURDIR)/$(PKG_BASE)
mv $(CURDIR)/pkg/tmp_informers/$(MODULE)/$(PKG_BASE)/informers \
$(CURDIR)/$(PKG_BASE)/informers
rm -rf $(CURDIR)/pkg/tmp_informers

generate-listers: .remove-listers generate-clientset
lister-gen \
--go-header-file=$(CURDIR)/hack/boilerplate.go.txt \
--output-package "$(MODULE)/$(PKG_BASE)/listers" \
--input-dirs "$(shell for api in $(CLIENT_APIS); do echo -n "$(MODULE)/$(API_BASE)/$$api,"; done | sed 's/,$$//')" \
--output-base "$(CURDIR)/pkg/tmp_listers"
mkdir -p $(CURDIR)/$(PKG_BASE)
mv $(CURDIR)/pkg/tmp_listers/$(MODULE)/$(PKG_BASE)/listers \
$(CURDIR)/$(PKG_BASE)/listers
rm -rf $(CURDIR)/pkg/tmp_listers

generate-clientset: .remove-clientset
client-gen \
--go-header-file=$(CURDIR)/hack/boilerplate.go.txt \
--clientset-name "versioned" \
--build-tag "ignore_autogenerated" \
--output-package "$(MODULE)/$(PKG_BASE)/clientset" \
--input-base "$(MODULE)/$(API_BASE)" \
--output-base "$(CURDIR)/pkg/tmp_clientset" \
--input "$(shell echo $(CLIENT_APIS) | tr ' ' ',')" \
--plural-exceptions "$(shell echo $(PLURAL_EXCEPTIONS) | tr ' ' ',')"
mkdir -p $(CURDIR)/$(PKG_BASE)
mv $(CURDIR)/pkg/tmp_clientset/$(MODULE)/$(PKG_BASE)/clientset \
$(CURDIR)/$(PKG_BASE)/clientset
rm -rf $(CURDIR)/pkg/tmp_clientset

.remove-crds:
rm -rf $(CURDIR)/deployments/helm/$(HELM_DRIVER_NAME)/crds

.remove-deepcopy:
for dir in $(DEEPCOPY_SOURCES); do \
rm -f $(CURDIR)/$${dir}/zz_generated.deepcopy.go; \
done

.remove-clientset:
rm -rf $(CURDIR)/$(PKG_BASE)/clientset

.remove-listers:
rm -rf $(CURDIR)/$(PKG_BASE)/listers

.remove-informers:
rm -rf $(CURDIR)/$(PKG_BASE)/informers

# Generate an image for containerized builds
# Note: This image is local only
.PHONY: .build-image
.PHONY: .build-image build-image
build-image: .build-image
.build-image:
make -f deployments/devel/Makefile .build-image

Expand Down
13 changes: 6 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,10 @@ subdirectory, so take a moment to browse through the various files and see
what's available:

```console
git clone https://github.com/NVIDIA/k8s-dra-driver.git
git clone https://github.com/NVIDIA/k8s-dra-driver-gpu.git
```
```console
cd k8s-dra-driver
cd k8s-dra-driver-gpu
```

### Setting up the infrastructure
Expand All @@ -76,9 +76,8 @@ This should show two pods running in the `nvidia` namespace:
kubectl get pods -n nvidia
```
```
NAME READY STATUS RESTARTS AGE
nvidia-dra-driver-k8s-dra-driver-controller-844fcb94b-ktbkc 1/1 Running 0 69s
nvidia-dra-driver-k8s-dra-driver-kubelet-plugin-5vfp9 1/1 Running 0 69s
NAME READY STATUS RESTARTS AGE
k8s-dra-driver-gpu-kubelet-plugin-5vfp9 1/1 Running 0 69s
```

### Run the examples by following the steps in the demo script
Expand Down Expand Up @@ -144,10 +143,10 @@ This may include the following content from the original scripts:
```
set -e

export VERSION=v0.1.0
export VERSION=v25.2.0

REGISTRY=nvcr.io/nvidia/cloud-native
IMAGE=k8s-dra-driver
IMAGE=k8s-dra-driver-gpu
PLATFORM=ubi9

sudo true
Expand Down
49 changes: 0 additions & 49 deletions api/nvidia.com/resource/gpu/v1alpha1/imexchannelconfig.go

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package v1alpha1
package v1beta1

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand All @@ -24,12 +24,14 @@ import (
)

const (
GroupName = "gpu.nvidia.com"
Version = "v1alpha1"
GroupName = "resource.nvidia.com"
Version = "v1beta1"

GpuConfigKind = "GpuConfig"
MigDeviceConfigKind = "MigDeviceConfig"
ImexChannelConfigKind = "ImexChannelConfig"
GpuConfigKind = "GpuConfig"
MigDeviceConfigKind = "MigDeviceConfig"
ComputeDomainChannelConfigKind = "ComputeDomainChannelConfig"
ComputeDomainDaemonConfigKind = "ComputeDomainDaemonConfig"
ComputeDomainKind = "ComputeDomain"
)

// Interface defines the set of common APIs for all configs
Expand All @@ -55,7 +57,9 @@ func init() {
scheme.AddKnownTypes(schemeGroupVersion,
&GpuConfig{},
&MigDeviceConfig{},
&ImexChannelConfig{},
&ComputeDomainChannelConfig{},
&ComputeDomainDaemonConfig{},
&ComputeDomain{},
)
metav1.AddToGroupVersion(scheme, schemeGroupVersion)

Expand Down
86 changes: 86 additions & 0 deletions api/nvidia.com/resource/v1beta1/computedomain.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package v1beta1

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

const (
ComputeDomainStatusReady = "Ready"
ComputeDomainStatusNotReady = "NotReady"
)

// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// +k8s:openapi-gen=true
// +kubebuilder:resource:scope=Namespaced
// +kubebuilder:subresource:status

// ComputeDomain prepares a set of nodes to run a multi-node workload in.
type ComputeDomain struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`

Spec ComputeDomainSpec `json:"spec,omitempty"`
Status ComputeDomainStatus `json:"status,omitempty"`
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// ComputeDomainList provides a list of ComputeDomains.
type ComputeDomainList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`

Items []ComputeDomain `json:"items"`
}

// +kubebuilder:validation:XValidation:rule="self == oldSelf", message="A computeDomain.spec is immutable"

// ComputeDomainSpec provides the spec for a ComputeDomain.
type ComputeDomainSpec struct {
NumNodes int `json:"numNodes"`
Channel *ComputeDomainChannelSpec `json:"channel"`
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should channel be optional thinking on non imex use cases in the future, I know currently we are solely focused on imex support, but if we want to carry on the concept of computeDomain, we might face clusters without imex (channels)

}

// ComputeDomainChannelSpec provides the spec for a channel used to run a workload inside a ComputeDomain.
type ComputeDomainChannelSpec struct {
ResourceClaimTemplate ComputeDomainResourceClaimTemplate `json:"resourceClaimTemplate"`
}

// ComputeDomainResourceClaimTemplate provides the details of the ResourceClaimTemplate to generate.
type ComputeDomainResourceClaimTemplate struct {
Name string `json:"name"`
}

// ComputeDomainStatus provides the status for a ComputeDomain.
type ComputeDomainStatus struct {
// +kubebuilder:validation:Enum=Ready;NotReady
// +kubebuilder:default=NotReady
Status string `json:"status"`
// +listType=map
// +listMapKey=name
Nodes []*ComputeDomainNode `json:"nodes,omitempty"`
}

// ComputeDomainNode provides information about each node added to a ComputeDomain.
type ComputeDomainNode struct {
Name string `json:"name"`
IPAddress string `json:"ipAddress"`
CliqueID string `json:"cliqueID"`
}
Loading
Loading