| 
									
										
										
										
											2016-01-31 21:45:05 +01:00
										 |  |  | # Test for NixOS' container support. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							|  |  |  |   hostIp = "192.168.0.1"; | 
					
						
							|  |  |  |   containerIp = "192.168.0.100/24"; | 
					
						
							|  |  |  |   hostIp6 = "fc00::1"; | 
					
						
							|  |  |  |   containerIp6 = "fc00::2/7"; | 
					
						
							|  |  |  | in | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ./make-test.nix ({ pkgs, ...} : { | 
					
						
							|  |  |  |   name = "containers-bridge"; | 
					
						
							|  |  |  |   meta = with pkgs.stdenv.lib.maintainers; { | 
					
						
							| 
									
										
										
										
											2016-05-16 13:06:40 +02:00
										 |  |  |     maintainers = [ aristid aszlig eelco chaoflow kampfschlaefer ]; | 
					
						
							| 
									
										
										
										
											2016-01-31 21:45:05 +01:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   machine = | 
					
						
							| 
									
										
										
										
											2018-07-20 20:56:59 +00:00
										 |  |  |     { pkgs, ... }: | 
					
						
							| 
									
										
										
										
											2016-01-31 21:45:05 +01:00
										 |  |  |     { imports = [ ../modules/installer/cd-dvd/channel.nix ]; | 
					
						
							|  |  |  |       virtualisation.writableStore = true; | 
					
						
							|  |  |  |       virtualisation.memorySize = 768; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       networking.bridges = { | 
					
						
							|  |  |  |         br0 = { | 
					
						
							|  |  |  |           interfaces = []; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       networking.interfaces = { | 
					
						
							|  |  |  |         br0 = { | 
					
						
							| 
									
										
										
										
											2017-12-03 05:14:54 +01:00
										 |  |  |           ipv4.addresses = [{ address = hostIp; prefixLength = 24; }]; | 
					
						
							|  |  |  |           ipv6.addresses = [{ address = hostIp6; prefixLength = 7; }]; | 
					
						
							| 
									
										
										
										
											2016-01-31 21:45:05 +01:00
										 |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       containers.webserver = | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           autoStart = true; | 
					
						
							|  |  |  |           privateNetwork = true; | 
					
						
							|  |  |  |           hostBridge = "br0"; | 
					
						
							|  |  |  |           localAddress = containerIp; | 
					
						
							|  |  |  |           localAddress6 = containerIp6; | 
					
						
							|  |  |  |           config = | 
					
						
							|  |  |  |             { services.httpd.enable = true; | 
					
						
							|  |  |  |               services.httpd.adminAddr = "foo@example.org"; | 
					
						
							|  |  |  |               networking.firewall.allowedTCPPorts = [ 80 ]; | 
					
						
							|  |  |  |               networking.firewall.allowPing = true; | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       virtualisation.pathsInNixDB = [ pkgs.stdenv ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   testScript = | 
					
						
							|  |  |  |     ''
 | 
					
						
							|  |  |  |       $machine->waitForUnit("default.target"); | 
					
						
							|  |  |  |       $machine->succeed("nixos-container list") =~ /webserver/ or die; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Start the webserver container. | 
					
						
							|  |  |  |       $machine->succeed("nixos-container status webserver") =~ /up/ or die; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       "${containerIp}" =~ /([^\/]+)\/([0-9+])/; | 
					
						
							|  |  |  |       my $ip = $1; | 
					
						
							|  |  |  |       chomp $ip; | 
					
						
							|  |  |  |       $machine->succeed("ping -n -c 1 $ip"); | 
					
						
							|  |  |  |       $machine->succeed("curl --fail http://$ip/ > /dev/null"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       "${containerIp6}" =~ /([^\/]+)\/([0-9+])/; | 
					
						
							|  |  |  |       my $ip6 = $1; | 
					
						
							|  |  |  |       chomp $ip6; | 
					
						
							| 
									
										
										
										
											2017-02-15 11:05:50 +01:00
										 |  |  |       $machine->succeed("ping -n -c 1 $ip6"); | 
					
						
							| 
									
										
										
										
											2016-01-31 21:45:05 +01:00
										 |  |  |       $machine->succeed("curl --fail http://[$ip6]/ > /dev/null"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-16 14:54:13 +01:00
										 |  |  |       # Check that nixos-container show-ip works in case of an ipv4 address with | 
					
						
							|  |  |  |       # subnetmask in CIDR notation. | 
					
						
							|  |  |  |       my $result = $machine->succeed("nixos-container show-ip webserver"); | 
					
						
							|  |  |  |       chomp $result; | 
					
						
							|  |  |  |       $result eq $ip or die; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-31 21:45:05 +01:00
										 |  |  |       # Stop the container. | 
					
						
							|  |  |  |       $machine->succeed("nixos-container stop webserver"); | 
					
						
							|  |  |  |       $machine->fail("curl --fail --connect-timeout 2 http://$ip/ > /dev/null"); | 
					
						
							|  |  |  |       $machine->fail("curl --fail --connect-timeout 2 http://[$ip6]/ > /dev/null"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Destroying a declarative container should fail. | 
					
						
							|  |  |  |       $machine->fail("nixos-container destroy webserver"); | 
					
						
							|  |  |  |     '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }) |