grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / network-filesystems / orangefs / server.nix
blobc198d47645592b7b15984590483e0924d5ef8f5a
1 { config, lib, pkgs, ...} :
2 let
3   cfg = config.services.orangefs.server;
5   aliases = lib.mapAttrsToList (alias: url: alias) cfg.servers;
7   # Maximum handle number is 2^63
8   maxHandle = 9223372036854775806;
10   # One range of handles for each meta/data instance
11   handleStep = maxHandle / (lib.length aliases) / 2;
13   fileSystems = lib.mapAttrsToList (name: fs: ''
14     <FileSystem>
15       Name ${name}
16       ID ${toString fs.id}
17       RootHandle ${toString fs.rootHandle}
19       ${fs.extraConfig}
21       <MetaHandleRanges>
22       ${lib.concatStringsSep "\n" (
23           lib.imap0 (i: alias:
24             let
25               begin = i * handleStep + 3;
26               end = begin + handleStep - 1;
27             in "Range ${alias} ${toString begin}-${toString end}") aliases
28        )}
29       </MetaHandleRanges>
31       <DataHandleRanges>
32       ${lib.concatStringsSep "\n" (
33           lib.imap0 (i: alias:
34             let
35               begin = i * handleStep + 3 + (lib.length aliases) * handleStep;
36               end = begin + handleStep - 1;
37             in "Range ${alias} ${toString begin}-${toString end}") aliases
38        )}
39       </DataHandleRanges>
41       <StorageHints>
42       TroveSyncMeta ${if fs.troveSyncMeta then "yes" else "no"}
43       TroveSyncData ${if fs.troveSyncData then "yes" else "no"}
44       ${fs.extraStorageHints}
45       </StorageHints>
47     </FileSystem>
48   '') cfg.fileSystems;
50   configFile = ''
51     <Defaults>
52     LogType ${cfg.logType}
53     DataStorageSpace ${cfg.dataStorageSpace}
54     MetaDataStorageSpace ${cfg.metadataStorageSpace}
56     BMIModules ${lib.concatStringsSep "," cfg.BMIModules}
57     ${cfg.extraDefaults}
58     </Defaults>
60     ${cfg.extraConfig}
62     <Aliases>
63     ${lib.concatStringsSep "\n" (lib.mapAttrsToList (alias: url: "Alias ${alias} ${url}") cfg.servers)}
64     </Aliases>
66     ${lib.concatStringsSep "\n" fileSystems}
67   '';
69 in {
70   ###### interface
72   options = {
73     services.orangefs.server = {
74       enable = lib.mkEnableOption "OrangeFS server";
76       logType = lib.mkOption {
77         type = with lib.types; enum [ "file" "syslog" ];
78         default = "syslog";
79         description = "Destination for log messages.";
80       };
82       dataStorageSpace = lib.mkOption {
83         type = lib.types.nullOr lib.types.str;
84         default = null;
85         example = "/data/storage";
86         description = "Directory for data storage.";
87       };
89       metadataStorageSpace = lib.mkOption {
90         type = lib.types.nullOr lib.types.str;
91         default = null;
92         example = "/data/meta";
93         description = "Directory for meta data storage.";
94       };
96       BMIModules = lib.mkOption {
97         type = with lib.types; listOf str;
98         default = [ "bmi_tcp" ];
99         example = [ "bmi_tcp" "bmi_ib"];
100         description = "List of BMI modules to load.";
101       };
103       extraDefaults = lib.mkOption {
104         type = lib.types.lines;
105         default = "";
106         description = "Extra config for `<Defaults>` section.";
107       };
109       extraConfig = lib.mkOption {
110         type = lib.types.lines;
111         default = "";
112         description = "Extra config for the global section.";
113       };
115       servers = lib.mkOption {
116         type = with lib.types; attrsOf lib.types.str;
117         default = {};
118         example = {
119           node1 = "tcp://node1:3334";
120           node2 = "tcp://node2:3334";
121         };
122         description = "URLs for storage server including port. The attribute names define the server alias.";
123       };
125       fileSystems = lib.mkOption {
126         description = ''
127           These options will create the `<FileSystem>` sections of config file.
128         '';
129         default = { orangefs = {}; };
130         example = lib.literalExpression ''
131           {
132             fs1 = {
133               id = 101;
134             };
136             fs2 = {
137               id = 102;
138             };
139           }
140         '';
141         type = with lib.types; attrsOf (submodule ({ ... } : {
142           options = {
143             id = lib.mkOption {
144               type = lib.types.int;
145               default = 1;
146               description = "File system ID (must be unique within configuration).";
147             };
149             rootHandle = lib.mkOption {
150               type = lib.types.int;
151               default = 3;
152               description = "File system root ID.";
153             };
155             extraConfig = lib.mkOption {
156               type = lib.types.lines;
157               default = "";
158               description = "Extra config for `<FileSystem>` section.";
159             };
161             troveSyncMeta = lib.mkOption {
162               type = lib.types.bool;
163               default = true;
164               description = "Sync meta data.";
165             };
167             troveSyncData = lib.mkOption {
168               type = lib.types.bool;
169               default = false;
170               description = "Sync data.";
171             };
173             extraStorageHints = lib.mkOption {
174               type = lib.types.lines;
175               default = "";
176               description = "Extra config for `<StorageHints>` section.";
177             };
178           };
179         }));
180       };
181     };
182   };
184   ###### implementation
186   config = lib.mkIf cfg.enable {
187     environment.systemPackages = [ pkgs.orangefs ];
189     # orangefs daemon will run as user
190     users.users.orangefs = {
191       isSystemUser = true;
192       group = "orangefs";
193     };
194     users.groups.orangefs = {};
196     # To format the file system the config file is needed.
197     environment.etc."orangefs/server.conf" = {
198       text = configFile;
199       user = "orangefs";
200       group = "orangefs";
201     };
203     systemd.services.orangefs-server = {
204       wantedBy = [ "multi-user.target" ];
205       requires = [ "network-online.target" ];
206       after = [ "network-online.target" ];
208       serviceConfig = {
209         # Run as "simple" in foreground mode.
210         # This is more reliable
211         ExecStart = ''
212           ${pkgs.orangefs}/bin/pvfs2-server -d \
213             /etc/orangefs/server.conf
214         '';
215         TimeoutStopSec = "120";
216         User = "orangefs";
217         Group = "orangefs";
218       };
219     };
220   };