1import ../make-test-python.nix ({ lib, pkgs, ... }:
2
3let
4 inherit (lib) mkMerge nameValuePair maintainers;
5
6 baseGrafanaConf = {
7 services.grafana = {
8 enable = true;
9 settings = {
10 analytics.reporting_enabled = false;
11
12 server = {
13 http_addr = "localhost";
14 domain = "localhost";
15 };
16
17 security = {
18 admin_user = "testadmin";
19 admin_password = "snakeoilpwd";
20 };
21 };
22 };
23 };
24
25 extraNodeConfs = {
26 sqlite = {};
27
28 socket = { config, ... }: {
29 services.grafana.settings.server = {
30 protocol = "socket";
31 socket = "/run/grafana/sock";
32 socket_gid = config.users.groups.nginx.gid;
33 };
34
35 users.users.grafana.extraGroups = [ "nginx" ];
36
37 services.nginx = {
38 enable = true;
39 recommendedProxySettings = true;
40 virtualHosts."_".locations."/".proxyPass = "http://unix:/run/grafana/sock";
41 };
42 };
43
44 declarativePlugins = {
45 services.grafana.declarativePlugins = [ pkgs.grafanaPlugins.grafana-clock-panel ];
46 };
47
48 postgresql = {
49 services.grafana.settings.database = {
50 host = "127.0.0.1:5432";
51 user = "grafana";
52 };
53 services.postgresql = {
54 enable = true;
55 ensureDatabases = [ "grafana" ];
56 ensureUsers = [{
57 name = "grafana";
58 ensureDBOwnership = true;
59 }];
60 };
61 systemd.services.grafana.after = [ "postgresql.service" ];
62 };
63
64 mysql = {
65 services.grafana.settings.database.user = "grafana";
66 services.mysql = {
67 enable = true;
68 ensureDatabases = [ "grafana" ];
69 ensureUsers = [{
70 name = "grafana";
71 ensurePermissions."grafana.*" = "ALL PRIVILEGES";
72 }];
73 package = pkgs.mariadb;
74 };
75 systemd.services.grafana.after = [ "mysql.service" ];
76 };
77 };
78
79 nodes = builtins.mapAttrs (_: val: mkMerge [ val baseGrafanaConf ]) extraNodeConfs;
80in {
81 name = "grafana-basic";
82
83 meta = with maintainers; {
84 maintainers = [ willibutz ];
85 };
86
87 inherit nodes;
88
89 testScript = ''
90 start_all()
91
92 with subtest("Declarative plugins installed"):
93 declarativePlugins.wait_for_unit("grafana.service")
94 declarativePlugins.wait_for_open_port(3000)
95 declarativePlugins.succeed(
96 "curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1:3000/api/plugins | grep grafana-clock-panel"
97 )
98 declarativePlugins.shutdown()
99
100 with subtest("Successful API query as admin user with sqlite db"):
101 sqlite.wait_for_unit("grafana.service")
102 sqlite.wait_for_open_port(3000)
103 print(sqlite.succeed(
104 "curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1:3000/api/org/users -i"
105 ))
106 sqlite.succeed(
107 "curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1:3000/api/org/users | grep admin\@localhost"
108 )
109 sqlite.shutdown()
110
111 with subtest("Successful API query as admin user with sqlite db listening on socket"):
112 socket.wait_for_unit("grafana.service")
113 socket.wait_for_open_port(80)
114 print(socket.succeed(
115 "curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1/api/org/users -i"
116 ))
117 socket.succeed(
118 "curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1/api/org/users | grep admin\@localhost"
119 )
120 socket.shutdown()
121
122 with subtest("Successful API query as admin user with postgresql db"):
123 postgresql.wait_for_unit("grafana.service")
124 postgresql.wait_for_unit("postgresql.service")
125 postgresql.wait_for_open_port(3000)
126 postgresql.wait_for_open_port(5432)
127 postgresql.succeed(
128 "curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1:3000/api/org/users | grep admin\@localhost"
129 )
130 postgresql.shutdown()
131
132 with subtest("Successful API query as admin user with mysql db"):
133 mysql.wait_for_unit("grafana.service")
134 mysql.wait_for_unit("mysql.service")
135 mysql.wait_for_open_port(3000)
136 mysql.wait_for_open_port(3306)
137 mysql.succeed(
138 "curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1:3000/api/org/users | grep admin\@localhost"
139 )
140 mysql.shutdown()
141 '';
142})