diff --git a/modules/consul-service-registry/default.nix b/modules/consul-service-registry/default.nix index 35b725c..3103da6 100644 --- a/modules/consul-service-registry/default.nix +++ b/modules/consul-service-registry/default.nix @@ -1,4 +1,4 @@ -{ config, lib, ... }: +{ config, lib, pkgs, ... }: with lib; @@ -7,28 +7,51 @@ let consul = "${config.services.consul.package}/bin/consul"; - consulServiceDefinition = submodule ({ name, ... }: { - unit = mkOption { - description = "Which systemd service to attach to."; - default = name; - type = types.str; - }; - definition = mkOption { - description = "Consul service definition."; - type = types.attrs; + consulServiceDefinition = types.submodule ({ name, ... }: { + options = { + unit = mkOption { + description = "Which systemd service to attach to."; + default = name; + type = types.str; + }; + mode = mkOption { + description = "How to attach command executions to the service."; + type = types.enum [ "direct" "external" ]; + default = "direct"; + }; + definition = mkOption { + description = "Consul service definition."; + type = types.attrs; + }; }; }); attachToService = name: conf: let serviceJson = pkgs.writeText "consul-service-${name}.json" (builtins.toJSON conf.definition); in { - name = conf.unit; + name = { + direct = conf.unit; + external = "register-consul-svc-${conf.unit}"; + }.${conf.mode}; value = { - serviceConfig = { - ExecStartPost = "${consul} services register ${serviceJson}"; - ExecStopPre = "${consul} services deregister ${serviceJson}"; + direct = { + serviceConfig = { + ExecStartPost = "${consul} services register ${serviceJson}"; + ExecStopPre = "${consul} services deregister ${serviceJson}"; + }; }; - }; + external = { + after = [ "${conf.unit}.service" ]; + wantedBy = [ "${conf.unit}.service" ]; + unitConfig.BindsTo = "${conf.unit}.service"; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + ExecStart = "${consul} services register ${serviceJson}"; + ExecStop = "${consul} services deregister ${serviceJson}"; + }; + }; + }.${conf.mode}; }; in