summaryrefslogtreecommitdiff
path: root/tests/topotests/lib/common_config.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/topotests/lib/common_config.py')
-rw-r--r--tests/topotests/lib/common_config.py149
1 files changed, 128 insertions, 21 deletions
diff --git a/tests/topotests/lib/common_config.py b/tests/topotests/lib/common_config.py
index 1846d43138..6dd8d646f3 100644
--- a/tests/topotests/lib/common_config.py
+++ b/tests/topotests/lib/common_config.py
@@ -36,6 +36,8 @@ import ConfigParser
import traceback
import socket
import ipaddress
+import platform
+
if sys.version_info[0] > 2:
import io
@@ -46,7 +48,7 @@ else:
from lib.topolog import logger, logger_config
from lib.topogen import TopoRouter, get_topogen
-from lib.topotest import interface_set_status
+from lib.topotest import interface_set_status, version_cmp
FRRCFG_FILE = "frr_json.conf"
FRRCFG_BKUP_FILE = "frr_json_initial.conf"
@@ -256,6 +258,7 @@ def create_common_configuration(
"route_maps": "! Route Maps Config\n",
"bgp": "! BGP Config\n",
"vrf": "! VRF Config\n",
+ "ospf": "! OSPF Config\n",
}
)
@@ -352,7 +355,7 @@ def kill_mininet_routers_process(tgen):
"""
router_list = tgen.routers()
- for rname, router in router_list.iteritems():
+ for rname, router in router_list.items():
daemon_list = [
"zebra",
"ospfd",
@@ -379,7 +382,7 @@ def check_router_status(tgen):
try:
router_list = tgen.routers()
- for router, rnode in router_list.iteritems():
+ for router, rnode in router_list.items():
result = rnode.check_router_running()
if result != "":
@@ -609,7 +612,7 @@ def get_frr_ipv6_linklocal(tgen, router, intf=None, vrf=None):
"""
router_list = tgen.routers()
- for rname, rnode in router_list.iteritems():
+ for rname, rnode in router_list.items():
if rname != router:
continue
@@ -667,7 +670,7 @@ def generate_support_bundle():
test_name = sys._getframe(2).f_code.co_name
TMPDIR = os.path.join(LOGDIR, tgen.modname)
- for rname, rnode in router_list.iteritems():
+ for rname, rnode in router_list.items():
logger.info("Generating support bundle for {}".format(rname))
rnode.run("mkdir -p /var/log/frr")
bundle_log = rnode.run("python2 /usr/lib/frr/generate_support_bundle.py")
@@ -682,7 +685,7 @@ def generate_support_bundle():
return True
-def start_topology(tgen):
+def start_topology(tgen, daemon=None):
"""
Starting topology, create tmp files which are loaded to routers
to start deamons and then start routers
@@ -734,9 +737,16 @@ def start_topology(tgen):
router.load_config(
TopoRouter.RD_ZEBRA, "{}/{}/zebra.conf".format(TMPDIR, rname)
)
+
# Loading empty bgpd.conf file to router, to start the bgp deamon
router.load_config(TopoRouter.RD_BGP, "{}/{}/bgpd.conf".format(TMPDIR, rname))
+ if daemon and 'ospfd' in daemon:
+ # Loading empty ospf.conf file to router, to start the bgp deamon
+ router.load_config(
+ TopoRouter.RD_OSPF,
+ '{}/{}/ospfd.conf'.format(TMPDIR, rname)
+ )
# Starting routers
logger.info("Starting all routers once topology is created")
tgen.start_router()
@@ -809,6 +819,24 @@ def number_to_column(routerName):
return ord(routerName[0]) - 97
+def topo_daemons(tgen, topo):
+ """
+ Returns daemon list required for the suite based on topojson.
+ """
+ daemon_list = []
+
+ router_list = tgen.routers()
+ ROUTER_LIST = sorted(
+ router_list.keys(), key=lambda x: int(re_search("\d+", x).group(0))
+ )
+
+ for rtr in ROUTER_LIST:
+ if 'ospf' in topo['routers'][rtr] and 'ospfd' not in daemon_list:
+ daemon_list.append('ospfd')
+
+ return daemon_list
+
+
#############################################
# Common APIs, will be used by all protocols
#############################################
@@ -876,7 +904,7 @@ def create_vrf_cfg(tgen, topo, input_dict=None, build=False):
input_dict = deepcopy(input_dict)
try:
- for c_router, c_data in input_dict.iteritems():
+ for c_router, c_data in input_dict.items():
rnode = tgen.routers()[c_router]
if "vrfs" in c_data:
for vrf in c_data["vrfs"]:
@@ -921,7 +949,7 @@ def create_vrf_cfg(tgen, topo, input_dict=None, build=False):
if "links" in c_data:
for destRouterLink, data in sorted(
- c_data["links"].iteritems()
+ c_data["links"].items()
):
# Loopback interfaces
if "type" in data and data["type"] == "loopback":
@@ -1156,7 +1184,7 @@ def find_interface_with_greater_ip(topo, router, loopback=True, interface=True):
lo_list = []
interfaces_list = []
lo_exists = False
- for destRouterLink, data in sorted(link_data.iteritems()):
+ for destRouterLink, data in sorted(link_data.items()):
if loopback:
if "type" in data and data["type"] == "loopback":
lo_exists = True
@@ -1350,9 +1378,9 @@ def create_interfaces_cfg(tgen, topo, build=False):
topo = deepcopy(topo)
try:
- for c_router, c_data in topo.iteritems():
+ for c_router, c_data in topo.items():
interface_data = []
- for destRouterLink, data in sorted(c_data["links"].iteritems()):
+ for destRouterLink, data in sorted(c_data["links"].items()):
# Loopback interfaces
if "type" in data and data["type"] == "loopback":
interface_name = destRouterLink
@@ -1392,6 +1420,58 @@ def create_interfaces_cfg(tgen, topo, build=False):
else:
interface_data.append("ipv6 address {}\n".format(intf_addr))
+ if 'ospf' in data:
+ ospf_data = data['ospf']
+ if 'area' in ospf_data:
+ intf_ospf_area = c_data["links"][destRouterLink][
+ "ospf"]["area"]
+ if "delete" in data and data["delete"]:
+ interface_data.append("no ip ospf area")
+ else:
+ interface_data.append("ip ospf area {}".format(
+ intf_ospf_area
+ ))
+
+ if "hello_interval" in ospf_data:
+ intf_ospf_hello = c_data["links"][destRouterLink][
+ "ospf"]["hello_interval"]
+ if "delete" in data and data["delete"]:
+ interface_data.append("no ip ospf "\
+ " hello-interval")
+ else:
+ interface_data.append("ip ospf "\
+ " hello-interval {}".format(intf_ospf_hello))
+
+ if "dead_interval" in ospf_data:
+ intf_ospf_dead = c_data["links"][destRouterLink][
+ "ospf"]["dead_interval"]
+ if "delete" in data and data["delete"]:
+ interface_data.append("no ip ospf"\
+ " dead-interval")
+ else:
+ interface_data.append("ip ospf "\
+ " dead-interval {}".format(intf_ospf_dead))
+
+ if "network" in ospf_data:
+ intf_ospf_nw = c_data["links"][destRouterLink][
+ "ospf"]["network"]
+ if "delete" in data and data["delete"]:
+ interface_data.append("no ip ospf"\
+ " network {}".format(intf_ospf_nw))
+ else:
+ interface_data.append("ip ospf"\
+ " network {}".format(intf_ospf_nw))
+
+ if "priority" in ospf_data:
+ intf_ospf_nw = c_data["links"][destRouterLink][
+ "ospf"]["priority"]
+
+ if "delete" in data and data["delete"]:
+ interface_data.append("no ip ospf"\
+ " priority")
+ else:
+ interface_data.append("ip ospf"\
+ " priority {}".format(intf_ospf_nw))
result = create_common_configuration(
tgen, c_router, interface_data, "interface_config", build=build
)
@@ -1574,11 +1654,11 @@ def create_prefix_lists(tgen, input_dict, build=False):
config_data = []
prefix_lists = input_dict[router]["prefix_lists"]
- for addr_type, prefix_data in prefix_lists.iteritems():
+ for addr_type, prefix_data in prefix_lists.items():
if not check_address_types(addr_type):
continue
- for prefix_name, prefix_list in prefix_data.iteritems():
+ for prefix_name, prefix_list in prefix_data.items():
for prefix_dict in prefix_list:
if "action" not in prefix_dict or "network" not in prefix_dict:
errormsg = "'action' or network' missing in" " input_dict"
@@ -1715,7 +1795,7 @@ def create_route_maps(tgen, input_dict, build=False):
logger.debug("route_maps not present in input_dict")
continue
rmap_data = []
- for rmap_name, rmap_value in input_dict[router]["route_maps"].iteritems():
+ for rmap_name, rmap_value in input_dict[router]["route_maps"].items():
for rmap_dict in rmap_value:
del_action = rmap_dict.setdefault("delete", False)
@@ -2462,7 +2542,7 @@ def configure_interface_mac(tgen, input_dict):
#############################################
# Verification APIs
#############################################
-@retry(attempts=5, wait=2, return_is_str=True, initial_wait=2)
+@retry(attempts=6, wait=2, return_is_str=True)
def verify_rib(
tgen,
addr_type,
@@ -2527,7 +2607,7 @@ def verify_rib(
additional_nexthops_in_required_nhs = []
found_hops = []
for routerInput in input_dict.keys():
- for router, rnode in router_list.iteritems():
+ for router, rnode in router_list.items():
if router != dut:
continue
@@ -2880,7 +2960,7 @@ def verify_fib_routes(tgen, addr_type, dut, input_dict, next_hop=None):
router_list = tgen.routers()
for routerInput in input_dict.keys():
- for router, rnode in router_list.iteritems():
+ for router, rnode in router_list.items():
if router != dut:
continue
@@ -3136,7 +3216,7 @@ def verify_fib_routes(tgen, addr_type, dut, input_dict, next_hop=None):
router_list = tgen.routers()
for routerInput in input_dict.keys():
- for router, rnode in router_list.iteritems():
+ for router, rnode in router_list.items():
if router != dut:
continue
@@ -3495,7 +3575,7 @@ def verify_prefix_lists(tgen, input_dict):
return True
-@retry(attempts=2, wait=4, return_is_str=True, initial_wait=2)
+@retry(attempts=3, wait=4, return_is_str=True)
def verify_route_maps(tgen, input_dict):
"""
Running "show route-map" command and verifying given route-map
@@ -3746,7 +3826,7 @@ def verify_cli_json(tgen, input_dict):
return True
-@retry(attempts=2, wait=4, return_is_str=True, initial_wait=2)
+@retry(attempts=3, wait=4, return_is_str=True)
def verify_evpn_vni(tgen, input_dict):
"""
API to verify evpn vni details using "show evpn vni detail json"
@@ -3864,7 +3944,7 @@ def verify_evpn_vni(tgen, input_dict):
return False
-@retry(attempts=2, wait=4, return_is_str=True, initial_wait=2)
+@retry(attempts=3, wait=4, return_is_str=True)
def verify_vrf_vni(tgen, input_dict):
"""
API to verify vrf vni details using "show vrf vni json"
@@ -3973,3 +4053,30 @@ def verify_vrf_vni(tgen, input_dict):
logger.debug("Exiting lib API: {}".format(sys._getframe().f_code.co_name))
return False
+
+
+def required_linux_kernel_version(required_version):
+ """
+ This API is used to check linux version compatibility of the test suite.
+ If version mentioned in required_version is higher than the linux kernel
+ of the system, test suite will be skipped. This API returns true or errormsg.
+
+ Parameters
+ ----------
+ * `required_version` : Kernel version required for the suites to run.
+
+ Usage
+ -----
+ result = linux_kernel_version_lowerthan('4.15')
+
+ Returns
+ -------
+ errormsg(str) or True
+ """
+ system_kernel = platform.release()
+ if version_cmp(system_kernel, required_version) < 0:
+ error_msg = ('These tests will not run on kernel "{}", '
+ 'they require kernel >= {})'.format(system_kernel,
+ required_version ))
+ return error_msg
+ return True