Few tests were failing in BGP-GR intermittently. Fixing the failures.
Signed-off-by: Kuldeep Kashyap <kashyapk@vmware.com>
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
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)
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
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:
}
}
- 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)
}
}
- 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")
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
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
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
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
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
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
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.
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,
* `addr_type`: ip type ipv4/ipv6
* `router`: device under test
* `vrf`: vrf name
+ * `neighbor`: Neighbor for which bgp needs to be cleared
Usage
-----
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:
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()
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",
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
#############################################