Skip to content

Commit

Permalink
Add placeholder for Delayed vs. Immediate and ResourceClaimNames a list
Browse files Browse the repository at this point in the history
Signed-off-by: Kevin Klues <[email protected]>
  • Loading branch information
klueska committed Jan 24, 2025
1 parent d17ee67 commit c8b9975
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 15 deletions.
17 changes: 15 additions & 2 deletions api/nvidia.com/resource/v1beta1/computedomain.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

const (
ComputeModeImmediate = "Immediate"
ComputeModeDelayed = "Delayed"
)

// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// +k8s:openapi-gen=true
Expand All @@ -46,13 +51,21 @@ type ComputeDomainList struct {
Items []ComputeDomain `json:"items"`
}

// +kubebuilder:validation:XValidation:rule="(has(self.resourceClaimName) ? !has(self.deviceClassName) : has(self.deviceClassName))",message="Exactly one of 'resourceClaimName' or 'deviceClassName' must be set."
// +kubebuilder:validation:XValidation:rule="has(self.deviceClassName) || size(self.resourceClaimNames) > 0",message="At least one name must be specified in 'resourceClaimNames' if 'deviceClassName' is not specified."
// +kubebuilder:validation:XValidation:rule="self.mode != 'Delayed'",message="'Delayed' mode is not yet supported."
// +kubebuilder:validation:XValidation:rule="self.mode == 'Immediate' || (self.mode == 'Delayed' && size(self.resourceClaimNames) == 1)",message="When 'mode' is 'Delayed', 'resourceClaimNames' must have exactly one entry."
// +kubebuilder:validation:XValidation:rule="self.mode == 'Immediate' || (self.mode == 'Delayed' && !has(self.nodeSelector))",message="When 'mode' is 'Delayed', 'NodeSelector' must not be set."
// +kubebuilder:validation:XValidation:rule="self.mode == 'Immediate' || (self.mode == 'Delayed' && !has(self.topologyAlignment))",message="When 'mode' is 'Delayed', 'TopologyAlignment' must not be set."
// +kubebuilder:validation:XValidation:rule="self.mode == 'Immediate' || (self.mode == 'Delayed' && !has(self.topologyAntiAlignment))",message="When 'mode' is 'Delayed', 'TopologyAntiAlignment' must not be set."

// ComputeDomainSpec provides the spec for a ComputeDomain.
type ComputeDomainSpec struct {
// +kubebuilder:validation:Enum=Immediate;Delayed
// +kubebuilder:default=Immediate
Mode string `json:"mode"`
NumNodes int `json:"numNodes"`
ResourceClaimName string `json:"resourceClaimName,omitempty"`
DeviceClassName string `json:"deviceClassName,omitempty"`
ResourceClaimNames []string `json:"resourceClaimNames,omitempty"`
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
NodeAffinity *ComputeDomainNodeAffinity `json:"nodeAffinity,omitempty"`
TopologyAlignment *ComputeDomainTopologyAlignment `json:"topologyAlignment,omitempty"`
Expand Down
5 changes: 5 additions & 0 deletions api/nvidia.com/resource/v1beta1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 7 additions & 5 deletions cmd/nvidia-dra-imex-controller/computedomain.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,9 +180,9 @@ func (m *ComputeDomainManager) onComputeDomainAdd(ctx context.Context, obj any)
return fmt.Errorf("error creating DeviceClass: %w", err)
}

