vuls: init at 0.27.0
[NixPkgs.git] / nixos / tests / nvidia-container-toolkit.nix
blobb22b989c0814f98348f6700b6bf0199f21374810
1 { pkgs, lib, ... }:
2 let
3   testCDIScript = pkgs.writeShellScriptBin "test-cdi" ''
4     die() {
5       echo "$1"
6       exit 1
7     }
9     check_file_referential_integrity() {
10       echo "checking $1 referential integrity"
11       ( ${pkgs.glibc.bin}/bin/ldd "$1" | ${lib.getExe pkgs.gnugrep} "not found" &> /dev/null ) && return 1
12       return 0
13     }
15     check_directory_referential_integrity() {
16       ${lib.getExe pkgs.findutils} "$1" -type f -print0 | while read -d $'\0' file; do
17         if [[ $(${lib.getExe pkgs.file} "$file" | ${lib.getExe pkgs.gnugrep} ELF) ]]; then
18           check_file_referential_integrity "$file" || exit 1
19         else
20           echo "skipping $file: not an ELF file"
21         fi
22       done
23     }
25     check_directory_referential_integrity "/usr/bin" || exit 1
26     check_directory_referential_integrity "${pkgs.addDriverRunpath.driverLink}" || exit 1
27     check_directory_referential_integrity "/usr/local/nvidia" || exit 1
28   '';
29   testContainerImage = pkgs.dockerTools.buildImage {
30     name = "cdi-test";
31     tag = "latest";
32     config = {
33       Cmd = [ (lib.getExe testCDIScript) ];
34     };
35     copyToRoot = with pkgs.dockerTools; [
36       usrBinEnv
37       binSh
38     ];
39   };
40   emptyCDISpec = ''
41     {
42       "cdiVersion": "0.5.0",
43       "kind": "nvidia.com/gpu",
44       "devices": [
45         {
46           "name": "all",
47           "containerEdits": {
48             "deviceNodes": [
49               {
50                 "path": "/dev/urandom"
51               }
52             ],
53             "hooks": [],
54             "mounts": []
55           }
56         }
57       ],
58       "containerEdits": {
59         "deviceNodes": [],
60         "hooks": [],
61         "mounts": []
62       }
63     }
64   '';
65   nvidia-container-toolkit = {
66     enable = true;
67     package = pkgs.stdenv.mkDerivation {
68       pname = "nvidia-ctk-dummy";
69       version = "1.0.0";
70       dontUnpack = true;
71       dontBuild = true;
73       inherit emptyCDISpec;
74       passAsFile = [ "emptyCDISpec" ];
76       installPhase = ''
77         mkdir -p $out/bin $out/share/nvidia-container-toolkit
78         cp "$emptyCDISpecPath" "$out/share/nvidia-container-toolkit/spec.json"
79         echo -n "$emptyCDISpec" > "$out/bin/nvidia-ctk";
80         cat << EOF > "$out/bin/nvidia-ctk"
81         #!${pkgs.runtimeShell}
82         cat "$out/share/nvidia-container-toolkit/spec.json"
83         EOF
84         chmod +x $out/bin/nvidia-ctk
85       '';
86       meta.mainProgram = "nvidia-ctk";
87     };
88   };
91   name = "nvidia-container-toolkit";
92   meta = with lib.maintainers; {
93     maintainers = [ ereslibre ];
94   };
95   defaults =
96     { config, ... }:
97     {
98       environment.systemPackages = with pkgs; [ jq ];
99       virtualisation.diskSize = lib.mkDefault 10240;
100       virtualisation.containers.enable = lib.mkDefault true;
101       hardware = {
102         inherit nvidia-container-toolkit;
103         nvidia = {
104           open = true;
105           package = config.boot.kernelPackages.nvidiaPackages.stable.open;
106         };
107         graphics.enable = lib.mkDefault true;
108       };
109     };
110   nodes = {
111     no-gpus = {
112       virtualisation.containers.enable = false;
113       hardware.graphics.enable = false;
114     };
115     one-gpu =
116       { pkgs, ... }:
117       {
118         environment.systemPackages = with pkgs; [ podman ];
119         hardware.graphics.enable = true;
120       };
122     one-gpu-invalid-host-paths = {
123       hardware.nvidia-container-toolkit.mounts = [
124         {
125           hostPath = "/non-existant-path";
126           containerPath = "/some/path";
127         }
128       ];
129     };
130   };
131   testScript = ''
132     start_all()
134     with subtest("Generate an empty CDI spec for a machine with no Nvidia GPUs"):
135       no_gpus.wait_for_unit("nvidia-container-toolkit-cdi-generator.service")
136       no_gpus.succeed("cat /var/run/cdi/nvidia-container-toolkit.json | jq")
138     with subtest("Podman loads the generated CDI spec for a machine with an Nvidia GPU"):
139       one_gpu.wait_for_unit("nvidia-container-toolkit-cdi-generator.service")
140       one_gpu.succeed("cat /var/run/cdi/nvidia-container-toolkit.json | jq")
141       one_gpu.succeed("podman load < ${testContainerImage}")
142       print(one_gpu.succeed("podman run --pull=never --device=nvidia.com/gpu=all -v /run/opengl-driver:/run/opengl-driver:ro cdi-test:latest"))
144     # Issue: https://github.com/NixOS/nixpkgs/issues/319201
145     with subtest("The generated CDI spec skips specified non-existant paths in the host"):
146       one_gpu_invalid_host_paths.wait_for_unit("nvidia-container-toolkit-cdi-generator.service")
147       one_gpu_invalid_host_paths.fail("grep 'non-existant-path' /var/run/cdi/nvidia-container-toolkit.json")
148   '';