Skip to content

Commit 979520c

Browse files
authored
Merge pull request #855 from nokia/honor_finalizers
Delay external delete call when other finalizers exist
2 parents c306b1c + 2fbc8ef commit 979520c

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

pkg/reconciler/managed/reconciler.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,6 +1163,13 @@ func (r *Reconciler) Reconcile(ctx context.Context, req reconcile.Request) (resu
11631163
if meta.WasDeleted(managed) {
11641164
log = log.WithValues("deletion-timestamp", managed.GetDeletionTimestamp())
11651165

1166+
if len(managed.GetFinalizers()) > 1 {
1167+
// There are other controllers monitoring this resource so preserve the external instance
1168+
// until all other finalizers have been removed
1169+
log.Debug("Delay external deletion until all finalizers have been removed")
1170+
return reconcile.Result{Requeue: true}, nil
1171+
}
1172+
11661173
if observation.ResourceExists && policy.ShouldDelete() {
11671174
deletion, err := external.Delete(externalCtx, managed)
11681175
if err != nil {

pkg/reconciler/managed/reconciler_legacy_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,41 @@ func TestReconciler(t *testing.T) {
202202
},
203203
want: want{result: reconcile.Result{Requeue: true}},
204204
},
205+
"ExtraFinalizersDelayDelete": {
206+
reason: "The existence of multiple finalizers should trigger a requeue after a short wait.",
207+
args: args{
208+
m: &fake.Manager{
209+
Client: &test.MockClient{
210+
MockGet: test.NewMockGetFn(nil, func(obj client.Object) error {
211+
mg := asLegacyManaged(obj, 42)
212+
mg.SetDeletionTimestamp(&now)
213+
mg.SetDeletionPolicy(xpv1.DeletionDelete)
214+
mg.SetFinalizers([]string{FinalizerName, "finalizer2"})
215+
return nil
216+
}),
217+
MockUpdate: test.NewMockUpdateFn(nil),
218+
},
219+
Scheme: fake.SchemeWith(&fake.LegacyManaged{}),
220+
},
221+
mg: resource.ManagedKind(fake.GVK(&fake.LegacyManaged{})),
222+
o: []ReconcilerOption{
223+
WithInitializers(),
224+
WithReferenceResolver(ReferenceResolverFn(func(_ context.Context, _ resource.Managed) error { return nil })),
225+
WithExternalConnector(ExternalConnectorFn(func(_ context.Context, _ resource.Managed) (ExternalClient, error) {
226+
c := &ExternalClientFns{
227+
ObserveFn: func(_ context.Context, _ resource.Managed) (ExternalObservation, error) {
228+
return ExternalObservation{ResourceExists: true}, nil
229+
},
230+
DisconnectFn: func(_ context.Context) error {
231+
return nil
232+
},
233+
}
234+
return c, nil
235+
})),
236+
},
237+
},
238+
want: want{result: reconcile.Result{Requeue: true}},
239+
},
205240
"ExternalCreatePending": {
206241
reason: "We should return early if the managed resource appears to be pending creation. We might have leaked a resource and don't want to create another.",
207242
args: args{

pkg/reconciler/managed/reconciler_modern_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,40 @@ func TestModernReconciler(t *testing.T) {
207207
},
208208
want: want{result: reconcile.Result{Requeue: true}},
209209
},
210+
"ExtraFinalizersDelayDelete": {
211+
reason: "The existence of multiple finalizers should trigger a requeue after a short wait.",
212+
args: args{
213+
m: &fake.Manager{
214+
Client: &test.MockClient{
215+
MockGet: test.NewMockGetFn(nil, func(obj client.Object) error {
216+
mg := asModernManaged(obj, 42)
217+
mg.SetDeletionTimestamp(&now)
218+
mg.SetFinalizers([]string{FinalizerName, "finalizer2"})
219+
return nil
220+
}),
221+
MockUpdate: test.NewMockUpdateFn(nil),
222+
},
223+
Scheme: fake.SchemeWith(&fake.ModernManaged{}),
224+
},
225+
mg: resource.ManagedKind(fake.GVK(&fake.ModernManaged{})),
226+
o: []ReconcilerOption{
227+
WithInitializers(),
228+
WithReferenceResolver(ReferenceResolverFn(func(_ context.Context, _ resource.Managed) error { return nil })),
229+
WithExternalConnector(ExternalConnectorFn(func(_ context.Context, _ resource.Managed) (ExternalClient, error) {
230+
c := &ExternalClientFns{
231+
ObserveFn: func(_ context.Context, _ resource.Managed) (ExternalObservation, error) {
232+
return ExternalObservation{ResourceExists: true}, nil
233+
},
234+
DisconnectFn: func(_ context.Context) error {
235+
return nil
236+
},
237+
}
238+
return c, nil
239+
})),
240+
},
241+
},
242+
want: want{result: reconcile.Result{Requeue: true}},
243+
},
210244
"ExternalCreatePending": {
211245
reason: "We should return early if the managed resource appears to be pending creation. We might have leaked a resource and don't want to create another.",
212246
args: args{

0 commit comments

Comments
 (0)