Skip to content

Commit c6c189b

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

File tree

2 files changed

+36
-38
lines changed

2 files changed

+36
-38
lines changed

pkg/runtime/reconciler.go

Lines changed: 33 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,12 @@ 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+
return latest, requeue.Needed(fmt.Errorf("requeuing to check for updates"))
618617
}
619618
if latest, err = r.updateResource(ctx, rm, resolved, latest); err != nil {
620619
return latest, err
@@ -1173,6 +1172,34 @@ func (r *resourceReconciler) setResourceManaged(
11731172
rlog.Debug("marked resource as managed")
11741173
return nil
11751174
}
1175+
// setResourceManagedAndAdopted marks the underlying CR in the supplied AWSResource with
1176+
// a finalizer and adopted annotation that indicates the object is under ACK management and will not
1177+
// be deleted until that finalizer is removed (in setResourceUnmanaged())
1178+
func (r *resourceReconciler) setResourceManagedAndAdopted(
1179+
ctx context.Context,
1180+
rm acktypes.AWSResourceManager,
1181+
res acktypes.AWSResource,
1182+
) error {
1183+
if r.rd.IsManaged(res) {
1184+
return nil
1185+
}
1186+
var err error
1187+
rlog := ackrtlog.FromContext(ctx)
1188+
exit := rlog.Trace("r.setResourceManaged")
1189+
defer func() {
1190+
exit(err)
1191+
}()
1192+
1193+
orig := res.DeepCopy().RuntimeObject()
1194+
r.rd.MarkManaged(res)
1195+
r.rd.MarkAdopted(res)
1196+
res, err = r.patchResourceMetadataAndSpec(ctx, rm, r.rd.ResourceFromRuntimeObject(orig), res)
1197+
if err != nil {
1198+
return err
1199+
}
1200+
rlog.Debug("marked resource as managed")
1201+
return nil
1202+
}
11761203

11771204
// setResourceUnmanaged removes a finalizer from the underlying CR in the
11781205
// 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)