mirror of
https://github.com/grafana/grafana.git
synced 2025-02-16 18:34:52 -06:00
Plugins: Make plugin loading from file system deterministic (#46842)
* Plugins: Make plugin loading from file system deterministic * fix test name * flip assertion arg order
This commit is contained in:
parent
c31428128a
commit
5e18293f88
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user