1{ lib, pkgs, ... }:
2{
3 name = "karma";
4 nodes = {
5 server =
6 { ... }:
7 {
8 services.prometheus.alertmanager = {
9 enable = true;
10 logLevel = "debug";
11 port = 9093;
12 openFirewall = true;
13 configuration = {
14 global = {
15 resolve_timeout = "1m";
16 };
17 route = {
18 # Root route node
19 receiver = "test";
20 group_by = [ "..." ];
21 continue = false;
22 group_wait = "1s";
23 group_interval = "15s";
24 repeat_interval = "24h";
25 };
26 receivers = [
27 {
28 name = "test";
29 webhook_configs = [
30 {
31 url = "http://localhost:1234";
32 send_resolved = true;
33 max_alerts = 0;
34 }
35 ];
36 }
37 ];
38 };
39 };
40 services.karma = {
41 enable = true;
42 openFirewall = true;
43 settings = {
44 listen = {
45 address = "0.0.0.0";
46 port = 8081;
47 };
48 alertmanager = {
49 servers = [
50 {
51 name = "alertmanager";
52 uri = "https://127.0.0.1:9093";
53 }
54 ];
55 };
56 karma.name = "test-dashboard";
57 log.config = true;
58 log.requests = true;
59 log.timestamp = true;
60 };
61 };
62 };
63 };
64
65 testScript = ''
66 start_all()
67
68 with subtest("Wait for server to come up"):
69
70 server.wait_for_unit("alertmanager.service")
71 server.wait_for_unit("karma.service")
72
73 server.sleep(5) # wait for both services to settle
74
75 server.wait_for_open_port(9093)
76 server.wait_for_open_port(8081)
77
78 with subtest("Test alertmanager readiness"):
79 server.succeed("curl -s http://127.0.0.1:9093/-/ready")
80
81 # Karma only starts serving the dashboard once it has established connectivity to all alertmanagers in its config
82 # Therefore, this will fail if karma isn't able to reach alertmanager
83 server.succeed("curl -s http://127.0.0.1:8081")
84
85 server.shutdown()
86 '';
87}