func registerFromClientBinary()

in internal/config/plugin/client.go [69:134]


func registerFromClientBinary(
	ctx context.Context,
	reg config.ProviderRegistry,
	settings ClientBinarySettings,
) (func(), error) {
	var stop func()

	errOut := func(err error) (func(), error) {
		if stop != nil {
			stop()
		}
		return func() {}, err
	}

	if err := settings.validate(); err != nil {
		return errOut(err)
	}

	// TODO: move to ui package
	logger := hclog.New(&hclog.LoggerOptions{
		Name:   "k6ctl",
		Level:  hclog.Error,
		Output: io.Discard,
	})

	pluginClient := plugin.NewClient(
		&plugin.ClientConfig{
			// TODO: move to ui package
			// Stderr:          os.Stderr,
			HandshakeConfig: handshakeConfig,
			Plugins: map[string]plugin.Plugin{
				pluginName: &Plugin{},
			},
			// TODO: validate command for security concern
			Cmd:              exec.CommandContext(ctx, settings.Path), // #nosec G204 - expected usage
			AllowedProtocols: []plugin.Protocol{plugin.ProtocolNetRPC},
			Logger:           logger,
		},
	)

	cc, err := pluginClient.Client()
	if err != nil {
		return errOut(err)
	}

	stop = func() {
		pluginClient.Kill()
	}

	raw, err := cc.Dispense(pluginName)
	if err != nil {
		return errOut(err)
	}

	p := raw.(Interface)
	supportedProviderNames, err := p.GetNames()
	if err != nil {
		return errOut(err)
	}

	for _, name := range supportedProviderNames {
		reg.Register(remoteNamespacedConfigProvider(settings.Namespace, name, p))
	}

	return stop, nil
}