From 4913d2db87fad081517ed12e9fa2533180a93c95 Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Tue, 8 Apr 2025 13:09:51 +0200 Subject: [PATCH 1/2] feat(inventory/instances): add extendSettings as argument to perInstance, perMachine --- .../distributed-service/service-module.nix | 23 ++++++++--- .../tests/per_instance_args.nix | 40 +++++-------------- 2 files changed, 28 insertions(+), 35 deletions(-) diff --git a/lib/inventory/distributed-service/service-module.nix b/lib/inventory/distributed-service/service-module.nix index b93554dcb..480cb3986 100644 --- a/lib/inventory/distributed-service/service-module.nix +++ b/lib/inventory/distributed-service/service-module.nix @@ -132,6 +132,11 @@ let in makeModuleExtensible (f args); + # Extend evalModules result by a module, returns .config. + extendEval = + eval: m: + (eval.extendModules { modules = lib.toList m; } ).config; + /** Apply the settings to the instance @@ -147,19 +152,19 @@ let # TODO: evaluate the settings against the interface # settings = (evalMachineSettings { inherit roleName instanceName; inherit (v) settings; }).config; settings = ( - makeExtensibleConfig evalMachineSettings { + evalMachineSettings { inherit roleName instanceName machineName; inherit (v) settings; } - ); + ).config; }) role.machines; # TODO: evaluate the settings against the interface settings = ( - makeExtensibleConfig evalMachineSettings { + evalMachineSettings { inherit roleName instanceName; inherit (role) settings; } - ); + ).config; }) instance.roles; in { @@ -328,7 +333,14 @@ in roles = lib.attrNames (lib.filterAttrs (_n: v: v.machines ? ${machineName}) roles); }; settings = ( - makeExtensibleConfig evalMachineSettings { + evalMachineSettings { + inherit roleName instanceName machineName; + settings = + config.instances.${instanceName}.roles.${roleName}.machines.${machineName}.settings or { }; + } + ).config; + extendSettings = extendEval ( + evalMachineSettings { inherit roleName instanceName machineName; settings = config.instances.${instanceName}.roles.${roleName}.machines.${machineName}.settings or { }; @@ -396,6 +408,7 @@ in in uniqueStrings (collectRoles machineScope.instances); }; + # TODO: instances..roles should contain all roles, even if nobody has the role inherit (machineScope) instances; # There are no machine settings. diff --git a/lib/inventory/distributed-service/tests/per_instance_args.nix b/lib/inventory/distributed-service/tests/per_instance_args.nix index 3be840dd4..ad06ce855 100644 --- a/lib/inventory/distributed-service/tests/per_instance_args.nix +++ b/lib/inventory/distributed-service/tests/per_instance_args.nix @@ -23,16 +23,17 @@ let { instanceName, settings, + extendSettings, machine, roles, ... }: let - settings1 = settings { + finalSettings = extendSettings { # Sometimes we want to create a default settings set depending on the machine config. # Note: Other machines cannot depend on this settings. We must assign a new name to the settings. # And thus the new value is not accessible by other machines. - timeout = lib.mkOverride 10 "config.blah"; + timeout = lib.mkOverride 10 "config.thing"; }; in { @@ -46,12 +47,7 @@ let # We are double vendoring the settings # To test that we can do it indefinitely - vendoredSettings = settings1 { - # Sometimes we want to create a default settings set depending on the machine config. - # Note: Other machines cannot depend on this settings. We must assign a new name to the settings. - # And thus the new value is not accessible by other machines. - timeout = lib.mkOverride 5 "config.thing"; - }; + vendoredSettings = finalSettings; }; }; }; @@ -92,18 +88,6 @@ let roles.peer.tags.all = { }; }; }; - - filterInternals = lib.filterAttrs (n: _v: !lib.hasPrefix "_" n); - - # Replace internal attributes ('_' prefix) - # So we catch their presence but don't check the value - mapInternalsRecursive = lib.mapAttrsRecursive ( - path: v: - let - name = lib.last path; - in - if !lib.hasPrefix "_" name then v else name - ); in { # settings should evaluate @@ -117,10 +101,12 @@ in # instance = instance_foo # roles = peer # machines = jon - settings = filterInternals res.importedModulesEvaluated.self-A.config.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.nixosModule.settings; + settings = + res.importedModulesEvaluated.self-A.config.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.nixosModule.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; + roles = + res.importedModulesEvaluated.self-A.config.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.nixosModule.roles; }; expected = { instanceName = "instance_foo"; @@ -139,25 +125,21 @@ in machines = { jon = { settings = { - __functor = "__functor"; }; }; }; settings = { - __functor = "__functor"; }; }; peer = { machines = { jon = { settings = { - __functor = "__functor"; timeout = "foo-peer-jon"; }; }; }; settings = { - __functor = "__functor"; timeout = "foo-peer"; }; }; @@ -167,11 +149,9 @@ in test_per_instance_settings_vendoring = { expr = - mapInternalsRecursive - res.importedModulesEvaluated.self-A.config.result.allRoles.peer.allInstances."instance_foo".allMachines.jon.nixosModule.vendoredSettings; + + res.importedModulesEvaluated.self-A.config.result.allRoles.peer.allInstances."instance_foo".allMachines.jon.nixosModule.vendoredSettings; expected = { - # Returns another override - __functor = "__functor"; timeout = "config.thing"; }; }; From 07e6df35a50e8a02a157cb6abee1081581e8e6ee Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Tue, 8 Apr 2025 13:10:26 +0200 Subject: [PATCH 2/2] feat(inventory/instances): dont set module location to allow underlying error location to bubble up --- .../distributed-service/service-module.nix | 51 +++++++------------ 1 file changed, 17 insertions(+), 34 deletions(-) diff --git a/lib/inventory/distributed-service/service-module.nix b/lib/inventory/distributed-service/service-module.nix index 480cb3986..1ad03ed28 100644 --- a/lib/inventory/distributed-service/service-module.nix +++ b/lib/inventory/distributed-service/service-module.nix @@ -120,22 +120,9 @@ let } ``` */ - makeExtensibleConfig = - f: args: - let - makeModuleExtensible = - eval: - eval.config - // { - __functor = _self: m: makeModuleExtensible (eval.extendModules { modules = lib.toList m; }); - }; - in - makeModuleExtensible (f args); # Extend evalModules result by a module, returns .config. - extendEval = - eval: m: - (eval.extendModules { modules = lib.toList m; } ).config; + extendEval = eval: m: (eval.extendModules { modules = lib.toList m; }).config; /** Apply the settings to the instance @@ -151,20 +138,18 @@ let machines = lib.mapAttrs (machineName: v: { # TODO: evaluate the settings against the interface # settings = (evalMachineSettings { inherit roleName instanceName; inherit (v) settings; }).config; - settings = ( - evalMachineSettings { + settings = + (evalMachineSettings { inherit roleName instanceName machineName; inherit (v) settings; - } - ).config; + }).config; }) role.machines; # TODO: evaluate the settings against the interface - settings = ( - evalMachineSettings { + settings = + (evalMachineSettings { inherit roleName instanceName; inherit (role) settings; - } - ).config; + }).config; }) instance.roles; in { @@ -332,20 +317,17 @@ in name = machineName; roles = lib.attrNames (lib.filterAttrs (_n: v: v.machines ? ${machineName}) roles); }; - settings = ( - evalMachineSettings { + settings = + (evalMachineSettings { inherit roleName instanceName machineName; settings = config.instances.${instanceName}.roles.${roleName}.machines.${machineName}.settings or { }; - } - ).config; - extendSettings = extendEval ( - evalMachineSettings { - inherit roleName instanceName machineName; - settings = - config.instances.${instanceName}.roles.${roleName}.machines.${machineName}.settings or { }; - } - ); + }).config; + extendSettings = extendEval (evalMachineSettings { + inherit roleName instanceName machineName; + settings = + config.instances.${instanceName}.roles.${roleName}.machines.${machineName}.settings or { }; + }); }; modules = [ v ]; }).config; @@ -521,7 +503,8 @@ in imports = [ # For error backtracing. This module was produced by the 'perMachine' function # TODO: check if we need this or if it leads to better errors if we pass the underlying module locations - (lib.setDefaultModuleLocation "clan.service: ${config.manifest.name} - via perMachine" machineResult.nixosModule) + # (lib.setDefaultModuleLocation "clan.service: ${config.manifest.name} - via perMachine" machineResult.nixosModule) + (machineResult.nixosModule) ] ++ instanceResults; }; }