nixos/openafs: Extend CellServDB options
Previously, servers could only be supplied for ThisCell. This meant that if a server and client have different ThisCell values, the client's CellServDB couldn't be configured for its own server. The previous list values are still accepted, but now a CellServDB option can also be specified as an attrset of cell names to servers.
This commit is contained in:
@@ -26,9 +26,7 @@ let
|
||||
sha256 = "1wmjn6mmyy2r8p10nlbdzs4nrqxy8a9pjyrdciy5nmppg4053rk2";
|
||||
};
|
||||
|
||||
clientServDB = pkgs.writeText "client-cellServDB-${cfg.cellName}" (
|
||||
mkCellServDB cfg.cellName cfg.cellServDB
|
||||
);
|
||||
clientServDB = pkgs.writeText "client-cellServDB-${cfg.cellName}" (mkCellServDB cfg.cellServDB);
|
||||
|
||||
afsConfig = pkgs.runCommand "afsconfig" { preferLocalBuild = true; } ''
|
||||
mkdir -p $out
|
||||
@@ -65,27 +63,25 @@ in
|
||||
};
|
||||
|
||||
cellServDB = mkOption {
|
||||
default = [ ];
|
||||
type =
|
||||
with types;
|
||||
listOf (submodule {
|
||||
options = cellServDBConfig;
|
||||
});
|
||||
default = { };
|
||||
type = cellServDBType cfg.cellName;
|
||||
description = ''
|
||||
This cell's database server records, added to the global
|
||||
CellServDB. See {manpage}`CellServDB(5)` man page for syntax. Ignored when
|
||||
`afsdb` is set to `true`.
|
||||
'';
|
||||
example = [
|
||||
{
|
||||
ip = "1.2.3.4";
|
||||
dnsname = "first.afsdb.server.dns.fqdn.org";
|
||||
}
|
||||
{
|
||||
ip = "2.3.4.5";
|
||||
dnsname = "second.afsdb.server.dns.fqdn.org";
|
||||
}
|
||||
];
|
||||
example = {
|
||||
"dns.fqdn.org" = [
|
||||
{
|
||||
ip = "1.2.3.4";
|
||||
dnsname = "first.afsdb.server.dns.fqdn.org";
|
||||
}
|
||||
{
|
||||
ip = "2.3.4.5";
|
||||
dnsname = "second.afsdb.server.dns.fqdn.org";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
cache = {
|
||||
|
||||
@@ -3,15 +3,32 @@
|
||||
let
|
||||
inherit (lib)
|
||||
concatStringsSep
|
||||
concatMapAttrsStringSep
|
||||
mkOption
|
||||
types
|
||||
optionalString
|
||||
;
|
||||
|
||||
cellServDBMemberType = types.submodule {
|
||||
options = {
|
||||
ip = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "1.2.3.4";
|
||||
description = "IP Address of a database server";
|
||||
};
|
||||
dnsname = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "afs.example.org";
|
||||
description = "DNS full-qualified domain name of a database server";
|
||||
};
|
||||
};
|
||||
};
|
||||
cellServDBCellType = types.listOf cellServDBMemberType;
|
||||
in
|
||||
{
|
||||
|
||||
mkCellServDB =
|
||||
mkCellServDB = concatMapAttrsStringSep "" (
|
||||
cellName: db:
|
||||
''
|
||||
>${cellName}
|
||||
@@ -19,23 +36,15 @@ in
|
||||
+ (concatStringsSep "\n" (
|
||||
map (dbm: optionalString (dbm.ip != "" && dbm.dnsname != "") "${dbm.ip} #${dbm.dnsname}") db
|
||||
))
|
||||
+ "\n";
|
||||
+ "\n"
|
||||
);
|
||||
|
||||
# CellServDB configuration type
|
||||
cellServDBConfig = {
|
||||
ip = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "1.2.3.4";
|
||||
description = "IP Address of a database server";
|
||||
};
|
||||
dnsname = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "afs.example.org";
|
||||
description = "DNS full-qualified domain name of a database server";
|
||||
};
|
||||
};
|
||||
cellServDBType =
|
||||
thisCell:
|
||||
types.coercedTo (types.listOf types.anything) (m: { "${thisCell}" = m; }) (
|
||||
types.attrsOf cellServDBCellType
|
||||
);
|
||||
|
||||
openafsMod = config.services.openafsClient.packages.module;
|
||||
openafsBin = config.services.openafsClient.packages.programs;
|
||||
|
||||
@@ -67,10 +67,10 @@ let
|
||||
null;
|
||||
|
||||
buCellServDB = pkgs.writeText "backup-cellServDB-${cfg.cellName}" (
|
||||
mkCellServDB cfg.cellName cfg.roles.backup.cellServDB
|
||||
mkCellServDB cfg.roles.backup.cellServDB
|
||||
);
|
||||
|
||||
useBuCellServDB = (cfg.roles.backup.cellServDB != [ ]) && (!cfg.roles.backup.enableFabs);
|
||||
useBuCellServDB = (cfg.roles.backup.cellServDB != { }) && (!cfg.roles.backup.enableFabs);
|
||||
|
||||
cfg = config.services.openafsServer;
|
||||
|
||||
@@ -128,9 +128,22 @@ in
|
||||
};
|
||||
|
||||
cellServDB = mkOption {
|
||||
default = [ ];
|
||||
type = with types; listOf (submodule [ { options = cellServDBConfig; } ]);
|
||||
description = "Definition of all cell-local database server machines.";
|
||||
default = { };
|
||||
type = cellServDBType cfg.cellName;
|
||||
description = ''
|
||||
Definition of all cell-local database server machines. If a single
|
||||
list is provided, it will be used as the servers for `cellName`.
|
||||
'';
|
||||
example = [
|
||||
{
|
||||
ip = "1.2.3.4";
|
||||
dnsname = "first.afsdb.server.dns.fqdn.org";
|
||||
}
|
||||
{
|
||||
ip = "2.3.4.5";
|
||||
dnsname = "second.afsdb.server.dns.fqdn.org";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
package = mkPackageOption pkgs "openafs" { };
|
||||
@@ -226,8 +239,8 @@ in
|
||||
};
|
||||
|
||||
cellServDB = mkOption {
|
||||
default = [ ];
|
||||
type = with types; listOf (submodule [ { options = cellServDBConfig; } ]);
|
||||
default = { };
|
||||
type = cellServDBType cfg.cellName;
|
||||
description = ''
|
||||
Definition of all cell-local backup database server machines.
|
||||
Use this when your cell uses less backup database servers than
|
||||
@@ -288,9 +301,19 @@ in
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
|
||||
warnings =
|
||||
lib.optional ((builtins.attrNames cfg.cellServDB) != [ cfg.cellName ]) ''
|
||||
config.services.openafsServer.cellServDB should normally only contain servers for one cell. It currently contains servers for ${builtins.toString (builtins.attrNames cfg.cellServDB)}.
|
||||
''
|
||||
++
|
||||
lib.optional (useBuCellServDB && (builtins.attrNames cfg.backup.cellServDB) != [ cfg.cellName ])
|
||||
''
|
||||
config.services.openafsServer.backup.cellServDB should normally only contain servers for one cell. It currently contains servers for ${builtins.toString (builtins.attrNames cfg.cellServDB)}.
|
||||
'';
|
||||
|
||||
assertions = [
|
||||
{
|
||||
assertion = cfg.cellServDB != [ ];
|
||||
assertion = cfg.cellServDB != { } && (cfg.cellServDB."${cfg.cellName}" or [ ]) != [ ];
|
||||
message = "You must specify all cell-local database servers in config.services.openafsServer.cellServDB.";
|
||||
}
|
||||
{
|
||||
@@ -308,7 +331,7 @@ in
|
||||
mode = "0644";
|
||||
};
|
||||
cellServDB = {
|
||||
text = mkCellServDB cfg.cellName cfg.cellServDB;
|
||||
text = mkCellServDB cfg.cellServDB;
|
||||
target = "openafs/server/CellServDB";
|
||||
mode = "0644";
|
||||
};
|
||||
@@ -319,8 +342,9 @@ in
|
||||
};
|
||||
buCellServDB = {
|
||||
enable = useBuCellServDB;
|
||||
text = mkCellServDB cfg.cellName cfg.roles.backup.cellServDB;
|
||||
text = mkCellServDB cfg.roles.backup.cellServDB;
|
||||
target = "openafs/backup/CellServDB";
|
||||
mode = "0644";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -336,7 +360,6 @@ in
|
||||
preStart = ''
|
||||
mkdir -m 0755 -p /var/openafs
|
||||
${optionalString (netInfo != null) "cp ${netInfo} /var/openafs/netInfo"}
|
||||
${optionalString useBuCellServDB "cp ${buCellServDB}"}
|
||||
'';
|
||||
serviceConfig = {
|
||||
ExecStart = "${openafsBin}/bin/bosserver -nofork";
|
||||
|
||||
Reference in New Issue
Block a user