[v10.1.x] Licensing: Pass func to update env variables when starting plugin (#74678)
Licensing: Pass func to update env variables when starting plugin (#74620)
(cherry picked from commit 5e0b20266e)
This commit is contained in:
@@ -6,4 +6,4 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// PluginFactoryFunc is a function type for creating a Plugin.
|
// PluginFactoryFunc is a function type for creating a Plugin.
|
||||||
type PluginFactoryFunc func(pluginID string, logger log.Logger, env []string) (Plugin, error)
|
type PluginFactoryFunc func(pluginID string, logger log.Logger, env func() []string) (Plugin, error)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ type corePlugin struct {
|
|||||||
|
|
||||||
// New returns a new backendplugin.PluginFactoryFunc for creating a core (built-in) backendplugin.Plugin.
|
// New returns a new backendplugin.PluginFactoryFunc for creating a core (built-in) backendplugin.Plugin.
|
||||||
func New(opts backend.ServeOpts) backendplugin.PluginFactoryFunc {
|
func New(opts backend.ServeOpts) backendplugin.PluginFactoryFunc {
|
||||||
return func(pluginID string, logger log.Logger, env []string) (backendplugin.Plugin, error) {
|
return func(pluginID string, logger log.Logger, _ func() []string) (backendplugin.Plugin, error) {
|
||||||
return &corePlugin{
|
return &corePlugin{
|
||||||
pluginID: pluginID,
|
pluginID: pluginID,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
|
|||||||
@@ -33,12 +33,12 @@ type grpcPlugin struct {
|
|||||||
|
|
||||||
// newPlugin allocates and returns a new gRPC (external) backendplugin.Plugin.
|
// newPlugin allocates and returns a new gRPC (external) backendplugin.Plugin.
|
||||||
func newPlugin(descriptor PluginDescriptor) backendplugin.PluginFactoryFunc {
|
func newPlugin(descriptor PluginDescriptor) backendplugin.PluginFactoryFunc {
|
||||||
return func(pluginID string, logger log.Logger, env []string) (backendplugin.Plugin, error) {
|
return func(pluginID string, logger log.Logger, env func() []string) (backendplugin.Plugin, error) {
|
||||||
return &grpcPlugin{
|
return &grpcPlugin{
|
||||||
descriptor: descriptor,
|
descriptor: descriptor,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
clientFactory: func() *plugin.Client {
|
clientFactory: func() *plugin.Client {
|
||||||
return plugin.NewClient(newClientConfig(descriptor.executablePath, env, logger, descriptor.versionedPlugins))
|
return plugin.NewClient(newClientConfig(descriptor.executablePath, env(), logger, descriptor.versionedPlugins))
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -290,7 +290,7 @@ func NewFakeBackendProcessProvider() *FakeBackendProcessProvider {
|
|||||||
}
|
}
|
||||||
f.BackendFactoryFunc = func(ctx context.Context, p *plugins.Plugin) backendplugin.PluginFactoryFunc {
|
f.BackendFactoryFunc = func(ctx context.Context, p *plugins.Plugin) backendplugin.PluginFactoryFunc {
|
||||||
f.Requested[p.ID]++
|
f.Requested[p.ID]++
|
||||||
return func(pluginID string, _ log.Logger, _ []string) (backendplugin.Plugin, error) {
|
return func(pluginID string, _ log.Logger, _ func() []string) (backendplugin.Plugin, error) {
|
||||||
f.Invoked[pluginID]++
|
f.Invoked[pluginID]++
|
||||||
return &FakePluginClient{}, nil
|
return &FakePluginClient{}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,11 +28,18 @@ func (i *Initializer) Initialize(ctx context.Context, p *plugins.Plugin) error {
|
|||||||
return errors.New("could not find backend factory for plugin")
|
return errors.New("could not find backend factory for plugin")
|
||||||
}
|
}
|
||||||
|
|
||||||
env, err := i.envVarProvider.Get(ctx, p)
|
// this will ensure that the env variables are calculated every time a plugin is started
|
||||||
if err != nil {
|
envFunc := func() []string {
|
||||||
return err
|
// envvar.Get actually never returns any error, safe to skip
|
||||||
|
vars, err := i.envVarProvider.Get(ctx, p)
|
||||||
|
// logging just in case
|
||||||
|
if err != nil {
|
||||||
|
p.Logger().Error("error building env variables", "err", err)
|
||||||
|
}
|
||||||
|
return vars
|
||||||
}
|
}
|
||||||
if backendClient, err := backendFactory(p.ID, p.Logger(), env); err != nil {
|
|
||||||
|
if backendClient, err := backendFactory(p.ID, p.Logger(), envFunc); err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
p.RegisterClient(backendClient)
|
p.RegisterClient(backendClient)
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ type fakeBackendProvider struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *fakeBackendProvider) BackendFactory(_ context.Context, _ *plugins.Plugin) backendplugin.PluginFactoryFunc {
|
func (f *fakeBackendProvider) BackendFactory(_ context.Context, _ *plugins.Plugin) backendplugin.PluginFactoryFunc {
|
||||||
return func(_ string, _ log.Logger, _ []string) (backendplugin.Plugin, error) {
|
return func(_ string, _ log.Logger, _ func() []string) (backendplugin.Plugin, error) {
|
||||||
return f.plugin, nil
|
return f.plugin, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1047,7 +1047,7 @@ func TestLoader_Load_SkipUninitializedPlugins(t *testing.T) {
|
|||||||
procPrvdr := fakes.NewFakeBackendProcessProvider()
|
procPrvdr := fakes.NewFakeBackendProcessProvider()
|
||||||
// Cause an initialization error
|
// Cause an initialization error
|
||||||
procPrvdr.BackendFactoryFunc = func(ctx context.Context, p *plugins.Plugin) backendplugin.PluginFactoryFunc {
|
procPrvdr.BackendFactoryFunc = func(ctx context.Context, p *plugins.Plugin) backendplugin.PluginFactoryFunc {
|
||||||
return func(pluginID string, _ log.Logger, _ []string) (backendplugin.Plugin, error) {
|
return func(pluginID string, _ log.Logger, _ func() []string) (backendplugin.Plugin, error) {
|
||||||
if pluginID == "test-datasource" {
|
if pluginID == "test-datasource" {
|
||||||
return nil, errors.New("failed to initialize")
|
return nil, errors.New("failed to initialize")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user