github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/client/state/08types.go (about) 1 package state 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "strings" 7 8 "github.com/hashicorp/nomad/client/allocrunner/taskrunner/state" 9 "github.com/hashicorp/nomad/helper/uuid" 10 "github.com/hashicorp/nomad/nomad/structs" 11 "github.com/hashicorp/nomad/plugins/drivers" 12 pstructs "github.com/hashicorp/nomad/plugins/shared/structs" 13 ) 14 15 // allocRunnerMutableState08 is state that had to be written on each save as it 16 // changed over the life-cycle of the alloc_runner in Nomad 0.8. 17 // 18 // https://github.com/hashicorp/nomad/blob/v0.8.6/client/alloc_runner.go#L146-L153 19 // 20 type allocRunnerMutableState08 struct { 21 // AllocClientStatus does not need to be upgraded as it is computed 22 // from task states. 23 AllocClientStatus string 24 25 // AllocClientDescription does not need to be upgraded as it is computed 26 // from task states. 27 AllocClientDescription string 28 29 TaskStates map[string]*structs.TaskState 30 DeploymentStatus *structs.AllocDeploymentStatus 31 } 32 33 // taskRunnerState08 was used to snapshot the state of the task runner in Nomad 34 // 0.8. 35 // 36 // https://github.com/hashicorp/nomad/blob/v0.8.6/client/task_runner.go#L188-L197 37 // COMPAT(0.10): Allows upgrading from 0.8.X to 0.9.0. 38 type taskRunnerState08 struct { 39 Version string 40 HandleID string 41 ArtifactDownloaded bool 42 TaskDirBuilt bool 43 PayloadRendered bool 44 DriverNetwork *drivers.DriverNetwork 45 // Created Resources are no longer used. 46 //CreatedResources *driver.CreatedResources 47 } 48 49 type TaskRunnerHandle08 struct { 50 // Docker specific handle info 51 ContainerID string `json:"ContainerID"` 52 Image string `json:"Image"` 53 54 // LXC specific handle info 55 ContainerName string `json:"ContainerName"` 56 LxcPath string `json:"LxcPath"` 57 58 // Executor reattach config 59 PluginConfig struct { 60 Pid int `json:"Pid"` 61 AddrNet string `json:"AddrNet"` 62 AddrName string `json:"AddrName"` 63 } `json:"PluginConfig"` 64 } 65 66 func (t *TaskRunnerHandle08) ReattachConfig() *pstructs.ReattachConfig { 67 return &pstructs.ReattachConfig{ 68 Network: t.PluginConfig.AddrNet, 69 Addr: t.PluginConfig.AddrName, 70 Pid: t.PluginConfig.Pid, 71 } 72 } 73 74 func (t *taskRunnerState08) Upgrade(allocID, taskName string) (*state.LocalState, error) { 75 ls := state.NewLocalState() 76 77 // Reuse DriverNetwork 78 ls.DriverNetwork = t.DriverNetwork 79 80 // Upgrade artifact state 81 ls.Hooks["artifacts"] = &state.HookState{ 82 PrestartDone: t.ArtifactDownloaded, 83 } 84 85 // Upgrade task dir state 86 ls.Hooks["task_dir"] = &state.HookState{ 87 Data: map[string]string{ 88 // "is_done" is equivalent to task_dir_hook.TaskDirHookIsDoneKey 89 // Does not import to avoid import cycle 90 "is_done": fmt.Sprintf("%v", t.TaskDirBuilt), 91 }, 92 } 93 94 // Upgrade dispatch payload state 95 ls.Hooks["dispatch_payload"] = &state.HookState{ 96 PrestartDone: t.PayloadRendered, 97 } 98 99 // Add necessary fields to TaskConfig 100 ls.TaskHandle = drivers.NewTaskHandle(drivers.Pre09TaskHandleVersion) 101 ls.TaskHandle.Config = &drivers.TaskConfig{ 102 ID: fmt.Sprintf("pre09-%s", uuid.Generate()), 103 Name: taskName, 104 AllocID: allocID, 105 } 106 107 ls.TaskHandle.State = drivers.TaskStateUnknown 108 109 // The docker driver prefixed the handle with 'DOCKER:' 110 // Strip so that it can be unmarshalled 111 data := t.HandleID 112 if strings.HasPrefix(data, "DOCKER:") { 113 data = data[7:] 114 } 115 116 // The pre09 driver handle ID is given to the driver. It is unmarshalled 117 // here to check for errors 118 if _, err := UnmarshalPre09HandleID([]byte(data)); err != nil { 119 return nil, err 120 } 121 122 ls.TaskHandle.DriverState = []byte(data) 123 124 return ls, nil 125 } 126 127 // UnmarshalPre09HandleID decodes the pre09 json encoded handle ID 128 func UnmarshalPre09HandleID(raw []byte) (*TaskRunnerHandle08, error) { 129 var handle TaskRunnerHandle08 130 if err := json.Unmarshal(raw, &handle); err != nil { 131 return nil, fmt.Errorf("failed to decode 0.8 driver state: %v", err) 132 } 133 134 return &handle, nil 135 }