ProvisioningService: Change the ProvisioningService interface for easier extension (#32910)

* Made a public constructor in order to instantiate it from the service override

* Removed unused plugins.DataRequestHandler

* Added a Run and RunInitProvisioners methods that can be run from Enterprise

* Adding a mock for Run and RunInitProvisioners as well
This commit is contained in:
gamab 2021-04-21 13:41:34 +02:00 committed by GitHub
parent 63e2977837
commit a151dfaa04
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 49 additions and 17 deletions

View File

@ -9,7 +9,6 @@ import (
"github.com/grafana/grafana/pkg/dashboards" "github.com/grafana/grafana/pkg/dashboards"
"github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/util/errutil" "github.com/grafana/grafana/pkg/util/errutil"
) )
@ -24,7 +23,7 @@ type DashboardProvisioner interface {
} }
// DashboardProvisionerFactory creates DashboardProvisioners based on input // DashboardProvisionerFactory creates DashboardProvisioners based on input
type DashboardProvisionerFactory func(string, dashboards.Store, plugins.DataRequestHandler) (DashboardProvisioner, error) type DashboardProvisionerFactory func(string, dashboards.Store) (DashboardProvisioner, error)
// Provisioner is responsible for syncing dashboard from disk to Grafana's database. // Provisioner is responsible for syncing dashboard from disk to Grafana's database.
type Provisioner struct { type Provisioner struct {
@ -34,7 +33,7 @@ type Provisioner struct {
} }
// New returns a new DashboardProvisioner // New returns a new DashboardProvisioner
func New(configDirectory string, store dashboards.Store, reqHandler plugins.DataRequestHandler) (DashboardProvisioner, error) { func New(configDirectory string, store dashboards.Store) (DashboardProvisioner, error) {
logger := log.New("provisioning.dashboard") logger := log.New("provisioning.dashboard")
cfgReader := &configReader{path: configDirectory, log: logger} cfgReader := &configReader{path: configDirectory, log: logger}
configs, err := cfgReader.readConfig() configs, err := cfgReader.readConfig()

View File

@ -18,6 +18,8 @@ import (
) )
type ProvisioningService interface { type ProvisioningService interface {
registry.BackgroundService
RunInitProvisioners() error
ProvisionDatasources() error ProvisionDatasources() error
ProvisionPlugins() error ProvisionPlugins() error
ProvisionNotifications() error ProvisionNotifications() error
@ -28,17 +30,24 @@ type ProvisioningService interface {
func init() { func init() {
registry.Register(&registry.Descriptor{ registry.Register(&registry.Descriptor{
Name: "ProvisioningService", Name: "ProvisioningService",
Instance: newProvisioningServiceImpl( Instance: NewProvisioningServiceImpl(),
dashboards.New,
notifiers.Provision,
datasources.Provision,
plugins.Provision,
),
InitPriority: registry.Low, InitPriority: registry.Low,
}) })
} }
// Add a public constructor for overriding service to be able to instantiate OSS as fallback
func NewProvisioningServiceImpl() *provisioningServiceImpl {
return &provisioningServiceImpl{
log: log.New("provisioning"),
newDashboardProvisioner: dashboards.New,
provisionNotifiers: notifiers.Provision,
provisionDatasources: datasources.Provision,
provisionPlugins: plugins.Provision,
}
}
// Used for testing purposes
func newProvisioningServiceImpl( func newProvisioningServiceImpl(
newDashboardProvisioner dashboards.DashboardProvisionerFactory, newDashboardProvisioner dashboards.DashboardProvisionerFactory,
provisionNotifiers func(string) error, provisionNotifiers func(string) error,
@ -55,10 +64,9 @@ func newProvisioningServiceImpl(
} }
type provisioningServiceImpl struct { type provisioningServiceImpl struct {
Cfg *setting.Cfg `inject:""` Cfg *setting.Cfg `inject:""`
RequestHandler plugifaces.DataRequestHandler `inject:""` SQLStore *sqlstore.SQLStore `inject:""`
SQLStore *sqlstore.SQLStore `inject:""` PluginManager plugifaces.Manager `inject:""`
PluginManager plugifaces.Manager `inject:""`
log log.Logger log log.Logger
pollingCtxCancel context.CancelFunc pollingCtxCancel context.CancelFunc
newDashboardProvisioner dashboards.DashboardProvisionerFactory newDashboardProvisioner dashboards.DashboardProvisionerFactory
@ -70,6 +78,10 @@ type provisioningServiceImpl struct {
} }
func (ps *provisioningServiceImpl) Init() error { func (ps *provisioningServiceImpl) Init() error {
return ps.RunInitProvisioners()
}
func (ps *provisioningServiceImpl) RunInitProvisioners() error {
err := ps.ProvisionDatasources() err := ps.ProvisionDatasources()
if err != nil { if err != nil {
return err return err
@ -137,7 +149,7 @@ func (ps *provisioningServiceImpl) ProvisionNotifications() error {
func (ps *provisioningServiceImpl) ProvisionDashboards() error { func (ps *provisioningServiceImpl) ProvisionDashboards() error {
dashboardPath := filepath.Join(ps.Cfg.ProvisioningPath, "dashboards") dashboardPath := filepath.Join(ps.Cfg.ProvisioningPath, "dashboards")
dashProvisioner, err := ps.newDashboardProvisioner(dashboardPath, ps.SQLStore, ps.RequestHandler) dashProvisioner, err := ps.newDashboardProvisioner(dashboardPath, ps.SQLStore)
if err != nil { if err != nil {
return errutil.Wrap("Failed to create provisioner", err) return errutil.Wrap("Failed to create provisioner", err)
} }

View File

@ -1,22 +1,28 @@
package provisioning package provisioning
import "context"
type Calls struct { type Calls struct {
RunInitProvisioners []interface{}
ProvisionDatasources []interface{} ProvisionDatasources []interface{}
ProvisionPlugins []interface{} ProvisionPlugins []interface{}
ProvisionNotifications []interface{} ProvisionNotifications []interface{}
ProvisionDashboards []interface{} ProvisionDashboards []interface{}
GetDashboardProvisionerResolvedPath []interface{} GetDashboardProvisionerResolvedPath []interface{}
GetAllowUIUpdatesFromConfig []interface{} GetAllowUIUpdatesFromConfig []interface{}
Run []interface{}
} }
type ProvisioningServiceMock struct { type ProvisioningServiceMock struct {
Calls *Calls Calls *Calls
RunInitProvisionersFunc func() error
ProvisionDatasourcesFunc func() error ProvisionDatasourcesFunc func() error
ProvisionPluginsFunc func() error ProvisionPluginsFunc func() error
ProvisionNotificationsFunc func() error ProvisionNotificationsFunc func() error
ProvisionDashboardsFunc func() error ProvisionDashboardsFunc func() error
GetDashboardProvisionerResolvedPathFunc func(name string) string GetDashboardProvisionerResolvedPathFunc func(name string) string
GetAllowUIUpdatesFromConfigFunc func(name string) bool GetAllowUIUpdatesFromConfigFunc func(name string) bool
RunFunc func(ctx context.Context) error
} }
func NewProvisioningServiceMock() *ProvisioningServiceMock { func NewProvisioningServiceMock() *ProvisioningServiceMock {
@ -25,6 +31,14 @@ func NewProvisioningServiceMock() *ProvisioningServiceMock {
} }
} }
func (mock *ProvisioningServiceMock) RunInitProvisioners() error {
mock.Calls.RunInitProvisioners = append(mock.Calls.RunInitProvisioners, nil)
if mock.RunInitProvisionersFunc != nil {
return mock.RunInitProvisionersFunc()
}
return nil
}
func (mock *ProvisioningServiceMock) ProvisionDatasources() error { func (mock *ProvisioningServiceMock) ProvisionDatasources() error {
mock.Calls.ProvisionDatasources = append(mock.Calls.ProvisionDatasources, nil) mock.Calls.ProvisionDatasources = append(mock.Calls.ProvisionDatasources, nil)
if mock.ProvisionDatasourcesFunc != nil { if mock.ProvisionDatasourcesFunc != nil {
@ -72,3 +86,11 @@ func (mock *ProvisioningServiceMock) GetAllowUIUpdatesFromConfig(name string) bo
} }
return false return false
} }
func (mock *ProvisioningServiceMock) Run(ctx context.Context) error {
mock.Calls.Run = append(mock.Calls.Run, nil)
if mock.RunFunc != nil {
return mock.RunFunc(ctx)
}
return nil
}

View File

@ -7,7 +7,6 @@ import (
"time" "time"
dboards "github.com/grafana/grafana/pkg/dashboards" dboards "github.com/grafana/grafana/pkg/dashboards"
plugifaces "github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/services/provisioning/dashboards" "github.com/grafana/grafana/pkg/services/provisioning/dashboards"
"github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/setting"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -93,7 +92,7 @@ func setup() *serviceTestStruct {
} }
serviceTest.service = newProvisioningServiceImpl( serviceTest.service = newProvisioningServiceImpl(
func(string, dboards.Store, plugifaces.DataRequestHandler) (dashboards.DashboardProvisioner, error) { func(string, dboards.Store) (dashboards.DashboardProvisioner, error) {
return serviceTest.mock, nil return serviceTest.mock, nil
}, },
nil, nil,