github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/client/allocrunner/interfaces/task_lifecycle.go (about) 1 package interfaces 2 3 import ( 4 "context" 5 "time" 6 7 "github.com/hashicorp/nomad/client/allocdir" 8 "github.com/hashicorp/nomad/client/allocrunner/taskrunner/interfaces" 9 cstructs "github.com/hashicorp/nomad/client/structs" 10 "github.com/hashicorp/nomad/client/taskenv" 11 "github.com/hashicorp/nomad/nomad/structs" 12 "github.com/hashicorp/nomad/plugins/drivers" 13 ) 14 15 /* 16 17 Restart 18 +--------------------------------------------------------+ 19 | | 20 | *Update | 21 | +-------+ | 22 | | | | 23 | | | | 24 | +---v-------+----+ | 25 +----v----+ | Running | +----+-----+ +--------------+ 26 | | *Prestart |----------------| *Exited | | *Stop | | 27 | Pending +-------------> *Poststart run +---^-----------> Exited +-----------> Terminal | 28 | | | upon entering | | | | NoRestart | | 29 +---------+ | running | | +----------+ +--------------+ 30 | | | 31 +--------+-------+ | 32 | | 33 +-----------+ 34 *Kill 35 (forces terminal) 36 37 Link: http://stable.ascii-flow.appspot.com/#Draw4489375405966393064/1824429135 38 */ 39 40 // TaskHook is a lifecycle hook into the life cycle of a task runner. 41 type TaskHook interface { 42 Name() string 43 } 44 45 type TaskPrestartRequest struct { 46 // PreviousState is previously set data by the hook. It must be copied 47 // to State below to be maintained across restarts. 48 PreviousState map[string]string 49 50 // Task is the task to run 51 Task *structs.Task 52 53 // TaskResources is the resources assigned to the task 54 TaskResources *structs.AllocatedTaskResources 55 56 // Vault token may optionally be set if a Vault token is available 57 VaultToken string 58 59 // TaskDir contains the task's directory tree on the host 60 TaskDir *allocdir.TaskDir 61 62 // TaskEnv is the task's environment 63 TaskEnv *taskenv.TaskEnv 64 } 65 66 type TaskPrestartResponse struct { 67 // Env is the environment variables to set for the task 68 Env map[string]string 69 70 // Mounts is the set of host volumes to mount into the task 71 Mounts []*drivers.MountConfig 72 73 // Devices are the set of devices to mount into the task 74 Devices []*drivers.DeviceConfig 75 76 // State allows the hook to emit data to be passed in the next time it is 77 // run. Hooks must copy relevant PreviousState to State to maintain it 78 // across restarts. 79 State map[string]string 80 81 // Done lets the hook indicate that it completed successfully and 82 // should not be run again. 83 Done bool 84 } 85 86 type TaskPrestartHook interface { 87 TaskHook 88 89 // Prestart is called before the task is started including after every 90 // restart. Prestart is not called if the allocation is terminal. 91 // 92 // The context is cancelled if the task is killed or shutdown. 93 Prestart(context.Context, *TaskPrestartRequest, *TaskPrestartResponse) error 94 } 95 96 // DriverStats is the interface implemented by DriverHandles to return task stats. 97 type DriverStats interface { 98 Stats(context.Context, time.Duration) (<-chan *cstructs.TaskResourceUsage, error) 99 } 100 101 type TaskPoststartRequest struct { 102 // Exec hook (may be nil) 103 DriverExec interfaces.ScriptExecutor 104 105 // Network info (may be nil) 106 DriverNetwork *drivers.DriverNetwork 107 108 // TaskEnv is the task's environment 109 TaskEnv *taskenv.TaskEnv 110 111 // Stats collector 112 DriverStats DriverStats 113 } 114 type TaskPoststartResponse struct{} 115 116 type TaskPoststartHook interface { 117 TaskHook 118 119 // Poststart is called after the task has started. Poststart is not 120 // called if the allocation is terminal. 121 // 122 // The context is cancelled if the task is killed. 123 Poststart(context.Context, *TaskPoststartRequest, *TaskPoststartResponse) error 124 } 125 126 type TaskPreKillRequest struct{} 127 type TaskPreKillResponse struct{} 128 129 type TaskPreKillHook interface { 130 TaskHook 131 132 // PreKilling is called right before a task is going to be killed or 133 // restarted. They are called concurrently with TaskRunner.Run and may 134 // be called without Prestart being called. 135 PreKilling(context.Context, *TaskPreKillRequest, *TaskPreKillResponse) error 136 } 137 138 type TaskExitedRequest struct{} 139 type TaskExitedResponse struct{} 140 141 type TaskExitedHook interface { 142 TaskHook 143 144 // Exited is called after a task exits and may or may not be restarted. 145 // Prestart may or may not have been called. 146 // 147 // The context is cancelled if the task is killed. 148 Exited(context.Context, *TaskExitedRequest, *TaskExitedResponse) error 149 } 150 151 type TaskUpdateRequest struct { 152 VaultToken string 153 154 // Alloc is the current version of the allocation (may have been 155 // updated since the hook was created) 156 Alloc *structs.Allocation 157 158 // TaskEnv is the task's environment 159 TaskEnv *taskenv.TaskEnv 160 } 161 type TaskUpdateResponse struct{} 162 163 type TaskUpdateHook interface { 164 TaskHook 165 166 // Update is called when the servers have updated the Allocation for 167 // this task. Updates are concurrent with all other task hooks and 168 // therefore hooks that implement this interface must be completely 169 // safe for concurrent access. 170 // 171 // The context is cancelled if the task is killed. 172 Update(context.Context, *TaskUpdateRequest, *TaskUpdateResponse) error 173 } 174 175 type TaskStopRequest struct { 176 // ExistingState is previously set hook data and should only be 177 // read. Stop hooks cannot alter state. 178 ExistingState map[string]string 179 } 180 181 type TaskStopResponse struct{} 182 183 type TaskStopHook interface { 184 TaskHook 185 186 // Stop is called after the task has exited and will not be started 187 // again. It is the only hook guaranteed to be executed whenever 188 // TaskRunner.Run is called (and not gracefully shutting down). 189 // Therefore it may be called even when prestart and the other hooks 190 // have not. 191 // 192 // Stop hooks must be idempotent. The context is cancelled if the task 193 // is killed. 194 Stop(context.Context, *TaskStopRequest, *TaskStopResponse) error 195 }