Unverified Commit 9c5c04ca authored by Philip Taron's avatar Philip Taron Committed by GitHub
Browse files

nixos/services.ceph: remove `with lib;` (#339093)

parents 5222dcee 31c38324
Loading
Loading
Loading
Loading
+92 −95
Original line number Diff line number Diff line
{ 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;
    };
  };
}