@@ -46,52 +46,35 @@ func (rm *resourceManager) syncRoutes(
46
46
rlog := ackrtlog .FromContext (ctx )
47
47
exit := rlog .Trace ("rm.syncRoutes" )
48
48
defer func (err error ) { exit (err ) }(err )
49
- toAdd := []* svcapitypes.CreateRouteInput {}
50
- toDelete := []* svcapitypes.CreateRouteInput {}
51
49
52
50
if latest != nil {
51
+ latest .ko .Spec .Routes = removeLocalRoute (latest .ko .Spec .Routes )
53
52
latest .ko .Spec .Routes , err = rm .excludeAWSRoute (ctx , latest .ko .Spec .Routes )
54
53
if err != nil {
55
54
return err
56
55
}
57
56
}
58
57
if desired != nil {
58
+ desired .ko .Spec .Routes = removeLocalRoute (desired .ko .Spec .Routes )
59
59
desired .ko .Spec .Routes , err = rm .excludeAWSRoute (ctx , desired .ko .Spec .Routes )
60
60
if err != nil {
61
61
return err
62
62
}
63
63
}
64
64
65
- for _ , desiredRoute := range desired .ko .Spec .Routes {
66
- if (* desiredRoute ).GatewayID != nil && * desiredRoute .GatewayID == LocalRouteGateway {
67
- // no-op for default route
68
- continue
69
- }
70
- if latestRoute := getMatchingRoute (desiredRoute , latest ); latestRoute != nil {
71
- delta := compareCreateRouteInput (desiredRoute , latestRoute )
72
- if len (delta .Differences ) > 0 {
73
- // "update" route by deleting old route and adding the new route
74
- toDelete = append (toDelete , latestRoute )
75
- toAdd = append (toAdd , desiredRoute )
76
- }
77
- } else {
78
- // a desired route is not in latest; therefore, create
79
- toAdd = append (toAdd , desiredRoute )
80
- }
81
- }
65
+ // Get the routes that need to be added and deleted, by checking for
66
+ // differences between desired and latest.
67
+ var toAdd , toDelete []* svcapitypes.CreateRouteInput
82
68
if latest != nil {
83
- for _ , latestRoute := range latest .ko .Spec .Routes {
84
- if (* latestRoute ).GatewayID != nil && * latestRoute .GatewayID == LocalRouteGateway {
85
- // no-op for default route
86
- continue
87
- }
88
- if desiredRoute := getMatchingRoute (latestRoute , desired ); desiredRoute == nil {
89
- // latest has a route that is not desired; therefore, delete
90
- toDelete = append (toDelete , latestRoute )
91
- }
92
- }
69
+ toAdd , toDelete = getRoutesDifference (desired .ko .Spec .Routes , latest .ko .Spec .Routes )
70
+ } else {
71
+ // If method is called from the createRoutes method, then latest is nil
72
+ // and all routes must be added, as non exist yet.
73
+ toAdd = desired .ko .Spec .Routes
93
74
}
94
75
76
+ // Delete and add the routes that were found to be different between desired
77
+ // and latest.
95
78
for _ , route := range toDelete {
96
79
rlog .Debug ("deleting route from route table" )
97
80
if err = rm .deleteRoute (ctx , latest , * route ); err != nil {
@@ -108,60 +91,6 @@ func (rm *resourceManager) syncRoutes(
108
91
return nil
109
92
}
110
93
111
- func getMatchingRoute (
112
- routeToMatch * svcapitypes.CreateRouteInput ,
113
- resource * resource ,
114
- ) * svcapitypes.CreateRouteInput {
115
- if resource == nil {
116
- return nil
117
- }
118
-
119
- for _ , route := range resource .ko .Spec .Routes {
120
- delta := compareCreateRouteInput (routeToMatch , route )
121
- if len (delta .Differences ) == 0 {
122
- return route
123
- } else {
124
- if routeToMatch .CarrierGatewayID != nil {
125
- if ! delta .DifferentAt ("CreateRouteInput.CarrierGatewayID" ) {
126
- return route
127
- }
128
- }
129
- if routeToMatch .EgressOnlyInternetGatewayID != nil {
130
- if ! delta .DifferentAt ("CreateRouteInput.EgressOnlyInternetGatewayID" ) {
131
- return route
132
- }
133
- }
134
- if routeToMatch .GatewayID != nil {
135
- if ! delta .DifferentAt ("CreateRouteInput.GatewayID" ) {
136
- return route
137
- }
138
- }
139
- if routeToMatch .LocalGatewayID != nil {
140
- if ! delta .DifferentAt ("CreateRouteInput.LocalGatewayID" ) {
141
- return route
142
- }
143
- }
144
- if routeToMatch .NATGatewayID != nil {
145
- if ! delta .DifferentAt ("CreateRouteInput.NATGatewayID" ) {
146
- return route
147
- }
148
- }
149
- if routeToMatch .TransitGatewayID != nil {
150
- if ! delta .DifferentAt ("CreateRouteInput.TransitGatewayID" ) {
151
- return route
152
- }
153
- }
154
- if routeToMatch .VPCPeeringConnectionID != nil {
155
- if ! delta .DifferentAt ("CreateRouteInput.VPCPeeringConnectionID" ) {
156
- return route
157
- }
158
- }
159
- }
160
- }
161
-
162
- return nil
163
- }
164
-
165
94
func (rm * resourceManager ) createRoute (
166
95
ctx context.Context ,
167
96
r * resource ,
@@ -270,13 +199,56 @@ var computeTagsDelta = tags.ComputeTagsDelta
270
199
271
200
// customPreCompare ensures that default values of types are initialised and
272
201
// server side defaults are excluded from the delta.
202
+ // The left side (`A`) of any `Spec.Routes` diff contains the routes that are
203
+ // desired, but do not exist. Analogously, the right side (`B`) contains the
204
+ // routes that exist, but are not desired.
273
205
func customPreCompare (
274
206
delta * ackcompare.Delta ,
275
207
a * resource ,
276
208
b * resource ,
277
209
) {
278
210
a .ko .Spec .Routes = removeLocalRoute (a .ko .Spec .Routes )
279
211
b .ko .Spec .Routes = removeLocalRoute (b .ko .Spec .Routes )
212
+
213
+ desired , latest := getRoutesDifference (a .ko .Spec .Routes , b .ko .Spec .Routes )
214
+
215
+ if len (desired ) > 0 || len (latest ) > 0 {
216
+ delta .Add ("Spec.Routes" , a .ko .Spec .Routes , b .ko .Spec .Routes )
217
+ }
218
+ }
219
+
220
+ // getRoutesDifference compares the desired and latest routes. It returns the
221
+ // routes that are different and must be added or deleted.
222
+ func getRoutesDifference (desired , latest []* svcapitypes.CreateRouteInput ) (toAdd , toDelete []* svcapitypes.CreateRouteInput ) {
223
+ toDelete = make ([]* svcapitypes.CreateRouteInput , len (latest ))
224
+ copy (toDelete , latest )
225
+
226
+ remove := func (s []* svcapitypes.CreateRouteInput , i int ) []* svcapitypes.CreateRouteInput {
227
+ if i < len (s )- 1 { // if not last element just copy the last element to where the removed element was
228
+ s [i ] = s [len (s )- 1 ]
229
+ }
230
+ return s [:len (s )- 1 ]
231
+ }
232
+
233
+ // Routes that are desired, but already exist in latest, can be ignored. The
234
+ // toDelete slice is a copy of latest and will be slowly modified so that at
235
+ // the end it only contains routes that exist in latest, but are not
236
+ // desired.
237
+ for _ , routeA := range desired {
238
+ found := false
239
+ for idx , routeB := range toDelete {
240
+ if delta := compareCreateRouteInput (routeA , routeB ); len (delta .Differences ) == 0 {
241
+ toDelete = remove (toDelete , idx )
242
+ found = true
243
+ break
244
+ }
245
+ }
246
+ if ! found {
247
+ toAdd = append (toAdd , routeA .DeepCopy ())
248
+ }
249
+ }
250
+
251
+ return toAdd , toDelete
280
252
}
281
253
282
254
// removeLocalRoute will filter out any routes that have a gateway ID that
0 commit comments