Plugins: Add preinstall_sync config - allow plugins to be preinstalled synchronously (#105292)

* feat: preinstall_sync config - process and installation logic

* ref: add preinstall_sync list to preinstalled plugins of frontendsettings

* fix: conf blank line for sections

* ref: remove plugins async flag, and rename PreinstallPlugins

* docs: default installed plugin list
This commit is contained in:
Syerikjan Kh
2025-05-16 10:45:50 -04:00
committed by GitHub
parent 7e038b67a5
commit b38662e985
12 changed files with 200 additions and 84 deletions
+84 -4
View File
@@ -97,6 +97,56 @@ func Test_readPluginSettings(t *testing.T) {
}
})
t.Run("when plugins.preinstall_sync is defined", func(t *testing.T) {
tests := []struct {
name string
rawInput string
expected []InstallPlugin
disablePlugins string
disablePreinstall bool
}{
{
name: "should add the plugin to the sync list - not contain default plugins like async list",
rawInput: "plugin1",
expected: []InstallPlugin{
{ID: "plugin1", Version: "", URL: ""},
},
},
{
name: "it should remove the disabled plugin",
rawInput: "plugin1,plugin2",
disablePlugins: "plugin1",
expected: []InstallPlugin{{ID: "plugin2"}},
},
{
name: "should not process at all when preinstall is disabled",
rawInput: "plugin1",
disablePreinstall: true,
expected: nil,
},
}
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_sync", tc.rawInput)
require.NoError(t, err)
if tc.disablePreinstall {
_, err = sec.NewKey("preinstall_disabled", "true")
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.PreinstallPluginsSync, tc.expected)
})
}
})
t.Run("when plugins.preinstall is defined", func(t *testing.T) {
defaultPreinstallPluginsList := make([]InstallPlugin, 0, len(defaultPreinstallPlugins))
defaultPreinstallPluginsIDs := []string{}
@@ -107,8 +157,10 @@ func Test_readPluginSettings(t *testing.T) {
tests := []struct {
name string
rawInput string
rawInputSync string
disablePreinstall bool
expected []InstallPlugin
expectedSync []InstallPlugin
disableAsync bool
disablePlugins string
}{
@@ -149,7 +201,8 @@ func Test_readPluginSettings(t *testing.T) {
name: "should mark preinstall as sync",
rawInput: "plugin1",
disableAsync: true,
expected: append(defaultPreinstallPluginsList, InstallPlugin{"plugin1", "", ""}),
expected: nil,
expectedSync: append(defaultPreinstallPluginsList, InstallPlugin{"plugin1", "", ""}),
},
{
name: "should parse a plugin with version and URL",
@@ -161,6 +214,29 @@ func Test_readPluginSettings(t *testing.T) {
rawInput: "plugin1@@https://example.com/plugin1.tar.gz",
expected: append(defaultPreinstallPluginsList, InstallPlugin{"plugin1", "", "https://example.com/plugin1.tar.gz"}),
},
{
name: "when preinstall_async is false, should add all plugins to preinstall_sync",
rawInput: "plugin1",
rawInputSync: "plugin2",
disableAsync: true,
expected: nil,
expectedSync: append(defaultPreinstallPluginsList, InstallPlugin{"plugin1", "", ""}, InstallPlugin{"plugin2", "", ""}),
},
{
name: "should overwrite default when user pins a version",
rawInput: "grafana-pyroscope-app@4.0.0",
expected: func() []InstallPlugin {
var plugins []InstallPlugin
for _, p := range defaultPreinstallPlugins {
if p.ID == "grafana-pyroscope-app" {
plugins = append(plugins, InstallPlugin{"grafana-pyroscope-app", "4.0.0", ""})
} else {
plugins = append(plugins, p)
}
}
return plugins
}(),
},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
@@ -169,6 +245,10 @@ func Test_readPluginSettings(t *testing.T) {
require.NoError(t, err)
_, err = sec.NewKey("preinstall", tc.rawInput)
require.NoError(t, err)
if tc.rawInputSync != "" {
_, err = sec.NewKey("preinstall_sync", tc.rawInputSync)
require.NoError(t, err)
}
if tc.disablePreinstall {
_, err = sec.NewKey("preinstall_disabled", "true")
require.NoError(t, err)
@@ -184,9 +264,9 @@ func Test_readPluginSettings(t *testing.T) {
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)
assert.ElementsMatch(t, cfg.PreinstallPluginsAsync, tc.expected)
if tc.expectedSync != nil {
assert.ElementsMatch(t, cfg.PreinstallPluginsSync, tc.expectedSync)
}
})
}