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