{ lib, config, ... }: let longhornVolumeOpts = { name, ... }: { options = { storage = lib.mkOption { type = lib.types.str; }; }; }; in { options = { lab.longhornVolumes = lib.mkOption { type = with lib.types; attrsOf (submodule longhornVolumeOpts); default = { }; }; }; config = { kubernetes.resources = { persistentVolumes = builtins.mapAttrs (name: longhornVolume: { spec = { accessModes = [ "ReadWriteOnce" ]; capacity.storage = longhornVolume.storage; persistentVolumeReclaimPolicy = "Delete"; volumeMode = "Filesystem"; claimRef = { inherit name; namespace = "default"; }; csi = { driver = "driver.longhorn.io"; fsType = "ext4"; volumeHandle = name; volumeAttributes = { dataLocality = "disabled"; fromBackup = ""; fsType = "ext4"; numberOfReplicas = "2"; staleReplicaTimeout = "30"; unmapMarkSnapChainRemoved = "ignored"; recurringJobSelector = lib.generators.toYAML { } [{ name = "backup-nfs"; isGroup = false; }]; }; }; }; }) config.lab.longhornVolumes; persistentVolumeClaims = builtins.mapAttrs (name: longhornVolume: { spec = { accessModes = [ "ReadWriteOnce" ]; resources.requests.storage = longhornVolume.storage; storageClassName = ""; }; }) config.lab.longhornVolumes; }; }; }