Chore: Replace core plugins as external warning (#81877)

pull/82096/head
Andres Martinez Gotor 1 year ago committed by GitHub
parent 114e9e90f3
commit 26bc87b60e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 3
      pkg/registry/backgroundsvcs/background_services.go
  2. 21
      pkg/services/pluginsintegration/pipeline/steps.go
  3. 21
      pkg/services/pluginsintegration/pipeline/steps_test.go
  4. 43
      pkg/services/pluginsintegration/pluginexternal/check.go
  5. 53
      pkg/services/pluginsintegration/pluginexternal/check_test.go
  6. 2
      pkg/services/pluginsintegration/pluginsintegration.go

@ -26,6 +26,7 @@ import (
plugindashboardsservice "github.com/grafana/grafana/pkg/services/plugindashboards/service" plugindashboardsservice "github.com/grafana/grafana/pkg/services/plugindashboards/service"
"github.com/grafana/grafana/pkg/services/pluginsintegration/angulardetectorsprovider" "github.com/grafana/grafana/pkg/services/pluginsintegration/angulardetectorsprovider"
"github.com/grafana/grafana/pkg/services/pluginsintegration/keyretriever/dynamic" "github.com/grafana/grafana/pkg/services/pluginsintegration/keyretriever/dynamic"
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginexternal"
pluginStore "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" pluginStore "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore"
"github.com/grafana/grafana/pkg/services/provisioning" "github.com/grafana/grafana/pkg/services/provisioning"
publicdashboardsmetric "github.com/grafana/grafana/pkg/services/publicdashboards/metric" publicdashboardsmetric "github.com/grafana/grafana/pkg/services/publicdashboards/metric"
@ -60,6 +61,7 @@ func ProvideBackgroundServiceRegistry(
grafanaAPIServer grafanaapiserver.Service, grafanaAPIServer grafanaapiserver.Service,
anon *anonimpl.AnonDeviceService, anon *anonimpl.AnonDeviceService,
ssoSettings *ssosettingsimpl.Service, ssoSettings *ssosettingsimpl.Service,
pluginExternal *pluginexternal.Service,
// Need to make sure these are initialized, is there a better place to put them? // Need to make sure these are initialized, is there a better place to put them?
_ dashboardsnapshots.Service, _ *alerting.AlertNotificationService, _ dashboardsnapshots.Service, _ *alerting.AlertNotificationService,
_ serviceaccounts.Service, _ *guardian.Provider, _ serviceaccounts.Service, _ *guardian.Provider,
@ -101,6 +103,7 @@ func ProvideBackgroundServiceRegistry(
grafanaAPIServer, grafanaAPIServer,
anon, anon,
ssoSettings, ssoSettings,
pluginExternal,
) )
} }

@ -193,26 +193,5 @@ func (c *AsExternal) Filter(cl plugins.Class, bundles []*plugins.FoundBundle) ([
} }
return res, nil return res, nil
} }
if cl == plugins.ClassExternal {
// Warn if the plugin is not found in the external plugins directory.
asExternal := map[string]bool{}
for pluginID, pluginCfg := range c.cfg.PluginSettings {
if pluginCfg["as_external"] == "true" {
asExternal[pluginID] = true
}
}
for _, bundle := range bundles {
if asExternal[bundle.Primary.JSONData.ID] {
delete(asExternal, bundle.Primary.JSONData.ID)
}
}
if len(asExternal) > 0 {
for p := range asExternal {
c.log.Error("Core plugin expected to be loaded as external, but it is missing", "pluginID", p)
}
}
}
return bundles, nil return bundles, nil
} }

@ -7,7 +7,6 @@ import (
"github.com/grafana/grafana/pkg/plugins" "github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/config" "github.com/grafana/grafana/pkg/plugins/config"
"github.com/grafana/grafana/pkg/plugins/log"
"github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
) )
@ -82,24 +81,4 @@ func TestAsExternal(t *testing.T) {
require.Len(t, filtered, 1) require.Len(t, filtered, 1)
require.Equal(t, filtered[0].Primary.JSONData.ID, "plugin2") require.Equal(t, filtered[0].Primary.JSONData.ID, "plugin2")
}) })
t.Run("should log an error if an external plugin is not available", func(t *testing.T) {
cfg := &config.Cfg{
Features: featuremgmt.WithFeatures(featuremgmt.FlagExternalCorePlugins),
PluginSettings: setting.PluginSettings{
"plugin3": map[string]string{
"as_external": "true",
},
},
}
fakeLogger := log.NewTestLogger()
s := NewAsExternalStep(cfg)
s.log = fakeLogger
filtered, err := s.Filter(plugins.ClassExternal, bundles)
require.NoError(t, err)
require.Len(t, filtered, 2)
require.Equal(t, fakeLogger.ErrorLogs.Calls, 1)
})
} }

