11import uuid
22import base64
33from fastapi import APIRouter , HTTPException , Depends , Request
4+ from fastapi .responses import JSONResponse
45from pydantic .main import BaseModel
56from starlette .responses import Response
67from clients .ocp_routes import get_gwa_ocp_routes , kubectl_delete , prepare_apply_routes , apply_routes , prepare_mismatched_routes , delete_routes
@@ -168,13 +169,14 @@ async def verify_and_create_routes(namespace: str, request: Request):
168169 "name" : route ["metadata" ]["name" ],
169170 "selectTag" : route ["metadata" ]["labels" ]["aps-select-tag" ],
170171 "host" : route ["spec" ]["host" ],
171- "dataPlane" : route ["spec" ]["to" ]["name" ]
172+ "dataPlane" : route ["spec" ]["to" ]["name" ],
173+ "sessionCookieEnabled" : True if route ["metadata" ]["labels" ].get ("aps-template-version" ) == "v1" else False
172174 }
173175 )
174176
175177 insert_batch = [x for x in source_routes if not in_list (x , existing_routes )]
176- delete_batch = [y for y in existing_routes if not in_list (y , source_routes )]
177-
178+ delete_batch = [y for y in existing_routes if not in_list_by_name (y , source_routes )]
179+
178180 logger .debug ("insert batch: " + str (insert_batch ))
179181
180182 logger .debug ("delete batch: " + str (delete_batch ))
@@ -183,6 +185,9 @@ async def verify_and_create_routes(namespace: str, request: Request):
183185 # this info from ns_attributes
184186 ns_template_version = "v2"
185187
188+ inserted_count = 0
189+ deleted_count = 0
190+
186191 try :
187192 if len (insert_batch ) > 0 :
188193 source_folder = "%s/%s-%s" % ('/tmp/sync' , f'{ datetime .now ():%Y%m%d%H%M%S} ' , secrets .token_hex (5 ))
@@ -193,12 +198,16 @@ async def verify_and_create_routes(namespace: str, request: Request):
193198 for route in insert_batch :
194199 overrides = {}
195200 if 'sessionCookieEnabled' in route and route ['sessionCookieEnabled' ]:
196- overrides ['aps.route.session.cookie.enabled' ] = [ route ['host' ] ]
201+ overrides ['aps.route.session.cookie.enabled' ] = [route ['host' ]]
202+
197203 route_count = prepare_apply_routes (namespace , route ['selectTag' ], [
198204 route ['host' ]], source_folder , route ["dataPlane" ], ns_template_version , overrides )
205+
199206 logger .debug ("[%s] - Prepared %d routes" % (namespace , route_count ))
200207 apply_routes (source_folder )
201208 logger .debug ("[%s] - Applied %d routes" % (namespace , route_count ))
209+
210+ inserted_count += route_count
202211 except Exception as ex :
203212 traceback .print_exc ()
204213 logger .error ("Error creating routes. %s" % (ex ))
@@ -216,6 +225,7 @@ async def verify_and_create_routes(namespace: str, request: Request):
216225 try :
217226 kubectl_delete ('route' , route ["name" ])
218227 logger .debug ("[%s] - Deleted route %s" % (namespace , route ["name" ]))
228+ deleted_count += 1
219229 except Exception as ex :
220230 traceback .print_exc ()
221231 logger .error ("Failed deleting route %s" % route ["name" ])
@@ -226,8 +236,12 @@ async def verify_and_create_routes(namespace: str, request: Request):
226236 traceback .print_exc ()
227237 logger .error ("Failed deleting route %s" % route ["name" ])
228238 raise HTTPException (status_code = 400 , detail = str (sys .exc_info ()[0 ]))
229- return Response (status_code = 200 , content = '{"message": "synced"}' )
230239
240+ return JSONResponse (status_code = 200 , content = {
241+ "message" : "synced" ,
242+ "inserted_count" : inserted_count ,
243+ "deleted_count" : deleted_count
244+ })
231245
232246def get_data_plane (ns_attributes ):
233247 default_data_plane = settings .defaultDataPlane
@@ -236,12 +250,18 @@ def get_data_plane(ns_attributes):
236250def get_template_version (ns_attributes ):
237251 return ns_attributes .get ('template-version' , ["v2" ])[0 ]
238252
239- def in_list (match , list ):
253+ def in_list (match , list ):
240254 match_ref = build_ref (match )
241255 for item in list :
242256 if build_ref (item ) == match_ref :
243257 return True
244258 return False
245259
246260def build_ref (v ):
247- return "%s%s%s%s" % (v ['name' ], v ['selectTag' ], v ['host' ], v ['dataPlane' ])
261+ return "%s%s%s%s%s" % (v ['name' ], v ['selectTag' ], v ['host' ], v ['dataPlane' ], v ['sessionCookieEnabled' ])
262+
263+ def in_list_by_name (match , list ):
264+ for item in list :
265+ if item ['name' ] == match ['name' ]:
266+ return True
267+ return False
0 commit comments