github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/client/allocrunner/state/state.go (about) 1 package state 2 3 import ( 4 "time" 5 6 "github.com/hashicorp/nomad/nomad/structs" 7 ) 8 9 // State captures the state of the allocation runner. 10 type State struct { 11 // ClientStatus captures the overall state of the allocation 12 ClientStatus string 13 14 // ClientDescription is an optional human readable description of the 15 // allocations client state 16 ClientDescription string 17 18 // DeploymentStatus captures the status of the deployment 19 DeploymentStatus *structs.AllocDeploymentStatus 20 21 // TaskStates is a snapshot of task states. 22 TaskStates map[string]*structs.TaskState 23 24 // NetworkStatus captures network details not known until runtime 25 NetworkStatus *structs.AllocNetworkStatus 26 } 27 28 // SetDeploymentStatus is a helper for updating the client-controlled 29 // DeploymentStatus fields: Healthy and Timestamp. The Canary and ModifyIndex 30 // fields should only be updated by the server. 31 func (s *State) SetDeploymentStatus(timestamp time.Time, healthy bool) { 32 if s.DeploymentStatus == nil { 33 s.DeploymentStatus = &structs.AllocDeploymentStatus{} 34 } 35 36 s.DeploymentStatus.Healthy = &healthy 37 s.DeploymentStatus.Timestamp = timestamp 38 } 39 40 // ClearDeploymentStatus is a helper to clear the client-controlled 41 // DeploymentStatus fields: Healthy and Timestamp. The Canary and ModifyIndex 42 // fields should only be updated by the server. 43 func (s *State) ClearDeploymentStatus() { 44 if s.DeploymentStatus == nil { 45 return 46 } 47 48 s.DeploymentStatus.Healthy = nil 49 s.DeploymentStatus.Timestamp = time.Time{} 50 } 51 52 // Copy returns a deep copy of State. 53 func (s *State) Copy() *State { 54 taskStates := make(map[string]*structs.TaskState, len(s.TaskStates)) 55 for k, v := range s.TaskStates { 56 taskStates[k] = v.Copy() 57 } 58 return &State{ 59 ClientStatus: s.ClientStatus, 60 ClientDescription: s.ClientDescription, 61 DeploymentStatus: s.DeploymentStatus.Copy(), 62 TaskStates: taskStates, 63 NetworkStatus: s.NetworkStatus.Copy(), 64 } 65 } 66 67 // ClientTerminalStatus returns if the client status is terminal and will no longer transition 68 func (a *State) ClientTerminalStatus() bool { 69 switch a.ClientStatus { 70 case structs.AllocClientStatusComplete, structs.AllocClientStatusFailed, structs.AllocClientStatusLost: 71 return true 72 default: 73 return false 74 } 75 }