1{ lib, ... }:
2{
3
4 name = "activation-etc-overlay-mutable";
5
6 meta.maintainers = with lib.maintainers; [ nikstur ];
7
8 nodes.machine =
9 { pkgs, ... }:
10 {
11 system.etc.overlay.enable = true;
12 system.etc.overlay.mutable = true;
13
14 # Prerequisites
15 boot.initrd.systemd.enable = true;
16 boot.kernelPackages = pkgs.linuxPackages_latest;
17
18 specialisation.new-generation.configuration = {
19 environment.etc."newgen".text = "newgen";
20 };
21 specialisation.newer-generation.configuration = {
22 environment.etc."newergen".text = "newergen";
23 };
24 };
25
26 testScript = # python
27 ''
28 newergen = machine.succeed("realpath /run/current-system/specialisation/newer-generation/bin/switch-to-configuration").rstrip()
29
30 with subtest("/run/nixos-etc-metadata/ is mounted"):
31 print(machine.succeed("mountpoint /run/nixos-etc-metadata"))
32
33 with subtest("No temporary files leaked into stage 2"):
34 machine.succeed("[ ! -e /etc-metadata-image ]")
35 machine.succeed("[ ! -e /etc-basedir ]")
36
37 with subtest("/etc is mounted as an overlay"):
38 machine.succeed("findmnt --kernel --type overlay /etc")
39
40 with subtest("switching to the same generation"):
41 machine.succeed("/run/current-system/bin/switch-to-configuration test")
42
43 with subtest("the initrd didn't get rebuilt"):
44 machine.succeed("test /run/current-system/initrd -ef /run/current-system/specialisation/new-generation/initrd")
45
46 with subtest("switching to a new generation"):
47 machine.fail("stat /etc/newgen")
48 machine.succeed("echo -n 'mutable' > /etc/mutable")
49
50 # Directory
51 machine.succeed("mkdir /etc/mountpoint")
52 machine.succeed("mount -t tmpfs tmpfs /etc/mountpoint")
53 machine.succeed("touch /etc/mountpoint/extra-file")
54
55 # File
56 machine.succeed("touch /etc/filemount")
57 machine.succeed("mount --bind /dev/null /etc/filemount")
58
59 machine.succeed("/run/current-system/specialisation/new-generation/bin/switch-to-configuration switch")
60
61 assert machine.succeed("cat /etc/newgen") == "newgen"
62 assert machine.succeed("cat /etc/mutable") == "mutable"
63
64 print(machine.succeed("findmnt /etc/mountpoint"))
65 print(machine.succeed("stat /etc/mountpoint/extra-file"))
66 print(machine.succeed("findmnt /etc/filemount"))
67
68 machine.succeed(f"{newergen} switch")
69 assert machine.succeed("cat /etc/newergen") == "newergen"
70
71 tmpMounts = machine.succeed("find /run -maxdepth 1 -type d -regex '/run/nixos-etc\\..*'").rstrip()
72 print(tmpMounts)
73 metaMounts = machine.succeed("find /run -maxdepth 1 -type d -regex '/run/nixos-etc-metadata.*'").rstrip()
74 print(metaMounts)
75
76 numOfTmpMounts = len(tmpMounts.splitlines())
77 numOfMetaMounts = len(metaMounts.splitlines())
78 assert numOfTmpMounts == 0, f"Found {numOfTmpMounts} remaining tmpmounts"
79 assert numOfMetaMounts == 1, f"Found {numOfMetaMounts} remaining metamounts"
80 '';
81}