Skip to content

Commit 16b957d

Browse files
authored
Enhance RouteTable CRD sync routes synchronisation (#199)
- Update `syncRoutes` method to handle errors from `excludeAWSRoute` - Reorder route deletion and addition in `syncRoutes` for proper sync - Modify `excludeAWSRoute` to return an error and rename variables for clarity - Move tags sync before routes sync in `customUpdateRouteTable` - Update `sdkCreate` to use a copy of the RouteTable for creating routes - Minor formatting and comment updates in template files The changes in this commit enhance the synchronization of routes for the RouteTable Custom Resource Definition (CRD). The `syncRoutes` method now handles errors returned from the `excludeAWSRoute` function and reorders the deletion and addition of routes for proper synchronization. The `excludeAWSRoute` function is modified to return an error and has some variable renaming for better clarity... In the `customUpdateRouteTable` method the tags synchronization is moved before the routes synchronization to ensure tagss are updated before route changes. The `sdkCreate` method now uses a deep copy of the RouteTable when creating routes to avoid modifying the original desired state By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 0a4469b commit 16b957d

File tree

5 files changed

+47
-38
lines changed

5 files changed

+47
-38
lines changed

apis/v1alpha1/ack-generate-metadata.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
ack_generate_info:
2-
build_date: "2024-06-04T06:39:17Z"
2+
build_date: "2024-06-19T06:55:08Z"
33
build_hash: 14cef51778d471698018b6c38b604181a6948248
4-
go_version: go1.22.3
4+
go_version: go1.22.4
55
version: v0.34.0
66
api_directory_checksum: 7fd395ceb7d5d8e35906991c7348d3498f384741
77
api_version: v1alpha1

pkg/resource/route_table/hooks.go

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,21 @@ func (rm *resourceManager) syncRoutes(
4444
) (err error) {
4545
rlog := ackrtlog.FromContext(ctx)
4646
exit := rlog.Trace("rm.syncRoutes")
47-
defer exit(err)
47+
defer func(err error) { exit(err) }(err)
4848
toAdd := []*svcapitypes.CreateRouteInput{}
4949
toDelete := []*svcapitypes.CreateRouteInput{}
5050

5151
if latest != nil {
52-
latest.ko.Spec.Routes = rm.excludeAwsRoute(latest.ko.Spec.Routes)
52+
latest.ko.Spec.Routes, err = rm.excludeAWSRoute(latest.ko.Spec.Routes)
53+
if err != nil {
54+
return err
55+
}
5356
}
5457
if desired != nil {
55-
desired.ko.Spec.Routes = rm.excludeAwsRoute(desired.ko.Spec.Routes)
58+
desired.ko.Spec.Routes, err = rm.excludeAWSRoute(desired.ko.Spec.Routes)
59+
if err != nil {
60+
return err
61+
}
5662
}
5763

5864
for _, desiredRoute := range desired.ko.Spec.Routes {
@@ -85,18 +91,18 @@ func (rm *resourceManager) syncRoutes(
8591
}
8692
}
8793

88-
for _, route := range toAdd {
89-
rlog.Debug("adding route to route table")
90-
if err = rm.createRoute(ctx, desired, *route); err != nil {
91-
return err
92-
}
93-
}
9494
for _, route := range toDelete {
9595
rlog.Debug("deleting route from route table")
9696
if err = rm.deleteRoute(ctx, latest, *route); err != nil {
9797
return err
9898
}
9999
}
100+
for _, route := range toAdd {
101+
rlog.Debug("adding route to route table")
102+
if err = rm.createRoute(ctx, desired, *route); err != nil {
103+
return err
104+
}
105+
}
100106

101107
return nil
102108
}
@@ -162,7 +168,7 @@ func (rm *resourceManager) createRoute(
162168
) (err error) {
163169
rlog := ackrtlog.FromContext(ctx)
164170
exit := rlog.Trace("rm.createRoute")
165-
defer exit(err)
171+
defer func(err error) { exit(err) }(err)
166172

167173
input := rm.newCreateRouteInput(c)
168174
// Routes should only be configurable for the
@@ -180,7 +186,7 @@ func (rm *resourceManager) deleteRoute(
180186
) (err error) {
181187
rlog := ackrtlog.FromContext(ctx)
182188
exit := rlog.Trace("rm.deleteRoute")
183-
defer exit(err)
189+
defer func(err error) { exit(err) }(err)
184190

185191
input := rm.newDeleteRouteInput(c)
186192
// Routes should only be configurable for the
@@ -199,7 +205,7 @@ func (rm *resourceManager) customUpdateRouteTable(
199205
) (updated *resource, err error) {
200206
rlog := ackrtlog.FromContext(ctx)
201207
exit := rlog.Trace("rm.customUpdateRouteTable")
202-
defer exit(err)
208+
defer func(err error) { exit(err) }(err)
203209

204210
// Default `updated` to `desired` because it is likely
205211
// EC2 `modify` APIs do NOT return output, only errors.
@@ -208,6 +214,16 @@ func (rm *resourceManager) customUpdateRouteTable(
208214
// (now updated.Spec) reflects the latest resource state.
209215
updated = rm.concreteResource(desired.DeepCopy())
210216

217+
if delta.DifferentAt("Spec.Tags") {
218+
if err := tags.Sync(
219+
ctx, rm.sdkapi, rm.metrics,
220+
*latest.ko.Status.RouteTableID,
221+
desired.ko.Spec.Tags, latest.ko.Spec.Tags,
222+
); err != nil {
223+
return nil, err
224+
}
225+
}
226+
211227
if delta.DifferentAt("Spec.Routes") {
212228
if err := rm.syncRoutes(ctx, desired, latest); err != nil {
213229
return nil, err
@@ -220,15 +236,6 @@ func (rm *resourceManager) customUpdateRouteTable(
220236
}
221237
}
222238

223-
if delta.DifferentAt("Spec.Tags") {
224-
if err := tags.Sync(
225-
ctx, rm.sdkapi, rm.metrics, *latest.ko.Status.RouteTableID,
226-
desired.ko.Spec.Tags, latest.ko.Spec.Tags,
227-
); err != nil {
228-
return nil, err
229-
}
230-
}
231-
232239
return updated, nil
233240
}
234241

@@ -287,9 +294,9 @@ func removeLocalRoute(
287294
return ret
288295
}
289296

290-
func (rm *resourceManager) excludeAwsRoute(
297+
func (rm *resourceManager) excludeAWSRoute(
291298
routes []*svcapitypes.CreateRouteInput,
292-
) (ret []*svcapitypes.CreateRouteInput) {
299+
) (ret []*svcapitypes.CreateRouteInput, err error) {
293300
ret = make([]*svcapitypes.CreateRouteInput, 0)
294301
var prefixListIds []*string
295302

@@ -300,20 +307,21 @@ func (rm *resourceManager) excludeAwsRoute(
300307
return route.DestinationPrefixListID != nil
301308
})
302309

303-
prefix_list_routes := lo.Filter(routes, func(route *svcapitypes.CreateRouteInput, index int) bool {
310+
prefixListRoutes := lo.Filter(routes, func(route *svcapitypes.CreateRouteInput, index int) bool {
304311
return route.DestinationPrefixListID != nil
305312
})
306313

307-
prefixListIds = lo.Map(prefix_list_routes, func(route *svcapitypes.CreateRouteInput, _ int) *string {
314+
prefixListIds = lo.Map(prefixListRoutes, func(route *svcapitypes.CreateRouteInput, _ int) *string {
308315
return route.DestinationPrefixListID
309-
310316
})
311317

312-
var resp *svcsdk.DescribeManagedPrefixListsOutput
313318
input := &svcsdk.DescribeManagedPrefixListsInput{}
314319
input.PrefixListIds = prefixListIds
315-
resp, _ = rm.sdkapi.DescribeManagedPrefixLists(input)
320+
resp, err := rm.sdkapi.DescribeManagedPrefixLists(input)
316321
rm.metrics.RecordAPICall("READ_MANY", "DescribeManagedPrefixLists", nil)
322+
if err != nil {
323+
return ret, nil
324+
}
317325

318326
m := lo.FilterMap(resp.PrefixLists, func(mpl *svcsdk.ManagedPrefixList, _ int) (string, bool) {
319327
if strings.EqualFold(*mpl.OwnerId, "AWS") {
@@ -322,7 +330,7 @@ func (rm *resourceManager) excludeAwsRoute(
322330
return "", false
323331
})
324332

325-
filtered_routes := lo.FilterMap(prefix_list_routes, func(route *svcapitypes.CreateRouteInput, _ int) (*svcapitypes.CreateRouteInput, bool) {
333+
filtered_routes := lo.FilterMap(prefixListRoutes, func(route *svcapitypes.CreateRouteInput, _ int) (*svcapitypes.CreateRouteInput, bool) {
326334
found := lo.IndexOf(m, *route.DestinationPrefixListID)
327335
if found == -1 {
328336
return route, true
@@ -331,7 +339,7 @@ func (rm *resourceManager) excludeAwsRoute(
331339
})
332340
ret = append(ret, filtered_routes...)
333341

334-
return ret
342+
return ret, nil
335343
}
336344

337345
// updateTagSpecificationsInCreateRequest adds

pkg/resource/route_table/sdk.go

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

templates/hooks/route_table/sdk_create_post_set_output.go.tpl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
if len(desired.ko.Spec.Routes) > 0 {
88
//desired routes are overwritten by RouteTable's default route
99
ko.Spec.Routes = append(ko.Spec.Routes, desired.ko.Spec.Routes...)
10-
if err := rm.createRoutes(ctx, &resource{ko}); err != nil {
10+
copy := ko.DeepCopy()
11+
if err := rm.createRoutes(ctx, &resource{copy}); err != nil {
1112
return nil, err
1213
}
1314
}
@@ -17,4 +18,4 @@
1718
// if desired tags and response tags are equal,
1819
// then assign desired tags to maintain tag order
1920
ko.Spec.Tags = desired.ko.Spec.Tags
20-
}
21+
}

templates/hooks/route_table/sdk_read_many_post_set_output.go.tpl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,4 @@
77
// if resource's initial tags and response tags are equal,
88
// then assign resource's tags to maintain tag order
99
ko.Spec.Tags = r.ko.Spec.Tags
10-
}
11-
10+
}

0 commit comments

Comments
 (0)