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
11 changes: 1 addition & 10 deletions deployments/helm/nvidia-device-plugin/templates/validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
{{- fail $error }}
{{- end }}

{{- if and (eq (include "nvidia-device-plugin.namespace" .) "default") ( eq .Values.namespaceOverride "") (not .Values.allowDefaultNamespace) }}
{{- if and (eq (include "nvidia-device-plugin.namespace" .) "default") (not .Values.allowDefaultNamespace) }}
{{- $error := "" }}
{{- $error = printf "%s\nRunning in the 'default' namespace is not recommended." $error }}
{{- $error = printf "%s\nSet 'allowDefaultNamespace=true' to bypass this error." $error }}
Expand All @@ -37,12 +37,3 @@
{{- $error = printf "%s\nFallbacks are attempted in order and the current set is %s." $error .Values.config.fallbackStrategies }}
{{- fail $error }}
{{- end }}

{{- if and (eq .Release.Namespace "default") (not .Values.allowDefaultNamespace) }}
{{- $error := "" }}
{{- $error = printf "%s\nRunning in the 'default' namespace is not recommended." $error }}
{{- $error = printf "%s\nSet 'allowDefaultNamespace=true' to bypass this error." $error }}
{{- $error = printf "%s\nOtherwise, use --namespace (with --create-namespace as necessary) to run in a specific namespace." $error }}
{{- $error = printf "%s\nSee: https://helm.sh/docs/helm/helm_install/#options" $error }}
{{- fail $error }}
{{- end }}
74 changes: 74 additions & 0 deletions tests/helm/helm_template_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,80 @@ func TestDevicePluginDaemonsetTemplateRenderedDeployment(t *testing.T) {
}
}

func TestDevicePluginNamespaceValidation(t *testing.T) {
helmChartPath, err := filepath.Abs("../../deployments/helm/nvidia-device-plugin")
require.NoError(t, err)

testCases := []struct {
description string
releaseNamespace string
namespaceOverride string
expectedNamespace string
}{
{
description: "default release without override",
releaseNamespace: "default",
expectedNamespace: "default",
},
{
description: "non-default release without override",
releaseNamespace: "gpu-system",
expectedNamespace: "gpu-system",
},
{
description: "override default release with non-default namespace",
releaseNamespace: "default",
namespaceOverride: "gpu-system",
expectedNamespace: "gpu-system",
},
{
description: "override non-default release with default namespace",
releaseNamespace: "gpu-system",
namespaceOverride: "default",
expectedNamespace: "default",
},
{
description: "override default release with default namespace",
releaseNamespace: "default",
namespaceOverride: "default",
expectedNamespace: "default",
},
{
description: "override non-default release with another namespace",
releaseNamespace: "gpu-system",
namespaceOverride: "device-plugin",
expectedNamespace: "device-plugin",
},
}

for _, tc := range testCases {
for _, allowDefaultNamespace := range []bool{false, true} {
t.Run(fmt.Sprintf("%s/allowDefaultNamespace=%t", tc.description, allowDefaultNamespace), func(t *testing.T) {
options := &helm.Options{
SetValues: map[string]string{
"namespaceOverride": tc.namespaceOverride,
"allowDefaultNamespace": fmt.Sprint(allowDefaultNamespace),
},
KubectlOptions: k8s.NewKubectlOptions("", "", tc.releaseNamespace),
Logger: logger.Discard,
}

output, err := helm.RenderTemplateE(t, options, helmChartPath, "nvidia-device-plugin", []string{"templates/daemonset-device-plugin.yml"})
if tc.expectedNamespace == "default" && !allowDefaultNamespace {
require.ErrorContains(t, err, "Running in the 'default' namespace is not recommended.")
require.ErrorContains(t, err, "Set 'allowDefaultNamespace=true' to bypass this error.")
return
}
require.NoError(t, err)

var daemonSet appsv1.DaemonSet
helm.UnmarshalK8SYaml(t, output, &daemonSet)
require.Equal(t, tc.expectedNamespace, daemonSet.Namespace)
})
}
}
}

// prt returns a reference to whatever type is passed into it
func ptr[T any](x T) *T {
return &x
Expand Down