diff options
Diffstat (limited to 'tests/topotests/lib/common_config.py')
| -rw-r--r-- | tests/topotests/lib/common_config.py | 149 |
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 |
