mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Preinstall: Allow to extend default list (#96402)
This commit is contained in:
parent
4051df1f6c
commit
369d0a6aca
@ -1756,7 +1756,8 @@ hide_angular_deprecation =
|
||||
# Comma separated list of plugin ids for which environment variables should be forwarded. Used only when feature flag pluginsSkipHostEnvVars is enabled.
|
||||
forward_host_env_vars =
|
||||
# Comma separated list of plugin ids to install as part of the startup process.
|
||||
preinstall = grafana-lokiexplore-app
|
||||
# By default, the following plugins will be preinstalled: "grafana-lokiexplore-app"
|
||||
preinstall =
|
||||
# Controls whether preinstall plugins asynchronously (in the background) or synchronously (blocking). Useful when preinstalled plugins are used with provisioning.
|
||||
preinstall_async = true
|
||||
# Disables preinstall feature. It has the same effect as setting preinstall to an empty list.
|
||||
|
@ -26,6 +26,13 @@ func extractPluginSettings(sections []*ini.Section) PluginSettings {
|
||||
return psMap
|
||||
}
|
||||
|
||||
var (
|
||||
defaultPreinstallPlugins = map[string]InstallPlugin{
|
||||
// Default preinstalled plugins
|
||||
"grafana-lokiexplore-app": {"grafana-lokiexplore-app", ""},
|
||||
}
|
||||
)
|
||||
|
||||
func (cfg *Cfg) readPluginSettings(iniFile *ini.File) error {
|
||||
pluginsSection := iniFile.Section("plugins")
|
||||
|
||||
@ -42,15 +49,27 @@ func (cfg *Cfg) readPluginSettings(iniFile *ini.File) error {
|
||||
disablePreinstall := pluginsSection.Key("preinstall_disabled").MustBool(false)
|
||||
if !disablePreinstall {
|
||||
rawInstallPlugins := util.SplitString(pluginsSection.Key("preinstall").MustString(""))
|
||||
cfg.PreinstallPlugins = make([]InstallPlugin, len(rawInstallPlugins))
|
||||
for i, plugin := range rawInstallPlugins {
|
||||
preinstallPlugins := make(map[string]InstallPlugin)
|
||||
// Add the default preinstalled plugins
|
||||
for _, plugin := range defaultPreinstallPlugins {
|
||||
preinstallPlugins[plugin.ID] = plugin
|
||||
}
|
||||
// Add the plugins defined in the configuration
|
||||
for _, plugin := range rawInstallPlugins {
|
||||
parts := strings.Split(plugin, "@")
|
||||
id := parts[0]
|
||||
v := ""
|
||||
if len(parts) == 2 {
|
||||
v = parts[1]
|
||||
}
|
||||
cfg.PreinstallPlugins[i] = InstallPlugin{id, v}
|
||||
preinstallPlugins[id] = InstallPlugin{id, v}
|
||||
}
|
||||
// Remove from the list the plugins that have been disabled
|
||||
for _, disabledPlugin := range cfg.DisablePlugins {
|
||||
delete(preinstallPlugins, disabledPlugin)
|
||||
}
|
||||
for _, plugin := range preinstallPlugins {
|
||||
cfg.PreinstallPlugins = append(cfg.PreinstallPlugins, plugin)
|
||||
}
|
||||
cfg.PreinstallPluginsAsync = pluginsSection.Key("preinstall_async").MustBool(true)
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
@ -95,4 +96,89 @@ func Test_readPluginSettings(t *testing.T) {
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("when plugins.preinstall is defined", func(t *testing.T) {
|
||||
defaultPreinstallPluginsList := make([]InstallPlugin, 0, len(defaultPreinstallPlugins))
|
||||
defaultPreinstallPluginsIDs := []string{}
|
||||
for _, p := range defaultPreinstallPlugins {
|
||||
defaultPreinstallPluginsList = append(defaultPreinstallPluginsList, p)
|
||||
defaultPreinstallPluginsIDs = append(defaultPreinstallPluginsIDs, p.ID)
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
rawInput string
|
||||
disablePreinstall bool
|
||||
expected []InstallPlugin
|
||||
disableAsync bool
|
||||
disablePlugins string
|
||||
}{
|
||||
{
|
||||
name: "should add the default preinstalled plugin",
|
||||
rawInput: "",
|
||||
expected: defaultPreinstallPluginsList,
|
||||
},
|
||||
{
|
||||
name: "should add the default preinstalled plugin and the one defined",
|
||||
rawInput: "plugin1",
|
||||
expected: append(defaultPreinstallPluginsList, InstallPlugin{"plugin1", ""}),
|
||||
},
|
||||
{
|
||||
name: "should add the default preinstalled plugin and the one defined with version",
|
||||
rawInput: "plugin1@1.0.0",
|
||||
expected: append(defaultPreinstallPluginsList, InstallPlugin{"plugin1", "1.0.0"}),
|
||||
},
|
||||
{
|
||||
name: "it should remove the disabled plugin",
|
||||
rawInput: "plugin1",
|
||||
disablePlugins: "plugin1",
|
||||
expected: defaultPreinstallPluginsList,
|
||||
},
|
||||
{
|
||||
name: "it should remove default plugins",
|
||||
rawInput: "",
|
||||
disablePlugins: strings.Join(defaultPreinstallPluginsIDs, ","),
|
||||
expected: nil,
|
||||
},
|
||||
{
|
||||
name: "should ignore input when preinstall is disabled",
|
||||
rawInput: "plugin1",
|
||||
disablePreinstall: true,
|
||||
expected: nil,
|
||||
},
|
||||
{
|
||||
name: "should mark preinstall as sync",
|
||||
rawInput: "plugin1",
|
||||
disableAsync: true,
|
||||
expected: append(defaultPreinstallPluginsList, InstallPlugin{"plugin1", ""}),
|
||||
},
|
||||
}
|
||||
for _, tc := range tests {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
cfg := NewCfg()
|
||||
sec, err := cfg.Raw.NewSection("plugins")
|
||||
require.NoError(t, err)
|
||||
_, err = sec.NewKey("preinstall", tc.rawInput)
|
||||
require.NoError(t, err)
|
||||
if tc.disablePreinstall {
|
||||
_, err = sec.NewKey("preinstall_disabled", "true")
|
||||
require.NoError(t, err)
|
||||
}
|
||||
if tc.disableAsync {
|
||||
_, err = sec.NewKey("preinstall_async", "false")
|
||||
require.NoError(t, err)
|
||||
}
|
||||
if tc.disablePlugins != "" {
|
||||
_, err = sec.NewKey("disable_plugins", tc.disablePlugins)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
err = cfg.readPluginSettings(cfg.Raw)
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, cfg.PreinstallPlugins, tc.expected)
|
||||
if tc.disableAsync {
|
||||
require.Equal(t, cfg.PreinstallPluginsAsync, false)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user