Skip to content

Commit 82f4f35

Browse files
committed
fix: ensure resource status is patched before checking for updates on
1 parent 27b3c92 commit 82f4f35

File tree

2 files changed

+37
-38
lines changed

2 files changed

+37
-38
lines changed

pkg/runtime/reconciler.go

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -589,10 +589,9 @@ func (r *resourceReconciler) Sync(
589589
}
590590
} else if adoptionPolicy == AdoptionPolicy_Adopt {
591591
rm.FilterSystemTags(latest)
592-
if err = r.setResourceManaged(ctx, rm, latest); err != nil {
592+
if err = r.setResourceManagedAndAdopted(ctx, rm, latest); err != nil {
593593
return latest, err
594594
}
595-
r.rd.MarkAdopted(latest)
596595
latest, err = r.patchResourceMetadataAndSpec(ctx, rm, desired, latest)
597596
if err != nil {
598597
return latest, err
@@ -609,12 +608,13 @@ func (r *resourceReconciler) Sync(
609608
return latest, nil
610609
} else {
611610
if adoptionPolicy == AdoptionPolicy_AdoptOrCreate {
612-
// set adopt-or-create resource as managed before attempting
613-
// update
614-
if err = r.setResourceManaged(ctx, rm, latest); err != nil {
611+
// set adopt-or-create resource as managed
612+
// and requeue to ensure status is patched
613+
if err = r.setResourceManagedAndAdopted(ctx, rm, latest); err != nil {
615614
return latest, err
616615
}
617-
r.rd.MarkAdopted(latest)
616+
err = requeue.Needed(fmt.Errorf("adopted resource, requeuing to check for updates"))
617+
return latest, err
618618
}
619619
if latest, err = r.updateResource(ctx, rm, resolved, latest); err != nil {
620620
return latest, err
@@ -1173,6 +1173,34 @@ func (r *resourceReconciler) setResourceManaged(
11731173
rlog.Debug("marked resource as managed")
11741174
return nil
11751175
}
1176+
// setResourceManagedAndAdopted marks the underlying CR in the supplied AWSResource with
1177+
// a finalizer and adopted annotation that indicates the object is under ACK management and will not
1178+
// be deleted until that finalizer is removed (in setResourceUnmanaged())
1179+
func (r *resourceReconciler) setResourceManagedAndAdopted(
1180+
ctx context.Context,
1181+
rm acktypes.AWSResourceManager,
1182+
res acktypes.AWSResource,
1183+
) error {
1184+
if r.rd.IsManaged(res) {
1185+
return nil
1186+
}
1187+
var err error
1188+
rlog := ackrtlog.FromContext(ctx)
1189+
exit := rlog.Trace("r.setResourceManagedAndAdopted")
1190+
defer func() {
1191+
exit(err)
1192+
}()
1193+
1194+
orig := res.DeepCopy().RuntimeObject()
1195+
r.rd.MarkManaged(res)
1196+
r.rd.MarkAdopted(res)
1197+
res, err = r.patchResourceMetadataAndSpec(ctx, rm, r.rd.ResourceFromRuntimeObject(orig), res)
1198+
if err != nil {
1199+
return err
1200+
}
1201+
rlog.Debug("marked resource as managed and adopted")
1202+
return nil
1203+
}
11761204

11771205
// setResourceUnmanaged removes a finalizer from the underlying CR in the
11781206
// supplied AWSResource that indicates the object is under ACK management. This

pkg/runtime/reconciler_test.go

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -532,38 +532,21 @@ func TestReconcilerAdoptOrCreateResource_Adopt(t *testing.T) {
532532
ackv1alpha1.AnnotationAdoptionPolicy: "adopt-or-create",
533533
ackv1alpha1.AnnotationAdoptionFields: adoptionFieldsString,
534534
})
535-
updated, updatedRTObj, _ := resourceMocks()
536-
updated.On("Identifiers").Return(ids)
537-
updated.On("Conditions").Return([]*ackv1alpha1.Condition{})
538-
updated.On("MetaObject").Return(metav1.ObjectMeta{
539-
Annotations: map[string]string{
540-
ackv1alpha1.AnnotationAdoptionPolicy: "adopt-or-create",
541-
ackv1alpha1.AnnotationAdoptionFields: "{\"arn\": \"my-adopt-book-arn\"}",
542-
},
543-
})
544-
updated.On(
545-
"ReplaceConditions",
546-
mock.AnythingOfType("[]*v1alpha1.Condition"),
547-
).Return()
548535

549536
rm := &ackmocks.AWSResourceManager{}
550537
rm.On("ResolveReferences", ctx, nil, desired).Return(
551538
desired, false, nil,
552539
).Times(2)
553540
desired.On("PopulateResourceFromAnnotation", adoptionFields).Return(nil)
554541
rm.On("ClearResolvedReferences", desired).Return(desired)
555-
rm.On("ClearResolvedReferences", updated).Return(updated)
542+
rm.On("ClearResolvedReferences", latest).Return(latest)
556543
rm.On("ClearResolvedReferences", latest).Return(latest)
557544
rm.On("ReadOne", ctx, desired).Return(
558545
latest, nil,
559546
).Once()
560-
rm.On("Update", ctx, desired, latest, delta).Return(
561-
updated, nil,
562-
).Once()
563547
rm.On("IsSynced", ctx, latest).Return(true, nil)
564548
rmf, rd := managedResourceManagerFactoryMocks(desired, latest)
565549

566-
rm.On("LateInitialize", ctx, updated).Return(latest, nil)
567550
rd.On("IsManaged", desired).Return(false).Once()
568551
rd.On("IsManaged", desired).Return(true)
569552
rd.On("MarkAdopted", latest).Return().Once()
@@ -572,28 +555,16 @@ func TestReconcilerAdoptOrCreateResource_Adopt(t *testing.T) {
572555
ackv1alpha1.AnnotationAdoptionFields: adoptionFieldsString,
573556
ackv1alpha1.AnnotationAdopted: "true",
574557
})
575-
// setManaged
576-
rd.On("Delta", latest, latest).Return(ackcompare.NewDelta()).Once()
577-
// update
578-
rd.On("Delta", desired, latest).Return(delta).Once()
579-
//
580-
rd.On("Delta", desired, updated).Return(ackcompare.NewDelta())
581-
rd.On("Delta", updated, updated).Return(ackcompare.NewDelta())
582-
rd.On("MarkAdopted", updated).Return().Once()
583558

584559
r, kc, scmd := reconcilerMocks(rmf)
585560
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
586561
statusWriter := &ctrlrtclientmock.SubResourceWriter{}
587562
kc.On("Status").Return(statusWriter)
588563
kc.On("Patch", withoutCancelContextMatcher, latestRTObj, mock.AnythingOfType("*client.mergeFromPatch")).Return(nil)
589-
kc.On("Patch", withoutCancelContextMatcher, updatedRTObj, mock.AnythingOfType("*client.mergeFromPatch")).Return(nil)
590-
statusWriter.On("Patch", withoutCancelContextMatcher, updatedRTObj, mock.AnythingOfType("*client.mergeFromPatch")).Return(nil)
564+
statusWriter.On("Patch", withoutCancelContextMatcher, latestRTObj, mock.AnythingOfType("*client.mergeFromPatch")).Return(nil)
591565
_, err := r.Sync(ctx, rm, desired)
592-
require.Nil(err)
566+
require.NotNil(err)
593567
rm.AssertNumberOfCalls(t, "ReadOne", 1)
594-
rm.AssertCalled(t, "Update", ctx, desired, latest, delta)
595-
rd.AssertCalled(t, "Delta", desired, latest)
596-
rd.AssertNumberOfCalls(t, "MarkAdopted", 2)
597568
// Assert that the resource is not created or updated
598569
rm.AssertNumberOfCalls(t, "Create", 0)
599570
}

0 commit comments

Comments
 (0)