modules/consul-service-registry: implement manual registration
This commit is contained in:
parent
1aebeef6a2
commit
1ca0e7f454
1 changed files with 29 additions and 6 deletions
|
@ -21,7 +21,9 @@ let
|
||||||
|
|
||||||
deregister = servicesJson: "${consulDeregisterScript} ${servicesJson}";
|
deregister = servicesJson: "${consulDeregisterScript} ${servicesJson}";
|
||||||
|
|
||||||
consulServiceDefinition = types.submodule ({ name, ... }: {
|
writeServicesJson = name: services: pkgs.writeText "consul-services-${name}.json" (builtins.toJSON { inherit services; });
|
||||||
|
|
||||||
|
consulServiceDefinition = types.submodule ({ config, name, ... }: {
|
||||||
options = {
|
options = {
|
||||||
unit = mkOption {
|
unit = mkOption {
|
||||||
description = "Which systemd service to attach to.";
|
description = "Which systemd service to attach to.";
|
||||||
|
@ -30,19 +32,37 @@ let
|
||||||
};
|
};
|
||||||
mode = mkOption {
|
mode = mkOption {
|
||||||
description = "How to attach command executions to the service.";
|
description = "How to attach command executions to the service.";
|
||||||
type = types.enum [ "direct" "external" ];
|
type = types.enum [ "direct" "external" "manual" ];
|
||||||
default = "direct";
|
default = "direct";
|
||||||
};
|
};
|
||||||
definition = mkOption {
|
definition = mkOption {
|
||||||
description = "Consul service definition.";
|
description = "Consul service definition.";
|
||||||
type = types.attrs;
|
type = types.attrs;
|
||||||
};
|
};
|
||||||
|
commands = {
|
||||||
|
register = mkOption {
|
||||||
|
description = "Command used to register this service.";
|
||||||
|
type = types.str;
|
||||||
|
readOnly = true;
|
||||||
|
};
|
||||||
|
deregister = mkOption {
|
||||||
|
description = "Command used to deregister this service.";
|
||||||
|
type = types.str;
|
||||||
|
readOnly = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config.commands = let
|
||||||
|
servicesJson = writeServicesJson name [ config.definition ];
|
||||||
|
in {
|
||||||
|
register = register servicesJson;
|
||||||
|
deregister = deregister servicesJson;
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
attachToService = unit: servicesRaw: let
|
attachToService = unit: servicesRaw: let
|
||||||
services = map (getAttr "definition") servicesRaw;
|
services = map (getAttr "definition") servicesRaw;
|
||||||
servicesJson = pkgs.writeText "consul-services-${unit}.json" (builtins.toJSON { inherit services; });
|
servicesJson = writeServicesJson unit services;
|
||||||
mode = if any (x: x.mode == "external") servicesRaw then "external" else "direct";
|
mode = if any (x: x.mode == "external") servicesRaw then "external" else "direct";
|
||||||
in {
|
in {
|
||||||
name = {
|
name = {
|
||||||
|
@ -81,8 +101,11 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = lib.mkIf (cfg.services != {}) {
|
config = lib.mkIf (cfg.services != {}) (let
|
||||||
systemd.services = mapAttrs' attachToService (groupBy (getAttr "unit") (attrValues cfg.services));
|
servicesRaw = filter (x: x.mode != "manual") (attrValues cfg.services);
|
||||||
|
in {
|
||||||
|
systemd.services = mapAttrs' attachToService (groupBy (getAttr "unit") servicesRaw);
|
||||||
|
|
||||||
warnings = optional (!config.services.consul.enable) "Consul service registrations found, but Consul agent is not enabled on this machine.";
|
warnings = optional (!config.services.consul.enable) "Consul service registrations found, but Consul agent is not enabled on this machine.";
|
||||||
};
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue