// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package cloudplugin1 import ( "context" "errors" "net/rpc" "github.com/hashicorp/go-plugin" "github.com/hashicorp/terraform/internal/cloudplugin/cloudproto1" "github.com/hashicorp/terraform/internal/pluginshared" "google.golang.org/grpc" "google.golang.org/grpc/metadata" ) // GRPCCloudPlugin is the go-plugin implementation, but only the client // implementation exists in this package. type GRPCCloudPlugin struct { plugin.GRPCPlugin Impl pluginshared.CustomPluginClient // Any configuration metadata that the plugin executable needs in order to // do something useful, which will be passed along via gRPC metadata headers. Metadata metadata.MD } // Server always returns an error; we're only implementing the GRPCPlugin // interface, not the Plugin interface. func (p *GRPCCloudPlugin) Server(*plugin.MuxBroker) (interface{}, error) { return nil, errors.New("cloudplugin only implements gRPC clients") } // Client always returns an error; we're only implementing the GRPCPlugin // interface, not the Plugin interface. func (p *GRPCCloudPlugin) Client(*plugin.MuxBroker, *rpc.Client) (interface{}, error) { return nil, errors.New("cloudplugin only implements gRPC clients") } // GRPCServer always returns an error; we're only implementing the client // interface, not the server. func (p *GRPCCloudPlugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Server) error { return errors.New("cloudplugin only implements gRPC clients") } // GRPCClient returns a new GRPC client for interacting with the cloud plugin server. func (p *GRPCCloudPlugin) GRPCClient(ctx context.Context, broker *plugin.GRPCBroker, c *grpc.ClientConn) (interface{}, error) { ctx = metadata.NewOutgoingContext(ctx, p.Metadata) return &GRPCCloudClient{ client: cloudproto1.NewCommandServiceClient(c), context: ctx, }, nil }