8aba3aae12
This change upgrades gRPC to 1.6.0 to pick up a few bug fixes. We also use the full address for gRPC endpoints, including the interface name, as otherwise we pick the wrong interface on Linux.
82 lines
2.3 KiB
Go
82 lines
2.3 KiB
Go
// Copyright 2016-2017, Pulumi Corporation. All rights reserved.
|
|
|
|
package plugin
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
pbempty "github.com/golang/protobuf/ptypes/empty"
|
|
"github.com/pkg/errors"
|
|
"golang.org/x/net/context"
|
|
"google.golang.org/grpc"
|
|
|
|
"github.com/pulumi/pulumi-fabric/pkg/diag"
|
|
"github.com/pulumi/pulumi-fabric/pkg/util/rpcutil"
|
|
lumirpc "github.com/pulumi/pulumi-fabric/sdk/proto/go"
|
|
)
|
|
|
|
// hostServer is the server side of the host RPC machinery.
|
|
type hostServer struct {
|
|
host Host // the host for this RPC server.
|
|
ctx *Context // the associated plugin context.
|
|
addr string // the address the host is listening on.
|
|
cancel chan bool // a channel that can cancel the server.
|
|
done chan error // a channel that resolves when the server completes.
|
|
}
|
|
|
|
// newHostServer creates a new host server wired up to the given host and context.
|
|
func newHostServer(host Host, ctx *Context) (*hostServer, error) {
|
|
// New up an engine RPC server.
|
|
engine := &hostServer{
|
|
host: host,
|
|
ctx: ctx,
|
|
cancel: make(chan bool),
|
|
}
|
|
|
|
// Fire up a gRPC server and start listening for incomings.
|
|
port, done, err := rpcutil.Serve(0, engine.cancel, []func(*grpc.Server) error{
|
|
func(srv *grpc.Server) error {
|
|
lumirpc.RegisterEngineServer(srv, engine)
|
|
return nil
|
|
},
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
engine.addr = fmt.Sprintf("0.0.0.0:%d", port)
|
|
engine.done = done
|
|
|
|
return engine, nil
|
|
}
|
|
|
|
// Address returns the address at which the engine's RPC server may be reached.
|
|
func (eng *hostServer) Address() string {
|
|
return eng.addr
|
|
}
|
|
|
|
// Cancel signals that the engine should be terminated, awaits its termination, and returns any errors that result.
|
|
func (eng *hostServer) Cancel() error {
|
|
eng.cancel <- true
|
|
return <-eng.done
|
|
}
|
|
|
|
// Log logs a global message in the engine, including errors and warnings.
|
|
func (eng *hostServer) Log(ctx context.Context,
|
|
req *lumirpc.LogRequest) (*pbempty.Empty, error) {
|
|
var sev diag.Severity
|
|
switch req.Severity {
|
|
case lumirpc.LogSeverity_DEBUG:
|
|
sev = diag.Debug
|
|
case lumirpc.LogSeverity_INFO:
|
|
sev = diag.Info
|
|
case lumirpc.LogSeverity_WARNING:
|
|
sev = diag.Warning
|
|
case lumirpc.LogSeverity_ERROR:
|
|
sev = diag.Error
|
|
default:
|
|
return nil, errors.Errorf("Unrecognized logging severity: %v", req.Severity)
|
|
}
|
|
eng.host.Log(sev, req.Message)
|
|
return &pbempty.Empty{}, nil
|
|
}
|