github.com/dkerwin/nomad@v0.3.3-0.20160525181927-74554135514b/client/driver/executor_plugin.go (about) 1 package driver 2 3 import ( 4 "encoding/gob" 5 "log" 6 "net/rpc" 7 8 "github.com/hashicorp/go-plugin" 9 "github.com/hashicorp/nomad/client/driver/executor" 10 "github.com/hashicorp/nomad/nomad/structs" 11 ) 12 13 // Registering these types since we have to serialize and de-serialize the Task 14 // structs over the wire between drivers and the executor. 15 func init() { 16 gob.Register([]interface{}{}) 17 gob.Register(map[string]interface{}{}) 18 gob.Register([]map[string]string{}) 19 gob.Register([]map[string]int{}) 20 } 21 22 type ExecutorRPC struct { 23 client *rpc.Client 24 logger *log.Logger 25 } 26 27 // LaunchCmdArgs wraps a user command and the args for the purposes of RPC 28 type LaunchCmdArgs struct { 29 Cmd *executor.ExecCommand 30 Ctx *executor.ExecutorContext 31 } 32 33 // LaunchSyslogServerArgs wraps the executor context for the purposes of RPC 34 type LaunchSyslogServerArgs struct { 35 Ctx *executor.ExecutorContext 36 } 37 38 // SyncServicesArgs wraps the consul context for the purposes of RPC 39 type SyncServicesArgs struct { 40 Ctx *executor.ConsulContext 41 } 42 43 func (e *ExecutorRPC) LaunchCmd(cmd *executor.ExecCommand, ctx *executor.ExecutorContext) (*executor.ProcessState, error) { 44 var ps *executor.ProcessState 45 err := e.client.Call("Plugin.LaunchCmd", LaunchCmdArgs{Cmd: cmd, Ctx: ctx}, &ps) 46 return ps, err 47 } 48 49 func (e *ExecutorRPC) LaunchSyslogServer(ctx *executor.ExecutorContext) (*executor.SyslogServerState, error) { 50 var ss *executor.SyslogServerState 51 err := e.client.Call("Plugin.LaunchSyslogServer", LaunchSyslogServerArgs{Ctx: ctx}, &ss) 52 return ss, err 53 } 54 55 func (e *ExecutorRPC) Wait() (*executor.ProcessState, error) { 56 var ps executor.ProcessState 57 err := e.client.Call("Plugin.Wait", new(interface{}), &ps) 58 return &ps, err 59 } 60 61 func (e *ExecutorRPC) ShutDown() error { 62 return e.client.Call("Plugin.ShutDown", new(interface{}), new(interface{})) 63 } 64 65 func (e *ExecutorRPC) Exit() error { 66 return e.client.Call("Plugin.Exit", new(interface{}), new(interface{})) 67 } 68 69 func (e *ExecutorRPC) UpdateLogConfig(logConfig *structs.LogConfig) error { 70 return e.client.Call("Plugin.UpdateLogConfig", logConfig, new(interface{})) 71 } 72 73 func (e *ExecutorRPC) UpdateTask(task *structs.Task) error { 74 return e.client.Call("Plugin.UpdateTask", task, new(interface{})) 75 } 76 77 func (e *ExecutorRPC) SyncServices(ctx *executor.ConsulContext) error { 78 return e.client.Call("Plugin.SyncServices", SyncServicesArgs{Ctx: ctx}, new(interface{})) 79 } 80 81 func (e *ExecutorRPC) DeregisterServices() error { 82 return e.client.Call("Plugin.DeregisterServices", new(interface{}), new(interface{})) 83 } 84 85 func (e *ExecutorRPC) Version() (*executor.ExecutorVersion, error) { 86 var version executor.ExecutorVersion 87 err := e.client.Call("Plugin.Version", new(interface{}), &version) 88 return &version, err 89 } 90 91 type ExecutorRPCServer struct { 92 Impl executor.Executor 93 logger *log.Logger 94 } 95 96 func (e *ExecutorRPCServer) LaunchCmd(args LaunchCmdArgs, ps *executor.ProcessState) error { 97 state, err := e.Impl.LaunchCmd(args.Cmd, args.Ctx) 98 if state != nil { 99 *ps = *state 100 } 101 return err 102 } 103 104 func (e *ExecutorRPCServer) LaunchSyslogServer(args LaunchSyslogServerArgs, ss *executor.SyslogServerState) error { 105 state, err := e.Impl.LaunchSyslogServer(args.Ctx) 106 if state != nil { 107 *ss = *state 108 } 109 return err 110 } 111 112 func (e *ExecutorRPCServer) Wait(args interface{}, ps *executor.ProcessState) error { 113 state, err := e.Impl.Wait() 114 if state != nil { 115 *ps = *state 116 } 117 return err 118 } 119 120 func (e *ExecutorRPCServer) ShutDown(args interface{}, resp *interface{}) error { 121 return e.Impl.ShutDown() 122 } 123 124 func (e *ExecutorRPCServer) Exit(args interface{}, resp *interface{}) error { 125 return e.Impl.Exit() 126 } 127 128 func (e *ExecutorRPCServer) UpdateLogConfig(args *structs.LogConfig, resp *interface{}) error { 129 return e.Impl.UpdateLogConfig(args) 130 } 131 132 func (e *ExecutorRPCServer) UpdateTask(args *structs.Task, resp *interface{}) error { 133 return e.Impl.UpdateTask(args) 134 } 135 136 func (e *ExecutorRPCServer) SyncServices(args SyncServicesArgs, resp *interface{}) error { 137 return e.Impl.SyncServices(args.Ctx) 138 } 139 140 func (e *ExecutorRPCServer) DeregisterServices(args interface{}, resp *interface{}) error { 141 return e.Impl.DeregisterServices() 142 } 143 144 func (e *ExecutorRPCServer) Version(args interface{}, version *executor.ExecutorVersion) error { 145 ver, err := e.Impl.Version() 146 if ver != nil { 147 *version = *ver 148 } 149 return err 150 } 151 152 type ExecutorPlugin struct { 153 logger *log.Logger 154 Impl *ExecutorRPCServer 155 } 156 157 func (p *ExecutorPlugin) Server(*plugin.MuxBroker) (interface{}, error) { 158 if p.Impl == nil { 159 p.Impl = &ExecutorRPCServer{Impl: executor.NewExecutor(p.logger), logger: p.logger} 160 } 161 return p.Impl, nil 162 } 163 164 func (p *ExecutorPlugin) Client(b *plugin.MuxBroker, c *rpc.Client) (interface{}, error) { 165 return &ExecutorRPC{client: c, logger: p.logger}, nil 166 }