open-nomad/drivers/docker/docklog/plugin.go
Alex Dadgar 14ed757a56 Plugins use parent loggers
This PR fixes various instances of plugins being launched without using
the parent loggers. This meant that logs would not all go to the same
output, break formatting etc.
2019-01-11 11:36:37 -08:00

101 lines
2.4 KiB
Go

package docklog
import (
"context"
"os/exec"
hclog "github.com/hashicorp/go-hclog"
plugin "github.com/hashicorp/go-plugin"
"github.com/hashicorp/nomad/drivers/docker/docklog/proto"
"github.com/hashicorp/nomad/helper/discover"
"github.com/hashicorp/nomad/plugins/base"
"google.golang.org/grpc"
)
const PluginName = "docker_logger"
// LaunchDockerLogger launches an instance of DockerLogger
func LaunchDockerLogger(logger hclog.Logger) (DockerLogger, *plugin.Client, error) {
logger = logger.Named(PluginName)
bin, err := discover.NomadExecutable()
if err != nil {
return nil, nil, err
}
client := plugin.NewClient(&plugin.ClientConfig{
HandshakeConfig: base.Handshake,
Plugins: map[string]plugin.Plugin{
PluginName: &Plugin{impl: NewDockerLogger(logger)},
},
Cmd: exec.Command(bin, PluginName),
AllowedProtocols: []plugin.Protocol{
plugin.ProtocolGRPC,
},
Logger: logger,
})
rpcClient, err := client.Client()
if err != nil {
return nil, nil, err
}
raw, err := rpcClient.Dispense(PluginName)
if err != nil {
return nil, nil, err
}
l := raw.(DockerLogger)
return l, client, nil
}
func ReattachDockerLogger(reattachCfg *plugin.ReattachConfig) (DockerLogger, *plugin.Client, error) {
client := plugin.NewClient(&plugin.ClientConfig{
HandshakeConfig: base.Handshake,
Plugins: map[string]plugin.Plugin{
PluginName: &Plugin{impl: NewDockerLogger(hclog.L().Named(PluginName))},
},
Reattach: reattachCfg,
AllowedProtocols: []plugin.Protocol{
plugin.ProtocolGRPC,
},
})
rpcClient, err := client.Client()
if err != nil {
return nil, nil, err
}
raw, err := rpcClient.Dispense(PluginName)
if err != nil {
return nil, nil, err
}
l := raw.(DockerLogger)
return l, client, nil
}
// Plugin is the go-plugin implementation
type Plugin struct {
plugin.NetRPCUnsupportedPlugin
impl DockerLogger
}
func NewPlugin(impl DockerLogger) *Plugin {
return &Plugin{impl: impl}
}
// GRPCServer registered the server side implementation with the grpc server
func (p *Plugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Server) error {
proto.RegisterDockerLoggerServer(s, &dockerLoggerServer{
impl: p.impl,
broker: broker,
})
return nil
}
// GRPCClient returns a client side implementation of the plugin
func (p *Plugin) GRPCClient(ctx context.Context, broker *plugin.GRPCBroker, c *grpc.ClientConn) (interface{}, error) {
return &dockerLoggerClient{client: proto.NewDockerLoggerClient(c)}, nil
}