diff --git a/modules/misc/news/2025/10/2025-10-26_14-36-05.nix b/modules/misc/news/2025/10/2025-10-26_14-36-05.nix new file mode 100644 index 000000000..3b12bd9fc --- /dev/null +++ b/modules/misc/news/2025/10/2025-10-26_14-36-05.nix @@ -0,0 +1,10 @@ +{ + time = "2025-10-26T07:36:05+00:00"; + condition = true; + message = '' + A new module is available: `programs.kraftkit`. + + kraftkit is a CLI tool for building custom, minimal, immutable lightweight + unikernel virtual machines based on Unikraft. + ''; +} diff --git a/modules/programs/kraftkit.nix b/modules/programs/kraftkit.nix new file mode 100644 index 000000000..3596bb988 --- /dev/null +++ b/modules/programs/kraftkit.nix @@ -0,0 +1,50 @@ +{ + config, + lib, + pkgs, + ... +}: +let + inherit (lib) + mkEnableOption + mkPackageOption + mkOption + mkIf + literalExpression + ; + + cfg = config.programs.kraftkit; + yamlFormat = pkgs.formats.yaml { }; +in +{ + meta.maintainers = [ lib.hm.maintainers.folliehiyuki ]; + + options.programs.kraftkit = { + enable = mkEnableOption "kraftkit - CLI to build and use customized unikernel VMs"; + + package = mkPackageOption pkgs "kraft" { nullable = true; }; + + settings = mkOption { + type = yamlFormat.type; + default = { }; + description = '' + Configuration written to {file}`$XDG_CONFIG_HOME/kraftkit/config.yaml`. + ''; + example = literalExpression '' + no_prompt = true; + log = { + level = "info"; + type = "fancy"; + }; + ''; + }; + }; + + config = mkIf cfg.enable { + home.packages = mkIf (cfg.package != null) [ cfg.package ]; + + xdg.configFile."kraftkit/config.yaml" = mkIf (cfg.settings != { }) { + source = yamlFormat.generate "kraftkit-config" cfg.settings; + }; + }; +} diff --git a/tests/modules/programs/kraftkit/default.nix b/tests/modules/programs/kraftkit/default.nix new file mode 100644 index 000000000..a56683828 --- /dev/null +++ b/tests/modules/programs/kraftkit/default.nix @@ -0,0 +1 @@ +{ kraftkit-example-settings = ./example-settings.nix; } diff --git a/tests/modules/programs/kraftkit/example-config-expected.yaml b/tests/modules/programs/kraftkit/example-config-expected.yaml new file mode 100644 index 000000000..a70f3383e --- /dev/null +++ b/tests/modules/programs/kraftkit/example-config-expected.yaml @@ -0,0 +1,6 @@ +collect_anonymous_telemetry: false +log: + level: info + timestamps: false + type: fancy +no_check_updates: true diff --git a/tests/modules/programs/kraftkit/example-settings.nix b/tests/modules/programs/kraftkit/example-settings.nix new file mode 100644 index 000000000..b1dead6f8 --- /dev/null +++ b/tests/modules/programs/kraftkit/example-settings.nix @@ -0,0 +1,24 @@ +{ config, ... }: +{ + programs.kraftkit = { + enable = true; + package = config.lib.test.mkStubPackage { }; + + settings = { + no_check_updates = true; + collect_anonymous_telemetry = false; + log = { + level = "info"; + timestamps = false; + type = "fancy"; + }; + }; + }; + + nmt.script = '' + assertFileExists "home-files/.config/kraftkit/config.yaml" + assertFileContent \ + "home-files/.config/kraftkit/config.yaml" \ + ${./example-config-expected.yaml} + ''; +}