Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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",
        )
Beispiel #5
0
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
Beispiel #7
0
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')
Beispiel #8
0
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")
Beispiel #9
0
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')
Beispiel #10
0
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
Beispiel #12
0
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)