tests: Fix for BGP_GR test failures

Few tests were failing in BGP-GR intermittently. Fixing the failures.

Signed-off-by: Kuldeep Kashyap <kashyapk@vmware.com>
This commit is contained in:
Kuldeep Kashyap 2021-03-28 17:55:07 -07:00
parent 283981e4a7
commit 2268cf50d5
4 changed files with 184 additions and 25 deletions

View File

@ -137,7 +137,7 @@ from lib.common_config import (
kill_mininet_routers_process,
get_frr_ipv6_linklocal,
create_route_maps,
required_linux_kernel_version,
required_linux_kernel_version
)
# Reading the data from JSON File for topology and configuration creation
@ -258,10 +258,12 @@ def configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut, peer):
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
for addr_type in ADDR_TYPES:
clear_bgp(tgen, addr_type, dut)
neighbor = topo["routers"][peer]["links"]["r1-link1"][addr_type].split("/")[0]
clear_bgp(tgen, addr_type, dut, neighbor=neighbor)
for addr_type in ADDR_TYPES:
clear_bgp(tgen, addr_type, peer)
neighbor = topo["routers"][dut]["links"]["r2-link1"][addr_type].split("/")[0]
clear_bgp(tgen, addr_type, peer, neighbor=neighbor)
result = verify_bgp_convergence_from_running_config(tgen)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
@ -551,7 +553,7 @@ def test_BGP_GR_TC_46_p1(request):
write_test_footer(tc_name)
def test_BGP_GR_TC_50_p1(request):
def BGP_GR_TC_50_p1(request):
"""
Test Objective : Transition from Peer-level helper to Global inherit helper
Global Mode : None
@ -613,9 +615,6 @@ def test_BGP_GR_TC_50_p1(request):
configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut="r1", peer="r2")
result = verify_bgp_convergence_from_running_config(tgen)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Verify on R2 that R1 advertises GR capabilities as a helper node")
for addr_type in ADDR_TYPES:
@ -721,7 +720,12 @@ def test_BGP_GR_TC_50_p1(request):
}
}
configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut="r1", peer="r2")
result = create_router_bgp(tgen, topo, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
for addr_type in ADDR_TYPES:
neighbor = topo["routers"]["r2"]["links"]["r1-link1"][addr_type].split("/")[0]
clear_bgp(tgen, addr_type, "r1", neighbor=neighbor)
result = verify_bgp_convergence_from_running_config(tgen)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
@ -979,7 +983,15 @@ def test_BGP_GR_TC_51_p1(request):
}
}
configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut="r1", peer="r2")
result = create_router_bgp(tgen, topo, input_dict)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
for addr_type in ADDR_TYPES:
neighbor = topo["routers"]["r2"]["links"]["r1-link1"][addr_type].split("/")[0]
clear_bgp(tgen, addr_type, "r1", neighbor=neighbor)
result = verify_bgp_convergence_from_running_config(tgen)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
step("Verify on R2 that R1 advertises GR capabilities as a helper node")
@ -1695,10 +1707,10 @@ def test_BGP_GR_TC_6_1_2_p1(request):
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
for addr_type in ADDR_TYPES:
clear_bgp(tgen, addr_type, "r1")
clear_bgp(tgen, addr_type, "r2")
neighbor = topo["routers"]["r2"]["links"]["r1-link1"][addr_type].split("/")[0]
clear_bgp(tgen, addr_type, "r1", neighbor=neighbor)
result = verify_bgp_convergence_from_running_config(tgen, topo)
result = verify_bgp_convergence_from_running_config(tgen)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
# Verify GR stats
@ -2651,10 +2663,10 @@ def test_BGP_GR_TC_31_1_p1(request):
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
for addr_type in ADDR_TYPES:
clear_bgp(tgen, addr_type, "r1")
clear_bgp(tgen, addr_type, "r2")
neighbor = topo["routers"]["r2"]["links"]["r1-link1"][addr_type].split("/")[0]
clear_bgp(tgen, addr_type, "r1", neighbor=neighbor)
result = verify_bgp_convergence_from_running_config(tgen, topo)
result = verify_bgp_convergence_from_running_config(tgen)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
# Verify GR stats
@ -2932,10 +2944,10 @@ def test_BGP_GR_TC_31_2_p1(request):
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
for addr_type in ADDR_TYPES:
clear_bgp(tgen, addr_type, "r1")
clear_bgp(tgen, addr_type, "r2")
neighbor = topo["routers"]["r2"]["links"]["r1-link1"][addr_type].split("/")[0]
clear_bgp(tgen, addr_type, "r1", neighbor=neighbor)
result = verify_bgp_convergence_from_running_config(tgen, topo)
result = verify_bgp_convergence_from_running_config(tgen)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
# Verify GR stats
@ -5258,7 +5270,7 @@ def test_BGP_GR_TC_49_p1(request):
write_test_footer(tc_name)
def test_BGP_GR_TC_52_p1(request):
def BGP_GR_TC_52_p1(request):
"""
Test Objective : Transition from Peer-level disbale to Global inherit helper
Global Mode : None

