@@ -46,52 +46,35 @@ func (rm *resourceManager) syncRoutes(
4646 rlog := ackrtlog .FromContext (ctx )
4747 exit := rlog .Trace ("rm.syncRoutes" )
4848 defer func (err error ) { exit (err ) }(err )
49- toAdd := []* svcapitypes.CreateRouteInput {}
50- toDelete := []* svcapitypes.CreateRouteInput {}
5149
5250 if latest != nil {
51+ latest .ko .Spec .Routes = removeLocalRoute (latest .ko .Spec .Routes )
5352 latest .ko .Spec .Routes , err = rm .excludeAWSRoute (ctx , latest .ko .Spec .Routes )
5453 if err != nil {
5554 return err
5655 }
5756 }
5857 if desired != nil {
58+ desired .ko .Spec .Routes = removeLocalRoute (desired .ko .Spec .Routes )
5959 desired .ko .Spec .Routes , err = rm .excludeAWSRoute (ctx , desired .ko .Spec .Routes )
6060 if err != nil {
6161 return err
6262 }
6363 }
6464
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
8268 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
9374 }
9475
76+ // Delete and add the routes that were found to be different between desired
77+ // and latest.
9578 for _ , route := range toDelete {
9679 rlog .Debug ("deleting route from route table" )
9780 if err = rm .deleteRoute (ctx , latest , * route ); err != nil {
@@ -108,60 +91,6 @@ func (rm *resourceManager) syncRoutes(
10891 return nil
10992}
11093
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-
16594func (rm * resourceManager ) createRoute (
16695 ctx context.Context ,
16796 r * resource ,
@@ -270,13 +199,56 @@ var computeTagsDelta = tags.ComputeTagsDelta
270199
271200// customPreCompare ensures that default values of types are initialised and
272201// 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.
273205func customPreCompare (
274206 delta * ackcompare.Delta ,
275207 a * resource ,
276208 b * resource ,
277209) {
278210 a .ko .Spec .Routes = removeLocalRoute (a .ko .Spec .Routes )
279211 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
280252}
281253
282254// removeLocalRoute will filter out any routes that have a gateway ID that
0 commit comments