47
47
48
48
RC_OK = 0
49
49
RC_ERR = - 1
50
-
50
+ default_vrf_oid = ""
51
51
52
52
report_level = syslog .LOG_ERR
53
53
write_to_syslog = True
@@ -211,16 +211,30 @@ def get_vnet_routes_from_app_db():
211
211
vnet_routes = {}
212
212
213
213
for vnet_route_db_key in vnet_routes_db_keys :
214
- vnet_route_list = vnet_route_db_key .split (':' )
214
+ vnet_route_list = vnet_route_db_key .split (':' , 1 )
215
215
vnet_name = vnet_route_list [0 ]
216
216
vnet_route = vnet_route_list [1 ]
217
217
218
218
if vnet_name not in vnet_routes :
219
219
vnet_routes [vnet_name ] = {}
220
220
vnet_routes [vnet_name ]['routes' ] = []
221
221
222
- intf = vnet_intfs [vnet_name ][0 ]
223
- vnet_routes [vnet_name ]['vrf_oid' ] = vnet_vrfs .get (intf , 'None' )
222
+ if vnet_name not in vnet_intfs :
223
+ # this route has no vnet_intf and may be part of default VRF.
224
+ vnet_table = swsscommon .Table (db , 'VNET_TABLE' )
225
+ scope_value = ""
226
+ # "Vnet_v4_in_v4-0": [("vxlan_tunnel", "tunnel_v4"), ("scope", "default"), ("vni", "10000"), ("peer_list", "")]
227
+ for key ,value in vnet_table .get (vnet_name )[1 ]:
228
+ if key == "scope" :
229
+ scope_value = value
230
+ break
231
+ if scope_value == 'default' :
232
+ vnet_routes [vnet_name ]['vrf_oid' ] = default_vrf_oid
233
+ else :
234
+ assert "Non-default VRF route present without vnet interface."
235
+ else :
236
+ intf = vnet_intfs [vnet_name ][0 ]
237
+ vnet_routes [vnet_name ]['vrf_oid' ] = vnet_vrfs .get (intf , 'None' )
224
238
225
239
vnet_routes [vnet_name ]['routes' ].append (vnet_route )
226
240
@@ -237,10 +251,12 @@ def get_vnet_routes_from_asic_db():
237
251
238
252
vnet_vrfs = get_vrf_entries ()
239
253
vnet_vrfs_oids = [vnet_vrfs [k ] for k in vnet_vrfs ]
254
+ vnet_vrfs_oids .append (default_vrf_oid )
240
255
241
256
vnet_intfs = get_vnet_intfs ()
242
257
243
258
vrf_oid_to_vnet_map = {}
259
+ vrf_oid_to_vnet_map [default_vrf_oid ] = 'default_VRF'
244
260
245
261
for vnet_name , vnet_rifs in vnet_intfs .items ():
246
262
for vnet_rif , vrf_oid in vnet_vrfs .items ():
@@ -276,23 +292,44 @@ def get_vnet_routes_from_asic_db():
276
292
return vnet_routes
277
293
278
294
279
- def get_vnet_routes_diff (routes_1 , routes_2 ):
295
+ def check_routes_with_default_vrf (vnet_name , vnet_attrs , routes_1 , routes ):
296
+ for vnet_route in vnet_attrs ['routes' ]:
297
+ ispresent = False
298
+ for vnet_name_other , vnet_attrs_other in routes_1 .items ():
299
+ if vnet_route in vnet_attrs_other ['routes' ]:
300
+ ispresent = True
301
+ if not ispresent :
302
+ if vnet_name not in routes :
303
+ routes [vnet_name ] = {}
304
+ routes [vnet_name ]['routes' ] = []
305
+ routes [vnet_name ]['routes' ].append (vnet_route )
306
+
307
+ return
308
+
309
+
310
+ def get_vnet_routes_diff (routes_1 , routes_2 , verify_default_vrf_routes = False ):
280
311
''' Returns all routes present in routes_2 dictionary but missed in routes_1
281
312
Format: { <vnet_name>: { 'routes': [ <pfx/pfx_len> ] } }
282
313
'''
283
314
284
315
routes = {}
285
316
286
317
for vnet_name , vnet_attrs in routes_2 .items ():
287
- if vnet_name not in routes_1 :
288
- routes [vnet_name ] = routes
318
+ if vnet_attrs ['vrf_oid' ] == default_vrf_oid :
319
+ if verify_default_vrf_routes :
320
+ check_routes_with_default_vrf (vnet_name , vnet_attrs , routes_1 , routes )
321
+ else :
322
+ continue
289
323
else :
290
- for vnet_route in vnet_attrs ['routes' ]:
291
- if vnet_route not in routes_1 [vnet_name ]['routes' ]:
292
- if vnet_name not in routes :
293
- routes [vnet_name ] = {}
294
- routes [vnet_name ]['routes' ] = []
295
- routes [vnet_name ]['routes' ].append (vnet_route )
324
+ if vnet_name not in routes_1 :
325
+ routes [vnet_name ] = vnet_attrs ['routes' ].copy ()
326
+ else :
327
+ for vnet_route in vnet_attrs ['routes' ]:
328
+ if vnet_route not in routes_1 [vnet_name ]['routes' ]:
329
+ if vnet_name not in routes :
330
+ routes [vnet_name ] = {}
331
+ routes [vnet_name ]['routes' ] = []
332
+ routes [vnet_name ]['routes' ].append (vnet_route )
296
333
297
334
return routes
298
335
@@ -326,11 +363,16 @@ def main():
326
363
# Don't run VNET routes consistancy logic if there is no VNET configuration
327
364
if not check_vnet_cfg ():
328
365
return rc
366
+ asic_db = swsscommon .DBConnector ('ASIC_DB' , 0 )
367
+ 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 ]
329
371
330
372
app_db_vnet_routes = get_vnet_routes_from_app_db ()
331
373
asic_db_vnet_routes = get_vnet_routes_from_asic_db ()
332
374
333
- missed_in_asic_db_routes = get_vnet_routes_diff (asic_db_vnet_routes , app_db_vnet_routes )
375
+ missed_in_asic_db_routes = get_vnet_routes_diff (asic_db_vnet_routes , app_db_vnet_routes , True )
334
376
missed_in_app_db_routes = get_vnet_routes_diff (app_db_vnet_routes , asic_db_vnet_routes )
335
377
missed_in_sdk_routes = get_sdk_vnet_routes_diff (asic_db_vnet_routes )
336
378
0 commit comments