Skip to content

Commit 1163c8e

Browse files
authored
Update rm.EnsureTags to accept controller metadata (#91)
Issue #, if available: aws-controllers-k8s/community#1261 Description of changes: * Pass `acktypes.ServiceControllerMetadata` parameter to `rm.EnsureTags` so that tag formats like `%CONTROLLER_VERSION%` can be resolved. * ACK controller metadata required to expand tag formats is present inside `ServiceControllerMetadata` object. * Change the return type of `ackrt.GetDefaultTags` method from `map[string]string` to `acktags.Tags` . By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent de27382 commit 1163c8e

File tree

6 files changed

+64
-61
lines changed

6 files changed

+64
-61
lines changed

mocks/pkg/types/aws_resource_manager.go

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/runtime/reconciler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ func (r *resourceReconciler) Sync(
234234
desired = resolvedRefDesired
235235

236236
rlog.Enter("rm.EnsureTags")
237-
err = rm.EnsureTags(ctx, desired)
237+
err = rm.EnsureTags(ctx, desired, r.sc.GetMetadata())
238238
rlog.Exit("rm.EnsureTags", err)
239239
if err != nil {
240240
return desired, err
@@ -386,7 +386,7 @@ func (r *resourceReconciler) createResource(
386386
// because they are not persisted in etcd. So we again ensure
387387
// that tags are present before performing the create operation.
388388
rlog.Enter("rm.EnsureTags")
389-
err = rm.EnsureTags(ctx, desired)
389+
err = rm.EnsureTags(ctx, desired, r.sc.GetMetadata())
390390
rlog.Exit("rm.EnsureTags", err)
391391
if err != nil {
392392
return desired, err

pkg/runtime/reconciler_test.go

Lines changed: 48 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ func reconcilerMocks(
8484
) (
8585
acktypes.AWSResourceReconciler,
8686
*ctrlrtclientmock.Client,
87+
acktypes.ServiceControllerMetadata,
8788
) {
8889
zapOptions := ctrlrtzap.Options{
8990
Development: true,
@@ -94,11 +95,13 @@ func reconcilerMocks(
9495
metrics := ackmetrics.NewMetrics("bookstore")
9596

9697
sc := &ackmocks.ServiceController{}
98+
scmd := acktypes.ServiceControllerMetadata{}
99+
sc.On("GetMetadata").Return(scmd)
97100
kc := &ctrlrtclientmock.Client{}
98101

99102
return ackrt.NewReconcilerWithClient(
100103
sc, kc, rmf, fakeLogger, cfg, metrics, ackrtcache.Caches{},
101-
), kc
104+
), kc, scmd
102105
}
103106

104107
func managedResourceManagerFactoryMocks(
@@ -183,9 +186,9 @@ func TestReconcilerCreate_BackoffRetries(t *testing.T) {
183186
rd.On("IsManaged", desired).Return(true)
184187
rd.On("Delta", desired, latest).Return(ackcompare.NewDelta())
185188
rd.On("Delta", latest, latest).Return(ackcompare.NewDelta())
186-
rm.On("EnsureTags", ctx, desired).Return(nil)
187189

188-
r, kc := reconcilerMocks(rmf)
190+
r, kc, scmd := reconcilerMocks(rmf)
191+
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
189192
kc.On("Patch", ctx, latestRTObj, mock.AnythingOfType("*client.mergeFromPatch")).Return(nil)
190193
_, err := r.Sync(ctx, rm, desired)
191194
require.Nil(err)
@@ -241,9 +244,9 @@ func TestReconcilerCreate_UnManagedResource_CheckReferencesResolveTwice(t *testi
241244
rd.On("IsManaged", desired).Return(true)
242245
rd.On("Delta", desired, latest).Return(ackcompare.NewDelta())
243246
rd.On("Delta", latest, latest).Return(ackcompare.NewDelta())
244-
rm.On("EnsureTags", ctx, desired).Return(nil)
245247

246-
r, kc := reconcilerMocks(rmf)
248+
r, kc, scmd := reconcilerMocks(rmf)
249+
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
247250

248251
// pointers returned from "client.MergeFrom" fails the equality check during
249252
// assertion even when parameters inside two objects are same.
@@ -269,7 +272,7 @@ func TestReconcilerCreate_UnManagedResource_CheckReferencesResolveTwice(t *testi
269272
rm.AssertCalled(t, "LateInitialize", ctx, latest)
270273
rm.AssertCalled(t, "IsSynced", ctx, latest)
271274
rm.AssertNumberOfCalls(t, "EnsureTags", 2)
272-
rm.AssertCalled(t, "EnsureTags", ctx, desired)
275+
rm.AssertCalled(t, "EnsureTags", ctx, desired, scmd)
273276
}
274277

275278
func TestReconcilerCreate_ManagedResource_CheckReferencesResolveOnce(t *testing.T) {
@@ -319,9 +322,9 @@ func TestReconcilerCreate_ManagedResource_CheckReferencesResolveOnce(t *testing.
319322
rd.On("IsManaged", desired).Return(true)
320323
rd.On("Delta", desired, latest).Return(ackcompare.NewDelta())
321324
rd.On("Delta", latest, latest).Return(ackcompare.NewDelta())
322-
rm.On("EnsureTags", ctx, desired).Return(nil)
323325

324-
r, kc := reconcilerMocks(rmf)
326+
r, kc, scmd := reconcilerMocks(rmf)
327+
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
325328

326329
// pointers returned from "client.MergeFrom" fails the equality check during
327330
// assertion even when parameters inside two objects are same.
@@ -347,7 +350,7 @@ func TestReconcilerCreate_ManagedResource_CheckReferencesResolveOnce(t *testing.
347350
rm.AssertCalled(t, "LateInitialize", ctx, latest)
348351
rm.AssertCalled(t, "IsSynced", ctx, latest)
349352
rm.AssertNumberOfCalls(t, "EnsureTags", 1)
350-
rm.AssertCalled(t, "EnsureTags", ctx, desired)
353+
rm.AssertCalled(t, "EnsureTags", ctx, desired, scmd)
351354
}
352355

353356
func TestReconcilerUpdate(t *testing.T) {
@@ -399,9 +402,9 @@ func TestReconcilerUpdate(t *testing.T) {
399402

400403
rm.On("LateInitialize", ctx, latest).Return(latest, nil)
401404
rd.On("Delta", latest, latest).Return(ackcompare.NewDelta())
402-
rm.On("EnsureTags", ctx, desired).Return(nil)
403405

404-
r, kc := reconcilerMocks(rmf)
406+
r, kc, scmd := reconcilerMocks(rmf)
407+
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
405408

406409
// pointers returned from "client.MergeFrom" fails the equality check during
407410
// assertion even when parameters inside two objects are same.
@@ -427,7 +430,7 @@ func TestReconcilerUpdate(t *testing.T) {
427430
kc.AssertNotCalled(t, "Status")
428431
rm.AssertCalled(t, "LateInitialize", ctx, latest)
429432
rm.AssertCalled(t, "IsSynced", ctx, latest)
430-
rm.AssertCalled(t, "EnsureTags", ctx, desired)
433+
rm.AssertCalled(t, "EnsureTags", ctx, desired, scmd)
431434
}
432435

433436
func TestReconcilerUpdate_ResourceNotSynced(t *testing.T) {
@@ -483,9 +486,9 @@ func TestReconcilerUpdate_ResourceNotSynced(t *testing.T) {
483486

484487
rm.On("LateInitialize", ctx, latest).Return(latest, nil)
485488
rd.On("Delta", latest, latest).Return(ackcompare.NewDelta())
486-
rm.On("EnsureTags", ctx, desired).Return(nil)
487489

488-
r, kc := reconcilerMocks(rmf)
490+
r, kc, scmd := reconcilerMocks(rmf)
491+
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
489492

490493
// pointers returned from "client.MergeFrom" fails the equality check during
491494
// assertion even when parameters inside two objects are same.
@@ -509,7 +512,7 @@ func TestReconcilerUpdate_ResourceNotSynced(t *testing.T) {
509512
kc.AssertNotCalled(t, "Status")
510513
rm.AssertCalled(t, "LateInitialize", ctx, latest)
511514
rm.AssertCalled(t, "IsSynced", ctx, latest)
512-
rm.AssertCalled(t, "EnsureTags", ctx, desired)
515+
rm.AssertCalled(t, "EnsureTags", ctx, desired, scmd)
513516
}
514517

515518
func TestReconcilerUpdate_NoDelta_ResourceNotSynced(t *testing.T) {
@@ -558,9 +561,9 @@ func TestReconcilerUpdate_NoDelta_ResourceNotSynced(t *testing.T) {
558561

559562
rm.On("LateInitialize", ctx, latest).Return(latest, nil)
560563
rd.On("Delta", latest, latest).Return(delta)
561-
rm.On("EnsureTags", ctx, desired).Return(nil)
562564

563-
r, kc := reconcilerMocks(rmf)
565+
r, kc, scmd := reconcilerMocks(rmf)
566+
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
564567

565568
// pointers returned from "client.MergeFrom" fails the equality check during
566569
// assertion even when parameters inside two objects are same.
@@ -585,7 +588,7 @@ func TestReconcilerUpdate_NoDelta_ResourceNotSynced(t *testing.T) {
585588
kc.AssertNotCalled(t, "Status")
586589
rm.AssertCalled(t, "LateInitialize", ctx, latest)
587590
rm.AssertCalled(t, "IsSynced", ctx, latest)
588-
rm.AssertCalled(t, "EnsureTags", ctx, desired)
591+
rm.AssertCalled(t, "EnsureTags", ctx, desired, scmd)
589592
}
590593

591594
func TestReconcilerUpdate_NoDelta_ResourceSynced(t *testing.T) {
@@ -634,9 +637,9 @@ func TestReconcilerUpdate_NoDelta_ResourceSynced(t *testing.T) {
634637

635638
rm.On("LateInitialize", ctx, latest).Return(latest, nil)
636639
rd.On("Delta", latest, latest).Return(delta)
637-
rm.On("EnsureTags", ctx, desired).Return(nil)
638640

639-
r, kc := reconcilerMocks(rmf)
641+
r, kc, scmd := reconcilerMocks(rmf)
642+
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
640643

641644
// pointers returned from "client.MergeFrom" fails the equality check during
642645
// assertion even when parameters inside two objects are same.
@@ -661,7 +664,7 @@ func TestReconcilerUpdate_NoDelta_ResourceSynced(t *testing.T) {
661664
kc.AssertNotCalled(t, "Status")
662665
rm.AssertCalled(t, "LateInitialize", ctx, latest)
663666
rm.AssertCalled(t, "IsSynced", ctx, latest)
664-
rm.AssertCalled(t, "EnsureTags", ctx, desired)
667+
rm.AssertCalled(t, "EnsureTags", ctx, desired, scmd)
665668
}
666669

667670
func TestReconcilerUpdate_IsSyncedError(t *testing.T) {
@@ -721,9 +724,9 @@ func TestReconcilerUpdate_IsSyncedError(t *testing.T) {
721724

722725
rm.On("LateInitialize", ctx, latest).Return(latest, nil)
723726
rd.On("Delta", latest, latest).Return(ackcompare.NewDelta())
724-
rm.On("EnsureTags", ctx, desired).Return(nil)
725727

726-
r, kc := reconcilerMocks(rmf)
728+
r, kc, scmd := reconcilerMocks(rmf)
729+
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
727730

728731
// pointers returned from "client.MergeFrom" fails the equality check during
729732
// assertion even when parameters inside two objects are same.
@@ -747,7 +750,7 @@ func TestReconcilerUpdate_IsSyncedError(t *testing.T) {
747750
kc.AssertNotCalled(t, "Status")
748751
rm.AssertCalled(t, "LateInitialize", ctx, latest)
749752
rm.AssertCalled(t, "IsSynced", ctx, latest)
750-
rm.AssertCalled(t, "EnsureTags", ctx, desired)
753+
rm.AssertCalled(t, "EnsureTags", ctx, desired, scmd)
751754
}
752755

753756
func TestReconcilerUpdate_PatchMetadataAndSpec_DiffInMetadata(t *testing.T) {
@@ -795,9 +798,9 @@ func TestReconcilerUpdate_PatchMetadataAndSpec_DiffInMetadata(t *testing.T) {
795798
rm.On("LateInitialize", ctx, latest).Return(latest, nil)
796799
rm.On("IsSynced", ctx, latest).Return(true, nil)
797800
rd.On("Delta", latest, latest).Return(ackcompare.NewDelta())
798-
rm.On("EnsureTags", ctx, desired).Return(nil)
799801

800-
r, kc := reconcilerMocks(rmf)
802+
r, kc, scmd := reconcilerMocks(rmf)
803+
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
801804

802805
kc.On("Patch", ctx, latestRTObj, mock.AnythingOfType("*client.mergeFromPatch")).Return(nil)
803806

@@ -813,7 +816,7 @@ func TestReconcilerUpdate_PatchMetadataAndSpec_DiffInMetadata(t *testing.T) {
813816
rm.AssertCalled(t, "LateInitialize", ctx, latest)
814817
latest.AssertCalled(t, "DeepCopy")
815818
latest.AssertCalled(t, "SetStatus", latest)
816-
rm.AssertCalled(t, "EnsureTags", ctx, desired)
819+
rm.AssertCalled(t, "EnsureTags", ctx, desired, scmd)
817820
}
818821

819822
func TestReconcilerUpdate_PatchMetadataAndSpec_DiffInSpec(t *testing.T) {
@@ -872,9 +875,9 @@ func TestReconcilerUpdate_PatchMetadataAndSpec_DiffInSpec(t *testing.T) {
872875
rm.On("LateInitialize", ctx, latest).Return(latest, nil)
873876
rm.On("IsSynced", ctx, latest).Return(true, nil)
874877
rd.On("Delta", latest, latest).Return(ackcompare.NewDelta())
875-
rm.On("EnsureTags", ctx, desired).Return(nil)
876878

877-
r, kc := reconcilerMocks(rmf)
879+
r, kc, scmd := reconcilerMocks(rmf)
880+
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
878881

879882
kc.On("Patch", ctx, latestRTObj, mock.AnythingOfType("*client.mergeFromPatch")).Return(nil)
880883

@@ -888,7 +891,7 @@ func TestReconcilerUpdate_PatchMetadataAndSpec_DiffInSpec(t *testing.T) {
888891
// Only the HandleReconcilerError wrapper function ever calls patchResourceStatus
889892
kc.AssertNotCalled(t, "Status")
890893
rm.AssertCalled(t, "LateInitialize", ctx, latest)
891-
rm.AssertCalled(t, "EnsureTags", ctx, desired)
894+
rm.AssertCalled(t, "EnsureTags", ctx, desired, scmd)
892895
}
893896

894897
func TestReconcilerHandleReconcilerError_PatchStatus_Latest(t *testing.T) {
@@ -917,7 +920,7 @@ func TestReconcilerHandleReconcilerError_PatchStatus_Latest(t *testing.T) {
917920
latestMetaObj.SetAnnotations(map[string]string{"a": "b"})
918921

919922
rmf, _ := managedResourceManagerFactoryMocks(desired, latest)
920-
r, kc := reconcilerMocks(rmf)
923+
r, kc, _ := reconcilerMocks(rmf)
921924

922925
statusWriter := &ctrlrtclientmock.StatusWriter{}
923926
kc.On("Status").Return(statusWriter)
@@ -942,7 +945,7 @@ func TestReconcilerHandleReconcilerError_NoPatchStatus_NoLatest(t *testing.T) {
942945
desired.On("ReplaceConditions", []*ackv1alpha1.Condition{}).Return()
943946

944947
rmf, _ := managedResourceManagerFactoryMocks(desired, nil)
945-
r, kc := reconcilerMocks(rmf)
948+
r, kc, _ := reconcilerMocks(rmf)
946949

947950
statusWriter := &ctrlrtclientmock.StatusWriter{}
948951
kc.On("Status").Return(statusWriter)
@@ -1019,9 +1022,9 @@ func TestReconcilerUpdate_ErrorInLateInitialization(t *testing.T) {
10191022
rm.On("LateInitialize", ctx, latest).Return(latest, requeueError)
10201023
rm.On("IsSynced", ctx, latest).Return(true, nil)
10211024
rd.On("Delta", latest, latest).Return(ackcompare.NewDelta())
1022-
rm.On("EnsureTags", ctx, desired).Return(nil)
10231025

1024-
r, kc := reconcilerMocks(rmf)
1026+
r, kc, scmd := reconcilerMocks(rmf)
1027+
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
10251028

10261029
kc.On("Patch", ctx, latestRTObj, mock.AnythingOfType("*client.mergeFromPatch")).Return(nil)
10271030

@@ -1036,7 +1039,7 @@ func TestReconcilerUpdate_ErrorInLateInitialization(t *testing.T) {
10361039
// No difference in desired, latest metadata and spec
10371040
kc.AssertNotCalled(t, "Patch", ctx, latestRTObj, mock.AnythingOfType("*client.mergeFromPatch"))
10381041
rm.AssertCalled(t, "LateInitialize", ctx, latest)
1039-
rm.AssertCalled(t, "EnsureTags", ctx, desired)
1042+
rm.AssertCalled(t, "EnsureTags", ctx, desired, scmd)
10401043
}
10411044

10421045
func TestReconcilerUpdate_ResourceNotManaged(t *testing.T) {
@@ -1124,11 +1127,11 @@ func TestReconcilerUpdate_ResourceNotManaged(t *testing.T) {
11241127
latest, nil,
11251128
)
11261129
rm.On("IsSynced", ctx, latest).Return(true, nil)
1127-
rm.On("EnsureTags", ctx, desired).Return(nil)
11281130

11291131
rmf, rd := managerFactoryMocks(desired, latest, false)
11301132

1131-
r, _ := reconcilerMocks(rmf)
1133+
r, _, scmd := reconcilerMocks(rmf)
1134+
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
11321135

11331136
_, err := r.Sync(ctx, rm, desired)
11341137
require.NotNil(err)
@@ -1138,7 +1141,7 @@ func TestReconcilerUpdate_ResourceNotManaged(t *testing.T) {
11381141
rd.AssertNotCalled(t, "Delta", desired, latest)
11391142
rm.AssertNotCalled(t, "Update", ctx, desired, latest, delta)
11401143
rm.AssertNotCalled(t, "LateInitialize", ctx, latest)
1141-
rm.AssertCalled(t, "EnsureTags", ctx, desired)
1144+
rm.AssertCalled(t, "EnsureTags", ctx, desired, scmd)
11421145
}
11431146

11441147
func TestReconcilerUpdate_ResolveReferencesError(t *testing.T) {
@@ -1201,9 +1204,9 @@ func TestReconcilerUpdate_ResolveReferencesError(t *testing.T) {
12011204
rm.On("LateInitialize", ctx, latest).Return(latest, nil)
12021205
rm.On("IsSynced", ctx, latest).Return(true, nil)
12031206
rd.On("Delta", latest, latest).Return(ackcompare.NewDelta())
1204-
rm.On("EnsureTags", ctx, desired).Return(nil)
12051207

1206-
r, kc := reconcilerMocks(rmf)
1208+
r, kc, scmd := reconcilerMocks(rmf)
1209+
rm.On("EnsureTags", ctx, desired, scmd).Return(nil)
12071210

12081211
kc.On("Patch", ctx, latestRTObj, mock.AnythingOfType("*client.mergeFromPatch")).Return(nil)
12091212

@@ -1223,7 +1226,7 @@ func TestReconcilerUpdate_ResolveReferencesError(t *testing.T) {
12231226
// Only the HandleReconcilerError wrapper function ever calls patchResourceStatus
12241227
kc.AssertNotCalled(t, "Status")
12251228
rm.AssertNotCalled(t, "LateInitialize", ctx, latest)
1226-
rm.AssertNotCalled(t, "EnsureTags", ctx, desired)
1229+
rm.AssertNotCalled(t, "EnsureTags", ctx, desired, scmd)
12271230
}
12281231

12291232
func TestReconcilerUpdate_EnsureControllerTagsError(t *testing.T) {
@@ -1284,12 +1287,12 @@ func TestReconcilerUpdate_EnsureControllerTagsError(t *testing.T) {
12841287
rm.On("LateInitialize", ctx, latest).Return(latest, nil)
12851288
rm.On("IsSynced", ctx, latest).Return(true, nil)
12861289
rd.On("Delta", latest, latest).Return(ackcompare.NewDelta())
1287-
rm.On("EnsureTags", ctx, desired).Return(
1290+
1291+
r, kc, scmd := reconcilerMocks(rmf)
1292+
rm.On("EnsureTags", ctx, desired, scmd).Return(
12881293
ensureControllerTagsError,
12891294
)
12901295

1291-
r, kc := reconcilerMocks(rmf)
1292-
12931296
kc.On("Patch", ctx, latestRTObj, mock.AnythingOfType("*client.mergeFromPatch")).Return(nil)
12941297

12951298
// With the above mocks and below assertions, we check that if we got a
@@ -1308,5 +1311,5 @@ func TestReconcilerUpdate_EnsureControllerTagsError(t *testing.T) {
13081311
// Only the HandleReconcilerError wrapper function ever calls patchResourceStatus
13091312
kc.AssertNotCalled(t, "Status")
13101313
rm.AssertNotCalled(t, "LateInitialize", ctx, latest)
1311-
rm.AssertCalled(t, "EnsureTags", ctx, desired)
1314+
rm.AssertCalled(t, "EnsureTags", ctx, desired, scmd)
13121315
}

pkg/runtime/tags.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@ func GetDefaultTags(
8282
config *ackconfig.Config,
8383
obj rtclient.Object,
8484
md acktypes.ServiceControllerMetadata,
85-
) map[string]string {
85+
) acktags.Tags {
86+
defaultTags := acktags.NewTags()
8687
if obj == nil || config == nil || len(config.ResourceTags) == 0 {
87-
return nil
88+
return defaultTags
8889
}
89-
var populatedTags = make(map[string]string)
9090
for _, tagKeyVal := range config.ResourceTags {
9191
keyVal := strings.Split(tagKeyVal, "=")
9292
if keyVal == nil || len(keyVal) != 2 {
@@ -97,9 +97,9 @@ func GetDefaultTags(
9797
if key == "" || val == "" {
9898
continue
9999
}
100-
populatedTags[key] = expandTagValue(val, obj, md)
100+
defaultTags[key] = expandTagValue(val, obj, md)
101101
}
102-
return populatedTags
102+
return defaultTags
103103
}
104104

105105
// expandTagValue returns the tag value after expanding all the ACKResourceTag

0 commit comments

Comments
 (0)