if cd.Spec.ResourceClaimName != "" {
if _, err := m.resourceClaimManager.Create(ctx, cd.Namespace, cd.Spec.ResourceClaimName, dc.Name, cd); err != nil {
return fmt.Errorf("error creating ResourceClaim '%s/%s': %w", cd.Namespace, cd.Spec.ResourceClaimName, err)
for _, name := range cd.Spec.ResourceClaimNames {
if _, err := m.resourceClaimManager.Create(ctx, cd.Namespace, name, dc.Name, cd); err != nil {
return fmt.Errorf("error creating ResourceClaim '%s/%s': %w", cd.Namespace, name, err)
}
}

Expand All @@ -205,8 +205,10 @@ func (m *ComputeDomainManager) onComputeDomainDelete(ctx context.Context, obj an
return fmt.Errorf("error deleting DeviceClass: %w", err)
}

if err := m.resourceClaimManager.Delete(ctx, string(cd.UID)); err != nil {
return fmt.Errorf("error deleting ResourceClaim '%s/%s': %w", cd.Namespace, cd.Spec.ResourceClaimName, err)
for _, name := range cd.Spec.ResourceClaimNames {
if err := m.resourceClaimManager.Delete(ctx, string(cd.UID)); err != nil {
return fmt.Errorf("error deleting ResourceClaim '%s/%s': %w", cd.Namespace, name, err)
}
}

return nil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ spec:
properties:
deviceClassName:
type: string
mode:
default: Immediate
enum:
- Immediate
- Delayed
type: string
nodeAffinity:
properties:
preferred:
Expand Down Expand Up @@ -236,8 +242,10 @@ spec:
type: object
numNodes:
type: integer
resourceClaimName:
type: string
resourceClaimNames:
items:
type: string
type: array
topologyAlignment:
properties:
preferred:
Expand Down Expand Up @@ -299,12 +307,26 @@ spec:
- message: At least one of 'preferred' or 'required' must be set.
rule: has(self.preferred) || has(self.required)
required:
- mode
- numNodes
type: object
x-kubernetes-validations:
- message: Exactly one of 'resourceClaimName' or 'deviceClassName' must
- message: At least one name must be specified in 'resourceClaimNames'
if 'deviceClassName' is not specified.
rule: has(self.deviceClassName) || size(self.resourceClaimNames) > 0
- message: '''Delayed'' mode is not yet supported.'
rule: self.mode != 'Delayed'
- message: When 'mode' is 'Delayed', 'resourceClaimNames' must have exactly
one entry.
rule: self.mode == 'Immediate' || (self.mode == 'Delayed' && size(self.resourceClaimNames)
== 1)
- message: When 'mode' is 'Delayed', 'NodeSelector' must not be set.
rule: self.mode == 'Immediate' || (self.mode == 'Delayed' && !has(self.nodeSelector))
- message: When 'mode' is 'Delayed', 'TopologyAlignment' must not be set.
rule: self.mode == 'Immediate' || (self.mode == 'Delayed' && !has(self.topologyAlignment))
- message: When 'mode' is 'Delayed', 'TopologyAntiAlignment' must not
be set.
rule: '(has(self.resourceClaimName) ? !has(self.deviceClassName) : has(self.deviceClassName))'
rule: self.mode == 'Immediate' || (self.mode == 'Delayed' && !has(self.topologyAntiAlignment))
status:
description: ComputeDomainStatus provides the status for a ComputeDomain.
properties:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ spec:
properties:
deviceClassName:
type: string
mode:
default: Immediate
enum:
- Immediate
- Delayed
type: string
nodeAffinity:
properties:
preferred:
Expand Down Expand Up @@ -236,8 +242,10 @@ spec:
type: object
numNodes:
type: integer
resourceClaimName:
type: string
resourceClaimNames:
items:
type: string
type: array
topologyAlignment:
properties:
preferred:
Expand Down Expand Up @@ -299,12 +307,26 @@ spec:
- message: At least one of 'preferred' or 'required' must be set.
rule: has(self.preferred) || has(self.required)
required:
- mode
- numNodes
type: object
x-kubernetes-validations:
- message: Exactly one of 'resourceClaimName' or 'deviceClassName' must
- message: At least one name must be specified in 'resourceClaimNames'
if 'deviceClassName' is not specified.
rule: has(self.deviceClassName) || size(self.resourceClaimNames) > 0
- message: '''Delayed'' mode is not yet supported.'
rule: self.mode != 'Delayed'
- message: When 'mode' is 'Delayed', 'resourceClaimNames' must have exactly
one entry.
rule: self.mode == 'Immediate' || (self.mode == 'Delayed' && size(self.resourceClaimNames)
== 1)
- message: When 'mode' is 'Delayed', 'NodeSelector' must not be set.
rule: self.mode == 'Immediate' || (self.mode == 'Delayed' && !has(self.nodeSelector))
- message: When 'mode' is 'Delayed', 'TopologyAlignment' must not be set.
rule: self.mode == 'Immediate' || (self.mode == 'Delayed' && !has(self.topologyAlignment))
- message: When 'mode' is 'Delayed', 'TopologyAntiAlignment' must not
be set.
rule: '(has(self.resourceClaimName) ? !has(self.deviceClassName) : has(self.deviceClassName))'
rule: self.mode == 'Immediate' || (self.mode == 'Delayed' && !has(self.topologyAntiAlignment))
status:
description: ComputeDomainStatus provides the status for a ComputeDomain.
properties:
Expand Down

0 comments on commit c8b9975

Please sign in to comment.