diff --git a/test/e2e_node/device_plugin_test.go b/test/e2e_node/device_plugin_test.go index 98db64fc40a..e16e0681af5 100644 --- a/test/e2e_node/device_plugin_test.go +++ b/test/e2e_node/device_plugin_test.go @@ -37,6 +37,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/serializer" k8stypes "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" + utilfeature "k8s.io/apiserver/pkg/util/feature" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1" kubeletdevicepluginv1beta1 "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1" admissionapi "k8s.io/pod-security-admission/api" @@ -47,9 +48,11 @@ import ( "k8s.io/kubectl/pkg/util/podutils" kubeletpodresourcesv1 "k8s.io/kubelet/pkg/apis/podresources/v1" kubeletpodresourcesv1alpha1 "k8s.io/kubelet/pkg/apis/podresources/v1alpha1" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/test/e2e/framework" e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2epod "k8s.io/kubernetes/test/e2e/framework/pod" + e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2etestfiles "k8s.io/kubernetes/test/e2e/framework/testfiles" ) @@ -239,6 +242,16 @@ func testDevicePlugin(f *framework.Framework, pluginSockDir string) { gomega.Expect(v1ResourcesForOurPod.Containers[0].Devices[0].DeviceIds).To(gomega.HaveLen(1)) }) + ginkgo.It("can make a CDI device accessible in a container", func(ctx context.Context) { + e2eskipper.SkipUnlessFeatureGateEnabled(features.DevicePluginCDIDevices) + // check if CDI_DEVICE env variable is set + // and only one correspondent device node /tmp/ is available inside a container + podObj := makeBusyboxPod(SampleDeviceResourceName, "[ $(ls /tmp/CDI-Dev-[1,2] | wc -l) -eq 1 -a -b /tmp/$CDI_DEVICE ]") + podObj.Spec.RestartPolicy = v1.RestartPolicyNever + pod := e2epod.NewPodClient(f).Create(ctx, podObj) + framework.ExpectNoError(e2epod.WaitForPodSuccessInNamespace(ctx, f.ClientSet, pod.Name, pod.Namespace)) + }) + // simulate container restart, while all other involved components (kubelet, device plugin) stay stable. To do so, in the container // entry point we sleep for a limited and short period of time. The device assignment should be kept and be stable across the container // restarts. For the sake of brevity we however check just the fist restart. @@ -906,6 +919,10 @@ func getSampleDevicePluginPod(pluginSockDir string) *v1.Pod { } } + if utilfeature.DefaultFeatureGate.Enabled(features.DevicePluginCDIDevices) { + dp.Spec.Containers[0].Env = append(dp.Spec.Containers[0].Env, v1.EnvVar{Name: "CDI_ENABLED", Value: "1"}) + } + return dp }