|
6 | 6 | "fmt" |
7 | 7 | "log/slog" |
8 | 8 |
|
| 9 | + "k8s.io/client-go/util/retry" |
9 | 10 | "sigs.k8s.io/controller-runtime/pkg/client" |
10 | 11 |
|
11 | 12 | sbombasticv1alpha1 "github.com/rancher/sbombastic/api/v1alpha1" |
@@ -34,40 +35,40 @@ func (h *ScanJobFailureHandler) HandleFailure(ctx context.Context, message []byt |
34 | 35 | if err := json.Unmarshal(message, baseMessage); err != nil { |
35 | 36 | return fmt.Errorf("failed to unmarshal base message: %w", err) |
36 | 37 | } |
37 | | - |
38 | 38 | h.logger.DebugContext(ctx, "Handling ScanJob failure", |
39 | 39 | "scanjob", baseMessage.ScanJob.Name, |
40 | 40 | "namespace", baseMessage.ScanJob.Namespace, |
41 | 41 | "error", errorMessage, |
42 | 42 | ) |
43 | 43 |
|
44 | 44 | scanJob := &sbombasticv1alpha1.ScanJob{} |
45 | | - err := h.k8sClient.Get(ctx, client.ObjectKey{ |
46 | | - Name: baseMessage.ScanJob.Name, |
47 | | - Namespace: baseMessage.ScanJob.Namespace, |
48 | | - }, scanJob) |
49 | | - if err != nil { |
50 | | - return fmt.Errorf("failed to get ScanJob %s/%s: %w", |
51 | | - baseMessage.ScanJob.Namespace, baseMessage.ScanJob.Name, err) |
52 | | - } |
53 | 45 |
|
54 | | - original := scanJob.DeepCopy() |
55 | | - scanJob.MarkFailed(sbombasticv1alpha1.ReasonInternalError, errorMessage) |
| 46 | + // It is possible that the controller is slow to set the status condition "Scheduled" to true, |
| 47 | + // so we might encounter conflicts when setting the status conditions. |
| 48 | + err := retry.RetryOnConflict(retry.DefaultRetry, func() error { |
| 49 | + if err := h.k8sClient.Get(ctx, client.ObjectKey{ |
| 50 | + Name: baseMessage.ScanJob.Name, |
| 51 | + Namespace: baseMessage.ScanJob.Namespace, |
| 52 | + }, scanJob); err != nil { |
| 53 | + return fmt.Errorf("failed to get ScanJob %s/%s: %w", scanJob.Namespace, scanJob.Name, err) |
| 54 | + } |
56 | 55 |
|
57 | | - if err := h.k8sClient.Status().Patch(ctx, scanJob, client.MergeFrom(original)); err != nil { |
| 56 | + scanJob.MarkFailed(sbombasticv1alpha1.ReasonInternalError, errorMessage) |
| 57 | + return h.k8sClient.Status().Update(ctx, scanJob) |
| 58 | + }) |
| 59 | + if err != nil { |
58 | 60 | h.logger.ErrorContext(ctx, "Failed to update ScanJob status with failure", |
59 | 61 | "scanjob", scanJob.Name, |
60 | 62 | "namespace", scanJob.Namespace, |
61 | 63 | "error", err, |
62 | 64 | ) |
63 | | - return fmt.Errorf("failed to update ScanJob %s/%s status: %w", baseMessage.ScanJob.Namespace, baseMessage.ScanJob.Name, err) |
| 65 | + return fmt.Errorf("failed to update ScanJob %s/%s status: %w", scanJob.Namespace, scanJob.Name, err) |
64 | 66 | } |
65 | 67 |
|
66 | 68 | h.logger.DebugContext(ctx, "ScanJob marked as failed", |
67 | 69 | "scanjob", scanJob.Name, |
68 | 70 | "namespace", scanJob.Namespace, |
69 | 71 | "error_message", errorMessage, |
70 | 72 | ) |
71 | | - |
72 | 73 | return nil |
73 | 74 | } |
0 commit comments