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
+44 -23
View File
@@ -41,6 +41,24 @@ var (
}
)
func (cfg *Cfg) processPreinstallPlugins(rawInstallPlugins []string, preinstallPlugins map[string]InstallPlugin) {
// Add the plugins defined in the configuration
for _, plugin := range rawInstallPlugins {
parts := strings.Split(plugin, "@")
id := parts[0]
version := ""
url := ""
if len(parts) > 1 {
version = parts[1]
if len(parts) > 2 {
url = parts[2]
}
}
preinstallPlugins[id] = InstallPlugin{id, version, url}
}
}
func (cfg *Cfg) readPluginSettings(iniFile *ini.File) error {
pluginsSection := iniFile.Section("plugins")
@@ -56,38 +74,41 @@ func (cfg *Cfg) readPluginSettings(iniFile *ini.File) error {
cfg.ForwardHostEnvVars = util.SplitString(pluginsSection.Key("forward_host_env_vars").MustString(""))
disablePreinstall := pluginsSection.Key("preinstall_disabled").MustBool(false)
if !disablePreinstall {
rawInstallPlugins := util.SplitString(pluginsSection.Key("preinstall").MustString(""))
preinstallPlugins := make(map[string]InstallPlugin)
// Add the default preinstalled plugins
rawInstallPluginsAsync := util.SplitString(pluginsSection.Key("preinstall").MustString(""))
preinstallPluginsAsync := make(map[string]InstallPlugin)
// Add the default preinstalled plugins to pre install plugins async list
for _, plugin := range defaultPreinstallPlugins {
preinstallPlugins[plugin.ID] = plugin
preinstallPluginsAsync[plugin.ID] = plugin
}
if cfg.IsFeatureToggleEnabled("grafanaAdvisor") { // Use literal string to avoid circular dependency
preinstallPlugins["grafana-advisor-app"] = InstallPlugin{"grafana-advisor-app", "", ""}
preinstallPluginsAsync["grafana-advisor-app"] = InstallPlugin{"grafana-advisor-app", "", ""}
}
// Add the plugins defined in the configuration
for _, plugin := range rawInstallPlugins {
parts := strings.Split(plugin, "@")
id := parts[0]
version := ""
url := ""
if len(parts) > 1 {
version = parts[1]
if len(parts) > 2 {
url = parts[2]
}
}
cfg.processPreinstallPlugins(rawInstallPluginsAsync, preinstallPluginsAsync)
preinstallPlugins[id] = InstallPlugin{id, version, url}
}
rawInstallPluginsSync := util.SplitString(pluginsSection.Key("preinstall_sync").MustString(""))
preinstallPluginsSync := make(map[string]InstallPlugin)
cfg.processPreinstallPlugins(rawInstallPluginsSync, preinstallPluginsSync)
// Remove from the list the plugins that have been disabled
for _, disabledPlugin := range cfg.DisablePlugins {
delete(preinstallPlugins, disabledPlugin)
delete(preinstallPluginsAsync, disabledPlugin)
delete(preinstallPluginsSync, disabledPlugin)
}
for _, plugin := range preinstallPlugins {
cfg.PreinstallPlugins = append(cfg.PreinstallPlugins, plugin)
for _, plugin := range preinstallPluginsAsync {
cfg.PreinstallPluginsAsync = append(cfg.PreinstallPluginsAsync, plugin)
}
for _, plugin := range preinstallPluginsSync {
cfg.PreinstallPluginsSync = append(cfg.PreinstallPluginsSync, plugin)
}
installPluginsInAsync := pluginsSection.Key("preinstall_async").MustBool(true)
if !installPluginsInAsync {
for key, plugin := range preinstallPluginsAsync {
if _, exists := preinstallPluginsSync[key]; !exists {
cfg.PreinstallPluginsSync = append(cfg.PreinstallPluginsSync, plugin)
}
}
cfg.PreinstallPluginsAsync = nil
}
cfg.PreinstallPluginsAsync = pluginsSection.Key("preinstall_async").MustBool(true)
}
cfg.PluginCatalogURL = pluginsSection.Key("plugin_catalog_url").MustString("https://grafana.com/grafana/plugins/")