mirror of
https://github.com/grafana/grafana.git
synced 2025-07-30 09:52:34 +08:00

Moves backend plugin manager to service instead of global functions in backendplugin package. Closes #20053
99 lines
2.1 KiB
Go
99 lines
2.1 KiB
Go
package backendplugin
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
datasourceV1 "github.com/grafana/grafana-plugin-model/go/datasource"
|
|
rendererV1 "github.com/grafana/grafana-plugin-model/go/renderer"
|
|
backend "github.com/grafana/grafana-plugin-sdk-go/backend"
|
|
"github.com/grafana/grafana/pkg/infra/log"
|
|
plugin "github.com/hashicorp/go-plugin"
|
|
)
|
|
|
|
// BackendPlugin a registered backend plugin.
|
|
type BackendPlugin struct {
|
|
id string
|
|
executablePath string
|
|
managed bool
|
|
clientFactory func() *plugin.Client
|
|
client *plugin.Client
|
|
logger log.Logger
|
|
startFns PluginStartFuncs
|
|
}
|
|
|
|
func (p *BackendPlugin) start(ctx context.Context) error {
|
|
p.client = p.clientFactory()
|
|
rpcClient, err := p.client.Client()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var legacyClient *LegacyClient
|
|
var client *Client
|
|
|
|
if p.client.NegotiatedVersion() > 1 {
|
|
rawBackend, err := rpcClient.Dispense("backend")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
rawTransform, err := rpcClient.Dispense("transform")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
client = &Client{}
|
|
if rawBackend != nil {
|
|
if plugin, ok := rawBackend.(backend.BackendPlugin); ok {
|
|
client.BackendPlugin = plugin
|
|
}
|
|
}
|
|
|
|
if rawTransform != nil {
|
|
if plugin, ok := rawTransform.(backend.TransformPlugin); ok {
|
|
client.TransformPlugin = plugin
|
|
}
|
|
}
|
|
} else {
|
|
raw, err := rpcClient.Dispense(p.id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
legacyClient = &LegacyClient{}
|
|
if plugin, ok := raw.(datasourceV1.DatasourcePlugin); ok {
|
|
legacyClient.DatasourcePlugin = plugin
|
|
}
|
|
|
|
if plugin, ok := raw.(rendererV1.RendererPlugin); ok {
|
|
legacyClient.RendererPlugin = plugin
|
|
}
|
|
}
|
|
|
|
if legacyClient == nil && client == nil {
|
|
return errors.New("no compatible plugin implementation found")
|
|
}
|
|
|
|
if legacyClient != nil && p.startFns.OnLegacyStart != nil {
|
|
if err := p.startFns.OnLegacyStart(p.id, legacyClient, p.logger); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if client != nil && p.startFns.OnStart != nil {
|
|
if err := p.startFns.OnStart(p.id, client, p.logger); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (p *BackendPlugin) stop() error {
|
|
if p.client != nil {
|
|
p.client.Kill()
|
|
}
|
|
return nil
|
|
}
|