| 
									
										
										
										
											2017-02-11 16:46:55 +01:00
										 |  |  | # Test for NixOS' container support. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							| 
									
										
										
										
											2019-08-13 21:52:01 +00:00
										 |  |  |   client_base = { | 
					
						
							| 
									
										
										
										
											2017-02-11 16:46:55 +01:00
										 |  |  |     networking.firewall.enable = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     containers.webserver = { | 
					
						
							|  |  |  |       autoStart = true; | 
					
						
							|  |  |  |       privateNetwork = true; | 
					
						
							|  |  |  |       hostBridge = "br0"; | 
					
						
							|  |  |  |       config = { | 
					
						
							|  |  |  |         networking.firewall.enable = false; | 
					
						
							| 
									
										
										
										
											2017-12-03 05:14:54 +01:00
										 |  |  |         networking.interfaces.eth0.ipv4.addresses = [ | 
					
						
							| 
									
										
										
										
											2017-02-11 16:46:55 +01:00
										 |  |  |           { address = "192.168.1.122"; prefixLength = 24; } | 
					
						
							|  |  |  |         ]; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2019-12-01 02:29:24 +01:00
										 |  |  | in import ./make-test-python.nix ({ pkgs, ...} : | 
					
						
							| 
									
										
										
										
											2017-02-11 16:46:55 +01:00
										 |  |  | { | 
					
						
							|  |  |  |   name = "containers-restart_networking"; | 
					
						
							|  |  |  |   meta = with pkgs.stdenv.lib.maintainers; { | 
					
						
							|  |  |  |     maintainers = [ kampfschlaefer ]; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   nodes = { | 
					
						
							| 
									
										
										
										
											2018-07-20 20:56:59 +00:00
										 |  |  |     client = { lib, ... }: client_base // { | 
					
						
							| 
									
										
										
										
											2017-02-11 16:46:55 +01:00
										 |  |  |       virtualisation.vlans = [ 1 ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       networking.bridges.br0 = { | 
					
						
							|  |  |  |         interfaces = []; | 
					
						
							|  |  |  |         rstp = false; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       networking.interfaces = { | 
					
						
							| 
									
										
										
										
											2017-12-03 05:14:54 +01:00
										 |  |  |         eth1.ipv4.addresses = lib.mkOverride 0 [ ]; | 
					
						
							|  |  |  |         br0.ipv4.addresses = [ { address = "192.168.1.1"; prefixLength = 24; } ]; | 
					
						
							| 
									
										
										
										
											2017-02-11 16:46:55 +01:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2018-07-20 20:56:59 +00:00
										 |  |  |     client_eth1 = { lib, ... }: client_base // { | 
					
						
							| 
									
										
										
										
											2017-02-11 16:46:55 +01:00
										 |  |  |       networking.bridges.br0 = { | 
					
						
							|  |  |  |         interfaces = [ "eth1" ]; | 
					
						
							|  |  |  |         rstp = false; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       networking.interfaces = { | 
					
						
							| 
									
										
										
										
											2017-12-03 05:14:54 +01:00
										 |  |  |         eth1.ipv4.addresses = lib.mkOverride 0 [ ]; | 
					
						
							|  |  |  |         br0.ipv4.addresses = [ { address = "192.168.1.2"; prefixLength = 24; } ]; | 
					
						
							| 
									
										
										
										
											2017-02-11 16:46:55 +01:00
										 |  |  |       }; | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2018-07-20 20:56:59 +00:00
										 |  |  |     client_eth1_rstp = { lib, ... }: client_base // { | 
					
						
							| 
									
										
										
										
											2017-02-11 16:46:55 +01:00
										 |  |  |       networking.bridges.br0 = { | 
					
						
							|  |  |  |         interfaces = [ "eth1" ]; | 
					
						
							|  |  |  |         rstp = true; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       networking.interfaces = { | 
					
						
							| 
									
										
										
										
											2017-12-03 05:14:54 +01:00
										 |  |  |         eth1.ipv4.addresses = lib.mkOverride 0 [ ]; | 
					
						
							|  |  |  |         br0.ipv4.addresses =  [ { address = "192.168.1.2"; prefixLength = 24; } ]; | 
					
						
							| 
									
										
										
										
											2017-02-11 16:46:55 +01:00
										 |  |  |       }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   testScript = {nodes, ...}: let | 
					
						
							|  |  |  |     originalSystem = nodes.client.config.system.build.toplevel; | 
					
						
							|  |  |  |     eth1_bridged = nodes.client_eth1.config.system.build.toplevel; | 
					
						
							|  |  |  |     eth1_rstp = nodes.client_eth1_rstp.config.system.build.toplevel; | 
					
						
							|  |  |  |   in ''
 | 
					
						
							| 
									
										
										
										
											2019-12-01 02:29:24 +01:00
										 |  |  |     client.start() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client.wait_for_unit("default.target") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with subtest("Initial configuration connectivity check"): | 
					
						
							|  |  |  |         client.succeed("ping 192.168.1.122 -c 1 -n >&2") | 
					
						
							|  |  |  |         client.succeed("nixos-container run webserver -- ping -c 1 -n 192.168.1.1 >&2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         client.fail("ip l show eth1 |grep 'master br0' >&2") | 
					
						
							|  |  |  |         client.fail("grep eth1 /run/br0.interfaces >&2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with subtest("Bridged configuration without STP preserves connectivity"): | 
					
						
							|  |  |  |         client.succeed( | 
					
						
							|  |  |  |             "${eth1_bridged}/bin/switch-to-configuration test >&2" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         client.succeed( | 
					
						
							|  |  |  |             "ping 192.168.1.122 -c 1 -n >&2", | 
					
						
							|  |  |  |             "nixos-container run webserver -- ping -c 1 -n 192.168.1.2 >&2", | 
					
						
							|  |  |  |             "ip l show eth1 |grep 'master br0' >&2", | 
					
						
							|  |  |  |             "grep eth1 /run/br0.interfaces >&2", | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     #  activating rstp needs another service, therefore the bridge will restart and the container will lose its connectivity | 
					
						
							|  |  |  |     # with subtest("Bridged configuration with STP"): | 
					
						
							|  |  |  |     #     client.succeed("${eth1_rstp}/bin/switch-to-configuration test >&2") | 
					
						
							|  |  |  |     #     client.execute("ip -4 a >&2") | 
					
						
							|  |  |  |     #     client.execute("ip l >&2") | 
					
						
							| 
									
										
										
										
											2017-02-11 16:46:55 +01:00
										 |  |  |     # | 
					
						
							| 
									
										
										
										
											2019-12-01 02:29:24 +01:00
										 |  |  |     #     client.succeed( | 
					
						
							|  |  |  |     #         "ping 192.168.1.122 -c 1 -n >&2", | 
					
						
							|  |  |  |     #         "nixos-container run webserver -- ping -c 1 -n 192.168.1.2 >&2", | 
					
						
							|  |  |  |     #         "ip l show eth1 |grep 'master br0' >&2", | 
					
						
							|  |  |  |     #         "grep eth1 /run/br0.interfaces >&2", | 
					
						
							|  |  |  |     #     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with subtest("Reverting to initial configuration preserves connectivity"): | 
					
						
							|  |  |  |         client.succeed( | 
					
						
							|  |  |  |             "${originalSystem}/bin/switch-to-configuration test >&2" | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         client.succeed("ping 192.168.1.122 -c 1 -n >&2") | 
					
						
							|  |  |  |         client.succeed("nixos-container run webserver -- ping -c 1 -n 192.168.1.1 >&2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         client.fail("ip l show eth1 |grep 'master br0' >&2") | 
					
						
							|  |  |  |         client.fail("grep eth1 /run/br0.interfaces >&2") | 
					
						
							| 
									
										
										
										
											2017-02-11 16:46:55 +01:00
										 |  |  |   '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }) |