github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/client/logmon/plugin.go (about)

     1  package logmon
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"os/exec"
     7  
     8  	hclog "github.com/hashicorp/go-hclog"
     9  	plugin "github.com/hashicorp/go-plugin"
    10  	"github.com/hashicorp/nomad/client/logmon/proto"
    11  	"github.com/hashicorp/nomad/plugins/base"
    12  	"google.golang.org/grpc"
    13  )
    14  
    15  // LaunchLogMon launches a new logmon or reattaches to an existing one.
    16  // TODO: Integrate with base plugin loader
    17  func LaunchLogMon(logger hclog.Logger, reattachConfig *plugin.ReattachConfig) (LogMon, *plugin.Client, error) {
    18  	logger = logger.Named("logmon")
    19  	bin, err := os.Executable()
    20  	if err != nil {
    21  		return nil, nil, err
    22  	}
    23  
    24  	conf := &plugin.ClientConfig{
    25  		HandshakeConfig: base.Handshake,
    26  		Plugins: map[string]plugin.Plugin{
    27  			"logmon": &Plugin{},
    28  		},
    29  		AllowedProtocols: []plugin.Protocol{
    30  			plugin.ProtocolGRPC,
    31  		},
    32  		Logger: logger,
    33  	}
    34  
    35  	// Only set one of Cmd or Reattach
    36  	if reattachConfig == nil {
    37  		conf.Cmd = exec.Command(bin, "logmon")
    38  	} else {
    39  		conf.Reattach = reattachConfig
    40  	}
    41  
    42  	client := plugin.NewClient(conf)
    43  
    44  	rpcClient, err := client.Client()
    45  	if err != nil {
    46  		return nil, nil, err
    47  	}
    48  
    49  	raw, err := rpcClient.Dispense("logmon")
    50  	if err != nil {
    51  		return nil, nil, err
    52  	}
    53  
    54  	l := raw.(LogMon)
    55  	return l, client, nil
    56  }
    57  
    58  type Plugin struct {
    59  	plugin.NetRPCUnsupportedPlugin
    60  	impl LogMon
    61  }
    62  
    63  func NewPlugin(i LogMon) plugin.Plugin {
    64  	return &Plugin{impl: i}
    65  }
    66  
    67  func (p *Plugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Server) error {
    68  	proto.RegisterLogMonServer(s, &logmonServer{
    69  		impl:   p.impl,
    70  		broker: broker,
    71  	})
    72  	return nil
    73  }
    74  
    75  func (p *Plugin) GRPCClient(ctx context.Context, broker *plugin.GRPCBroker, c *grpc.ClientConn) (interface{}, error) {
    76  	return &logmonClient{
    77  		doneCtx: ctx,
    78  		client:  proto.NewLogMonClient(c),
    79  	}, nil
    80  }