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)