From 7977d6b66964e9d1497875afc92dd65357df933b Mon Sep 17 00:00:00 2001 From: bergquist Date: Fri, 15 Dec 2017 17:17:58 +0100 Subject: [PATCH] merge backend-datasource and datasource type --- pkg/plugins/datasource_plugin.go | 49 ++++++++++++++++++++++++++++++++ pkg/plugins/models.go | 2 ++ pkg/plugins/plugins.go | 23 +++++++-------- 3 files changed, 61 insertions(+), 13 deletions(-) diff --git a/pkg/plugins/datasource_plugin.go b/pkg/plugins/datasource_plugin.go index b36d7081dfe..6863b9a1be5 100644 --- a/pkg/plugins/datasource_plugin.go +++ b/pkg/plugins/datasource_plugin.go @@ -3,7 +3,16 @@ package plugins import ( "encoding/json" "os" + "os/exec" + "path" "path/filepath" + + "github.com/grafana/grafana/pkg/log" + "github.com/grafana/grafana/pkg/models" + "github.com/grafana/grafana/pkg/plugins/backend" + "github.com/grafana/grafana/pkg/tsdb" + shared "github.com/grafana/grafana/pkg/tsdb/models/proxy" + plugin "github.com/hashicorp/go-plugin" ) type DataSourcePlugin struct { @@ -16,6 +25,12 @@ type DataSourcePlugin struct { Mixed bool `json:"mixed,omitempty"` HasQueryHelp bool `json:"hasQueryHelp,omitempty"` Routes []*AppPluginRoute `json:"routes"` + + Backend bool `json:"backend,omitempty"` + Executable string `json:"executable,omitempty"` + + log log.Logger + client *plugin.Client } func (p *DataSourcePlugin) Load(decoder *json.Decoder, pluginDir string) error { @@ -39,3 +54,37 @@ func (p *DataSourcePlugin) Load(decoder *json.Decoder, pluginDir string) error { DataSources[p.Id] = p return nil } + +func (p *DataSourcePlugin) initBackendPlugin(log log.Logger) error { + p.log = log.New("plugin-id", p.Id) + + p.client = plugin.NewClient(&plugin.ClientConfig{ + HandshakeConfig: handshakeConfig, + Plugins: map[string]plugin.Plugin{p.Id: &shared.TsdbPluginImpl{}}, + Cmd: exec.Command(path.Join(p.PluginDir, p.Executable)), + AllowedProtocols: []plugin.Protocol{plugin.ProtocolGRPC}, + Logger: backend.LogWrapper{Logger: p.log}, + }) + + rpcClient, err := p.client.Client() + if err != nil { + return err + } + + raw, err := rpcClient.Dispense(p.Id) + if err != nil { + return err + } + + plugin := raw.(shared.TsdbPlugin) + + tsdb.RegisterTsdbQueryEndpoint(p.Id, func(dsInfo *models.DataSource) (tsdb.TsdbQueryEndpoint, error) { + return &shared.TsdbWrapper{TsdbPlugin: plugin}, nil + }) + + return nil +} + +func (p *DataSourcePlugin) Kill() { + p.client.Kill() +} diff --git a/pkg/plugins/models.go b/pkg/plugins/models.go index 541b37c8a8a..b306fa69cdd 100644 --- a/pkg/plugins/models.go +++ b/pkg/plugins/models.go @@ -41,6 +41,8 @@ type PluginBase struct { HideFromList bool `json:"hideFromList,omitempty"` State string `json:"state,omitempty"` + + IncludedInAppId string `json:"-"` PluginDir string `json:"-"` DefaultNavUrl string `json:"-"` diff --git a/pkg/plugins/plugins.go b/pkg/plugins/plugins.go index 43b55d78b9f..3da5ea52465 100644 --- a/pkg/plugins/plugins.go +++ b/pkg/plugins/plugins.go @@ -70,10 +70,10 @@ func Init() error { Plugins = make(map[string]*PluginBase) BackendDatasources = make(map[string]*BackendDatasource) PluginTypes = map[string]interface{}{ - "panel": PanelPlugin{}, - "datasource": DataSourcePlugin{}, - "app": AppPlugin{}, - "backend-datasource": BackendDatasource{}, + "panel": PanelPlugin{}, + "datasource": DataSourcePlugin{}, + "app": AppPlugin{}, + //"backend-datasource": BackendDatasource{}, } plog.Info("Starting plugin search") @@ -98,20 +98,17 @@ func Init() error { for _, panel := range Panels { panel.initFrontendPlugin() } - for _, panel := range DataSources { - panel.initFrontendPlugin() + for _, ds := range DataSources { + if ds.Backend { + ds.initBackendPlugin(plog) + } + + ds.initFrontendPlugin() } for _, app := range Apps { app.initApp() } - for _, be := range BackendDatasources { - err := be.initBackendPlugin(plog) - if err != nil { - plog.Error("failed to init plugin", "id", be.Id, "error", err) - } - } - go StartPluginUpdateChecker() go updateAppDashboards()