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