feat(lib/inventory): fix arguments discrepancy on perInstance and perMachine

This commit is contained in:
Johannes Kirschbauer
2025-04-04 14:07:39 +02:00
parent 6c8d2d3cb5
commit f326c307eb
4 changed files with 67 additions and 41 deletions

View File

@@ -317,20 +317,24 @@ in
*/ */
v: instanceName: machineName: v: instanceName: machineName:
(lib.evalModules { (lib.evalModules {
specialArgs = { specialArgs =
inherit instanceName; let
machine = {
name = machineName;
roles = applySettings instanceName config.instances.${instanceName}; 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 ]; modules = [ v ];
}).config; }).config;
}; };

View File

@@ -67,6 +67,7 @@ in
# We might change the attribute name in the future # We might change the attribute name in the future
expr = res.importedModulesEvaluated ? "self-simple-module"; expr = res.importedModulesEvaluated ? "self-simple-module";
expected = true; expected = true;
inherit res;
}; };
# A module can be imported multiple times # A module can be imported multiple times

View File

@@ -10,6 +10,7 @@ let
}; };
# Define two roles with unmergeable interfaces # Define two roles with unmergeable interfaces
# Both define some 'timeout' but with completely different types. # Both define some 'timeout' but with completely different types.
roles.controller = { };
roles.peer.interface = roles.peer.interface =
{ lib, ... }: { lib, ... }:
{ {
@@ -23,6 +24,7 @@ let
instanceName, instanceName,
settings, settings,
machine, machine,
roles,
... ...
}: }:
let let
@@ -35,7 +37,12 @@ let
in in
{ {
nixosModule = { nixosModule = {
inherit instanceName settings machine; inherit
instanceName
settings
machine
roles
;
# We are double vendoring the settings # We are double vendoring the settings
# To test that we can do it indefinitely # To test that we can do it indefinitely
@@ -64,6 +71,7 @@ let
roles.peer = { roles.peer = {
settings.timeout = "foo-peer"; settings.timeout = "foo-peer";
}; };
roles.controller.machines.jon = { };
}; };
instances."instance_bar" = { instances."instance_bar" = {
module = { module = {
@@ -73,6 +81,8 @@ let
settings.timeout = "bar-peer-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) # import the module "B" (undefined)
# All machines have this instance # All machines have this instance
instances."instance_zaza" = { instances."instance_zaza" = {
@@ -108,17 +118,9 @@ in
# roles = peer # roles = peer
# machines = jon # machines = jon
settings = filterInternals res.importedModulesEvaluated.self-A.config.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.nixosModule.settings; 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; machine =
res.importedModulesEvaluated.self-A.config.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.nixosModule.machine;
# hasRoleSettings = roles = mapInternalsRecursive res.importedModulesEvaluated.self-A.config.result.allRoles.peer.allInstances.instance_foo.allMachines.jon.nixosModule.roles;
# 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;
}; };
expected = { expected = {
instanceName = "instance_foo"; instanceName = "instance_foo";
@@ -127,21 +129,37 @@ in
}; };
machine = { machine = {
name = "jon"; name = "jon";
roles = { roles = [
peer = { "controller"
machines = { "peer"
jon = { ];
settings = { };
__functor = "__functor"; roles = {
timeout = "foo-peer-jon"; controller = {
}; machines = {
jon = {
settings = {
__functor = "__functor";
}; };
}; };
settings = { };
__functor = "__functor"; settings = {
timeout = "foo-peer"; __functor = "__functor";
};
};
peer = {
machines = {
jon = {
settings = {
__functor = "__functor";
timeout = "foo-peer-jon";
};
}; };
}; };
settings = {
__functor = "__functor";
timeout = "foo-peer";
};
}; };
}; };
}; };

View File

@@ -26,9 +26,11 @@ let
}; };
perMachine = perMachine =
{ instances, ... }: { instances, machine, ... }:
{ {
nixosModule = instances; nixosModule = {
inherit instances machine;
};
}; };
}; };
machines = { machines = {
@@ -71,9 +73,10 @@ in
# settings should evaluate # settings should evaluate
test_per_machine_receives_instance_settings = { test_per_machine_receives_instance_settings = {
inherit res;
expr = { expr = {
hasMachineSettings = 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;
# settings are specific. # settings are specific.
@@ -81,10 +84,10 @@ in
# instance = instance_foo # instance = instance_foo
# roles = peer # roles = peer
# machines = jon # 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 = 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;
# settings are specific. # settings are specific.
@@ -92,7 +95,7 @@ in
# instance = instance_foo # instance = instance_foo
# roles = peer # roles = peer
# machines = * # 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 = { expected = {
hasMachineSettings = true; hasMachineSettings = true;