mirror of
https://github.com/grafana/grafana.git
synced 2025-07-29 21:22:15 +08:00
Plugins: Move backend plugin manager to service (#21474)
Moves backend plugin manager to service instead of global functions in backendplugin package. Closes #20053
This commit is contained in:

committed by
GitHub

parent
bb849d53bf
commit
1a810ebfe4
98
pkg/plugins/backendplugin/backend_plugin.go
Normal file
98
pkg/plugins/backendplugin/backend_plugin.go
Normal file
@ -0,0 +1,98 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user