Compare commits

...

1 Commits

Author SHA1 Message Date
Johannes Kirschbauer
5e7d4e122e deps: init poc 2025-09-15 11:39:55 +02:00
8 changed files with 144 additions and 14 deletions

View File

@@ -3,13 +3,20 @@
# The test for this module in ./tests/vm/default.nix shows an example of how # The test for this module in ./tests/vm/default.nix shows an example of how
# the service is used. # the service is used.
{ ... }@service:
{ packages }:
{ ... }:
{ {
_class = "clan.service"; _class = "clan.service";
manifest.name = "clan-core/hello-word"; manifest.name = "clan-core/hello-world";
manifest.description = "This is a test"; manifest.description = "This is a test";
manifest.dependencies = {
#
home-manager = {
recomendedUrl = "github:nix-community/home-manager/release-25.05";
};
};
# Declare dependencies that the user must provide via flake inputs
# Or via 'clan.serviceOverrides.<manifest-name>.dependencies.resolved
# This service provides two roles: "morning" and "evening". Roles can be # This service provides two roles: "morning" and "evening". Roles can be
# defined in this file directly (e.g. the "morning" role) or split up into a # defined in this file directly (e.g. the "morning" role) or split up into a

View File

@@ -5,9 +5,7 @@
... ...
}: }:
let let
module = lib.modules.importApply ./default.nix { module = ./default.nix;
inherit (self) packages;
};
in in
{ {
clan.modules = { clan.modules = {

View File

@@ -66,7 +66,39 @@
}; };
clan = { clan = {
meta.name = "clan-core"; meta.name = "clan-core";
modules = {
myModule = { ... }: {
#
_module.args = { inherit inputs; };
};
# # depends on home-manager 25.05
# myEnzime = { ... }: {
# imports = [ inputs.enzime.yours ];
# dependencies.home-manager = lib.mkForce "my-home-manager";
# };
# # depends on home-manager 24.05
# myLassulus = { ... }: {
# imports = [ inputs.lassulus.his ];
# dependencies.home-manager = lib.mkForce "my-home-manager";
# };
};
serviceOverrides = {
"clan-core/hello-world" = {
dependencies = {
flake-parts = "flake-parts";
};
};
};
inventory = { inventory = {
instances.hello-world = {
roles.morning.tags = [ "all" ];
};
machines = { machines = {
"test-darwin-machine" = { "test-darwin-machine" = {
machineClass = "darwin"; machineClass = "darwin";

View File

@@ -228,6 +228,38 @@ in
''; '';
}; };
serviceOverrides = lib.mkOption {
type = types.attrsOf (types.submoduleWith {
modules = [
{
options.dependencies = lib.mkOption {
type = types.attrsOf types.raw;
description = "Override a dependencies of this service";
};
}
];
});
default = { };
description = ''
Override/inject dependencies to a service.
Example:
```nix
{
servicesOverrides = {
# Override need to be done by manifest name to avoid ambiguity
"clan-core/hello-world" = {
dependencies = {
home-manager = inputs.home-manager-v2;
};
};
};
}
```
'';
};
inventory = lib.mkOption { inventory = lib.mkOption {
type = types.submoduleWith { type = types.submoduleWith {
modules = [ modules = [

View File

@@ -248,7 +248,7 @@ in
staticModules = clan-core.clan.modules; staticModules = clan-core.clan.modules;
distributedServices = clanLib.inventory.mapInstances { distributedServices = clanLib.inventory.mapInstances {
inherit (clanConfig) inventory exportsModule; inherit (clanConfig) inventory exportsModule serviceOverrides;
inherit flakeInputs directory; inherit flakeInputs directory;
clanCoreModules = clan-core.clan.modules; clanCoreModules = clan-core.clan.modules;
prefix = [ "distributedServices" ]; prefix = [ "distributedServices" ];

View File

@@ -2,6 +2,7 @@
{ {
# TODO: consume directly from clan.config # TODO: consume directly from clan.config
directory, directory,
serviceOverrides,
}: }:
{ {
lib, lib,
@@ -31,10 +32,12 @@ in
( (
{ name, ... }: { name, ... }:
{ {
_module.args._ctx = [ name ]; _module.args = {
_module.args.exports = config.exports; _ctx = [ name ];
_module.args.directory = directory; exports = config.exports;
directory = directory;
inherit (specialArgs) clanLib _unsafe;
};
} }
) )
./service-module.nix ./service-module.nix
@@ -43,6 +46,9 @@ in
inherit (specialArgs) clanLib; inherit (specialArgs) clanLib;
prefix = _ctx; prefix = _ctx;
}) })
(service: {
dependencies = lib.mapAttrs (n: v: { resolved = v; }) serviceOverrides.${service.config.manifest.name}.dependencies or { };
})
]; ];
}; };
}; };

View File

@@ -26,8 +26,9 @@ in
inventory, inventory,
directory, directory,
clanCoreModules, clanCoreModules,
prefix ? [ ],
exportsModule, exportsModule,
prefix ? [ ],
serviceOverrides ? { },
}: }:
let let
# machineHasTag = machineName: tagName: lib.elem tagName inventory.machines.${machineName}.tags; # machineHasTag = machineName: tagName: lib.elem tagName inventory.machines.${machineName}.tags;
@@ -127,9 +128,10 @@ in
specialArgs = { specialArgs = {
inherit clanLib; inherit clanLib;
_ctx = prefix; _ctx = prefix;
_unsafe.flakeInputs = flakeInputs;
}; };
modules = [ modules = [
(import ./all-services-wrapper.nix { inherit directory; }) (import ./all-services-wrapper.nix { inherit directory serviceOverrides; })
] ]
++ modules; ++ modules;
}; };

View File

@@ -2,6 +2,7 @@
lib, lib,
config, config,
_ctx, _ctx,
_unsafe,
directory, directory,
exports, exports,
... ...
@@ -106,6 +107,10 @@ let
in in
{ {
options = { options = {
debug = mkOption {
default = _unsafe.flakeInputs;
};
# Option to disable some behavior during docs rendering # Option to disable some behavior during docs rendering
_docs_rendering = mkOption { _docs_rendering = mkOption {
default = false; default = false;
@@ -113,6 +118,54 @@ in
type = types.bool; type = types.bool;
}; };
dependencies = mkOption {
type = types.attrsWith {
placeholder = "dependencyName";
elemType = types.submoduleWith {
modules = [
({name,...}@dep: {
options.name = mkOption {
default = name;
type = types.str;
description = "The name of the dependency, usually the input name.";
};
options.resolved = mkOption {
type = types.raw;
default = _unsafe.flakeInputs.${dep.config.name} or (throw ''
The dependency '${dep.config.name}' could not be found in the flake inputs.
This module requires '${dep.config.name}' to be present
Fixes:
- Add '${dep.config.name}' to the flake inputs
- Inject a custom dependency via 'clan.serviceOverrides.<manifest-name>.dependencies.${dep.config.name} = ...'
'');
description = ''
The resolved value of the dependency.
'';
};
})
];
};
};
description = ''
Dependencies of this service.
Can be declared via `clan.lib.mkDependency`.
```nix
{
home-manager = clan.lib.mkDependency {
name = "home-manager";
};
}
```
This will map `inputs.home-manager` to `dependencies.home-manager`.
The dependency can then be safely accessed via `config.dependencies.home-manager` from the toplevel arguments of this module.
'';
default = { };
};
instances = mkOption { instances = mkOption {
visible = false; visible = false;
defaultText = "Throws: 'The service must define its instances' when not defined"; defaultText = "Throws: 'The service must define its instances' when not defined";