aboutsummaryrefslogtreecommitdiff
path: root/exec2/handle.go
diff options
context:
space:
mode:
Diffstat (limited to 'exec2/handle.go')
-rw-r--r--exec2/handle.go80
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
+}