main
nix 57 lines 1.45 KB
Raw
1 # Ordering Services
2 #
3 # Given a set of services, make them run one at a time in a specific
4 # order, on a timer.
5 { }:
6 {
7 # Given a list of systemd service, give each one an After
8 # attribute, so they start in a specific order. The returned
9 # list can be converted in to a systemd.services attrset with
10 # `lib.listToAttrs`.
11 #
12 # Example:
13 #
14 # mkOrderedChain [
15 # { name = "foo"; value = { script = "true"; }; }
16 # { name = "bar"; value = { script = "true"; }; }
17 # ]
18 #
19 # => [
20 # {
21 # name = "foo";
22 # value = {
23 # script = "true";
24 # unitConfig = { After = []; };
25 # };
26 # }
27 # {
28 # name = "bar";
29 # value = {
30 # script = "true";
31 # unitConfig = { After = [ "bar" ]; };
32 # };
33 # }
34 #
35 mkOrderedChain =
36 jobs:
37 let
38 unitConfigFrom = job: job.unitConfig or { };
39 afterFrom = job: (unitConfigFrom job).After or [ ];
40 previousFrom = collector: if collector ? previous then [ collector.previous ] else [ ];
41
42 ordered = builtins.foldl' (collector: item: {
43 services = collector.services ++ [
44 {
45 inherit (item) name;
46 value = item.value // {
47 unitConfig = (unitConfigFrom item.value) // {
48 After = (afterFrom item.value) ++ (previousFrom collector);
49 };
50 };
51 }
52 ];
53 previous = "${item.name}.service";
54 }) { services = [ ]; } jobs;
55 in
56 ordered.services;
57 }