diff --git a/pkg/plugins/manager/manager.go b/pkg/plugins/manager/manager.go index bfb616f5130..d7792f2ff15 100644 --- a/pkg/plugins/manager/manager.go +++ b/pkg/plugins/manager/manager.go @@ -33,15 +33,20 @@ type PluginManager struct { pluginInstaller plugins.Installer pluginLoader plugins.Loader pluginsMu sync.RWMutex - pluginPaths map[plugins.Class][]string + pluginSources []PluginSource log log.Logger } +type PluginSource struct { + Class plugins.Class + Paths []string +} + func ProvideService(grafanaCfg *setting.Cfg, pluginLoader plugins.Loader) (*PluginManager, error) { - pm := New(plugins.FromGrafanaCfg(grafanaCfg), map[plugins.Class][]string{ - plugins.Core: corePluginPaths(grafanaCfg), - plugins.Bundled: {grafanaCfg.BundledPluginsPath}, - plugins.External: append([]string{grafanaCfg.PluginsPath}, pluginSettingPaths(grafanaCfg)...), + pm := New(plugins.FromGrafanaCfg(grafanaCfg), []PluginSource{ + {Class: plugins.Core, Paths: corePluginPaths(grafanaCfg)}, + {Class: plugins.Bundled, Paths: []string{grafanaCfg.BundledPluginsPath}}, + {Class: plugins.External, Paths: append([]string{grafanaCfg.PluginsPath}, pluginSettingPaths(grafanaCfg)...)}, }, pluginLoader) if err := pm.Init(); err != nil { return nil, err @@ -49,11 +54,11 @@ func ProvideService(grafanaCfg *setting.Cfg, pluginLoader plugins.Loader) (*Plug return pm, nil } -func New(cfg *plugins.Cfg, pluginPaths map[plugins.Class][]string, pluginLoader plugins.Loader) *PluginManager { +func New(cfg *plugins.Cfg, pluginSources []PluginSource, pluginLoader plugins.Loader) *PluginManager { return &PluginManager{ cfg: cfg, pluginLoader: pluginLoader, - pluginPaths: pluginPaths, + pluginSources: pluginSources, store: make(map[string]*plugins.Plugin), log: log.New("plugin.manager"), pluginInstaller: installer.New(false, cfg.BuildVersion, newInstallerLogger("plugin.installer", true)), @@ -61,8 +66,8 @@ func New(cfg *plugins.Cfg, pluginPaths map[plugins.Class][]string, pluginLoader } func (m *PluginManager) Init() error { - for class, paths := range m.pluginPaths { - err := m.loadPlugins(context.Background(), class, paths...) + for _, ps := range m.pluginSources { + err := m.loadPlugins(context.Background(), ps.Class, ps.Paths...) if err != nil { return err } diff --git a/pkg/plugins/manager/manager_test.go b/pkg/plugins/manager/manager_test.go index d0b5d9dc813..ce56bbc72ab 100644 --- a/pkg/plugins/manager/manager_test.go +++ b/pkg/plugins/manager/manager_test.go @@ -20,6 +20,21 @@ const ( testPluginID = "test-plugin" ) +func TestPluginManager_Init(t *testing.T) { + t.Run("Plugin sources are loaded in order", func(t *testing.T) { + loader := &fakeLoader{} + pm := New(&plugins.Cfg{}, []PluginSource{ + {Class: plugins.Bundled, Paths: []string{"path1"}}, + {Class: plugins.Core, Paths: []string{"path2"}}, + {Class: plugins.External, Paths: []string{"path3"}}, + }, loader) + + err := pm.Init() + require.NoError(t, err) + require.Equal(t, []string{"path1", "path2", "path3"}, loader.loadedPaths) + }) +} + func TestPluginManager_loadPlugins(t *testing.T) { t.Run("Managed backend plugin", func(t *testing.T) { p, pc := createPlugin(testPluginID, "", plugins.External, true, true)