github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/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 }