Skip to content

Commit 7eac47a

Browse files
authored
fix(controllers): requeue only on NotFound refs (#1118)
1 parent 44fa245 commit 7eac47a

2 files changed

Lines changed: 34 additions & 3 deletions

File tree

controllers/reconciler.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/go-logr/logr"
1414
corev1 "k8s.io/api/core/v1"
1515
"k8s.io/apimachinery/pkg/api/equality"
16+
apierrors "k8s.io/apimachinery/pkg/api/errors"
1617
"k8s.io/apimachinery/pkg/api/meta"
1718
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1819
"k8s.io/apimachinery/pkg/types"
@@ -177,9 +178,13 @@ func (r *Reconciler[T]) resolveK8sRefs(ctx context.Context, obj T) (requeue bool
177178
}
178179

179180
if err := r.Get(ctx, ref.NamespacedName, dep); err != nil {
180-
// Matching legacy behaviour: missing or not-yet-created refs trigger a soft requeue.
181-
logr.FromContextOrDiscard(ctx).V(1).Info("referenced resource is not yet available", "ref", ref.NamespacedName, "gvk", ref.GroupVersionKind, "error", err)
182-
return true, nil
181+
if apierrors.IsNotFound(err) {
182+
// Matching legacy behaviour: missing or not-yet-created refs trigger a soft requeue.
183+
logr.FromContextOrDiscard(ctx).V(1).Info("referenced resource is not yet available", "ref", ref.NamespacedName, "gvk", ref.GroupVersionKind, "error", err)
184+
return true, nil
185+
}
186+
187+
return false, fmt.Errorf("getting referenced resource %s %s: %w", ref.GroupVersionKind, ref.NamespacedName, err)
183188
}
184189

185190
if !IsReadyToUse(dep) {

controllers/reconciler_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package controllers
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"net/http"
78
"reflect"
@@ -888,6 +889,31 @@ func TestReconciler_resolveK8sRefs(t *testing.T) {
888889
require.False(t, requeue)
889890
})
890891

892+
t.Run("Error if dependency Get returns non-not-found error", func(t *testing.T) {
893+
obj := newObjectFromYAML[v1alpha1.PostgreSQL](t, yamlPostgresWithRef)
894+
895+
k8sClient := fake.NewClientBuilder().
896+
WithScheme(scheme).
897+
WithInterceptorFuncs(interceptor.Funcs{
898+
Get: func(context.Context, crclient.WithWatch, crclient.ObjectKey, crclient.Object, ...crclient.GetOption) error {
899+
return errors.New("boom")
900+
},
901+
}).
902+
Build()
903+
904+
r := &Reconciler[*v1alpha1.PostgreSQL]{
905+
Controller: Controller{
906+
Client: k8sClient,
907+
Scheme: scheme,
908+
},
909+
}
910+
911+
requeue, err := r.resolveK8sRefs(t.Context(), obj)
912+
913+
require.EqualError(t, err, `getting referenced resource aiven.io/v1alpha1, Kind=ProjectVPC default/test-vpc: boom`)
914+
require.False(t, requeue)
915+
})
916+
891917
t.Run("Requeue if dependency is missing", func(t *testing.T) {
892918
k8sClient := fake.NewClientBuilder().
893919
WithScheme(scheme).

0 commit comments

Comments
 (0)