1{ pkgs, lib, ... }:
2{
3 name = "keepalived";
4 meta.maintainers = [ lib.maintainers.raitobezarius ];
5
6 nodes = {
7 node1 =
8 { pkgs, ... }:
9 {
10 services.keepalived.enable = true;
11 services.keepalived.openFirewall = true;
12 services.keepalived.vrrpInstances.test = {
13 interface = "eth1";
14 state = "MASTER";
15 priority = 50;
16 virtualIps = [ { addr = "192.168.1.200"; } ];
17 virtualRouterId = 1;
18 };
19 environment.systemPackages = [ pkgs.tcpdump ];
20 };
21 node2 =
22 { pkgs, ... }:
23 {
24 services.keepalived.enable = true;
25 services.keepalived.openFirewall = true;
26 services.keepalived.vrrpInstances.test = {
27 interface = "eth1";
28 state = "MASTER";
29 priority = 100;
30 virtualIps = [ { addr = "192.168.1.200"; } ];
31 virtualRouterId = 1;
32 };
33 environment.systemPackages = [ pkgs.tcpdump ];
34 };
35 };
36
37 testScript = ''
38 # wait for boot time delay to pass
39 for node in [node1, node2]:
40 node.wait_until_succeeds(
41 "systemctl show -p LastTriggerUSecMonotonic keepalived-boot-delay.timer | grep -vq 'LastTriggerUSecMonotonic=0'"
42 )
43 node.wait_for_unit("keepalived")
44 node2.wait_until_succeeds("ip addr show dev eth1 | grep -q 192.168.1.200")
45 node1.fail("ip addr show dev eth1 | grep -q 192.168.1.200")
46 node1.succeed("ping -c1 192.168.1.200")
47 '';
48}