nixpkgs-custom/nixos/tests/ipv6.nix

80 lines
2.6 KiB
Nix

# Test of IPv6 functionality in NixOS, including whether router
# solicication/advertisement using radvd works.
import ./make-test.nix ({ pkgs, ...} : {
name = "ipv6";
meta = with pkgs.stdenv.lib.maintainers; {
maintainers = [ eelco chaoflow ];
};
nodes =
{ client = { config, pkgs, ... }: { };
server =
{ config, pkgs, ... }:
{ services.httpd.enable = true;
services.httpd.adminAddr = "foo@example.org";
networking.firewall.allowedTCPPorts = [ 80 ];
};
router =
{ config, pkgs, ... }:
{ services.radvd.enable = true;
services.radvd.config =
''
interface eth1 {
AdvSendAdvert on;
# ULA prefix (RFC 4193).
prefix fd60:cc69:b537:1::/64 { };
};
'';
};
};
testScript =
''
# Start the router first so that it respond to router solicitations.
$router->waitForUnit("radvd");
startAll;
$client->waitForUnit("network.target");
$server->waitForUnit("network.target");
$server->waitForUnit("httpd.service");
# Wait until the given interface has a non-tentative address of
# the desired scope (i.e. has completed Duplicate Address
# Detection).
sub waitForAddress {
my ($machine, $iface, $scope) = @_;
$machine->waitUntilSucceeds("[ `ip -o -6 addr show dev $iface scope $scope | grep -v tentative | wc -l` -ge 1 ]");
my $ip = (split /[ \/]+/, $machine->succeed("ip -o -6 addr show dev $iface scope $scope"))[3];
$machine->log("$scope address on $iface is $ip");
return $ip;
}
subtest "loopback address", sub {
$client->succeed("ping -c 1 ::1 >&2");
$client->fail("ping -c 1 ::2 >&2");
};
subtest "local link addressing", sub {
my $clientIp = waitForAddress $client, "eth1", "link";
my $serverIp = waitForAddress $server, "eth1", "link";
$client->succeed("ping -c 1 $clientIp%eth1 >&2");
$client->succeed("ping -c 1 $serverIp%eth1 >&2");
};
subtest "global addressing", sub {
my $clientIp = waitForAddress $client, "eth1", "global";
my $serverIp = waitForAddress $server, "eth1", "global";
$client->succeed("ping -c 1 $clientIp >&2");
$client->succeed("ping -c 1 $serverIp >&2");
$client->succeed("curl --fail -g http://[$serverIp]");
$client->fail("curl --fail -g http://[$clientIp]");
};
# TODO: test reachability of a machine on another network.
'';
})