diff --git a/checks/flake-module.nix b/checks/flake-module.nix index 7aec75d36..0cffe80f3 100644 --- a/checks/flake-module.nix +++ b/checks/flake-module.nix @@ -10,6 +10,7 @@ in imports = filter pathExists [ ./backups/flake-module.nix ../nixosModules/clanCore/machine-id/tests/flake-module.nix + ../nixosModules/clanCore/state-version/tests/flake-module.nix ./devshell/flake-module.nix ./flash/flake-module.nix ./impure/flake-module.nix diff --git a/nixosModules/clanCore/default.nix b/nixosModules/clanCore/default.nix index 2b2c3990b..891b7cec5 100644 --- a/nixosModules/clanCore/default.nix +++ b/nixosModules/clanCore/default.nix @@ -19,6 +19,7 @@ ./nixos-facter.nix ./vm.nix ./machine-id + ./state-version ./wayland-proxy-virtwl.nix ./zerotier ./zfs.nix diff --git a/nixosModules/clanCore/state-version/default.nix b/nixosModules/clanCore/state-version/default.nix new file mode 100644 index 000000000..44d0aabac --- /dev/null +++ b/nixosModules/clanCore/state-version/default.nix @@ -0,0 +1,31 @@ +{ + lib, + config, + ... +}: +let + var = config.clan.core.vars.generators.state-version.files.version or { }; +in +{ + options.clan.core.settings.state-version = { + enable = lib.mkEnableOption "automatic state-version generation. + + The option will take the specified version, if one is already supplied through + the config or generate one if not. + "; + }; + + config = lib.mkIf (config.clan.core.settings.state-version.enable) { + 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/nixosModules/clanCore/state-version/tests/flake-module.nix b/nixosModules/clanCore/state-version/tests/flake-module.nix new file mode 100644 index 000000000..c21067461 --- /dev/null +++ b/nixosModules/clanCore/state-version/tests/flake-module.nix @@ -0,0 +1,38 @@ +{ ... }: +{ + perSystem = + { ... }: + { + clan.nixosTests.state-version = { + + name = "state-version"; + + clan = { + directory = ./.; + + # Workaround until we can use nodes.server = { }; + modules."@clan/importer" = ../../../../clanServices/importer; + + inventory = { + machines.server = { }; + instances.importer = { + module.name = "@clan/importer"; + roles.default.tags.all = { }; + roles.default.extraModules = [ + { + clan.core.settings.state-version.enable = true; + } + ]; + }; + }; + }; + + # TODO: Broken. Use instead of importer after fixing. + # nodes.server = { }; + + # This is not an actual vm test, this is a workaround to + # generate the needed vars for the eval test. + testScript = ""; + }; + }; +} diff --git a/nixosModules/clanCore/state-version/tests/sops/users/admin/key.json b/nixosModules/clanCore/state-version/tests/sops/users/admin/key.json new file mode 100644 index 000000000..e408aa96b --- /dev/null +++ b/nixosModules/clanCore/state-version/tests/sops/users/admin/key.json @@ -0,0 +1,4 @@ +{ + "publickey": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg", + "type": "age" +} diff --git a/nixosModules/clanCore/state-version/tests/vars/per-machine/server/state-version/version/value b/nixosModules/clanCore/state-version/tests/vars/per-machine/server/state-version/version/value new file mode 100644 index 000000000..115ab7a6a --- /dev/null +++ b/nixosModules/clanCore/state-version/tests/vars/per-machine/server/state-version/version/value @@ -0,0 +1 @@ +25.11 \ No newline at end of file