[WIP] Plugins: Introduce Plugins specific config (#54854)

This commit is contained in:
Will Browne
2022-09-14 14:35:35 +01:00
committed by GitHub
parent 8b38f9408d
commit 0571d98bba
14 changed files with 243 additions and 173 deletions
+35 -62
View File
@@ -7,21 +7,21 @@ import (
"sort"
"testing"
"github.com/grafana/grafana/pkg/infra/log/logtest"
"github.com/grafana/grafana/pkg/services/org"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/infra/log/logtest"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/backendplugin"
"github.com/grafana/grafana/pkg/plugins/backendplugin/coreplugin"
"github.com/grafana/grafana/pkg/plugins/backendplugin/provider"
"github.com/grafana/grafana/pkg/plugins/config"
"github.com/grafana/grafana/pkg/plugins/manager/loader/finder"
"github.com/grafana/grafana/pkg/plugins/manager/loader/initializer"
"github.com/grafana/grafana/pkg/plugins/manager/signature"
"github.com/grafana/grafana/pkg/services/org"
"github.com/grafana/grafana/pkg/setting"
)
@@ -41,18 +41,16 @@ func TestLoader_Load(t *testing.T) {
tests := []struct {
name string
class plugins.Class
cfg *plugins.Cfg
cfg *config.Cfg
pluginPaths []string
existingPlugins map[string]struct{}
want []*plugins.Plugin
pluginErrors map[string]*plugins.Error
}{
{
name: "Load a Core plugin",
class: plugins.Core,
cfg: &plugins.Cfg{
PluginsPath: corePluginDir,
},
name: "Load a Core plugin",
class: plugins.Core,
cfg: &config.Cfg{},
pluginPaths: []string{filepath.Join(corePluginDir, "app/plugins/datasource/cloudwatch")},
want: []*plugins.Plugin{
{
@@ -99,11 +97,9 @@ func TestLoader_Load(t *testing.T) {
},
},
{
name: "Load a Bundled plugin",
class: plugins.Bundled,
cfg: &plugins.Cfg{
PluginsPath: filepath.Join(parentDir, "testdata"),
},
name: "Load a Bundled plugin",
class: plugins.Bundled,
cfg: &config.Cfg{},
pluginPaths: []string{"../testdata/valid-v2-signature"},
want: []*plugins.Plugin{
{
@@ -141,11 +137,9 @@ func TestLoader_Load(t *testing.T) {
},
},
}, {
name: "Load plugin with symbolic links",
class: plugins.External,
cfg: &plugins.Cfg{
PluginsPath: filepath.Join(parentDir),
},
name: "Load plugin with symbolic links",
class: plugins.External,
cfg: &config.Cfg{},
pluginPaths: []string{"../testdata/symbolic-plugin-dirs"},
want: []*plugins.Plugin{
{
@@ -221,9 +215,8 @@ func TestLoader_Load(t *testing.T) {
}, {
name: "Load an unsigned plugin (development)",
class: plugins.External,
cfg: &plugins.Cfg{
DevMode: true,
PluginsPath: filepath.Join(parentDir),
cfg: &config.Cfg{
DevMode: true,
},
pluginPaths: []string{"../testdata/unsigned-datasource"},
want: []*plugins.Plugin{
@@ -258,11 +251,9 @@ func TestLoader_Load(t *testing.T) {
},
},
}, {
name: "Load an unsigned plugin (production)",
class: plugins.External,
cfg: &plugins.Cfg{
PluginsPath: filepath.Join(parentDir),
},
name: "Load an unsigned plugin (production)",
class: plugins.External,
cfg: &config.Cfg{},
pluginPaths: []string{"../testdata/unsigned-datasource"},
want: []*plugins.Plugin{},
pluginErrors: map[string]*plugins.Error{
@@ -275,8 +266,7 @@ func TestLoader_Load(t *testing.T) {
{
name: "Load an unsigned plugin using PluginsAllowUnsigned config (production)",
class: plugins.External,
cfg: &plugins.Cfg{
PluginsPath: filepath.Join(parentDir),
cfg: &config.Cfg{
PluginsAllowUnsigned: []string{"test-datasource"},
},
pluginPaths: []string{"../testdata/unsigned-datasource"},
@@ -313,11 +303,9 @@ func TestLoader_Load(t *testing.T) {
},
},
{
name: "Load an unsigned plugin with modified signature (production)",
class: plugins.External,
cfg: &plugins.Cfg{
PluginsPath: filepath.Join(parentDir),
},
name: "Load an unsigned plugin with modified signature (production)",
class: plugins.External,
cfg: &config.Cfg{},
pluginPaths: []string{"../testdata/lacking-files"},
want: []*plugins.Plugin{},
pluginErrors: map[string]*plugins.Error{
@@ -330,8 +318,7 @@ func TestLoader_Load(t *testing.T) {
{
name: "Load an unsigned plugin with modified signature using PluginsAllowUnsigned config (production) still includes a signing error",
class: plugins.External,
cfg: &plugins.Cfg{
PluginsPath: filepath.Join(parentDir),
cfg: &config.Cfg{
PluginsAllowUnsigned: []string{"test-datasource"},
},
pluginPaths: []string{"../testdata/lacking-files"},
@@ -346,8 +333,7 @@ func TestLoader_Load(t *testing.T) {
{
name: "Load a plugin with manifest which has a file not found in plugin folder",
class: plugins.External,
cfg: &plugins.Cfg{
PluginsPath: filepath.Join(parentDir),
cfg: &config.Cfg{
PluginsAllowUnsigned: []string{"test-datasource"},
},
pluginPaths: []string{"../testdata/invalid-v2-missing-file"},
@@ -362,8 +348,7 @@ func TestLoader_Load(t *testing.T) {
{
name: "Load a plugin with file which is missing from the manifest",
class: plugins.External,
cfg: &plugins.Cfg{
PluginsPath: filepath.Join(parentDir),
cfg: &config.Cfg{
PluginsAllowUnsigned: []string{"test-datasource"},
},
pluginPaths: []string{"../testdata/invalid-v2-extra-file"},
@@ -378,8 +363,7 @@ func TestLoader_Load(t *testing.T) {
{
name: "Load an app with includes",
class: plugins.External,
cfg: &plugins.Cfg{
PluginsPath: filepath.Join(parentDir),
cfg: &config.Cfg{
PluginsAllowUnsigned: []string{"test-app"},
},
pluginPaths: []string{"../testdata/test-app-with-includes"},
@@ -509,7 +493,7 @@ func TestLoader_Load_MultiplePlugins(t *testing.T) {
t.Run("Load multiple", func(t *testing.T) {
tests := []struct {
name string
cfg *plugins.Cfg
cfg *config.Cfg
pluginPaths []string
appURL string
existingPlugins map[string]struct{}
@@ -517,10 +501,8 @@ func TestLoader_Load_MultiplePlugins(t *testing.T) {
pluginErrors map[string]*plugins.Error
}{
{
name: "Load multiple plugins (broken, valid, unsigned)",
cfg: &plugins.Cfg{
PluginsPath: filepath.Join(parentDir),
},
name: "Load multiple plugins (broken, valid, unsigned)",
cfg: &config.Cfg{},
appURL: "http://localhost:3000",
pluginPaths: []string{
"../testdata/invalid-plugin-json", // test-app
@@ -648,7 +630,7 @@ func TestLoader_Signature_RootURL(t *testing.T) {
},
}
l := newLoader(&plugins.Cfg{PluginsPath: filepath.Join(parentDir)})
l := newLoader(&config.Cfg{})
got, err := l.Load(context.Background(), plugins.External, paths, map[string]struct{}{})
assert.NoError(t, err)
@@ -717,9 +699,7 @@ func TestLoader_Load_DuplicatePlugins(t *testing.T) {
},
}
l := newLoader(&plugins.Cfg{
PluginsPath: filepath.Dir(pluginDir),
})
l := newLoader(&config.Cfg{})
got, err := l.Load(context.Background(), plugins.External, []string{pluginDir, pluginDir}, map[string]struct{}{})
assert.NoError(t, err)
@@ -806,9 +786,7 @@ func TestLoader_loadNestedPlugins(t *testing.T) {
t.Run("Load nested External plugins", func(t *testing.T) {
expected := []*plugins.Plugin{parent, child}
l := newLoader(&plugins.Cfg{
PluginsPath: rootDir,
})
l := newLoader(&config.Cfg{})
got, err := l.Load(context.Background(), plugins.External, []string{"../testdata/nested-plugins"}, map[string]struct{}{})
assert.NoError(t, err)
@@ -828,9 +806,7 @@ func TestLoader_loadNestedPlugins(t *testing.T) {
parent.Children = nil
expected := []*plugins.Plugin{parent}
l := newLoader(&plugins.Cfg{
PluginsPath: rootDir,
})
l := newLoader(&config.Cfg{})
got, err := l.Load(context.Background(), plugins.External, []string{"../testdata/nested-plugins"}, map[string]struct{}{
"test-panel": {},
@@ -970,9 +946,7 @@ func TestLoader_loadNestedPlugins(t *testing.T) {
child.Parent = parent
expected := []*plugins.Plugin{parent, child}
l := newLoader(&plugins.Cfg{
PluginsPath: rootDir,
})
l := newLoader(&config.Cfg{})
got, err := l.Load(context.Background(), plugins.External, []string{"../testdata/app-with-child"}, map[string]struct{}{})
assert.NoError(t, err)
@@ -1169,9 +1143,8 @@ func Test_setPathsBasedOnApp(t *testing.T) {
})
}
func newLoader(cfg *plugins.Cfg) *Loader {
func newLoader(cfg *config.Cfg) *Loader {
return &Loader{
cfg: cfg,
pluginFinder: finder.New(),
pluginInitializer: initializer.New(cfg, provider.ProvideService(coreplugin.NewRegistry(make(map[string]backendplugin.PluginFactoryFunc))), &fakeLicensingService{}),
signatureValidator: signature.NewValidator(signature.NewUnsignedAuthorizer(cfg)),