github.com/ilhicas/nomad@v0.11.8/drivers/docker/docklog/plugin.go (about)

     1  package docklog
     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/drivers/docker/docklog/proto"
    11  	"github.com/hashicorp/nomad/plugins/base"
    12  	"google.golang.org/grpc"
    13  )
    14  
    15  const PluginName = "docker_logger"
    16  
    17  // LaunchDockerLogger launches an instance of DockerLogger
    18  func LaunchDockerLogger(logger hclog.Logger) (DockerLogger, *plugin.Client, error) {
    19  	logger = logger.Named(PluginName)
    20  	bin, err := os.Executable()
    21  	if err != nil {
    22  		return nil, nil, err
    23  	}
    24  
    25  	client := plugin.NewClient(&plugin.ClientConfig{
    26  		HandshakeConfig: base.Handshake,
    27  		Plugins: map[string]plugin.Plugin{
    28  			PluginName: &Plugin{impl: NewDockerLogger(logger)},
    29  		},
    30  		Cmd: exec.Command(bin, PluginName),
    31  		AllowedProtocols: []plugin.Protocol{
    32  			plugin.ProtocolGRPC,
    33  		},
    34  		Logger: logger,
    35  	})
    36  
    37  	rpcClient, err := client.Client()
    38  	if err != nil {
    39  		return nil, nil, err
    40  	}
    41  
    42  	raw, err := rpcClient.Dispense(PluginName)
    43  	if err != nil {
    44  		return nil, nil, err
    45  	}
    46  
    47  	l := raw.(DockerLogger)
    48  	return l, client, nil
    49  
    50  }
    51  
    52  func ReattachDockerLogger(reattachCfg *plugin.ReattachConfig) (DockerLogger, *plugin.Client, error) {
    53  	client := plugin.NewClient(&plugin.ClientConfig{
    54  		HandshakeConfig: base.Handshake,
    55  		Plugins: map[string]plugin.Plugin{
    56  			PluginName: &Plugin{impl: NewDockerLogger(hclog.L().Named(PluginName))},
    57  		},
    58  		Reattach: reattachCfg,
    59  		AllowedProtocols: []plugin.Protocol{
    60  			plugin.ProtocolGRPC,
    61  		},
    62  	})
    63  
    64  	rpcClient, err := client.Client()
    65  	if err != nil {
    66  		return nil, nil, err
    67  	}
    68  
    69  	raw, err := rpcClient.Dispense(PluginName)
    70  	if err != nil {
    71  		return nil, nil, err
    72  	}
    73  
    74  	l := raw.(DockerLogger)
    75  	return l, client, nil
    76  }
    77  
    78  // Plugin is the go-plugin implementation
    79  type Plugin struct {
    80  	plugin.NetRPCUnsupportedPlugin
    81  	impl DockerLogger
    82  }
    83  
    84  func NewPlugin(impl DockerLogger) *Plugin {
    85  	return &Plugin{impl: impl}
    86  }
    87  
    88  // GRPCServer registered the server side implementation with the grpc server
    89  func (p *Plugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Server) error {
    90  	proto.RegisterDockerLoggerServer(s, &dockerLoggerServer{
    91  		impl:   p.impl,
    92  		broker: broker,
    93  	})
    94  	return nil
    95  }
    96  
    97  // GRPCClient returns a client side implementation of the plugin
    98  func (p *Plugin) GRPCClient(ctx context.Context, broker *plugin.GRPCBroker, c *grpc.ClientConn) (interface{}, error) {
    99  	return &dockerLoggerClient{client: proto.NewDockerLoggerClient(c)}, nil
   100  }