| 634 | } |
| 635 | |
| 636 | func planTaskRunRecovery( |
| 637 | ctx context.Context, |
| 638 | sessions taskBridgeSessionManager, |
| 639 | run taskpkg.Run, |
| 640 | ) (*taskpkg.RunBootRecovery, error) { |
| 641 | if sessions == nil { |
| 642 | return nil, errors.New("daemon: task recovery requires a session manager") |
| 643 | } |
| 644 | |
| 645 | evidence, err := inspectTaskSessionRecovery(ctx, sessions, strings.TrimSpace(run.SessionID)) |
| 646 | if err != nil { |
| 647 | return nil, err |
| 648 | } |
| 649 | |
| 650 | switch run.Status.Normalize() { |
| 651 | case taskpkg.TaskRunStatusClaimed: |
| 652 | if evidence.live { |
| 653 | return &taskpkg.RunBootRecovery{ |
| 654 | Action: taskpkg.RunBootRecoveryMarkRunning, |
| 655 | Reason: taskRecoveryReasonBoot, |
| 656 | SessionState: evidence.state, |
| 657 | Classification: evidence.classification, |
| 658 | Detail: evidence.detail, |
| 659 | }, nil |
| 660 | } |
| 661 | return &taskpkg.RunBootRecovery{ |
| 662 | Action: taskpkg.RunBootRecoveryRequeue, |
| 663 | Reason: taskRecoveryReasonBoot, |
| 664 | SessionState: evidence.state, |
| 665 | Classification: evidence.classification, |
| 666 | Detail: evidence.detail, |
| 667 | }, nil |
| 668 | |
| 669 | case taskpkg.TaskRunStatusStarting: |
| 670 | if evidence.live { |
| 671 | return &taskpkg.RunBootRecovery{ |
| 672 | Action: taskpkg.RunBootRecoveryMarkRunning, |
| 673 | Reason: taskRecoveryReasonBoot, |
| 674 | SessionState: evidence.state, |
| 675 | Classification: evidence.classification, |
| 676 | Detail: evidence.detail, |
| 677 | }, nil |
| 678 | } |
| 679 | return &taskpkg.RunBootRecovery{ |
| 680 | Action: taskpkg.RunBootRecoveryFail, |
| 681 | Reason: taskRecoveryReasonBoot, |
| 682 | SessionState: evidence.state, |
| 683 | Classification: evidence.classification, |
| 684 | Detail: evidence.detail, |
| 685 | }, nil |
| 686 | |
| 687 | case taskpkg.TaskRunStatusRunning: |
| 688 | if evidence.live { |
| 689 | return nil, nil |
| 690 | } |
| 691 | return &taskpkg.RunBootRecovery{ |
| 692 | Action: taskpkg.RunBootRecoveryFail, |
| 693 | Reason: taskRecoveryReasonBoot, |