github.com/bigcommerce/nomad@v0.9.3-bc/drivers/rkt/handle.go (about) 1 package rkt 2 3 import ( 4 "context" 5 "strconv" 6 "sync" 7 "time" 8 9 hclog "github.com/hashicorp/go-hclog" 10 plugin "github.com/hashicorp/go-plugin" 11 "github.com/hashicorp/nomad/client/taskenv" 12 "github.com/hashicorp/nomad/drivers/shared/executor" 13 "github.com/hashicorp/nomad/plugins/drivers" 14 ) 15 16 type taskHandle struct { 17 exec executor.Executor 18 env *taskenv.TaskEnv 19 uuid string 20 pid int 21 pluginClient *plugin.Client 22 logger hclog.Logger 23 24 // stateLock syncs access to all fields below 25 stateLock sync.RWMutex 26 27 taskConfig *drivers.TaskConfig 28 procState drivers.TaskState 29 startedAt time.Time 30 completedAt time.Time 31 exitResult *drivers.ExitResult 32 } 33 34 func (h *taskHandle) TaskStatus() *drivers.TaskStatus { 35 h.stateLock.RLock() 36 defer h.stateLock.RUnlock() 37 38 return &drivers.TaskStatus{ 39 ID: h.taskConfig.ID, 40 Name: h.taskConfig.Name, 41 State: h.procState, 42 StartedAt: h.startedAt, 43 CompletedAt: h.completedAt, 44 ExitResult: h.exitResult, 45 DriverAttributes: map[string]string{ 46 "pid": strconv.Itoa(h.pid), 47 }, 48 } 49 } 50 51 func (h *taskHandle) IsRunning() bool { 52 h.stateLock.RLock() 53 defer h.stateLock.RUnlock() 54 return h.procState == drivers.TaskStateRunning 55 } 56 57 func (h *taskHandle) run() { 58 h.stateLock.Lock() 59 if h.exitResult == nil { 60 h.exitResult = &drivers.ExitResult{} 61 } 62 h.stateLock.Unlock() 63 64 ps, err := h.exec.Wait(context.Background()) 65 h.stateLock.Lock() 66 defer h.stateLock.Unlock() 67 68 if err != nil { 69 h.exitResult.Err = err 70 h.procState = drivers.TaskStateUnknown 71 h.completedAt = time.Now() 72 return 73 } 74 h.procState = drivers.TaskStateExited 75 h.exitResult.ExitCode = ps.ExitCode 76 h.exitResult.Signal = ps.Signal 77 h.completedAt = ps.Time 78 79 // TODO: detect if the taskConfig OOMed 80 }