diff --git a/pkg/runtime/reconciler.go b/pkg/runtime/reconciler.go index e41c59c..0a55e53 100644 --- a/pkg/runtime/reconciler.go +++ b/pkg/runtime/reconciler.go @@ -568,34 +568,34 @@ func (r *resourceReconciler) Sync( err = rm.EnsureTags(ctx, resolved, r.sc.GetMetadata()) rlog.Exit("rm.EnsureTags", err) if err != nil { - return resolved, err + return latest, err } } rlog.Enter("rm.ReadOne") - latest, err = rm.ReadOne(ctx, resolved) + observed, err := rm.ReadOne(ctx, resolved) rlog.Exit("rm.ReadOne", err) if err != nil { if err != ackerr.NotFound { - return resolved, err + return returnLatestIfNil(observed, latest), err } if adoptionPolicy == AdoptionPolicy_Adopt || isAdopted { - return resolved, ackerr.AdoptedResourceNotFound + return returnLatestIfNil(observed, latest), ackerr.AdoptedResourceNotFound } if isReadOnly { - return resolved, ackerr.ReadOnlyResourceNotFound + return returnLatestIfNil(observed, latest), ackerr.ReadOnlyResourceNotFound } - if latest, err = r.createResource(ctx, rm, resolved); err != nil { - return resolved, err + if observed, err = r.createResource(ctx, rm, resolved); err != nil { + return returnLatestIfNil(observed, latest), err } } else if adoptionPolicy == AdoptionPolicy_Adopt { - rm.FilterSystemTags(latest, r.cfg.ResourceTagKeys) - if err = r.setResourceManagedAndAdopted(ctx, rm, latest); err != nil { - return resolved, err + rm.FilterSystemTags(observed, r.cfg.ResourceTagKeys) + if err = r.setResourceManagedAndAdopted(ctx, rm, observed); err != nil { + return observed, err } - latest, err = r.patchResourceMetadataAndSpec(ctx, rm, desired, latest) + observed, err = r.patchResourceMetadataAndSpec(ctx, rm, desired, observed) if err != nil { - return resolved, err + return returnLatestIfNil(observed, latest), err } } else if isReadOnly { delta := r.rd.Delta(desired, latest) @@ -606,26 +606,26 @@ func (r *resourceReconciler) Sync( "diff", delta.Differences, ) } - return latest, nil + return observed, nil } else { if adoptionPolicy == AdoptionPolicy_AdoptOrCreate { // set adopt-or-create resource as managed // and requeue to ensure status is patched - if err = r.setResourceManagedAndAdopted(ctx, rm, latest); err != nil { - return latest, err + if err = r.setResourceManagedAndAdopted(ctx, rm, observed); err != nil { + return observed, err } err = requeue.Needed(fmt.Errorf("adopted resource, requeuing to check for updates")) - return latest, err + return observed, err } - if latest, err = r.updateResource(ctx, rm, resolved, latest); err != nil { - return latest, err + if observed, err = r.updateResource(ctx, rm, resolved, latest); err != nil { + return returnLatestIfNil(observed, latest), err } } // Attempt to late initialize the resource. If there are no fields to // late initialize, this operation will be a no-op. - lateInitialized, err := r.lateInitializeResource(ctx, rm, latest) + lateInitialized, err := r.lateInitializeResource(ctx, rm, observed) if err != nil { - return latest, err + return observed, err } return lateInitialized, nil } diff --git a/pkg/runtime/util.go b/pkg/runtime/util.go index cd27f1f..a9af565 100644 --- a/pkg/runtime/util.go +++ b/pkg/runtime/util.go @@ -24,6 +24,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" ackv1alpha1 "github.com/aws-controllers-k8s/runtime/apis/core/v1alpha1" + "github.com/aws-controllers-k8s/runtime/pkg/types" acktypes "github.com/aws-controllers-k8s/runtime/pkg/types" ) @@ -333,3 +334,10 @@ func patchStatus( ) error { return patchWithRetry(ctx, kc, apiReader, obj, patch, logger, OperationType_Status) } + +func returnLatestIfNil(observed, latest types.AWSResource) types.AWSResource { + if observed == nil { + return latest + } + return observed +}