Plugins: Tidy config struct (#84168)

* tidy plugins config usage

* fix tests
This commit is contained in:
Will Browne 2024-03-11 16:28:46 +01:00 committed by GitHub
parent 0c6b0188c8
commit 225ac8003c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 50 additions and 199 deletions

View File

@ -18,7 +18,6 @@ import (
"github.com/grafana/grafana/pkg/infra/localcache"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/backendplugin"
"github.com/grafana/grafana/pkg/plugins/config"
pluginClient "github.com/grafana/grafana/pkg/plugins/manager/client"
"github.com/grafana/grafana/pkg/plugins/manager/registry"
"github.com/grafana/grafana/pkg/services/datasources"
@ -297,7 +296,7 @@ func TestDataSourceQueryError(t *testing.T) {
&fakeDatasources.FakeCacheService{},
nil,
&fakePluginRequestValidator{},
pluginClient.ProvideService(r, &config.PluginManagementCfg{}),
pluginClient.ProvideService(r),
plugincontext.ProvideService(cfg, localcache.ProvideService(), &pluginstore.FakePluginStore{
PluginList: []pluginstore.Plugin{pluginstore.ToGrafanaDTO(p)},
},

View File

@ -19,12 +19,9 @@ type PluginManagementCfg struct {
PluginsCDNURLTemplate string
Tracing Tracing
GrafanaComURL string
GrafanaAppURL string
GrafanaAppSubURL string
GrafanaAppURL string
Features featuremgmt.FeatureToggles
@ -34,9 +31,9 @@ type PluginManagementCfg struct {
// NewPluginManagementCfg returns a new PluginManagementCfg.
func NewPluginManagementCfg(devMode bool, pluginsPath string, pluginSettings setting.PluginSettings, pluginsAllowUnsigned []string,
pluginsCDNURLTemplate string, appURL string, appSubURL string, tracing Tracing, features featuremgmt.FeatureToggles,
angularSupportEnabled bool, grafanaComURL string, disablePlugins []string, hideAngularDeprecation []string,
forwardHostEnvVars []string) *PluginManagementCfg {
pluginsCDNURLTemplate string, appURL string, features featuremgmt.FeatureToggles, angularSupportEnabled bool,
grafanaComURL string, disablePlugins []string, hideAngularDeprecation []string, forwardHostEnvVars []string,
) *PluginManagementCfg {
return &PluginManagementCfg{
PluginsPath: pluginsPath,
DevMode: devMode,
@ -44,10 +41,8 @@ func NewPluginManagementCfg(devMode bool, pluginsPath string, pluginSettings set
PluginsAllowUnsigned: pluginsAllowUnsigned,
DisablePlugins: disablePlugins,
PluginsCDNURLTemplate: pluginsCDNURLTemplate,
Tracing: tracing,
GrafanaComURL: grafanaComURL,
GrafanaAppURL: appURL,
GrafanaAppSubURL: appSubURL,
Features: features,
AngularSupportEnabled: angularSupportEnabled,
HideAngularDeprecation: hideAngularDeprecation,

View File

@ -10,7 +10,6 @@ import (
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/config"
"github.com/grafana/grafana/pkg/plugins/manager/registry"
)
@ -29,13 +28,11 @@ var (
type Service struct {
pluginRegistry registry.Service
cfg *config.PluginManagementCfg
}
func ProvideService(pluginRegistry registry.Service, cfg *config.PluginManagementCfg) *Service {
func ProvideService(pluginRegistry registry.Service) *Service {
return &Service{
pluginRegistry: pluginRegistry,
cfg: cfg,
}
}

View File

@ -10,7 +10,6 @@ import (
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/backendplugin"
"github.com/grafana/grafana/pkg/plugins/config"
"github.com/grafana/grafana/pkg/plugins/manager/fakes"
"github.com/stretchr/testify/require"
)
@ -18,7 +17,7 @@ import (
func TestQueryData(t *testing.T) {
t.Run("Empty registry should return not registered error", func(t *testing.T) {
registry := fakes.NewFakePluginRegistry()
client := ProvideService(registry, &config.PluginManagementCfg{})
client := ProvideService(registry)
_, err := client.QueryData(context.Background(), &backend.QueryDataRequest{})
require.Error(t, err)
require.ErrorIs(t, err, plugins.ErrPluginNotRegistered)
@ -63,7 +62,7 @@ func TestQueryData(t *testing.T) {
err := registry.Add(context.Background(), p)
require.NoError(t, err)
client := ProvideService(registry, &config.PluginManagementCfg{})
client := ProvideService(registry)
_, err = client.QueryData(context.Background(), &backend.QueryDataRequest{
PluginContext: backend.PluginContext{
PluginID: "grafana",
@ -79,7 +78,7 @@ func TestQueryData(t *testing.T) {
func TestCheckHealth(t *testing.T) {
t.Run("empty plugin registry should return plugin not registered error", func(t *testing.T) {
registry := fakes.NewFakePluginRegistry()
client := ProvideService(registry, &config.PluginManagementCfg{})
client := ProvideService(registry)
_, err := client.CheckHealth(context.Background(), &backend.CheckHealthRequest{})
require.Error(t, err)
require.ErrorIs(t, err, plugins.ErrPluginNotRegistered)
@ -125,7 +124,7 @@ func TestCheckHealth(t *testing.T) {
err := registry.Add(context.Background(), p)
require.NoError(t, err)
client := ProvideService(registry, &config.PluginManagementCfg{})
client := ProvideService(registry)
_, err = client.CheckHealth(context.Background(), &backend.CheckHealthRequest{
PluginContext: backend.PluginContext{
PluginID: "grafana",
@ -189,7 +188,7 @@ func TestCallResource(t *testing.T) {
err := registry.Add(context.Background(), p)
require.NoError(t, err)
client := ProvideService(registry, &config.PluginManagementCfg{})
client := ProvideService(registry)
err = client.CallResource(context.Background(), req, sender)
require.NoError(t, err)
@ -252,7 +251,7 @@ func TestCallResource(t *testing.T) {
err := registry.Add(context.Background(), p)
require.NoError(t, err)
client := ProvideService(registry, &config.PluginManagementCfg{})
client := ProvideService(registry)
err = client.CallResource(context.Background(), req, sender)
require.NoError(t, err)
@ -298,7 +297,7 @@ func TestCallResource(t *testing.T) {
err := registry.Add(context.Background(), p)
require.NoError(t, err)
client := ProvideService(registry, &config.PluginManagementCfg{})
client := ProvideService(registry)
err = client.CallResource(context.Background(), req, sender)
require.NoError(t, err)
@ -366,7 +365,7 @@ func TestCallResource(t *testing.T) {
err := registry.Add(context.Background(), p)
require.NoError(t, err)
client := ProvideService(registry, &config.PluginManagementCfg{})
client := ProvideService(registry)
err = client.CallResource(context.Background(), req, sender)
require.NoError(t, err)

View File

@ -124,46 +124,4 @@ func TestService(t *testing.T) {
})
})
}
t.Run("App Sub URL has no effect on the path", func(t *testing.T) {
for _, tc := range []struct {
appSubURL string
}{
{
appSubURL: "grafana",
},
{
appSubURL: "/grafana",
},
{
appSubURL: "grafana/",
},
{
appSubURL: "/grafana/",
},
} {
cfg := &config.PluginManagementCfg{GrafanaAppSubURL: tc.appSubURL}
svc := ProvideService(cfg, pluginscdn.ProvideService(cfg))
dir := "/plugins/test-datasource"
p := plugins.JSONData{ID: "test-datasource"}
fs := fakes.NewFakePluginFiles(dir)
base, err := svc.Base(NewPluginInfo(p, plugins.ClassExternal, fs))
require.NoError(t, err)
require.Equal(t, "public/plugins/test-datasource", base)
mod, err := svc.Module(NewPluginInfo(p, plugins.ClassExternal, fs))
require.NoError(t, err)
require.Equal(t, "public/plugins/test-datasource/module.js", mod)
base, err = svc.Base(NewPluginInfo(p, plugins.ClassCore, fs))
require.NoError(t, err)
require.Equal(t, "public/app/plugins/test-datasource", base)
mod, err = svc.Module(NewPluginInfo(p, plugins.ClassCore, fs))
require.NoError(t, err)
require.Equal(t, "core:plugin/test-datasource", mod)
}
})
}

View File

@ -410,47 +410,6 @@ func TestLoader_Load(t *testing.T) {
},
},
},
{
name: "Load a plugin with app sub url set",
class: plugins.ClassExternal,
cfg: &config.PluginManagementCfg{
DevMode: true,
GrafanaAppSubURL: "grafana",
Features: featuremgmt.WithFeatures(),
},
pluginPaths: []string{"../testdata/unsigned-datasource"},
want: []*plugins.Plugin{
{
JSONData: plugins.JSONData{
ID: "test-datasource",
Type: plugins.TypeDataSource,
Name: "Test",
Info: plugins.Info{
Author: plugins.InfoLink{
Name: "Grafana Labs",
URL: "https://grafana.com",
},
Logos: plugins.Logos{
Small: "public/img/icn-datasource.svg",
Large: "public/img/icn-datasource.svg",
},
Description: "Test",
},
Dependencies: plugins.Dependencies{
GrafanaVersion: "*",
Plugins: []plugins.Dependency{},
},
Backend: true,
State: plugins.ReleaseStateAlpha,
},
Class: plugins.ClassExternal,
Module: "public/plugins/test-datasource/module.js",
BaseURL: "public/plugins/test-datasource",
FS: mustNewStaticFSForTests(t, filepath.Join(parentDir, "testdata/unsigned-datasource/plugin")),
Signature: plugins.SignatureStatusUnsigned,
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {

View File

@ -1,7 +1,6 @@
package angularinspector
import (
"github.com/grafana/grafana/pkg/plugins/config"
"github.com/grafana/grafana/pkg/plugins/manager/loader/angular/angulardetector"
"github.com/grafana/grafana/pkg/plugins/manager/loader/angular/angularinspector"
"github.com/grafana/grafana/pkg/services/featuremgmt"
@ -12,11 +11,11 @@ type Service struct {
angularinspector.Inspector
}
func ProvideService(cfg *config.PluginManagementCfg, dynamic *angulardetectorsprovider.Dynamic) (*Service, error) {
func ProvideService(features featuremgmt.FeatureToggles, dynamic *angulardetectorsprovider.Dynamic) (*Service, error) {
var detectorsProvider angulardetector.DetectorsProvider
var err error
static := angularinspector.NewDefaultStaticDetectorsProvider()
if cfg.Features != nil && cfg.Features.IsEnabledGlobally(featuremgmt.FlagPluginsDynamicAngularDetectionPatterns) {
if features.IsEnabledGlobally(featuremgmt.FlagPluginsDynamicAngularDetectionPatterns) {
detectorsProvider = angulardetector.SequenceDetectorsProvider{dynamic, static}
} else {
detectorsProvider = static

View File

@ -17,14 +17,14 @@ import (
func TestProvideService(t *testing.T) {
t.Run("uses hardcoded inspector if feature flag is not present", func(t *testing.T) {
pCfg := &config.PluginManagementCfg{Features: featuremgmt.WithFeatures()}
features := featuremgmt.WithFeatures()
dynamic, err := angulardetectorsprovider.ProvideDynamic(
pCfg,
&config.PluginManagementCfg{},
angularpatternsstore.ProvideService(kvstore.NewFakeKVStore()),
featuremgmt.WithFeatures(featuremgmt.FlagPluginsDynamicAngularDetectionPatterns),
features,
)
require.NoError(t, err)
inspector, err := ProvideService(pCfg, dynamic)
inspector, err := ProvideService(features, dynamic)
require.NoError(t, err)
require.IsType(t, inspector.Inspector, &angularinspector.PatternsListInspector{})
patternsListInspector := inspector.Inspector.(*angularinspector.PatternsListInspector)
@ -33,16 +33,16 @@ func TestProvideService(t *testing.T) {
})
t.Run("uses dynamic inspector with hardcoded fallback if feature flag is present", func(t *testing.T) {
pCfg := &config.PluginManagementCfg{Features: featuremgmt.WithFeatures(
features := featuremgmt.WithFeatures(
featuremgmt.FlagPluginsDynamicAngularDetectionPatterns,
)}
)
dynamic, err := angulardetectorsprovider.ProvideDynamic(
pCfg,
&config.PluginManagementCfg{},
angularpatternsstore.ProvideService(kvstore.NewFakeKVStore()),
featuremgmt.WithFeatures(),
features,
)
require.NoError(t, err)
inspector, err := ProvideService(pCfg, dynamic)
inspector, err := ProvideService(features, dynamic)
require.NoError(t, err)
require.IsType(t, inspector.Inspector, &angularinspector.PatternsListInspector{})
require.IsType(t, inspector.Inspector.(*angularinspector.PatternsListInspector).DetectorsProvider, angulardetector.SequenceDetectorsProvider{})

View File

@ -440,47 +440,6 @@ func TestLoader_Load(t *testing.T) {
},
},
},
{
name: "Load a plugin with app sub url set",
class: plugins.ClassExternal,
cfg: &config.PluginManagementCfg{
DevMode: true,
GrafanaAppSubURL: "grafana",
Features: featuremgmt.WithFeatures(),
},
pluginPaths: []string{filepath.Join(testDataDir(t), "unsigned-datasource")},
want: []*plugins.Plugin{
{
JSONData: plugins.JSONData{
ID: "test-datasource",
Type: plugins.TypeDataSource,
Name: "Test",
Info: plugins.Info{
Author: plugins.InfoLink{
Name: "Grafana Labs",
URL: "https://grafana.com",
},
Logos: plugins.Logos{
Small: "public/img/icn-datasource.svg",
Large: "public/img/icn-datasource.svg",
},
Description: "Test",
},
Dependencies: plugins.Dependencies{
GrafanaVersion: "*",
Plugins: []plugins.Dependency{},
},
Backend: true,
State: plugins.ReleaseStateAlpha,
},
Class: plugins.ClassExternal,
Module: "public/plugins/test-datasource/module.js",
BaseURL: "public/plugins/test-datasource",
FS: mustNewStaticFSForTests(t, filepath.Join(testDataDir(t), "unsigned-datasource/plugin")),
Signature: plugins.SignatureStatusUnsigned,
},
},
},
}
for _, tt := range tests {
reg := fakes.NewFakePluginRegistry()

View File

@ -167,7 +167,7 @@ type AsExternal struct {
cfg *config.PluginManagementCfg
}
// NewDisablePluginsStep returns a new DisablePlugins.
// NewAsExternalStep returns a new DisablePlugins.
func NewAsExternalStep(cfg *config.PluginManagementCfg) *AsExternal {
return &AsExternal{
cfg: cfg,

View File

@ -22,11 +22,6 @@ func ProvidePluginManagementConfig(cfg *setting.Cfg, settingProvider setting.Pro
allowedUnsigned = strings.Split(plugins.KeyValue("allow_loading_unsigned_plugins").Value(), ",")
}
tracingCfg, err := newTracingCfg(cfg)
if err != nil {
return nil, fmt.Errorf("new opentelemetry cfg: %w", err)
}
return config.NewPluginManagementCfg(
settingProvider.KeyValue("", "app_mode").MustBool(cfg.Env == setting.Dev),
cfg.PluginsPath,
@ -34,8 +29,6 @@ func ProvidePluginManagementConfig(cfg *setting.Cfg, settingProvider setting.Pro
allowedUnsigned,
cfg.PluginsCDNURLTemplate,
cfg.AppURL,
cfg.AppSubURL,
tracingCfg,
features,
cfg.AngularSupportEnabled,
cfg.GrafanaComURL,

View File

@ -9,7 +9,6 @@ import (
"github.com/grafana/grafana/pkg/plugins/auth"
"github.com/grafana/grafana/pkg/plugins/backendplugin/coreplugin"
"github.com/grafana/grafana/pkg/plugins/backendplugin/provider"
pCfg "github.com/grafana/grafana/pkg/plugins/config"
"github.com/grafana/grafana/pkg/plugins/envvars"
"github.com/grafana/grafana/pkg/plugins/log"
"github.com/grafana/grafana/pkg/plugins/manager/client"
@ -136,7 +135,7 @@ var WireExtensionSet = wire.NewSet(
)
func ProvideClientDecorator(
cfg *setting.Cfg, pCfg *pCfg.PluginManagementCfg,
cfg *setting.Cfg,
pluginRegistry registry.Service,
oAuthTokenService oauthtoken.OAuthTokenService,
tracer tracing.Tracer,
@ -144,16 +143,16 @@ func ProvideClientDecorator(
features *featuremgmt.FeatureManager,
promRegisterer prometheus.Registerer,
) (*client.Decorator, error) {
return NewClientDecorator(cfg, pCfg, pluginRegistry, oAuthTokenService, tracer, cachingService, features, promRegisterer, pluginRegistry)
return NewClientDecorator(cfg, pluginRegistry, oAuthTokenService, tracer, cachingService, features, promRegisterer, pluginRegistry)
}
func NewClientDecorator(
cfg *setting.Cfg, pCfg *pCfg.PluginManagementCfg,
cfg *setting.Cfg,
pluginRegistry registry.Service, oAuthTokenService oauthtoken.OAuthTokenService,
tracer tracing.Tracer, cachingService caching.CachingService, features *featuremgmt.FeatureManager,
promRegisterer prometheus.Registerer, registry registry.Service,
) (*client.Decorator, error) {
c := client.ProvideService(pluginRegistry, pCfg)
c := client.ProvideService(pluginRegistry)
middlewares := CreateMiddlewares(cfg, oAuthTokenService, tracer, cachingService, features, promRegisterer, registry)
return client.NewDecorator(c, middlewares...)
}

View File

@ -8,7 +8,7 @@ import (
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/backendplugin/pluginextensionv2"
"github.com/grafana/grafana/pkg/plugins/backendplugin/provider"
pluginscfg "github.com/grafana/grafana/pkg/plugins/config"
"github.com/grafana/grafana/pkg/plugins/config"
"github.com/grafana/grafana/pkg/plugins/envvars"
"github.com/grafana/grafana/pkg/plugins/manager/loader"
"github.com/grafana/grafana/pkg/plugins/manager/pipeline/bootstrap"
@ -21,12 +21,11 @@ import (
"github.com/grafana/grafana/pkg/plugins/manager/sources"
"github.com/grafana/grafana/pkg/services/pluginsintegration/pipeline"
"github.com/grafana/grafana/pkg/services/rendering"
"github.com/grafana/grafana/pkg/setting"
)
func ProvideService(cfg *setting.Cfg, pCfg *pluginscfg.PluginManagementCfg, pluginEnvProvider envvars.Provider, registry registry.Service,
licensing plugins.Licensing) (*Manager, error) {
l, err := createLoader(cfg, pCfg, pluginEnvProvider, registry, licensing)
func ProvideService(cfg *config.PluginManagementCfg, pluginEnvProvider envvars.Provider,
registry registry.Service) (*Manager, error) {
l, err := createLoader(cfg, pluginEnvProvider, registry)
if err != nil {
return nil, err
}
@ -35,14 +34,14 @@ func ProvideService(cfg *setting.Cfg, pCfg *pluginscfg.PluginManagementCfg, plug
}
type Manager struct {
cfg *setting.Cfg
cfg *config.PluginManagementCfg
loader loader.Service
log log.Logger
renderer *Plugin
}
func NewManager(cfg *setting.Cfg, loader loader.Service) *Manager {
func NewManager(cfg *config.PluginManagementCfg, loader loader.Service) *Manager {
return &Manager{
cfg: cfg,
loader: loader,
@ -104,9 +103,9 @@ func (m *Manager) Renderer(ctx context.Context) (rendering.Plugin, bool) {
return nil, false
}
func createLoader(cfg *setting.Cfg, pCfg *pluginscfg.PluginManagementCfg, pluginEnvProvider envvars.Provider,
pr registry.Service, l plugins.Licensing) (loader.Service, error) {
d := discovery.New(pCfg, discovery.Opts{
func createLoader(cfg *config.PluginManagementCfg, pluginEnvProvider envvars.Provider,
pr registry.Service) (loader.Service, error) {
d := discovery.New(cfg, discovery.Opts{
FindFilterFuncs: []discovery.FindFilterFunc{
discovery.NewPermittedPluginTypesFilterStep([]plugins.Type{plugins.TypeRenderer}),
func(ctx context.Context, class plugins.Class, bundles []*plugins.FoundBundle) ([]*plugins.FoundBundle, error) {
@ -114,21 +113,21 @@ func createLoader(cfg *setting.Cfg, pCfg *pluginscfg.PluginManagementCfg, plugin
},
},
})
b := bootstrap.New(pCfg, bootstrap.Opts{
b := bootstrap.New(cfg, bootstrap.Opts{
DecorateFuncs: []bootstrap.DecorateFunc{}, // no decoration required
})
v := validation.New(pCfg, validation.Opts{
v := validation.New(cfg, validation.Opts{
ValidateFuncs: []validation.ValidateFunc{
validation.SignatureValidationStep(signature.NewValidator(signature.NewUnsignedAuthorizer(pCfg))),
validation.SignatureValidationStep(signature.NewValidator(signature.NewUnsignedAuthorizer(cfg))),
},
})
i := initialization.New(pCfg, initialization.Opts{
i := initialization.New(cfg, initialization.Opts{
InitializeFuncs: []initialization.InitializeFunc{
initialization.BackendClientInitStep(pluginEnvProvider, provider.New(provider.RendererProvider)),
initialization.PluginRegistrationStep(pr),
},
})
t, err := termination.New(pCfg, termination.Opts{
t, err := termination.New(cfg, termination.Opts{
TerminateFuncs: []termination.TerminateFunc{
termination.DeregisterStep(pr),
},

View File

@ -9,8 +9,8 @@ import (
"github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/config"
"github.com/grafana/grafana/pkg/plugins/manager/fakes"
"github.com/grafana/grafana/pkg/setting"
)
func TestRenderer(t *testing.T) {
@ -33,9 +33,7 @@ func TestRenderer(t *testing.T) {
return nil, nil
},
}
cfg := &setting.Cfg{
PluginsPath: filepath.Join(testdataDir),
}
cfg := &config.PluginManagementCfg{PluginsPath: filepath.Join(testdataDir)}
m := NewManager(cfg, loader)
@ -67,9 +65,7 @@ func TestRenderer(t *testing.T) {
return nil, nil
},
}
cfg := &setting.Cfg{
PluginsPath: filepath.Join(testdataDir),
}
cfg := &config.PluginManagementCfg{PluginsPath: filepath.Join(testdataDir)}
m := NewManager(cfg, loader)

View File

@ -5,7 +5,6 @@ import (
"errors"
"github.com/grafana/grafana/pkg/plugins/auth"
"github.com/grafana/grafana/pkg/plugins/config"
"github.com/grafana/grafana/pkg/plugins/log"
"github.com/grafana/grafana/pkg/plugins/pfs"
"github.com/grafana/grafana/pkg/services/accesscontrol"
@ -21,9 +20,9 @@ type Service struct {
settingsSvc pluginsettings.Service
}
func ProvideService(cfg *config.PluginManagementCfg, reg extsvcauth.ExternalServiceRegistry, settingsSvc pluginsettings.Service) *Service {
func ProvideService(features featuremgmt.FeatureToggles, reg extsvcauth.ExternalServiceRegistry, settingsSvc pluginsettings.Service) *Service {
s := &Service{
featureEnabled: cfg.Features.IsEnabledGlobally(featuremgmt.FlagExternalServiceAccounts),
featureEnabled: features.IsEnabledGlobally(featuremgmt.FlagExternalServiceAccounts),
log: log.New("plugins.external.registration"),
reg: reg,
settingsSvc: settingsSvc,

View File

@ -70,7 +70,7 @@ func CreateIntegrationTestCtx(t *testing.T, cfg *setting.Cfg, coreRegistry *core
require.NoError(t, err)
return &IntegrationTestCtx{
PluginClient: client.ProvideService(reg, pCfg),
PluginClient: client.ProvideService(reg),
PluginStore: ps,
PluginRegistry: reg,
}