Feature: Allow to skip plugin loading (#74840)
This commit is contained in:
@@ -46,6 +46,7 @@ func ProvideConfig(settingProvider setting.Provider, grafanaCfg *setting.Cfg, fe
|
||||
features,
|
||||
grafanaCfg.AngularSupportEnabled,
|
||||
grafanaCfg.GrafanaComURL,
|
||||
grafanaCfg.DisablePlugins,
|
||||
), nil
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,9 @@ func ProvideDiscoveryStage(cfg *config.Cfg, pf finder.Finder, pr registry.Servic
|
||||
func(ctx context.Context, _ plugins.Class, b []*plugins.FoundBundle) ([]*plugins.FoundBundle, error) {
|
||||
return discovery.NewDuplicatePluginFilterStep(pr).Filter(ctx, b)
|
||||
},
|
||||
func(_ context.Context, _ plugins.Class, b []*plugins.FoundBundle) ([]*plugins.FoundBundle, error) {
|
||||
return NewDisablePluginsStep(cfg).Filter(b)
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
@@ -121,3 +121,39 @@ func (v *SignatureValidation) Validate(ctx context.Context, p *plugins.Plugin) e
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// DisablePlugins is a filter step that will filter out any configured plugins
|
||||
type DisablePlugins struct {
|
||||
log log.Logger
|
||||
cfg *config.Cfg
|
||||
}
|
||||
|
||||
// NewDisablePluginsStep returns a new DisablePlugins.
|
||||
func NewDisablePluginsStep(cfg *config.Cfg) *DisablePlugins {
|
||||
return &DisablePlugins{
|
||||
cfg: cfg,
|
||||
log: log.New("plugins.disable"),
|
||||
}
|
||||
}
|
||||
|
||||
// Filter will filter out any plugins that are marked to be disabled.
|
||||
func (c *DisablePlugins) Filter(bundles []*plugins.FoundBundle) ([]*plugins.FoundBundle, error) {
|
||||
if len(c.cfg.DisablePlugins) == 0 {
|
||||
return bundles, nil
|
||||
}
|
||||
|
||||
disablePluginsMap := make(map[string]bool)
|
||||
for _, pluginID := range c.cfg.DisablePlugins {
|
||||
disablePluginsMap[pluginID] = true
|
||||
}
|
||||
|
||||
res := []*plugins.FoundBundle{}
|
||||
for _, bundle := range bundles {
|
||||
if disablePluginsMap[bundle.Primary.JSONData.ID] {
|
||||
c.log.Debug("Disabling plugin load", "pluginID", bundle.Primary.JSONData.ID)
|
||||
} else {
|
||||
res = append(res, bundle)
|
||||
}
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
package pipeline
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/grafana/grafana/pkg/plugins"
|
||||
"github.com/grafana/grafana/pkg/plugins/config"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestSkipPlugins(t *testing.T) {
|
||||
cfg := &config.Cfg{
|
||||
DisablePlugins: []string{"plugin1", "plugin2"},
|
||||
}
|
||||
s := NewDisablePluginsStep(cfg)
|
||||
|
||||
bundles := []*plugins.FoundBundle{
|
||||
{
|
||||
Primary: plugins.FoundPlugin{
|
||||
JSONData: plugins.JSONData{
|
||||
ID: "plugin1",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Primary: plugins.FoundPlugin{
|
||||
JSONData: plugins.JSONData{
|
||||
ID: "plugin2",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Primary: plugins.FoundPlugin{
|
||||
JSONData: plugins.JSONData{
|
||||
ID: "plugin3",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
filtered, err := s.Filter(bundles)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, filtered, 1)
|
||||
require.Equal(t, filtered[0].Primary.JSONData.ID, "plugin3")
|
||||
}
|
||||
Reference in New Issue
Block a user