Skip to content

Commit cea457b

Browse files
committed
Use terminal errors to prevent retries in non-retryable cases
A non-retryable error in a bundle reconcile attempt now leads to a `TerminalError` being returned by the reconciler, which prevents retries [1] while being more intuitive than returning nil errors. [1]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/reconcile#TypedReconciler
1 parent 52dab59 commit cea457b

2 files changed

Lines changed: 22 additions & 12 deletions

File tree

internal/cmd/controller/reconciler/bundle_controller.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import (
4848
"sigs.k8s.io/controller-runtime/pkg/handler"
4949
"sigs.k8s.io/controller-runtime/pkg/log"
5050
"sigs.k8s.io/controller-runtime/pkg/predicate"
51+
"sigs.k8s.io/controller-runtime/pkg/reconcile"
5152
)
5253

5354
const (
@@ -671,7 +672,7 @@ func (r *BundleReconciler) updateErrorStatus(
671672
return errutil.NewAggregate(merr)
672673
}
673674

674-
return nil
675+
return reconcile.TerminalError(orgErr)
675676
}
676677

677678
// updateStatus patches the status of the bundle and collects metrics upon a successful update of

internal/cmd/controller/reconciler/bundle_controller_test.go

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
ctrl "sigs.k8s.io/controller-runtime"
2929
"sigs.k8s.io/controller-runtime/pkg/client"
3030
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
31+
"sigs.k8s.io/controller-runtime/pkg/reconcile"
3132
)
3233

3334
func TestReconcile_FinalizerUpdateError(t *testing.T) {
@@ -79,7 +80,11 @@ func TestReconcile_FinalizerUpdateError(t *testing.T) {
7980
ctx := context.TODO()
8081
_, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: namespacedName})
8182
if err == nil {
82-
t.Fatalf("expecting an error, got nil")
83+
t.Fatalf("expected an error, got nil")
84+
}
85+
86+
if errors.Is(err, reconcile.TerminalError(nil)) {
87+
t.Fatalf("expected non-terminal error, got %v", err)
8388
}
8489

8590
if !strings.Contains(err.Error(), expectedErrorMsg) {
@@ -138,8 +143,8 @@ func TestReconcile_HelmValuesLoadError(t *testing.T) {
138143

139144
ctx := context.TODO()
140145
rs, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: namespacedName})
141-
if err != nil {
142-
t.Errorf("unexpected error: %v", err)
146+
if !errors.Is(err, reconcile.TerminalError(nil)) {
147+
t.Errorf("expected terminal error, got: %v", err)
143148
}
144149

145150
if rs.RequeueAfter != 0 {
@@ -201,8 +206,8 @@ func TestReconcile_HelmVersionResolutionError(t *testing.T) {
201206

202207
ctx := context.TODO()
203208
rs, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: namespacedName})
204-
if err != nil {
205-
t.Errorf("unexpected error: %v", err)
209+
if !errors.Is(err, reconcile.TerminalError(nil)) {
210+
t.Errorf("expected terminal error, got: %v", err)
206211
}
207212

208213
if rs.RequeueAfter != 0 {
@@ -259,8 +264,8 @@ func TestReconcile_TargetsBuildingError(t *testing.T) {
259264

260265
ctx := context.TODO()
261266
rs, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: namespacedName})
262-
if err != nil {
263-
t.Errorf("unexpected error: %v", err)
267+
if !errors.Is(err, reconcile.TerminalError(nil)) {
268+
t.Errorf("expected terminal error, got: %v", err)
264269
}
265270

266271
if rs.RequeueAfter != 0 {
@@ -343,8 +348,8 @@ func TestReconcile_StatusResetFromTargetsError(t *testing.T) {
343348

344349
ctx := context.TODO()
345350
rs, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: namespacedName})
346-
if err != nil {
347-
t.Errorf("unexpected error: %v", err)
351+
if !errors.Is(err, reconcile.TerminalError(nil)) {
352+
t.Errorf("expected terminal error, got: %v", err)
348353
}
349354

350355
if rs.RequeueAfter != 0 {
@@ -426,7 +431,9 @@ func TestReconcile_ManifestStorageError(t *testing.T) {
426431
ctx := context.TODO()
427432
rs, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: namespacedName})
428433

429-
if err != nil {
434+
if c.expectedStatusPatchErrMsg != "" && !errors.Is(err, reconcile.TerminalError(nil)) {
435+
t.Errorf("expected terminal error, got: %v", err)
436+
} else if c.expectedStatusPatchErrMsg == "" && err != nil {
430437
t.Errorf("unexpected error: %v", err)
431438
}
432439

@@ -737,7 +744,9 @@ func TestReconcile_OCIReferenceSecretResolutionError(t *testing.T) {
737744
ctx := context.TODO()
738745
rs, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: namespacedName})
739746

740-
if err != nil {
747+
if c.expectStatusUpdate && !errors.Is(err, reconcile.TerminalError(nil)) {
748+
t.Errorf("expected terminal error, got: %v", err)
749+
} else if !c.expectStatusUpdate && err != nil {
741750
t.Errorf("unexpected error: %v", err)
742751
}
743752

0 commit comments

Comments
 (0)