at 18.09-beta 2.9 kB view raw
1import ./make-test.nix ({ pkgs, version ? 4, ... }: 2 3let 4 5 client = 6 { pkgs, ... }: 7 { fileSystems = pkgs.lib.mkVMOverride 8 [ { mountPoint = "/data"; 9 # nfs4 exports the export with fsid=0 as a virtual root directory 10 device = if (version == 4) then "server:/" else "server:/data"; 11 fsType = "nfs"; 12 options = [ "vers=${toString version}" ]; 13 } 14 ]; 15 networking.firewall.enable = false; # FIXME: only open statd 16 }; 17 18in 19 20{ 21 name = "nfs"; 22 meta = with pkgs.stdenv.lib.maintainers; { 23 maintainers = [ eelco chaoflow wkennington ]; 24 }; 25 26 nodes = 27 { client1 = client; 28 client2 = client; 29 30 server = 31 { ... }: 32 { services.nfs.server.enable = true; 33 services.nfs.server.exports = 34 '' 35 /data 192.168.1.0/255.255.255.0(rw,no_root_squash,no_subtree_check,fsid=0) 36 ''; 37 services.nfs.server.createMountPoints = true; 38 networking.firewall.enable = false; # FIXME: figure out what ports need to be allowed 39 }; 40 }; 41 42 testScript = 43 '' 44 $server->waitForUnit("nfs-server"); 45 $server->succeed("systemctl start network-online.target"); 46 $server->waitForUnit("network-online.target"); 47 48 startAll; 49 50 $client1->waitForUnit("data.mount"); 51 $client1->succeed("echo bla > /data/foo"); 52 $server->succeed("test -e /data/foo"); 53 54 $client2->waitForUnit("data.mount"); 55 $client2->succeed("echo bla > /data/bar"); 56 $server->succeed("test -e /data/bar"); 57 58 # Test whether restarting nfs-server works correctly. 59 $server->succeed("systemctl restart nfs-server"); 60 $client2->succeed("echo bla >> /data/bar"); # will take 90 seconds due to the NFS grace period 61 62 # Test whether we can get a lock. 63 $client2->succeed("time flock -n -s /data/lock true"); 64 65 # Test locking: client 1 acquires an exclusive lock, so client 2 66 # should then fail to acquire a shared lock. 67 $client1->succeed("flock -x /data/lock -c 'touch locked; sleep 100000' &"); 68 $client1->waitForFile("locked"); 69 $client2->fail("flock -n -s /data/lock true"); 70 71 # Test whether client 2 obtains the lock if we reset client 1. 72 $client2->succeed("flock -x /data/lock -c 'echo acquired; touch locked; sleep 100000' >&2 &"); 73 $client1->crash; 74 $client1->start; 75 $client2->waitForFile("locked"); 76 77 # Test whether locks survive a reboot of the server. 78 $client1->waitForUnit("data.mount"); 79 $server->shutdown; 80 $server->start; 81 $client1->succeed("touch /data/xyzzy"); 82 $client1->fail("time flock -n -s /data/lock true"); 83 84 # Test whether unmounting during shutdown happens quickly. 85 my $t1 = time; 86 $client1->shutdown; 87 my $duration = time - $t1; 88 die "shutdown took too long ($duration seconds)" if $duration > 30; 89 ''; 90})