diff options
Diffstat (limited to 'exec2/handle.go')
-rw-r--r-- | exec2/handle.go | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/exec2/handle.go b/exec2/handle.go new file mode 100644 index 0000000..6dfb976 --- /dev/null +++ b/exec2/handle.go @@ -0,0 +1,80 @@ +package hello + +import ( + "context" + "strconv" + "sync" + "time" + + "github.com/hashicorp/go-hclog" + "github.com/hashicorp/go-plugin" + "github.com/hashicorp/nomad/drivers/shared/executor" + "github.com/hashicorp/nomad/plugins/drivers" +) + +// taskHandle should store all relevant runtime information +// such as process ID if this is a local task or other meta +// data if this driver deals with external APIs +type taskHandle struct { + // stateLock syncs access to all fields below + stateLock sync.RWMutex + + logger hclog.Logger + exec executor.Executor + pluginClient *plugin.Client + taskConfig *drivers.TaskConfig + procState drivers.TaskState + startedAt time.Time + completedAt time.Time + exitResult *drivers.ExitResult + + // TODO: add any extra relevant information about the task. + pid int +} + +func (h *taskHandle) TaskStatus() *drivers.TaskStatus { + h.stateLock.RLock() + defer h.stateLock.RUnlock() + + return &drivers.TaskStatus{ + ID: h.taskConfig.ID, + Name: h.taskConfig.Name, + State: h.procState, + StartedAt: h.startedAt, + CompletedAt: h.completedAt, + ExitResult: h.exitResult, + DriverAttributes: map[string]string{ + "pid": strconv.Itoa(h.pid), + }, + } +} + +func (h *taskHandle) IsRunning() bool { + h.stateLock.RLock() + defer h.stateLock.RUnlock() + return h.procState == drivers.TaskStateRunning +} + +func (h *taskHandle) run() { + h.stateLock.Lock() + if h.exitResult == nil { + h.exitResult = &drivers.ExitResult{} + } + h.stateLock.Unlock() + + // TODO: wait for your task to complete and upate its state. + ps, err := h.exec.Wait(context.Background()) + h.stateLock.Lock() + defer h.stateLock.Unlock() + + if err != nil { + h.exitResult.Err = err + h.procState = drivers.TaskStateUnknown + h.completedAt = time.Now() + return + } + h.procState = drivers.TaskStateExited + h.exitResult.ExitCode = ps.ExitCode + h.exitResult.Signal = ps.Signal + h.completedAt = ps.Time +} |