Plugins: Plugin settings refactor (#46246)

* remove bus and direct use of sqlStore

* add decryption to interface

* return nil

* rename field

* re-order fields

* rename file
pull/46302/head
Will Browne 4 years ago committed by GitHub
parent b409c9782f
commit 6a8cbd8663
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      pkg/api/app_routes.go
  2. 2
      pkg/api/frontendsettings.go
  3. 5
      pkg/api/frontendsettings_test.go
  4. 4
      pkg/api/pluginproxy/pluginproxy_test.go
  5. 6
      pkg/plugins/plugincontext/plugincontext.go
  6. 7
      pkg/services/pluginsettings/pluginsettings.go
  7. 33
      pkg/services/pluginsettings/service/service.go
  8. 5
      pkg/services/pluginsettings/service/service_test.go
  9. 10
      pkg/services/provisioning/plugins/plugin_provisioner_test.go

@ -63,7 +63,7 @@ func AppPluginRoute(route *plugins.Route, appID string, hs *HTTPServer) web.Hand
return func(c *models.ReqContext) {
path := web.Params(c.Req)["*"]
proxy := pluginproxy.NewApiPluginProxy(c, path, route, appID, hs.Cfg, hs.SQLStore, hs.SecretsService)
proxy := pluginproxy.NewApiPluginProxy(c, path, route, appID, hs.Cfg, hs.PluginSettings, hs.SecretsService)
proxy.Transport = pluginProxyTransport
proxy.ServeHTTP(c.Resp, c.Req)
}

@ -392,7 +392,7 @@ func (hs *HTTPServer) pluginSettings(ctx context.Context, orgID int64) (map[stri
pluginSettings := make(map[string]*models.PluginSettingInfoDTO)
// fill settings from database
if pss, err := hs.SQLStore.GetPluginSettings(ctx, orgID); err != nil {
if pss, err := hs.PluginSettings.GetPluginSettings(ctx, orgID); err != nil {
return nil, err
} else {
for _, ps := range pss {

@ -11,7 +11,10 @@ import (
accesscontrolmock "github.com/grafana/grafana/pkg/services/accesscontrol/mock"
"github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/services/licensing"
pluginSettings "github.com/grafana/grafana/pkg/services/pluginsettings/service"
"github.com/grafana/grafana/pkg/services/rendering"
"github.com/grafana/grafana/pkg/services/secrets/fakes"
secretsManager "github.com/grafana/grafana/pkg/services/secrets/manager"
"github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/services/updatechecker"
"github.com/grafana/grafana/pkg/setting"
@ -37,6 +40,7 @@ func setupTestEnvironment(t *testing.T, cfg *setting.Cfg, features *featuremgmt.
}
sqlStore := sqlstore.InitTestDB(t)
secretsService := secretsManager.SetupTestService(t, fakes.NewFakeSecretsStore())
hs := &HTTPServer{
Cfg: cfg,
@ -52,6 +56,7 @@ func setupTestEnvironment(t *testing.T, cfg *setting.Cfg, features *featuremgmt.
pluginStore: &fakePluginStore{},
grafanaUpdateChecker: &updatechecker.GrafanaService{},
AccessControl: accesscontrolmock.New().WithDisabled(),
PluginSettings: pluginSettings.ProvideService(sqlStore, secretsService),
}
m := web.New()

@ -324,3 +324,7 @@ func (s *mockPluginsSettingsService) UpdatePluginSettingVersion(_ context.Contex
func (s *mockPluginsSettingsService) UpdatePluginSetting(_ context.Context, _ *models.UpdatePluginSettingCmd) error {
return s.err
}
func (s *mockPluginsSettingsService) DecryptedValues(_ *models.PluginSetting) map[string]string {
return nil
}

@ -15,14 +15,14 @@ import (
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/adapters"
"github.com/grafana/grafana/pkg/services/datasources"
pluginSettings "github.com/grafana/grafana/pkg/services/pluginsettings/service"
"github.com/grafana/grafana/pkg/services/pluginsettings"
"github.com/grafana/grafana/pkg/services/secrets"
"github.com/grafana/grafana/pkg/util/errutil"
)
func ProvideService(bus bus.Bus, cacheService *localcache.CacheService, pluginStore plugins.Store,
dataSourceCache datasources.CacheService, secretsService secrets.Service,
pluginSettingsService *pluginSettings.Service) *Provider {
pluginSettingsService pluginsettings.Service) *Provider {
return &Provider{
bus: bus,
cacheService: cacheService,
@ -40,7 +40,7 @@ type Provider struct {
pluginStore plugins.Store
dataSourceCache datasources.CacheService
secretsService secrets.Service
pluginSettingsService *pluginSettings.Service
pluginSettingsService pluginsettings.Service
logger log.Logger
}

@ -7,8 +7,15 @@ import (
)
type Service interface {
// GetPluginSettings returns all Plugin Settings for the provided Org
GetPluginSettings(ctx context.Context, orgID int64) ([]*models.PluginSettingInfoDTO, error)
// GetPluginSettingById returns a Plugin Settings by Plugin ID
GetPluginSettingById(ctx context.Context, query *models.GetPluginSettingByIdQuery) error
// UpdatePluginSetting updates a Plugin Setting
UpdatePluginSetting(ctx context.Context, cmd *models.UpdatePluginSettingCmd) error
// UpdatePluginSettingVersion updates a Plugin Setting's plugin version
UpdatePluginSettingVersion(ctx context.Context, cmd *models.UpdatePluginSettingVersionCmd) error
// DecryptedValues decrypts the encrypted secureJSONData of the provided plugin setting and
// returns the decrypted values.
DecryptedValues(ps *models.PluginSetting) map[string]string
}

@ -5,38 +5,31 @@ import (
"sync"
"time"
"github.com/grafana/grafana/pkg/bus"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/secrets"
"github.com/grafana/grafana/pkg/services/sqlstore"
)
func ProvideService(bus bus.Bus, store *sqlstore.SQLStore, secretsService secrets.Service) *Service {
func ProvideService(store *sqlstore.SQLStore, secretsService secrets.Service) *Service {
s := &Service{
bus: bus,
sqlStore: store,
secretsService: secretsService,
logger: log.New("pluginsettings"),
pluginSettingDecryptionCache: secureJSONDecryptionCache{
sqlStore: store,
decryptionCache: secureJSONDecryptionCache{
cache: make(map[int64]cachedDecryptedJSON),
},
secretsService: secretsService,
logger: log.New("pluginsettings"),
}
s.bus.AddHandler(s.GetPluginSettingById)
s.bus.AddHandler(s.UpdatePluginSetting)
s.bus.AddHandler(s.UpdatePluginSettingVersion)
return s
}
type Service struct {
bus bus.Bus
sqlStore *sqlstore.SQLStore
secretsService secrets.Service
sqlStore *sqlstore.SQLStore
decryptionCache secureJSONDecryptionCache
secretsService secrets.Service
logger log.Logger
pluginSettingDecryptionCache secureJSONDecryptionCache
logger log.Logger
}
type cachedDecryptedJSON struct {
@ -72,10 +65,10 @@ func (s *Service) UpdatePluginSettingVersion(ctx context.Context, cmd *models.Up
}
func (s *Service) DecryptedValues(ps *models.PluginSetting) map[string]string {
s.pluginSettingDecryptionCache.Lock()
defer s.pluginSettingDecryptionCache.Unlock()
s.decryptionCache.Lock()
defer s.decryptionCache.Unlock()
if item, present := s.pluginSettingDecryptionCache.cache[ps.Id]; present && ps.Updated.Equal(item.updated) {
if item, present := s.decryptionCache.cache[ps.Id]; present && ps.Updated.Equal(item.updated) {
return item.json
}
@ -85,7 +78,7 @@ func (s *Service) DecryptedValues(ps *models.PluginSetting) map[string]string {
return map[string]string{}
}
s.pluginSettingDecryptionCache.cache[ps.Id] = cachedDecryptedJSON{
s.decryptionCache.cache[ps.Id] = cachedDecryptedJSON{
updated: ps.Updated,
json: json,
}

@ -5,7 +5,6 @@ import (
"testing"
"time"
"github.com/grafana/grafana/pkg/bus"
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/secrets"
"github.com/grafana/grafana/pkg/services/secrets/fakes"
@ -19,7 +18,7 @@ func TestService_DecryptedValuesCache(t *testing.T) {
ctx := context.Background()
secretsService := secretsManager.SetupTestService(t, fakes.NewFakeSecretsStore())
psService := ProvideService(bus.New(), nil, secretsService)
psService := ProvideService(nil, secretsService)
encryptedJsonData, err := secretsService.EncryptJsonData(
ctx,
@ -57,7 +56,7 @@ func TestService_DecryptedValuesCache(t *testing.T) {
ctx := context.Background()
secretsService := secretsManager.SetupTestService(t, fakes.NewFakeSecretsStore())
psService := ProvideService(bus.New(), nil, secretsService)
psService := ProvideService(nil, secretsService)
encryptedJsonData, err := secretsService.EncryptJsonData(
ctx,

@ -92,15 +92,19 @@ func (m *mockStore) GetPluginSettingById(ctx context.Context, query *models.GetP
return models.ErrPluginSettingNotFound
}
func (m *mockStore) UpdatePluginSetting(ctx context.Context, cmd *models.UpdatePluginSettingCmd) error {
func (m *mockStore) UpdatePluginSetting(_ context.Context, cmd *models.UpdatePluginSettingCmd) error {
m.sentCommands = append(m.sentCommands, cmd)
return nil
}
func (m *mockStore) UpdatePluginSettingVersion(ctx context.Context, cmd *models.UpdatePluginSettingVersionCmd) error {
func (m *mockStore) UpdatePluginSettingVersion(_ context.Context, _ *models.UpdatePluginSettingVersionCmd) error {
return nil
}
func (m *mockStore) GetPluginSettings(ctx context.Context, orgID int64) ([]*models.PluginSettingInfoDTO, error) {
func (m *mockStore) GetPluginSettings(_ context.Context, _ int64) ([]*models.PluginSettingInfoDTO, error) {
return nil, nil
}
func (m *mockStore) DecryptedValues(_ *models.PluginSetting) map[string]string {
return nil
}

Loading…
Cancel
Save