Plugins: Separate manager read/write components (#50313)

* separate manager read/write

* guarantee consistency in test
This commit is contained in:
Will Browne 2022-06-07 17:51:00 +02:00 committed by GitHub
parent aa74371008
commit f7cce28cdf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 15 additions and 3 deletions

View File

@ -107,6 +107,7 @@ type HTTPServer struct {
PluginRequestValidator models.PluginRequestValidator PluginRequestValidator models.PluginRequestValidator
pluginClient plugins.Client pluginClient plugins.Client
pluginStore plugins.Store pluginStore plugins.Store
pluginManager plugins.Manager
pluginDashboardService plugindashboards.Service pluginDashboardService plugindashboards.Service
pluginStaticRouteResolver plugins.StaticRouteResolver pluginStaticRouteResolver plugins.StaticRouteResolver
pluginErrorResolver plugins.ErrorResolver pluginErrorResolver plugins.ErrorResolver
@ -170,7 +171,7 @@ func ProvideHTTPServer(opts ServerOptions, cfg *setting.Cfg, routeRegister routi
cacheService *localcache.CacheService, sqlStore *sqlstore.SQLStore, alertEngine *alerting.AlertEngine, cacheService *localcache.CacheService, sqlStore *sqlstore.SQLStore, alertEngine *alerting.AlertEngine,
pluginRequestValidator models.PluginRequestValidator, pluginStaticRouteResolver plugins.StaticRouteResolver, pluginRequestValidator models.PluginRequestValidator, pluginStaticRouteResolver plugins.StaticRouteResolver,
pluginDashboardService plugindashboards.Service, pluginStore plugins.Store, pluginClient plugins.Client, pluginDashboardService plugindashboards.Service, pluginStore plugins.Store, pluginClient plugins.Client,
pluginErrorResolver plugins.ErrorResolver, settingsProvider setting.Provider, pluginErrorResolver plugins.ErrorResolver, pluginManager plugins.Manager, settingsProvider setting.Provider,
dataSourceCache datasources.CacheService, userTokenService models.UserTokenService, dataSourceCache datasources.CacheService, userTokenService models.UserTokenService,
cleanUpService *cleanup.CleanUpService, shortURLService shorturls.Service, queryHistoryService queryhistory.Service, cleanUpService *cleanup.CleanUpService, shortURLService shorturls.Service, queryHistoryService queryhistory.Service,
thumbService thumbs.Service, remoteCache *remotecache.RemoteCache, provisioningService provisioning.ProvisioningService, thumbService thumbs.Service, remoteCache *remotecache.RemoteCache, provisioningService provisioning.ProvisioningService,
@ -207,6 +208,7 @@ func ProvideHTTPServer(opts ServerOptions, cfg *setting.Cfg, routeRegister routi
SQLStore: sqlStore, SQLStore: sqlStore,
AlertEngine: alertEngine, AlertEngine: alertEngine,
PluginRequestValidator: pluginRequestValidator, PluginRequestValidator: pluginRequestValidator,
pluginManager: pluginManager,
pluginClient: pluginClient, pluginClient: pluginClient,
pluginStore: pluginStore, pluginStore: pluginStore,
pluginStaticRouteResolver: pluginStaticRouteResolver, pluginStaticRouteResolver: pluginStaticRouteResolver,

View File

@ -358,7 +358,7 @@ func (hs *HTTPServer) InstallPlugin(c *models.ReqContext) response.Response {
} }
pluginID := web.Params(c.Req)[":pluginId"] pluginID := web.Params(c.Req)[":pluginId"]
err := hs.pluginStore.Add(c.Req.Context(), pluginID, dto.Version) err := hs.pluginManager.Add(c.Req.Context(), pluginID, dto.Version)
if err != nil { if err != nil {
var dupeErr plugins.DuplicateError var dupeErr plugins.DuplicateError
if errors.As(err, &dupeErr) { if errors.As(err, &dupeErr) {
@ -389,7 +389,7 @@ func (hs *HTTPServer) InstallPlugin(c *models.ReqContext) response.Response {
func (hs *HTTPServer) UninstallPlugin(c *models.ReqContext) response.Response { func (hs *HTTPServer) UninstallPlugin(c *models.ReqContext) response.Response {
pluginID := web.Params(c.Req)[":pluginId"] pluginID := web.Params(c.Req)[":pluginId"]
err := hs.pluginStore.Remove(c.Req.Context(), pluginID) err := hs.pluginManager.Remove(c.Req.Context(), pluginID)
if err != nil { if err != nil {
if errors.Is(err, plugins.ErrPluginNotInstalled) { if errors.Is(err, plugins.ErrPluginNotInstalled) {
return response.Error(http.StatusNotFound, "Plugin not installed", err) return response.Error(http.StatusNotFound, "Plugin not installed", err)

View File

@ -15,6 +15,9 @@ type Store interface {
Plugin(ctx context.Context, pluginID string) (PluginDTO, bool) Plugin(ctx context.Context, pluginID string) (PluginDTO, bool)
// Plugins returns plugins by their requested type. // Plugins returns plugins by their requested type.
Plugins(ctx context.Context, pluginTypes ...Type) []PluginDTO Plugins(ctx context.Context, pluginTypes ...Type) []PluginDTO
}
type Manager interface {
// Add adds a plugin to the store. // Add adds a plugin to the store.
Add(ctx context.Context, pluginID, version string) error Add(ctx context.Context, pluginID, version string) error
// Remove removes a plugin from the store. // Remove removes a plugin from the store.

View File

@ -3,6 +3,7 @@ package registry
import ( import (
"context" "context"
"fmt" "fmt"
"sort"
"testing" "testing"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -213,6 +214,11 @@ func TestInMemory_Plugins(t *testing.T) {
store: tt.mocks.store, store: tt.mocks.store,
} }
result := i.Plugins(context.Background()) result := i.Plugins(context.Background())
// to ensure we can compare with expected
sort.SliceStable(result, func(i, j int) bool {
return result[i].ID < result[j].ID
})
require.Equal(t, tt.expected, result) require.Equal(t, tt.expected, result)
}) })
} }

View File

@ -143,6 +143,7 @@ var wireBasicSet = wire.NewSet(
registry.ProvideService, registry.ProvideService,
wire.Bind(new(registry.Service), new(*registry.InMemory)), wire.Bind(new(registry.Service), new(*registry.InMemory)),
manager.ProvideService, manager.ProvideService,
wire.Bind(new(plugins.Manager), new(*manager.PluginManager)),
wire.Bind(new(plugins.Client), new(*manager.PluginManager)), wire.Bind(new(plugins.Client), new(*manager.PluginManager)),
wire.Bind(new(plugins.Store), new(*manager.PluginManager)), wire.Bind(new(plugins.Store), new(*manager.PluginManager)),
wire.Bind(new(plugins.DashboardFileStore), new(*manager.PluginManager)), wire.Bind(new(plugins.DashboardFileStore), new(*manager.PluginManager)),