ForceFailRun marks one queued or claimed run failed without requiring the raw claim token.
( ctx context.Context, runID string, failure ForceFailRun, actor ActorContext, )
| 143 | |
| 144 | // ForceFailRun marks one queued or claimed run failed without requiring the raw claim token. |
| 145 | func (m *Service) ForceFailRun( |
| 146 | ctx context.Context, |
| 147 | runID string, |
| 148 | failure ForceFailRun, |
| 149 | actor ActorContext, |
| 150 | ) (*Run, error) { |
| 151 | if err := m.requireForceRunAuthority(actor); err != nil { |
| 152 | return nil, err |
| 153 | } |
| 154 | normalized, err := normalizeForceFailRun(failure) |
| 155 | if err != nil { |
| 156 | return nil, err |
| 157 | } |
| 158 | previous, taskRecord, err := m.loadRunWithTask(ctx, runID) |
| 159 | if err != nil { |
| 160 | return nil, err |
| 161 | } |
| 162 | if err := m.requireForceRunRate(actor, taskRecord.ID); err != nil { |
| 163 | return nil, err |
| 164 | } |
| 165 | if err := requireForceFailStatus(previous); err != nil { |
| 166 | return nil, err |
| 167 | } |
| 168 | |
| 169 | mutation, err := m.store.ForceFailTaskRun(ctx, ForceFailRunMutation{ |
| 170 | RunID: previous.ID, |
| 171 | Reason: normalized.Reason, |
| 172 | Now: m.now().UTC(), |
| 173 | }) |
| 174 | if err != nil { |
| 175 | return nil, err |
| 176 | } |
| 177 | queueGeneration, canceledInputs, err := m.invalidateForceRunInputs(ctx, mutation.Previous) |
| 178 | if err != nil { |
| 179 | return nil, err |
| 180 | } |
| 181 | reconciledTask, err := m.reconcileTaskCascade(ctx, taskRecord.ID) |
| 182 | if err != nil { |
| 183 | return nil, err |
| 184 | } |
| 185 | if err := m.recordTaskEvent( |
| 186 | ctx, |
| 187 | mutation.Run.TaskID, |
| 188 | mutation.Run.ID, |
| 189 | taskEventRunOperatorForcedFail, |
| 190 | actor, |
| 191 | operatorForcedFailPayload{ |
| 192 | Manual: true, |
| 193 | ActorKind: actor.Actor.Kind.Normalize(), |
| 194 | ActorID: actor.Actor.Ref, |
| 195 | PreviousStatus: mutation.Previous.Status, |
| 196 | Status: mutation.Run.Status, |
| 197 | TaskStatus: reconciledTask.Status, |
| 198 | Reason: normalized.Reason, |
| 199 | SessionID: mutation.Previous.SessionID, |
| 200 | QueueGeneration: queueGeneration, |
| 201 | CanceledQueuedInputs: canceledInputs, |
| 202 | Metadata: cloneRawJSON(normalized.Metadata), |
no test coverage detected