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}