diff --git a/nixos/modules/services/network-filesystems/ceph.nix b/nixos/modules/services/network-filesystems/ceph.nix index d375434a1bd4..5961731dbf44 100644 --- a/nixos/modules/services/network-filesystems/ceph.nix +++ b/nixos/modules/services/network-filesystems/ceph.nix @@ -1,16 +1,13 @@ { config, lib, pkgs, ... }: - -with lib; - let cfg = config.services.ceph; # function that translates "camelCaseOptions" to "camel case options", credits to tilpner in #nixos@freenode - expandCamelCase = replaceStrings upperChars (map (s: " ${s}") lowerChars); - expandCamelCaseAttrs = mapAttrs' (name: value: nameValuePair (expandCamelCase name) value); + expandCamelCase = lib.replaceStrings lib.upperChars (map (s: " ${s}") lib.lowerChars); + expandCamelCaseAttrs = lib.mapAttrs' (name: value: lib.nameValuePair (expandCamelCase name) value); makeServices = daemonType: daemonIds: - mkMerge (map (daemonId: + lib.mkMerge (map (daemonId: { "ceph-${daemonType}-${daemonId}" = makeService daemonType daemonId cfg.global.clusterName cfg.${daemonType}.package; }) daemonIds); @@ -18,8 +15,8 @@ let let stateDirectory = "ceph/${if daemonType == "rgw" then "radosgw" else daemonType}/${clusterName}-${daemonId}"; in { enable = true; - description = "Ceph ${builtins.replaceStrings lowerChars upperChars daemonType} daemon ${daemonId}"; - after = [ "network-online.target" "time-sync.target" ] ++ optional (daemonType == "osd") "ceph-mon.target"; + description = "Ceph ${builtins.replaceStrings lib.lowerChars lib.upperChars daemonType} daemon ${daemonId}"; + after = [ "network-online.target" "time-sync.target" ] ++ lib.optional (daemonType == "osd") "ceph-mon.target"; wants = [ "network-online.target" "time-sync.target" ]; partOf = [ "ceph-${daemonType}.target" ]; wantedBy = [ "ceph-${daemonType}.target" ]; @@ -47,11 +44,11 @@ let Group = if daemonType == "osd" then "disk" else "ceph"; ExecStart = ''${ceph.out}/bin/${if daemonType == "rgw" then "radosgw" else "ceph-${daemonType}"} \ -f --cluster ${clusterName} --id ${daemonId}''; - } // optionalAttrs (daemonType == "osd") { + } // lib.optionalAttrs (daemonType == "osd") { ExecStartPre = "${ceph.lib}/libexec/ceph/ceph-osd-prestart.sh --id ${daemonId} --cluster ${clusterName}"; RestartSec = "20s"; PrivateDevices = "no"; # osd needs disk access - } // optionalAttrs ( daemonType == "mon") { + } // lib.optionalAttrs ( daemonType == "mon") { RestartSec = "10"; }; }; @@ -71,11 +68,11 @@ in options.services.ceph = { # Ceph has a monolithic configuration file but different sections for # each daemon, a separate client section and a global section - enable = mkEnableOption "Ceph global configuration"; + enable = lib.mkEnableOption "Ceph global configuration"; global = { - fsid = mkOption { - type = types.str; + fsid = lib.mkOption { + type = lib.types.str; example = '' 433a2193-4f8a-47a0-95d2-209d7ca2cca5 ''; @@ -85,25 +82,25 @@ in ''; }; - clusterName = mkOption { - type = types.str; + clusterName = lib.mkOption { + type = lib.types.str; default = "ceph"; description = '' Name of cluster ''; }; - mgrModulePath = mkOption { - type = types.path; + mgrModulePath = lib.mkOption { + type = lib.types.path; default = "${pkgs.ceph.lib}/lib/ceph/mgr"; - defaultText = literalExpression ''"''${pkgs.ceph.lib}/lib/ceph/mgr"''; + defaultText = lib.literalExpression ''"''${pkgs.ceph.lib}/lib/ceph/mgr"''; description = '' Path at which to find ceph-mgr modules. ''; }; - monInitialMembers = mkOption { - type = with types; nullOr commas; + monInitialMembers = lib.mkOption { + type = with lib.types; nullOr commas; default = null; example = '' node0, node1, node2 @@ -113,8 +110,8 @@ in ''; }; - monHost = mkOption { - type = with types; nullOr commas; + monHost = lib.mkOption { + type = with lib.types; nullOr commas; default = null; example = '' 10.10.0.1, 10.10.0.2, 10.10.0.3 @@ -124,40 +121,40 @@ in ''; }; - maxOpenFiles = mkOption { - type = types.int; + maxOpenFiles = lib.mkOption { + type = lib.types.int; default = 131072; description = '' Max open files for each OSD daemon. ''; }; - authClusterRequired = mkOption { - type = types.enum [ "cephx" "none" ]; + authClusterRequired = lib.mkOption { + type = lib.types.enum [ "cephx" "none" ]; default = "cephx"; description = '' Enables requiring daemons to authenticate with eachother in the cluster. ''; }; - authServiceRequired = mkOption { - type = types.enum [ "cephx" "none" ]; + authServiceRequired = lib.mkOption { + type = lib.types.enum [ "cephx" "none" ]; default = "cephx"; description = '' Enables requiring clients to authenticate with the cluster to access services in the cluster (e.g. radosgw, mds or osd). ''; }; - authClientRequired = mkOption { - type = types.enum [ "cephx" "none" ]; + authClientRequired = lib.mkOption { + type = lib.types.enum [ "cephx" "none" ]; default = "cephx"; description = '' Enables requiring the cluster to authenticate itself to the client. ''; }; - publicNetwork = mkOption { - type = with types; nullOr commas; + publicNetwork = lib.mkOption { + type = with lib.types; nullOr commas; default = null; example = '' 10.20.0.0/24, 192.168.1.0/24 @@ -167,8 +164,8 @@ in ''; }; - clusterNetwork = mkOption { - type = with types; nullOr commas; + clusterNetwork = lib.mkOption { + type = with lib.types; nullOr commas; default = null; example = '' 10.10.0.0/24, 192.168.0.0/24 @@ -178,18 +175,18 @@ in ''; }; - rgwMimeTypesFile = mkOption { - type = with types; nullOr path; + rgwMimeTypesFile = lib.mkOption { + type = with lib.types; nullOr path; default = "${pkgs.mailcap}/etc/mime.types"; - defaultText = literalExpression ''"''${pkgs.mailcap}/etc/mime.types"''; + defaultText = lib.literalExpression ''"''${pkgs.mailcap}/etc/mime.types"''; description = '' Path to mime types used by radosgw. ''; }; }; - extraConfig = mkOption { - type = with types; attrsOf str; + extraConfig = lib.mkOption { + type = with lib.types; attrsOf str; default = {}; example = { "ms bind ipv6" = "true"; @@ -200,9 +197,9 @@ in }; mgr = { - enable = mkEnableOption "Ceph MGR daemon"; - daemons = mkOption { - type = with types; listOf str; + enable = lib.mkEnableOption "Ceph MGR daemon"; + daemons = lib.mkOption { + type = with lib.types; listOf str; default = []; example = [ "name1" "name2" ]; description = '' @@ -210,9 +207,9 @@ in to the id part in ceph i.e. [ "name1" ] would result in mgr.name1 ''; }; - package = mkPackageOption pkgs "ceph" { }; - extraConfig = mkOption { - type = with types; attrsOf str; + package = lib.mkPackageOption pkgs "ceph" { }; + extraConfig = lib.mkOption { + type = with lib.types; attrsOf str; default = {}; description = '' Extra configuration to add to the global section for manager daemons. @@ -221,9 +218,9 @@ in }; mon = { - enable = mkEnableOption "Ceph MON daemon"; - daemons = mkOption { - type = with types; listOf str; + enable = lib.mkEnableOption "Ceph MON daemon"; + daemons = lib.mkOption { + type = with lib.types; listOf str; default = []; example = [ "name1" "name2" ]; description = '' @@ -231,9 +228,9 @@ in to the id part in ceph i.e. [ "name1" ] would result in mon.name1 ''; }; - package = mkPackageOption pkgs "ceph" { }; - extraConfig = mkOption { - type = with types; attrsOf str; + package = lib.mkPackageOption pkgs "ceph" { }; + extraConfig = lib.mkOption { + type = with lib.types; attrsOf str; default = {}; description = '' Extra configuration to add to the monitor section. @@ -242,9 +239,9 @@ in }; osd = { - enable = mkEnableOption "Ceph OSD daemon"; - daemons = mkOption { - type = with types; listOf str; + enable = lib.mkEnableOption "Ceph OSD daemon"; + daemons = lib.mkOption { + type = with lib.types; listOf str; default = []; example = [ "name1" "name2" ]; description = '' @@ -252,9 +249,9 @@ in to the id part in ceph i.e. [ "name1" ] would result in osd.name1 ''; }; - package = mkPackageOption pkgs "ceph" { }; - extraConfig = mkOption { - type = with types; attrsOf str; + package = lib.mkPackageOption pkgs "ceph" { }; + extraConfig = lib.mkOption { + type = with lib.types; attrsOf str; default = { "osd journal size" = "10000"; "osd pool default size" = "3"; @@ -270,9 +267,9 @@ in }; mds = { - enable = mkEnableOption "Ceph MDS daemon"; - daemons = mkOption { - type = with types; listOf str; + enable = lib.mkEnableOption "Ceph MDS daemon"; + daemons = lib.mkOption { + type = with lib.types; listOf str; default = []; example = [ "name1" "name2" ]; description = '' @@ -280,9 +277,9 @@ in to the id part in ceph i.e. [ "name1" ] would result in mds.name1 ''; }; - package = mkPackageOption pkgs "ceph" { }; - extraConfig = mkOption { - type = with types; attrsOf str; + package = lib.mkPackageOption pkgs "ceph" { }; + extraConfig = lib.mkOption { + type = with lib.types; attrsOf str; default = {}; description = '' Extra configuration to add to the MDS section. @@ -291,10 +288,10 @@ in }; rgw = { - enable = mkEnableOption "Ceph RadosGW daemon"; - package = mkPackageOption pkgs "ceph" { }; - daemons = mkOption { - type = with types; listOf str; + enable = lib.mkEnableOption "Ceph RadosGW daemon"; + package = lib.mkPackageOption pkgs "ceph" { }; + daemons = lib.mkOption { + type = with lib.types; listOf str; default = []; example = [ "name1" "name2" ]; description = '' @@ -307,11 +304,11 @@ in }; client = { - enable = mkEnableOption "Ceph client configuration"; - extraConfig = mkOption { - type = with types; attrsOf (attrsOf str); + enable = lib.mkEnableOption "Ceph client configuration"; + extraConfig = lib.mkOption { + type = with lib.types; attrsOf (attrsOf str); default = {}; - example = literalExpression '' + example = lib.literalExpression '' { # This would create a section for a radosgw daemon named node0 and related # configuration for it @@ -326,7 +323,7 @@ in }; }; - config = mkIf config.services.ceph.enable { + config = lib.mkIf config.services.ceph.enable { assertions = [ { assertion = cfg.global.fsid != ""; message = "fsid has to be set to a valid uuid for the cluster to function"; @@ -345,22 +342,22 @@ in } ]; - warnings = optional (cfg.global.monInitialMembers == null) + warnings = lib.optional (cfg.global.monInitialMembers == null) "Not setting up a list of members in monInitialMembers requires that you set the host variable for each mon daemon or else the cluster won't function"; environment.etc."ceph/ceph.conf".text = let # Merge the extraConfig set for mgr daemons, as mgr don't have their own section - globalSection = expandCamelCaseAttrs (cfg.global // cfg.extraConfig // optionalAttrs cfg.mgr.enable cfg.mgr.extraConfig); + globalSection = expandCamelCaseAttrs (cfg.global // cfg.extraConfig // lib.optionalAttrs cfg.mgr.enable cfg.mgr.extraConfig); # Remove all name-value pairs with null values from the attribute set to avoid making empty sections in the ceph.conf - globalSection' = filterAttrs (name: value: value != null) globalSection; + globalSection' = lib.filterAttrs (name: value: value != null) globalSection; totalConfig = { global = globalSection'; - } // optionalAttrs (cfg.mon.enable && cfg.mon.extraConfig != {}) { mon = cfg.mon.extraConfig; } - // optionalAttrs (cfg.mds.enable && cfg.mds.extraConfig != {}) { mds = cfg.mds.extraConfig; } - // optionalAttrs (cfg.osd.enable && cfg.osd.extraConfig != {}) { osd = cfg.osd.extraConfig; } - // optionalAttrs (cfg.client.enable && cfg.client.extraConfig != {}) cfg.client.extraConfig; + } // lib.optionalAttrs (cfg.mon.enable && cfg.mon.extraConfig != {}) { mon = cfg.mon.extraConfig; } + // lib.optionalAttrs (cfg.mds.enable && cfg.mds.extraConfig != {}) { mds = cfg.mds.extraConfig; } + // lib.optionalAttrs (cfg.osd.enable && cfg.osd.extraConfig != {}) { osd = cfg.osd.extraConfig; } + // lib.optionalAttrs (cfg.client.enable && cfg.client.extraConfig != {}) cfg.client.extraConfig; in - generators.toINI {} totalConfig; + lib.generators.toINI {} totalConfig; users.users.ceph = { uid = config.ids.uids.ceph; @@ -375,13 +372,13 @@ in systemd.services = let services = [] - ++ optional cfg.mon.enable (makeServices "mon" cfg.mon.daemons) - ++ optional cfg.mds.enable (makeServices "mds" cfg.mds.daemons) - ++ optional cfg.osd.enable (makeServices "osd" cfg.osd.daemons) - ++ optional cfg.rgw.enable (makeServices "rgw" cfg.rgw.daemons) - ++ optional cfg.mgr.enable (makeServices "mgr" cfg.mgr.daemons); + ++ lib.optional cfg.mon.enable (makeServices "mon" cfg.mon.daemons) + ++ lib.optional cfg.mds.enable (makeServices "mds" cfg.mds.daemons) + ++ lib.optional cfg.osd.enable (makeServices "osd" cfg.osd.daemons) + ++ lib.optional cfg.rgw.enable (makeServices "rgw" cfg.rgw.daemons) + ++ lib.optional cfg.mgr.enable (makeServices "mgr" cfg.mgr.daemons); in - mkMerge services; + lib.mkMerge services; systemd.targets = let targets = [ @@ -390,13 +387,13 @@ in wantedBy = [ "multi-user.target" ]; unitConfig.StopWhenUnneeded = true; }; } ] - ++ optional cfg.mon.enable (makeTarget "mon") - ++ optional cfg.mds.enable (makeTarget "mds") - ++ optional cfg.osd.enable (makeTarget "osd") - ++ optional cfg.rgw.enable (makeTarget "rgw") - ++ optional cfg.mgr.enable (makeTarget "mgr"); + ++ lib.optional cfg.mon.enable (makeTarget "mon") + ++ lib.optional cfg.mds.enable (makeTarget "mds") + ++ lib.optional cfg.osd.enable (makeTarget "osd") + ++ lib.optional cfg.rgw.enable (makeTarget "rgw") + ++ lib.optional cfg.mgr.enable (makeTarget "mgr"); in - mkMerge targets; + lib.mkMerge targets; systemd.tmpfiles.settings."10-ceph" = let defaultConfig = { @@ -407,9 +404,9 @@ in "/etc/ceph".d = defaultConfig; "/run/ceph".d = defaultConfig // { mode = "0770"; }; "/var/lib/ceph".d = defaultConfig; - "/var/lib/ceph/mgr".d = mkIf (cfg.mgr.enable) defaultConfig; - "/var/lib/ceph/mon".d = mkIf (cfg.mon.enable) defaultConfig; - "/var/lib/ceph/osd".d = mkIf (cfg.osd.enable) defaultConfig; + "/var/lib/ceph/mgr".d = lib.mkIf (cfg.mgr.enable) defaultConfig; + "/var/lib/ceph/mon".d = lib.mkIf (cfg.mon.enable) defaultConfig; + "/var/lib/ceph/osd".d = lib.mkIf (cfg.osd.enable) defaultConfig; }; }; }