nixosTests.ipv6: port to python

This commit is contained in:
Martin Milata 2019-12-01 01:08:44 +01:00
parent cf5ec7ac6e
commit ead22d1415

View File

@ -1,7 +1,7 @@
# Test of IPv6 functionality in NixOS, including whether router # Test of IPv6 functionality in NixOS, including whether router
# solicication/advertisement using radvd works. # solicication/advertisement using radvd works.
import ./make-test.nix ({ pkgs, lib, ...} : { import ./make-test-python.nix ({ pkgs, lib, ...} : {
name = "ipv6"; name = "ipv6";
meta = with pkgs.stdenv.lib.maintainers; { meta = with pkgs.stdenv.lib.maintainers; {
maintainers = [ eelco ]; maintainers = [ eelco ];
@ -35,51 +35,52 @@ import ./make-test.nix ({ pkgs, lib, ...} : {
testScript = testScript =
'' ''
import re
# Start the router first so that it respond to router solicitations. # Start the router first so that it respond to router solicitations.
$router->waitForUnit("radvd"); router.wait_for_unit("radvd")
startAll; start_all()
$client->waitForUnit("network.target"); client.wait_for_unit("network.target")
$server->waitForUnit("network.target"); server.wait_for_unit("network.target")
$server->waitForUnit("httpd.service"); server.wait_for_unit("httpd.service")
# Wait until the given interface has a non-tentative address of # Wait until the given interface has a non-tentative address of
# the desired scope (i.e. has completed Duplicate Address # the desired scope (i.e. has completed Duplicate Address
# Detection). # Detection).
sub waitForAddress { def wait_for_address(machine, iface, scope):
my ($machine, $iface, $scope) = @_; machine.wait_until_succeeds(
$machine->waitUntilSucceeds("[ `ip -o -6 addr show dev $iface scope $scope | grep -v tentative | wc -l` -ge 1 ]"); f"[ `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"); output = machine.succeed(f"ip -o -6 addr show dev {iface} scope {scope}")
return $ip; ip = re.search(r"inet6 ([0-9a-f:]{2,})/", output).group(1)
} machine.log(f"{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 { with subtest("Loopback address can be pinged"):
my $clientIp = waitForAddress $client, "eth1", "link"; client.succeed("ping -c 1 ::1 >&2")
my $serverIp = waitForAddress $server, "eth1", "link"; client.fail("ping -c 1 ::2 >&2")
$client->succeed("ping -c 1 $clientIp%eth1 >&2");
$client->succeed("ping -c 1 $serverIp%eth1 >&2");
};
subtest "global addressing", sub { with subtest("Local link addresses can be obtained and pinged"):
my $clientIp = waitForAddress $client, "eth1", "global"; client_ip = wait_for_address(client, "eth1", "link")
my $serverIp = waitForAddress $server, "eth1", "global"; server_ip = wait_for_address(server, "eth1", "link")
$client->succeed("ping -c 1 $clientIp >&2"); client.succeed(f"ping -c 1 {client_ip}%eth1 >&2")
$client->succeed("ping -c 1 $serverIp >&2"); client.succeed(f"ping -c 1 {server_ip}%eth1 >&2")
$client->succeed("curl --fail -g http://[$serverIp]");
$client->fail("curl --fail -g http://[$clientIp]"); with subtest("Global addresses can be obtained, pinged, and reached via http"):
}; client_ip = wait_for_address(client, "eth1", "global")
subtest "privacy extensions", sub { server_ip = wait_for_address(server, "eth1", "global")
my $ip = waitForAddress $client, "eth1", "global temporary"; client.succeed(f"ping -c 1 {client_ip} >&2")
client.succeed(f"ping -c 1 {server_ip} >&2")
client.succeed(f"curl --fail -g http://[{server_ip}]")
client.fail(f"curl --fail -g http://[{client_ip}]")
with subtest("Privacy extensions: Global temporary address can be obtained and pinged"):
ip = wait_for_address(client, "eth1", "global temporary")
# Default route should have "src <temporary address>" in it # Default route should have "src <temporary address>" in it
$client->succeed("ip r g ::2 | grep $ip"); client.succeed(f"ip r g ::2 | grep {ip}")
};
# TODO: test reachability of a machine on another network. # TODO: test reachability of a machine on another network.
''; '';