1import ./make-test-python.nix (
2 { pkgs, lib, ... }:
3 let
4 drbdPort = 7789;
5
6 drbdConfig =
7 { nodes, ... }:
8 {
9 virtualisation.emptyDiskImages = [ 1 ];
10 networking.firewall.allowedTCPPorts = [ drbdPort ];
11
12 services.drbd = {
13 enable = true;
14 config = ''
15 global {
16 usage-count yes;
17 }
18
19 common {
20 net {
21 protocol C;
22 ping-int 1;
23 }
24 }
25
26 resource r0 {
27 volume 0 {
28 device /dev/drbd0;
29 disk /dev/vdb;
30 meta-disk internal;
31 }
32
33 on drbd1 {
34 address ${nodes.drbd1.networking.primaryIPAddress}:${toString drbdPort};
35 }
36
37 on drbd2 {
38 address ${nodes.drbd2.networking.primaryIPAddress}:${toString drbdPort};
39 }
40 }
41 '';
42 };
43 };
44 in
45 {
46 name = "drbd";
47 meta = with pkgs.lib.maintainers; {
48 maintainers = [
49 ryantm
50 astro
51 birkb
52 ];
53 };
54
55 nodes.drbd1 = drbdConfig;
56 nodes.drbd2 = drbdConfig;
57
58 testScript =
59 { nodes }:
60 ''
61 drbd1.start()
62 drbd2.start()
63
64 drbd1.wait_for_unit("network.target")
65 drbd2.wait_for_unit("network.target")
66
67 drbd1.succeed(
68 "drbdadm create-md r0",
69 "drbdadm up r0",
70 "drbdadm primary r0 --force",
71 )
72
73 drbd2.succeed("drbdadm create-md r0", "drbdadm up r0")
74
75 drbd1.succeed(
76 "mkfs.ext4 /dev/drbd0",
77 "mkdir -p /mnt/drbd",
78 "mount /dev/drbd0 /mnt/drbd",
79 "touch /mnt/drbd/hello",
80 "umount /mnt/drbd",
81 "drbdadm secondary r0",
82 )
83 drbd1.sleep(1)
84
85 drbd2.succeed(
86 "drbdadm primary r0",
87 "mkdir -p /mnt/drbd",
88 "mount /dev/drbd0 /mnt/drbd",
89 "ls /mnt/drbd/hello",
90 )
91 '';
92 }
93)