Skip to content

Commit 8d20771

Browse files
siqbal1986yxieca
authored andcommitted
Vnet_route_check Vxlan tunnel route update. (#2281)
* Squashed commit of the following: commit 78e4fe7 Author: siqbal1486 <[email protected]> Date: Wed Aug 10 12:17:56 2022 -0700 Fixes suggested in review. Signed-off-by: siqbal1486 <[email protected]> commit 757a6b0 Author: Shahzad Iqbal (SHAHZADIQBAL) <[email protected]> Date: Tue Aug 9 12:12:33 2022 -0700 added 2 tests and fixed a bug. commit fb4d138 Author: Shahzad Iqbal (SHAHZADIQBAL) <[email protected]> Date: Mon Aug 1 18:59:55 2022 -0700 changed script to account for tunnel routes. commit c2db718 Author: Shahzad Iqbal (SHAHZADIQBAL) <[email protected]> Date: Sun Jul 31 15:09:12 2022 -0700 removed accidently added spaces. commit 2b5658d Author: Shahzad Iqbal (SHAHZADIQBAL) <[email protected]> Date: Sun Jul 31 14:52:49 2022 -0700 Modified Vnet_route_check to ignore the Vxlan tunnel routes which use default VRF. * changes suggested in review. Fixed a bug found while testing for IpV6. * Updated a testcse to cover IPV6. Fixed a bug causing build failures.
1 parent 8794283 commit 8d20771

File tree

2 files changed

+127
-15
lines changed

2 files changed

+127
-15
lines changed

scripts/vnet_route_check.py

+56-14
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747

4848
RC_OK = 0
4949
RC_ERR = -1
50-
50+
default_vrf_oid = ""
5151

5252
report_level = syslog.LOG_ERR
5353
write_to_syslog = True
@@ -211,16 +211,30 @@ def get_vnet_routes_from_app_db():
211211
vnet_routes = {}
212212

213213
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)
215215
vnet_name = vnet_route_list[0]
216216
vnet_route = vnet_route_list[1]
217217

218218
if vnet_name not in vnet_routes:
219219
vnet_routes[vnet_name] = {}
220220
vnet_routes[vnet_name]['routes'] = []
221221

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')
224238

225239
vnet_routes[vnet_name]['routes'].append(vnet_route)
226240

@@ -237,10 +251,12 @@ def get_vnet_routes_from_asic_db():
237251

238252
vnet_vrfs = get_vrf_entries()
239253
vnet_vrfs_oids = [vnet_vrfs[k] for k in vnet_vrfs]
254+
vnet_vrfs_oids.append(default_vrf_oid)
240255

241256
vnet_intfs = get_vnet_intfs()
242257

243258
vrf_oid_to_vnet_map = {}
259+
vrf_oid_to_vnet_map[default_vrf_oid] = 'default_VRF'
244260

245261
for vnet_name, vnet_rifs in vnet_intfs.items():
246262
for vnet_rif, vrf_oid in vnet_vrfs.items():
@@ -276,23 +292,44 @@ def get_vnet_routes_from_asic_db():
276292
return vnet_routes
277293

278294

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):
280311
''' Returns all routes present in routes_2 dictionary but missed in routes_1
281312
Format: { <vnet_name>: { 'routes': [ <pfx/pfx_len> ] } }
282313
'''
283314

284315
routes = {}
285316

286317
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
289323
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)
296333

297334
return routes
298335

@@ -326,11 +363,16 @@ def main():
326363
# Don't run VNET routes consistancy logic if there is no VNET configuration
327364
if not check_vnet_cfg():
328365
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]
329371

330372
app_db_vnet_routes = get_vnet_routes_from_app_db()
331373
asic_db_vnet_routes = get_vnet_routes_from_asic_db()
332374

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)
334376
missed_in_app_db_routes = get_vnet_routes_diff(app_db_vnet_routes, asic_db_vnet_routes)
335377
missed_in_sdk_routes = get_sdk_vnet_routes_diff(asic_db_vnet_routes)
336378

tests/vnet_route_check_test.py

