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