at master 2.9 kB view raw
1{ pkgs, lib, ... }: 2 3let 4 master = 5 { pkgs, ... }: 6 { 7 # data base is stored in memory 8 # server may crash with default memory size 9 virtualisation.memorySize = 1024; 10 11 services.saunafs.master = { 12 enable = true; 13 openFirewall = true; 14 exports = [ 15 "* / rw,alldirs,maproot=0:0" 16 ]; 17 }; 18 }; 19 20 chunkserver = 21 { pkgs, ... }: 22 { 23 virtualisation.emptyDiskImages = [ 24 { 25 size = 4096; 26 driveConfig.deviceExtraOpts.serial = "data"; 27 } 28 ]; 29 30 fileSystems = pkgs.lib.mkVMOverride { 31 "/data" = { 32 device = "/dev/disk/by-id/virtio-data"; 33 fsType = "ext4"; 34 autoFormat = true; 35 }; 36 }; 37 38 services.saunafs = { 39 masterHost = "master"; 40 chunkserver = { 41 openFirewall = true; 42 enable = true; 43 hdds = [ "/data" ]; 44 45 # The test image is too small and gets set to "full" 46 settings.HDD_LEAVE_SPACE_DEFAULT = "100M"; 47 }; 48 }; 49 }; 50 51 metalogger = 52 { pkgs, ... }: 53 { 54 services.saunafs = { 55 masterHost = "master"; 56 metalogger.enable = true; 57 }; 58 }; 59 60 client = 61 { pkgs, lib, ... }: 62 { 63 services.saunafs.client.enable = true; 64 # systemd.tmpfiles.rules = [ "d /sfs 755 root root -" ]; 65 systemd.network.enable = true; 66 67 # Use networkd to have properly functioning 68 # network-online.target 69 networking = { 70 useDHCP = false; 71 useNetworkd = true; 72 }; 73 74 systemd.mounts = [ 75 { 76 requires = [ "network-online.target" ]; 77 after = [ "network-online.target" ]; 78 wantedBy = [ "remote-fs.target" ]; 79 type = "saunafs"; 80 what = "master:/"; 81 where = "/sfs"; 82 } 83 ]; 84 }; 85 86in 87{ 88 name = "saunafs"; 89 90 meta.maintainers = [ lib.maintainers.markuskowa ]; 91 92 nodes = { 93 inherit master metalogger; 94 chunkserver1 = chunkserver; 95 chunkserver2 = chunkserver; 96 client1 = client; 97 client2 = client; 98 }; 99 100 testScript = '' 101 # prepare master server 102 master.start() 103 master.wait_for_unit("multi-user.target") 104 master.succeed("sfsmaster-init") 105 master.succeed("systemctl restart sfs-master") 106 master.wait_for_unit("sfs-master.service") 107 108 metalogger.wait_for_unit("sfs-metalogger.service") 109 110 # Setup chunkservers 111 for chunkserver in [chunkserver1, chunkserver2]: 112 chunkserver.wait_for_unit("multi-user.target") 113 chunkserver.succeed("chown saunafs:saunafs /data") 114 chunkserver.succeed("systemctl restart sfs-chunkserver") 115 chunkserver.wait_for_unit("sfs-chunkserver.service") 116 117 for client in [client1, client2]: 118 client.wait_for_unit("multi-user.target") 119 120 client1.succeed("echo test > /sfs/file") 121 client2.succeed("grep test /sfs/file") 122 ''; 123}