python312Packages.millheater: 0.11.8 -> 0.12.0
[NixPkgs.git] / nixos / tests / scion / freestanding-deployment / default.nix
blob55b2322ab02dae39bf0891527ccf76d2df70374b
1 # implements https://github.com/scionproto/scion/blob/27983125bccac6b84d1f96f406853aab0e460405/doc/tutorials/deploy.rst
2 import ../../make-test-python.nix ({ pkgs, ... }:
3 let
4   trust-root-configuration-keys = pkgs.runCommand "generate-trc-keys.sh" {
5     buildInputs = [
6       pkgs.scion
7     ];
8   } (builtins.readFile ./bootstrap.sh);
10   imports = hostId: [
11     ({
12       services.scion = {
13         enable = true;
14         bypassBootstrapWarning = true;
15       };
16       networking = {
17         useNetworkd = true;
18         useDHCP = false;
19       };
20       systemd.network.networks."01-eth1" = {
21         name = "eth1";
22         networkConfig.Address = "192.168.1.${toString hostId}/24";
23       };
24       environment.etc = {
25         "scion/topology.json".source = ./topology${toString hostId}.json;
26         "scion/crypto/as".source = trust-root-configuration-keys + "/AS${toString hostId}";
27         "scion/certs/ISD42-B1-S1.trc".source = trust-root-configuration-keys + "/ISD42-B1-S1.trc";
28         "scion/keys/master0.key".text = "U${toString hostId}v4k23ZXjGDwDofg/Eevw==";
29         "scion/keys/master1.key".text = "dBMko${toString hostId}qMS8DfrN/zP2OUdA==";
30       };
31       environment.systemPackages = [
32         pkgs.scion
33       ];
34     })
35   ];
38   name = "scion-test";
39   nodes = {
40     scion01 = { ... }: {
41       imports = (imports 1);
42     };
43     scion02 = { ... }: {
44       imports = (imports 2);
45     };
46     scion03 = { ... }: {
47       imports = (imports 3);
48     };
49     scion04 = { ... }: {
50       imports = (imports 4);
51       networking.interfaces."lo".ipv4.addresses = [{ address = "172.16.1.1"; prefixLength = 32; }];
52       services.scion.scion-ip-gateway = {
53         enable = true;
54         config = {
55           tunnel = {
56             src_ipv4 = "172.16.1.1";
57           };
58         };
59         trafficConfig = {
60           ASes = {
61             "42-ffaa:1:5" = {
62               Nets = [
63                 "172.16.100.0/24"
64               ];
65             };
66           };
67           ConfigVersion = 9001;
68         };
69       };
70     };
71     scion05 = { ... }: {
72       imports = (imports 5);
73       networking.interfaces."lo".ipv4.addresses = [{ address = "172.16.100.1"; prefixLength = 32; }];
74       services.scion.scion-ip-gateway = {
75         enable = true;
76         config = {
77           tunnel = {
78             src_ipv4 = "172.16.100.1";
79           };
80         };
81         trafficConfig = {
82           ASes = {
83             "42-ffaa:1:4" = {
84               Nets = [
85                 "172.16.1.0/24"
86               ];
87             };
88           };
89           ConfigVersion = 9001;
90         };
91       };
92     };
93   };
94   testScript = let
95     pingAll = pkgs.writeShellScript "ping-all-scion.sh" ''
96       addresses="42-ffaa:1:1 42-ffaa:1:2 42-ffaa:1:3 42-ffaa:1:4 42-ffaa:1:5"
97       timeout=100
98       wait_for_all() {
99         ret=0
100         for as in "$@"
101         do
102           scion showpaths $as --no-probe > /dev/null
103           ret=$?
104           if [ "$ret" -ne "0" ]; then
105             break
106           fi
107         done
108         return $ret
109       }
110       ping_all() {
111         ret=0
112         for as in "$@"
113         do
114           scion ping "$as,127.0.0.1" -c 3
115           ret=$?
116           if [ "$ret" -ne "0" ]; then
117             break
118           fi
119         done
120         return $ret
121       }
122       for i in $(seq 0 $timeout); do
123         sleep 1
124         wait_for_all $addresses || continue
125         ping_all $addresses && exit 0
126       done
127       exit 1
128     '';
129   in
130   ''
131     # List of AS instances
132     machines = [scion01, scion02, scion03, scion04, scion05]
134     # Functions to avoid many for loops
135     def start(allow_reboot=False):
136         for i in machines:
137             i.start(allow_reboot=allow_reboot)
139     def wait_for_unit(service_name):
140         for i in machines:
141             i.wait_for_unit(service_name)
143     def succeed(command):
144         for i in machines:
145             i.succeed(command)
147     def reboot():
148         for i in machines:
149             i.reboot()
151     def crash():
152         for i in machines:
153             i.crash()
155     # Start all machines, allowing reboot for later
156     start(allow_reboot=True)
158     # Wait for scion-control.service on all instances
159     wait_for_unit("scion-control.service")
161     # Ensure cert is valid against TRC
162     succeed("scion-pki certificate verify --trc /etc/scion/certs/*.trc /etc/scion/crypto/as/*.pem >&2")
164     # Execute pingAll command on all instances
165     succeed("${pingAll} >&2")
167     # Execute ICMP pings across scion-ip-gateway
168     scion04.succeed("ping -c 3 172.16.100.1 >&2")
169     scion05.succeed("ping -c 3 172.16.1.1 >&2")
171     # Restart all scion services and ping again to test robustness
172     succeed("systemctl restart scion-* >&2")
173     succeed("${pingAll} >&2")
175     # Reboot machines, wait for service, and ping again
176     reboot()
177     wait_for_unit("scion-control.service")
178     succeed("${pingAll} >&2")
180     # Crash, start, wait for service, and ping again
181     crash()
182     start()
183     wait_for_unit("scion-control.service")
184     succeed("pkill -9 scion-* >&2")
185     wait_for_unit("scion-control.service")
186     succeed("${pingAll} >&2")
187   '';