Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions api/nvidia/v1/clusterpolicy_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,21 @@ type DaemonsetsSpec struct {
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors.x-descriptors="urn:alm:descriptor:com.tectonic.ui:advanced,urn:alm:descriptor:io.kubernetes:Tolerations"
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`

// Optional: Set nodeSelector merged with operand nodeSelector labels
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors.displayName="NodeSelector for all Daemonsets"
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors.x-descriptors="urn:alm:descriptor:com.tectonic.ui:advanced,urn:alm:descriptor:com.tectonic.ui:nodeSelector"
NodeSelector map[string]string `json:"nodeSelector,omitempty"`

// Optional: Set affinity for all Daemonsets
// +kubebuilder:validation:Type=object
// +kubebuilder:validation:Schemaless
// +kubebuilder:pruning:PreserveUnknownFields
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors.displayName="Affinity for all Daemonsets"
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors.x-descriptors="urn:alm:descriptor:com.tectonic.ui:advanced,urn:alm:descriptor:com.tectonic.ui:affinity"
Affinity *corev1.Affinity `json:"affinity,omitempty"`

// +kubebuilder:validation:Optional
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors=true
// +operator-sdk:gen-csv:customresourcedefinitions.specDescriptors.displayName="PriorityClassName"
Expand Down
12 changes: 12 additions & 0 deletions api/nvidia/v1/zz_generated.deepcopy.go

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

10 changes: 10 additions & 0 deletions bundle/manifests/nvidia.com_clusterpolicies.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,10 @@ spec:
daemonsets:
description: Daemonset defines common configuration for all Daemonsets
properties:
affinity:
description: 'Optional: Set affinity for all Daemonsets'
type: object
x-kubernetes-preserve-unknown-fields: true
annotations:
additionalProperties:
type: string
Expand All @@ -176,6 +180,12 @@ spec:
(scope and select) objects. May match selectors of replication controllers
and services.
type: object
nodeSelector:
additionalProperties:
type: string
description: 'Optional: Set nodeSelector merged with operand nodeSelector
labels'
type: object
podSecurityContext:
description: 'Optional: Set pod-level security context for all
DaemonSet pods (applies as defaults to all containers)'
Expand Down
10 changes: 10 additions & 0 deletions config/crd/bases/nvidia.com_clusterpolicies.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,10 @@ spec:
daemonsets:
description: Daemonset defines common configuration for all Daemonsets
properties:
affinity:
description: 'Optional: Set affinity for all Daemonsets'
type: object
x-kubernetes-preserve-unknown-fields: true
annotations:
additionalProperties:
type: string
Expand All @@ -176,6 +180,12 @@ spec:
(scope and select) objects. May match selectors of replication controllers
and services.
type: object
nodeSelector:
additionalProperties:
type: string
description: 'Optional: Set nodeSelector merged with operand nodeSelector
labels'
type: object
podSecurityContext:
description: 'Optional: Set pod-level security context for all
DaemonSet pods (applies as defaults to all containers)'
Expand Down
13 changes: 13 additions & 0 deletions controllers/object_controls.go
Original file line number Diff line number Diff line change
Expand Up @@ -812,6 +812,19 @@ func applyCommonDaemonsetConfig(obj *appsv1.DaemonSet, config *gpuv1.ClusterPoli
obj.Spec.Template.Spec.Tolerations = config.Daemonsets.Tolerations
}

if len(config.Daemonsets.NodeSelector) > 0 {
if obj.Spec.Template.Spec.NodeSelector == nil {
obj.Spec.Template.Spec.NodeSelector = make(map[string]string)
}
for key, value := range config.Daemonsets.NodeSelector {
obj.Spec.Template.Spec.NodeSelector[key] = value
}
}

if config.Daemonsets.Affinity != nil {
obj.Spec.Template.Spec.Affinity = config.Daemonsets.Affinity
}

// set pod-level security context if specified (applies as defaults to all containers in the pod)
if config.Daemonsets.PodSecurityContext != nil {
obj.Spec.Template.Spec.SecurityContext = config.Daemonsets.PodSecurityContext
Expand Down
65 changes: 65 additions & 0 deletions controllers/transforms_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,16 @@ func (d Daemonset) WithTolerations(tolerations []corev1.Toleration) Daemonset {
return d
}

func (d Daemonset) WithNodeSelector(nodeSelector map[string]string) Daemonset {
d.Spec.Template.Spec.NodeSelector = nodeSelector
return d
}

func (d Daemonset) WithAffinity(affinity *corev1.Affinity) Daemonset {
d.Spec.Template.Spec.Affinity = affinity
return d
}

func (d Daemonset) WithPodSecurityContext(psc *corev1.PodSecurityContext) Daemonset {
d.Spec.Template.Spec.SecurityContext = psc
return d
Expand Down Expand Up @@ -689,6 +699,61 @@ func TestApplyCommonDaemonSetConfig(t *testing.T) {
},
}),
},
{
description: "nodeSelector configured",
ds: NewDaemonset().WithNodeSelector(map[string]string{
"nvidia.com/gpu.deploy.device-plugin": "true",
}),
dsSpec: gpuv1.DaemonsetsSpec{
NodeSelector: map[string]string{
"karpenter.sh/nodepool": "gpu",
},
},
expectedDs: NewDaemonset().WithNodeSelector(map[string]string{
"nvidia.com/gpu.deploy.device-plugin": "true",
"karpenter.sh/nodepool": "gpu",
}),
},
{
description: "affinity configured",
ds: NewDaemonset(),
dsSpec: gpuv1.DaemonsetsSpec{
Affinity: &corev1.Affinity{
NodeAffinity: &corev1.NodeAffinity{
RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
NodeSelectorTerms: []corev1.NodeSelectorTerm{
{
MatchExpressions: []corev1.NodeSelectorRequirement{
{
Key: "karpenter.sh/nodepool",
Operator: corev1.NodeSelectorOpIn,
Values: []string{"gpu"},
},
},
},
},
},
},
},
},
expectedDs: NewDaemonset().WithAffinity(&corev1.Affinity{
NodeAffinity: &corev1.NodeAffinity{
RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
NodeSelectorTerms: []corev1.NodeSelectorTerm{
{
MatchExpressions: []corev1.NodeSelectorRequirement{
{
Key: "karpenter.sh/nodepool",
Operator: corev1.NodeSelectorOpIn,
Values: []string{"gpu"},
},
},
},
},
},
},
}),
},
{
description: "invalid updatestrategy configured",
ds: NewDaemonset(),
Expand Down
10 changes: 10 additions & 0 deletions deployments/gpu-operator/crds/nvidia.com_clusterpolicies.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,10 @@ spec:
daemonsets:
description: Daemonset defines common configuration for all Daemonsets
properties:
affinity:
description: 'Optional: Set affinity for all Daemonsets'
type: object
x-kubernetes-preserve-unknown-fields: true
annotations:
additionalProperties:
type: string
Expand All @@ -176,6 +180,12 @@ spec:
(scope and select) objects. May match selectors of replication controllers
and services.
type: object
nodeSelector:
additionalProperties:
type: string
description: 'Optional: Set nodeSelector merged with operand nodeSelector
labels'
type: object
podSecurityContext:
description: 'Optional: Set pod-level security context for all
DaemonSet pods (applies as defaults to all containers)'
Expand Down
6 changes: 6 additions & 0 deletions deployments/gpu-operator/templates/clusterpolicy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ spec:
{{- if .Values.daemonsets.tolerations }}
tolerations: {{ toYaml .Values.daemonsets.tolerations | nindent 6 }}
{{- end }}
{{- if .Values.daemonsets.nodeSelector }}
nodeSelector: {{ toYaml .Values.daemonsets.nodeSelector | nindent 6 }}
{{- end }}
{{- if .Values.daemonsets.affinity }}
affinity: {{ toYaml .Values.daemonsets.affinity | nindent 6 }}
{{- end }}
{{- if .Values.daemonsets.priorityClassName }}
priorityClassName: {{ .Values.daemonsets.priorityClassName }}
{{- end }}
Expand Down
2 changes: 2 additions & 0 deletions deployments/gpu-operator/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ hostPaths:
daemonsets:
labels: {}
annotations: {}
nodeSelector: {}
affinity: {}
priorityClassName: system-node-critical
tolerations:
- key: nvidia.com/gpu
Expand Down