1import ./make-test-python.nix ({ pkgs, lib, ... }: {
2 name = "systemd-initrd-network";
3 meta.maintainers = [ lib.maintainers.elvishjerricco ];
4
5 nodes = let
6 mkFlushTest = flush: script: { ... }: {
7 boot.initrd.systemd.enable = true;
8 boot.initrd.network = {
9 enable = true;
10 flushBeforeStage2 = flush;
11 };
12 systemd.services.check-flush = {
13 requiredBy = ["multi-user.target"];
14 before = ["network-pre.target" "multi-user.target"];
15 unitConfig.DefaultDependencies = false;
16 serviceConfig.Type = "oneshot";
17 path = [ pkgs.iproute2 pkgs.iputils pkgs.gnugrep ];
18 inherit script;
19 };
20 };
21 in {
22 basic = { ... }: {
23 boot.initrd.network.enable = true;
24
25 boot.initrd.systemd = {
26 enable = true;
27 # Enable network-online to fail the test in case of timeout
28 network.wait-online.timeout = 10;
29 network.wait-online.anyInterface = true;
30 targets.network-online.requiredBy = [ "initrd.target" ];
31 services.systemd-networkd-wait-online.requiredBy =
32 [ "network-online.target" ];
33
34 initrdBin = [ pkgs.iproute2 pkgs.iputils pkgs.gnugrep ];
35 services.check = {
36 requiredBy = [ "initrd.target" ];
37 before = [ "initrd.target" ];
38 after = [ "network-online.target" ];
39 serviceConfig.Type = "oneshot";
40 path = [ pkgs.iproute2 pkgs.iputils pkgs.gnugrep ];
41 script = ''
42 ip addr | grep 10.0.2.15 || exit 1
43 ping -c1 10.0.2.2 || exit 1
44 '';
45 };
46 };
47 };
48
49 doFlush = mkFlushTest true ''
50 if ip addr | grep 10.0.2.15; then
51 echo "Network configuration survived switch-root; flushBeforeStage2 failed"
52 exit 1
53 fi
54 '';
55
56 dontFlush = mkFlushTest false ''
57 if ! (ip addr | grep 10.0.2.15); then
58 echo "Network configuration didn't survive switch-root"
59 exit 1
60 fi
61 '';
62 };
63
64 testScript = ''
65 start_all()
66 basic.wait_for_unit("multi-user.target")
67 doFlush.wait_for_unit("multi-user.target")
68 dontFlush.wait_for_unit("multi-user.target")
69 # Make sure the systemd-network user was set correctly in initrd
70 basic.succeed("[ $(stat -c '%U,%G' /run/systemd/netif/links) = systemd-network,systemd-network ]")
71 basic.succeed("ip addr show >&2")
72 basic.succeed("ip route show >&2")
73 '';
74})