/
tracer-service.nix
114 lines (100 loc) · 3.05 KB
/
tracer-service.nix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
{ pkgs
, runJq
## The backend is an attrset of AWS/supervisord-specific methods and parameters.
, backend
, profile
}:
with pkgs.lib;
let
# We're reusing configuration from a cluster node.
nodes = profile.node-services;
##
## nodeSpecsTracerConfig :: Map NodeId NodeSpec -> TracerConfig
##
nodeSpecsTracerConfig =
nodeSpecs:
let
in
backend.services-config.finaliseTracerService
{
## In both the local and remote scenarios, it's most frequently convenient to act as an acceptor.
acceptingSocket = "tracer.socket";
networkMagic = profile.value.genesis.network_magic;
## logRoot = ## ..really depends on context -- available in backend.services-config.finaliseTracerService
dsmPassthrough = {
# rtsOpts = ["-xc"];
};
};
## Given an env config, evaluate it and produce the service.
##
## tracerConfigServiceConfig :: TracerConfig -> NixosServiceConfig
##
tracerConfigServiceConfig =
tracerConfig:
let
systemdCompat.options = {
systemd.services = mkOption {};
systemd.sockets = mkOption {};
users = mkOption {};
assertions = mkOption {};
};
eval = let
extra = {
services.cardano-tracer = {
enable = true;
} // tracerConfig;
};
in evalModules {
prefix = [];
modules = import ../../nixos/module-list.nix ++ [
(import ../../nixos/cardano-tracer-service.nix pkgs)
systemdCompat extra
];
args = { inherit pkgs; };
};
in eval.config.services.cardano-tracer;
##
## generator-service :: (TracerConfig, NixosServiceConfig, Config, StartScript)
##
tracer-service =
(nodeSpecs:
let
tracerConfig = nodeSpecsTracerConfig nodeSpecs;
nixosServiceConfig = tracerConfigServiceConfig tracerConfig;
nixosServiceConfigFns = ["configJSONfn"];
execConfig = nixosServiceConfig.configJSONfn nixosServiceConfig;
in {
tracer-config = {
value = tracerConfig;
JSON = runJq "tracer-config.json"
''--null-input --sort-keys
--argjson x '${__toJSON tracerConfig}'
'' "$x";
};
nixos-service-config = {
## XXX: service == appallingly bad name -- it's bona-fide NixOS service "config", not a service!
value = nixosServiceConfig;
JSON = runJq "nixos-service-config.json"
''--null-input --sort-keys
--argjson x '${__toJSON (removeAttrs nixosServiceConfig nixosServiceConfigFns)}'
'' "$x";
};
config = rec {
value = execConfig;
JSON = runJq "config.json"
''--null-input
--argjson x '${__toJSON execConfig}'
'' "$x";
};
startupScript =
pkgs.writeScript "startup-tracer.sh"
''
#!${pkgs.stdenv.shell}
${nixosServiceConfig.script}
'';
})
profile.node-specs.value;
in
{
inherit tracer-service;
}