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
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user