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.target" ];
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.maintainers = [ ];
98
99 inherit nodes;
100
101 testScript = ''
102 start_all()
103
104 with subtest("Declarative plugins installed"):
105 declarativePlugins.wait_for_unit("grafana.service")
106 declarativePlugins.wait_for_open_port(3000, addr="::1")
107 declarativePlugins.succeed(
108 "curl -sSfN -u testadmin:snakeoilpwd http://[::1]:3000/api/plugins | grep grafana-clock-panel"
109 )
110 declarativePlugins.shutdown()
111
112 with subtest("Successful API query as admin user with sqlite db"):
113 sqlite.wait_for_unit("grafana.service")
114 sqlite.wait_for_open_port(3000)
115 print(sqlite.succeed(
116 "curl -sSfN -u testadmin:snakeoilpwd http://[::1]:3000/api/org/users -i"
117 ))
118 sqlite.succeed(
119 "curl -sSfN -u testadmin:snakeoilpwd http://[::1]:3000/api/org/users | grep admin\@localhost"
120 )
121 sqlite.shutdown()
122
123 with subtest("Successful API query as admin user with sqlite db listening on socket"):
124 socket.wait_for_unit("grafana.service")
125 socket.wait_for_open_port(80)
126 print(socket.succeed(
127 "curl -sSfN -u testadmin:snakeoilpwd http://[::1]/api/org/users -i"
128 ))
129 socket.succeed(
130 "curl -sSfN -u testadmin:snakeoilpwd http://[::1]/api/org/users | grep admin\@localhost"
131 )
132 socket.shutdown()
133
134 with subtest("Successful API query as admin user with postgresql db"):
135 postgresql.wait_for_unit("grafana.service")
136 postgresql.wait_for_unit("postgresql.target")
137 postgresql.wait_for_open_port(3000)
138 postgresql.wait_for_open_port(5432)
139 postgresql.succeed(
140 "curl -sSfN -u testadmin:snakeoilpwd http://[::1]:3000/api/org/users | grep admin\@localhost"
141 )
142 postgresql.shutdown()
143
144 with subtest("Successful API query as admin user with mysql db"):
145 mysql.wait_for_unit("grafana.service")
146 mysql.wait_for_unit("mysql.service")
147 mysql.wait_for_open_port(3000)
148 mysql.wait_for_open_port(3306)
149 mysql.succeed(
150 "curl -sSfN -u testadmin:snakeoilpwd http://[::1]:3000/api/org/users | grep admin\@localhost"
151 )
152 mysql.shutdown()
153 '';
154 }
155)