44import json
55import syslog
66import subprocess
7+ import argparse
78from swsscommon import swsscommon
89
910''' 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):
356357 return routes_diff
357358
358359
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 , True )
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+
359388def 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 ()
360394
361395 rc = RC_OK
362396
@@ -365,14 +399,20 @@ def main():
365399 return rc
366400 asic_db = swsscommon .DBConnector ('ASIC_DB' , 0 , True )
367401 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 ]
371407
372408 app_db_vnet_routes = get_vnet_routes_from_app_db ()
409+ active_app_db_vnet_routes = filter_active_vnet_routes (app_db_vnet_routes )
373410 asic_db_vnet_routes = get_vnet_routes_from_asic_db ()
374411
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 )
376416 missed_in_app_db_routes = get_vnet_routes_diff (app_db_vnet_routes , asic_db_vnet_routes )
377417 missed_in_sdk_routes = get_sdk_vnet_routes_diff (asic_db_vnet_routes )
378418
0 commit comments