Skip to content

Commit 654c1a5

Browse files
committed
pkg/reconciler: avoid constant reconciliations
1 parent 5dfc624 commit 654c1a5

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

pkg/reconciler/internal/updater/updater.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121

2222
"helm.sh/helm/v3/pkg/release"
23+
corev1 "k8s.io/api/core/v1"
2324
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2425
"k8s.io/apimachinery/pkg/runtime"
2526
"k8s.io/client-go/util/retry"
@@ -119,6 +120,15 @@ func EnsureCondition(condition status.Condition) UpdateStatusFunc {
119120
}
120121
}
121122

123+
func EnsureConditionUnknown(t status.ConditionType) UpdateStatusFunc {
124+
return func(s *helmAppStatus) bool {
125+
return s.Conditions.SetCondition(status.Condition{
126+
Type: t,
127+
Status: corev1.ConditionUnknown,
128+
})
129+
}
130+
}
131+
122132
func EnsureDeployedRelease(rel *release.Release) UpdateStatusFunc {
123133
return func(status *helmAppStatus) bool {
124134
newRel := helmAppReleaseFor(rel)

pkg/reconciler/reconciler.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -406,11 +406,6 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (res ctrl.Result, err error) {
406406
return ctrl.Result{}, err
407407
}
408408

409-
// We always create the status from scratch since
410-
// we don't know if the previous status is still
411-
// valid from the last time we reconciled
412-
obj.Object["status"] = nil
413-
414409
u := updater.New(r.client)
415410
defer func() {
416411
applyErr := u.Apply(ctx, obj)
@@ -423,7 +418,10 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (res ctrl.Result, err error) {
423418
if err != nil {
424419
u.UpdateStatus(
425420
updater.EnsureCondition(conditions.Irreconcilable(corev1.ConditionTrue, conditions.ReasonErrorGettingClient, err)),
426-
updater.EnsureCondition(conditions.Deployed(corev1.ConditionUnknown, conditions.ReasonErrorGettingClient, err)),
421+
updater.EnsureConditionUnknown(conditions.TypeDeployed),
422+
updater.EnsureConditionUnknown(conditions.TypeInitialized),
423+
updater.EnsureConditionUnknown(conditions.TypeReleaseFailed),
424+
updater.EnsureDeployedRelease(nil),
427425
)
428426
// NOTE: If obj has the uninstall finalizer, that means a release WAS deployed at some point
429427
// in the past, but we don't know if it still is because we don't have an actionClient to check.
@@ -460,13 +458,21 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (res ctrl.Result, err error) {
460458

461459
vals, err := r.getValues(obj)
462460
if err != nil {
463-
u.UpdateStatus(updater.EnsureCondition(conditions.Irreconcilable(corev1.ConditionTrue, conditions.ReasonErrorGettingValues, err)))
461+
u.UpdateStatus(
462+
updater.EnsureCondition(conditions.Irreconcilable(corev1.ConditionTrue, conditions.ReasonErrorGettingValues, err)),
463+
updater.EnsureConditionUnknown(conditions.TypeReleaseFailed),
464+
)
464465
return ctrl.Result{}, err
465466
}
466467

467468
rel, state, err := r.getReleaseState(actionClient, obj, vals.AsMap())
468469
if err != nil {
469-
u.UpdateStatus(updater.EnsureCondition(conditions.Irreconcilable(corev1.ConditionTrue, conditions.ReasonErrorGettingReleaseState, err)))
470+
u.UpdateStatus(
471+
updater.EnsureCondition(conditions.Irreconcilable(corev1.ConditionTrue, conditions.ReasonErrorGettingReleaseState, err)),
472+
updater.EnsureConditionUnknown(conditions.TypeReleaseFailed),
473+
updater.EnsureConditionUnknown(conditions.TypeDeployed),
474+
updater.EnsureDeployedRelease(nil),
475+
)
470476
return ctrl.Result{}, err
471477
}
472478
u.UpdateStatus(updater.EnsureCondition(conditions.Irreconcilable(corev1.ConditionFalse, "", "")))

0 commit comments

Comments
 (0)