From 392211d65ebb2255cc54d469b25a2c33beb2f8f7 Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Tue, 1 Jul 2025 17:45:02 +0200 Subject: [PATCH] clanServices: bring back state-version It seems it was accidentially deleted. We cannot do that @davHau please offer a migration path That allows people to migrate, without breaking their clans --- clanServices/state-version/README.md | 37 ++++++++++++++++++ clanServices/state-version/default.nix | 39 +++++++++++++++++++ clanServices/state-version/flake-module.nix | 16 ++++++++ .../state-version/tests/vm/default.nix | 21 ++++++++++ .../tests/vm/sops/users/admin/key.json | 4 ++ .../server/state-version/version/value | 1 + 6 files changed, 118 insertions(+) create mode 100644 clanServices/state-version/README.md create mode 100644 clanServices/state-version/default.nix create mode 100644 clanServices/state-version/flake-module.nix create mode 100644 clanServices/state-version/tests/vm/default.nix create mode 100644 clanServices/state-version/tests/vm/sops/users/admin/key.json create mode 100644 clanServices/state-version/tests/vm/vars/per-machine/server/state-version/version/value diff --git a/clanServices/state-version/README.md b/clanServices/state-version/README.md new file mode 100644 index 000000000..c55063b66 --- /dev/null +++ b/clanServices/state-version/README.md @@ -0,0 +1,37 @@ +This service generates the `system.stateVersion` of the nixos installation +automatically. + +Possible values: +[system.stateVersion](https://search.nixos.org/options?channel=unstable&show=system.stateVersion&from=0&size=50&sort=relevance&type=packages&query=stateVersion) + +## Usage + +The following configuration will set `stateVersion` for all machines: + +``` +inventory.instances = { + state-version = { + module = { + name = "state-version"; + input = "clan"; + }; + roles.default.tags.all = { }; + }; +``` + +## Migration + +If you are already setting `system.stateVersion`, either let the automatic +generation happen, or trigger the generation manually for the machine. The +service will take the specified version, if one is already supplied through the +config. + +To manually generate the version for a specified machine run: + +``` +clan vars generate [MACHINE] +``` + +If the setting was already set, you can then remove `system.stateVersion` from +your machine configuration. For new machines, just import the service as shown +above. diff --git a/clanServices/state-version/default.nix b/clanServices/state-version/default.nix new file mode 100644 index 000000000..34a0575e8 --- /dev/null +++ b/clanServices/state-version/default.nix @@ -0,0 +1,39 @@ +{ ... }: +{ + _class = "clan.service"; + manifest.name = "clan-core/state-version"; + manifest.description = "Automatically generate the state version of the nixos installation."; + manifest.categories = [ "System" ]; + + roles.default = { + + perInstance = + { ... }: + { + nixosModule = + { + config, + lib, + ... + }: + let + var = config.clan.core.vars.generators.state-version.files.version or { }; + in + { + system.stateVersion = lib.mkDefault (lib.removeSuffix "\n" var.value); + + clan.core.vars.generators.state-version = { + files.version = { + secret = false; + value = lib.mkDefault config.system.nixos.release; + }; + runtimeInputs = [ ]; + script = '' + echo -n ${config.system.stateVersion} > "$out"/version + ''; + }; + }; + }; + }; + +} diff --git a/clanServices/state-version/flake-module.nix b/clanServices/state-version/flake-module.nix new file mode 100644 index 000000000..c4ff9d633 --- /dev/null +++ b/clanServices/state-version/flake-module.nix @@ -0,0 +1,16 @@ +{ lib, ... }: +let + module = lib.modules.importApply ./default.nix { }; +in +{ + clan.modules.state-version = module; + perSystem = + { ... }: + { + clan.nixosTests.state-version = { + imports = [ ./tests/vm/default.nix ]; + + clan.modules."@clan/state-version" = module; + }; + }; +} diff --git a/clanServices/state-version/tests/vm/default.nix b/clanServices/state-version/tests/vm/default.nix new file mode 100644 index 000000000..efd4a6f14 --- /dev/null +++ b/clanServices/state-version/tests/vm/default.nix @@ -0,0 +1,21 @@ +{ + name = "state-version"; + + clan = { + directory = ./.; + inventory = { + machines.server = { }; + instances.default = { + module.name = "@clan/state-version"; + module.input = "self"; + roles.default.machines."server" = { }; + }; + }; + }; + + nodes.server = { }; + + testScript = '' + start_all() + ''; +} diff --git a/clanServices/state-version/tests/vm/sops/users/admin/key.json b/clanServices/state-version/tests/vm/sops/users/admin/key.json new file mode 100644 index 000000000..e408aa96b --- /dev/null +++ b/clanServices/state-version/tests/vm/sops/users/admin/key.json @@ -0,0 +1,4 @@ +{ + "publickey": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg", + "type": "age" +} diff --git a/clanServices/state-version/tests/vm/vars/per-machine/server/state-version/version/value b/clanServices/state-version/tests/vm/vars/per-machine/server/state-version/version/value new file mode 100644 index 000000000..115ab7a6a --- /dev/null +++ b/clanServices/state-version/tests/vm/vars/per-machine/server/state-version/version/value @@ -0,0 +1 @@ +25.11 \ No newline at end of file