90 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| import ./make-test-python.nix (
 | |
|   {
 | |
|     nodes = {
 | |
|       router = {config, pkgs, ...}: {
 | |
|         config = {
 | |
|           # This machine simulates a router with IPv6 forwarding and a static IPv6 address.
 | |
|           boot.kernel.sysctl = {
 | |
|             "net.ipv6.conf.all.forwarding" = true;
 | |
|           };
 | |
|           networking.interfaces.eth1 = {
 | |
|             ipv6.addresses = [ { address = "fd00:dead:beef:dead::1"; prefixLength = 64; } ];
 | |
|           };
 | |
|           services.corerad = {
 | |
|             enable = true;
 | |
|             # Serve router advertisements to the client machine with prefix information matching
 | |
|             # any IPv6 /64 prefixes configured on this interface.
 | |
|             #
 | |
|             # This configuration is identical to the example in the CoreRAD NixOS module.
 | |
|             settings = {
 | |
|               interfaces = [
 | |
|                 {
 | |
|                   name = "eth0";
 | |
|                   monitor = true;
 | |
|                 }
 | |
|                 {
 | |
|                   name = "eth1";
 | |
|                   advertise = true;
 | |
|                   prefix = [{ prefix = "::/64"; }];
 | |
|                 }
 | |
|               ];
 | |
|               debug = {
 | |
|                 address = "localhost:9430";
 | |
|                 prometheus = true;
 | |
|               };
 | |
|             };
 | |
|           };
 | |
|         };
 | |
|       };
 | |
|       client = {config, pkgs, ...}: {
 | |
|         # Use IPv6 SLAAC from router advertisements, and install rdisc6 so we can
 | |
|         # trigger one immediately.
 | |
|         config = {
 | |
|           boot.kernel.sysctl = {
 | |
|             "net.ipv6.conf.all.autoconf" = true;
 | |
|           };
 | |
|           environment.systemPackages = with pkgs; [
 | |
|             ndisc6
 | |
|           ];
 | |
|         };
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     testScript = ''
 | |
|       start_all()
 | |
| 
 | |
|       with subtest("Wait for CoreRAD and network ready"):
 | |
|           # Ensure networking is online and CoreRAD is ready.
 | |
|           router.wait_for_unit("network-online.target")
 | |
|           client.wait_for_unit("network-online.target")
 | |
|           router.wait_for_unit("corerad.service")
 | |
| 
 | |
|           # Ensure the client can reach the router.
 | |
|           client.wait_until_succeeds("ping -c 1 fd00:dead:beef:dead::1")
 | |
| 
 | |
|       with subtest("Verify SLAAC on client"):
 | |
|           # Trigger a router solicitation and verify a SLAAC address is assigned from
 | |
|           # the prefix configured on the router.
 | |
|           client.wait_until_succeeds("rdisc6 -1 -r 10 eth1")
 | |
|           client.wait_until_succeeds(
 | |
|               "ip -6 addr show dev eth1 | grep -q 'fd00:dead:beef:dead:'"
 | |
|           )
 | |
| 
 | |
|           addrs = client.succeed("ip -6 addr show dev eth1")
 | |
| 
 | |
|           assert (
 | |
|               "fd00:dead:beef:dead:" in addrs
 | |
|           ), "SLAAC prefix was not found in client addresses after router advertisement"
 | |
|           assert (
 | |
|               "/64 scope global temporary" in addrs
 | |
|           ), "SLAAC temporary address was not configured on client after router advertisement"
 | |
| 
 | |
|       with subtest("Verify HTTP debug server is configured"):
 | |
|           out = router.succeed("curl -f localhost:9430/metrics")
 | |
| 
 | |
|           assert (
 | |
|               "corerad_build_info" in out
 | |
|           ), "Build info metric was not found in Prometheus output"
 | |
|     '';
 | |
|   })
 | 
