diff --git a/lib/modules/clan/module.nix b/lib/modules/clan/module.nix index 99762d7aa..e68efc947 100644 --- a/lib/modules/clan/module.nix +++ b/lib/modules/clan/module.nix @@ -247,7 +247,7 @@ in { distributedServices = clanLib.inventory.mapInstances { inherit (clanConfig) inventory exportsModule; - inherit flakeInputs; + inherit flakeInputs directory; clanCoreModules = clan-core.clan.modules; prefix = [ "distributedServices" ]; }; diff --git a/lib/modules/inventory/distributed-service/all-services-wrapper.nix b/lib/modules/inventory/distributed-service/all-services-wrapper.nix index 30c22414e..a37ece97e 100644 --- a/lib/modules/inventory/distributed-service/all-services-wrapper.nix +++ b/lib/modules/inventory/distributed-service/all-services-wrapper.nix @@ -1,4 +1,8 @@ # Wraps all services in one fixed point module +{ + # TODO: consume directly from clan.config + directory, +}: { lib, config, @@ -29,6 +33,8 @@ in { _module.args._ctx = [ name ]; _module.args.exports' = config.exports; + _module.args.directory = directory; + } ) ./service-module.nix @@ -71,8 +77,5 @@ in }; default = { }; }; - debug = mkOption { - default = lib.mapAttrsToList (_: service: service.exports) config.mappedServices; - }; }; } diff --git a/lib/modules/inventory/distributed-service/inventory-adapter.nix b/lib/modules/inventory/distributed-service/inventory-adapter.nix index f47a9178f..906e333fa 100644 --- a/lib/modules/inventory/distributed-service/inventory-adapter.nix +++ b/lib/modules/inventory/distributed-service/inventory-adapter.nix @@ -24,6 +24,7 @@ in flakeInputs, # The clan inventory inventory, + directory, clanCoreModules, prefix ? [ ], exportsModule, @@ -128,7 +129,7 @@ in _ctx = prefix; }; modules = [ - ./all-services-wrapper.nix + (import ./all-services-wrapper.nix { inherit directory; }) ] ++ modules; }; diff --git a/lib/modules/inventory/distributed-service/service-module.nix b/lib/modules/inventory/distributed-service/service-module.nix index 0f465ad18..6b5ec817b 100644 --- a/lib/modules/inventory/distributed-service/service-module.nix +++ b/lib/modules/inventory/distributed-service/service-module.nix @@ -2,6 +2,7 @@ lib, config, _ctx, + directory, ... }: let @@ -212,7 +213,7 @@ in options.extraModules = lib.mkOption { default = [ ]; - type = types.listOf (types.deferredModule); + type = types.listOf (types.either types.deferredModule types.str); }; }) ]; @@ -755,10 +756,14 @@ in instanceRes // { nixosModule = { - imports = [ - # Result of the applied 'perInstance = {...}: { nixosModule = { ... }; }' - instanceRes.nixosModule - ] ++ instanceCfg.roles.${roleName}.extraModules; + imports = + [ + # Result of the applied 'perInstance = {...}: { nixosModule = { ... }; }' + instanceRes.nixosModule + ] + ++ (map ( + s: if builtins.typeOf s == "string" then "${directory}/${s}" else s + ) instanceCfg.roles.${roleName}.extraModules); }; } diff --git a/lib/modules/inventory/distributed-service/tests/default.nix b/lib/modules/inventory/distributed-service/tests/default.nix index e53eda12c..e9d74f877 100644 --- a/lib/modules/inventory/distributed-service/tests/default.nix +++ b/lib/modules/inventory/distributed-service/tests/default.nix @@ -45,6 +45,7 @@ let }; in clanLib.inventory.mapInstances { + directory = ./.; clanCoreModules = { }; flakeInputs = flakeInputsFixture; inherit inventory; @@ -52,6 +53,7 @@ let }; in { + extraModules = import ./extraModules.nix { inherit clanLib; }; exports = import ./exports.nix { inherit lib clanLib; }; resolve_module_spec = import ./import_module_spec.nix { inherit lib callInventoryAdapter; }; test_simple = diff --git a/lib/modules/inventory/distributed-service/tests/extraModules.nix b/lib/modules/inventory/distributed-service/tests/extraModules.nix new file mode 100644 index 000000000..0bedd1d3e --- /dev/null +++ b/lib/modules/inventory/distributed-service/tests/extraModules.nix @@ -0,0 +1,33 @@ +{ clanLib }: +let + clan = clanLib.clan { + self = { }; + directory = ./.; + + machines.jon = { + nixpkgs.hostPlatform = "x86_64-linux"; + + }; + # A module that adds exports perMachine + modules.A = { + manifest.name = "A"; + roles.peer = { }; + }; + + inventory = { + instances.A = { + module.input = "self"; + roles.peer.tags.all = { }; + + roles.peer.extraModules = [ ./oneOption.nix ]; + }; + }; + }; +in +{ + test_1 = { + inherit clan; + expr = clan.config.nixosConfigurations.jon.config.testDebug; + expected = 42; + }; +} diff --git a/lib/modules/inventory/distributed-service/tests/oneOption.nix b/lib/modules/inventory/distributed-service/tests/oneOption.nix new file mode 100644 index 000000000..c973612a8 --- /dev/null +++ b/lib/modules/inventory/distributed-service/tests/oneOption.nix @@ -0,0 +1,6 @@ +{ lib, ... }: +{ + options.testDebug = lib.mkOption { + default = 42; + }; +}