def ltemplateVersionCheck( vstr, rname="r1", compstr="<", cli=False, kernel="4.9", iproute2=None, mpls=True ): tgen = get_topogen() router = tgen.gears[rname] if cli: logger.info("calling mininet CLI") tgen.mininet_cli() logger.info("exited mininet CLI") if _lt == None: ret = "Template not initialized" return ret if _lt.prestarthooksuccess != True: ret = "ltemplatePreRouterStartHook failed" return ret if _lt.poststarthooksuccess != True: ret = "ltemplatePostRouterStartHook failed" return ret if mpls == True and tgen.hasmpls != True: ret = "MPLS not initialized" return ret if kernel != None: krel = platform.release() if topotest.version_cmp(krel, kernel) < 0: ret = "Skipping tests, old kernel ({} < {})".format(krel, kernel) return ret if iproute2 != None: if _lt.iproute2Ver == None: # collect/log info on iproute2 cc = ltemplateRtrCmd() found = cc.doCmd( tgen, rname, "apt-cache policy iproute2", r"Installed: ([\d\.]*)" ) if found != None: iproute2Ver = found.group(1) else: iproute2Ver = "0-unknown" logger.info("Have iproute2 version=" + iproute2Ver) if topotest.version_cmp(iproute2Ver, iproute2) < 0: ret = "Skipping tests, old iproute2 ({} < {})".format(iproute2Ver, iproute2) return ret ret = True try: if router.has_version(compstr, vstr): ret = "Skipping tests, old FRR version {} {}".format(compstr, vstr) return ret except: ret = True return ret
def setup_module(mod): "Sets up the pytest environment" tgen = Topogen(ISISTopo1, mod.__name__) tgen.start_topology() logger.info("Testing with VRF Lite support") krel = platform.release() # May need to adjust handling of vrf traffic depending on kernel version l3mdev_accept = 0 if (topotest.version_cmp(krel, "4.15") >= 0 and topotest.version_cmp(krel, "4.18") <= 0): l3mdev_accept = 1 if topotest.version_cmp(krel, "5.0") >= 0: l3mdev_accept = 1 logger.info("krel '{0}' setting net.ipv4.tcp_l3mdev_accept={1}".format( krel, l3mdev_accept)) cmds = [ "ip link add {0}-cust1 type vrf table 1001", "ip link add loop1 type dummy", "ip link set {0}-eth0 master {0}-cust1", "ip link set {0}-eth1 master {0}-cust1", ] # For all registered routers, load the zebra configuration file for rname, router in tgen.routers().items(): # create VRF rx-cust1 and link rx-eth0 to rx-cust1 for cmd in cmds: output = tgen.net[rname].cmd(cmd.format(rname)) output = tgen.net[rname].cmd("sysctl -n net.ipv4.tcp_l3mdev_accept") logger.info("router {0}: existing tcp_l3mdev_accept was {1}".format( rname, output)) if l3mdev_accept: output = tgen.net[rname].cmd( "sysctl -w net.ipv4.tcp_l3mdev_accept={}".format( l3mdev_accept)) for rname, router in tgen.routers().items(): router.load_config(TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))) router.load_config(TopoRouter.RD_ISIS, os.path.join(CWD, "{}/isisd.conf".format(rname))) # After loading the configurations, this function loads configured daemons. tgen.start_router() has_version_20 = False for router in tgen.routers().values(): if router.has_version("<", "4"): has_version_20 = True if has_version_20: logger.info("Skipping ISIS vrf tests for FRR 2.0") tgen.set_error("ISIS has convergence problems with IPv6")
def setup_module(mod): "Sets up the pytest environment" tgen = Topogen(BGPIPV6RTADVVRFTopo, mod.__name__) tgen.start_topology() router_list = tgen.routers() logger.info("Testing with VRF Lite support") krel = platform.release() # May need to adjust handling of vrf traffic depending on kernel version l3mdev_accept = 0 if ( topotest.version_cmp(krel, "4.15") >= 0 and topotest.version_cmp(krel, "4.18") <= 0 ): l3mdev_accept = 1 if topotest.version_cmp(krel, "5.0") >= 0: l3mdev_accept = 1 logger.info( "krel '{0}' setting net.ipv4.tcp_l3mdev_accept={1}".format(krel, l3mdev_accept) ) cmds = [ "ip link add {0}-cust1 type vrf table 1001", "ip link add loop1 type dummy", "ip link set loop1 master {0}-cust1", "ip link set {0}-eth0 master {0}-cust1", ] for rname, router in router_list.items(): for cmd in cmds: output = tgen.net[rname].cmd(cmd.format(rname)) output = tgen.net[rname].cmd("sysctl -n net.ipv4.tcp_l3mdev_accept") logger.info( "router {0}: existing tcp_l3mdev_accept was {1}".format(rname, output) ) if l3mdev_accept: output = tgen.net[rname].cmd( "sysctl -w net.ipv4.tcp_l3mdev_accept={}".format(l3mdev_accept) ) for rname, router in router_list.items(): router.load_config( TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) ) router.load_config( TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname)) ) # Initialize all routers. tgen.start_router()
def test_invalid_versions(): "Test invalid version strings" curver = '3.0' badver1 = '.1' badver2 = '-1.0' badver3 = '.' badver4 = '3.-0.3' with pytest.raises(ValueError): assert version_cmp(curver, badver1) assert version_cmp(curver, badver2) assert version_cmp(curver, badver3) assert version_cmp(curver, badver4)
def test_invalid_versions(): "Test invalid version strings" curver = '3.0' badver1 = '.1' badver2 = '-1.0' badver3 = '.' badver4 = '3.-0.3' with pytest.raises(ValueError): assert version_cmp(curver, badver1) assert version_cmp(curver, badver2) assert version_cmp(curver, badver3) assert version_cmp(curver, badver4)
def test_invalid_versions(): "Test invalid version strings" curver = "3.0" badver1 = ".1" badver2 = "-1.0" badver3 = "." badver4 = "3.-0.3" with pytest.raises(ValueError): assert version_cmp(curver, badver1) assert version_cmp(curver, badver2) assert version_cmp(curver, badver3) assert version_cmp(curver, badver4)
def setup_module(module): "Setup topology" tgen = Topogen(NetworkTopo, module.__name__) tgen.start_topology() krel = platform.release() if topotest.version_cmp(krel, "4.10") < 0: tgen.errors = "Newer kernel than 4.9 needed for pbr tests" pytest.skip(tgen.errors) router_list = tgen.routers() for rname, router in router_list.items(): # Install vrf into the kernel and slave eth3 router.run("ip link add vrf-chiyoda type vrf table 1000") router.run("ip link set dev {}-eth3 master vrf-chiyoda".format(rname)) router.run("ip link set vrf-chiyoda up") router.load_config( TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) ) router.load_config( TopoRouter.RD_PBRD, os.path.join(CWD, "{}/pbrd.conf".format(rname)) ) tgen.start_router()
def has_version(self, cmpop, version): """ Compares router version using operation `cmpop` with `version`. Valid `cmpop` values: * `>=`: has the same version or greater * '>': has greater version * '=': has the same version * '<': has a lesser version * '<=': has the same version or lesser Usage example: router.has_version('>', '1.0') """ rversion = self.version_info()['version'] if rversion is None: return False result = topotest.version_cmp(rversion, version) if cmpop == '>=': return result >= 0 if cmpop == '>': return result > 0 if cmpop == '=': return result == 0 if cmpop == '<': return result < 0 if cmpop == '<': return result < 0 if cmpop == '<=': return result <= 0
def test_evpn_gateway_ip_basic_topo(request): """ Tets EVPN overlay index gateway IP functionality. VErify show O/Ps on PE1 and PE2 """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) kernelv = platform.release() if topotest.version_cmp(kernelv, "4.15") < 0: logger.info("For EVPN, kernel version should be minimum 4.15") write_test_footer(tc_name) return if tgen.routers_have_failure(): pytest.skip(tgen.errors) step( "Check O/Ps for EVPN gateway IP overlay Index functionality at PE1 and PE2" ) result, assertmsg = evpn_gateway_ip_show_op_check("base") if result is not None: generate_support_bundle() assert result is None, assertmsg write_test_footer(tc_name)
def setup_module(module): "Setup topology" tgen = Topogen(NetworkTopo, module.__name__) tgen.start_topology() krel = platform.release() if topotest.version_cmp(krel, "4.19") < 0: tgen.errors = "kernel 4.19 needed for multihoming tests" pytest.skip(tgen.errors) tors = [] tors.append("torm11") tors.append("torm12") tors.append("torm21") tors.append("torm22") config_tors(tgen, tors) hosts = [] hosts.append("hostd11") hosts.append("hostd12") hosts.append("hostd21") hosts.append("hostd22") config_hosts(tgen, hosts) # tgen.mininet_cli() # This is a sample of configuration loading. router_list = tgen.routers() for rname, router in router_list.items(): router.load_config(TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))) router.load_config(TopoRouter.RD_PIM, os.path.join(CWD, "{}/pim.conf".format(rname))) router.load_config(TopoRouter.RD_BGP, os.path.join(CWD, "{}/evpn.conf".format(rname))) tgen.start_router()
def test_vrf_prefix_peer_established(tgen): "default vrf 3 peers same password with VRF prefix config" # only supported in kernel > 5.3 if topotest.version_cmp(platform.release(), "5.3") < 0: return reset_with_new_configs(tgen, "bgpd_vrf_prefix.conf", "ospfd_vrf.conf") check_all_peers_established("blue")
def test_prefix_peer_remove_passwords(): "selectively remove passwords checking state with prefix config" # only supported in kernel > 5.3 if topotest.version_cmp(platform.release(), "5.3") < 0: return configure("bgpd_prefix.conf") check_vrf_peer_remove_passwords(prefix="yes") clear_bgp()
def test_vrf_prefix_peer_change_passwords(tgen): "selectively change passwords checking state with VRF prefix config" # only supported in kernel > 5.3 if topotest.version_cmp(platform.release(), "5.3") < 0: return reset_with_new_configs(tgen, "bgpd_vrf_prefix.conf", "ospfd_vrf.conf") check_vrf_peer_change_passwords(vrf="blue", prefix="yes")
def test_prefix_peer_change_passwords(): "selecively change passwords checkig state with prefix config" # only supported in kernel > 5.3 if topotest.version_cmp(platform.release(), "5.3") < 0: return configure_bgp("bgpd_prefix.conf") configure_ospf("ospfd.conf") check_vrf_peer_change_passwords(prefix="yes")
def test_vrf_prefix_peer_established(): "default vrf 3 peers same password with VRF prefix config" # only supported in kernel > 5.3 if topotest.version_cmp(platform.release(), "5.3") < 0: return configure_bgp("bgpd_vrf_prefix.conf") configure_ospf("ospfd_vrf.conf") check_all_peers_established("blue")
def test_vrf_prefix_peer_remove_passwords(): "selectively remove passwords checking state with VRF prefix config" # only supported in kernel > 5.3 if topotest.version_cmp(platform.release(), "5.3") < 0: return configure_bgp("bgpd_vrf_prefix.conf") configure_ospf("ospfd_vrf.conf") check_vrf_peer_remove_passwords(vrf="blue", prefix="yes")
def config_macvlan(tgen, r_str, device, macvlan): "Creates specified macvlan interace on physical device" if topotest.version_cmp(krel, "5.1") < 0: return router = tgen.gears[r_str] router.run("ip link add {} link {} type macvlan mode bridge".format( macvlan, device)) router.run("ip link set {} up".format(macvlan))
def test_default_prefix_peer_established(): "default vrf 3 peers same password with prefix config" # only supported in kernel > 5.3 if topotest.version_cmp(platform.release(), "5.3") < 0: return configure("bgpd_prefix.conf") check_all_peers_established() clear_bgp()
def test_evpn_gateway_ip_flap_rt5(request): """ Withdraw EVPN type-5 routes and check O/Ps at PE1 and PE2 """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) kernelv = platform.release() if topotest.version_cmp(kernelv, "4.15") < 0: logger.info("For EVPN, kernel version should be minimum 4.15") write_test_footer(tc_name) return if tgen.routers_have_failure(): pytest.skip(tgen.errors) h1 = tgen.gears['host1'] step("Withdraw type-5 routes") h1.run('vtysh -c "config t" \ -c "router bgp 111" \ -c "address-family ipv4" \ -c "no network 100.0.0.21/32"') h1.run('vtysh -c "config t" \ -c "router bgp 111" \ -c "address-family ipv6" \ -c "no network 100::21/128"') result, assertmsg = evpn_gateway_ip_show_op_check("no_rt5") if result is not None: generate_support_bundle() assert result is None, assertmsg step("Advertise type-5 routes again") h1.run('vtysh -c "config t" \ -c "router bgp 111" \ -c "address-family ipv4" \ -c "network 100.0.0.21/32"') h1.run('vtysh -c "config t" \ -c "router bgp 111" \ -c "address-family ipv6" \ -c "network 100::21/128"') result, assertmsg = evpn_gateway_ip_show_op_check("base") if result is not None: generate_support_bundle() assert result is None, assertmsg write_test_footer(tc_name)
def test_multiple_vrf_prefix_peer_remove_passwords(tgen): "selectively remove passwords checking state with multiple vrfs and prefix config" # only supported in kernel > 5.3 if topotest.version_cmp(platform.release(), "5.3") < 0: return reset_with_new_configs(tgen, "bgpd_multi_vrf_prefix.conf", "ospfd_multi_vrf.conf") check_vrf_peer_remove_passwords(vrf="blue", prefix="yes") check_all_peers_established("red") check_vrf_peer_remove_passwords(vrf="red", prefix="yes") check_all_peers_established("blue")
def test_multiple_vrf_prefix_peer_established(): "default vrf 3 peers same password with multilpe VRFs and prefix config" # only supported in kernel > 5.3 if topotest.version_cmp(platform.release(), "5.3") < 0: return configure("bgpd_multi_vrf.conf") configure("ospfd_multi_vrf.conf") check_all_peers_established("blue") check_all_peers_established("red") clear_bgp("blue") clear_bgp("red")
def test_multiple_vrf_prefix_peer_change_passwords(): "selectively change passwords checking state with multiple vrfs and prefix config" # only supported in kernel > 5.3 if topotest.version_cmp(platform.release(), "5.3") < 0: return configure_bgp("bgpd_multi_vrf_prefix.conf") configure_ospf("ospfd_multi_vrf.conf") check_vrf_peer_change_passwords(vrf="blue", prefix="yes") check_all_peers_established("red") check_vrf_peer_change_passwords(vrf="red", prefix="yes") check_all_peers_established("blue")
def exacmd_version_ok(exacmd): logger.debug("checking %s for exabgp < version 4", exacmd) _, stdout, _ = commander.cmd_status(exacmd + " -v", warn=False) m = re.search(r"ExaBGP\s*:\s*((\d+)\.(\d+)(?:\.(\d+))?)", stdout) if not m: return False version = m.group(1) if topotest.version_cmp(version, "4") >= 0: logging.debug("found exabgp version >= 4 in %s will keep looking", exacmd) return False logger.info("Using ExaBGP version %s in %s", version, exacmd) return True
def build(self, *_args, **_opts): "Build function" tgen = get_topogen(self) # This function only purpose is to define allocation and relationship # between routers, switches and hosts. # # Create P/PE routers #check for mpls tgen.add_router('r1') if tgen.hasmpls != True: logger.info('MPLS not available, tests will be skipped') return mach = platform.machine() krel = platform.release() if mach[:1] == 'a' and topotest.version_cmp(krel, '4.11') < 0: logger.info('Need Kernel version 4.11 to run on arm processor') return for routern in range(2, 5): tgen.add_router('r{}'.format(routern)) # Create CE routers for routern in range(1, 5): tgen.add_router('ce{}'.format(routern)) #CE/PE links tgen.add_link(tgen.gears['ce1'], tgen.gears['r1'], 'ce1-eth0', 'r1-eth4') tgen.add_link(tgen.gears['ce2'], tgen.gears['r3'], 'ce2-eth0', 'r3-eth4') tgen.add_link(tgen.gears['ce3'], tgen.gears['r4'], 'ce3-eth0', 'r4-eth4') tgen.add_link(tgen.gears['ce4'], tgen.gears['r4'], 'ce4-eth0', 'r4-eth5') # Create a switch with just one router connected to it to simulate a # empty network. switch = {} switch[0] = tgen.add_switch('sw0') switch[0].add_link(tgen.gears['r1'], nodeif='r1-eth0') switch[0].add_link(tgen.gears['r2'], nodeif='r2-eth0') switch[1] = tgen.add_switch('sw1') switch[1].add_link(tgen.gears['r2'], nodeif='r2-eth1') switch[1].add_link(tgen.gears['r3'], nodeif='r3-eth0') switch[1].add_link(tgen.gears['r4'], nodeif='r4-eth0') switch[1] = tgen.add_switch('sw2') switch[1].add_link(tgen.gears['r2'], nodeif='r2-eth2') switch[1].add_link(tgen.gears['r3'], nodeif='r3-eth1')
def build(self, *_args, **_opts): "Build function" tgen = get_topogen(self) # This function only purpose is to define allocation and relationship # between routers, switches and hosts. # # Create P/PE routers # check for mpls tgen.add_router("r1") if tgen.hasmpls != True: logger.info("MPLS not available, tests will be skipped") return mach = platform.machine() krel = platform.release() if mach[:1] == "a" and topotest.version_cmp(krel, "4.11") < 0: logger.info("Need Kernel version 4.11 to run on arm processor") return for routern in range(2, 5): tgen.add_router("r{}".format(routern)) # Create CE routers for routern in range(1, 5): tgen.add_router("ce{}".format(routern)) # CE/PE links tgen.add_link(tgen.gears["ce1"], tgen.gears["r1"], "ce1-eth0", "r1-eth4") tgen.add_link(tgen.gears["ce2"], tgen.gears["r3"], "ce2-eth0", "r3-eth4") tgen.add_link(tgen.gears["ce3"], tgen.gears["r4"], "ce3-eth0", "r4-eth4") tgen.add_link(tgen.gears["ce4"], tgen.gears["r4"], "ce4-eth0", "r4-eth5") # Create a switch with just one router connected to it to simulate a # empty network. switch = {} switch[0] = tgen.add_switch("sw0") switch[0].add_link(tgen.gears["r1"], nodeif="r1-eth0") switch[0].add_link(tgen.gears["r2"], nodeif="r2-eth0") switch[1] = tgen.add_switch("sw1") switch[1].add_link(tgen.gears["r2"], nodeif="r2-eth1") switch[1].add_link(tgen.gears["r3"], nodeif="r3-eth0") switch[1].add_link(tgen.gears["r4"], nodeif="r4-eth0") switch[1] = tgen.add_switch("sw2") switch[1].add_link(tgen.gears["r2"], nodeif="r2-eth2") switch[1].add_link(tgen.gears["r3"], nodeif="r3-eth1")
def setup_module(mod): """ Set up the pytest environment. * `mod`: module name """ testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) logger.info("=" * 40) logger.info("Running setup_module to create topology") # This function initiates the topology build with Topogen... json_file = "{}/static_routes_topo3_ibgp.json".format(CWD) tgen = Topogen(json_file, mod.__name__) global topo topo = tgen.json_topo # ... and here it calls Mininet initialization functions. # Starting topology, create tmp files which are loaded to routers # to start deamons and then start routers start_topology(tgen) # Creating configuration from JSON build_config_from_json(tgen, topo) if version_cmp(platform.release(), "4.19") < 0: error_msg = ( 'These tests will not run. (have kernel "{}", ' "requires kernel >= 4.19)".format(platform.release()) ) pytest.skip(error_msg) # Checking BGP convergence global BGP_CONVERGENCE global ADDR_TYPES # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) # Api call verify whether BGP is converged BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo) assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error: {}".format( BGP_CONVERGENCE ) logger.info("Running setup_module() done")
def setup_module(mod): """ Sets up the pytest environment * `mod`: module name """ testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) logger.info("=" * 40) logger.info("Running setup_module to create topology") # This function initiates the topology build with Topogen... json_file = "{}/evpn_type5_chaos_topo1.json".format(CWD) tgen = Topogen(json_file, mod.__name__) global topo topo = tgen.json_topo # ... and here it calls Mininet initialization functions. # Starting topology, create tmp files which are loaded to routers # to start deamons and then start routers start_topology(tgen) # Creating configuration from JSON build_config_from_json(tgen, topo) if version_cmp(platform.release(), "4.19") < 0: error_msg = ( 'EVPN tests will not run (have kernel "{}", ' "but it requires >= 4.19)".format(platform.release()) ) pytest.skip(error_msg) global BGP_CONVERGENCE global ADDR_TYPES ADDR_TYPES = check_address_types() BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo) assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error: {}".format( BGP_CONVERGENCE ) logger.info("Pre-requisite config for testsuite") prerequisite_config_for_test_suite(tgen) logger.info("Running setup_module() done")
def test_vrf_prefix_peer_change_passwords(): "selectively change passwords checking state with VRF prefix config" tgen = get_topogen() r1 = tgen.gears["R1"] r2 = tgen.gears["R2"] r3 = tgen.gears["R3"] # only supported in kernel > 5.3 if topotest.version_cmp(platform.release(), "5.3") < 0: clear_ospf("blue") return configure("bgpd_vrf_prefix.conf") check_vrf_peer_change_passwords(vrf="blue", prefix="yes") clear_bgp("blue") clear_ospf("blue")
def build(self, *_args, **_opts): "Build function" tgen = get_topogen(self) # This function only purpose is to define allocation and relationship # between routers, switches and hosts. # # Create P/PE routers #check for mpls tgen.add_router('r1') if tgen.hasmpls != True: logger.info('MPLS not available, tests will be skipped') return mach = platform.machine() krel = platform.release() if mach[:1] == 'a' and topotest.version_cmp(krel, '4.11') < 0: logger.info('Need Kernel version 4.11 to run on arm processor') return for routern in range(2, 5): tgen.add_router('r{}'.format(routern)) # Create CE routers for routern in range(1, 5): tgen.add_router('ce{}'.format(routern)) #CE/PE links tgen.add_link(tgen.gears['ce1'], tgen.gears['r1'], 'ce1-eth0', 'r1-eth4') tgen.add_link(tgen.gears['ce2'], tgen.gears['r3'], 'ce2-eth0', 'r3-eth4') tgen.add_link(tgen.gears['ce3'], tgen.gears['r4'], 'ce3-eth0', 'r4-eth4') tgen.add_link(tgen.gears['ce4'], tgen.gears['r4'], 'ce4-eth0', 'r4-eth5') # Create a switch with just one router connected to it to simulate a # empty network. switch = {} switch[0] = tgen.add_switch('sw0') switch[0].add_link(tgen.gears['r1'], nodeif='r1-eth0') switch[0].add_link(tgen.gears['r2'], nodeif='r2-eth0') switch[1] = tgen.add_switch('sw1') switch[1].add_link(tgen.gears['r2'], nodeif='r2-eth1') switch[1].add_link(tgen.gears['r3'], nodeif='r3-eth0') switch[1].add_link(tgen.gears['r4'], nodeif='r4-eth0') switch[1] = tgen.add_switch('sw2') switch[1].add_link(tgen.gears['r2'], nodeif='r2-eth2') switch[1].add_link(tgen.gears['r3'], nodeif='r3-eth1')
def setup_module(mod): """ Sets up the pytest environment * `mod`: module name """ global topo testsuite_run_time = time.asctime(time.localtime(time.time())) logger.info("Testsuite start time: {}".format(testsuite_run_time)) logger.info("=" * 40) logger.info("Running setup_module to create topology") # This function initiates the topology build with Topogen... tgen = Topogen(build_topo, mod.__name__) # ... and here it calls Mininet initialization functions. # Starting topology, create tmp files which are loaded to routers # to start deamons and then start routers start_topology(tgen) # Run these tests for kernel version 4.19 or above if version_cmp(platform.release(), "4.19") < 0: error_msg = ( "BGP vrf dynamic route leak tests will not run " '(have kernel "{}", but it requires >= 4.19)'.format(platform.release()) ) pytest.skip(error_msg) # Creating configuration from JSON build_config_from_json(tgen, topo) global BGP_CONVERGENCE global ADDR_TYPES ADDR_TYPES = check_address_types() BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo) assert BGP_CONVERGENCE is True, "setup_module : Failed \n Error: {}".format( BGP_CONVERGENCE ) logger.info("Running setup_module() done")
def test_evpn_gateway_ip_flap_rt2(request): """ Withdraw EVPN type-2 routes and check O/Ps at PE1 and PE2 """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) kernelv = platform.release() if topotest.version_cmp(kernelv, "4.15") < 0: logger.info("For EVPN, kernel version should be minimum 4.15") write_test_footer(tc_name) return if tgen.routers_have_failure(): pytest.skip(tgen.errors) step( "Shut down VxLAN interface at PE1 which results in withdraw of type-2 routes" ) pe1 = tgen.gears['PE1'] pe1.run('ip link set dev vxlan100 down') result, assertmsg = evpn_gateway_ip_show_op_check("no_rt2") if result is not None: generate_support_bundle() assert result is None, assertmsg step("Bring up VxLAN interface at PE1 and advertise type-2 routes again") pe1.run('ip link set dev vxlan100 up') result, assertmsg = evpn_gateway_ip_show_op_check("base") if result is not None: generate_support_bundle() assert result is None, assertmsg write_test_footer(tc_name)
def test_protodown(): "Run protodown basic functionality test and report results." pdown = False count = 0 tgen = get_topogen() if topotest.version_cmp(krel, "5.1") < 0: tgen.errors = "kernel 5.1 needed for protodown tests" pytest.skip(tgen.errors) r1 = tgen.gears["r1"] # Set interface protodown on r1.vtysh_cmd("sharp interface r1-eth0-macvlan protodown") # Timeout to wait for dplane to handle it while count < 10: count += 1 output = r1.vtysh_cmd("show interface r1-eth0-macvlan") if re.search(r"protodown reasons:.*sharp", output): pdown = True break sleep(1) assert pdown is True, "Interface r1-eth0-macvlan not set protodown" # Set interface protodown off r1.vtysh_cmd("no sharp interface r1-eth0-macvlan protodown") # Timeout to wait for dplane to handle it while count < 10: count += 1 output = r1.vtysh_cmd("show interface r1-eth0-macvlan") if not re.search(r"protodown reasons:.*sharp", output): pdown = False break sleep(1) assert pdown is False, "Interface r1-eth0-macvlan not set protodown off"
def ltemplatePreRouterStartHook(): global l3mdev_accept cc = ltemplateRtrCmd() krel = platform.release() tgen = get_topogen() logger.info('pre router-start hook, kernel=' + krel) if topotest.version_cmp(krel, '4.15') == 0: l3mdev_accept = 1 else: l3mdev_accept = 0 logger.info('setting net.ipv4.tcp_l3mdev_accept={}'.format(l3mdev_accept)) #check for mpls if tgen.hasmpls != True: logger.info('MPLS not available, skipping setup') return False #check for normal init if len(tgen.net) == 1: logger.info('Topology not configured, skipping setup') return False #trace errors/unexpected output cc.resetCounts() #configure r2 mpls interfaces intfs = ['lo', 'r2-eth0', 'r2-eth1', 'r2-eth2'] for intf in intfs: cc.doCmd(tgen, 'r2', 'echo 1 > /proc/sys/net/mpls/conf/{}/input'.format(intf)) #configure cust1 VRFs & MPLS rtrs = ['r1', 'r3', 'r4'] cmds = ['ip link add {0}-cust1 type vrf table 10', 'ip ru add oif {0}-cust1 table 10', 'ip ru add iif {0}-cust1 table 10', 'ip link set dev {0}-cust1 up', 'sysctl -w net.ipv4.tcp_l3mdev_accept={}'.format(l3mdev_accept)] for rtr in rtrs: router = tgen.gears[rtr] for cmd in cmds: cc.doCmd(tgen, rtr, cmd.format(rtr)) cc.doCmd(tgen, rtr, 'ip link set dev {0}-eth4 master {0}-cust1'.format(rtr)) intfs = [rtr+'-cust1', 'lo', rtr+'-eth0', rtr+'-eth4'] for intf in intfs: cc.doCmd(tgen, rtr, 'echo 1 > /proc/sys/net/mpls/conf/{}/input'.format(intf)) logger.info('setup {0} vrf {0}-cust1, {0}-eth4. enabled mpls input.'.format(rtr)) #configure cust2 VRFs & MPLS rtrs = ['r4'] cmds = ['ip link add {0}-cust2 type vrf table 20', 'ip ru add oif {0}-cust2 table 20', 'ip ru add iif {0}-cust2 table 20', 'ip link set dev {0}-cust2 up'] for rtr in rtrs: for cmd in cmds: cc.doCmd(tgen, rtr, cmd.format(rtr)) cc.doCmd(tgen, rtr, 'ip link set dev {0}-eth5 master {0}-cust2'.format(rtr)) intfs = [rtr+'-cust2', rtr+'-eth5'] for intf in intfs: cc.doCmd(tgen, rtr, 'echo 1 > /proc/sys/net/mpls/conf/{}/input'.format(intf)) logger.info('setup {0} vrf {0}-cust2, {0}-eth5. enabled mpls input.'.format(rtr)) #put ce4-eth0 into a VRF (no default instance!) rtrs = ['ce4'] cmds = ['ip link add {0}-cust2 type vrf table 20', 'ip ru add oif {0}-cust2 table 20', 'ip ru add iif {0}-cust2 table 20', 'ip link set dev {0}-cust2 up', 'sysctl -w net.ipv4.tcp_l3mdev_accept={}'.format(l3mdev_accept)] for rtr in rtrs: for cmd in cmds: cc.doCmd(tgen, rtr, cmd.format(rtr)) cc.doCmd(tgen, rtr, 'ip link set dev {0}-eth0 master {0}-cust2'.format(rtr)) if cc.getOutput() != 4: InitSuccess = False logger.info('Unexpected output seen ({} times, tests will be skipped'.format(cc.getOutput())) else: InitSuccess = True logger.info('VRF config successful!') return InitSuccess
def diagnose_env_linux(): """ Run diagnostics in the running environment. Returns `True` when everything is ok, otherwise `False`. """ ret = True # Test log path exists before installing handler. if not os.path.isdir('/tmp'): logger.warning('could not find /tmp for logs') else: os.system('mkdir /tmp/topotests') # Log diagnostics to file so it can be examined later. fhandler = logging.FileHandler(filename='/tmp/topotests/diagnostics.txt') fhandler.setLevel(logging.DEBUG) fhandler.setFormatter( logging.Formatter(fmt='%(asctime)s %(levelname)s: %(message)s') ) logger.addHandler(fhandler) logger.info('Running environment diagnostics') # Load configuration config = configparser.ConfigParser(tgen_defaults) pytestini_path = os.path.join(CWD, '../pytest.ini') config.read(pytestini_path) # Assert that we are running as root if os.getuid() != 0: logger.error('you must run topotest as root') ret = False # Assert that we have mininet if os.system('which mn >/dev/null 2>/dev/null') != 0: logger.error('could not find mininet binary (mininet is not installed)') ret = False # Assert that we have iproute installed if os.system('which ip >/dev/null 2>/dev/null') != 0: logger.error('could not find ip binary (iproute is not installed)') ret = False # Assert that we have gdb installed if os.system('which gdb >/dev/null 2>/dev/null') != 0: logger.error('could not find gdb binary (gdb is not installed)') ret = False # Assert that FRR utilities exist frrdir = config.get('topogen', 'frrdir') hasfrr = False if not os.path.isdir(frrdir): logger.error('could not find {} directory'.format(frrdir)) ret = False else: hasfrr = True try: pwd.getpwnam('frr')[2] except KeyError: logger.warning('could not find "frr" user') try: grp.getgrnam('frr')[2] except KeyError: logger.warning('could not find "frr" group') try: if 'frr' not in grp.getgrnam('frrvty').gr_mem: logger.error('"frr" user and group exist, but user is not under "frrvty"') except KeyError: logger.warning('could not find "frrvty" group') for fname in ['zebra', 'ospfd', 'ospf6d', 'bgpd', 'ripd', 'ripngd', 'isisd', 'pimd', 'ldpd']: path = os.path.join(frrdir, fname) if not os.path.isfile(path): # LDPd is an exception if fname == 'ldpd': logger.info('could not find {} in {}'.format(fname, frrdir) + '(LDPd tests will not run)') continue logger.warning('could not find {} in {}'.format(fname, frrdir)) ret = False else: if fname != 'zebra': continue os.system( '{} -v 2>&1 >/tmp/topotests/frr_zebra.txt'.format(path) ) # Assert that Quagga utilities exist quaggadir = config.get('topogen', 'quaggadir') if hasfrr: # if we have frr, don't check for quagga pass elif not os.path.isdir(quaggadir): logger.info('could not find {} directory (quagga tests will not run)'.format(quaggadir)) else: ret = True try: pwd.getpwnam('quagga')[2] except KeyError: logger.info('could not find "quagga" user') try: grp.getgrnam('quagga')[2] except KeyError: logger.info('could not find "quagga" group') try: if 'quagga' not in grp.getgrnam('quaggavty').gr_mem: logger.error('"quagga" user and group exist, but user is not under "quaggavty"') except KeyError: logger.warning('could not find "quaggavty" group') for fname in ['zebra', 'ospfd', 'ospf6d', 'bgpd', 'ripd', 'ripngd', 'isisd', 'pimd']: path = os.path.join(quaggadir, fname) if not os.path.isfile(path): logger.warning('could not find {} in {}'.format(fname, quaggadir)) ret = False else: if fname != 'zebra': continue os.system( '{} -v 2>&1 >/tmp/topotests/quagga_zebra.txt'.format(path) ) # Test MPLS availability krel = platform.release() if topotest.version_cmp(krel, '4.5') < 0: logger.info('LDPd tests will not run (have kernel "{}", but it requires 4.5)'.format(krel)) # Test for MPLS Kernel modules available if not topotest.module_present('mpls-router', load=False) != 0: logger.info('LDPd tests will not run (missing mpls-router kernel module)') if not topotest.module_present('mpls-iptunnel', load=False) != 0: logger.info('LDPd tests will not run (missing mpls-iptunnel kernel module)') # TODO remove me when we start supporting exabgp >= 4 try: output = subprocess.check_output(['exabgp', '-v']) line = output.split('\n')[0] version = line.split(' ')[2] if topotest.version_cmp(version, '4') >= 0: logger.warning('BGP topologies are still using exabgp version 3, expect failures') # We want to catch all exceptions # pylint: disable=W0702 except: logger.warning('failed to find exabgp or returned error') # After we logged the output to file, remove the handler. logger.removeHandler(fhandler) return ret
def test_regression_1(): """ Test regression on the following type of comparison: '3.0.2' > '3' Expected result is 1. """ assert version_cmp('3.0.2', '3') == 1
def test_valid_versions(): "Test valid version compare results" curver = '3.0' samever = '3' oldver = '2.0' newver = '3.0.1' newerver = '3.0.11' vercustom = '3.0-dev' verysmallinc = '3.0.0.0.0.0.0.1' assert version_cmp(curver, oldver) == 1 assert version_cmp(curver, newver) == -1 assert version_cmp(curver, curver) == 0 assert version_cmp(curver, newerver) == -1 assert version_cmp(newver, newerver) == -1 assert version_cmp(curver, samever) == 0 assert version_cmp(curver, vercustom) == 0 assert version_cmp(vercustom, vercustom) == 0 assert version_cmp(vercustom, oldver) == 1 assert version_cmp(vercustom, newver) == -1 assert version_cmp(vercustom, samever) == 0 assert version_cmp(curver, verysmallinc) == -1 assert version_cmp(newver, verysmallinc) == 1 assert version_cmp(verysmallinc, verysmallinc) == 0 assert version_cmp(vercustom, verysmallinc) == -1