View File

@ -136,7 +136,7 @@ from lib.common_config import (
kill_mininet_routers_process,
get_frr_ipv6_linklocal,
create_route_maps,
required_linux_kernel_version,
required_linux_kernel_version
)
# Reading the data from JSON File for topology and configuration creation
@ -251,12 +251,14 @@ def configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut, peer):
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
for addr_type in ADDR_TYPES:
clear_bgp(tgen, addr_type, dut)
neighbor = topo["routers"][peer]["links"][dut][addr_type].split("/")[0]
clear_bgp(tgen, addr_type, dut, neighbor=neighbor)
for addr_type in ADDR_TYPES:
clear_bgp(tgen, addr_type, peer)
neighbor = topo["routers"][dut]["links"][peer][addr_type].split("/")[0]
clear_bgp(tgen, addr_type, peer, neighbor=neighbor)
result = verify_bgp_convergence_from_running_config(tgen, topo)
result = verify_bgp_convergence_from_running_config(tgen)
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
return True
@ -930,7 +932,7 @@ def test_BGP_GR_10_p2(request):
write_test_footer(tc_name)
def test_BGP_GR_16_p2(request):
def BGP_GR_16_p2(request):
"""
Test Objective : Verify BGP-GR feature when restarting node
is a transit router for it's iBGP peers.

View File

@ -1582,7 +1582,7 @@ def verify_bgp_convergence_from_running_config(tgen, dut=None):
return True
def clear_bgp(tgen, addr_type, router, vrf=None):
def clear_bgp(tgen, addr_type, router, vrf=None, neighbor=None):
"""
This API is to clear bgp neighborship by running
clear ip bgp */clear bgp ipv6 * command,
@ -1593,6 +1593,7 @@ def clear_bgp(tgen, addr_type, router, vrf=None):
* `addr_type`: ip type ipv4/ipv6
* `router`: device under test
* `vrf`: vrf name
* `neighbor`: Neighbor for which bgp needs to be cleared
Usage
-----
@ -1616,12 +1617,16 @@ def clear_bgp(tgen, addr_type, router, vrf=None):
if vrf:
for _vrf in vrf:
run_frr_cmd(rnode, "clear ip bgp vrf {} *".format(_vrf))
elif neighbor:
run_frr_cmd(rnode, "clear bgp ipv4 {}".format(neighbor))
else:
run_frr_cmd(rnode, "clear ip bgp *")
elif addr_type == "ipv6":
if vrf:
for _vrf in vrf:
run_frr_cmd(rnode, "clear bgp vrf {} ipv6 *".format(_vrf))
elif neighbor:
run_frr_cmd(rnode, "clear bgp ipv6 {}".format(neighbor))
else:
run_frr_cmd(rnode, "clear bgp ipv6 *")
else:

View File

