diff --git a/lib/inventory/distributed-service/tests/default.nix b/lib/inventory/distributed-service/tests/default.nix index 048b0b14c..068e944a1 100644 --- a/lib/inventory/distributed-service/tests/default.nix +++ b/lib/inventory/distributed-service/tests/default.nix @@ -4,63 +4,53 @@ ... }: let - inherit (lib) - evalModules - ; - evalInventory = - m: - (evalModules { - # Static modules - modules = [ - clanLib.inventory.inventoryModule - { - _file = "test file"; - tags.all = [ ]; - tags.nixos = [ ]; - tags.darwin = [ ]; - } - { - modules.test = { }; - } - m - ]; - }).config; - - callInventoryAdapter = - inventoryModule: - let - inventory = evalInventory inventoryModule; - flakeInputsFixture = { - self.clan.modules = inventoryModule.modules or { }; - # Example upstream module - upstream.clan.modules = { - uzzi = { - _class = "clan.service"; - manifest = { - name = "uzzi-from-upstream"; - }; - }; + flakeInputsFixture = { + upstream.clan.modules = { + uzzi = { + _class = "clan.service"; + manifest = { + name = "uzzi-from-upstream"; }; }; - in - clanLib.inventory.mapInstances { - directory = ./.; - clanCoreModules = { }; - flakeInputs = flakeInputsFixture; - inherit inventory; - exportsModule = { }; }; + }; + + createTestClan = + testClan: + let + res = clanLib.clan ({ + # Static / mocked + specialArgs = { + clan-core = { + clan.modules = { }; + }; + }; + self.inputs = flakeInputsFixture // { + self.clan = res.config; + }; + directory = ./.; + exportsModule = { }; + + imports = [ + testClan + ]; + }); + in + res; + in { extraModules = import ./extraModules.nix { inherit clanLib; }; exports = import ./exports.nix { inherit lib clanLib; }; - settings = import ./settings.nix { inherit lib callInventoryAdapter; }; - specialArgs = import ./specialArgs.nix { inherit lib callInventoryAdapter; }; - resolve_module_spec = import ./import_module_spec.nix { inherit lib callInventoryAdapter; }; + settings = import ./settings.nix { inherit lib createTestClan; }; + specialArgs = import ./specialArgs.nix { inherit lib createTestClan; }; + resolve_module_spec = import ./import_module_spec.nix { + inherit lib createTestClan; + }; test_simple = let - res = callInventoryAdapter { + res = createTestClan { # Authored module # A minimal module looks like this # It isn't exactly doing anything but it's a valid module that produces an output @@ -71,7 +61,7 @@ in }; }; # User config - instances."instance_foo" = { + inventory.instances."instance_foo" = { module = { name = "simple-module"; }; @@ -81,7 +71,7 @@ in { # Test that the module is mapped into the output # We might change the attribute name in the future - expr = res.servicesEval.config.mappedServices ? "-simple-module"; + expr = res.config._services.mappedServices ? "-simple-module"; expected = true; inherit res; }; @@ -92,7 +82,7 @@ in # All instances should be included within one evaluation to make all of them available test_module_grouping = let - res = callInventoryAdapter { + res = createTestClan { # Authored module # A minimal module looks like this # It isn't exactly doing anything but it's a valid module that produces an output @@ -112,18 +102,19 @@ in perMachine = { }: { }; }; + # User config - instances."instance_foo" = { + inventory.instances."instance_foo" = { module = { name = "A"; }; }; - instances."instance_bar" = { + inventory.instances."instance_bar" = { module = { name = "B"; }; }; - instances."instance_baz" = { + inventory.instances."instance_baz" = { module = { name = "A"; }; @@ -133,16 +124,16 @@ in { # Test that the module is mapped into the output # We might change the attribute name in the future - expr = lib.mapAttrs (_n: v: builtins.length v) res.grouped; - expected = { - "-A" = 2; - "-B" = 1; - }; + expr = lib.attrNames res.config._services.mappedServices; + expected = [ + "-A" + "-B" + ]; }; test_creates_all_instances = let - res = callInventoryAdapter { + res = createTestClan { # Authored module # A minimal module looks like this # It isn't exactly doing anything but it's a valid module that produces an output @@ -154,22 +145,24 @@ in perMachine = { }: { }; }; - instances."instance_foo" = { - module = { - name = "A"; - input = "self"; + inventory = { + instances."instance_foo" = { + module = { + name = "A"; + input = "self"; + }; }; - }; - instances."instance_bar" = { - module = { - name = "A"; - input = "self"; + instances."instance_bar" = { + module = { + name = "A"; + input = "self"; + }; }; - }; - instances."instance_zaza" = { - module = { - name = "B"; - input = null; + instances."instance_zaza" = { + module = { + name = "B"; + input = null; + }; }; }; }; @@ -177,7 +170,7 @@ in { # Test that the module is mapped into the output # We might change the attribute name in the future - expr = lib.attrNames res.servicesEval.config.mappedServices.self-A.instances; + expr = lib.attrNames res.config._services.mappedServices.self-A.instances; expected = [ "instance_bar" "instance_foo" @@ -187,7 +180,7 @@ in # Membership via roles test_add_machines_directly = let - res = callInventoryAdapter { + res = createTestClan { # Authored module # A minimal module looks like this # It isn't exactly doing anything but it's a valid module that produces an output @@ -202,38 +195,40 @@ in # perMachine = {}: {}; }; - machines = { - jon = { }; - sara = { }; - hxi = { }; - }; - instances."instance_foo" = { - module = { - name = "A"; - input = "self"; + inventory = { + machines = { + jon = { }; + sara = { }; + hxi = { }; }; - roles.peer.machines.jon = { }; - }; - instances."instance_bar" = { - module = { - name = "A"; - input = "self"; + instances."instance_foo" = { + module = { + name = "A"; + input = "self"; + }; + roles.peer.machines.jon = { }; }; - roles.peer.machines.sara = { }; - }; - instances."instance_zaza" = { - module = { - name = "B"; - input = null; + instances."instance_bar" = { + module = { + name = "A"; + input = "self"; + }; + roles.peer.machines.sara = { }; + }; + instances."instance_zaza" = { + module = { + name = "B"; + input = null; + }; + roles.peer.tags.all = { }; }; - roles.peer.tags.all = { }; }; }; in { # Test that the module is mapped into the output # We might change the attribute name in the future - expr = lib.attrNames res.servicesEval.config.mappedServices.self-A.result.allMachines; + expr = lib.attrNames res.config._services.mappedServices.self-A.result.allMachines; expected = [ "jon" "sara" @@ -243,7 +238,7 @@ in # Membership via tags test_add_machines_via_tags = let - res = callInventoryAdapter { + res = createTestClan { # Authored module # A minimal module looks like this # It isn't exactly doing anything but it's a valid module that produces an output @@ -257,35 +252,37 @@ in # perMachine = {}: {}; }; - machines = { - jon = { - tags = [ "foo" ]; + inventory = { + machines = { + jon = { + tags = [ "foo" ]; + }; + sara = { + tags = [ "foo" ]; + }; + hxi = { }; }; - sara = { - tags = [ "foo" ]; + instances."instance_foo" = { + module = { + name = "A"; + input = "self"; + }; + roles.peer.tags.foo = { }; }; - hxi = { }; - }; - instances."instance_foo" = { - module = { - name = "A"; - input = "self"; + instances."instance_zaza" = { + module = { + name = "B"; + input = null; + }; + roles.peer.tags.all = { }; }; - roles.peer.tags.foo = { }; - }; - instances."instance_zaza" = { - module = { - name = "B"; - input = null; - }; - roles.peer.tags.all = { }; }; }; in { # Test that the module is mapped into the output # We might change the attribute name in the future - expr = lib.attrNames res.servicesEval.config.mappedServices.self-A.result.allMachines; + expr = lib.attrNames res.config._services.mappedServices.self-A.result.allMachines; expected = [ "jon" "sara" @@ -293,6 +290,9 @@ in }; machine_imports = import ./machine_imports.nix { inherit lib clanLib; }; - per_machine_args = import ./per_machine_args.nix { inherit lib callInventoryAdapter; }; - per_instance_args = import ./per_instance_args.nix { inherit lib callInventoryAdapter; }; + per_machine_args = import ./per_machine_args.nix { inherit lib createTestClan; }; + per_instance_args = import ./per_instance_args.nix { + inherit lib; + callInventoryAdapter = createTestClan; + }; } diff --git a/lib/inventory/distributed-service/tests/import_module_spec.nix b/lib/inventory/distributed-service/tests/import_module_spec.nix index a8d29538d..dde5a9934 100644 --- a/lib/inventory/distributed-service/tests/import_module_spec.nix +++ b/lib/inventory/distributed-service/tests/import_module_spec.nix @@ -1,4 +1,4 @@ -{ callInventoryAdapter, ... }: +{ createTestClan, ... }: let # Authored module # A minimal module looks like this @@ -23,10 +23,13 @@ let resolve = spec: - callInventoryAdapter { - inherit modules machines; - instances."instance_foo" = { - module = spec; + createTestClan { + inherit modules; + inventory = { + inherit machines; + instances."instance_foo" = { + module = spec; + }; }; }; in @@ -36,25 +39,16 @@ in (resolve { name = "A"; input = "self"; - }).importedModuleWithInstances.instance_foo.resolvedModule; - expected = { - _class = "clan.service"; - manifest = { - name = "network"; - }; - }; + }).config._services.mappedServices.self-A.manifest.name; + expected = "network"; }; test_import_remote_module_by_name = { expr = (resolve { name = "uzzi"; input = "upstream"; - }).importedModuleWithInstances.instance_foo.resolvedModule; - expected = { - _class = "clan.service"; - manifest = { - name = "uzzi-from-upstream"; - }; - }; + }).config._services.mappedServices.upstream-uzzi.manifest.name; + expected = "uzzi-from-upstream"; + }; } diff --git a/lib/inventory/distributed-service/tests/per_instance_args.nix b/lib/inventory/distributed-service/tests/per_instance_args.nix index 9fe0c0316..371ce9554 100644 --- a/lib/inventory/distributed-service/tests/per_instance_args.nix +++ b/lib/inventory/distributed-service/tests/per_instance_args.nix @@ -58,39 +58,43 @@ let sara = { }; }; res = callInventoryAdapter { - inherit modules machines; - instances."instance_foo" = { - module = { - name = "A"; - input = "self"; + inherit modules; + + inventory = { + inherit machines; + instances."instance_foo" = { + module = { + name = "A"; + input = "self"; + }; + roles.peer.machines.jon = { + settings.timeout = lib.mkForce "foo-peer-jon"; + }; + roles.peer = { + settings.timeout = "foo-peer"; + }; + roles.controller.machines.jon = { }; }; - roles.peer.machines.jon = { - settings.timeout = lib.mkForce "foo-peer-jon"; + instances."instance_bar" = { + module = { + name = "A"; + input = "self"; + }; + roles.peer.machines.jon = { + settings.timeout = "bar-peer-jon"; + }; }; - roles.peer = { - settings.timeout = "foo-peer"; + # TODO: move this into a seperate test. + # Seperate out the check that this module is never imported + # import the module "B" (undefined) + # All machines have this instance + instances."instance_zaza" = { + module = { + name = "B"; + input = null; + }; + roles.peer.tags.all = { }; }; - roles.controller.machines.jon = { }; - }; - instances."instance_bar" = { - module = { - name = "A"; - input = "self"; - }; - roles.peer.machines.jon = { - settings.timeout = "bar-peer-jon"; - }; - }; - # TODO: move this into a seperate test. - # Seperate out the check that this module is never imported - # import the module "B" (undefined) - # All machines have this instance - instances."instance_zaza" = { - module = { - name = "B"; - input = null; - }; - roles.peer.tags.all = { }; }; }; @@ -105,9 +109,10 @@ in { # settings should evaluate test_per_instance_arguments = { + inherit res; expr = { instanceName = - res.servicesEval.config.mappedServices.self-A.result.allRoles.peer.allInstances."instance_foo".allMachines.jon.passthru.instanceName; + res.config._services.mappedServices.self-A.result.allRoles.peer.allInstances."instance_foo".allMachines.jon.passthru.instanceName; # settings are specific. # Below we access: @@ -115,11 +120,11 @@ in # roles = peer # machines = jon settings = - res.servicesEval.config.mappedServices.self-A.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.passthru.settings; + res.config._services.mappedServices.self-A.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.passthru.settings; machine = - res.servicesEval.config.mappedServices.self-A.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.passthru.machine; + res.config._services.mappedServices.self-A.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.passthru.machine; roles = - res.servicesEval.config.mappedServices.self-A.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.passthru.roles; + res.config._services.mappedServices.self-A.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.passthru.roles; }; expected = { instanceName = "instance_foo"; @@ -160,9 +165,9 @@ in # TODO: Cannot be tested like this anymore test_per_instance_settings_vendoring = { - x = res.servicesEval.config.mappedServices.self-A; + x = res.config._services.mappedServices.self-A; expr = - res.servicesEval.config.mappedServices.self-A.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.passthru.vendoredSettings; + res.config._services.mappedServices.self-A.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.passthru.vendoredSettings; expected = { timeout = "config.thing"; }; diff --git a/lib/inventory/distributed-service/tests/per_machine_args.nix b/lib/inventory/distributed-service/tests/per_machine_args.nix index 5907e8bf2..b650281a6 100644 --- a/lib/inventory/distributed-service/tests/per_machine_args.nix +++ b/lib/inventory/distributed-service/tests/per_machine_args.nix @@ -1,4 +1,4 @@ -{ lib, callInventoryAdapter }: +{ lib, createTestClan }: let # Authored module # A minimal module looks like this @@ -39,36 +39,40 @@ let jon = { }; sara = { }; }; - res = callInventoryAdapter { - inherit modules machines; - instances."instance_foo" = { - module = { - name = "A"; - input = "self"; + res = createTestClan { + inherit modules; + inventory = { + + inherit machines; + instances."instance_foo" = { + module = { + name = "A"; + input = "self"; + }; + roles.peer.machines.jon = { + settings.timeout = lib.mkForce "foo-peer-jon"; + }; + roles.peer = { + settings.timeout = "foo-peer"; + }; }; - roles.peer.machines.jon = { - settings.timeout = lib.mkForce "foo-peer-jon"; + instances."instance_bar" = { + module = { + name = "A"; + input = "self"; + }; + roles.peer.machines.jon = { + settings.timeout = "bar-peer-jon"; + }; }; - roles.peer = { - settings.timeout = "foo-peer"; + instances."instance_zaza" = { + module = { + name = "B"; + input = null; + }; + roles.peer.tags.all = { }; }; }; - instances."instance_bar" = { - module = { - name = "A"; - input = "self"; - }; - roles.peer.machines.jon = { - settings.timeout = "bar-peer-jon"; - }; - }; - instances."instance_zaza" = { - module = { - name = "B"; - input = null; - }; - roles.peer.tags.all = { }; - }; }; in @@ -79,7 +83,7 @@ in inherit res; expr = { hasMachineSettings = - res.servicesEval.config.mappedServices.self-A.result.allMachines.jon.passthru.instances.instance_foo.roles.peer.machines.jon + res.config._services.mappedServices.self-A.result.allMachines.jon.passthru.instances.instance_foo.roles.peer.machines.jon ? settings; # settings are specific. @@ -88,10 +92,10 @@ in # roles = peer # machines = jon specificMachineSettings = - res.servicesEval.config.mappedServices.self-A.result.allMachines.jon.passthru.instances.instance_foo.roles.peer.machines.jon.settings; + res.config._services.mappedServices.self-A.result.allMachines.jon.passthru.instances.instance_foo.roles.peer.machines.jon.settings; hasRoleSettings = - res.servicesEval.config.mappedServices.self-A.result.allMachines.jon.passthru.instances.instance_foo.roles.peer + res.config._services.mappedServices.self-A.result.allMachines.jon.passthru.instances.instance_foo.roles.peer ? settings; # settings are specific. @@ -100,7 +104,7 @@ in # roles = peer # machines = * specificRoleSettings = - res.servicesEval.config.mappedServices.self-A.result.allMachines.jon.passthru.instances.instance_foo.roles.peer; + res.config._services.mappedServices.self-A.result.allMachines.jon.passthru.instances.instance_foo.roles.peer; }; expected = { hasMachineSettings = true; diff --git a/lib/inventory/distributed-service/tests/settings.nix b/lib/inventory/distributed-service/tests/settings.nix index f9214abda..422a529e7 100644 --- a/lib/inventory/distributed-service/tests/settings.nix +++ b/lib/inventory/distributed-service/tests/settings.nix @@ -1,6 +1,6 @@ -{ callInventoryAdapter, lib, ... }: +{ createTestClan, lib, ... }: let - res = callInventoryAdapter { + res = createTestClan { modules."A" = { _class = "clan.service"; manifest = { @@ -21,28 +21,31 @@ let }; }; }; - machines = { - jon = { }; - sara = { }; - }; - instances."instance_foo" = { - module = { - name = "A"; - input = "self"; + inventory = { + + machines = { + jon = { }; + sara = { }; }; - # Settings for both jon and sara - roles.peer.settings = { - timeout = 40; + instances."instance_foo" = { + module = { + name = "A"; + input = "self"; + }; + # Settings for both jon and sara + roles.peer.settings = { + timeout = 40; + }; + # Jon overrides timeout + roles.peer.machines.jon = { + settings.timeout = lib.mkForce 42; + }; + roles.peer.machines.sara = { }; }; - # Jon overrides timeout - roles.peer.machines.jon = { - settings.timeout = lib.mkForce 42; - }; - roles.peer.machines.sara = { }; }; }; - config = res.servicesEval.config.mappedServices.self-A; + config = res.config._services.mappedServices.self-A; # applySettings = diff --git a/lib/inventory/distributed-service/tests/specialArgs.nix b/lib/inventory/distributed-service/tests/specialArgs.nix index 8670f0e45..c29b266e5 100644 --- a/lib/inventory/distributed-service/tests/specialArgs.nix +++ b/lib/inventory/distributed-service/tests/specialArgs.nix @@ -1,6 +1,6 @@ -{ callInventoryAdapter, lib, ... }: +{ createTestClan, lib, ... }: let - res = callInventoryAdapter { + res = createTestClan { modules."A" = m: { _class = "clan.service"; config = { @@ -14,19 +14,21 @@ let default = m; }; }; - machines = { - jon = { }; - }; - instances."instance_foo" = { - module = { - name = "A"; - input = "self"; + inventory = { + machines = { + jon = { }; + }; + instances."instance_foo" = { + module = { + name = "A"; + input = "self"; + }; + roles.peer.machines.jon = { }; }; - roles.peer.machines.jon = { }; }; }; - specialArgs = lib.attrNames res.servicesEval.config.mappedServices.self-A.test.specialArgs; + specialArgs = lib.attrNames res.config._services.mappedServices.self-A.test.specialArgs; in { test_simple = {