Refactoring PluginManager to be a self registering service (#11755)

* refator: refactored PluginManager to be a self registering service, a lot more work needed to fully make plugin manager use instance variables and not so many globals
This commit is contained in:
Torkel Ödegaard
2018-04-27 15:11:55 +02:00
committed by Carl Bergquist
parent 8f29d28572
commit a8eed9d344
8 changed files with 64 additions and 74 deletions

View File

@ -11,8 +11,10 @@ import (
"path/filepath"
"reflect"
"strings"
"time"
"github.com/grafana/grafana/pkg/log"
"github.com/grafana/grafana/pkg/registry"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/util"
)
@ -39,30 +41,12 @@ type PluginManager struct {
log log.Logger
}
func NewPluginManager(ctx context.Context) (*PluginManager, error) {
err := initPlugins(ctx)
if err != nil {
return nil, err
}
return &PluginManager{
log: log.New("plugins"),
}, nil
func init() {
registry.RegisterService(&PluginManager{})
}
func (p *PluginManager) Run(ctx context.Context) error {
<-ctx.Done()
for _, p := range DataSources {
p.Kill()
}
p.log.Info("Stopped Plugins", "reason", ctx.Err())
return ctx.Err()
}
func initPlugins(ctx context.Context) error {
func (pm *PluginManager) Init() error {
pm.log = log.New("plugins")
plog = log.New("plugins")
DataSources = map[string]*DataSourcePlugin{}
@ -76,7 +60,7 @@ func initPlugins(ctx context.Context) error {
"app": AppPlugin{},
}
plog.Info("Starting plugin search")
pm.log.Info("Starting plugin search")
scan(path.Join(setting.StaticRootPath, "app/plugins"))
// check if plugins dir exists
@ -99,13 +83,6 @@ func initPlugins(ctx context.Context) error {
}
for _, ds := range DataSources {
if ds.Backend {
err := ds.initBackendPlugin(ctx, plog)
if err != nil {
plog.Error("Failed to init plugin.", "error", err, "plugin", ds.Id)
}
}
ds.initFrontendPlugin()
}
@ -113,8 +90,40 @@ func initPlugins(ctx context.Context) error {
app.initApp()
}
go StartPluginUpdateChecker()
go updateAppDashboards()
return nil
}
func (pm *PluginManager) startBackendPlugins(ctx context.Context) error {
for _, ds := range DataSources {
if ds.Backend {
if err := ds.startBackendPlugin(ctx, plog); err != nil {
pm.log.Error("Failed to init plugin.", "error", err, "plugin", ds.Id)
}
}
}
return nil
}
func (pm *PluginManager) Run(ctx context.Context) error {
pm.startBackendPlugins(ctx)
pm.updateAppDashboards()
pm.checkForUpdates()
ticker := time.NewTicker(time.Minute * 10)
for {
select {
case <-ticker.C:
pm.checkForUpdates()
case <-ctx.Done():
break
}
}
// kil backend plugins
for _, p := range DataSources {
p.Kill()
}
return nil
}