1/* This test ensures that we can configure spanning-tree protocol
2 across bridges using systemd-networkd.
3
4 Test topology:
5
6 1 2 3
7 node1 --- sw1 --- sw2 --- node2
8 \ /
9 4 \ / 5
10 sw3
11 |
12 6 |
13 |
14 node3
15
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.
19*/
20with builtins;
21let
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 };
28
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 };
43
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 };
68in 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()
92
93 for n in network_nodes + network_switches:
94 n.wait_for_unit("systemd-networkd-wait-online.service")
95
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 '';
103})