nixosMod: add vmDisko module

main
Felix Stupp 2 months ago
parent 4592c002e9
commit e84aaf361d
Signed by: zocker
GPG Key ID: 93E1BD26F6B02FB7

@ -26,6 +26,7 @@ in
./extends ./extends
./frontend ./frontend
./improvedDefaults ./improvedDefaults
./vmDisko
# files # files
./allCommon.nix ./allCommon.nix
./autoUnfree.nix ./autoUnfree.nix

@ -0,0 +1,115 @@
{
config,
lib,
options,
...
}:
let
self = options.x-banananetwork.vmDisko;
cfg = config.x-banananetwork.vmDisko;
in
{
# TODO upstream that to disko
options.x-banananetwork.vmDisko = {
enable = lib.mkEnableOption ''
VM disk configuration with disko.
Will be automatically enabled when option{x-banananetwork.vmDisko.generation} is manually set.
'';
mainDiskName = lib.mkOption {
description = ''
Name of the main disk.
Similar to {option}`system.stateVersion`,
**do not change this** unless you know what you are doing.
'';
type = lib.types.str;
};
generation = lib.mkOption {
description = ''
Disk generation to use.
Similar to {option}`system.stateVersion`,
**do not change this** unless you know what you are doing.
See option {option}`x-banananetwork.vmDisko.generations`
for a list of all generations available.
'';
type = with lib.types; nullOr str;
default = null;
example = self.recommendedGeneration.default;
};
recommendedGeneration = lib.mkOption {
description = ''
Disk generation recommended to use for new systems.
'';
default = "ext4-1";
readOnly = true;
};
generationsDir = lib.mkOption {
description = ''
Directories where to search for generations.
A generation must at least use one disk with the attr name `main`
(through its label name can be different)
because VMs are expected to have at least one disk as their primary available.
'';
type = lib.types.path;
default = ./.;
example = ./.;
};
generationPath = lib.mkOption {
description = "Path to selected generation template.";
readOnly = true;
type = lib.types.path;
default =
let
path = cfg.generationsDir + "/${cfg.generation}";
in
if builtins.pathExists path then path else path + ".nix";
defaultText = lib.literalExpression ''
with config.x-banananetwork.vmDisko;
generationsDir + ("/''${generation}" or "/''${generation}.nix")
'';
};
};
config = lib.mkMerge [
(lib.mkIf (cfg.generation != null) { x-banananetwork.vmDisko.enable = true; })
(lib.mkIf cfg.enable {
assertions = [
{
assertion = cfg.enable -> cfg.generation != null;
message = "x-banananetwork.vmDisko.generation must be set. Currently \"${cfg.recommendedGeneration}\" is recommended.";
}
{
assertion = cfg.generation != null -> builtins.pathExists cfg.generationPath;
message = "generation \"${cfg.generation}\" was not found in ${cfg.generationPath}";
}
];
disko.devices = lib.mkMerge [
(import cfg.generationPath)
{
# avoid mixing VM disks
# hint: mkOverride required because
# - cfg.generations from above is already type-checked, hence priorities are discharged
# - assigment from above has default priority of 100
#disk.main.name = lib.mkOverride 99 cfg.mainDiskName;
disk.main.name = cfg.mainDiskName;
}
];
})
];
}

@ -0,0 +1,29 @@
{
disk = {
main = {
type = "disk";
content = {
type = "gpt";
partitions = {
ESP = {
type = "EF00";
size = "500M";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
};
};
root = {
size = "100%";
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/";
};
};
};
};
};
};
}
Loading…
Cancel
Save