summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlvar Penning <post@0x21.biz>2021-06-13 22:00:25 +0200
committerAlvar Penning <post@0x21.biz>2021-06-15 18:31:57 +0200
commit95ca79092e3275d1ac8e3fa4d97e7c1a111f7d14 (patch)
treef8cbe6ab6836342621d70cb574dc40c64ac6cb7f
parent8673a40eda6784a33f8e03521e9132ebe557d94f (diff)
downloadnixpkgs-95ca79092e3275d1ac8e3fa4d97e7c1a111f7d14.tar
nixpkgs-95ca79092e3275d1ac8e3fa4d97e7c1a111f7d14.tar.gz
nixpkgs-95ca79092e3275d1ac8e3fa4d97e7c1a111f7d14.tar.bz2
nixpkgs-95ca79092e3275d1ac8e3fa4d97e7c1a111f7d14.tar.lz
nixpkgs-95ca79092e3275d1ac8e3fa4d97e7c1a111f7d14.tar.xz
nixpkgs-95ca79092e3275d1ac8e3fa4d97e7c1a111f7d14.tar.zst
nixpkgs-95ca79092e3275d1ac8e3fa4d97e7c1a111f7d14.zip
nixos/test/ucarp: init
-rw-r--r--nixos/tests/all-tests.nix1
-rw-r--r--nixos/tests/ucarp.nix66
2 files changed, 67 insertions, 0 deletions
diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix
index d8fcbde6bc0..e8c86394831 100644
--- a/nixos/tests/all-tests.nix
+++ b/nixos/tests/all-tests.nix
@@ -433,6 +433,7 @@ in
   trilium-server = handleTestOn ["x86_64-linux"] ./trilium-server.nix {};
   tuptime = handleTest ./tuptime.nix {};
   turbovnc-headless-server = handleTest ./turbovnc-headless-server.nix {};
+  ucarp = handleTest ./ucarp.nix {};
   ucg = handleTest ./ucg.nix {};
   udisks2 = handleTest ./udisks2.nix {};
   unbound = handleTest ./unbound.nix {};
diff --git a/nixos/tests/ucarp.nix b/nixos/tests/ucarp.nix
new file mode 100644
index 00000000000..1f60f770d3a
--- /dev/null
+++ b/nixos/tests/ucarp.nix
@@ -0,0 +1,66 @@
+import ./make-test-python.nix ({ pkgs, lib, ...} :
+
+let
+  addrShared = "192.168.0.1";
+  addrHostA = "192.168.0.10";
+  addrHostB = "192.168.0.11";
+
+  mkUcarpHost = addr: { config, pkgs, lib, ... }: {
+    networking.interfaces.eth1.ipv4.addresses = lib.mkForce [
+      { address = addr; prefixLength = 24; }
+    ];
+
+    networking.ucarp = {
+      enable = true;
+      interface = "eth1";
+      srcIp = addr;
+      vhId = 1;
+      passwordFile = "${pkgs.writeText "ucarp-pass" "secure"}";
+      addr = addrShared;
+      upscript = pkgs.writeScript "upscript" ''
+        #!/bin/sh
+        ${pkgs.iproute2}/bin/ip addr add "$2"/24 dev "$1"
+      '';
+      downscript = pkgs.writeScript "downscript" ''
+        #!/bin/sh
+        ${pkgs.iproute2}/bin/ip addr del "$2"/24 dev "$1"
+      '';
+    };
+  };
+in {
+  name = "ucarp";
+  meta.maintainers = with lib.maintainers; [ oxzi ];
+
+  nodes = {
+    hostA = mkUcarpHost addrHostA;
+    hostB = mkUcarpHost addrHostB;
+  };
+
+  testScript = ''
+    def is_master(host):
+      ipOutput = host.succeed("ip addr show dev eth1")
+      return "inet ${addrShared}/24" in ipOutput
+
+
+    start_all()
+
+    # First, let both hosts start and let a master node be selected
+    for host, peer in [(hostA, "${addrHostB}"), (hostB, "${addrHostA}")]:
+      host.wait_for_unit("ucarp.service")
+      host.succeed(f"ping -c 1 {peer}")
+
+    hostA.sleep(5)
+
+    hostA_master, hostB_master = is_master(hostA), is_master(hostB)
+    assert hostA_master != hostB_master, "only one master node is allowed"
+
+    master_host = hostA if hostA_master else hostB
+    backup_host = hostB if hostA_master else hostA
+
+    # Let's crash the master host and let the backup take over
+    master_host.crash()
+
+    backup_host.sleep(5)
+    assert is_master(backup_host), "backup did not take over"
+  '';
+})