diff --git a/command/commands.go b/command/commands.go index 69c81b39e..37291f8b3 100644 --- a/command/commands.go +++ b/command/commands.go @@ -5,6 +5,7 @@ import ( "os" "github.com/hashicorp/nomad/command/agent" + "github.com/hashicorp/nomad/drivers/docker/docklog" "github.com/hashicorp/nomad/version" "github.com/mitchellh/cli" ) @@ -210,6 +211,11 @@ func Commands(metaPtr *Meta, agentUi cli.Ui) map[string]cli.CommandFactory { Meta: meta, }, nil }, + docklog.PluginName: func() (cli.Command, error) { + return &DockerLoggerPluginCommand{ + Meta: meta, + }, nil + }, "eval": func() (cli.Command, error) { return &EvalCommand{ Meta: meta, diff --git a/command/docker_logger_plugin.go b/command/docker_logger_plugin.go new file mode 100644 index 000000000..4b79fa4a4 --- /dev/null +++ b/command/docker_logger_plugin.go @@ -0,0 +1,36 @@ +package command + +import ( + "strings" + + hclog "github.com/hashicorp/go-hclog" + plugin "github.com/hashicorp/go-plugin" + "github.com/hashicorp/nomad/drivers/docker/docklog" + "github.com/hashicorp/nomad/plugins/base" +) + +type DockerLoggerPluginCommand struct { + Meta +} + +func (e *DockerLoggerPluginCommand) Help() string { + helpText := ` + This is a command used by Nomad internally to launch the docker logger process" + ` + return strings.TrimSpace(helpText) +} + +func (e *DockerLoggerPluginCommand) Synopsis() string { + return "internal - launch a docker logger plugin" +} + +func (e *DockerLoggerPluginCommand) Run(args []string) int { + plugin.Serve(&plugin.ServeConfig{ + HandshakeConfig: base.Handshake, + Plugins: map[string]plugin.Plugin{ + docklog.PluginName: docklog.NewPlugin(docklog.NewDockerLogger(hclog.Default().Named(docklog.PluginName))), + }, + GRPCServer: plugin.DefaultGRPCServer, + }) + return 0 +} diff --git a/drivers/docker/docklog/plugin.go b/drivers/docker/docklog/plugin.go index b44c88146..33ff4af4d 100644 --- a/drivers/docker/docklog/plugin.go +++ b/drivers/docker/docklog/plugin.go @@ -12,12 +12,12 @@ import ( "google.golang.org/grpc" ) -const pluginName = "docker_logger" +const PluginName = "docker_logger" // LaunchDockerLogger launches an instance of DockerLogger // TODO: Integrate with base plugin loader func LaunchDockerLogger(logger hclog.Logger) (DockerLogger, *plugin.Client, error) { - logger = logger.Named(pluginName) + logger = logger.Named(PluginName) bin, err := discover.NomadExecutable() if err != nil { return nil, nil, err @@ -26,9 +26,9 @@ func LaunchDockerLogger(logger hclog.Logger) (DockerLogger, *plugin.Client, erro client := plugin.NewClient(&plugin.ClientConfig{ HandshakeConfig: base.Handshake, Plugins: map[string]plugin.Plugin{ - pluginName: &Plugin{impl: NewDockerLogger(hclog.L().Named(pluginName))}, + PluginName: &Plugin{impl: NewDockerLogger(hclog.L().Named(PluginName))}, }, - Cmd: exec.Command(bin, pluginName), + Cmd: exec.Command(bin, PluginName), AllowedProtocols: []plugin.Protocol{ plugin.ProtocolGRPC, }, @@ -39,7 +39,7 @@ func LaunchDockerLogger(logger hclog.Logger) (DockerLogger, *plugin.Client, erro return nil, nil, err } - raw, err := rpcClient.Dispense(pluginName) + raw, err := rpcClient.Dispense(PluginName) if err != nil { return nil, nil, err } @@ -55,6 +55,10 @@ type Plugin struct { 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{