From d53b62170a8ead6d37031e4397a3835779f8cbd7 Mon Sep 17 00:00:00 2001 From: DavHau Date: Mon, 31 Mar 2025 13:39:23 +0700 Subject: [PATCH] inventory test framework: init Add nixos test module checks/lib/test-inventory-nix accepts new option `inventory` and creates machines accordingly with correct imports --- checks/dummy-inventory-test/default.nix | 26 +++++++++ .../dummy-module/README.md | 10 ++++ .../dummy-module/roles/admin.nix | 5 ++ .../dummy-module/roles/peer.nix | 5 ++ .../dummy-module/roles/shared.nix | 13 +++++ checks/flake-module.nix | 1 + checks/lib/test-inventory.nix | 56 +++++++++++++++++++ 7 files changed, 116 insertions(+) create mode 100644 checks/dummy-inventory-test/default.nix create mode 100644 checks/dummy-inventory-test/dummy-module/README.md create mode 100644 checks/dummy-inventory-test/dummy-module/roles/admin.nix create mode 100644 checks/dummy-inventory-test/dummy-module/roles/peer.nix create mode 100644 checks/dummy-inventory-test/dummy-module/roles/shared.nix create mode 100644 checks/lib/test-inventory.nix diff --git a/checks/dummy-inventory-test/default.nix b/checks/dummy-inventory-test/default.nix new file mode 100644 index 000000000..240f0654e --- /dev/null +++ b/checks/dummy-inventory-test/default.nix @@ -0,0 +1,26 @@ +(import ../lib/test-inventory.nix) ( + { ... }: + { + name = "dummy-inventory-test"; + + inventory = { + machines.peer1 = { }; + machines.admin1 = { }; + services = { + dummy-module.default = { + roles.peer.machines = [ "peer1" ]; + roles.admin.machines = [ "admin1" ]; + }; + }; + modules = { + dummy-module = ./dummy-module; + }; + }; + + testScript = '' + start_all() + admin1.wait_for_unit("dummy-service") + peer1.wait_for_unit("dummy-service") + ''; + } +) diff --git a/checks/dummy-inventory-test/dummy-module/README.md b/checks/dummy-inventory-test/dummy-module/README.md new file mode 100644 index 000000000..2a72080ce --- /dev/null +++ b/checks/dummy-inventory-test/dummy-module/README.md @@ -0,0 +1,10 @@ +--- +description = "Set up dummy-module" +categories = ["System"] +features = [ "inventory" ] + +[constraints] +roles.admin.min = 1 +roles.admin.max = 1 +--- + diff --git a/checks/dummy-inventory-test/dummy-module/roles/admin.nix b/checks/dummy-inventory-test/dummy-module/roles/admin.nix new file mode 100644 index 000000000..f3f24bee2 --- /dev/null +++ b/checks/dummy-inventory-test/dummy-module/roles/admin.nix @@ -0,0 +1,5 @@ +{ + imports = [ + ./shared.nix + ]; +} diff --git a/checks/dummy-inventory-test/dummy-module/roles/peer.nix b/checks/dummy-inventory-test/dummy-module/roles/peer.nix new file mode 100644 index 000000000..f3f24bee2 --- /dev/null +++ b/checks/dummy-inventory-test/dummy-module/roles/peer.nix @@ -0,0 +1,5 @@ +{ + imports = [ + ./shared.nix + ]; +} diff --git a/checks/dummy-inventory-test/dummy-module/roles/shared.nix b/checks/dummy-inventory-test/dummy-module/roles/shared.nix new file mode 100644 index 000000000..e7d6612ac --- /dev/null +++ b/checks/dummy-inventory-test/dummy-module/roles/shared.nix @@ -0,0 +1,13 @@ +{ pkgs, ... }: +{ + systemd.services.dummy-service = { + enable = true; + description = "Dummy service"; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + ExecStart = "${pkgs.coreutils}/bin/true"; + RemainAfterExit = true; + }; + }; +} diff --git a/checks/flake-module.nix b/checks/flake-module.nix index d083a8905..21e60ca2b 100644 --- a/checks/flake-module.nix +++ b/checks/flake-module.nix @@ -41,6 +41,7 @@ in borgbackup = import ./borgbackup nixosTestArgs; matrix-synapse = import ./matrix-synapse nixosTestArgs; mumble = import ./mumble nixosTestArgs; + dummy-inventory-test = import ./dummy-inventory-test nixosTestArgs; data-mesher = import ./data-mesher nixosTestArgs; syncthing = import ./syncthing nixosTestArgs; zt-tcp-relay = import ./zt-tcp-relay nixosTestArgs; diff --git a/checks/lib/test-inventory.nix b/checks/lib/test-inventory.nix new file mode 100644 index 000000000..af3ae573f --- /dev/null +++ b/checks/lib/test-inventory.nix @@ -0,0 +1,56 @@ +test: +{ pkgs, self, ... }: +let + inherit (pkgs) lib; + inherit (lib) mkOption flip mapAttrs; + inherit (lib.types) raw; + inherit (self.lib.inventory) buildInventory; + nixos-lib = import (pkgs.path + "/nixos/lib") { }; +in +(nixos-lib.runTest ( + { config, ... }: + { + imports = [ test ]; + options = { + inventory = mkOption { + description = "Inventory of machines and services"; + type = raw; + }; + serviceConfigs = mkOption { + description = "Result of the evaluated inventory"; + type = raw; + readOnly = true; + }; + }; + config = { + serviceConfigs = buildInventory { + inventory = config.inventory; + # TODO: make directory argument optional in buildInventory + directory = ./.; + }; + nodes = flip mapAttrs config.serviceConfigs.machines ( + _machineName: attrs: { + imports = attrs.machineImports ++ [ self.nixosModules.clanCore ]; + clan.core.settings.directory = builtins.toString ./.; + } + ); + hostPkgs = pkgs; + # speed-up evaluation + defaults = ( + { config, ... }: + { + imports = [ + ./minify.nix + ]; + documentation.enable = lib.mkDefault false; + nix.settings.min-free = 0; + system.stateVersion = config.system.nixos.release; + } + ); + + _module.args = { inherit self; }; + # to accept external dependencies such as disko + node.specialArgs.self = self; + }; + } +)).config.result