feat(#3405): declarative grafana plugins for the swarm dashboard
Plugin management is server-admin scoped, and on an SSO hive nobody holds that role: auto_assign_org_role grants an org role, and the built-in local admin that does hold server admin cannot log in because the login form is disabled whenever SSO is configured. Two individually-correct decisions leaving no path to the plugin UI at all. Declarative is the way through rather than a workaround for it -- plugins land in the store and in git, survive a rebuild and a state reset, and the container needs no runtime egress to grafana.com. mkIf rather than passing the list through: upstream's default is null, while an empty list is a real value pointing the plugin path at an empty store dir, so a hive that sets nothing must keep seeing null.
This commit is contained in:
parent
346a6b1b4c
commit
bfe921c254
1 changed files with 43 additions and 0 deletions
|
|
@ -174,6 +174,30 @@ in
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
plugins = lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.package;
|
||||||
|
default = [ ];
|
||||||
|
example = lib.literalExpression "[ pkgs.grafanaPlugins.grafana-piechart-panel ]";
|
||||||
|
description = ''
|
||||||
|
Grafana plugins to install, as packages. Declarative rather than
|
||||||
|
installed through the UI, which is the only shape that works here:
|
||||||
|
plugin management is **server-admin** scoped, and on an SSO hive
|
||||||
|
nobody holds that role — `users.auto_assign_org_role` grants an
|
||||||
|
*org* role, and the built-in local admin that does hold server
|
||||||
|
admin cannot log in because the login form is disabled whenever
|
||||||
|
SSO is configured.
|
||||||
|
|
||||||
|
That is a deliberate pair of decisions rather than an oversight,
|
||||||
|
and this option is the way through it: plugins live in the store
|
||||||
|
and in git, so they survive a container rebuild and a state reset,
|
||||||
|
and the container needs no runtime egress to grafana.com.
|
||||||
|
|
||||||
|
Empty by default, which leaves grafana's own plugin handling
|
||||||
|
untouched. Setting it takes over the plugin directory entirely —
|
||||||
|
anything installed by other means stops being visible.
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = lib.mkIf (hyperhiveCfg.enable && cfg.enable) {
|
config = lib.mkIf (hyperhiveCfg.enable && cfg.enable) {
|
||||||
|
|
@ -437,6 +461,25 @@ in
|
||||||
enable = true;
|
enable = true;
|
||||||
package = cfg.package;
|
package = cfg.package;
|
||||||
|
|
||||||
|
# Passed through unconditionally, empty default included.
|
||||||
|
# Upstream distinguishes `null` from `[ ]`, and both differences
|
||||||
|
# favour always handing it a list:
|
||||||
|
#
|
||||||
|
# - `null` points the plugin path at grafana's mutable
|
||||||
|
# `<dataDir>/plugins`; any list points it at a store path.
|
||||||
|
# Switching on the day someone adds their first plugin would
|
||||||
|
# bury that change inside an unrelated one.
|
||||||
|
# - upstream defaults its plugin update-check to
|
||||||
|
# `declarativePlugins == null`, so a list also stops the
|
||||||
|
# container phoning grafana.com. That is the no-runtime-egress
|
||||||
|
# property this option exists for — it should not arrive only
|
||||||
|
# once a plugin happens to be listed.
|
||||||
|
#
|
||||||
|
# Nothing is taken over by claiming the directory on a hive with no
|
||||||
|
# plugins: manual installation is already impossible here (see the
|
||||||
|
# option's description), so there is nothing in it to lose.
|
||||||
|
declarativePlugins = cfg.plugins;
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
server = {
|
server = {
|
||||||
# Already upstream's default (measured), but pinned rather
|
# Already upstream's default (measured), but pinned rather
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue