From 5835cd918f1986701b757cc9c0a13a4cba73f0ef Mon Sep 17 00:00:00 2001 From: Sebastien Tardif Date: Sat, 16 May 2026 04:49:30 -0700 Subject: [PATCH] Add missing defer summarize(req) in UninstallRemediation UninstallRemediation is the only action reconciler that does not call defer summarize(req). All other reconcilers (Install, Upgrade, Test, Uninstall, Unlock, RollbackRemediation) include this deferred call to propagate sub-conditions into the top-level Ready condition. Without this call, the Ready condition is never updated after an uninstall remediation, leaving a stale status until the next reconciliation pass. Add ReadyCondition assertions to all test cases (success and failure) to prevent regressions, matching the pattern in rollback_remediation_test.go. Signed-off-by: Sebastien Tardif Assisted-by: Grok/grok-4 --- internal/reconcile/uninstall_remediation.go | 2 ++ internal/reconcile/uninstall_remediation_test.go | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/internal/reconcile/uninstall_remediation.go b/internal/reconcile/uninstall_remediation.go index f1015608a..a058f78b5 100644 --- a/internal/reconcile/uninstall_remediation.go +++ b/internal/reconcile/uninstall_remediation.go @@ -84,6 +84,8 @@ func (r *UninstallRemediation) Reconcile(ctx context.Context, req *Request) erro cfg = r.configFactory.Build(logBuf, observeUninstall(req.Object, v2.ReleaseActionUninstallRemediation)) ) + defer summarize(req) + // Require current to run uninstall. if cur == nil { return fmt.Errorf("%w: required to uninstall", ErrNoLatest) diff --git a/internal/reconcile/uninstall_remediation_test.go b/internal/reconcile/uninstall_remediation_test.go index 3179a1862..40e8cc087 100644 --- a/internal/reconcile/uninstall_remediation_test.go +++ b/internal/reconcile/uninstall_remediation_test.go @@ -34,6 +34,7 @@ import ( "k8s.io/client-go/tools/record" eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1" + "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" "github.com/fluxcd/pkg/chartutil" @@ -111,6 +112,8 @@ func TestUninstallRemediation_Reconcile(t *testing.T) { expectConditions: []metav1.Condition{ *conditions.TrueCondition(v2.RemediatedCondition, v2.UninstallSucceededReason, "succeeded"), + *conditions.FalseCondition(meta.ReadyCondition, v2.UninstallSucceededReason, + "succeeded"), }, expectHistory: func(releases []*helmrelease.Release) v2.Snapshots { return v2.Snapshots{ @@ -144,6 +147,8 @@ func TestUninstallRemediation_Reconcile(t *testing.T) { } }, expectConditions: []metav1.Condition{ + *conditions.FalseCondition(meta.ReadyCondition, v2.UninstallFailedReason, + "context deadline exceeded"), *conditions.FalseCondition(v2.RemediatedCondition, v2.UninstallFailedReason, "context deadline exceeded"), }, @@ -191,6 +196,8 @@ func TestUninstallRemediation_Reconcile(t *testing.T) { } }, expectConditions: []metav1.Condition{ + *conditions.FalseCondition(meta.ReadyCondition, v2.UninstallFailedReason, + "%s", ErrNoStorageUpdate.Error()), *conditions.FalseCondition(v2.RemediatedCondition, v2.UninstallFailedReason, "%s", ErrNoStorageUpdate.Error()), }, @@ -234,7 +241,10 @@ func TestUninstallRemediation_Reconcile(t *testing.T) { } }, expectConditions: []metav1.Condition{ - *conditions.FalseCondition(v2.RemediatedCondition, v2.UninstallFailedReason, "%s", mockDeleteErr.Error()), + *conditions.FalseCondition(meta.ReadyCondition, v2.UninstallFailedReason, + "%s", mockDeleteErr.Error()), + *conditions.FalseCondition(v2.RemediatedCondition, v2.UninstallFailedReason, + "%s", mockDeleteErr.Error()), }, expectHistory: func(releases []*helmrelease.Release) v2.Snapshots { return v2.Snapshots{ @@ -292,6 +302,8 @@ func TestUninstallRemediation_Reconcile(t *testing.T) { } }, expectConditions: []metav1.Condition{ + *conditions.FalseCondition(meta.ReadyCondition, v2.UninstallFailedReason, + "%s", ErrReleaseMismatch.Error()), *conditions.FalseCondition(v2.RemediatedCondition, v2.UninstallFailedReason, "%s", ErrReleaseMismatch.Error()), }, @@ -332,6 +344,8 @@ func TestUninstallRemediation_Reconcile(t *testing.T) { expectConditions: []metav1.Condition{ *conditions.TrueCondition(v2.RemediatedCondition, v2.UninstallSucceededReason, "succeeded"), + *conditions.FalseCondition(meta.ReadyCondition, v2.UninstallSucceededReason, + "succeeded"), }, expectHistory: func(releases []*helmrelease.Release) v2.Snapshots { return v2.Snapshots{