+71-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
VNET_ROUTE_TABLE = "VNET_ROUTE_TABLE"
2828
INTF_TABLE = "INTF_TABLE"
2929
ASIC_STATE = "ASIC_STATE"
30-
30+
VNET_ROUTE_TUNNEL_TABLE = "VNET_ROUTE_TUNNEL_TABLE"
3131
RT_ENTRY_KEY_PREFIX = 'SAI_OBJECT_TYPE_ROUTE_ENTRY:{\"dest":\"'
3232
RT_ENTRY_KEY_SUFFIX = '\",\"switch_id\":\"oid:0x21000000000000\",\"vr\":\"oid:0x3000000000d4b\"}'
3333

@@ -223,6 +223,76 @@
223223
}
224224
}
225225
}
226+
},
227+
"4": {
228+
DESCR: "All tunnel routes are configured in both APP and ASIC DB",
229+
ARGS: "vnet_route_check",
230+
PRE: {
231+
APPL_DB: {
232+
VXLAN_TUNNEL_TABLE: {
233+
"tunnel_v4": { "src_ip": "10.1.0.32" },
234+
"tunnel_v6": { "src_ip": "3001:2000::1" }
235+
},
236+
VNET_TABLE: {
237+
"Vnet_v4_in_v4-0": [("vxlan_tunnel", "tunnel_v4"), ("scope", "default"), ("vni", "10000"), ("peer_list", "")],
238+
"Vnet_v6_in_v6-0": [("vxlan_tunnel", "tunnel_v6"), ("scope", "default"), ("vni", "10002"), ("peer_list", "")]
239+
240+
},
241+
VNET_ROUTE_TUNNEL_TABLE: {
242+
"Vnet_v4_in_v4-0:150.62.191.1/32" : { "endpoint" : "100.251.7.1,100.251.7.2" },
243+
"Vnet_v6_in_v6-0:fd01:fc00::1/128" : { "endpoint" : "fc02:1000::1,fc02:1000::2" }
244+
245+
}
246+
},
247+
ASIC_DB: {
248+
"ASIC_STATE:SAI_OBJECT_TYPE_VIRTUAL_ROUTER": {
249+
"oid:0x3000000000d4b" : { "":"" }
250+
},
251+
ASIC_STATE: {
252+
RT_ENTRY_KEY_PREFIX + "150.62.191.1/32" + RT_ENTRY_KEY_SUFFIX: {},
253+
RT_ENTRY_KEY_PREFIX + "fd01:fc00::1/128" + RT_ENTRY_KEY_SUFFIX: {}
254+
}
255+
}
256+
},
257+
RESULT: {
258+
"results": {}
259+
}
260+
},
261+
"5": {
262+
DESCR: "Tunnel route present in APP DB but mssing in ASIC DB",
263+
ARGS: "vnet_route_check",
264+
RET: -1,
265+
PRE: {
266+
APPL_DB: {
267+
VXLAN_TUNNEL_TABLE: {
268+
"tunnel_v4": { "src_ip": "10.1.0.32" }
269+
},
270+
VNET_TABLE: {
271+
"Vnet_v4_in_v4-0": [("vxlan_tunnel", "tunnel_v4"), ("scope", "default"), ("vni", "10000"), ("peer_list", "")]
272+
},
273+
VNET_ROUTE_TUNNEL_TABLE: {
274+
"Vnet_v4_in_v4-0:150.62.191.1/32" : { "endpoint" : "100.251.7.1,100.251.7.2" }
275+
}
276+
},
277+
ASIC_DB: {
278+
"ASIC_STATE:SAI_OBJECT_TYPE_VIRTUAL_ROUTER": {
279+
"oid:0x3000000000d4b" : { "":"" }
280+
},
281+
ASIC_STATE: {
282+
}
283+
}
284+
},
285+
RESULT: {
286+
"results": {
287+
"missed_in_asic_db_routes": {
288+
"Vnet_v4_in_v4-0": {
289+
"routes": [
290+
"150.62.191.1/32"
291+
]
292+
}
293+
}
294+
}
295+
}
226296
}
227297
}
228298

0 commit comments

Comments
 (0)