diff --git a/clanModules/state-version/README.md b/clanModules/state-version/README.md index e40476e5e..f8544f0de 100644 --- a/clanModules/state-version/README.md +++ b/clanModules/state-version/README.md @@ -1,6 +1,6 @@ --- description = "Automatically generate the state version of the nixos installation." -features = [ "inventory" ] +features = [ "inventory", "deprecated" ] --- This module generates the `system.stateVersion` of the nixos installation automatically. 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..4f848476b --- /dev/null +++ b/clanServices/state-version/flake-module.nix @@ -0,0 +1,19 @@ +{ lib, self, ... }: +{ + clan.modules = { + state-version = lib.modules.importApply ./default.nix { }; + }; + + perSystem = + { pkgs, ... }: + { + checks = lib.optionalAttrs (pkgs.stdenv.isLinux) { + state-version = import ./tests/vm/default.nix { + inherit pkgs; + clan-core = self; + nixosLib = import (self.inputs.nixpkgs + "/nixos/lib") { }; + }; + }; + }; + +} diff --git a/clanServices/state-version/tests/vm/default.nix b/clanServices/state-version/tests/vm/default.nix new file mode 100644 index 000000000..15497fee2 --- /dev/null +++ b/clanServices/state-version/tests/vm/default.nix @@ -0,0 +1,37 @@ +{ + pkgs, + nixosLib, + clan-core, + ... +}: + +nixosLib.runTest ( + { ... }: + { + imports = [ + clan-core.modules.nixosVmTest.clanTest + ]; + + hostPkgs = pkgs; + + name = "state-version"; + + clan = { + directory = ./.; + modules."@clan/state-version" = ../../default.nix; + inventory = { + machines.server = { }; + instances.default = { + module.name = "@clan/state-version"; + 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 diff --git a/clanServices/zerotier/README.md b/clanServices/zerotier/README.md index b683056ac..5566362cb 100644 --- a/clanServices/zerotier/README.md +++ b/clanServices/zerotier/README.md @@ -1,4 +1,4 @@ -## Example Usage +## Usage ``` inventory.instances = { diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 17fe0684c..3f4e77fac 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -94,6 +94,7 @@ nav: - reference/clanServices/localsend.md - reference/clanServices/mycelium.md - reference/clanServices/sshd.md + - reference/clanServices/state-version.md - reference/clanServices/trusted-nix-caches.md - reference/clanServices/users.md - reference/clanServices/hello-world.md