| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  | import ./make-test-python.nix ({ pkgs, ...} : | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |   backend = { pkgs, ... }: { | 
					
						
							|  |  |  |     services.httpd = { | 
					
						
							|  |  |  |       enable = true; | 
					
						
							|  |  |  |       adminAddr = "foo@example.org"; | 
					
						
							|  |  |  |       virtualHosts.localhost.documentRoot = "${pkgs.valgrind.doc}/share/doc/valgrind/html"; | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |     networking.firewall.allowedTCPPorts = [ 80 ]; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | in { | 
					
						
							| 
									
										
										
										
											2014-06-28 16:04:49 +02:00
										 |  |  |   name = "proxy"; | 
					
						
							| 
									
										
										
										
											2021-01-10 20:08:30 +01:00
										 |  |  |   meta = with pkgs.lib.maintainers; { | 
					
						
							| 
									
										
										
										
											2019-02-22 16:14:13 +01:00
										 |  |  |     maintainers = [ eelco ]; | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |   nodes = { | 
					
						
							|  |  |  |     proxy = { nodes, ... }: { | 
					
						
							|  |  |  |       services.httpd = { | 
					
						
							|  |  |  |         enable = true; | 
					
						
							|  |  |  |         adminAddr = "bar@example.org"; | 
					
						
							|  |  |  |         extraModules = [ "proxy_balancer" "lbmethod_byrequests" ]; | 
					
						
							|  |  |  |         extraConfig = ''
 | 
					
						
							|  |  |  |           ExtendedStatus on | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |         virtualHosts.localhost = { | 
					
						
							|  |  |  |           extraConfig = ''
 | 
					
						
							|  |  |  |             <Location /server-status> | 
					
						
							|  |  |  |               Require all granted | 
					
						
							|  |  |  |               SetHandler server-status | 
					
						
							|  |  |  |             </Location> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             <Proxy balancer://cluster> | 
					
						
							|  |  |  |               Require all granted | 
					
						
							|  |  |  |               BalancerMember http://${nodes.backend1.config.networking.hostName} retry=0 | 
					
						
							|  |  |  |               BalancerMember http://${nodes.backend2.config.networking.hostName} retry=0 | 
					
						
							|  |  |  |             </Proxy> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             ProxyStatus       full | 
					
						
							|  |  |  |             ProxyPass         /server-status ! | 
					
						
							|  |  |  |             ProxyPass         /       balancer://cluster/ | 
					
						
							|  |  |  |             ProxyPassReverse  /       balancer://cluster/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # For testing; don't want to wait forever for dead backend servers. | 
					
						
							|  |  |  |             ProxyTimeout      5 | 
					
						
							| 
									
										
										
										
											2019-11-04 16:24:55 -05:00
										 |  |  |           '';
 | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  |         }; | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |       }; | 
					
						
							|  |  |  |       networking.firewall.allowedTCPPorts = [ 80 ]; | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |     backend1 = backend; | 
					
						
							|  |  |  |     backend2 = backend; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     client = { ... }: { }; | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |   testScript = ''
 | 
					
						
							|  |  |  |     start_all() | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |     proxy.wait_for_unit("httpd") | 
					
						
							|  |  |  |     backend1.wait_for_unit("httpd") | 
					
						
							|  |  |  |     backend2.wait_for_unit("httpd") | 
					
						
							|  |  |  |     client.wait_for_unit("network.target") | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |     # With the back-ends up, the proxy should work. | 
					
						
							|  |  |  |     client.succeed("curl --fail http://proxy/") | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |     client.succeed("curl --fail http://proxy/server-status") | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |     # Block the first back-end. | 
					
						
							|  |  |  |     backend1.block() | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |     # The proxy should still work. | 
					
						
							|  |  |  |     client.succeed("curl --fail http://proxy/") | 
					
						
							|  |  |  |     client.succeed("curl --fail http://proxy/") | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |     # Block the second back-end. | 
					
						
							|  |  |  |     backend2.block() | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |     # Now the proxy should fail as well. | 
					
						
							|  |  |  |     client.fail("curl --fail http://proxy/") | 
					
						
							| 
									
										
										
										
											2010-01-11 15:58:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-26 13:04:36 +01:00
										 |  |  |     # But if the second back-end comes back, the proxy should start | 
					
						
							|  |  |  |     # working again. | 
					
						
							|  |  |  |     backend2.unblock() | 
					
						
							|  |  |  |     client.succeed("curl --fail http://proxy/") | 
					
						
							|  |  |  |   '';
 | 
					
						
							| 
									
										
										
										
											2014-04-14 14:02:44 +02:00
										 |  |  | }) |