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