nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
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 = [ 4096 ];
24 boot.initrd.postDeviceCommands = ''
25 ${pkgs.e2fsprogs}/bin/mkfs.ext4 -L data /dev/vdb
26 '';
27
28 fileSystems = pkgs.lib.mkVMOverride {
29 "/data" = {
30 device = "/dev/disk/by-label/data";
31 fsType = "ext4";
32 };
33 };
34
35 services.saunafs = {
36 masterHost = "master";
37 chunkserver = {
38 openFirewall = true;
39 enable = true;
40 hdds = [ "/data" ];
41
42 # The test image is too small and gets set to "full"
43 settings.HDD_LEAVE_SPACE_DEFAULT = "100M";
44 };
45 };
46 };
47
48 metalogger =
49 { pkgs, ... }:
50 {
51 services.saunafs = {
52 masterHost = "master";
53 metalogger.enable = true;
54 };
55 };
56
57 client =
58 { pkgs, lib, ... }:
59 {
60 services.saunafs.client.enable = true;
61 # systemd.tmpfiles.rules = [ "d /sfs 755 root root -" ];
62 systemd.network.enable = true;
63
64 # Use networkd to have properly functioning
65 # network-online.target
66 networking = {
67 useDHCP = false;
68 useNetworkd = true;
69 };
70
71 systemd.mounts = [
72 {
73 requires = [ "network-online.target" ];
74 after = [ "network-online.target" ];
75 wantedBy = [ "remote-fs.target" ];
76 type = "saunafs";
77 what = "master:/";
78 where = "/sfs";
79 }
80 ];
81 };
82
83in
84{
85 name = "saunafs";
86
87 meta.maintainers = [ lib.maintainers.markuskowa ];
88
89 nodes = {
90 inherit master metalogger;
91 chunkserver1 = chunkserver;
92 chunkserver2 = chunkserver;
93 client1 = client;
94 client2 = client;
95 };
96
97 testScript = ''
98 # prepare master server
99 master.start()
100 master.wait_for_unit("multi-user.target")
101 master.succeed("sfsmaster-init")
102 master.succeed("systemctl restart sfs-master")
103 master.wait_for_unit("sfs-master.service")
104
105 metalogger.wait_for_unit("sfs-metalogger.service")
106
107 # Setup chunkservers
108 for chunkserver in [chunkserver1, chunkserver2]:
109 chunkserver.wait_for_unit("multi-user.target")
110 chunkserver.succeed("chown saunafs:saunafs /data")
111 chunkserver.succeed("systemctl restart sfs-chunkserver")
112 chunkserver.wait_for_unit("sfs-chunkserver.service")
113
114 for client in [client1, client2]:
115 client.wait_for_unit("multi-user.target")
116
117 client1.succeed("echo test > /sfs/file")
118 client2.succeed("grep test /sfs/file")
119 '';
120}