From 323975d50094214dcd2c2d2a046decb5a0fe2c29 Mon Sep 17 00:00:00 2001 From: Diptanu Choudhury Date: Tue, 29 Mar 2016 16:27:31 -0700 Subject: [PATCH 1/2] Added the Version method to executor --- client/driver/docker.go | 2 ++ client/driver/exec.go | 1 + client/driver/executor/executor.go | 6 ++++++ client/driver/executor_plugin.go | 17 ++++++++++++++++- client/driver/java.go | 2 ++ client/driver/qemu.go | 5 +++-- client/driver/raw_exec.go | 6 ++++-- client/driver/rkt.go | 5 +++-- 8 files changed, 37 insertions(+), 7 deletions(-) diff --git a/client/driver/docker.go b/client/driver/docker.go index d050e664e..752c8941b 100644 --- a/client/driver/docker.go +++ b/client/driver/docker.go @@ -700,6 +700,8 @@ func (d *DockerDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, er return nil, err } + d.logger.Printf("[DEBUG] driver.docker: version of executor: %v", exec.Version()) + // Return a driver handle h := &DockerHandle{ client: client, diff --git a/client/driver/exec.go b/client/driver/exec.go index 590bb90d2..aad79848d 100644 --- a/client/driver/exec.go +++ b/client/driver/exec.go @@ -187,6 +187,7 @@ func (d *ExecDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, erro return nil, fmt.Errorf("error connecting to plugin: %v", merrs.ErrorOrNil()) } + d.logger.Printf("[DEBUG] driver.exec : version of executor: %v", exec.Version()) // Return a driver handle h := &execHandle{ pluginClient: client, diff --git a/client/driver/executor/executor.go b/client/driver/executor/executor.go index 82dc9c617..0b5afe629 100644 --- a/client/driver/executor/executor.go +++ b/client/driver/executor/executor.go @@ -37,6 +37,7 @@ type Executor interface { UpdateTask(task *structs.Task) error SyncServices(ctx *ConsulContext) error DeregisterServices() error + Version() string } // ConsulContext holds context to configure the consul client and run checks @@ -162,6 +163,11 @@ func NewExecutor(logger *log.Logger) Executor { } } +// Version returns the api version of the executor +func (e *UniversalExecutor) Version() string { + return "1" +} + // LaunchCmd launches a process and returns it's state. It also configures an // applies isolation on certain platforms. func (e *UniversalExecutor) LaunchCmd(command *ExecCommand, ctx *ExecutorContext) (*ProcessState, error) { diff --git a/client/driver/executor_plugin.go b/client/driver/executor_plugin.go index c8561f74c..d2ff3e27c 100644 --- a/client/driver/executor_plugin.go +++ b/client/driver/executor_plugin.go @@ -21,6 +21,7 @@ func init() { type ExecutorRPC struct { client *rpc.Client + logger *log.Logger } // LaunchCmdArgs wraps a user command and the args for the purposes of RPC @@ -81,6 +82,15 @@ func (e *ExecutorRPC) DeregisterServices() error { return e.client.Call("Plugin.DeregisterServices", new(interface{}), new(interface{})) } +func (e *ExecutorRPC) Version() string { + var version string + err := e.client.Call("Plugin.Version", new(interface{}), &version) + if err != nil { + e.logger.Printf("[ERR] executor: error calling Executor.Driver: %v", err) + } + return version +} + type ExecutorRPCServer struct { Impl executor.Executor } @@ -133,6 +143,11 @@ func (e *ExecutorRPCServer) DeregisterServices(args interface{}, resp *interface return e.Impl.DeregisterServices() } +func (e *ExecutorRPCServer) Version(args interface{}, version *string) error { + *version = e.Impl.Version() + return nil +} + type ExecutorPlugin struct { logger *log.Logger Impl *ExecutorRPCServer @@ -146,5 +161,5 @@ func (p *ExecutorPlugin) Server(*plugin.MuxBroker) (interface{}, error) { } func (p *ExecutorPlugin) Client(b *plugin.MuxBroker, c *rpc.Client) (interface{}, error) { - return &ExecutorRPC{client: c}, nil + return &ExecutorRPC{client: c, logger: p.logger}, nil } diff --git a/client/driver/java.go b/client/driver/java.go index 4e71ceb45..c07067738 100644 --- a/client/driver/java.go +++ b/client/driver/java.go @@ -254,6 +254,8 @@ func (d *JavaDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, erro return nil, fmt.Errorf("error connecting to plugin: %v", merrs.ErrorOrNil()) } + d.logger.Printf("[DEBUG] driver.java: version of executor: %v", exec.Version()) + // Return a driver handle h := &javaHandle{ pluginClient: pluginClient, diff --git a/client/driver/qemu.go b/client/driver/qemu.go index e64633b88..fdc0e7eed 100644 --- a/client/driver/qemu.go +++ b/client/driver/qemu.go @@ -249,7 +249,7 @@ func (d *QemuDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, erro Reattach: id.PluginConfig.PluginConfig(), } - executor, pluginClient, err := createExecutor(pluginConfig, d.config.LogOutput, d.config) + exec, pluginClient, err := createExecutor(pluginConfig, d.config.LogOutput, d.config) if err != nil { d.logger.Println("[ERR] driver.qemu: error connecting to plugin so destroying plugin pid and user pid") if e := destroyPlugin(id.PluginConfig.Pid, id.UserPid); e != nil { @@ -258,10 +258,11 @@ func (d *QemuDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, erro return nil, fmt.Errorf("error connecting to plugin: %v", err) } + d.logger.Printf("[DEBUG] driver.qemu: version of executor: %v", exec.Version()) // Return a driver handle h := &qemuHandle{ pluginClient: pluginClient, - executor: executor, + executor: exec, userPid: id.UserPid, allocDir: id.AllocDir, logger: d.logger, diff --git a/client/driver/raw_exec.go b/client/driver/raw_exec.go index e1619ab0a..09377a844 100644 --- a/client/driver/raw_exec.go +++ b/client/driver/raw_exec.go @@ -158,7 +158,7 @@ func (d *RawExecDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, e pluginConfig := &plugin.ClientConfig{ Reattach: id.PluginConfig.PluginConfig(), } - executor, pluginClient, err := createExecutor(pluginConfig, d.config.LogOutput, d.config) + exec, pluginClient, err := createExecutor(pluginConfig, d.config.LogOutput, d.config) if err != nil { d.logger.Println("[ERR] driver.raw_exec: error connecting to plugin so destroying plugin pid and user pid") if e := destroyPlugin(id.PluginConfig.Pid, id.UserPid); e != nil { @@ -167,10 +167,12 @@ func (d *RawExecDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, e return nil, fmt.Errorf("error connecting to plugin: %v", err) } + d.logger.Printf("[DEBUG] driver.raw_exec: version of executor: %v", exec.Version()) + // Return a driver handle h := &rawExecHandle{ pluginClient: pluginClient, - executor: executor, + executor: exec, userPid: id.UserPid, logger: d.logger, killTimeout: id.KillTimeout, diff --git a/client/driver/rkt.go b/client/driver/rkt.go index 4398beb9a..b282cf623 100644 --- a/client/driver/rkt.go +++ b/client/driver/rkt.go @@ -286,7 +286,7 @@ func (d *RktDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, error pluginConfig := &plugin.ClientConfig{ Reattach: id.PluginConfig.PluginConfig(), } - executor, pluginClient, err := createExecutor(pluginConfig, d.config.LogOutput, d.config) + exec, pluginClient, err := createExecutor(pluginConfig, d.config.LogOutput, d.config) if err != nil { d.logger.Println("[ERROR] driver.rkt: error connecting to plugin so destroying plugin pid and user pid") if e := destroyPlugin(id.PluginConfig.Pid, id.ExecutorPid); e != nil { @@ -295,12 +295,13 @@ func (d *RktDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, error return nil, fmt.Errorf("error connecting to plugin: %v", err) } + d.logger.Printf("[DEBUG] driver.rkt: version of executor: %v", exec.Version()) // Return a driver handle h := &rktHandle{ pluginClient: pluginClient, executorPid: id.ExecutorPid, allocDir: id.AllocDir, - executor: executor, + executor: exec, logger: d.logger, killTimeout: id.KillTimeout, maxKillTimeout: id.MaxKillTimeout, From 1471f747f3c455c0d49237447fd358b2aa01f329 Mon Sep 17 00:00:00 2001 From: Diptanu Choudhury Date: Tue, 29 Mar 2016 22:05:02 -0700 Subject: [PATCH 2/2] Added version to executor --- client/driver/docker.go | 3 ++- client/driver/exec.go | 3 ++- client/driver/executor/executor.go | 15 ++++++++++++--- client/driver/executor_plugin.go | 23 ++++++++++++----------- client/driver/java.go | 3 ++- client/driver/qemu.go | 3 ++- client/driver/raw_exec.go | 3 ++- client/driver/rkt.go | 3 ++- 8 files changed, 36 insertions(+), 20 deletions(-) diff --git a/client/driver/docker.go b/client/driver/docker.go index 752c8941b..79b535805 100644 --- a/client/driver/docker.go +++ b/client/driver/docker.go @@ -700,7 +700,8 @@ func (d *DockerDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, er return nil, err } - d.logger.Printf("[DEBUG] driver.docker: version of executor: %v", exec.Version()) + ver, _ := exec.Version() + d.logger.Printf("[DEBUG] driver.docker: version of executor: %v", ver.Version) // Return a driver handle h := &DockerHandle{ diff --git a/client/driver/exec.go b/client/driver/exec.go index aad79848d..136016113 100644 --- a/client/driver/exec.go +++ b/client/driver/exec.go @@ -187,7 +187,8 @@ func (d *ExecDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, erro return nil, fmt.Errorf("error connecting to plugin: %v", merrs.ErrorOrNil()) } - d.logger.Printf("[DEBUG] driver.exec : version of executor: %v", exec.Version()) + ver, _ := exec.Version() + d.logger.Printf("[DEBUG] driver.exec : version of executor: %v", ver.Version) // Return a driver handle h := &execHandle{ pluginClient: client, diff --git a/client/driver/executor/executor.go b/client/driver/executor/executor.go index 0b5afe629..434d9c62b 100644 --- a/client/driver/executor/executor.go +++ b/client/driver/executor/executor.go @@ -37,7 +37,7 @@ type Executor interface { UpdateTask(task *structs.Task) error SyncServices(ctx *ConsulContext) error DeregisterServices() error - Version() string + Version() (*ExecutorVersion, error) } // ConsulContext holds context to configure the consul client and run checks @@ -128,6 +128,15 @@ type SyslogServerState struct { Addr string } +// ExecutorVersion is the version of the executor +type ExecutorVersion struct { + Version string +} + +func (v *ExecutorVersion) GoString() string { + return v.Version +} + // UniversalExecutor is an implementation of the Executor which launches and // supervises processes. In addition to process supervision it provides resource // and file system isolation @@ -164,8 +173,8 @@ func NewExecutor(logger *log.Logger) Executor { } // Version returns the api version of the executor -func (e *UniversalExecutor) Version() string { - return "1" +func (e *UniversalExecutor) Version() (*ExecutorVersion, error) { + return &ExecutorVersion{Version: "1.0.0"}, nil } // LaunchCmd launches a process and returns it's state. It also configures an diff --git a/client/driver/executor_plugin.go b/client/driver/executor_plugin.go index d2ff3e27c..decb359e3 100644 --- a/client/driver/executor_plugin.go +++ b/client/driver/executor_plugin.go @@ -82,17 +82,15 @@ func (e *ExecutorRPC) DeregisterServices() error { return e.client.Call("Plugin.DeregisterServices", new(interface{}), new(interface{})) } -func (e *ExecutorRPC) Version() string { - var version string +func (e *ExecutorRPC) Version() (*executor.ExecutorVersion, error) { + var version executor.ExecutorVersion err := e.client.Call("Plugin.Version", new(interface{}), &version) - if err != nil { - e.logger.Printf("[ERR] executor: error calling Executor.Driver: %v", err) - } - return version + return &version, err } type ExecutorRPCServer struct { - Impl executor.Executor + Impl executor.Executor + logger *log.Logger } func (e *ExecutorRPCServer) LaunchCmd(args LaunchCmdArgs, ps *executor.ProcessState) error { @@ -143,9 +141,12 @@ func (e *ExecutorRPCServer) DeregisterServices(args interface{}, resp *interface return e.Impl.DeregisterServices() } -func (e *ExecutorRPCServer) Version(args interface{}, version *string) error { - *version = e.Impl.Version() - return nil +func (e *ExecutorRPCServer) Version(args interface{}, version *executor.ExecutorVersion) error { + ver, err := e.Impl.Version() + if ver != nil { + *version = *ver + } + return err } type ExecutorPlugin struct { @@ -155,7 +156,7 @@ type ExecutorPlugin struct { func (p *ExecutorPlugin) Server(*plugin.MuxBroker) (interface{}, error) { if p.Impl == nil { - p.Impl = &ExecutorRPCServer{Impl: executor.NewExecutor(p.logger)} + p.Impl = &ExecutorRPCServer{Impl: executor.NewExecutor(p.logger), logger: p.logger} } return p.Impl, nil } diff --git a/client/driver/java.go b/client/driver/java.go index c07067738..f371c89bf 100644 --- a/client/driver/java.go +++ b/client/driver/java.go @@ -254,7 +254,8 @@ func (d *JavaDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, erro return nil, fmt.Errorf("error connecting to plugin: %v", merrs.ErrorOrNil()) } - d.logger.Printf("[DEBUG] driver.java: version of executor: %v", exec.Version()) + ver, _ := exec.Version() + d.logger.Printf("[DEBUG] driver.java: version of executor: %v", ver.Version) // Return a driver handle h := &javaHandle{ diff --git a/client/driver/qemu.go b/client/driver/qemu.go index fdc0e7eed..31dc63f36 100644 --- a/client/driver/qemu.go +++ b/client/driver/qemu.go @@ -258,7 +258,8 @@ func (d *QemuDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, erro return nil, fmt.Errorf("error connecting to plugin: %v", err) } - d.logger.Printf("[DEBUG] driver.qemu: version of executor: %v", exec.Version()) + ver, _ := exec.Version() + d.logger.Printf("[DEBUG] driver.qemu: version of executor: %v", ver.Version) // Return a driver handle h := &qemuHandle{ pluginClient: pluginClient, diff --git a/client/driver/raw_exec.go b/client/driver/raw_exec.go index 09377a844..c9610cdc2 100644 --- a/client/driver/raw_exec.go +++ b/client/driver/raw_exec.go @@ -167,7 +167,8 @@ func (d *RawExecDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, e return nil, fmt.Errorf("error connecting to plugin: %v", err) } - d.logger.Printf("[DEBUG] driver.raw_exec: version of executor: %v", exec.Version()) + ver, _ := exec.Version() + d.logger.Printf("[DEBUG] driver.raw_exec: version of executor: %v", ver.Version) // Return a driver handle h := &rawExecHandle{ diff --git a/client/driver/rkt.go b/client/driver/rkt.go index b282cf623..5e2f4e36e 100644 --- a/client/driver/rkt.go +++ b/client/driver/rkt.go @@ -295,7 +295,8 @@ func (d *RktDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, error return nil, fmt.Errorf("error connecting to plugin: %v", err) } - d.logger.Printf("[DEBUG] driver.rkt: version of executor: %v", exec.Version()) + ver, _ := exec.Version() + d.logger.Printf("[DEBUG] driver.rkt: version of executor: %v", ver.Version) // Return a driver handle h := &rktHandle{ pluginClient: pluginClient,