···
+
{ system ? builtins.currentSystem, networkd }:
+
with import ../lib/testing.nix { inherit system; };
+
router = { config, pkgs, ... }:
+
vlanIfs = range 1 (length config.virtualisation.vlans);
+
virtualisation.vlans = [ 1 2 3 ];
+
useNetworkd = networkd;
+
firewall.allowPing = true;
+
interfaces = mkOverride 0 (listToAttrs (flip map vlanIfs (n:
+
nameValuePair "eth${toString n}" {
+
ipAddress = "192.168.${toString n}.1";
+
interfaces = map (n: "eth${toString n}") vlanIfs;
+
option subnet-mask 255.255.255.0;
+
'' + flip concatMapStrings vlanIfs (n: ''
+
subnet 192.168.${toString n}.0 netmask 255.255.255.0 {
+
option broadcast-address 192.168.${toString n}.255;
+
option routers 192.168.${toString n}.1;
+
range 192.168.${toString n}.2 192.168.${toString n}.254;
+
machine.networking.useNetworkd = networkd;
+
$machine->waitForUnit("network-interfaces.target");
+
$machine->waitForUnit("network.target");
+
$machine->succeed("ip addr show lo | grep -q 'inet 127.0.0.1/8 '");
+
$machine->succeed("ip addr show lo | grep -q 'inet6 ::1/128 '");
+
nodes.client = { config, pkgs, ... }: with pkgs.lib; {
+
virtualisation.vlans = [ 1 2 ];
firewall.allowPing = true;
+
defaultGateway = "192.168.1.1";
+
interfaces.eth1.ip4 = mkOverride 0 [
+
{ address = "192.168.1.2"; prefixLength = 24; }
+
{ address = "192.168.1.3"; prefixLength = 32; }
+
{ address = "192.168.1.10"; prefixLength = 32; }
+
interfaces.eth2.ip4 = mkOverride 0 [
+
{ address = "192.168.2.2"; prefixLength = 24; }
+
testScript = { nodes, ... }:
+
$client->waitForUnit("network-interfaces.target");
+
$client->waitForUnit("network.target");
+
$router->waitForUnit("network-interfaces.target");
+
$router->waitForUnit("network.target");
+
# Make sure dhcpcd is not started
+
$client->fail("systemctl status dhcpcd.service");
+
$client->waitUntilSucceeds("ping -c 1 192.168.1.1");
+
$client->waitUntilSucceeds("ping -c 1 192.168.1.2");
+
$client->waitUntilSucceeds("ping -c 1 192.168.1.3");
+
$client->waitUntilSucceeds("ping -c 1 192.168.1.10");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.3");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.10");
+
$client->waitUntilSucceeds("ping -c 1 192.168.2.1");
+
$client->waitUntilSucceeds("ping -c 1 192.168.2.2");
+
$router->waitUntilSucceeds("ping -c 1 192.168.2.1");
+
$router->waitUntilSucceeds("ping -c 1 192.168.2.2");
+
$router->waitUntilSucceeds("ping -c 1 192.168.3.1");
+
$client->waitUntilSucceeds("ping -c 1 192.168.3.1");
+
nodes.client = { config, pkgs, ... }: with pkgs.lib; {
+
virtualisation.vlans = [ 1 2 ];
+
useNetworkd = networkd;
+
firewall.allowPing = true;
+
interfaces.eth1.ip4 = mkOverride 0 [ ];
+
interfaces.eth2.ip4 = mkOverride 0 [ ];
+
testScript = { nodes, ... }:
+
$client->waitForUnit("network-interfaces.target");
+
$client->waitForUnit("network.target");
+
$router->waitForUnit("network-interfaces.target");
+
$router->waitForUnit("network.target");
+
# Wait until we have an ip address on each interface
+
$client->waitUntilSucceeds("ip addr show dev eth1 | grep -q '192.168.1'");
+
$client->waitUntilSucceeds("ip addr show dev eth2 | grep -q '192.168.2'");
+
$client->waitUntilSucceeds("ping -c 1 192.168.1.1");
+
$client->waitUntilSucceeds("ping -c 1 192.168.1.2");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
+
$client->waitUntilSucceeds("ping -c 1 192.168.2.1");
+
$client->waitUntilSucceeds("ping -c 1 192.168.2.2");
+
$router->waitUntilSucceeds("ping -c 1 192.168.2.1");
+
$router->waitUntilSucceeds("ping -c 1 192.168.2.2");
+
name = "OneInterfaceDHCP";
+
nodes.client = { config, pkgs, ... }: with pkgs.lib; {
+
virtualisation.vlans = [ 1 2 ];
+
useNetworkd = networkd;
+
firewall.allowPing = true;
+
ip4 = mkOverride 0 [ ];
+
interfaces.eth2.ip4 = mkOverride 0 [ ];
+
testScript = { nodes, ... }:
+
# Wait for networking to come up
+
$client->waitForUnit("network-interfaces.target");
+
$client->waitForUnit("network.target");
+
$router->waitForUnit("network-interfaces.target");
+
$router->waitForUnit("network.target");
+
# Wait until we have an ip address on each interface
+
$client->waitUntilSucceeds("ip addr show dev eth1 | grep -q '192.168.1'");
+
$client->waitUntilSucceeds("ping -c 1 192.168.1.1");
+
$client->waitUntilSucceeds("ping -c 1 192.168.1.2");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
+
$client->waitUntilSucceeds("ping -c 1 192.168.2.1");
+
$client->fail("ping -c 1 192.168.2.2");
+
$router->waitUntilSucceeds("ping -c 1 192.168.2.1");
+
$router->fail("ping -c 1 192.168.2.2");
+
node = address: { config, pkgs, ... }: with pkgs.lib; {
+
virtualisation.vlans = [ 1 2 ];
+
useNetworkd = networkd;
+
firewall.allowPing = true;
+
interfaces = [ "eth1" "eth2" ];
+
interfaces.eth1.ip4 = mkOverride 0 [ ];
+
interfaces.eth2.ip4 = mkOverride 0 [ ];
+
interfaces.bond.ip4 = mkOverride 0
+
[ { inherit address; prefixLength = 30; } ];
+
nodes.client1 = node "192.168.1.1";
+
nodes.client2 = node "192.168.1.2";
+
testScript = { nodes, ... }:
+
# Wait for networking to come up
+
$client1->waitForUnit("network-interfaces.target");
+
$client1->waitForUnit("network.target");
+
$client2->waitForUnit("network-interfaces.target");
+
$client2->waitForUnit("network.target");
+
$client1->waitUntilSucceeds("ping -c 2 192.168.1.1");
+
$client1->waitUntilSucceeds("ping -c 2 192.168.1.2");
+
$client2->waitUntilSucceeds("ping -c 2 192.168.1.1");
+
$client2->waitUntilSucceeds("ping -c 2 192.168.1.2");
+
node = { address, vlan }: { config, pkgs, ... }: with pkgs.lib; {
+
virtualisation.vlans = [ vlan ];
+
useNetworkd = networkd;
+
firewall.allowPing = true;
+
interfaces.eth1.ip4 = mkOverride 0
+
[ { inherit address; prefixLength = 24; } ];
+
nodes.client1 = node { address = "192.168.1.2"; vlan = 1; };
+
nodes.client2 = node { address = "192.168.1.3"; vlan = 2; };
+
nodes.router = { config, pkgs, ... }: with pkgs.lib; {
+
virtualisation.vlans = [ 1 2 ];
+
useNetworkd = networkd;
+
firewall.allowPing = true;
+
bridges.bridge.interfaces = [ "eth1" "eth2" ];
+
interfaces.eth1.ip4 = mkOverride 0 [ ];
+
interfaces.eth2.ip4 = mkOverride 0 [ ];
+
interfaces.bridge.ip4 = mkOverride 0
+
[ { address = "192.168.1.1"; prefixLength = 24; } ];
+
testScript = { nodes, ... }:
+
# Wait for networking to come up
+
$client1->waitForUnit("network-interfaces.target");
+
$client1->waitForUnit("network.target");
+
$client2->waitForUnit("network-interfaces.target");
+
$client2->waitForUnit("network.target");
+
$router->waitForUnit("network-interfaces.target");
+
$router->waitForUnit("network.target");
+
$client1->waitUntilSucceeds("ping -c 1 192.168.1.1");
+
$client1->waitUntilSucceeds("ping -c 1 192.168.1.2");
+
$client1->waitUntilSucceeds("ping -c 1 192.168.1.3");
+
$client2->waitUntilSucceeds("ping -c 1 192.168.1.1");
+
$client2->waitUntilSucceeds("ping -c 1 192.168.1.2");
+
$client2->waitUntilSucceeds("ping -c 1 192.168.1.3");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.3");
+
nodes.client = { config, pkgs, ... }: with pkgs.lib; {
+
virtualisation.vlans = [ 1 ];
+
useNetworkd = networkd;
+
firewall.allowPing = true;
+
macvlans.macvlan.interface = "eth1";
+
interfaces.eth1.ip4 = mkOverride 0 [ ];
+
testScript = { nodes, ... }:
+
# Wait for networking to come up
+
$client->waitForUnit("network-interfaces.target");
+
$client->waitForUnit("network.target");
+
$router->waitForUnit("network-interfaces.target");
+
$router->waitForUnit("network.target");
+
# Wait until we have an ip address on each interface
+
$client->waitUntilSucceeds("ip addr show dev eth1 | grep -q '192.168.1'");
+
$client->waitUntilSucceeds("ip addr show dev macvlan | grep -q '192.168.1'");
+
# Print diagnosting information
+
$router->succeed("ip addr >&2");
+
$client->succeed("ip addr >&2");
+
# Test macvlan creates routable ips
+
$client->waitUntilSucceeds("ping -c 1 192.168.1.1");
+
$client->waitUntilSucceeds("ping -c 1 192.168.1.2");
+
$client->waitUntilSucceeds("ping -c 1 192.168.1.3");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
+
$router->waitUntilSucceeds("ping -c 1 192.168.1.3");
+
node = { address4, remote, address6 }: { config, pkgs, ... }: with pkgs.lib; {
+
virtualisation.vlans = [ 1 ];
+
useNetworkd = networkd;
+
firewall.enable = false;
+
interfaces.eth1.ip4 = mkOverride 0
+
[ { address = address4; prefixLength = 24; } ];
+
interfaces.sit.ip6 = mkOverride 0
+
[ { address = address6; prefixLength = 64; } ];
+
nodes.client1 = node { address4 = "192.168.1.1"; remote = "192.168.1.2"; address6 = "fc00::1"; };
+
nodes.client2 = node { address4 = "192.168.1.2"; remote = "192.168.1.1"; address6 = "fc00::2"; };
+
testScript = { nodes, ... }:
+
# Wait for networking to be configured
+
$client1->waitForUnit("network-interfaces.target");
+
$client1->waitForUnit("network.target");
+
$client2->waitForUnit("network-interfaces.target");
+
$client2->waitForUnit("network.target");
+
# Print diagnostic information
+
$client1->succeed("ip addr >&2");
+
$client2->succeed("ip addr >&2");
+
$client1->waitUntilSucceeds("ping6 -c 1 fc00::1");
+
$client1->waitUntilSucceeds("ping6 -c 1 fc00::2");
+
$client2->waitUntilSucceeds("ping6 -c 1 fc00::1");
+
$client2->waitUntilSucceeds("ping6 -c 1 fc00::2");
+
node = address: { config, pkgs, ... }: with pkgs.lib; {
+
#virtualisation.vlans = [ 1 ];
+
useNetworkd = networkd;
+
firewall.allowPing = true;
+
interfaces.eth0.ip4 = mkOverride 0 [ ];
+
interfaces.eth1.ip4 = mkOverride 0 [ ];
+
interfaces.vlan.ip4 = mkOverride 0
+
[ { inherit address; prefixLength = 24; } ];
+
nodes.client1 = node "192.168.1.1";
+
nodes.client2 = node "192.168.1.2";
+
testScript = { nodes, ... }:
+
# Wait for networking to be configured
+
$client1->waitForUnit("network-interfaces.target");
+
$client1->waitForUnit("network.target");
+
$client2->waitForUnit("network-interfaces.target");
+
$client2->waitForUnit("network.target");
+
$client1->succeed("ip addr show dev vlan >&2");
+
$client2->succeed("ip addr show dev vlan >&2");
+
in mapAttrs (const (attrs: makeTest (attrs // {
+
name = "${attrs.name}-Networking-${if networkd then "Networkd" else "Scripted"}";
+
meta = with pkgs.stdenv.lib.maintainers; {
+
maintainers = [ wkennington ];