def test_r2_eth1_no_shutdown(): logger.info("Test: verify behaviour after r2-eth1 is no shutdown") tgen = get_topogen() # Skip if previous fatal error condition is raised if tgen.routers_have_failure(): pytest.skip(tgen.errors) # Run no shutdown on r2-eth1 interface */ tgen = get_topogen() tgen.gears["r2"].peer_link_enable("r2-eth1", True) topotest.sleep(5, "Waiting for the network to reconverge") for rname in ["r1", "r2", "r3"]: router_compare_json_output(rname, "show mpls ldp igp-sync json", "show_ldp_igp_sync.ref") for rname in ["r1", "r2", "r3"]: (result, diff) = validate_show_isis_ldp_sync(rname, "show_isis_ldp_sync.ref") assert result, "ISIS did not converge on {}:\n{}".format(rname, diff) for rname in ["r1", "r2", "r3"]: (result, diff) = validate_show_isis_interface_detail( rname, "show_isis_interface_detail.ref") assert result, "ISIS interface did not converge on {}:\n{}".format( rname, diff)
def setup_module(module): tgen = Topogen(BGPECMPTopo1, module.__name__) tgen.start_topology() # Starting Routers router_list = tgen.routers() for rname, router in router_list.iteritems(): 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)) ) router.start() # Starting Hosts and init ExaBGP on each of them topotest.sleep(10, 'starting BGP on all {} peers'.format(total_ebgp_peers)) peer_list = tgen.exabgp_peers() for pname, peer in peer_list.iteritems(): peer_dir = os.path.join(CWD, pname) env_file = os.path.join(CWD, 'exabgp.env') peer.start(peer_dir, env_file) logger.info(pname)
def test_r1_eth1_shutdown(): logger.info("Test: verify behaviour after r1-eth1 is shutdown") tgen = get_topogen() # Skip if previous fatal error condition is raised if tgen.routers_have_failure(): pytest.skip(tgen.errors) # Shut down r1-r2 link */ tgen = get_topogen() tgen.gears["r1"].peer_link_enable("r1-eth1", False) topotest.sleep(5, "Waiting for the network to reconverge") # check if the pseudowire is still up (using an alternate path for nexthop resolution) for rname in ["r1", "r2", "r3"]: router_compare_json_output(rname, "show l2vpn atom vc json", "show_l2vpn_vc.ref") for rname in ["r1", "r2", "r3"]: router_compare_json_output(rname, "show mpls ldp igp-sync json", "show_ldp_igp_sync_r1_eth1_shutdown.ref") for rname in ["r1", "r2", "r3"]: (result, diff) = validate_show_isis_ldp_sync( rname, "show_isis_ldp_sync_r1_eth1_shutdown.ref") assert result, "ISIS did not converge on {}:\n{}".format(rname, diff) for rname in ["r1", "r2", "r3"]: (result, diff) = validate_show_isis_interface_detail( rname, "show_isis_interface_detail_r1_eth1_shutdown.ref") assert result, "ISIS interface did not converge on {}:\n{}".format( rname, diff)
def test_r2_eth1_shutdown(): logger.info("Test: verify behaviour after r2-eth1 is shutdown") tgen = get_topogen() # Skip if previous fatal error condition is raised if tgen.routers_have_failure(): pytest.skip(tgen.errors) # Shut down r1-r2 link */ tgen = get_topogen() tgen.gears["r2"].peer_link_enable("r2-eth1", False) topotest.sleep(5, "Waiting for the network to reconverge") for rname in ["r1", "r2", "r3"]: router_compare_json_output( rname, "show mpls ldp igp-sync json", "show_ldp_igp_sync_r1_eth1_shutdown.ref", ) for rname in ["r1", "r2", "r3"]: router_compare_json_output( rname, "show ip ospf mpls ldp-sync json", "show_ospf_ldp_sync_r2_eth1_shutdown.ref", ) for rname in ["r1", "r2", "r3"]: router_compare_json_output( rname, "show ip ospf interface json", "show_ip_ospf_interface_r2_eth1_shutdown.ref", )
def test_bfd_ospf_interface_failure_rt3_step3(): logger.info("Test (step 3): Check failover handling with RT3 down") tgen = get_topogen() # Skip if previous fatal error condition is raised if tgen.routers_have_failure(): pytest.skip(tgen.errors) # Let's kill the interface on rt3 and see what happens with the RIB and BFD on rt1 tgen.gears["rt3"].link_enable("eth-rt1", enabled=False) # By default BFD provides a recovery time of 900ms plus jitter, so let's wait # initial 2 seconds to let the CI not suffer. topotest.sleep(2, 'Wait for BFD down notification') router_compare_json_output("rt1", "show ip route ospf json", "step3/show_ip_route_rt3_down.ref", 10, 2) router_compare_json_output("rt1", "show ipv6 route ospf json", "step3/show_ipv6_route_rt3_down.ref", 1, 0) router_compare_json_output("rt1", "show bfd peers json", "step3/show_bfd_peers_rt3_down.ref", 1, 0) # Check recovery, this can take some time tgen.gears["rt3"].link_enable("eth-rt1", enabled=True) router_compare_json_output("rt1", "show ip route ospf json", "step3/show_ip_route_healthy.ref") router_compare_json_output("rt1", "show ipv6 route ospf json", "step3/show_ipv6_route_healthy.ref") router_compare_json_output("rt1", "show bfd peers json", "step3/show_bfd_peers_healthy.ref")
def test_bgp_convergence(): "Test for BGP topology convergence" tgen = get_topogen() # Skip if previous fatal error condition is raised if tgen.routers_have_failure(): pytest.skip(tgen.errors) topotest.sleep(20, 'waiting for bgp convergence') # Expected result router = tgen.gears['r1'] if router.has_version('<', '3.0'): reffile = os.path.join(CWD, 'r1/summary20.txt') else: reffile = os.path.join(CWD, 'r1/summary.txt') expected = json.loads(open(reffile).read()) # Define test function and call it def _convergence_test(): output = router.vtysh_cmd('show ip bgp summary json', isjson=True) return topotest.json_cmp(output, expected) _, res = topotest.run_and_expect(_convergence_test, None, count=10, wait=1) assertmsg = 'BGP router network did not converge' assert res is None, assertmsg
def test_shut_interface_and_recover(): "Test shutdown of an interface and recovery of the interface" tgen = get_topogen() router = tgen.gears['r1'] router.run('ip link set r1-eth1 down') topotest.sleep(5, 'Waiting for EIGRP convergence') router.run('ip link set r1-eth1 up')
def test_shut_interface_and_recover(): "Test shutdown of an interface and recovery of the interface" tgen = get_topogen() router = tgen.gears["r1"] router.run("ip link set r1-eth1 down") topotest.sleep(5, "Waiting for EIGRP convergence") router.run("ip link set r1-eth1 up")
def test_converge_protocols(): "Wait for protocol convergence" tgen = get_topogen() # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) topotest.sleep(5, 'Waiting for EIGRP convergence')
def test_protocols_convergence(): """ Assert that all protocols have converged statuses as they depend on it. """ tgen = get_topogen() if tgen.routers_have_failure(): pytest.skip(tgen.errors) topotest.sleep(4, "waiting 4 seconds for bgp convergence") # Check IPv4/IPv6 routing tables. output = tgen.gears["r1"].vtysh_cmd("show bgp l2vpn evpn", isjson=False) logger.info("==== result from show bgp l2vpn evpn") logger.info(output) output = tgen.gears["r1"].vtysh_cmd("show bgp l2vpn evpn route detail", isjson=False) logger.info("==== result from show bgp l2vpn evpn route detail") logger.info(output) output = tgen.gears["r1"].vtysh_cmd("show bgp vrf r1-vrf-101 ipv4", isjson=False) logger.info("==== result from show bgp vrf r1-vrf-101 ipv4") logger.info(output) output = tgen.gears["r1"].vtysh_cmd("show bgp vrf r1-vrf-101", isjson=False) logger.info("==== result from show bgp vrf r1-vrf-101 ") logger.info(output) output = tgen.gears["r1"].vtysh_cmd("show ip route vrf r1-vrf-101", isjson=False) logger.info("==== result from show ip route vrf r1-vrf-101") logger.info(output) output = tgen.gears["r1"].vtysh_cmd("show evpn vni detail", isjson=False) logger.info("==== result from show evpn vni detail") logger.info(output) output = tgen.gears["r1"].vtysh_cmd("show evpn next-hops vni all", isjson=False) logger.info("==== result from show evpn next-hops vni all") logger.info(output) output = tgen.gears["r1"].vtysh_cmd("show evpn rmac vni all", isjson=False) logger.info("==== result from show evpn next-hops vni all") logger.info(output) # Check IPv4 and IPv6 connectivity between r1 and r2 ( routing vxlan evpn) pingrouter = tgen.gears["r1"] logger.info( "Check Ping IPv4 from R1(r1-vrf-101) to R2(r2-vrf-101 = 192.168.101.41)" ) output = pingrouter.run( "ip netns exec r1-vrf-101 ping 192.168.101.41 -f -c 1000") logger.info(output) if "1000 packets transmitted, 1000 received" not in output: assertmsg = ( "expected ping IPv4 from R1(r1-vrf-101) to R2(192.168.101.41) should be ok" ) assert 0, assertmsg else: logger.info( "Check Ping IPv4 from R1(r1-vrf-101) to R2(192.168.101.41) OK")
def test_ospf_unset_supress_fa(original): "Test OSPF no area [x] nssa suppress-fa" # Remove suppress-fa in r2 area 1 ospf_unconfigure_suppress_fa("r2", "1") topotest.sleep(10, "Waiting for OSPF convergence") # Check forwarding address is the original value on r1 for all statics assertmsg = "Forwarding address is not correct after removing OSPF suppress-fa" restore = ospf_get_lsa_type5("r1") for prefix in restore: assert restore[prefix] == original[prefix], assertmsg
def test_ldp_pseudowires_after_link_down(): logger.info("Test: verify LDP pseudowires after r1-r2 link goes down") tgen = get_topogen() # Skip if previous fatal error condition is raised if tgen.routers_have_failure(): pytest.skip(tgen.errors) # Shut down r1-r2 link */ tgen = get_topogen() tgen.gears['r1'].peer_link_enable('r1-eth1', False) topotest.sleep(5, "Waiting for the network to reconverge") # check if the pseudowire is still up (using an alternate path for nexthop resolution) for rname in ['r1', 'r2', 'r3']: router_compare_json_output(rname, "show l2vpn atom vc json", "show_l2vpn_vc.ref")
def test_ospf_set_suppress_fa(): "Test OSPF area [x] nssa suppress-fa" # Get current forwarding address for each LSA type-5 in r1 initial = ospf_get_lsa_type5("r1") # Configure suppres-fa in r2 area 1 ospf_configure_suppress_fa("r2", "1") topotest.sleep(10, "Waiting for OSPF convergence") # Check forwarding address on r1 for all statics is 0.0.0.0 assertmsg = "Forwarding address is not 0.0.0.0 after enabling OSPF suppress-fa" suppress = ospf_get_lsa_type5("r1") for prefix in suppress: assert suppress[prefix] == "0.0.0.0", assertmsg # Return the original forwarding addresses so we can compare them # in the test_ospf_unset_supress_fa return initial
def setup_module(module): tgen = Topogen(BGPECMPTopo1, module.__name__) tgen.start_topology() # Starting Routers router_list = tgen.routers() for rname, router in router_list.iteritems(): 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))) router.start() # Starting Hosts and init ExaBGP on each of them topotest.sleep(10, "starting BGP on all {} peers".format(total_ebgp_peers)) peer_list = tgen.exabgp_peers() for pname, peer in peer_list.iteritems(): peer_dir = os.path.join(CWD, pname) env_file = os.path.join(CWD, "exabgp.env") peer.start(peer_dir, env_file) logger.info(pname)
def test_isis_convergence(): "Wait for the protocol to converge before starting to test" tgen = get_topogen() # Don't run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) topotest.sleep(45, "waiting for ISIS protocol to converge") # Code to generate the json files. # for rname, router in tgen.routers().iteritems(): # open('/tmp/{}_topology.json'.format(rname), 'w').write( # json.dumps(show_isis_topology(router), indent=2, sort_keys=True) # ) for rname, router in tgen.routers().iteritems(): filename = '{0}/{1}/{1}_topology.json'.format(CWD, rname) expected = json.loads(open(filename, 'r').read()) actual = show_isis_topology(router) assertmsg = "Router '{}' topology mismatch".format(rname) assert topotest.json_cmp(actual, expected) is None, assertmsg
def setup_module(mod): "Sets up the pytest environment" 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(TemplateTopo, mod.__name__) # ... and here it calls Mininet initialization functions. kernelv = platform.release() if topotest.version_cmp(kernelv, "4.15") < 0: logger.info( "For EVPN, kernel version should be minimum 4.15. Kernel present {}" .format(kernelv)) return if topotest.version_cmp(kernelv, '4.15') == 0: l3mdev_accept = 1 logger.info( 'setting net.ipv4.tcp_l3mdev_accept={}'.format(l3mdev_accept)) else: l3mdev_accept = 0 # Starting topology, create tmp files which are loaded to routers # to start deamons and then start routers tgen.start_topology() # Configure MAC address for hosts as these MACs are advertised with EVPN type-2 routes for (name, host) in tgen.gears.items(): if name not in HOSTS: continue host_mac = "1a:2b:3c:4d:5e:6{}".format(HOST_SUFFIX[name]) host.run("ip link set dev {}-eth0 down").format(name) host.run("ip link set dev {0}-eth0 address {1}".format(name, host_mac)) host.run("ip link set dev {}-eth0 up").format(name) # Configure PE VxLAN and Bridge interfaces for (name, pe) in tgen.gears.items(): if name not in PES: continue vtep_ip = "10.100.0.{}".format(PE_SUFFIX[name]) bridge_ip = "50.0.1.{}/24".format(PE_SUFFIX[name]) bridge_ipv6 = "50:0:1::{}/48".format(PE_SUFFIX[name]) pe.run("ip link add vrf-blue type vrf table 10") pe.run("ip link set dev vrf-blue up") pe.run("ip link add vxlan100 type vxlan id 100 dstport 4789 local {}". format(vtep_ip)) pe.run("ip link add name br100 type bridge stp_state 0") pe.run("ip link set dev vxlan100 master br100") pe.run("ip link set dev {}-eth1 master br100".format(name)) pe.run("ip addr add {} dev br100".format(bridge_ip)) pe.run("ip link set up dev br100") pe.run("ip link set up dev vxlan100") pe.run("ip link set up dev {}-eth1".format(name)) pe.run("ip link set dev br100 master vrf-blue") pe.run("ip -6 addr add {} dev br100".format(bridge_ipv6)) pe.run( "ip link add vxlan1000 type vxlan id 1000 dstport 4789 local {}". format(vtep_ip)) pe.run("ip link add name br1000 type bridge stp_state 0") pe.run("ip link set dev vxlan1000 master br100") pe.run("ip link set up dev br1000") pe.run("ip link set up dev vxlan1000") pe.run("ip link set dev br1000 master vrf-blue") pe.run("sysctl -w net.ipv4.ip_forward=1") pe.run("sysctl -w net.ipv6.conf.all.forwarding=1") pe.run("sysctl -w net.ipv4.udp_l3mdev_accept={}".format(l3mdev_accept)) pe.run("sysctl -w net.ipv4.tcp_l3mdev_accept={}".format(l3mdev_accept)) # For all registred routers, load the zebra configuration file for (name, router) in tgen.routers().items(): router.load_config(TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(name))) router.load_config(TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(name))) # After loading the configurations, this function loads configured daemons. tgen.start_router() logger.info("Running setup_module() done") topotest.sleep(200)