4
4
import json
5
5
import syslog
6
6
import subprocess
7
+ import argparse
7
8
from swsscommon import swsscommon
8
9
9
10
''' vnet_route_check.py: tool that verifies VNET routes consistancy between SONiC and vendor SDK DBs.
@@ -356,7 +357,40 @@ def get_sdk_vnet_routes_diff(routes):
356
357
return routes_diff
357
358
358
359
360
+ def filter_active_vnet_routes (vnet_routes : dict ):
361
+ """ Filters a dictionary containing VNet routes configured for each VNet in APP_DB.
362
+ For each VNet in "vnet_routes", only active routes are included in the returned dictionary.
363
+ Format (for both input and output):
364
+ { <vnet_name>: { 'routes': [ <pfx/pfx_len> ], 'vrf_oid': <oid> } }
365
+ """
366
+ state_db = swsscommon .DBConnector ("STATE_DB" , 0 )
367
+ vnet_route_tunnel_table = swsscommon .Table (state_db , "VNET_ROUTE_TUNNEL_TABLE" )
368
+
369
+ vnet_active_routes = {}
370
+ for vnet_name , vnet_info in vnet_routes .items ():
371
+ active_routes = []
372
+ for prefix in vnet_info ["routes" ]:
373
+ key = f"{ vnet_name } |{ prefix } "
374
+ exists , fvs = vnet_route_tunnel_table .get (key )
375
+ if not exists :
376
+ print_message (syslog .LOG_WARNING , f"VNET_ROUTE_TUNNEL_TABLE|{ key } does not exist in STATE DB." )
377
+ active_routes .append (prefix ) # Treating "prefix" as an active route
378
+ continue
379
+ fvs_dict = dict (fvs )
380
+ if fvs_dict .get ("state" ) == "active" :
381
+ active_routes .append (prefix )
382
+ if len (active_routes ) > 0 :
383
+ vnet_active_routes [vnet_name ] = {"routes" : active_routes , "vrf_oid" : vnet_info ["vrf_oid" ]}
384
+
385
+ return vnet_active_routes
386
+
387
+
359
388
def main ():
389
+ parser = argparse .ArgumentParser (
390
+ description = "A script that checks for VNet route mismatches between APP DB, ASIC DB, and SDK." )
391
+ parser .add_argument ("-a" , "--all" , action = "store_true" ,
392
+ help = "Find routes missed in ASIC DB by checking both active and inactive routes in APP DB." )
393
+ args = parser .parse_args ()
360
394
361
395
rc = RC_OK
362
396
@@ -365,14 +399,20 @@ def main():
365
399
return rc
366
400
asic_db = swsscommon .DBConnector ('ASIC_DB' , 0 )
367
401
virtual_router = swsscommon .Table (asic_db , 'ASIC_STATE:SAI_OBJECT_TYPE_VIRTUAL_ROUTER' )
368
- if virtual_router .getKeys () != []:
369
- global default_vrf_oid
370
- default_vrf_oid = virtual_router .getKeys ()[0 ]
402
+ global default_vrf_oid
403
+ default_vrf_oid = ""
404
+ vr_keys = virtual_router .getKeys ()
405
+ if vr_keys :
406
+ default_vrf_oid = vr_keys [0 ]
371
407
372
408
app_db_vnet_routes = get_vnet_routes_from_app_db ()
409
+ active_app_db_vnet_routes = filter_active_vnet_routes (app_db_vnet_routes )
373
410
asic_db_vnet_routes = get_vnet_routes_from_asic_db ()
374
411
375
- missed_in_asic_db_routes = get_vnet_routes_diff (asic_db_vnet_routes , app_db_vnet_routes ,True )
412
+ if args .all :
413
+ missed_in_asic_db_routes = get_vnet_routes_diff (asic_db_vnet_routes , app_db_vnet_routes , True )
414
+ else :
415
+ missed_in_asic_db_routes = get_vnet_routes_diff (asic_db_vnet_routes , active_app_db_vnet_routes , True )
376
416
missed_in_app_db_routes = get_vnet_routes_diff (app_db_vnet_routes , asic_db_vnet_routes )
377
417
missed_in_sdk_routes = get_sdk_vnet_routes_diff (asic_db_vnet_routes )
378
418
0 commit comments