feat: map GF_INSTALL_PLUGINS to use preinstall plugins feature (#105145)

* feat: map GF_INSTALL_PLUGINS to use preinstall plugins feature

* ref: process GF_INSTALL_PLUGINS as sync install

* fix: check GF_INSTALL_PLUGINS_FORCE in the docker run

* ref: use preinstall_sync for GF_INSTALL_PLUGINS

* ref: logs and deprecation msg for GF_INSTALL_PLUGINS

* chore: deprecated log formatting
This commit is contained in:
Syerikjan Kh
2025-05-22 08:23:33 -04:00
committed by GitHub
parent 267e3ffb7c
commit e05ccb822a
5 changed files with 225 additions and 21 deletions

View File

@ -172,12 +172,12 @@ func Test_readPluginSettings(t *testing.T) {
{
name: "should add the default preinstalled plugin and the one defined",
rawInput: "plugin1",
expected: append(defaultPreinstallPluginsList, InstallPlugin{"plugin1", "", ""}),
expected: append(defaultPreinstallPluginsList, InstallPlugin{ID: "plugin1", Version: "", URL: ""}),
},
{
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", ""}),
expected: append(defaultPreinstallPluginsList, InstallPlugin{ID: "plugin1", Version: "1.0.0", URL: ""}),
},
{
name: "it should remove the disabled plugin",
@ -207,12 +207,12 @@ func Test_readPluginSettings(t *testing.T) {
{
name: "should parse a plugin with version and URL",
rawInput: "plugin1@1.0.1@https://example.com/plugin1.tar.gz",
expected: append(defaultPreinstallPluginsList, InstallPlugin{"plugin1", "1.0.1", "https://example.com/plugin1.tar.gz"}),
expected: append(defaultPreinstallPluginsList, InstallPlugin{ID: "plugin1", Version: "1.0.1", URL: "https://example.com/plugin1.tar.gz"}),
},
{
name: "should parse a plugin with URL",
rawInput: "plugin1@@https://example.com/plugin1.tar.gz",
expected: append(defaultPreinstallPluginsList, InstallPlugin{"plugin1", "", "https://example.com/plugin1.tar.gz"}),
expected: append(defaultPreinstallPluginsList, InstallPlugin{ID: "plugin1", Version: "", URL: "https://example.com/plugin1.tar.gz"}),
},
{
name: "when preinstall_async is false, should add all plugins to preinstall_sync",
@ -272,3 +272,140 @@ func Test_readPluginSettings(t *testing.T) {
}
})
}
func Test_migrateInstallPluginsToPreinstallPluginsSync(t *testing.T) {
tests := []struct {
name string
installPluginsVal string
installPluginsForce string
preinstallPlugins map[string]InstallPlugin
expectedPlugins map[string]InstallPlugin
}{
{
name: "should return empty map when GF_INSTALL_PLUGINS is not set",
installPluginsVal: "",
preinstallPlugins: map[string]InstallPlugin{},
expectedPlugins: map[string]InstallPlugin{},
},
{
name: "should parse URL with folder format",
installPluginsVal: "https://grafana.com/grafana/plugins/grafana-piechart-panel/;grafana-piechart-panel",
preinstallPlugins: map[string]InstallPlugin{},
expectedPlugins: map[string]InstallPlugin{
"grafana-piechart-panel": {
ID: "grafana-piechart-panel",
Version: "",
URL: "https://grafana.com/grafana/plugins/grafana-piechart-panel/",
},
},
},
{
name: "should parse mixed formats",
installPluginsVal: "https://github.com/VolkovLabs/business-links/releases/download/v1.2.1/volkovlabs-links-panel-1.2.1.zip;volkovlabs-links-panel,marcusolsson-static-datasource,volkovlabs-variable-panel",
preinstallPlugins: map[string]InstallPlugin{},
expectedPlugins: map[string]InstallPlugin{
"volkovlabs-links-panel": {
ID: "volkovlabs-links-panel",
Version: "",
URL: "https://github.com/VolkovLabs/business-links/releases/download/v1.2.1/volkovlabs-links-panel-1.2.1.zip",
},
"marcusolsson-static-datasource": {
ID: "marcusolsson-static-datasource",
Version: "",
URL: "",
},
"volkovlabs-variable-panel": {
ID: "volkovlabs-variable-panel",
Version: "",
URL: "",
},
},
},
{
name: "should parse ID with version format",
installPluginsVal: "volkovlabs-links-panel 1.2.1,marcusolsson-static-datasource 1.0.0,volkovlabs-variable-panel",
preinstallPlugins: map[string]InstallPlugin{},
expectedPlugins: map[string]InstallPlugin{
"volkovlabs-links-panel": {
ID: "volkovlabs-links-panel",
Version: "1.2.1",
URL: "",
},
"marcusolsson-static-datasource": {
ID: "marcusolsson-static-datasource",
Version: "1.0.0",
URL: "",
},
"volkovlabs-variable-panel": {
ID: "volkovlabs-variable-panel",
Version: "",
URL: "",
},
},
},
{
name: "should return empty map when GF_INSTALL_PLUGINS_FORCE is true",
installPluginsVal: "grafana-piechart-panel",
installPluginsForce: "true",
preinstallPlugins: map[string]InstallPlugin{},
expectedPlugins: map[string]InstallPlugin{},
},
{
name: "should skip plugins that are already configured",
installPluginsVal: "plugin1 1.0.0,plugin2,plugin3",
preinstallPlugins: map[string]InstallPlugin{
"plugin1": {ID: "plugin1", Version: "1.0.1"},
"plugin3": {ID: "plugin3"},
},
expectedPlugins: map[string]InstallPlugin{
"plugin2": {
ID: "plugin2",
},
"plugin3": {
ID: "plugin3",
},
"plugin1": {
ID: "plugin1",
Version: "1.0.1",
},
},
},
{
name: "should trim the space in the input",
installPluginsVal: " plugin1 1.0.0, plugin2, plugin3 ",
preinstallPlugins: map[string]InstallPlugin{},
expectedPlugins: map[string]InstallPlugin{
"plugin2": {
ID: "plugin2",
},
"plugin3": {
ID: "plugin3",
},
"plugin1": {
ID: "plugin1",
Version: "1.0.0",
},
},
},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
cfg := NewCfg()
cfg.migrateInstallPluginsToPreinstallPluginsSync(tc.installPluginsVal, tc.installPluginsForce, tc.preinstallPlugins)
assert.Equal(t, len(tc.expectedPlugins), len(tc.preinstallPlugins), "Number of plugins doesn't match")
// Check each expected plugin exists with correct values
for id, expectedPlugin := range tc.expectedPlugins {
actualPlugin, exists := tc.preinstallPlugins[id]
assert.True(t, exists, "Expected plugin %s not found", id)
if exists {
assert.Equal(t, expectedPlugin.ID, actualPlugin.ID, "Plugin ID mismatch for %s", id)
assert.Equal(t, expectedPlugin.Version, actualPlugin.Version, "Plugin version mismatch for %s", id)
assert.Equal(t, expectedPlugin.URL, actualPlugin.URL, "Plugin URL mismatch for %s", id)
}
}
})
}
}