mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-26 00:41:27 -06:00
67 lines
2.0 KiB
Go
67 lines
2.0 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package plugin6
|
|
|
|
import (
|
|
"github.com/hashicorp/go-plugin"
|
|
proto "github.com/opentofu/opentofu/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
|
|
}
|