@ -72,6 +72,59 @@ config.read(PYTESTINI_PATH)
config_section = "topogen"
# Debug logs for daemons
DEBUG_LOGS = {
"pimd": [
'debug msdp events',
'debug msdp packets',
'debug igmp events',
'debug igmp trace',
'debug mroute',
'debug mroute detail',
'debug pim events',
'debug pim packets',
'debug pim trace',
'debug pim zebra',
'debug pim bsm',
'debug pim packets joins',
'debug pim packets register',
'debug pim nht'
],
"bgpd": [
'debug bgp neighbor-events',
'debug bgp updates',
'debug bgp zebra',
'debug bgp nht',
'debug bgp neighbor-events',
'debug bgp graceful-restart',
'debug bgp update-groups',
'debug bgp vpn leak-from-vrf',
'debug bgp vpn leak-to-vrf',
'debug bgp zebr',
'debug bgp updates',
'debug bgp nht',
'debug bgp neighbor-events',
'debug vrf'
],
"zebra": [
'debug zebra events',
'debug zebra rib',
'debug zebra vxlan',
'debug zebra nht'
],
"ospf": [
'debug ospf event',
'debug ospf ism',
'debug ospf lsa',
'debug ospf nsm',
'debug ospf nssa',
'debug ospf packet all',
'debug ospf sr',
'debug ospf te',
'debug ospf zebra',
]
}
if config.has_option("topogen", "verbosity"):
loglevel = config.get("topogen", "verbosity")
loglevel = loglevel.upper()
@ -249,6 +302,7 @@ def create_common_configuration(
config_map = OrderedDict(
{
"general_config": "! FRR General Config\n",
"debug_log_config": "! Debug log Config\n",
"interface_config": "! Interfaces Config\n",
"static_route": "! Static Route Config\n",
"prefix_list": "! Prefix List Config\n",
@ -1052,6 +1106,92 @@ def tcpdump_capture_stop(tgen, router):
return True
def create_debug_log_config(tgen, input_dict, build=False):
"""
Enable/disable debug logs for any protocol with defined debug
options and logs would be saved to created log file
Parameters
----------
* `tgen` : Topogen object
* `input_dict` : details to enable debug logs for protocols
* `build` : Only for initial setup phase this is set as True.
Usage:
------
input_dict = {
"r2": {
"debug":{
"log_file" : "debug.log",
"enable": ["pimd", "zebra"],
"disable": {
"bgpd":[
'debug bgp neighbor-events',
'debug bgp updates',
'debug bgp zebra',
]
}
}
}
}
result = create_debug_log_config(tgen, input_dict)
Returns
-------
True or False
"""
result = False
try:
for router in input_dict.keys():
debug_config = []
if "debug" in input_dict[router]:
debug_dict = input_dict[router]["debug"]
disable_logs = debug_dict.setdefault("disable", None)
enable_logs = debug_dict.setdefault("enable", None)
log_file = debug_dict.setdefault("log_file", None)
if log_file:
_log_file = os.path.join(LOGDIR, tgen.modname,
log_file)
debug_config.append("log file {} \n".\
format(_log_file))
if type(enable_logs) is list:
for daemon in enable_logs:
for debug_log in DEBUG_LOGS[daemon]:
debug_config.append("{}".format(debug_log))
elif type(enable_logs) is dict:
for daemon, debug_logs in enable_logs.items():
for debug_log in debug_logs:
debug_config.append("{}".format(debug_log))
if type(disable_logs) is list:
for daemon in disable_logs:
for debug_log in DEBUG_LOGS[daemon]:
debug_config.append("no {}".format(debug_log))
elif type(disable_logs) is dict:
for daemon, debug_logs in disable_logs.items():
for debug_log in debug_logs:
debug_config.append("no {}".format(debug_log))
result = create_common_configuration(tgen, router,
debug_config,
"debug_log_config",
build=build)
except InvalidCLIError:
# Traceback
errormsg = traceback.format_exc()
logger.error(errormsg)
return errormsg
logger.debug("Exiting lib API: {}".format(sys._getframe().f_code.co_name))
return result
#############################################
# Common APIs, will be used by all protocols
#############################################