diff --git a/pkg/plugins/backendplugin/provider/provider.go b/pkg/plugins/backendplugin/provider/provider.go index 82fbebdd15c..9c5cc2b5354 100644 --- a/pkg/plugins/backendplugin/provider/provider.go +++ b/pkg/plugins/backendplugin/provider/provider.go @@ -10,7 +10,6 @@ import ( "github.com/grafana/grafana/pkg/plugins/backendplugin/pluginextensionv2" "github.com/grafana/grafana/pkg/plugins/backendplugin/secretsmanagerplugin" "github.com/grafana/grafana/pkg/plugins/log" - "github.com/grafana/grafana/pkg/services/featuremgmt" ) // PluginBackendProvider is a function type for initializing a Plugin backend. @@ -18,21 +17,19 @@ type PluginBackendProvider func(_ context.Context, _ *plugins.Plugin) backendplu type Service struct { providerChain []PluginBackendProvider - features featuremgmt.FeatureToggles } -func New(features featuremgmt.FeatureToggles, providers ...PluginBackendProvider) *Service { +func New(providers ...PluginBackendProvider) *Service { if len(providers) == 0 { - return New(features, RendererProvider, SecretsManagerProvider, DefaultProvider(features)) + return New(RendererProvider, SecretsManagerProvider, DefaultProvider) } return &Service{ providerChain: providers, - features: features, } } -func ProvideService(features featuremgmt.FeatureToggles, coreRegistry *coreplugin.Registry) *Service { - return New(features, coreRegistry.BackendFactoryProvider(), RendererProvider, SecretsManagerProvider, DefaultProvider(features)) +func ProvideService(coreRegistry *coreplugin.Registry) *Service { + return New(coreRegistry.BackendFactoryProvider(), RendererProvider, SecretsManagerProvider, DefaultProvider) } func (s *Service) BackendFactory(ctx context.Context, p *plugins.Plugin) backendplugin.PluginFactoryFunc { @@ -68,9 +65,6 @@ var SecretsManagerProvider PluginBackendProvider = func(_ context.Context, p *pl ) } -func DefaultProvider(features featuremgmt.FeatureToggles) PluginBackendProvider { - return func(_ context.Context, p *plugins.Plugin) backendplugin.PluginFactoryFunc { - skipEnvVars := features.IsEnabledGlobally(featuremgmt.FlagPluginsSkipHostEnvVars) - return grpcplugin.NewBackendPlugin(p.ID, p.ExecutablePath(), skipEnvVars) - } -} +var DefaultProvider = PluginBackendProvider(func(_ context.Context, p *plugins.Plugin) backendplugin.PluginFactoryFunc { + return grpcplugin.NewBackendPlugin(p.ID, p.ExecutablePath(), p.SkipHostEnvVars) +}) diff --git a/pkg/plugins/envvars/envvars.go b/pkg/plugins/envvars/envvars.go index 06a52918be3..722d188c005 100644 --- a/pkg/plugins/envvars/envvars.go +++ b/pkg/plugins/envvars/envvars.go @@ -17,7 +17,6 @@ import ( "github.com/grafana/grafana/pkg/plugins" "github.com/grafana/grafana/pkg/plugins/auth" "github.com/grafana/grafana/pkg/plugins/config" - "github.com/grafana/grafana/pkg/services/featuremgmt" ) const ( @@ -86,10 +85,10 @@ func (s *Service) Get(ctx context.Context, p *plugins.Plugin) []string { hostEnv = append(hostEnv, azsettings.WriteToEnvStr(s.cfg.Azure)...) hostEnv = append(hostEnv, s.tracingEnvVars(p)...) - // If FlagPluginsSkipHostEnvVars is enabled, get some allowed variables from the current process and pass - // them down to the plugin. If the feature flag is not enabled, do not add anything else because ALL env vars + // If SkipHostEnvVars is enabled, get some allowed variables from the current process and pass + // them down to the plugin. If the flag is not set, do not add anything else because ALL env vars // from the current process (os.Environ()) will be forwarded to the plugin's process by go-plugin - if s.cfg.Features != nil && s.cfg.Features.IsEnabledGlobally(featuremgmt.FlagPluginsSkipHostEnvVars) { + if p.SkipHostEnvVars { hostEnv = append(hostEnv, s.allowedHostEnvVars()...) } diff --git a/pkg/plugins/envvars/envvars_test.go b/pkg/plugins/envvars/envvars_test.go index 0cef94b2fad..7f47af8b5a4 100644 --- a/pkg/plugins/envvars/envvars_test.go +++ b/pkg/plugins/envvars/envvars_test.go @@ -38,7 +38,6 @@ func TestInitializer_envVars(t *testing.T) { "custom_env_var": "customVal", }, }, - Features: featuremgmt.WithFeatures(), }, licensing) envVars := envVarsProvider.Get(context.Background(), p) @@ -77,10 +76,12 @@ func TestInitializer_skipHostEnvVars(t *testing.T) { require.False(t, ok, "host env var should not be present") }) - t.Run("with FlagPluginsSkipHostEnvVars", func(t *testing.T) { - envVarsProvider := NewProvider(&config.Cfg{ - Features: featuremgmt.WithFeatures(featuremgmt.FlagPluginsSkipHostEnvVars), - }, nil) + t.Run("with SkipHostEnvVars = true", func(t *testing.T) { + p := &plugins.Plugin{ + JSONData: plugins.JSONData{ID: "test"}, + SkipHostEnvVars: true, + } + envVarsProvider := NewProvider(&config.Cfg{}, nil) t.Run("should populate allowed host env vars", func(t *testing.T) { // Set all allowed variables diff --git a/pkg/plugins/manager/loader/loader_test.go b/pkg/plugins/manager/loader/loader_test.go index 3cb3b18b32c..b152019ec40 100644 --- a/pkg/plugins/manager/loader/loader_test.go +++ b/pkg/plugins/manager/loader/loader_test.go @@ -20,6 +20,7 @@ import ( "github.com/grafana/grafana/pkg/plugins/manager/pipeline/termination" "github.com/grafana/grafana/pkg/plugins/manager/pipeline/validation" "github.com/grafana/grafana/pkg/plugins/manager/sources" + "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/org" ) @@ -67,7 +68,7 @@ func TestLoader_Load(t *testing.T) { { name: "Load a Core plugin", class: plugins.ClassCore, - cfg: &config.Cfg{}, + cfg: &config.Cfg{Features: featuremgmt.WithFeatures()}, pluginPaths: []string{filepath.Join(corePluginDir, "app/plugins/datasource/cloudwatch")}, want: []*plugins.Plugin{ { @@ -117,7 +118,7 @@ func TestLoader_Load(t *testing.T) { { name: "Load a Bundled plugin", class: plugins.ClassBundled, - cfg: &config.Cfg{}, + cfg: &config.Cfg{Features: featuremgmt.WithFeatures()}, pluginPaths: []string{"../testdata/valid-v2-signature"}, want: []*plugins.Plugin{ { @@ -157,7 +158,7 @@ func TestLoader_Load(t *testing.T) { }, { name: "Load plugin with symbolic links", class: plugins.ClassExternal, - cfg: &config.Cfg{}, + cfg: &config.Cfg{Features: featuremgmt.WithFeatures()}, pluginPaths: []string{"../testdata/symbolic-plugin-dirs"}, want: []*plugins.Plugin{ { @@ -234,7 +235,8 @@ func TestLoader_Load(t *testing.T) { name: "Load an unsigned plugin (development)", class: plugins.ClassExternal, cfg: &config.Cfg{ - DevMode: true, + DevMode: true, + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{"../testdata/unsigned-datasource"}, want: []*plugins.Plugin{ @@ -272,7 +274,7 @@ func TestLoader_Load(t *testing.T) { { name: "Load an unsigned plugin (production)", class: plugins.ClassExternal, - cfg: &config.Cfg{}, + cfg: &config.Cfg{Features: featuremgmt.WithFeatures()}, pluginPaths: []string{"../testdata/unsigned-datasource"}, want: []*plugins.Plugin{}, }, @@ -281,6 +283,7 @@ func TestLoader_Load(t *testing.T) { class: plugins.ClassExternal, cfg: &config.Cfg{ PluginsAllowUnsigned: []string{"test-datasource"}, + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{"../testdata/unsigned-datasource"}, want: []*plugins.Plugin{ @@ -318,7 +321,7 @@ func TestLoader_Load(t *testing.T) { { name: "Load a plugin with v1 manifest should return signatureInvalid", class: plugins.ClassExternal, - cfg: &config.Cfg{}, + cfg: &config.Cfg{Features: featuremgmt.WithFeatures()}, pluginPaths: []string{"../testdata/lacking-files"}, want: []*plugins.Plugin{}, }, @@ -327,6 +330,7 @@ func TestLoader_Load(t *testing.T) { class: plugins.ClassExternal, cfg: &config.Cfg{ PluginsAllowUnsigned: []string{"test-datasource"}, + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{"../testdata/lacking-files"}, want: []*plugins.Plugin{}, @@ -336,6 +340,7 @@ func TestLoader_Load(t *testing.T) { class: plugins.ClassExternal, cfg: &config.Cfg{ PluginsAllowUnsigned: []string{"test-datasource"}, + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{"../testdata/invalid-v2-missing-file"}, want: []*plugins.Plugin{}, @@ -345,6 +350,7 @@ func TestLoader_Load(t *testing.T) { class: plugins.ClassExternal, cfg: &config.Cfg{ PluginsAllowUnsigned: []string{"test-datasource"}, + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{"../testdata/invalid-v2-extra-file"}, want: []*plugins.Plugin{}, @@ -354,6 +360,7 @@ func TestLoader_Load(t *testing.T) { class: plugins.ClassExternal, cfg: &config.Cfg{ PluginsAllowUnsigned: []string{"test-app"}, + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{"../testdata/test-app-with-includes"}, want: []*plugins.Plugin{ @@ -405,6 +412,7 @@ func TestLoader_Load(t *testing.T) { cfg: &config.Cfg{ DevMode: true, GrafanaAppSubURL: "grafana", + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{"../testdata/unsigned-datasource"}, want: []*plugins.Plugin{ diff --git a/pkg/plugins/manager/pipeline/bootstrap/steps.go b/pkg/plugins/manager/pipeline/bootstrap/steps.go index 9cfb92ea3cd..5dc2aa56e10 100644 --- a/pkg/plugins/manager/pipeline/bootstrap/steps.go +++ b/pkg/plugins/manager/pipeline/bootstrap/steps.go @@ -10,6 +10,7 @@ import ( "github.com/grafana/grafana/pkg/plugins/config" "github.com/grafana/grafana/pkg/plugins/log" "github.com/grafana/grafana/pkg/plugins/manager/loader/assetpath" + "github.com/grafana/grafana/pkg/services/featuremgmt" ) // DefaultConstructor implements the default ConstructFunc used for the Construct step of the Bootstrap stage. @@ -32,6 +33,7 @@ func DefaultDecorateFuncs(cfg *config.Cfg) []DecorateFunc { AppDefaultNavURLDecorateFunc, TemplateDecorateFunc, AppChildDecorateFunc(cfg), + SkipHostEnvVarsDecorateFunc(cfg), } } @@ -153,3 +155,14 @@ func configureAppChildPlugin(cfg *config.Cfg, parent *plugins.Plugin, child *plu child.Module = path.Join("/", cfg.GrafanaAppSubURL, "/public/plugins", parent.ID, appSubPath, "module.js") } } + +// SkipHostEnvVarsDecorateFunc returns a DecorateFunc that configures the SkipHostEnvVars field of the plugin. +// It will be set to true if the FlagPluginsSkipHostEnvVars feature flag is set, and the plugin does not have +// forward_host_env_vars = true in its plugin settings. +func SkipHostEnvVarsDecorateFunc(cfg *config.Cfg) DecorateFunc { + return func(_ context.Context, p *plugins.Plugin) (*plugins.Plugin, error) { + p.SkipHostEnvVars = cfg.Features.IsEnabledGlobally(featuremgmt.FlagPluginsSkipHostEnvVars) && + cfg.PluginSettings[p.ID]["forward_host_env_vars"] != "true" + return p, nil + } +} diff --git a/pkg/plugins/manager/pipeline/bootstrap/steps_test.go b/pkg/plugins/manager/pipeline/bootstrap/steps_test.go index 795d7f8a5a9..57457060db5 100644 --- a/pkg/plugins/manager/pipeline/bootstrap/steps_test.go +++ b/pkg/plugins/manager/pipeline/bootstrap/steps_test.go @@ -10,6 +10,8 @@ import ( "github.com/grafana/grafana/pkg/plugins/config" "github.com/grafana/grafana/pkg/plugins/log" "github.com/grafana/grafana/pkg/plugins/manager/fakes" + "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/setting" ) func TestSetDefaultNavURL(t *testing.T) { @@ -146,3 +148,64 @@ func Test_configureAppChildPlugin(t *testing.T) { require.Equal(t, "/grafana/plugins/parent-app", child.BaseURL) }) } + +func TestSkipEnvVarsDecorateFunc(t *testing.T) { + const pluginID = "plugin-id" + + t.Run("feature flag is not present", func(t *testing.T) { + f := SkipHostEnvVarsDecorateFunc(&config.Cfg{Features: featuremgmt.WithFeatures()}) + p, err := f(context.Background(), &plugins.Plugin{JSONData: plugins.JSONData{ID: pluginID}}) + require.NoError(t, err) + require.False(t, p.SkipHostEnvVars) + }) + + t.Run("feature flag is present", func(t *testing.T) { + t.Run("no plugin settings should set SkipHostEnvVars to true", func(t *testing.T) { + f := SkipHostEnvVarsDecorateFunc(&config.Cfg{ + Features: featuremgmt.WithFeatures(featuremgmt.FlagPluginsSkipHostEnvVars), + }) + p, err := f(context.Background(), &plugins.Plugin{JSONData: plugins.JSONData{ID: pluginID}}) + require.NoError(t, err) + require.True(t, p.SkipHostEnvVars) + }) + + t.Run("plugin setting", func(t *testing.T) { + for _, tc := range []struct { + name string + pluginSettings setting.PluginSettings + expSkipHostEnvVars bool + }{ + { + name: "forward_host_env_vars = false should set SkipHostEnvVars to true", + pluginSettings: setting.PluginSettings{pluginID: map[string]string{"forward_host_env_vars": "false"}}, + expSkipHostEnvVars: true, + }, + { + name: "forward_host_env_vars = true should set SkipHostEnvVars to false", + pluginSettings: setting.PluginSettings{pluginID: map[string]string{"forward_host_env_vars": "true"}}, + expSkipHostEnvVars: false, + }, + { + name: "invalid forward_host_env_vars should set SkipHostEnvVars to true", + pluginSettings: setting.PluginSettings{pluginID: map[string]string{"forward_host_env_vars": "grilled cheese sandwich with bacon"}}, + expSkipHostEnvVars: true, + }, + { + name: "forward_host_env_vars absent should set SkipHostEnvVars to true", + pluginSettings: setting.PluginSettings{pluginID: nil}, + expSkipHostEnvVars: true, + }, + } { + t.Run(tc.name, func(t *testing.T) { + f := SkipHostEnvVarsDecorateFunc(&config.Cfg{ + Features: featuremgmt.WithFeatures(featuremgmt.FlagPluginsSkipHostEnvVars), + PluginSettings: tc.pluginSettings, + }) + p, err := f(context.Background(), &plugins.Plugin{JSONData: plugins.JSONData{ID: pluginID}}) + require.NoError(t, err) + require.Equal(t, tc.expSkipHostEnvVars, p.SkipHostEnvVars) + }) + } + }) + }) +} diff --git a/pkg/plugins/plugins.go b/pkg/plugins/plugins.go index 2abf01705f1..8a34f2fe4c8 100644 --- a/pkg/plugins/plugins.go +++ b/pkg/plugins/plugins.go @@ -64,6 +64,8 @@ type Plugin struct { client backendplugin.Plugin log log.Logger + SkipHostEnvVars bool + mu sync.Mutex } diff --git a/pkg/services/pluginsintegration/loader/loader_test.go b/pkg/services/pluginsintegration/loader/loader_test.go index 736ed206f50..bfec4fe0a36 100644 --- a/pkg/services/pluginsintegration/loader/loader_test.go +++ b/pkg/services/pluginsintegration/loader/loader_test.go @@ -68,7 +68,7 @@ func TestLoader_Load(t *testing.T) { { name: "Load a Core plugin", class: plugins.ClassCore, - cfg: &config.Cfg{}, + cfg: &config.Cfg{Features: featuremgmt.WithFeatures()}, pluginPaths: []string{filepath.Join(corePluginDir(t), "app/plugins/datasource/cloudwatch")}, want: []*plugins.Plugin{ { @@ -118,7 +118,7 @@ func TestLoader_Load(t *testing.T) { { name: "Load a Bundled plugin", class: plugins.ClassBundled, - cfg: &config.Cfg{}, + cfg: &config.Cfg{Features: featuremgmt.WithFeatures()}, pluginPaths: []string{filepath.Join(testDataDir(t), "valid-v2-signature")}, want: []*plugins.Plugin{ { @@ -158,7 +158,7 @@ func TestLoader_Load(t *testing.T) { }, { name: "Load plugin with symbolic links", class: plugins.ClassExternal, - cfg: &config.Cfg{}, + cfg: &config.Cfg{Features: featuremgmt.WithFeatures()}, pluginPaths: []string{filepath.Join(testDataDir(t), "symbolic-plugin-dirs")}, want: []*plugins.Plugin{ { @@ -235,7 +235,8 @@ func TestLoader_Load(t *testing.T) { name: "Load an unsigned plugin (development)", class: plugins.ClassExternal, cfg: &config.Cfg{ - DevMode: true, + DevMode: true, + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{filepath.Join(testDataDir(t), "unsigned-datasource")}, want: []*plugins.Plugin{ @@ -272,7 +273,7 @@ func TestLoader_Load(t *testing.T) { }, { name: "Load an unsigned plugin (production)", class: plugins.ClassExternal, - cfg: &config.Cfg{}, + cfg: &config.Cfg{Features: featuremgmt.WithFeatures()}, pluginPaths: []string{filepath.Join(testDataDir(t), "unsigned-datasource")}, want: []*plugins.Plugin{}, pluginErrors: map[string]*plugins.SignatureError{ @@ -287,6 +288,7 @@ func TestLoader_Load(t *testing.T) { class: plugins.ClassExternal, cfg: &config.Cfg{ PluginsAllowUnsigned: []string{"test-datasource"}, + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{filepath.Join(testDataDir(t), "unsigned-datasource")}, want: []*plugins.Plugin{ @@ -324,7 +326,7 @@ func TestLoader_Load(t *testing.T) { { name: "Load a plugin with v1 manifest should return signatureInvalid", class: plugins.ClassExternal, - cfg: &config.Cfg{}, + cfg: &config.Cfg{Features: featuremgmt.WithFeatures()}, pluginPaths: []string{filepath.Join(testDataDir(t), "lacking-files")}, want: []*plugins.Plugin{}, pluginErrors: map[string]*plugins.SignatureError{ @@ -339,6 +341,7 @@ func TestLoader_Load(t *testing.T) { class: plugins.ClassExternal, cfg: &config.Cfg{ PluginsAllowUnsigned: []string{"test-datasource"}, + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{filepath.Join(testDataDir(t), "lacking-files")}, want: []*plugins.Plugin{}, @@ -354,6 +357,7 @@ func TestLoader_Load(t *testing.T) { class: plugins.ClassExternal, cfg: &config.Cfg{ PluginsAllowUnsigned: []string{"test-datasource"}, + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{filepath.Join(testDataDir(t), "invalid-v2-missing-file")}, want: []*plugins.Plugin{}, @@ -369,6 +373,7 @@ func TestLoader_Load(t *testing.T) { class: plugins.ClassExternal, cfg: &config.Cfg{ PluginsAllowUnsigned: []string{"test-datasource"}, + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{filepath.Join(testDataDir(t), "invalid-v2-extra-file")}, want: []*plugins.Plugin{}, @@ -384,6 +389,7 @@ func TestLoader_Load(t *testing.T) { class: plugins.ClassExternal, cfg: &config.Cfg{ PluginsAllowUnsigned: []string{"test-app"}, + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{filepath.Join(testDataDir(t), "test-app-with-includes")}, want: []*plugins.Plugin{ @@ -434,6 +440,7 @@ func TestLoader_Load(t *testing.T) { cfg: &config.Cfg{ DevMode: true, GrafanaAppSubURL: "grafana", + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{filepath.Join(testDataDir(t), "unsigned-datasource")}, want: []*plugins.Plugin{ @@ -697,6 +704,7 @@ func TestLoader_Load_CustomSource(t *testing.T) { PluginSettings: setting.PluginSettings{ "grafana-worldmap-panel": {"cdn": "true"}, }, + Features: featuremgmt.WithFeatures(), } pluginPaths := []string{filepath.Join(testDataDir(t), "cdn")} @@ -779,6 +787,7 @@ func TestLoader_Load_MultiplePlugins(t *testing.T) { name: "Load multiple plugins (broken, valid, unsigned)", cfg: &config.Cfg{ GrafanaAppURL: "http://localhost:3000", + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{ filepath.Join(testDataDir(t), "invalid-plugin-json"), // test-app @@ -875,6 +884,7 @@ func TestLoader_Load_RBACReady(t *testing.T) { name: "Load plugin defining one RBAC role", cfg: &config.Cfg{ GrafanaAppURL: "http://localhost:3000", + Features: featuremgmt.WithFeatures(), }, pluginPaths: []string{filepath.Join(testDataDir(t), "test-app-with-roles")}, want: []*plugins.Plugin{ @@ -992,7 +1002,7 @@ func TestLoader_Load_Signature_RootURL(t *testing.T) { reg := fakes.NewFakePluginRegistry() procPrvdr := fakes.NewFakeBackendProcessProvider() procMgr := fakes.NewFakeProcessManager() - cfg := &config.Cfg{GrafanaAppURL: defaultAppURL} + cfg := &config.Cfg{GrafanaAppURL: defaultAppURL, Features: featuremgmt.WithFeatures()} l := newLoader(t, cfg, reg, procMgr, procPrvdr, newFakeSignatureErrorTracker()) got, err := l.Load(context.Background(), &fakes.FakePluginSource{ PluginClassFunc: func(ctx context.Context) plugins.Class { @@ -1068,7 +1078,7 @@ func TestLoader_Load_DuplicatePlugins(t *testing.T) { reg := fakes.NewFakePluginRegistry() procPrvdr := fakes.NewFakeBackendProcessProvider() procMgr := fakes.NewFakeProcessManager() - cfg := &config.Cfg{} + cfg := &config.Cfg{Features: featuremgmt.WithFeatures()} l := newLoader(t, cfg, reg, procMgr, procPrvdr, newFakeSignatureErrorTracker()) got, err := l.Load(context.Background(), &fakes.FakePluginSource{ PluginClassFunc: func(ctx context.Context) plugins.Class { @@ -1157,7 +1167,7 @@ func TestLoader_Load_SkipUninitializedPlugins(t *testing.T) { } } procMgr := fakes.NewFakeProcessManager() - cfg := &config.Cfg{} + cfg := &config.Cfg{Features: featuremgmt.WithFeatures()} l := newLoader(t, cfg, reg, procMgr, procPrvdr, newFakeSignatureErrorTracker()) got, err := l.Load(context.Background(), &fakes.FakePluginSource{ PluginClassFunc: func(ctx context.Context) plugins.Class { @@ -1214,7 +1224,7 @@ func TestLoader_AngularClass(t *testing.T) { }, } // if angularDetected = true, it means that the detection has run - l := newLoaderWithOpts(t, &config.Cfg{AngularSupportEnabled: true}, loaderDepOpts{ + l := newLoaderWithOpts(t, &config.Cfg{AngularSupportEnabled: true, Features: featuremgmt.WithFeatures()}, loaderDepOpts{ angularInspector: angularinspector.AlwaysAngularFakeInspector, }) p, err := l.Load(context.Background(), fakePluginSource) @@ -1242,8 +1252,8 @@ func TestLoader_Load_Angular(t *testing.T) { name string cfg *config.Cfg }{ - {name: "angular support enabled", cfg: &config.Cfg{AngularSupportEnabled: true}}, - {name: "angular support disabled", cfg: &config.Cfg{AngularSupportEnabled: false}}, + {name: "angular support enabled", cfg: &config.Cfg{AngularSupportEnabled: true, Features: featuremgmt.WithFeatures()}}, + {name: "angular support disabled", cfg: &config.Cfg{AngularSupportEnabled: false, Features: featuremgmt.WithFeatures()}}, } { t.Run(cfgTc.name, func(t *testing.T) { for _, tc := range []struct { @@ -1296,19 +1306,22 @@ func TestLoader_HideAngularDeprecation(t *testing.T) { {name: `without "hide_angular_deprecation" setting`, cfg: &config.Cfg{ AngularSupportEnabled: true, PluginSettings: setting.PluginSettings{}, + Features: featuremgmt.WithFeatures(), }}, {name: `with "hide_angular_deprecation" = true`, cfg: &config.Cfg{ AngularSupportEnabled: true, PluginSettings: setting.PluginSettings{ "plugin-id": map[string]string{"hide_angular_deprecation": "true"}, - }}, - }, + }, + Features: featuremgmt.WithFeatures(), + }}, {name: `with "hide_angular_deprecation" = false`, cfg: &config.Cfg{ AngularSupportEnabled: true, PluginSettings: setting.PluginSettings{ "plugin-id": map[string]string{"hide_angular_deprecation": "false"}, - }}, - }, + }, + Features: featuremgmt.WithFeatures(), + }}, } { t.Run(tc.name, func(t *testing.T) { l := newLoaderWithOpts(t, tc.cfg, loaderDepOpts{ @@ -1395,7 +1408,7 @@ func TestLoader_Load_NestedPlugins(t *testing.T) { procPrvdr := fakes.NewFakeBackendProcessProvider() procMgr := fakes.NewFakeProcessManager() reg := fakes.NewFakePluginRegistry() - cfg := &config.Cfg{} + cfg := &config.Cfg{Features: featuremgmt.WithFeatures()} l := newLoader(t, cfg, reg, procMgr, procPrvdr, newFakeSignatureErrorTracker()) got, err := l.Load(context.Background(), &fakes.FakePluginSource{ @@ -1570,7 +1583,7 @@ func TestLoader_Load_NestedPlugins(t *testing.T) { reg := fakes.NewFakePluginRegistry() procPrvdr := fakes.NewFakeBackendProcessProvider() procMgr := fakes.NewFakeProcessManager() - cfg := &config.Cfg{} + cfg := &config.Cfg{Features: featuremgmt.WithFeatures()} l := newLoader(t, cfg, reg, procMgr, procPrvdr, newFakeSignatureErrorTracker()) got, err := l.Load(context.Background(), &fakes.FakePluginSource{ PluginClassFunc: func(ctx context.Context) plugins.Class { diff --git a/pkg/services/pluginsintegration/test_helper.go b/pkg/services/pluginsintegration/test_helper.go index fdc1fb14492..b958b05681c 100644 --- a/pkg/services/pluginsintegration/test_helper.go +++ b/pkg/services/pluginsintegration/test_helper.go @@ -54,7 +54,7 @@ func CreateIntegrationTestCtx(t *testing.T, cfg *setting.Cfg, coreRegistry *core disc := pipeline.ProvideDiscoveryStage(pCfg, finder.NewLocalFinder(true), reg) boot := pipeline.ProvideBootstrapStage(pCfg, signature.ProvideService(pCfg, statickey.New()), assetpath.ProvideService(pCfg, cdn)) valid := pipeline.ProvideValidationStage(pCfg, signature.NewValidator(signature.NewUnsignedAuthorizer(pCfg)), angularInspector, errTracker) - init := pipeline.ProvideInitializationStage(pCfg, reg, fakes.NewFakeLicensingService(), provider.ProvideService(featuremgmt.WithFeatures(), coreRegistry), proc, &fakes.FakeAuthService{}, fakes.NewFakeRoleRegistry()) + init := pipeline.ProvideInitializationStage(pCfg, reg, fakes.NewFakeLicensingService(), provider.ProvideService(coreRegistry), proc, &fakes.FakeAuthService{}, fakes.NewFakeRoleRegistry()) term, err := pipeline.ProvideTerminationStage(pCfg, reg, proc) require.NoError(t, err) @@ -100,7 +100,7 @@ func CreateTestLoader(t *testing.T, cfg *pluginsCfg.Cfg, opts LoaderOpts) *loade if opts.Initializer == nil { reg := registry.ProvideService() coreRegistry := coreplugin.NewRegistry(make(map[string]backendplugin.PluginFactoryFunc)) - opts.Initializer = pipeline.ProvideInitializationStage(cfg, reg, fakes.NewFakeLicensingService(), provider.ProvideService(featuremgmt.WithFeatures(), coreRegistry), process.ProvideService(), &fakes.FakeAuthService{}, fakes.NewFakeRoleRegistry()) + opts.Initializer = pipeline.ProvideInitializationStage(cfg, reg, fakes.NewFakeLicensingService(), provider.ProvideService(coreRegistry), process.ProvideService(), &fakes.FakeAuthService{}, fakes.NewFakeRoleRegistry()) } if opts.Terminator == nil {