| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |  | import ./make-test.nix ({ pkgs, version ? 4, ... }: | 
					
						
							| 
									
										
										
										
											2010-06-08 16:02:22 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-09 13:18:49 +00:00
										 |  |  |  | let | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  |  |   client = | 
					
						
							| 
									
										
										
										
											2010-06-09 13:18:49 +00:00
										 |  |  |  |     { config, pkgs, ... }: | 
					
						
							| 
									
										
										
										
											2013-10-29 13:04:52 +01:00
										 |  |  |  |     { fileSystems = pkgs.lib.mkVMOverride | 
					
						
							| 
									
										
										
										
											2010-06-09 13:18:49 +00:00
										 |  |  |  |         [ { mountPoint = "/data"; | 
					
						
							| 
									
										
										
										
											2015-09-01 11:59:01 +02:00
										 |  |  |  |             device = "server:/data"; | 
					
						
							| 
									
										
										
										
											2010-06-09 13:18:49 +00:00
										 |  |  |  |             fsType = "nfs"; | 
					
						
							| 
									
										
										
										
											2015-10-21 17:37:14 +00:00
										 |  |  |  |             options = [ "vers=${toString version}" ]; | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  |  |           } | 
					
						
							| 
									
										
										
										
											2010-06-09 13:18:49 +00:00
										 |  |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2014-04-11 17:15:56 +02:00
										 |  |  |  |       networking.firewall.enable = false; # FIXME: only open statd | 
					
						
							| 
									
										
										
										
											2010-06-09 13:18:49 +00:00
										 |  |  |  |     }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | in | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-08 16:02:22 +00:00
										 |  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-06-28 16:04:49 +02:00
										 |  |  |  |   name = "nfs"; | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |  |   meta = with pkgs.stdenv.lib.maintainers; { | 
					
						
							|  |  |  |  |     maintainers = [ eelco chaoflow wkennington ]; | 
					
						
							|  |  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2010-06-08 16:02:22 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |   nodes = | 
					
						
							| 
									
										
										
										
											2010-06-09 13:18:49 +00:00
										 |  |  |  |     { client1 = client; | 
					
						
							|  |  |  |  |       client2 = client; | 
					
						
							| 
									
										
										
										
											2010-06-08 16:02:22 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  |  |       server = | 
					
						
							| 
									
										
										
										
											2010-06-08 16:02:22 +00:00
										 |  |  |  |         { config, pkgs, ... }: | 
					
						
							| 
									
										
										
										
											2012-03-16 20:41:49 +00:00
										 |  |  |  |         { services.nfs.server.enable = true; | 
					
						
							|  |  |  |  |           services.nfs.server.exports = | 
					
						
							| 
									
										
										
										
											2010-06-08 16:02:22 +00:00
										 |  |  |  |             ''
 | 
					
						
							| 
									
										
										
										
											2013-07-16 13:59:41 +02:00
										 |  |  |  |               /data 192.168.1.0/255.255.255.0(rw,no_root_squash,no_subtree_check,fsid=0) | 
					
						
							| 
									
										
										
										
											2010-06-08 16:02:22 +00:00
										 |  |  |  |             '';
 | 
					
						
							| 
									
										
										
										
											2012-03-16 20:41:49 +00:00
										 |  |  |  |           services.nfs.server.createMountPoints = true; | 
					
						
							| 
									
										
										
										
											2014-04-11 17:15:56 +02:00
										 |  |  |  |           networking.firewall.enable = false; # FIXME: figure out what ports need to be allowed | 
					
						
							| 
									
										
										
										
											2010-06-08 16:02:22 +00:00
										 |  |  |  |         }; | 
					
						
							|  |  |  |  |     }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   testScript = | 
					
						
							|  |  |  |  |     ''
 | 
					
						
							| 
									
										
										
										
											2017-02-05 12:40:41 +03:00
										 |  |  |  |       $server->waitForUnit("nfs-server"); | 
					
						
							| 
									
										
										
										
											2014-12-02 01:34:20 -08:00
										 |  |  |  |       $server->succeed("systemctl start network-online.target"); | 
					
						
							| 
									
										
										
										
											2014-12-01 17:17:46 -08:00
										 |  |  |  |       $server->waitForUnit("network-online.target"); | 
					
						
							| 
									
										
										
										
											2010-06-08 16:02:22 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-16 20:10:14 +00:00
										 |  |  |  |       startAll; | 
					
						
							| 
									
										
										
										
											2010-06-08 16:02:22 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-24 18:22:53 +02:00
										 |  |  |  |       $client1->waitForUnit("data.mount"); | 
					
						
							| 
									
										
										
										
											2010-06-09 13:18:49 +00:00
										 |  |  |  |       $client1->succeed("echo bla > /data/foo"); | 
					
						
							| 
									
										
										
										
											2010-06-08 16:02:22 +00:00
										 |  |  |  |       $server->succeed("test -e /data/foo"); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-24 18:22:53 +02:00
										 |  |  |  |       $client2->waitForUnit("data.mount"); | 
					
						
							| 
									
										
										
										
											2010-06-09 13:18:49 +00:00
										 |  |  |  |       $client2->succeed("echo bla > /data/bar"); | 
					
						
							|  |  |  |  |       $server->succeed("test -e /data/bar"); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-05 12:40:41 +03:00
										 |  |  |  |       # Test whether restarting ‘nfs-server’ works correctly. | 
					
						
							|  |  |  |  |       $server->succeed("systemctl restart nfs-server"); | 
					
						
							| 
									
										
										
										
											2012-03-16 20:10:14 +00:00
										 |  |  |  |       $client2->succeed("echo bla >> /data/bar"); # will take 90 seconds due to the NFS grace period | 
					
						
							| 
									
										
										
										
											2011-10-13 14:08:00 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-16 20:10:14 +00:00
										 |  |  |  |       # Test whether we can get a lock. | 
					
						
							| 
									
										
										
										
											2010-06-09 15:11:46 +00:00
										 |  |  |  |       $client2->succeed("time flock -n -s /data/lock true"); | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-09 13:18:49 +00:00
										 |  |  |  |       # Test locking: client 1 acquires an exclusive lock, so client 2 | 
					
						
							|  |  |  |  |       # should then fail to acquire a shared lock. | 
					
						
							|  |  |  |  |       $client1->succeed("flock -x /data/lock -c 'touch locked; sleep 100000' &"); | 
					
						
							|  |  |  |  |       $client1->waitForFile("locked"); | 
					
						
							|  |  |  |  |       $client2->fail("flock -n -s /data/lock true"); | 
					
						
							| 
									
										
										
										
											2010-06-09 13:46:18 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |       # Test whether client 2 obtains the lock if we reset client 1. | 
					
						
							| 
									
										
										
										
											2010-06-09 15:11:46 +00:00
										 |  |  |  |       $client2->succeed("flock -x /data/lock -c 'echo acquired; touch locked; sleep 100000' >&2 &"); | 
					
						
							| 
									
										
										
										
											2010-06-09 13:46:18 +00:00
										 |  |  |  |       $client1->crash; | 
					
						
							|  |  |  |  |       $client1->start; | 
					
						
							|  |  |  |  |       $client2->waitForFile("locked"); | 
					
						
							| 
									
										
										
										
											2010-06-09 15:11:46 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |       # Test whether locks survive a reboot of the server. | 
					
						
							| 
									
										
										
										
											2012-10-24 18:22:53 +02:00
										 |  |  |  |       $client1->waitForUnit("data.mount"); | 
					
						
							| 
									
										
										
										
											2010-06-09 15:11:46 +00:00
										 |  |  |  |       $server->shutdown; | 
					
						
							|  |  |  |  |       $server->start; | 
					
						
							|  |  |  |  |       $client1->succeed("touch /data/xyzzy"); | 
					
						
							|  |  |  |  |       $client1->fail("time flock -n -s /data/lock true"); | 
					
						
							| 
									
										
										
										
											2010-06-09 22:29:06 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-16 20:10:14 +00:00
										 |  |  |  |       # Test whether unmounting during shutdown happens quickly. | 
					
						
							| 
									
										
										
										
											2010-06-09 22:29:06 +00:00
										 |  |  |  |       my $t1 = time; | 
					
						
							|  |  |  |  |       $client1->shutdown; | 
					
						
							|  |  |  |  |       my $duration = time - $t1; | 
					
						
							|  |  |  |  |       die "shutdown took too long ($duration seconds)" if $duration > 30; | 
					
						
							| 
									
										
										
										
											2010-06-08 16:02:22 +00:00
										 |  |  |  |     '';
 | 
					
						
							| 
									
										
										
										
											2014-04-14 14:02:44 +02:00
										 |  |  |  | }) |