types: init swap

This commit is contained in:
David Arnold 2022-11-05 15:17:35 -05:00 committed by lassulus
parent aca927667a
commit efc80d7d89
4 changed files with 131 additions and 3 deletions

52
example/swap.nix Normal file
View file

@ -0,0 +1,52 @@
{ disks ? [ "/dev/vdb" ], ... }: {
disk = {
vdb = {
device = builtins.elemAt disks 0;
type = "disk";
content = {
type = "table";
format = "gpt";
partitions = [
{
type = "partition";
name = "ESP";
start = "1MiB";
end = "100MiB";
bootable = true;
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
};
}
{
name = "root";
type = "partition";
start = "100MiB";
end = "-1G";
part-type = "primary";
bootable = true;
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/";
};
}
{
name = "root";
type = "partition";
start = "-1G";
end = "100%";
part-type = "primary";
bootable = true;
content = {
type = "swap";
randomEncryption = true;
};
}
];
};
};
};
}

View file

@ -42,5 +42,6 @@ in {
# Remember to add config keys here if they are added to types
fileSystems = lib.mkIf cfg.enableConfig (lib.mkMerge (lib.catAttrs "fileSystems" (types.diskoLib.config cfg.devices)));
boot = lib.mkIf cfg.enableConfig (lib.mkMerge (lib.catAttrs "boot" (types.diskoLib.config cfg.devices)));
swapDevices = lib.mkIf cfg.enableConfig (lib.mkMerge (lib.catAttrs "swapDevices" (types.diskoLib.config cfg.devices)));
};
}

19
tests/swap.nix Normal file
View file

@ -0,0 +1,19 @@
{ pkgs ? (import <nixpkgs> { })
, makeDiskoTest ? (pkgs.callPackage ./lib.nix { }).makeDiskoTest
}:
makeDiskoTest {
disko-config = ../example/swap.nix;
extraTestScript = ''
machine.succeed("mountpoint /");
machine.succeed("swapon --show >&2");
machine.succeed("""
lsblk --json |
${pkgs.jq}/bin/jq -e '.blockdevices[] |
select(.name == "vda") |
.children[] |
select(.name == "vda3") |
.children[0].mountpoints[0] == "[SWAP]"
'
""");
'';
}

View file

@ -18,13 +18,13 @@ rec {
# option for valid contents of partitions (basically like devices, but without tables)
partitionType = mkOption {
type = types.nullOr (diskoLib.subType { inherit btrfs filesystem zfs mdraid luks lvm_pv; });
type = types.nullOr (diskoLib.subType { inherit btrfs filesystem zfs mdraid luks lvm_pv swap; });
default = null;
};
# option for valid contents of devices
deviceType = mkOption {
type = types.nullOr (diskoLib.subType { inherit table btrfs filesystem zfs mdraid luks lvm_pv; });
type = types.nullOr (diskoLib.subType { inherit table btrfs filesystem zfs mdraid luks lvm_pv swap; });
default = null;
};
@ -547,6 +547,62 @@ rec {
};
});
swap = types.submodule ({ config, ... }: {
options = {
type = mkOption {
type = types.enum [ "swap" ];
internal = true;
};
randomEncryption = mkOption {
type = types.bool;
default = false;
};
_meta = mkOption {
internal = true;
readOnly = true;
type = types.functionTo diskoLib.jsonType;
default = dev: {
};
};
_create = mkOption {
internal = true;
readOnly = true;
type = types.functionTo types.str;
default = dev: ''
mkswap ${dev}
'';
};
_mount = mkOption {
internal = true;
readOnly = true;
type = types.functionTo diskoLib.jsonType;
default = dev: {
fs.${dev} = ''
if ! $(swapon --show | grep -q '^${dev} '); then
swapon ${dev}
fi
'';
};
};
_config = mkOption {
internal = true;
readOnly = true;
default = dev: [{
swapDevices = [{
device = dev;
randomEncryption = config.randomEncryption;
}];
}];
};
_pkgs = mkOption {
internal = true;
readOnly = true;
type = types.functionTo (types.listOf types.package);
default = pkgs: [ pkgs.util-linux ];
};
};
});
lvm_pv = types.submodule ({ config, ... }: {
options = {
type = mkOption {
@ -1158,7 +1214,7 @@ rec {
type = types.enum [ "disk" ];
};
device = mkOption {
type = optionTypes.absolute-pathname; # TODO check if subpath of /dev ?
type = optionTypes.absolute-pathname; # TODO check if subpath of /dev ? - No! eg: /.swapfile
};
content = diskoLib.deviceType;
_meta = mkOption {