github.com/hashicorp/vault/sdk@v0.13.0/plugin/backend.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: MPL-2.0
     3  
     4  package plugin
     5  
     6  import (
     7  	"context"
     8  	"sync/atomic"
     9  
    10  	log "github.com/hashicorp/go-hclog"
    11  	"github.com/hashicorp/go-plugin"
    12  	"github.com/hashicorp/vault/sdk/helper/pluginutil"
    13  	"github.com/hashicorp/vault/sdk/logical"
    14  	"github.com/hashicorp/vault/sdk/plugin/pb"
    15  	"google.golang.org/grpc"
    16  )
    17  
    18  var (
    19  	_ plugin.Plugin     = (*GRPCBackendPlugin)(nil)
    20  	_ plugin.GRPCPlugin = (*GRPCBackendPlugin)(nil)
    21  )
    22  
    23  // GRPCBackendPlugin is the plugin.Plugin implementation that only supports GRPC
    24  // transport
    25  type GRPCBackendPlugin struct {
    26  	Factory      logical.Factory
    27  	MetadataMode bool
    28  	Logger       log.Logger
    29  
    30  	MultiplexingSupport bool
    31  
    32  	// Embeding this will disable the netRPC protocol
    33  	plugin.NetRPCUnsupportedPlugin
    34  }
    35  
    36  func (b GRPCBackendPlugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Server) error {
    37  	server := backendGRPCPluginServer{
    38  		broker:    broker,
    39  		factory:   b.Factory,
    40  		instances: make(map[string]backendInstance),
    41  		// We pass the logger down into the backend so go-plugin will
    42  		// forward logs for us.
    43  		logger: b.Logger,
    44  	}
    45  
    46  	if b.MultiplexingSupport {
    47  		// Multiplexing is enabled for this plugin, register the server so we
    48  		// can tell the client in Vault.
    49  		pluginutil.RegisterPluginMultiplexingServer(s, pluginutil.PluginMultiplexingServerImpl{
    50  			Supported: true,
    51  		})
    52  		server.multiplexingSupport = true
    53  	}
    54  
    55  	pb.RegisterBackendServer(s, &server)
    56  	logical.RegisterPluginVersionServer(s, &server)
    57  	return nil
    58  }
    59  
    60  func (b *GRPCBackendPlugin) GRPCClient(ctx context.Context, broker *plugin.GRPCBroker, c *grpc.ClientConn) (interface{}, error) {
    61  	ret := &backendGRPCPluginClient{
    62  		client:        pb.NewBackendClient(c),
    63  		versionClient: logical.NewPluginVersionClient(c),
    64  		broker:        broker,
    65  		cleanupCh:     make(chan struct{}),
    66  		doneCtx:       ctx,
    67  		metadataMode:  b.MetadataMode,
    68  	}
    69  
    70  	// Create the value and set the type
    71  	ret.server = new(atomic.Value)
    72  	ret.server.Store((*grpc.Server)(nil))
    73  
    74  	return ret, nil
    75  }