vuls: init at 0.27.0
[NixPkgs.git] / nixos / tests / systemd-networkd-bridge.nix
blobf1f8823e84205a909f0766271c7eb26675820983
1 /* This test ensures that we can configure spanning-tree protocol
2    across bridges using systemd-networkd.
4    Test topology:
6               1       2       3
7        node1 --- sw1 --- sw2 --- node2
8                    \     /
9                   4 \   / 5
10                      sw3
11                       |
12                     6 |
13                       |
14                     node3
16    where switches 1, 2, and 3 bridge their links and use STP,
17    and each link is labeled with the VLAN we are assigning it in
18    virtualisation.vlans.
20 with builtins;
21 let
22   commonConf = {
23     systemd.services.systemd-networkd.environment.SYSTEMD_LOG_LEVEL = "debug";
24     networking.useNetworkd = true;
25     networking.useDHCP = false;
26     networking.firewall.enable = false;
27   };
29   generateNodeConf = { octet, vlan }:
30     { lib, pkgs, config, ... }: {
31       imports = [ common/user-account.nix commonConf ];
32       virtualisation.vlans = [ vlan ];
33       systemd.network = {
34         enable = true;
35         networks = {
36           "30-eth" = {
37             matchConfig.Name = "eth1";
38             address = [ "10.0.0.${toString octet}/24" ];
39           };
40         };
41       };
42     };
44   generateSwitchConf = vlans:
45     { lib, pkgs, config, ... }: {
46       imports = [ common/user-account.nix commonConf ];
47       virtualisation.vlans = vlans;
48       systemd.network = {
49         enable = true;
50         netdevs = {
51           "40-br0" = {
52             netdevConfig = {
53               Kind = "bridge";
54               Name = "br0";
55             };
56             bridgeConfig.STP = "yes";
57           };
58         };
59         networks = {
60           "30-eth" = {
61             matchConfig.Name = "eth*";
62             networkConfig.Bridge = "br0";
63           };
64           "40-br0" = { matchConfig.Name = "br0"; };
65         };
66       };
67     };
68 in import ./make-test-python.nix ({ pkgs, ... }: {
69   name = "networkd";
70   meta = with pkgs.lib.maintainers; { maintainers = [ picnoir ]; };
71   nodes = {
72     node1 = generateNodeConf {
73       octet = 1;
74       vlan = 1;
75     };
76     node2 = generateNodeConf {
77       octet = 2;
78       vlan = 3;
79     };
80     node3 = generateNodeConf {
81       octet = 3;
82       vlan = 6;
83     };
84     sw1 = generateSwitchConf [ 1 2 4 ];
85     sw2 = generateSwitchConf [ 2 3 5 ];
86     sw3 = generateSwitchConf [ 4 5 6 ];
87   };
88   testScript = ''
89     network_nodes = [node1, node2, node3]
90     network_switches = [sw1, sw2, sw3]
91     start_all()
93     for n in network_nodes + network_switches:
94         n.wait_for_unit("systemd-networkd-wait-online.service")
96     node1.succeed("ping 10.0.0.2 -w 10 -c 1")
97     node1.succeed("ping 10.0.0.3 -w 10 -c 1")
98     node2.succeed("ping 10.0.0.1 -w 10 -c 1")
99     node2.succeed("ping 10.0.0.3 -w 10 -c 1")
100     node3.succeed("ping 10.0.0.1 -w 10 -c 1")
101     node3.succeed("ping 10.0.0.2 -w 10 -c 1")
102   '';