···
1
+
# Test for NixOS' container support.
5
+
networking.firewall.enable = false;
7
+
containers.webserver = {
9
+
privateNetwork = true;
12
+
networking.firewall.enable = false;
13
+
networking.firewall.allowPing = true;
14
+
networking.interfaces.eth0.ip4 = [
15
+
{ address = "192.168.1.122"; prefixLength = 24; }
20
+
in import ./make-test.nix ({ pkgs, lib, ...} :
22
+
name = "containers-restart_networking";
23
+
meta = with pkgs.stdenv.lib.maintainers; {
24
+
maintainers = [ kampfschlaefer ];
28
+
client = { lib, pkgs, ... }: client_base // {
29
+
virtualisation.vlans = [ 1 ];
31
+
networking.bridges.br0 = {
35
+
networking.interfaces = {
36
+
eth1.ip4 = lib.mkOverride 0 [ ];
37
+
br0.ip4 = [{ address = "192.168.1.1"; prefixLength = 24; }];
41
+
client_eth1 = { lib, pkgs, ... }: client_base // {
42
+
networking.bridges.br0 = {
43
+
interfaces = [ "eth1" ];
46
+
networking.interfaces = {
47
+
eth1.ip4 = lib.mkOverride 0 [ ];
48
+
br0.ip4 = [{ address = "192.168.1.2"; prefixLength = 24; }];
51
+
client_eth1_rstp = { lib, pkgs, ... }: client_base // {
52
+
networking.bridges.br0 = {
53
+
interfaces = [ "eth1" ];
56
+
networking.interfaces = {
57
+
eth1.ip4 = lib.mkOverride 0 [ ];
58
+
br0.ip4 = [{ address = "192.168.1.2"; prefixLength = 24; }];
63
+
testScript = {nodes, ...}: let
64
+
originalSystem = nodes.client.config.system.build.toplevel;
65
+
eth1_bridged = nodes.client_eth1.config.system.build.toplevel;
66
+
eth1_rstp = nodes.client_eth1_rstp.config.system.build.toplevel;
70
+
$client->waitForUnit("default.target");
72
+
subtest "initial state", sub {
73
+
$client->succeed("ping 192.168.1.122 -c 1 -n >&2");
74
+
$client->succeed("nixos-container run webserver -- ping -c 1 -n 192.168.1.1 >&2");
76
+
$client->fail("ip l show eth1 |grep \"master br0\" >&2");
77
+
$client->fail("grep eth1 /run/br0.interfaces >&2");
80
+
subtest "interfaces without stp", sub {
81
+
$client->succeed("${eth1_bridged}/bin/switch-to-configuration test >&2");
83
+
$client->succeed("ping 192.168.1.122 -c 1 -n >&2");
84
+
$client->succeed("nixos-container run webserver -- ping -c 1 -n 192.168.1.2 >&2");
86
+
$client->succeed("ip l show eth1 |grep \"master br0\" >&2");
87
+
$client->succeed("grep eth1 /run/br0.interfaces >&2");
90
+
# activating rstp needs another service, therefor the bridge will restart and the container will loose its connectivity
91
+
#subtest "interfaces with rstp", sub {
92
+
# $client->succeed("${eth1_rstp}/bin/switch-to-configuration test >&2");
93
+
# $client->execute("ip -4 a >&2");
94
+
# $client->execute("ip l >&2");
96
+
# $client->succeed("ping 192.168.1.122 -c 1 -n >&2");
97
+
# $client->succeed("nixos-container run webserver -- ping -c 1 -n 192.168.1.2 >&2");
99
+
# $client->succeed("ip l show eth1 |grep \"master br0\" >&2");
100
+
# $client->succeed("grep eth1 /run/br0.interfaces >&2");
103
+
subtest "back to no interfaces and no stp", sub {
104
+
$client->succeed("${originalSystem}/bin/switch-to-configuration test >&2");
106
+
$client->succeed("ping 192.168.1.122 -c 1 -n >&2");
107
+
$client->succeed("nixos-container run webserver -- ping -c 1 -n 192.168.1.1 >&2");
109
+
$client->fail("ip l show eth1 |grep \"master br0\" >&2");
110
+
$client->fail("grep eth1 /run/br0.interfaces >&2");