Transition validates a lifecycle change and returns the next worker state. When assignment metadata is omitted, the current assignment is carried forward for states that remain tenant-bound.
(next WorkerLifecycleState, assignment *WorkerAssignment)
| 122 | // When assignment metadata is omitted, the current assignment is carried |
| 123 | // forward for states that remain tenant-bound. |
| 124 | func (s SharedWorkerState) Transition(next WorkerLifecycleState, assignment *WorkerAssignment) (SharedWorkerState, error) { |
| 125 | current := s.NormalizedLifecycle() |
| 126 | if err := s.Validate(); err != nil { |
| 127 | return SharedWorkerState{}, err |
| 128 | } |
| 129 | if !isAllowedWorkerLifecycleTransition(current, next) { |
| 130 | return SharedWorkerState{}, fmt.Errorf("invalid worker lifecycle transition %q -> %q", current, next) |
| 131 | } |
| 132 | |
| 133 | nextState := SharedWorkerState{Lifecycle: next} |
| 134 | switch next { |
| 135 | case WorkerLifecycleIdle: |
| 136 | nextState.Assignment = nil |
| 137 | case WorkerLifecycleReserved, WorkerLifecycleActivating, WorkerLifecycleHot, WorkerLifecycleHotIdle: |
| 138 | resolved, err := resolveWorkerAssignment(s.Assignment, assignment) |
| 139 | if err != nil { |
| 140 | return SharedWorkerState{}, err |
| 141 | } |
| 142 | nextState.Assignment = resolved |
| 143 | case WorkerLifecycleDraining: |
| 144 | if s.Assignment != nil || assignment != nil { |
| 145 | resolved, err := resolveWorkerAssignment(s.Assignment, assignment) |
| 146 | if err != nil { |
| 147 | return SharedWorkerState{}, err |
| 148 | } |
| 149 | nextState.Assignment = resolved |
| 150 | } |
| 151 | case WorkerLifecycleRetired: |
| 152 | if assignment != nil { |
| 153 | resolved, err := resolveWorkerAssignment(s.Assignment, assignment) |
| 154 | if err != nil { |
| 155 | return SharedWorkerState{}, err |
| 156 | } |
| 157 | nextState.Assignment = resolved |
| 158 | } else { |
| 159 | nextState.Assignment = cloneWorkerAssignment(s.Assignment) |
| 160 | } |
| 161 | default: |
| 162 | return SharedWorkerState{}, fmt.Errorf("unknown worker lifecycle %q", next) |
| 163 | } |
| 164 | |
| 165 | if err := nextState.Validate(); err != nil { |
| 166 | return SharedWorkerState{}, err |
| 167 | } |
| 168 | return nextState, nil |
| 169 | } |
| 170 | |
| 171 | func isAllowedWorkerLifecycleTransition(current, next WorkerLifecycleState) bool { |
| 172 | switch current { |