From 54b7822a7d97a971dc65ae681a336a630399843e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Tue, 17 Jun 2025 19:04:34 +0200 Subject: [PATCH] borgbackup: migrate to clan.nixosTests module --- clanServices/borgbackup/flake-module.nix | 19 +- clanServices/borgbackup/tests/vm/default.nix | 178 +++++++++---------- 2 files changed, 96 insertions(+), 101 deletions(-) diff --git a/clanServices/borgbackup/flake-module.nix b/clanServices/borgbackup/flake-module.nix index 92c4fc46b..78066d14d 100644 --- a/clanServices/borgbackup/flake-module.nix +++ b/clanServices/borgbackup/flake-module.nix @@ -1,17 +1,18 @@ -{ lib, self, ... }: +{ lib, ... }: +let + module = lib.modules.importApply ./default.nix { }; +in { clan.modules = { - borgbackup = lib.modules.importApply ./default.nix { }; + borgbackup = module; }; perSystem = - { pkgs, ... }: + { ... }: { - checks = lib.optionalAttrs (pkgs.stdenv.isLinux) { - borgbackup = import ./tests/vm/default.nix { - inherit pkgs; - clan-core = self; - nixosLib = import (self.inputs.nixpkgs + "/nixos/lib") { }; - }; + clan.nixosTests.borgbackup = { + imports = [ ./tests/vm/default.nix ]; + + clan.modules."@clan/borgbackup" = module; }; }; } diff --git a/clanServices/borgbackup/tests/vm/default.nix b/clanServices/borgbackup/tests/vm/default.nix index d8ed40e7b..3b703066c 100644 --- a/clanServices/borgbackup/tests/vm/default.nix +++ b/clanServices/borgbackup/tests/vm/default.nix @@ -1,118 +1,112 @@ { + module, pkgs, - nixosLib, - clan-core, ... }: -nixosLib.runTest ( - { ... }: - { - imports = [ - clan-core.modules.nixosVmTest.clanTest - ]; +{ + name = "borgbackup"; - hostPkgs = pkgs; + clan = { + directory = ./.; + test.useContainers = true; + inventory = { - name = "borgbackup"; + machines.clientone = { }; + machines.serverone = { }; - clan = { - directory = ./.; - test.useContainers = true; - modules."@clan/borgbackup" = ../../default.nix; - inventory = { + instances = { + borgone = { - machines.clientone = { }; - machines.serverone = { }; + module.name = "@clan/borgbackup"; - instances = { - borgone = { - - module.name = "@clan/borgbackup"; - - roles.client.machines."clientone" = { }; - roles.server.machines."serverone".settings.directory = "/tmp/borg-test"; - }; + roles.client.machines."clientone" = { }; + roles.server.machines."serverone".settings.directory = "/tmp/borg-test"; }; }; }; + }; - nodes = { + nodes = { + + serverone = { + services.openssh.enable = true; + # Needed so PAM doesn't see the user as locked + users.users.borg.password = "borg"; + }; + + clientone = + { + config, + pkgs, + clan-core, + ... + }: + let + dependencies = [ + clan-core + pkgs.stdenv.drvPath + ] ++ builtins.map (i: i.outPath) (builtins.attrValues clan-core.inputs); + closureInfo = pkgs.closureInfo { rootPaths = dependencies; }; + + in + { - serverone = { services.openssh.enable = true; - # Needed so PAM doesn't see the user as locked - users.users.borg.password = "borg"; + + users.users.root.openssh.authorizedKeys.keyFiles = [ ../../../../checks/assets/ssh/pubkey ]; + + clan.core.networking.targetHost = config.networking.hostName; + + environment.systemPackages = [ clan-core.packages.${pkgs.system}.clan-cli ]; + + environment.etc.install-closure.source = "${closureInfo}/store-paths"; + nix.settings = { + substituters = pkgs.lib.mkForce [ ]; + hashed-mirrors = null; + connect-timeout = pkgs.lib.mkForce 3; + flake-registry = pkgs.writeText "flake-registry" ''{"flakes":[],"version":2}''; + }; + system.extraDependencies = dependencies; + + clan.core.state.test-backups.folders = [ "/var/test-backups" ]; }; - clientone = - { config, pkgs, ... }: - let - dependencies = [ - clan-core - pkgs.stdenv.drvPath - ] ++ builtins.map (i: i.outPath) (builtins.attrValues clan-core.inputs); - closureInfo = pkgs.closureInfo { rootPaths = dependencies; }; + }; - in - { + testScript = '' + import json + start_all() - services.openssh.enable = true; + machines = [clientone, serverone] - users.users.root.openssh.authorizedKeys.keyFiles = [ ../../../../checks/assets/ssh/pubkey ]; + for m in machines: + m.systemctl("start network-online.target") - clan.core.networking.targetHost = config.networking.hostName; + for m in machines: + m.wait_for_unit("network-online.target") - environment.systemPackages = [ clan-core.packages.${pkgs.system}.clan-cli ]; + # dummy data + clientone.succeed("mkdir -p /var/test-backups /var/test-service") + clientone.succeed("echo testing > /var/test-backups/somefile") - environment.etc.install-closure.source = "${closureInfo}/store-paths"; - nix.settings = { - substituters = pkgs.lib.mkForce [ ]; - hashed-mirrors = null; - connect-timeout = pkgs.lib.mkForce 3; - flake-registry = pkgs.writeText "flake-registry" ''{"flakes":[],"version":2}''; - }; - system.extraDependencies = dependencies; + clientone.succeed("${pkgs.coreutils}/bin/install -Dm 600 ${../../../../checks/assets/ssh/privkey} /root/.ssh/id_ed25519") + clientone.succeed("${pkgs.coreutils}/bin/touch /root/.ssh/known_hosts") + clientone.wait_until_succeeds("timeout 2 ssh -o StrictHostKeyChecking=accept-new localhost hostname") + clientone.wait_until_succeeds("timeout 2 ssh -o StrictHostKeyChecking=accept-new $(hostname) hostname") - clan.core.state.test-backups.folders = [ "/var/test-backups" ]; - }; + # create + clientone.succeed("borgbackup-create >&2") + clientone.wait_until_succeeds("! systemctl is-active borgbackup-job-serverone >&2") - }; + # list + backup_id = json.loads(clientone.succeed("borg-job-serverone list --json"))["archives"][0]["archive"] + out = clientone.succeed("borgbackup-list").strip() + print(out) + assert backup_id in out, f"backup {backup_id} not found in {out}" - testScript = '' - import json - start_all() - - machines = [clientone, serverone] - - for m in machines: - m.systemctl("start network-online.target") - - for m in machines: - m.wait_for_unit("network-online.target") - - # dummy data - clientone.succeed("mkdir -p /var/test-backups /var/test-service") - clientone.succeed("echo testing > /var/test-backups/somefile") - - clientone.succeed("${pkgs.coreutils}/bin/install -Dm 600 ${../../../../checks/assets/ssh/privkey} /root/.ssh/id_ed25519") - clientone.succeed("${pkgs.coreutils}/bin/touch /root/.ssh/known_hosts") - clientone.wait_until_succeeds("timeout 2 ssh -o StrictHostKeyChecking=accept-new localhost hostname") - clientone.wait_until_succeeds("timeout 2 ssh -o StrictHostKeyChecking=accept-new $(hostname) hostname") - - # create - clientone.succeed("borgbackup-create >&2") - clientone.wait_until_succeeds("! systemctl is-active borgbackup-job-serverone >&2") - - # list - backup_id = json.loads(clientone.succeed("borg-job-serverone list --json"))["archives"][0]["archive"] - out = clientone.succeed("borgbackup-list").strip() - print(out) - assert backup_id in out, f"backup {backup_id} not found in {out}" - - # borgbackup restore - clientone.succeed("rm -f /var/test-backups/somefile") - clientone.succeed(f"NAME='serverone::borg@serverone:.::{backup_id}' borgbackup-restore >&2") - assert clientone.succeed("cat /var/test-backups/somefile").strip() == "testing", "restore failed" - ''; - } -) + # borgbackup restore + clientone.succeed("rm -f /var/test-backups/somefile") + clientone.succeed(f"NAME='serverone::borg@serverone:.::{backup_id}' borgbackup-restore >&2") + assert clientone.succeed("cat /var/test-backups/somefile").strip() == "testing", "restore failed" + ''; +}