From 654ecb386eb2f1444b73fb23583bd94af0a09fab Mon Sep 17 00:00:00 2001 From: lassulus Date: Fri, 7 Apr 2023 15:08:20 +0200 Subject: [PATCH] types lvm_vg: inline lvm_lv type --- example/complex.nix | 5 --- example/luks-lvm.nix | 3 -- example/lvm-raid.nix | 2 -- types/default.nix | 1 - types/lvm_lv.nix | 76 -------------------------------------------- types/lvm_vg.nix | 55 ++++++++++++++++++++++++++++---- 6 files changed, 49 insertions(+), 93 deletions(-) delete mode 100644 types/lvm_lv.nix diff --git a/example/complex.nix b/example/complex.nix index ad57ef1..58e215b 100644 --- a/example/complex.nix +++ b/example/complex.nix @@ -105,7 +105,6 @@ type = "lvm_vg"; lvs = { root = { - type = "lvm_lv"; size = "10M"; lvm_type = "mirror"; content = { @@ -118,7 +117,6 @@ }; }; raid1 = { - type = "lvm_lv"; size = "30M"; lvm_type = "raid0"; content = { @@ -127,7 +125,6 @@ }; }; raid2 = { - type = "lvm_lv"; size = "30M"; lvm_type = "raid0"; content = { @@ -136,7 +133,6 @@ }; }; zfs1 = { - type = "lvm_lv"; size = "128M"; lvm_type = "raid0"; content = { @@ -145,7 +141,6 @@ }; }; zfs2 = { - type = "lvm_lv"; size = "128M"; lvm_type = "raid0"; content = { diff --git a/example/luks-lvm.nix b/example/luks-lvm.nix index e9a8b32..c6340d0 100644 --- a/example/luks-lvm.nix +++ b/example/luks-lvm.nix @@ -46,7 +46,6 @@ type = "lvm_vg"; lvs = { root = { - type = "lvm_lv"; size = "100M"; content = { type = "filesystem"; @@ -58,7 +57,6 @@ }; }; home = { - type = "lvm_lv"; size = "10M"; content = { type = "filesystem"; @@ -67,7 +65,6 @@ }; }; raw = { - type = "lvm_lv"; size = "10M"; }; }; diff --git a/example/lvm-raid.nix b/example/lvm-raid.nix index aa7490b..2c06d88 100644 --- a/example/lvm-raid.nix +++ b/example/lvm-raid.nix @@ -79,7 +79,6 @@ type = "lvm_vg"; lvs = { root = { - type = "lvm_lv"; size = "100M"; lvm_type = "mirror"; content = { @@ -92,7 +91,6 @@ }; }; home = { - type = "lvm_lv"; size = "10M"; lvm_type = "raid0"; content = { diff --git a/types/default.nix b/types/default.nix index 647eb1e..5f5eeec 100644 --- a/types/default.nix +++ b/types/default.nix @@ -345,7 +345,6 @@ rec { swap = ./swap.nix; lvm_pv = ./lvm_pv.nix; lvm_vg = ./lvm_vg.nix; - lvm_lv = ./lvm_lv.nix; zfs = ./zfs.nix; zpool = ./zpool.nix; zfs_dataset = ./zfs_dataset.nix; diff --git a/types/lvm_lv.nix b/types/lvm_lv.nix deleted file mode 100644 index d2df6fc..0000000 --- a/types/lvm_lv.nix +++ /dev/null @@ -1,76 +0,0 @@ -{ config, options, lib, diskoLib, ... }: -{ - options = { - name = lib.mkOption { - type = lib.types.str; - default = config._module.args.name; - description = "Name of the logical volume"; - }; - type = lib.mkOption { - type = lib.types.enum [ "lvm_lv" ]; - default = "lvm_lv"; - internal = true; - description = "Type"; - }; - size = lib.mkOption { - type = lib.types.str; # TODO lvm size type - description = "Size of the logical volume"; - }; - lvm_type = lib.mkOption { - type = lib.types.nullOr (lib.types.enum [ "mirror" "raid0" "raid1" ]); # TODO add all lib.types - default = null; # maybe there is always a default type? - description = "LVM type"; - }; - extraArgs = lib.mkOption { - type = lib.types.listOf lib.types.str; - default = [ ]; - description = "Extra arguments"; - }; - content = diskoLib.partitionType; - _meta = lib.mkOption { - internal = true; - readOnly = true; - type = lib.types.functionTo diskoLib.jsonType; - default = dev: - lib.optionalAttrs (config.content != null) (config.content._meta dev); - description = "Metadata"; - }; - _create = diskoLib.mkCreateOption { - inherit config options; - default = { vg }: '' - lvcreate \ - --yes \ - ${if lib.hasInfix "%" config.size then "-l" else "-L"} ${config.size} \ - -n ${config.name} \ - ${lib.optionalString (config.lvm_type != null) "--type=${config.lvm_type}"} \ - ${toString config.extraArgs} \ - ${vg} - ${lib.optionalString (config.content != null) (config.content._create {dev = "/dev/${vg}/${config.name}";})} - ''; - }; - _mount = diskoLib.mkMountOption { - inherit config options; - default = { vg }: - lib.optionalAttrs (config.content != null) (config.content._mount { dev = "/dev/${vg}/${config.name}"; }); - }; - _config = lib.mkOption { - internal = true; - readOnly = true; - default = vg: - [ - (lib.optional (config.content != null) (config.content._config "/dev/${vg}/${config.name}")) - (lib.optional (config.lvm_type != null) { - boot.initrd.kernelModules = [ "dm-${config.lvm_type}" ]; - }) - ]; - description = "NixOS configuration"; - }; - _pkgs = lib.mkOption { - internal = true; - readOnly = true; - type = lib.types.functionTo (lib.types.listOf lib.types.package); - default = pkgs: lib.optionals (config.content != null) (config.content._pkgs pkgs); - description = "Packages"; - }; - }; -} diff --git a/types/lvm_vg.nix b/types/lvm_vg.nix index 70845ff..a6b1cc3 100644 --- a/types/lvm_vg.nix +++ b/types/lvm_vg.nix @@ -12,7 +12,30 @@ description = "Type"; }; lvs = lib.mkOption { - type = lib.types.attrsOf subTypes.lvm_lv; + type = lib.types.attrsOf (lib.types.submodule ({ config, ... }: { + options = { + name = lib.mkOption { + type = lib.types.str; + default = config._module.args.name; + description = "Name of the logical volume"; + }; + size = lib.mkOption { + type = lib.types.str; # TODO lvm size type + description = "Size of the logical volume"; + }; + lvm_type = lib.mkOption { + type = lib.types.nullOr (lib.types.enum [ "mirror" "raid0" "raid1" ]); # TODO add all lib.types + default = null; # maybe there is always a default type? + description = "LVM type"; + }; + extraArgs = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + description = "Extra arguments"; + }; + content = diskoLib.partitionType; + }; + })); default = { }; description = "LVS for the volume group"; }; @@ -21,7 +44,9 @@ readOnly = true; type = diskoLib.jsonType; default = - diskoLib.deepMergeMap (lv: lv._meta [ "lvm_vg" config.name ]) (lib.attrValues config.lvs); + diskoLib.deepMergeMap (lv: + lib.optionalAttrs (lv.content != null) (lv.content._meta [ "lvm_vg" config.name ]) + ) (lib.attrValues config.lvs); description = "Metadata"; }; _create = diskoLib.mkCreateOption { @@ -30,14 +55,25 @@ readarray -t lvm_devices < <(cat "$disko_devices_dir"/lvm_${config.name}) vgcreate ${config.name} \ "''${lvm_devices[@]}" - ${lib.concatMapStrings (lv: lv._create {vg = config.name; }) (lib.attrValues config.lvs)} + ${lib.concatMapStrings (lv: '' + lvcreate \ + --yes \ + ${if lib.hasInfix "%" lv.size then "-l" else "-L"} ${lv.size} \ + -n ${lv.name} \ + ${lib.optionalString (lv.lvm_type != null) "--type=${lv.lvm_type}"} \ + ${toString lv.extraArgs} \ + ${config.name} + ${lib.optionalString (lv.content != null) (lv.content._create {dev = "/dev/${config.name}/${lv.name}";})} + '') (lib.attrValues config.lvs)} ''; }; _mount = diskoLib.mkMountOption { inherit config options; default = _: let - lvMounts = diskoLib.deepMergeMap (lv: lv._mount { vg = config.name; }) (lib.attrValues config.lvs); + lvMounts = diskoLib.deepMergeMap (lv: + lib.optionalAttrs (lv.content != null) (lv.content._mount { dev = "/dev/${config.name}/${lv.name}"; }) + ) (lib.attrValues config.lvs); in { dev = '' @@ -51,14 +87,21 @@ internal = true; readOnly = true; default = - map (lv: lv._config config.name) (lib.attrValues config.lvs); + map (lv: [ + (lib.optional (lv.content != null) (lv.content._config "/dev/${config.name}/${lv.name}")) + (lib.optional (lv.lvm_type != null) { + boot.initrd.kernelModules = [ "dm-${lv.lvm_type}" ]; + }) + ]) (lib.attrValues config.lvs); description = "NixOS configuration"; }; _pkgs = lib.mkOption { internal = true; readOnly = true; type = lib.types.functionTo (lib.types.listOf lib.types.package); - default = pkgs: lib.flatten (map (lv: lv._pkgs pkgs) (lib.attrValues config.lvs)); + default = pkgs: lib.flatten (map (lv: + lib.optional (lv.content != null) (lv.content._pkgs pkgs) + ) (lib.attrValues config.lvs)); description = "Packages"; }; };