Docs/inventory: ad-hoc loading of user modules

This commit is contained in:
Johannes Kirschbauer
2024-11-21 13:41:34 +01:00
committed by hsjobeki
parent 55175e38cc
commit 0d555df9ac
3 changed files with 62 additions and 12 deletions

View File

@@ -6,10 +6,8 @@ This site will guide you through authoring your first module. Explaining which c
Under construction Under construction
:fontawesome-solid-road-barrier: :fontawesome-solid-road-barrier: :fontawesome-solid-road-barrier: :fontawesome-solid-road-barrier: :fontawesome-solid-road-barrier: :fontawesome-solid-road-barrier:
!!! Note !!! Tip
Currently ClanModules should be contributed to the [clan-core repository](https://git.clan.lol/clan/clan-core) via a PR. External ClanModules can be ad-hoc loaded via [`clan.inventory.modules`](../reference/nix-api/inventory.md#modules)
Ad-hoc loading of custom modules is not recommended / supported yet.
## Bootstrapping the `clanModule` ## Bootstrapping the `clanModule`
@@ -43,13 +41,37 @@ clanModules/borgbackup
The `roles` folder is strictly required for `features = [ "inventory" ]`. The `roles` folder is strictly required for `features = [ "inventory" ]`.
The clanModule must be registered via the `clanModules` attribute in `clan-core` === "User module"
```nix title="clanModules/flake-module.nix" If the module should be ad-hoc loaded.
--8<-- "clanModules/flake-module.nix:0:6" It can be made avilable in any project via the [`clan.inventory.modules`](../reference/nix-api/inventory.md#modules) attribute.
# Register your new module here
```nix title="flake.nix"
# ... # ...
``` buildClan {
# 1. Add the module to the avilable inventory modules
inventory.modules = {
custom-module = ./modules/my_module;
};
# 2. Use the module in the inventory
inventory.services = {
custom-module.instance_1 = {
roles.default.machines = [ "machineA" ];
};
};
};
```
=== "Upstream module"
If the module will be contributed to [`clan-core`](https://git.clan.lol/clan-core)
The clanModule must be registered within the `clanModules` attribute in `clan-core`
```nix title="clanModules/flake-module.nix"
--8<-- "clanModules/flake-module.nix:0:5"
# Register our new module here
# ...
```
## Readme ## Readme

View File

@@ -58,7 +58,7 @@ let
res = builtins.mapAttrs ( res = builtins.mapAttrs (
moduleName: module: moduleName: module:
let let
frontmatter = clan-core.lib.modules.getFrontmatter moduleName; frontmatter = clan-core.lib.modules.getFrontmatter allModules.${moduleName} moduleName;
roles = roles =
if builtins.elem "inventory" frontmatter.features or [ ] then if builtins.elem "inventory" frontmatter.features or [ ] then
assert lib.isPath module; assert lib.isPath module;

View File

@@ -94,10 +94,38 @@ in
options = { options = {
modules = lib.mkOption { modules = lib.mkOption {
type = types.attrsOf types.path; type = types.attrsOf types.path;
internal = true;
visible = false;
default = { }; default = { };
defaultText = "clanModules of clan-core"; defaultText = "clanModules of clan-core";
description = ''
A mapping of module names to their path.
Each module can be referenced by its `attributeName` in the `inventory.services` attribute set.
!!! Important
Each module MUST fullfill the following requirements to be usable with the inventory:
- The module MUST have a `README.md` file with a `description`.
- The module MUST have at least `features = [ "inventory" ]` in the frontmatter section.
- The module MUST have a subfolder `roles` with at least one `{roleName}.nix` file.
For further information see: [Module Authoring Guide](../../clanmodules/index.md).
???+ example
```nix
buildClan {
# 1. Add the module to the avilable inventory modules
inventory.modules = {
custom-module = ./modules/my_module;
};
# 2. Use the module in the inventory
inventory.services = {
custom-module.instance_1 = {
roles.default.machines = [ "machineA" ];
};
};
};
```
'';
}; };
assertions = lib.mkOption { assertions = lib.mkOption {