1# This test predominantly tests systemd-networkd DHCP server, by
2# setting up a DHCP server and client, and ensuring they are mutually
3# reachable via the DHCP allocated address.
4# Two DHCP servers are set up on bridge VLANs, testing to make sure that
5# bridge VLAN settings are correctly applied.
6#
7# br0 ----untagged---v
8# +---PVID 1+VLAN 2---[bridge]---PVID 2---eth1
9# vlan2 ---VLAN 2----^
10import ./make-test-python.nix (
11 { pkgs, ... }:
12 {
13 name = "systemd-networkd-dhcpserver";
14 meta = with pkgs.lib.maintainers; {
15 maintainers = [ ];
16 };
17 nodes = {
18 router =
19 { config, pkgs, ... }:
20 {
21 virtualisation.vlans = [ 1 ];
22 systemd.services.systemd-networkd.environment.SYSTEMD_LOG_LEVEL = "debug";
23 networking = {
24 useNetworkd = true;
25 useDHCP = false;
26 firewall.enable = false;
27 };
28 systemd.network = {
29 netdevs = {
30 br0 = {
31 enable = true;
32 netdevConfig = {
33 Name = "br0";
34 Kind = "bridge";
35 };
36 extraConfig = ''
37 [Bridge]
38 VLANFiltering=yes
39 DefaultPVID=none
40 '';
41 };
42 vlan2 = {
43 enable = true;
44 netdevConfig = {
45 Name = "vlan2";
46 Kind = "vlan";
47 };
48 vlanConfig.Id = 2;
49 };
50 };
51 networks = {
52 # systemd-networkd will load the first network unit file
53 # that matches, ordered lexiographically by filename.
54 # /etc/systemd/network/{40-eth1,99-main}.network already
55 # exists. This network unit must be loaded for the test,
56 # however, hence why this network is named such.
57 "01-eth1" = {
58 name = "eth1";
59 networkConfig.Bridge = "br0";
60 bridgeVLANs = [
61 {
62 PVID = 2;
63 EgressUntagged = 2;
64 }
65 ];
66 };
67 "02-br0" = {
68 name = "br0";
69 networkConfig = {
70 DHCPServer = true;
71 Address = "10.0.0.1/24";
72 VLAN = [ "vlan2" ];
73 };
74 dhcpServerConfig = {
75 PoolOffset = 100;
76 PoolSize = 1;
77 };
78 bridgeVLANs = [
79 {
80 PVID = 1;
81 EgressUntagged = 1;
82 }
83 { VLAN = 2; }
84 ];
85 };
86 "02-vlan2" = {
87 name = "vlan2";
88 networkConfig = {
89 DHCPServer = true;
90 Address = "10.0.2.1/24";
91 };
92 dhcpServerConfig = {
93 PoolOffset = 100;
94 PoolSize = 1;
95 };
96 };
97 };
98 };
99 };
100
101 client =
102 { config, pkgs, ... }:
103 {
104 virtualisation.vlans = [ 1 ];
105 systemd.services.systemd-networkd.environment.SYSTEMD_LOG_LEVEL = "debug";
106 networking = {
107 useNetworkd = true;
108 useDHCP = false;
109 firewall.enable = false;
110 interfaces.eth1.useDHCP = true;
111 };
112 };
113 };
114 testScript =
115 { ... }:
116 ''
117 start_all()
118
119 router.systemctl("start network-online.target")
120 client.systemctl("start network-online.target")
121 router.wait_for_unit("systemd-networkd-wait-online.service")
122 client.wait_for_unit("systemd-networkd-wait-online.service")
123 client.wait_until_succeeds("ping -c 5 10.0.2.1")
124 router.wait_until_succeeds("ping -c 5 10.0.2.100")
125 '';
126 }
127)