diff --git a/lib/inventory/distributed-service/service-module.nix b/lib/inventory/distributed-service/service-module.nix index 046b3dddd..b93554dcb 100644 --- a/lib/inventory/distributed-service/service-module.nix +++ b/lib/inventory/distributed-service/service-module.nix @@ -317,20 +317,24 @@ in */ v: instanceName: machineName: (lib.evalModules { - specialArgs = { - inherit instanceName; - machine = { - name = machineName; + specialArgs = + let roles = applySettings instanceName config.instances.${instanceName}; + in + { + inherit instanceName roles; + machine = { + name = machineName; + roles = lib.attrNames (lib.filterAttrs (_n: v: v.machines ? ${machineName}) roles); + }; + settings = ( + makeExtensibleConfig evalMachineSettings { + inherit roleName instanceName machineName; + settings = + config.instances.${instanceName}.roles.${roleName}.machines.${machineName}.settings or { }; + } + ); }; - settings = ( - makeExtensibleConfig evalMachineSettings { - inherit roleName instanceName machineName; - settings = - config.instances.${instanceName}.roles.${roleName}.machines.${machineName}.settings or { }; - } - ); - }; modules = [ v ]; }).config; }; diff --git a/lib/inventory/distributed-service/tests/default.nix b/lib/inventory/distributed-service/tests/default.nix index d628424c6..8eecc4852 100644 --- a/lib/inventory/distributed-service/tests/default.nix +++ b/lib/inventory/distributed-service/tests/default.nix @@ -67,6 +67,7 @@ in # We might change the attribute name in the future expr = res.importedModulesEvaluated ? "self-simple-module"; expected = true; + inherit res; }; # A module can be imported multiple times diff --git a/lib/inventory/distributed-service/tests/per_instance_args.nix b/lib/inventory/distributed-service/tests/per_instance_args.nix index 38ef41a6d..3be840dd4 100644 --- a/lib/inventory/distributed-service/tests/per_instance_args.nix +++ b/lib/inventory/distributed-service/tests/per_instance_args.nix @@ -10,6 +10,7 @@ let }; # Define two roles with unmergeable interfaces # Both define some 'timeout' but with completely different types. + roles.controller = { }; roles.peer.interface = { lib, ... }: { @@ -23,6 +24,7 @@ let instanceName, settings, machine, + roles, ... }: let @@ -35,7 +37,12 @@ let in { nixosModule = { - inherit instanceName settings machine; + inherit + instanceName + settings + machine + roles + ; # We are double vendoring the settings # To test that we can do it indefinitely @@ -64,6 +71,7 @@ let roles.peer = { settings.timeout = "foo-peer"; }; + roles.controller.machines.jon = { }; }; instances."instance_bar" = { module = { @@ -73,6 +81,8 @@ let 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" = { @@ -108,17 +118,9 @@ in # roles = peer # machines = jon settings = filterInternals res.importedModulesEvaluated.self-A.config.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.nixosModule.settings; - machine = mapInternalsRecursive res.importedModulesEvaluated.self-A.config.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.nixosModule.machine; - - # hasRoleSettings = - # res.importedModulesEvaluated.self-A.config.result.allMachines.jon.nixosModule.instance_foo.roles.peer ? settings; - - # # settings are specific. - # # Below we access: - # # instance = instance_foo - # # roles = peer - # # machines = * - # specificRoleSettings = filterInternals res.importedModulesEvaluated.self-A.config.result.allMachines.jon.nixosModule.instance_foo.roles.peer.settings; + machine = + res.importedModulesEvaluated.self-A.config.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.nixosModule.machine; + roles = mapInternalsRecursive res.importedModulesEvaluated.self-A.config.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.nixosModule.roles; }; expected = { instanceName = "instance_foo"; @@ -127,21 +129,37 @@ in }; machine = { name = "jon"; - roles = { - peer = { - machines = { - jon = { - settings = { - __functor = "__functor"; - timeout = "foo-peer-jon"; - }; + roles = [ + "controller" + "peer" + ]; + }; + roles = { + controller = { + machines = { + jon = { + settings = { + __functor = "__functor"; }; }; - settings = { - __functor = "__functor"; - timeout = "foo-peer"; + }; + settings = { + __functor = "__functor"; + }; + }; + peer = { + machines = { + jon = { + settings = { + __functor = "__functor"; + timeout = "foo-peer-jon"; + }; }; }; + settings = { + __functor = "__functor"; + timeout = "foo-peer"; + }; }; }; }; diff --git a/lib/inventory/distributed-service/tests/per_machine_args.nix b/lib/inventory/distributed-service/tests/per_machine_args.nix index 67d51439e..bca087a4f 100644 --- a/lib/inventory/distributed-service/tests/per_machine_args.nix +++ b/lib/inventory/distributed-service/tests/per_machine_args.nix @@ -26,9 +26,11 @@ let }; perMachine = - { instances, ... }: + { instances, machine, ... }: { - nixosModule = instances; + nixosModule = { + inherit instances machine; + }; }; }; machines = { @@ -71,9 +73,10 @@ in # settings should evaluate test_per_machine_receives_instance_settings = { + inherit res; expr = { hasMachineSettings = - res.importedModulesEvaluated.self-A.config.result.allMachines.jon.nixosModule.instance_foo.roles.peer.machines.jon + res.importedModulesEvaluated.self-A.config.result.allMachines.jon.nixosModule.instances.instance_foo.roles.peer.machines.jon ? settings; # settings are specific. @@ -81,10 +84,10 @@ in # instance = instance_foo # roles = peer # machines = jon - specificMachineSettings = filterInternals res.importedModulesEvaluated.self-A.config.result.allMachines.jon.nixosModule.instance_foo.roles.peer.machines.jon.settings; + specificMachineSettings = filterInternals res.importedModulesEvaluated.self-A.config.result.allMachines.jon.nixosModule.instances.instance_foo.roles.peer.machines.jon.settings; hasRoleSettings = - res.importedModulesEvaluated.self-A.config.result.allMachines.jon.nixosModule.instance_foo.roles.peer + res.importedModulesEvaluated.self-A.config.result.allMachines.jon.nixosModule.instances.instance_foo.roles.peer ? settings; # settings are specific. @@ -92,7 +95,7 @@ in # instance = instance_foo # roles = peer # machines = * - specificRoleSettings = filterInternals res.importedModulesEvaluated.self-A.config.result.allMachines.jon.nixosModule.instance_foo.roles.peer.settings; + specificRoleSettings = filterInternals res.importedModulesEvaluated.self-A.config.result.allMachines.jon.nixosModule.instances.instance_foo.roles.peer.settings; }; expected = { hasMachineSettings = true;