1{
2 system ? builtins.currentSystem,
3 config ? { },
4 pkgs ? import ../.. { inherit system config; },
5 lib ? pkgs.lib,
6}:
7
8with import ../lib/testing-python.nix { inherit system pkgs; };
9
10let
11 inherit (lib.maintainers) elvishjerricco;
12
13 common = {
14 boot.initrd.systemd = {
15 enable = true;
16 network.wait-online.timeout = 10;
17 network.wait-online.anyInterface = true;
18 targets.network-online.requiredBy = [ "initrd.target" ];
19 services.systemd-networkd-wait-online.requiredBy = [ "network-online.target" ];
20 initrdBin = [
21 pkgs.iproute2
22 pkgs.iputils
23 pkgs.gnugrep
24 ];
25 };
26 testing.initrdBackdoor = true;
27 boot.initrd.network.enable = true;
28 };
29
30 mkFlushTest =
31 flush: script:
32 makeTest {
33 name = "systemd-initrd-network-${lib.optionalString (!flush) "no-"}flush";
34 meta.maintainers = [ elvishjerricco ];
35
36 nodes.machine = {
37 imports = [ common ];
38
39 boot.initrd.network.flushBeforeStage2 = flush;
40 systemd.services.check-flush = {
41 requiredBy = [ "multi-user.target" ];
42 before = [
43 "network-pre.target"
44 "multi-user.target"
45 "shutdown.target"
46 ];
47 conflicts = [ "shutdown.target" ];
48 wants = [ "network-pre.target" ];
49 unitConfig.DefaultDependencies = false;
50 serviceConfig.Type = "oneshot";
51 path = [
52 pkgs.iproute2
53 pkgs.iputils
54 pkgs.gnugrep
55 ];
56 inherit script;
57 };
58 };
59
60 testScript = ''
61 machine.wait_for_unit("network-online.target")
62 machine.succeed(
63 "ip addr | grep 10.0.2.15",
64 "ping -c1 10.0.2.2",
65 )
66 machine.switch_root()
67
68 machine.wait_for_unit("multi-user.target")
69 '';
70 };
71
72in
73{
74 basic = makeTest {
75 name = "systemd-initrd-network";
76 meta.maintainers = [ elvishjerricco ];
77
78 nodes.machine = common;
79
80 testScript = ''
81 machine.wait_for_unit("network-online.target")
82 machine.succeed(
83 "ip addr | grep 10.0.2.15",
84 "ping -c1 10.0.2.2",
85 )
86 machine.switch_root()
87
88 # Make sure the systemd-network user was set correctly in initrd
89 machine.wait_for_unit("multi-user.target")
90 machine.succeed("[ $(stat -c '%U,%G' /run/systemd/netif/links) = systemd-network,systemd-network ]")
91 machine.succeed("ip addr show >&2")
92 machine.succeed("ip route show >&2")
93 '';
94 };
95
96 doFlush = mkFlushTest true ''
97 if ip addr | grep 10.0.2.15; then
98 echo "Network configuration survived switch-root; flushBeforeStage2 failed"
99 exit 1
100 fi
101 '';
102
103 dontFlush = mkFlushTest false ''
104 if ! (ip addr | grep 10.0.2.15); then
105 echo "Network configuration didn't survive switch-root"
106 exit 1
107 fi
108 '';
109}