// 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 }