1{ pkgs, ... }:
2
3let
4 master =
5 { pkgs, ... }:
6 {
7 # data base is stored in memory
8 # server crashes with default memory size
9 virtualisation.memorySize = 1024;
10
11 services.moosefs.master = {
12 enable = true;
13 openFirewall = true;
14 autoInit = true;
15 exports = [
16 "* / rw,alldirs,admin,maproot=0:0"
17 "* . rw"
18 ];
19 };
20 };
21
22 chunkserver =
23 { pkgs, ... }:
24 {
25 virtualisation.emptyDiskImages = [
26 {
27 size = 4096;
28 driveConfig.deviceExtraOpts.serial = "data";
29 }
30 ];
31
32 fileSystems = pkgs.lib.mkVMOverride {
33 "/data" = {
34 device = "/dev/disk/by-id/virtio-data";
35 fsType = "ext4";
36 autoFormat = true;
37 };
38 };
39
40 services.moosefs = {
41 masterHost = "master";
42 chunkserver = {
43 openFirewall = true;
44 enable = true;
45 hdds = [ "~/data" ];
46 };
47 };
48 };
49
50 metalogger =
51 { pkgs, ... }:
52 {
53 services.moosefs = {
54 masterHost = "master";
55 metalogger.enable = true;
56 };
57 };
58
59 client =
60 { pkgs, ... }:
61 {
62 services.moosefs.client.enable = true;
63 };
64
65in
66{
67 name = "moosefs";
68
69 nodes = {
70 inherit master;
71 inherit metalogger;
72 chunkserver1 = chunkserver;
73 chunkserver2 = chunkserver;
74 client1 = client;
75 client2 = client;
76 };
77
78 testScript = ''
79 # prepare master server
80 master.start()
81 master.wait_for_unit("multi-user.target")
82 master.wait_for_unit("mfs-master.service")
83
84 metalogger.wait_for_unit("mfs-metalogger.service")
85
86 for chunkserver in [chunkserver1, chunkserver2]:
87 chunkserver.wait_for_unit("multi-user.target")
88 chunkserver.succeed("chown moosefs:moosefs /data")
89 chunkserver.succeed("systemctl restart mfs-chunkserver")
90 chunkserver.wait_for_unit("mfs-chunkserver.service")
91
92 for client in [client1, client2]:
93 client.wait_for_unit("multi-user.target")
94 client.succeed("mkdir /moosefs")
95 client.succeed("mount -t moosefs master:/ /moosefs")
96
97 client1.succeed("echo test > /moosefs/file")
98 client2.succeed("grep test /moosefs/file")
99 '';
100}