opentofu/internal/plugin6/serve.go
Martin Atkins b40a4fb741 Move plugin/ and plugin6/ to internal/plugin{,6}/
This is part of a general effort to move all of Terraform's non-library
package surface under internal in order to reinforce that these are for
internal use within Terraform only.

If you were previously importing packages under this prefix into an
external codebase, you could pin to an earlier release tag as an interim
solution until you've make a plan to achieve the same functionality some
other way.
2021-05-17 14:09:07 -07:00

64 lines
1.9 KiB
Go

package plugin6
import (
"github.com/hashicorp/go-plugin"
proto "github.com/hashicorp/terraform/internal/tfplugin6"
)
const (
// The constants below are the names of the plugins that can be dispensed
// from the plugin server.
ProviderPluginName = "provider"
// DefaultProtocolVersion is the protocol version assumed for legacy clients
// that don't specify a particular version during their handshake. Since we
// explicitly set VersionedPlugins in Serve, this number does not need to
// change with the protocol version and can effectively stay 4 forever
// (unless we need the "biggest hammer" approach to break all provider
// compatibility).
DefaultProtocolVersion = 4
)
// Handshake is the HandshakeConfig used to configure clients and servers.
var Handshake = plugin.HandshakeConfig{
// The ProtocolVersion is the version that must match between TF core
// and TF plugins.
ProtocolVersion: DefaultProtocolVersion,
// The magic cookie values should NEVER be changed.
MagicCookieKey: "TF_PLUGIN_MAGIC_COOKIE",
MagicCookieValue: "d602bf8f470bc67ca7faa0386276bbdd4330efaf76d1a219cb4d6991ca9872b2",
}
type GRPCProviderFunc func() proto.ProviderServer
// ServeOpts are the configurations to serve a plugin.
type ServeOpts struct {
GRPCProviderFunc GRPCProviderFunc
}
// Serve serves a plugin. This function never returns and should be the final
// function called in the main function of the plugin.
func Serve(opts *ServeOpts) {
plugin.Serve(&plugin.ServeConfig{
HandshakeConfig: Handshake,
VersionedPlugins: pluginSet(opts),
GRPCServer: plugin.DefaultGRPCServer,
})
}
func pluginSet(opts *ServeOpts) map[int]plugin.PluginSet {
plugins := map[int]plugin.PluginSet{}
// add the new protocol versions if they're configured
if opts.GRPCProviderFunc != nil {
plugins[6] = plugin.PluginSet{}
if opts.GRPCProviderFunc != nil {
plugins[6]["provider"] = &GRPCProviderPlugin{
GRPCProvider: opts.GRPCProviderFunc,
}
}
}
return plugins
}