From 12b3d3d4734e015c419eb988cb8d2e938fc64c76 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Tue, 22 Apr 2025 17:59:43 +0200 Subject: [PATCH] fix: Immediately patch lastPrepareError instead of doing it at the end of the reconciliation --- .../kluctldeployment_controller_reconcile.go | 7 ++++-- .../kluctldeployment_controller_status.go | 23 +++++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/pkg/controllers/kluctldeployment_controller_reconcile.go b/pkg/controllers/kluctldeployment_controller_reconcile.go index cccd5267e..3f1c42ea8 100644 --- a/pkg/controllers/kluctldeployment_controller_reconcile.go +++ b/pkg/controllers/kluctldeployment_controller_reconcile.go @@ -182,8 +182,6 @@ func (r *KluctlDeploymentReconciler) reconcileManualRequest(ctx context.Context, return false, nil } - obj.Status.LastPrepareError = "" - doError := func(resultId string, err error) (bool, error) { err2 := r.patchFailPrepare(ctx, obj, err) if err2 != nil { @@ -205,6 +203,11 @@ func (r *KluctlDeploymentReconciler) reconcileManualRequest(ctx context.Context, return doError("", err) } + err = r.patchStatus(ctx, client.ObjectKeyFromObject(obj), func(status *kluctlv1.KluctlDeploymentStatus) error { + status.LastPrepareError = "" + return nil + }) + objectsHash, err := targetContext.DeploymentCollection.CalcObjectsHash() if err != nil { return doError("", err) diff --git a/pkg/controllers/kluctldeployment_controller_status.go b/pkg/controllers/kluctldeployment_controller_status.go index 99d6f7596..962ba231e 100644 --- a/pkg/controllers/kluctldeployment_controller_status.go +++ b/pkg/controllers/kluctldeployment_controller_status.go @@ -56,15 +56,30 @@ func (r *KluctlDeploymentReconciler) patchFail(ctx context.Context, obj *kluctlv } func (r *KluctlDeploymentReconciler) patchFailPrepare(ctx context.Context, obj *kluctlv1.KluctlDeployment, err error) error { - obj.Status.LastPrepareError = err.Error() + patchErr1 := r.patchStatus(ctx, client.ObjectKeyFromObject(obj), func(status *kluctlv1.KluctlDeploymentStatus) error { + status.LastPrepareError = err.Error() + return nil + }) + var err2 *multierror.Error + var statusErr error if errors2.As(err, &err2) { // prepare errors tend to be extremely long, which makes tools like k9s unusable - err = fmt.Errorf("prepare failed with %d errors. Check status.lastPrepareError for details", len(err2.Errors)) + statusErr = fmt.Errorf("prepare failed with %d errors. Check status.lastPrepareError for details", len(err2.Errors)) } else { - err = fmt.Errorf("prepare failed. Check status.lastPrepareError for details") + statusErr = fmt.Errorf("prepare failed. Check status.lastPrepareError for details") } - return r.patchFail(ctx, obj, kluctlv1.PrepareFailedReason, err) + + patchErr2 := r.patchFail(ctx, obj, kluctlv1.PrepareFailedReason, statusErr) + + if patchErr1 != nil { + err = multierror.Append(err, patchErr1) + } + if patchErr2 != nil { + err = multierror.Append(err, patchErr2) + } + + return err } func (r *KluctlDeploymentReconciler) patchProgressingCondition(ctx context.Context, obj *kluctlv1.KluctlDeployment, message string, keepOldReadyStatus bool) error {