vuls: init at 0.27.0
[NixPkgs.git] / nixos / tests / lxd / container.nix
blobc04ae42afb8c2a654ed99ef5fdb83715e3589493
1 import ../make-test-python.nix ({ pkgs, lib, ... } :
3 let
4   releases = import ../../release.nix {
5     configuration = {
6       # Building documentation makes the test unnecessarily take a longer time:
7       documentation.enable = lib.mkForce false;
9       # Our tests require `grep` & friends:
10       environment.systemPackages = with pkgs; [ busybox ];
11     };
12   };
14   lxd-image-metadata = releases.lxdContainerMeta.${pkgs.stdenv.hostPlatform.system};
15   lxd-image-rootfs = releases.lxdContainerImage.${pkgs.stdenv.hostPlatform.system};
16   lxd-image-rootfs-squashfs = releases.lxdContainerImageSquashfs.${pkgs.stdenv.hostPlatform.system};
18 in {
19   name = "lxd-container";
21   nodes.machine = { lib, ... }: {
22     virtualisation = {
23       diskSize = 6144;
25       # Since we're testing `limits.cpu`, we've gotta have a known number of
26       # cores to lean on
27       cores = 2;
29       # Ditto, for `limits.memory`
30       memorySize = 512;
32       lxc.lxcfs.enable = true;
33       lxd.enable = true;
34     };
35   };
37   testScript = ''
38     def instance_is_up(_) -> bool:
39       status, _ = machine.execute("lxc exec container --disable-stdin --force-interactive /run/current-system/sw/bin/true")
40       return status == 0
42     machine.wait_for_unit("sockets.target")
43     machine.wait_for_unit("lxd.service")
44     machine.wait_for_file("/var/lib/lxd/unix.socket")
46     # Wait for lxd to settle
47     machine.succeed("lxd waitready")
49     # no preseed should mean no service
50     machine.fail("systemctl status lxd-preseed.service")
52     machine.succeed("lxd init --minimal")
54     machine.succeed(
55         "lxc image import ${lxd-image-metadata}/*/*.tar.xz ${lxd-image-rootfs}/*/*.tar.xz --alias nixos"
56     )
58     with subtest("Container can be managed"):
59         machine.succeed("lxc launch nixos container")
60         with machine.nested("Waiting for instance to start and be usable"):
61           retry(instance_is_up)
62         machine.succeed("echo true | lxc exec container /run/current-system/sw/bin/bash -")
63         machine.succeed("lxc delete -f container")
65     with subtest("Squashfs image is functional"):
66         machine.succeed(
67             "lxc image import ${lxd-image-metadata}/*/*.tar.xz ${lxd-image-rootfs-squashfs}/nixos-lxc-image-${pkgs.stdenv.hostPlatform.system}.squashfs --alias nixos-squashfs"
68         )
69         machine.succeed("lxc launch nixos-squashfs container")
70         with machine.nested("Waiting for instance to start and be usable"):
71           retry(instance_is_up)
72         machine.succeed("echo true | lxc exec container /run/current-system/sw/bin/bash -")
73         machine.succeed("lxc delete -f container")
75     with subtest("Container is mounted with lxcfs inside"):
76         machine.succeed("lxc launch nixos container")
77         with machine.nested("Waiting for instance to start and be usable"):
78             retry(instance_is_up)
80         ## ---------- ##
81         ## limits.cpu ##
83         machine.succeed("lxc config set container limits.cpu 1")
84         machine.succeed("lxc restart container")
85         with machine.nested("Waiting for instance to start and be usable"):
86             retry(instance_is_up)
88         assert (
89             "1"
90             == machine.succeed("lxc exec container grep -- -c ^processor /proc/cpuinfo").strip()
91         )
93         machine.succeed("lxc config set container limits.cpu 2")
94         machine.succeed("lxc restart container")
95         with machine.nested("Waiting for instance to start and be usable"):
96             retry(instance_is_up)
98         assert (
99             "2"
100             == machine.succeed("lxc exec container grep -- -c ^processor /proc/cpuinfo").strip()
101         )
103         ## ------------- ##
104         ## limits.memory ##
106         machine.succeed("lxc config set container limits.memory 64MB")
107         machine.succeed("lxc restart container")
108         with machine.nested("Waiting for instance to start and be usable"):
109             retry(instance_is_up)
111         assert (
112             "MemTotal:          62500 kB"
113             == machine.succeed("lxc exec container grep -- MemTotal /proc/meminfo").strip()
114         )
116         machine.succeed("lxc config set container limits.memory 128MB")
117         machine.succeed("lxc restart container")
118         with machine.nested("Waiting for instance to start and be usable"):
119             retry(instance_is_up)
121         assert (
122             "MemTotal:         125000 kB"
123             == machine.succeed("lxc exec container grep -- MemTotal /proc/meminfo").strip()
124         )
126         machine.succeed("lxc delete -f container")
127   '';