wip
This commit is contained in:
@@ -16,7 +16,6 @@ nixosLib.runTest (
|
|||||||
|
|
||||||
# This tests the compatibility of the inventory
|
# This tests the compatibility of the inventory
|
||||||
# With the test framework
|
# With the test framework
|
||||||
# - legacy-modules
|
|
||||||
# - clan.service modules
|
# - clan.service modules
|
||||||
name = "service-dummy-test-from-flake";
|
name = "service-dummy-test-from-flake";
|
||||||
|
|
||||||
@@ -45,9 +44,6 @@ nixosLib.runTest (
|
|||||||
start_all()
|
start_all()
|
||||||
admin1.wait_for_unit("multi-user.target")
|
admin1.wait_for_unit("multi-user.target")
|
||||||
peer1.wait_for_unit("multi-user.target")
|
peer1.wait_for_unit("multi-user.target")
|
||||||
# Provided by the legacy module
|
|
||||||
print(admin1.succeed("systemctl status dummy-service"))
|
|
||||||
print(peer1.succeed("systemctl status dummy-service"))
|
|
||||||
|
|
||||||
# peer1 should have the 'hello' file
|
# peer1 should have the 'hello' file
|
||||||
peer1.succeed("cat ${nodes.peer1.clan.core.vars.generators.new-service.files.not-a-secret.path}")
|
peer1.succeed("cat ${nodes.peer1.clan.core.vars.generators.new-service.files.not-a-secret.path}")
|
||||||
|
|||||||
@@ -15,12 +15,6 @@
|
|||||||
meta.name = "foo";
|
meta.name = "foo";
|
||||||
machines.peer1 = { };
|
machines.peer1 = { };
|
||||||
machines.admin1 = { };
|
machines.admin1 = { };
|
||||||
services = {
|
|
||||||
legacy-module.default = {
|
|
||||||
roles.peer.machines = [ "peer1" ];
|
|
||||||
roles.admin.machines = [ "admin1" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
instances."test" = {
|
instances."test" = {
|
||||||
module.name = "new-service";
|
module.name = "new-service";
|
||||||
@@ -28,9 +22,6 @@
|
|||||||
roles.peer.machines.peer1 = { };
|
roles.peer.machines.peer1 = { };
|
||||||
};
|
};
|
||||||
|
|
||||||
modules = {
|
|
||||||
legacy-module = ./legacy-module;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
modules.new-service = {
|
modules.new-service = {
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
description = "Set up dummy-module"
|
|
||||||
categories = ["System"]
|
|
||||||
features = [ "inventory" ]
|
|
||||||
|
|
||||||
[constraints]
|
|
||||||
roles.admin.min = 1
|
|
||||||
roles.admin.max = 1
|
|
||||||
---
|
|
||||||
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
imports = [
|
|
||||||
../shared.nix
|
|
||||||
];
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
imports = [
|
|
||||||
../shared.nix
|
|
||||||
];
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
{ config, ... }:
|
|
||||||
{
|
|
||||||
systemd.services.dummy-service = {
|
|
||||||
enable = true;
|
|
||||||
description = "Dummy service";
|
|
||||||
wantedBy = [ "multi-user.target" ];
|
|
||||||
serviceConfig = {
|
|
||||||
Type = "oneshot";
|
|
||||||
RemainAfterExit = true;
|
|
||||||
};
|
|
||||||
script = ''
|
|
||||||
generated_password_path="${config.clan.core.vars.generators.dummy-generator.files.generated-password.path}"
|
|
||||||
if [ ! -f "$generated_password_path" ]; then
|
|
||||||
echo "Generated password file not found: $generated_password_path"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
host_id_path="${config.clan.core.vars.generators.dummy-generator.files.host-id.path}"
|
|
||||||
if [ ! -e "$host_id_path" ]; then
|
|
||||||
echo "Host ID file not found: $host_id_path"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
# TODO: add and prompt and make it work in the test framework
|
|
||||||
clan.core.vars.generators.dummy-generator = {
|
|
||||||
files.host-id.secret = false;
|
|
||||||
files.generated-password.secret = true;
|
|
||||||
script = ''
|
|
||||||
echo $RANDOM > "$out"/host-id
|
|
||||||
echo $RANDOM > "$out"/generated-password
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -15,7 +15,6 @@ nixosLib.runTest (
|
|||||||
|
|
||||||
# This tests the compatibility of the inventory
|
# This tests the compatibility of the inventory
|
||||||
# With the test framework
|
# With the test framework
|
||||||
# - legacy-modules
|
|
||||||
# - clan.service modules
|
# - clan.service modules
|
||||||
name = "service-dummy-test";
|
name = "service-dummy-test";
|
||||||
|
|
||||||
@@ -24,12 +23,6 @@ nixosLib.runTest (
|
|||||||
inventory = {
|
inventory = {
|
||||||
machines.peer1 = { };
|
machines.peer1 = { };
|
||||||
machines.admin1 = { };
|
machines.admin1 = { };
|
||||||
services = {
|
|
||||||
legacy-module.default = {
|
|
||||||
roles.peer.machines = [ "peer1" ];
|
|
||||||
roles.admin.machines = [ "admin1" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
instances."test" = {
|
instances."test" = {
|
||||||
module.name = "new-service";
|
module.name = "new-service";
|
||||||
@@ -37,9 +30,6 @@ nixosLib.runTest (
|
|||||||
roles.peer.machines.peer1 = { };
|
roles.peer.machines.peer1 = { };
|
||||||
};
|
};
|
||||||
|
|
||||||
modules = {
|
|
||||||
legacy-module = ./legacy-module;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
modules.new-service = {
|
modules.new-service = {
|
||||||
_class = "clan.service";
|
_class = "clan.service";
|
||||||
@@ -78,9 +68,6 @@ nixosLib.runTest (
|
|||||||
start_all()
|
start_all()
|
||||||
admin1.wait_for_unit("multi-user.target")
|
admin1.wait_for_unit("multi-user.target")
|
||||||
peer1.wait_for_unit("multi-user.target")
|
peer1.wait_for_unit("multi-user.target")
|
||||||
# Provided by the legacy module
|
|
||||||
print(admin1.succeed("systemctl status dummy-service"))
|
|
||||||
print(peer1.succeed("systemctl status dummy-service"))
|
|
||||||
|
|
||||||
# peer1 should have the 'hello' file
|
# peer1 should have the 'hello' file
|
||||||
peer1.succeed("cat ${nodes.peer1.clan.core.vars.generators.new-service.files.not-a-secret.path}")
|
peer1.succeed("cat ${nodes.peer1.clan.core.vars.generators.new-service.files.not-a-secret.path}")
|
||||||
|
|||||||
@@ -6,48 +6,6 @@ let
|
|||||||
|
|
||||||
Refer to https://docs.clan.lol/guides/migrations/migrate-inventory-services for migration.
|
Refer to https://docs.clan.lol/guides/migrations/migrate-inventory-services for migration.
|
||||||
'';
|
'';
|
||||||
|
|
||||||
modnames = [
|
|
||||||
"auto-upgrade"
|
|
||||||
"admin"
|
|
||||||
"borgbackup"
|
|
||||||
"borgbackup-static"
|
|
||||||
"deltachat"
|
|
||||||
"data-mesher"
|
|
||||||
"disk-id"
|
|
||||||
"dyndns"
|
|
||||||
"ergochat"
|
|
||||||
"garage"
|
|
||||||
"heisenbridge"
|
|
||||||
"importer"
|
|
||||||
"iwd"
|
|
||||||
"localbackup"
|
|
||||||
"localsend"
|
|
||||||
"matrix-synapse"
|
|
||||||
"moonlight"
|
|
||||||
"mumble"
|
|
||||||
"mycelium"
|
|
||||||
"nginx"
|
|
||||||
"packages"
|
|
||||||
"postgresql"
|
|
||||||
"root-password"
|
|
||||||
"single-disk"
|
|
||||||
"sshd"
|
|
||||||
"state-version"
|
|
||||||
"static-hosts"
|
|
||||||
"sunshine"
|
|
||||||
"syncthing"
|
|
||||||
"syncthing-static-peers"
|
|
||||||
"thelounge"
|
|
||||||
"trusted-nix-caches"
|
|
||||||
"user-password"
|
|
||||||
"vaultwarden"
|
|
||||||
"wifi"
|
|
||||||
"xfce"
|
|
||||||
"zerotier"
|
|
||||||
"zerotier-static-peers"
|
|
||||||
"zt-tcp-relay"
|
|
||||||
];
|
|
||||||
in
|
in
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -36,9 +36,6 @@
|
|||||||
in
|
in
|
||||||
docs.optionsJSON;
|
docs.optionsJSON;
|
||||||
|
|
||||||
# Options available via ` imports = [ clanModules.${moduleName} ]; ` (Direct nix import)
|
|
||||||
clanModulesViaNix = pkgs.writeText "info.json" (builtins.toJSON jsonDocs.clanModulesViaNix);
|
|
||||||
|
|
||||||
# Options available when imported via ` inventory.${moduleName}....${rolesName} `
|
# Options available when imported via ` inventory.${moduleName}....${rolesName} `
|
||||||
clanModulesViaRoles = pkgs.writeText "info.json" (builtins.toJSON jsonDocs.clanModulesViaRoles);
|
clanModulesViaRoles = pkgs.writeText "info.json" (builtins.toJSON jsonDocs.clanModulesViaRoles);
|
||||||
|
|
||||||
@@ -94,7 +91,6 @@
|
|||||||
# A file that contains the links to all clanModule docs
|
# A file that contains the links to all clanModule docs
|
||||||
export CLAN_MODULES_VIA_ROLES=${clanModulesViaRoles}
|
export CLAN_MODULES_VIA_ROLES=${clanModulesViaRoles}
|
||||||
export CLAN_MODULES_VIA_SERVICE=${clanModulesViaService}
|
export CLAN_MODULES_VIA_SERVICE=${clanModulesViaService}
|
||||||
export CLAN_MODULES_VIA_NIX=${clanModulesViaNix}
|
|
||||||
export CLAN_SERVICE_INTERFACE=${self'.legacyPackages.clan-service-module-interface}/share/doc/nixos/options.json
|
export CLAN_SERVICE_INTERFACE=${self'.legacyPackages.clan-service-module-interface}/share/doc/nixos/options.json
|
||||||
# Frontmatter format for clanModules
|
# Frontmatter format for clanModules
|
||||||
export CLAN_MODULES_FRONTMATTER_DOCS=${clanModulesFrontmatter}/share/doc/nixos/options.json
|
export CLAN_MODULES_FRONTMATTER_DOCS=${clanModulesFrontmatter}/share/doc/nixos/options.json
|
||||||
@@ -111,7 +107,6 @@
|
|||||||
legacyPackages = {
|
legacyPackages = {
|
||||||
inherit
|
inherit
|
||||||
jsonDocs
|
jsonDocs
|
||||||
clanModulesViaNix
|
|
||||||
clanModulesViaRoles
|
clanModulesViaRoles
|
||||||
clanModulesViaService
|
clanModulesViaService
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -1,34 +1,17 @@
|
|||||||
{
|
{
|
||||||
modulesRolesOptions,
|
modulesRolesOptions,
|
||||||
nixosOptionsDoc,
|
nixosOptionsDoc,
|
||||||
clanModules,
|
|
||||||
evalClanModules,
|
evalClanModules,
|
||||||
lib,
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
clan-core,
|
clan-core,
|
||||||
|
...
|
||||||
}:
|
}:
|
||||||
let
|
let
|
||||||
inherit (clan-core.clanLib.docs) stripStorePathsFromDeclarations;
|
inherit (clan-core.clanLib.docs) stripStorePathsFromDeclarations;
|
||||||
transformOptions = stripStorePathsFromDeclarations;
|
transformOptions = stripStorePathsFromDeclarations;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
# clanModules docs
|
|
||||||
clanModulesViaNix = lib.mapAttrs (
|
|
||||||
name: module:
|
|
||||||
if builtins.pathExists (module + "/default.nix") then
|
|
||||||
(nixosOptionsDoc {
|
|
||||||
options =
|
|
||||||
((evalClanModules {
|
|
||||||
modules = [ module ];
|
|
||||||
inherit pkgs clan-core;
|
|
||||||
}).options
|
|
||||||
).clan.${name} or { };
|
|
||||||
warningsAreErrors = true;
|
|
||||||
inherit transformOptions;
|
|
||||||
}).optionsJSON
|
|
||||||
else
|
|
||||||
{ }
|
|
||||||
) clanModules;
|
|
||||||
|
|
||||||
clanModulesViaRoles = lib.mapAttrs (
|
clanModulesViaRoles = lib.mapAttrs (
|
||||||
_moduleName: rolesOptions:
|
_moduleName: rolesOptions:
|
||||||
|
|||||||
@@ -121,45 +121,7 @@ let
|
|||||||
);
|
);
|
||||||
|
|
||||||
checkConstraints = args: (evalFrontmatter args).config.constraints.assertions;
|
checkConstraints = args: (evalFrontmatter args).config.constraints.assertions;
|
||||||
|
getFrontmatter = _modulepath: _modulename: "clanModules are removed!";
|
||||||
getReadme =
|
|
||||||
modulepath: modulename:
|
|
||||||
let
|
|
||||||
readme = modulepath + "/README.md";
|
|
||||||
readmeContents =
|
|
||||||
if (builtins.pathExists readme) then
|
|
||||||
(builtins.readFile readme)
|
|
||||||
else
|
|
||||||
throw "No README.md found for module ${modulename} (expected at ${readme})";
|
|
||||||
in
|
|
||||||
readmeContents;
|
|
||||||
|
|
||||||
getFrontmatter =
|
|
||||||
modulepath: modulename:
|
|
||||||
let
|
|
||||||
content = getReadme modulepath modulename;
|
|
||||||
parts = lib.splitString "---" content;
|
|
||||||
# Partition the parts into the first part (the readme content) and the rest (the metadata)
|
|
||||||
parsed = builtins.partition ({ index, ... }: if index >= 2 then false else true) (
|
|
||||||
lib.filter ({ index, ... }: index != 0) (lib.imap0 (index: part: { inherit index part; }) parts)
|
|
||||||
);
|
|
||||||
meta = builtins.fromTOML (builtins.head parsed.right).part;
|
|
||||||
in
|
|
||||||
if (builtins.length parts >= 3) then
|
|
||||||
meta
|
|
||||||
else
|
|
||||||
throw ''
|
|
||||||
TOML Frontmatter not found in README.md for module ${modulename}
|
|
||||||
|
|
||||||
Please add the following to the top of your README.md:
|
|
||||||
|
|
||||||
---
|
|
||||||
description = "Your description here"
|
|
||||||
categories = [ "Your categories here" ]
|
|
||||||
features = [ "inventory" ]
|
|
||||||
---
|
|
||||||
...rest of your README.md...
|
|
||||||
'';
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
inherit
|
inherit
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ in
|
|||||||
```
|
```
|
||||||
'';
|
'';
|
||||||
|
|
||||||
apply =_: {};
|
apply = _: { };
|
||||||
};
|
};
|
||||||
|
|
||||||
assertions = lib.mkOption {
|
assertions = lib.mkOption {
|
||||||
|
|||||||
Reference in New Issue
Block a user