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  }