github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/plugin/serve.go (about)

     1  package plugin
     2  
     3  import (
     4  	"github.com/hashicorp/go-plugin"
     5  	"github.com/hashicorp/terraform/terraform"
     6  )
     7  
     8  // The constants below are the names of the plugins that can be dispensed
     9  // from the plugin server.
    10  const (
    11  	ProviderPluginName    = "provider"
    12  	ProvisionerPluginName = "provisioner"
    13  )
    14  
    15  // Handshake is the HandshakeConfig used to configure clients and servers.
    16  var Handshake = plugin.HandshakeConfig{
    17  	// The ProtocolVersion is the version that must match between TF core
    18  	// and TF plugins. This should be bumped whenever a change happens in
    19  	// one or the other that makes it so that they can't safely communicate.
    20  	// This could be adding a new interface value, it could be how
    21  	// helper/schema computes diffs, etc.
    22  	ProtocolVersion: 4,
    23  
    24  	// The magic cookie values should NEVER be changed.
    25  	MagicCookieKey:   "TF_PLUGIN_MAGIC_COOKIE",
    26  	MagicCookieValue: "d602bf8f470bc67ca7faa0386276bbdd4330efaf76d1a219cb4d6991ca9872b2",
    27  }
    28  
    29  type ProviderFunc func() terraform.ResourceProvider
    30  type ProvisionerFunc func() terraform.ResourceProvisioner
    31  
    32  // ServeOpts are the configurations to serve a plugin.
    33  type ServeOpts struct {
    34  	ProviderFunc    ProviderFunc
    35  	ProvisionerFunc ProvisionerFunc
    36  }
    37  
    38  // Serve serves a plugin. This function never returns and should be the final
    39  // function called in the main function of the plugin.
    40  func Serve(opts *ServeOpts) {
    41  	plugin.Serve(&plugin.ServeConfig{
    42  		HandshakeConfig: Handshake,
    43  		Plugins:         pluginMap(opts),
    44  	})
    45  }
    46  
    47  // pluginMap returns the map[string]plugin.Plugin to use for configuring a plugin
    48  // server or client.
    49  func pluginMap(opts *ServeOpts) map[string]plugin.Plugin {
    50  	return map[string]plugin.Plugin{
    51  		"provider":    &ResourceProviderPlugin{F: opts.ProviderFunc},
    52  		"provisioner": &ResourceProvisionerPlugin{F: opts.ProvisionerFunc},
    53  	}
    54  }