grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / misc / lifecycled.nix
blobc58b4f7525f534660b2184a1b7b3526b9bcc8e8b
1 { config, pkgs, lib, ... }:
2 let
3   cfg = config.services.lifecycled;
5   # TODO: Add the ability to extend this with an rfc 42-like interface.
6   # In the meantime, one can modify the environment (as
7   # long as it's not overriding anything from here) with
8   # systemd.services.lifecycled.serviceConfig.Environment
9   configFile = pkgs.writeText "lifecycled" ''
10     LIFECYCLED_HANDLER=${cfg.handler}
11     ${lib.optionalString (cfg.cloudwatchGroup != null) "LIFECYCLED_CLOUDWATCH_GROUP=${cfg.cloudwatchGroup}"}
12     ${lib.optionalString (cfg.cloudwatchStream != null) "LIFECYCLED_CLOUDWATCH_STREAM=${cfg.cloudwatchStream}"}
13     ${lib.optionalString cfg.debug "LIFECYCLED_DEBUG=${lib.boolToString cfg.debug}"}
14     ${lib.optionalString (cfg.instanceId != null) "LIFECYCLED_INSTANCE_ID=${cfg.instanceId}"}
15     ${lib.optionalString cfg.json "LIFECYCLED_JSON=${lib.boolToString cfg.json}"}
16     ${lib.optionalString cfg.noSpot "LIFECYCLED_NO_SPOT=${lib.boolToString cfg.noSpot}"}
17     ${lib.optionalString (cfg.snsTopic != null) "LIFECYCLED_SNS_TOPIC=${cfg.snsTopic}"}
18     ${lib.optionalString (cfg.awsRegion != null) "AWS_REGION=${cfg.awsRegion}"}
19   '';
22   meta.maintainers = with lib.maintainers; [ cole-h grahamc ];
24   options = {
25     services.lifecycled = {
26       enable = lib.mkEnableOption "lifecycled, a daemon for responding to AWS AutoScaling Lifecycle Hooks";
28       queueCleaner = {
29         enable = lib.mkEnableOption "lifecycled-queue-cleaner";
31         frequency = lib.mkOption {
32           type = lib.types.str;
33           default = "hourly";
34           description = ''
35             How often to trigger the queue cleaner.
37             NOTE: This string should be a valid value for a systemd
38             timer's `OnCalendar` configuration. See
39             {manpage}`systemd.timer(5)`
40             for more information.
41           '';
42         };
44         parallel = lib.mkOption {
45           type = lib.types.ints.unsigned;
46           default = 20;
47           description = ''
48             The number of parallel deletes to run.
49           '';
50         };
51       };
53       instanceId = lib.mkOption {
54         type = lib.types.nullOr lib.types.str;
55         default = null;
56         description = ''
57           The instance ID to listen for events for.
58         '';
59       };
61       snsTopic = lib.mkOption {
62         type = lib.types.nullOr lib.types.str;
63         default = null;
64         description = ''
65           The SNS topic that receives events.
66         '';
67       };
69       noSpot = lib.mkOption {
70         type = lib.types.bool;
71         default = false;
72         description = ''
73           Disable the spot termination listener.
74         '';
75       };
77       handler = lib.mkOption {
78         type = lib.types.path;
79         description = ''
80           The script to invoke to handle events.
81         '';
82       };
84       json = lib.mkOption {
85         type = lib.types.bool;
86         default = false;
87         description = ''
88           Enable JSON logging.
89         '';
90       };
92       cloudwatchGroup = lib.mkOption {
93         type = lib.types.nullOr lib.types.str;
94         default = null;
95         description = ''
96           Write logs to a specific Cloudwatch Logs group.
97         '';
98       };
100       cloudwatchStream = lib.mkOption {
101         type = lib.types.nullOr lib.types.str;
102         default = null;
103         description = ''
104           Write logs to a specific Cloudwatch Logs stream. Defaults to the instance ID.
105         '';
106       };
108       debug = lib.mkOption {
109         type = lib.types.bool;
110         default = false;
111         description = ''
112           Enable debugging information.
113         '';
114       };
116       # XXX: Can be removed if / when
117       # https://github.com/buildkite/lifecycled/pull/91 is merged.
118       awsRegion = lib.mkOption {
119         type = lib.types.nullOr lib.types.str;
120         default = null;
121         description = ''
122           The region used for accessing AWS services.
123         '';
124       };
125     };
126   };
128   ### Implementation ###
130   config = lib.mkMerge [
131     (lib.mkIf cfg.enable {
132       environment.etc."lifecycled".source = configFile;
134       systemd.packages = [ pkgs.lifecycled ];
135       systemd.services.lifecycled = {
136         wantedBy = [ "network-online.target" ];
137         restartTriggers = [ configFile ];
138       };
139     })
141     (lib.mkIf cfg.queueCleaner.enable {
142       systemd.services.lifecycled-queue-cleaner = {
143         description = "Lifecycle Daemon Queue Cleaner";
144         environment = lib.optionalAttrs (cfg.awsRegion != null) { AWS_REGION = cfg.awsRegion; };
145         serviceConfig = {
146           Type = "oneshot";
147           ExecStart = "${pkgs.lifecycled}/bin/lifecycled-queue-cleaner -parallel ${toString cfg.queueCleaner.parallel}";
148         };
149       };
151       systemd.timers.lifecycled-queue-cleaner = {
152         description = "Lifecycle Daemon Queue Cleaner Timer";
153         wantedBy = [ "timers.target" ];
154         after = [ "network-online.target" ];
155         timerConfig = {
156           Unit = "lifecycled-queue-cleaner.service";
157           OnCalendar = "${cfg.queueCleaner.frequency}";
158         };
159       };
160     })
161   ];