@ -0,0 +1,43 @@
package pluginexternal
import (
"context"
"github.com/grafana/grafana/pkg/plugins/log"
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore"
"github.com/grafana/grafana/pkg/setting"
)
type Service struct {
cfg *setting.Cfg
logger log.Logger
pluginStore pluginstore.Store
}
func ProvideService(
cfg *setting.Cfg, pluginStore pluginstore.Store,
) (*Service, error) {
logger := log.New("datasources")
s := &Service{
cfg: cfg,
logger: logger,
pluginStore: pluginStore,
}
return s, nil
}
func (s *Service) Run(ctx context.Context) error {
s.validateExternal()
return ctx.Err()
}
func (s *Service) validateExternal() {
for pluginID, pluginCfg := range s.cfg.PluginSettings {
if pluginCfg["as_external"] == "true" {
_, exists := s.pluginStore.Plugin(context.Background(), pluginID)
if !exists {
s.logger.Error("Core plugin expected to be loaded as external, but it is missing", "pluginID", pluginID)
}
}
}
}

@ -0,0 +1,53 @@
package pluginexternal
import (
"testing"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/log"
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore"
"github.com/grafana/grafana/pkg/setting"
"github.com/stretchr/testify/require"
)
func TestService_validateExternal(t *testing.T) {
cfg := setting.NewCfg()
cfg.PluginSettings = setting.PluginSettings{
"grafana-testdata-datasource": map[string]string{
"as_external": "true",
},
}
t.Run("should not log error if core plugin is loaded as external", func(t *testing.T) {
l := log.NewTestLogger()
s := &Service{
cfg: cfg,
logger: l,
pluginStore: &pluginstore.FakePluginStore{
PluginList: []pluginstore.Plugin{
{
JSONData: plugins.JSONData{
ID: "grafana-testdata-datasource",
},
},
},
},
}
s.validateExternal()
require.Equal(t, l.ErrorLogs.Calls, 0)
})
t.Run("should log error if a core plugin is missing", func(t *testing.T) {
l := log.NewTestLogger()
s := &Service{
cfg: cfg,
logger: l,
pluginStore: &pluginstore.FakePluginStore{
PluginList: []pluginstore.Plugin{},
},
}
s.validateExternal()
require.Equal(t, l.ErrorLogs.Calls, 1)
require.Contains(t, l.ErrorLogs.Message, "Core plugin expected to be loaded as external")
})
}

@ -43,6 +43,7 @@ import (
"github.com/grafana/grafana/pkg/services/pluginsintegration/loader" "github.com/grafana/grafana/pkg/services/pluginsintegration/loader"
"github.com/grafana/grafana/pkg/services/pluginsintegration/pipeline" "github.com/grafana/grafana/pkg/services/pluginsintegration/pipeline"
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginerrs" "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginerrs"
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginexternal"
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginsettings" "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginsettings"
pluginSettings "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginsettings/service" pluginSettings "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginsettings/service"
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore"
@ -112,6 +113,7 @@ var WireSet = wire.NewSet(
wire.Bind(new(auth.ExternalServiceRegistry), new(*serviceregistration.Service)), wire.Bind(new(auth.ExternalServiceRegistry), new(*serviceregistration.Service)),
renderer.ProvideService, renderer.ProvideService,
wire.Bind(new(rendering.PluginManager), new(*renderer.Manager)), wire.Bind(new(rendering.PluginManager), new(*renderer.Manager)),
pluginexternal.ProvideService,
) )
// WireExtensionSet provides a wire.ProviderSet of plugin providers that can be // WireExtensionSet provides a wire.ProviderSet of plugin providers that can be

Loading…
Cancel
Save