@@ -96,6 +96,7 @@ func TestApp(t *testing.T) {
9696 require .NoError (t , err )
9797
9898 artifactRoot := filepath .Join (moduleRoot , "testdata" , "installer" , "artifacts" )
99+ hostRoot := filepath .Join (moduleRoot , "testdata" , "lookup" , "rootfs-1" )
99100
100101 testCases := []struct {
101102 description string
@@ -163,12 +164,303 @@ swarm-resource = ""
163164 }
164165}` ,
165166 },
167+ {
168+ description : "CDI enabled enables CDI in docker" ,
169+ args : []string {"--cdi-enabled" , "--create-device-nodes=none" },
170+ expectedToolkitConfig : `accept-nvidia-visible-devices-as-volume-mounts = false
171+ accept-nvidia-visible-devices-envvar-when-unprivileged = true
172+ disable-require = false
173+ supported-driver-capabilities = "compat32,compute,display,graphics,ngx,utility,video"
174+ swarm-resource = ""
175+
176+ [nvidia-container-cli]
177+ debug = ""
178+ environment = []
179+ ldcache = ""
180+ ldconfig = "@/run/nvidia/driver/sbin/ldconfig"
181+ load-kmods = true
182+ no-cgroups = false
183+ path = "{{ .toolkitRoot }}/toolkit/nvidia-container-cli"
184+ root = "/run/nvidia/driver"
185+ user = ""
186+
187+ [nvidia-container-runtime]
188+ debug = "/dev/null"
189+ log-level = "info"
190+ mode = "auto"
191+ runtimes = ["docker-runc", "runc", "crun"]
192+
193+ [nvidia-container-runtime.modes]
194+
195+ [nvidia-container-runtime.modes.cdi]
196+ annotation-prefixes = ["cdi.k8s.io/"]
197+ default-kind = "nvidia.com/gpu"
198+ spec-dirs = ["/etc/cdi", "/var/run/cdi"]
199+
200+ [nvidia-container-runtime.modes.csv]
201+ mount-spec-path = "/etc/nvidia-container-runtime/host-files-for-container.d"
202+
203+ [nvidia-container-runtime-hook]
204+ path = "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime-hook"
205+ skip-mode-detection = true
206+
207+ [nvidia-ctk]
208+ path = "{{ .toolkitRoot }}/toolkit/nvidia-ctk"
209+ ` ,
210+ expectedRuntimeConfig : `{
211+ "default-runtime": "nvidia",
212+ "features": {
213+ "cdi": true
214+ },
215+ "runtimes": {
216+ "nvidia": {
217+ "args": [],
218+ "path": "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime"
219+ },
220+ "nvidia-cdi": {
221+ "args": [],
222+ "path": "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime.cdi"
223+ },
224+ "nvidia-legacy": {
225+ "args": [],
226+ "path": "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime.legacy"
227+ }
228+ }
229+ }` ,
230+ },
231+ {
232+ description : "--enable-cdi-in-runtime=false overrides --cdi-enabled in Docker" ,
233+ args : []string {"--cdi-enabled" , "--create-device-nodes=none" , "--enable-cdi-in-runtime=false" },
234+ expectedToolkitConfig : `accept-nvidia-visible-devices-as-volume-mounts = false
235+ accept-nvidia-visible-devices-envvar-when-unprivileged = true
236+ disable-require = false
237+ supported-driver-capabilities = "compat32,compute,display,graphics,ngx,utility,video"
238+ swarm-resource = ""
239+
240+ [nvidia-container-cli]
241+ debug = ""
242+ environment = []
243+ ldcache = ""
244+ ldconfig = "@/run/nvidia/driver/sbin/ldconfig"
245+ load-kmods = true
246+ no-cgroups = false
247+ path = "{{ .toolkitRoot }}/toolkit/nvidia-container-cli"
248+ root = "/run/nvidia/driver"
249+ user = ""
250+
251+ [nvidia-container-runtime]
252+ debug = "/dev/null"
253+ log-level = "info"
254+ mode = "auto"
255+ runtimes = ["docker-runc", "runc", "crun"]
256+
257+ [nvidia-container-runtime.modes]
258+
259+ [nvidia-container-runtime.modes.cdi]
260+ annotation-prefixes = ["cdi.k8s.io/"]
261+ default-kind = "nvidia.com/gpu"
262+ spec-dirs = ["/etc/cdi", "/var/run/cdi"]
263+
264+ [nvidia-container-runtime.modes.csv]
265+ mount-spec-path = "/etc/nvidia-container-runtime/host-files-for-container.d"
266+
267+ [nvidia-container-runtime-hook]
268+ path = "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime-hook"
269+ skip-mode-detection = true
270+
271+ [nvidia-ctk]
272+ path = "{{ .toolkitRoot }}/toolkit/nvidia-ctk"
273+ ` ,
274+ expectedRuntimeConfig : `{
275+ "default-runtime": "nvidia",
276+ "runtimes": {
277+ "nvidia": {
278+ "args": [],
279+ "path": "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime"
280+ },
281+ "nvidia-cdi": {
282+ "args": [],
283+ "path": "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime.cdi"
284+ },
285+ "nvidia-legacy": {
286+ "args": [],
287+ "path": "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime.legacy"
288+ }
289+ }
290+ }` ,
291+ },
292+ {
293+ description : "CDI enabled enables CDI in containerd" ,
294+ args : []string {"--cdi-enabled" , "--runtime=containerd" },
295+ expectedToolkitConfig : `accept-nvidia-visible-devices-as-volume-mounts = false
296+ accept-nvidia-visible-devices-envvar-when-unprivileged = true
297+ disable-require = false
298+ supported-driver-capabilities = "compat32,compute,display,graphics,ngx,utility,video"
299+ swarm-resource = ""
300+
301+ [nvidia-container-cli]
302+ debug = ""
303+ environment = []
304+ ldcache = ""
305+ ldconfig = "@/run/nvidia/driver/sbin/ldconfig"
306+ load-kmods = true
307+ no-cgroups = false
308+ path = "{{ .toolkitRoot }}/toolkit/nvidia-container-cli"
309+ root = "/run/nvidia/driver"
310+ user = ""
311+
312+ [nvidia-container-runtime]
313+ debug = "/dev/null"
314+ log-level = "info"
315+ mode = "auto"
316+ runtimes = ["docker-runc", "runc", "crun"]
317+
318+ [nvidia-container-runtime.modes]
319+
320+ [nvidia-container-runtime.modes.cdi]
321+ annotation-prefixes = ["cdi.k8s.io/"]
322+ default-kind = "nvidia.com/gpu"
323+ spec-dirs = ["/etc/cdi", "/var/run/cdi"]
324+
325+ [nvidia-container-runtime.modes.csv]
326+ mount-spec-path = "/etc/nvidia-container-runtime/host-files-for-container.d"
327+
328+ [nvidia-container-runtime-hook]
329+ path = "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime-hook"
330+ skip-mode-detection = true
331+
332+ [nvidia-ctk]
333+ path = "{{ .toolkitRoot }}/toolkit/nvidia-ctk"
334+ ` ,
335+ expectedRuntimeConfig : `version = 2
336+
337+ [plugins]
338+
339+ [plugins."io.containerd.grpc.v1.cri"]
340+ enable_cdi = true
341+
342+ [plugins."io.containerd.grpc.v1.cri".containerd]
343+ default_runtime_name = "nvidia"
344+
345+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
346+
347+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
348+ privileged_without_host_devices = false
349+ runtime_engine = ""
350+ runtime_root = ""
351+ runtime_type = "io.containerd.runc.v2"
352+
353+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
354+ BinaryName = "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime"
355+
356+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia-cdi]
357+ privileged_without_host_devices = false
358+ runtime_engine = ""
359+ runtime_root = ""
360+ runtime_type = "io.containerd.runc.v2"
361+
362+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia-cdi.options]
363+ BinaryName = "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime.cdi"
364+
365+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia-legacy]
366+ privileged_without_host_devices = false
367+ runtime_engine = ""
368+ runtime_root = ""
369+ runtime_type = "io.containerd.runc.v2"
370+
371+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia-legacy.options]
372+ BinaryName = "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime.legacy"
373+ ` ,
374+ },
375+ {
376+ description : "--enable-cdi-in-runtime=false overrides --cdi-enabled in containerd" ,
377+ args : []string {"--cdi-enabled" , "--create-device-nodes=none" , "--enable-cdi-in-runtime=false" , "--runtime=containerd" },
378+ expectedToolkitConfig : `accept-nvidia-visible-devices-as-volume-mounts = false
379+ accept-nvidia-visible-devices-envvar-when-unprivileged = true
380+ disable-require = false
381+ supported-driver-capabilities = "compat32,compute,display,graphics,ngx,utility,video"
382+ swarm-resource = ""
383+
384+ [nvidia-container-cli]
385+ debug = ""
386+ environment = []
387+ ldcache = ""
388+ ldconfig = "@/run/nvidia/driver/sbin/ldconfig"
389+ load-kmods = true
390+ no-cgroups = false
391+ path = "{{ .toolkitRoot }}/toolkit/nvidia-container-cli"
392+ root = "/run/nvidia/driver"
393+ user = ""
394+
395+ [nvidia-container-runtime]
396+ debug = "/dev/null"
397+ log-level = "info"
398+ mode = "auto"
399+ runtimes = ["docker-runc", "runc", "crun"]
400+
401+ [nvidia-container-runtime.modes]
402+
403+ [nvidia-container-runtime.modes.cdi]
404+ annotation-prefixes = ["cdi.k8s.io/"]
405+ default-kind = "nvidia.com/gpu"
406+ spec-dirs = ["/etc/cdi", "/var/run/cdi"]
407+
408+ [nvidia-container-runtime.modes.csv]
409+ mount-spec-path = "/etc/nvidia-container-runtime/host-files-for-container.d"
410+
411+ [nvidia-container-runtime-hook]
412+ path = "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime-hook"
413+ skip-mode-detection = true
414+
415+ [nvidia-ctk]
416+ path = "{{ .toolkitRoot }}/toolkit/nvidia-ctk"
417+ ` ,
418+ expectedRuntimeConfig : `version = 2
419+
420+ [plugins]
421+
422+ [plugins."io.containerd.grpc.v1.cri"]
423+
424+ [plugins."io.containerd.grpc.v1.cri".containerd]
425+ default_runtime_name = "nvidia"
426+
427+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
428+
429+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
430+ privileged_without_host_devices = false
431+ runtime_engine = ""
432+ runtime_root = ""
433+ runtime_type = "io.containerd.runc.v2"
434+
435+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
436+ BinaryName = "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime"
437+
438+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia-cdi]
439+ privileged_without_host_devices = false
440+ runtime_engine = ""
441+ runtime_root = ""
442+ runtime_type = "io.containerd.runc.v2"
443+
444+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia-cdi.options]
445+ BinaryName = "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime.cdi"
446+
447+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia-legacy]
448+ privileged_without_host_devices = false
449+ runtime_engine = ""
450+ runtime_root = ""
451+ runtime_type = "io.containerd.runc.v2"
452+
453+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia-legacy.options]
454+ BinaryName = "{{ .toolkitRoot }}/toolkit/nvidia-container-runtime.legacy"
455+ ` ,
456+ },
166457 }
167458
168459 for _ , tc := range testCases {
169460 t .Run (tc .description , func (t * testing.T ) {
170461 testRoot := t .TempDir ()
171462
463+ cdiOutputDir := filepath .Join (testRoot , "/var/run/cdi" )
172464 runtimeConfigFile := filepath .Join (testRoot , "config.file" )
173465
174466 toolkitRoot := filepath .Join (testRoot , "toolkit-test" )
@@ -179,10 +471,13 @@ swarm-resource = ""
179471 testArgs := []string {
180472 "nvidia-ctk-installer" ,
181473 "--no-daemon" ,
182- "--pid-file=" + filepath .Join (testRoot , "toolkit.pid" ),
183- "--source-root=" + filepath .Join (artifactRoot , "deb" ),
474+ "--cdi-output-dir=" + cdiOutputDir ,
184475 "--config=" + runtimeConfigFile ,
476+ "--create-device-nodes=none" ,
477+ "--driver-root-ctr-path=" + hostRoot ,
478+ "--pid-file=" + filepath .Join (testRoot , "toolkit.pid" ),
185479 "--restart-mode=none" ,
480+ "--source-root=" + filepath .Join (artifactRoot , "deb" ),
186481 }
187482
188483 err := app .Run (append (testArgs , tc .args ... ))
0 commit comments