The library does not depend on stdenv, that `stdenv` exposes `lib` is an artifact of the ancient origins of nixpkgs.
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
# Test for NixOS' container support.
 | 
						|
 | 
						|
let
 | 
						|
  webserverFor = hostAddress: localAddress: {
 | 
						|
    inherit hostAddress localAddress;
 | 
						|
    privateNetwork = true;
 | 
						|
    config = {
 | 
						|
      services.httpd = {
 | 
						|
        enable = true;
 | 
						|
        adminAddr = "foo@example.org";
 | 
						|
      };
 | 
						|
      networking.firewall.allowedTCPPorts = [ 80 ];
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
in import ./make-test-python.nix ({ pkgs, ...} : {
 | 
						|
  name = "containers-ipv4-ipv6";
 | 
						|
  meta = with pkgs.lib.maintainers; {
 | 
						|
    maintainers = [ aristid aszlig eelco kampfschlaefer ];
 | 
						|
  };
 | 
						|
 | 
						|
  machine =
 | 
						|
    { pkgs, ... }: {
 | 
						|
      imports = [ ../modules/installer/cd-dvd/channel.nix ];
 | 
						|
      virtualisation = {
 | 
						|
        writableStore = true;
 | 
						|
        memorySize = 768;
 | 
						|
      };
 | 
						|
 | 
						|
      containers.webserver4 = webserverFor "10.231.136.1" "10.231.136.2";
 | 
						|
      containers.webserver6 = webserverFor "fc00::2" "fc00::1";
 | 
						|
      virtualisation.pathsInNixDB = [ pkgs.stdenv ];
 | 
						|
    };
 | 
						|
 | 
						|
  testScript = { nodes, ... }: ''
 | 
						|
    import time
 | 
						|
 | 
						|
 | 
						|
    def curl_host(ip):
 | 
						|
        # put [] around ipv6 addresses for curl
 | 
						|
        host = ip if ":" not in ip else f"[{ip}]"
 | 
						|
        return f"curl --fail --connect-timeout 2 http://{host}/ > /dev/null"
 | 
						|
 | 
						|
 | 
						|
    def get_ip(container):
 | 
						|
        # need to distinguish because show-ip won't work for ipv6
 | 
						|
        if container == "webserver4":
 | 
						|
            ip = machine.succeed(f"nixos-container show-ip {container}").rstrip()
 | 
						|
            assert ip == "${nodes.machine.config.containers.webserver4.localAddress}"
 | 
						|
            return ip
 | 
						|
        return "${nodes.machine.config.containers.webserver6.localAddress}"
 | 
						|
 | 
						|
 | 
						|
    for container in "webserver4", "webserver6":
 | 
						|
        assert container in machine.succeed("nixos-container list")
 | 
						|
 | 
						|
        with subtest(f"Start container {container}"):
 | 
						|
            machine.succeed(f"nixos-container start {container}")
 | 
						|
            # wait 2s for container to start and network to be up
 | 
						|
            time.sleep(2)
 | 
						|
 | 
						|
        # Since "start" returns after the container has reached
 | 
						|
        # multi-user.target, we should now be able to access it.
 | 
						|
 | 
						|
        ip = get_ip(container)
 | 
						|
        with subtest(f"{container} reacts to pings and HTTP requests"):
 | 
						|
            machine.succeed(f"ping -n -c1 {ip}")
 | 
						|
            machine.succeed(curl_host(ip))
 | 
						|
 | 
						|
        with subtest(f"Stop container {container}"):
 | 
						|
            machine.succeed(f"nixos-container stop {container}")
 | 
						|
            machine.fail(curl_host(ip))
 | 
						|
 | 
						|
        # Destroying a declarative container should fail.
 | 
						|
        machine.fail(f"nixos-container destroy {container}")
 | 
						|
  '';
 | 
						|
})
 |