Unverified Commit 5cd24446 authored by Gaétan Lepage's avatar Gaétan Lepage Committed by GitHub
Browse files

nixosModules.MooseFS: Format (#367327)

parents 83e902bb 10f63829
Loading
Loading
Loading
Loading
+191 −134
Original line number Diff line number Diff line
{ config, lib, pkgs, ... }:
{
  config,
  lib,
  pkgs,
  ...
}:
let
  cfg = config.services.moosefs;

  mfsUser = if cfg.runAsUser then "moosefs" else "root";

  settingsFormat = let
  settingsFormat =
    let
      listSep = " ";
    allowedTypes = with lib.types; [ bool int float str ];
    valueToString = val:
        if lib.isList val then lib.concatStringsSep listSep (map (x: valueToString x) val)
        else if lib.isBool val then (if val then "1" else "0")
        else toString val;

    in {
      type = with lib.types; let
        valueType = oneOf ([
      allowedTypes = with lib.types; [
        bool
        int
        float
        str
      ];
      valueToString =
        val:
        if lib.isList val then
          lib.concatStringsSep listSep (map (x: valueToString x) val)
        else if lib.isBool val then
          (if val then "1" else "0")
        else
          toString val;

    in
    {
      type =
        with lib.types;
        let
          valueType =
            oneOf (
              [
                (listOf valueType)
        ] ++ allowedTypes) // {
              ]
              ++ allowedTypes
            )
            // {
              description = "Flat key-value file";
            };
      in attrsOf valueType;
        in
        attrsOf valueType;

      generate = name: value:
        pkgs.writeText name ( lib.concatStringsSep "\n" (
          lib.mapAttrsToList (key: val: "${key} = ${valueToString val}") value ));
      generate =
        name: value:
        pkgs.writeText name (
          lib.concatStringsSep "\n" (lib.mapAttrsToList (key: val: "${key} = ${valueToString val}") value)
        );
    };

  # Manual initialization tool
@@ -44,7 +70,10 @@ let
  systemdService = name: extraConfig: configFile: {
    wantedBy = [ "multi-user.target" ];
    wants = [ "network-online.target" ];
    after = [ "network.target" "network-online.target" ];
    after = [
      "network.target"
      "network-online.target"
    ];

    serviceConfig = {
      Type = "forking";
@@ -55,7 +84,8 @@ let
    } // extraConfig;
  };

in {
in
{
  ###### interface
  options = {
    services.moosefs = {
@@ -150,7 +180,10 @@ in {
          type = with lib.types; listOf str;
          default = null;
          description = "Mount points used by chunkserver for data storage (see mfshdd.cfg).";
          example = [ "/mnt/hdd1" "/mnt/hdd2" ];
          example = [
            "/mnt/hdd1"
            "/mnt/hdd2"
          ];
        };

        settings = lib.mkOption {
@@ -205,20 +238,32 @@ in {
  };

  ###### implementation
  config = lib.mkIf (cfg.client.enable || cfg.master.enable || cfg.metalogger.enable || cfg.chunkserver.enable || cfg.cgiserver.enable) {
  config =
    lib.mkIf
      (
        cfg.client.enable
        || cfg.master.enable
        || cfg.metalogger.enable
        || cfg.chunkserver.enable
        || cfg.cgiserver.enable
      )
      {
        warnings = [ (lib.mkIf (!cfg.runAsUser) "Running MooseFS services as root is not recommended.") ];

        services.moosefs = {
      master.settings = lib.mkIf cfg.master.enable (lib.mkMerge [
          master.settings = lib.mkIf cfg.master.enable (
            lib.mkMerge [
              {
                WORKING_USER = mfsUser;
          EXPORTS_FILENAME = toString ( pkgs.writeText "mfsexports.cfg"
            (lib.concatStringsSep "\n" cfg.master.exports));
                EXPORTS_FILENAME = toString (
                  pkgs.writeText "mfsexports.cfg" (lib.concatStringsSep "\n" cfg.master.exports)
                );
              }
              (lib.mkIf cfg.cgiserver.enable {
                MFSCGISERV = toString cfg.cgiserver.settings.PORT;
              })
      ]);
            ]
          );

          metalogger.settings = lib.mkIf cfg.metalogger.enable {
            WORKING_USER = mfsUser;
@@ -228,12 +273,19 @@ in {
          chunkserver.settings = lib.mkIf cfg.chunkserver.enable {
            WORKING_USER = mfsUser;
            MASTER_HOST = cfg.masterHost;
        HDD_CONF_FILENAME = toString ( pkgs.writeText "mfshdd.cfg"
          (lib.concatStringsSep "\n" cfg.chunkserver.hdds));
            HDD_CONF_FILENAME = toString (
              pkgs.writeText "mfshdd.cfg" (lib.concatStringsSep "\n" cfg.chunkserver.hdds)
            );
          };
        };

    users = lib.mkIf ( cfg.runAsUser && ( cfg.master.enable || cfg.metalogger.enable || cfg.chunkserver.enable || cfg.cgiserver.enable ) ) {
        users =
          lib.mkIf
            (
              cfg.runAsUser
              && (cfg.master.enable || cfg.metalogger.enable || cfg.chunkserver.enable || cfg.cgiserver.enable)
            )
            {
              users.moosefs = {
                isSystemUser = true;
                description = "MooseFS daemon user";
@@ -243,33 +295,37 @@ in {
            };

        environment.systemPackages =
      (lib.optional cfg.client.enable pkgs.moosefs) ++
      (lib.optional cfg.master.enable initTool);
          (lib.optional cfg.client.enable pkgs.moosefs) ++ (lib.optional cfg.master.enable initTool);

        networking.firewall.allowedTCPPorts = lib.mkMerge [
      (lib.optionals cfg.master.openFirewall [ 9419 9420 9421 ])
          (lib.optionals cfg.master.openFirewall [
            9419
            9420
            9421
          ])
          (lib.optional cfg.chunkserver.openFirewall 9422)
          (lib.optional (cfg.cgiserver.enable && cfg.cgiserver.openFirewall) cfg.cgiserver.settings.PORT)
        ];

    systemd.tmpfiles.rules = [
        systemd.tmpfiles.rules =
          [
            # Master directories
      (lib.optionalString cfg.master.enable
        "d ${cfg.master.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -")
            (lib.optionalString cfg.master.enable "d ${cfg.master.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -")

            # Metalogger directories
      (lib.optionalString cfg.metalogger.enable
        "d ${cfg.metalogger.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -")
            (lib.optionalString cfg.metalogger.enable "d ${cfg.metalogger.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -")

            # Chunkserver directories
      (lib.optionalString cfg.chunkserver.enable
        "d ${cfg.chunkserver.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -")
    ] ++ lib.optionals (cfg.chunkserver.enable && cfg.chunkserver.hdds != null)
        (map (dir: "d ${dir} 0755 ${mfsUser} ${mfsUser} -") cfg.chunkserver.hdds);
            (lib.optionalString cfg.chunkserver.enable "d ${cfg.chunkserver.settings.DATA_PATH} 0700 ${mfsUser} ${mfsUser} -")
          ]
          ++ lib.optionals (cfg.chunkserver.enable && cfg.chunkserver.hdds != null) (
            map (dir: "d ${dir} 0755 ${mfsUser} ${mfsUser} -") cfg.chunkserver.hdds
          );

        systemd.services = lib.mkMerge [
          (lib.mkIf cfg.master.enable {
        mfs-master = (lib.mkMerge [
            mfs-master = (
              lib.mkMerge [
                (systemdService "master" {
                  TimeoutStartSec = 1800;
                  TimeoutStopSec = 1800;
@@ -279,7 +335,8 @@ in {
                {
                  preStart = lib.mkIf cfg.master.autoInit "${initTool}/bin/mfsmaster-init";
                }
        ]);
              ]
            );
          })

          (lib.mkIf cfg.metalogger.enable {