nixos/grafana: add support for declarative plugin installation

Changed files
+21 -2
nixos
modules
services
monitoring
tests
+8 -1
nixos/modules/services/monitoring/grafana.nix
···
let
cfg = config.services.grafana;
opt = options.services.grafana;
+
declarativePlugins = pkgs.linkFarm "grafana-plugins" (builtins.map (pkg: { name = pkg.pname; path = pkg; }) cfg.declarativePlugins);
envOptions = {
PATHS_DATA = cfg.dataDir;
-
PATHS_PLUGINS = "${cfg.dataDir}/plugins";
+
PATHS_PLUGINS = if builtins.isNull cfg.declarativePlugins then "${cfg.dataDir}/plugins" else declarativePlugins;
PATHS_LOGS = "${cfg.dataDir}/log";
SERVER_PROTOCOL = cfg.protocol;
···
default = pkgs.grafana;
defaultText = "pkgs.grafana";
type = types.package;
+
};
+
declarativePlugins = mkOption {
+
type = with types; nullOr (listOf path);
+
default = null;
+
description = "If non-null, then a list of packages containing Grafana plugins to install. If set, plugins cannot be manually installed.";
+
example = literalExample "with pkgs.grafanaPlugins; [ grafana-piechart-panel ]";
};
dataDir = mkOption {
+13 -1
nixos/tests/grafana.nix
···
};
extraNodeConfs = {
+
declarativePlugins = {
+
services.grafana.declarativePlugins = [ pkgs.grafanaPlugins.grafana-clock-panel ];
+
};
+
postgresql = {
services.grafana.database = {
host = "127.0.0.1:5432";
···
nameValuePair dbName (mkMerge [
baseGrafanaConf
(extraNodeConfs.${dbName} or {})
-
])) [ "sqlite" "postgresql" "mysql" ]);
+
])) [ "sqlite" "declarativePlugins" "postgresql" "mysql" ]);
in {
name = "grafana";
···
testScript = ''
start_all()
+
+
with subtest("Declarative plugins installed"):
+
declarativePlugins.wait_for_unit("grafana.service")
+
declarativePlugins.wait_for_open_port(3000)
+
declarativePlugins.succeed(
+
"curl -sSfN -u testadmin:snakeoilpwd http://127.0.0.1:3000/api/plugins | grep -q grafana-clock-panel"
+
)
+
declarativePlugins.shutdown()
with subtest("Successful API query as admin user with sqlite db"):
sqlite.wait_for_unit("grafana.service")