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