at master 1.9 kB view raw
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}