| 
									
										
										
										
											2014-04-03 16:26:03 +02:00
										 |  |  |  | # Test for NixOS' container support. | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |  | import ./make-test.nix ({ pkgs, ...} : { | 
					
						
							| 
									
										
										
										
											2016-03-18 15:29:45 +01:00
										 |  |  |  |   name = "containers-imperative"; | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |  |   meta = with pkgs.stdenv.lib.maintainers; { | 
					
						
							| 
									
										
										
										
											2019-02-22 16:14:13 +01:00
										 |  |  |  |     maintainers = [ aristid aszlig eelco kampfschlaefer ]; | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2014-04-03 16:26:03 +02:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |   machine = | 
					
						
							| 
									
										
										
										
											2016-05-04 20:44:55 +02:00
										 |  |  |  |     { config, pkgs, lib, ... }: | 
					
						
							| 
									
										
										
										
											2014-04-03 16:26:03 +02:00
										 |  |  |  |     { imports = [ ../modules/installer/cd-dvd/channel.nix ]; | 
					
						
							| 
									
										
										
										
											2018-08-02 05:32:39 +02:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |       # XXX: Sandbox setup fails while trying to hardlink files from the host's | 
					
						
							|  |  |  |  |       #      store file system into the prepared chroot directory. | 
					
						
							|  |  |  |  |       nix.useSandbox = false; | 
					
						
							| 
									
										
										
										
											2018-09-19 16:19:31 +02:00
										 |  |  |  |       nix.binaryCaches = []; # don't try to access cache.nixos.org | 
					
						
							| 
									
										
										
										
											2018-08-02 05:32:39 +02:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-03 16:26:03 +02:00
										 |  |  |  |       virtualisation.writableStore = true; | 
					
						
							| 
									
										
										
										
											2018-07-06 15:55:33 +02:00
										 |  |  |  |       virtualisation.memorySize = 1024; | 
					
						
							| 
									
										
										
										
											2016-05-04 19:53:43 +02:00
										 |  |  |  |       # Make sure we always have all the required dependencies for creating a | 
					
						
							|  |  |  |  |       # container available within the VM, because we don't have network access. | 
					
						
							|  |  |  |  |       virtualisation.pathsInNixDB = let | 
					
						
							|  |  |  |  |         emptyContainer = import ../lib/eval-config.nix { | 
					
						
							| 
									
										
										
										
											2018-04-20 12:22:40 +02:00
										 |  |  |  |           inherit (config.nixpkgs.localSystem) system; | 
					
						
							| 
									
										
										
										
											2016-05-04 19:53:43 +02:00
										 |  |  |  |           modules = lib.singleton { | 
					
						
							| 
									
										
										
										
											2018-05-15 00:18:49 +02:00
										 |  |  |  |             containers.foo.config = { | 
					
						
							| 
									
										
										
										
											2018-07-25 23:22:54 +03:00
										 |  |  |  |               system.stateVersion = "18.03"; | 
					
						
							| 
									
										
										
										
											2018-05-15 00:18:49 +02:00
										 |  |  |  |             }; | 
					
						
							| 
									
										
										
										
											2016-05-04 19:53:43 +02:00
										 |  |  |  |           }; | 
					
						
							|  |  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2018-09-19 16:19:31 +02:00
										 |  |  |  |       in with pkgs; [ | 
					
						
							|  |  |  |  |         stdenv stdenvNoCC emptyContainer.config.containers.foo.path | 
					
						
							|  |  |  |  |         libxslt desktop-file-utils texinfo docbook5 libxml2 | 
					
						
							|  |  |  |  |         docbook_xsl_ns xorg.lndir documentation-highlighter | 
					
						
							| 
									
										
										
										
											2018-06-01 08:10:27 +02:00
										 |  |  |  |       ]; | 
					
						
							| 
									
										
										
										
											2014-04-03 16:26:03 +02:00
										 |  |  |  |     }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-11 23:33:58 +02:00
										 |  |  |  |   testScript = let | 
					
						
							|  |  |  |  |     tmpfilesContainerConfig = pkgs.writeText "container-config-tmpfiles" ''
 | 
					
						
							|  |  |  |  |       { | 
					
						
							|  |  |  |  |         systemd.tmpfiles.rules = [ "d /foo - - - - -" ]; | 
					
						
							|  |  |  |  |         systemd.services.foo = { | 
					
						
							|  |  |  |  |           serviceConfig.Type = "oneshot"; | 
					
						
							|  |  |  |  |           script = "ls -al /foo"; | 
					
						
							|  |  |  |  |           wantedBy = [ "multi-user.target" ]; | 
					
						
							|  |  |  |  |         }; | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |     ''; in
 | 
					
						
							| 
									
										
										
										
											2014-04-03 16:26:03 +02:00
										 |  |  |  |     ''
 | 
					
						
							|  |  |  |  |       # Make sure we have a NixOS tree (required by ‘nixos-container create’). | 
					
						
							| 
									
										
										
										
											2015-08-05 17:29:08 +02:00
										 |  |  |  |       $machine->succeed("PAGER=cat nix-env -qa -A nixos.hello >&2"); | 
					
						
							| 
									
										
										
										
											2014-04-03 16:26:03 +02:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |       # Create some containers imperatively. | 
					
						
							|  |  |  |  |       my $id1 = $machine->succeed("nixos-container create foo --ensure-unique-name"); | 
					
						
							|  |  |  |  |       chomp $id1; | 
					
						
							|  |  |  |  |       $machine->log("created container $id1"); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       my $id2 = $machine->succeed("nixos-container create foo --ensure-unique-name"); | 
					
						
							|  |  |  |  |       chomp $id2; | 
					
						
							|  |  |  |  |       $machine->log("created container $id2"); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       die if $id1 eq $id2; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-11 18:03:45 +02:00
										 |  |  |  |       # Put the root of $id2 into a bind mount. | 
					
						
							|  |  |  |  |       $machine->succeed( | 
					
						
							|  |  |  |  |         "mv /var/lib/containers/$id2 /id2-bindmount", | 
					
						
							|  |  |  |  |         "mount --bind /id2-bindmount /var/lib/containers/$id1" | 
					
						
							|  |  |  |  |       ); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-03 16:26:03 +02:00
										 |  |  |  |       my $ip1 = $machine->succeed("nixos-container show-ip $id1"); | 
					
						
							|  |  |  |  |       chomp $ip1; | 
					
						
							|  |  |  |  |       my $ip2 = $machine->succeed("nixos-container show-ip $id2"); | 
					
						
							|  |  |  |  |       chomp $ip2; | 
					
						
							|  |  |  |  |       die if $ip1 eq $ip2; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-11 18:03:45 +02:00
										 |  |  |  |       # Create a directory and a file we can later check if it still exists | 
					
						
							|  |  |  |  |       # after destruction of the container. | 
					
						
							|  |  |  |  |       $machine->succeed( | 
					
						
							|  |  |  |  |         "mkdir /nested-bindmount", | 
					
						
							|  |  |  |  |         "echo important data > /nested-bindmount/dummy", | 
					
						
							|  |  |  |  |       ); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       # Create a directory with a dummy file and bind-mount it into both | 
					
						
							|  |  |  |  |       # containers. | 
					
						
							|  |  |  |  |       foreach ($id1, $id2) { | 
					
						
							|  |  |  |  |         my $importantPath = "/var/lib/containers/$_/very/important/data"; | 
					
						
							|  |  |  |  |         $machine->succeed( | 
					
						
							|  |  |  |  |           "mkdir -p $importantPath", | 
					
						
							|  |  |  |  |           "mount --bind /nested-bindmount $importantPath" | 
					
						
							|  |  |  |  |         ); | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-03 16:26:03 +02:00
										 |  |  |  |       # Start one of them. | 
					
						
							|  |  |  |  |       $machine->succeed("nixos-container start $id1"); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       # Execute commands via the root shell. | 
					
						
							| 
									
										
										
										
											2014-04-16 16:09:32 +02:00
										 |  |  |  |       $machine->succeed("nixos-container run $id1 -- uname") =~ /Linux/ or die; | 
					
						
							| 
									
										
										
										
											2014-04-03 16:26:03 +02:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 16:13:42 +02:00
										 |  |  |  |       # Execute a nix command via the root shell. (regression test for #40355) | 
					
						
							|  |  |  |  |       $machine->succeed("nixos-container run $id1 -- nix-instantiate -E 'derivation { name = \"empty\"; builder = \"false\"; system = \"false\"; }'"); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-24 23:19:34 +01:00
										 |  |  |  |       # Stop and start (regression test for #4989) | 
					
						
							|  |  |  |  |       $machine->succeed("nixos-container stop $id1"); | 
					
						
							|  |  |  |  |       $machine->succeed("nixos-container start $id1"); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-11 23:33:58 +02:00
										 |  |  |  |       # Ensure tmpfiles are present | 
					
						
							|  |  |  |  |       $machine->log("creating container tmpfiles"); | 
					
						
							|  |  |  |  |       $machine->succeed("nixos-container create tmpfiles --config-file ${tmpfilesContainerConfig}"); | 
					
						
							|  |  |  |  |       $machine->log("created, starting…"); | 
					
						
							|  |  |  |  |       $machine->succeed("nixos-container start tmpfiles"); | 
					
						
							|  |  |  |  |       $machine->log("done starting, investigating…"); | 
					
						
							|  |  |  |  |       $machine->succeed("echo \$(nixos-container run tmpfiles -- systemctl is-active foo.service) | grep -q active;"); | 
					
						
							|  |  |  |  |       $machine->succeed("nixos-container destroy tmpfiles"); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-24 23:19:34 +01:00
										 |  |  |  |       # Execute commands via the root shell. | 
					
						
							|  |  |  |  |       $machine->succeed("nixos-container run $id1 -- uname") =~ /Linux/ or die; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-03 16:26:03 +02:00
										 |  |  |  |       # Destroy the containers. | 
					
						
							|  |  |  |  |       $machine->succeed("nixos-container destroy $id1"); | 
					
						
							|  |  |  |  |       $machine->succeed("nixos-container destroy $id2"); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-11 18:03:45 +02:00
										 |  |  |  |       $machine->succeed( | 
					
						
							|  |  |  |  |         # Check whether destruction of any container has killed important data | 
					
						
							|  |  |  |  |         "grep -qF 'important data' /nested-bindmount/dummy", | 
					
						
							|  |  |  |  |         # Ensure that the container path is gone | 
					
						
							|  |  |  |  |         "test ! -e /var/lib/containers/$id1" | 
					
						
							|  |  |  |  |       ); | 
					
						
							| 
									
										
										
										
											2014-04-03 16:26:03 +02:00
										 |  |  |  |     '';
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |  | }) |