示例#1
0
def test_ospf_link_down():
    "Test OSPF convergence after a link goes down"
    tgen = get_topogen()

    if tgen.routers_have_failure():
        pytest.skip('skipped because of router(s) failure')

    # Simulate a network down event on router3 switch3 interface.
    router3 = tgen.gears['r3']
    topotest.interface_set_status(router3,
                                  'r3-eth0',
                                  ifaceaction=False,
                                  vrf_name='r3-cust1')

    # Expect convergence on all routers
    for rname, router in tgen.routers().iteritems():
        logger.info('Waiting for router "%s" convergence after link failure',
                    rname)
        # Load expected results from the command
        reffile = os.path.join(CWD, '{}/ospfroute_down.txt'.format(rname))
        expected = open(reffile).read()

        # Run test function until we get an result. Wait at most 60 seconds.
        test_func = partial(topotest.router_output_cmp, router,
                            'show ip ospf vrf {0}-cust1 route'.format(rname),
                            expected)
        result, diff = topotest.run_and_expect(test_func,
                                               '',
                                               count=140,
                                               wait=0.5)
        assertmsg = 'OSPF did not converge on {}:\n{}'.format(rname, diff)
        assert result, assertmsg
示例#2
0
def test_ospf_link_down():
    "Test OSPF convergence after a link goes down"
    tgen = get_topogen()

    if tgen.routers_have_failure():
        pytest.skip('skipped because of router(s) failure')

    # Simulate a network down event on router3 switch3 interface.
    router3 = tgen.gears['r3']
    topotest.interface_set_status(router3, 'r3-eth0', ifaceaction=False, vrf_name='r3-cust1')

    # Expect convergence on all routers
    for rname, router in tgen.routers().iteritems():
        logger.info('Waiting for router "%s" convergence after link failure', rname)
        # Load expected results from the command
        reffile = os.path.join(CWD, '{}/ospfroute_down.txt'.format(rname))
        expected = open(reffile).read()

        # Run test function until we get an result. Wait at most 60 seconds.
        test_func = partial(topotest.router_output_cmp,
                            router,
                            'show ip ospf vrf {0}-cust1 route'.format(rname),
                            expected)
        result, diff = topotest.run_and_expect(test_func, '',
                                               count=140, wait=0.5)
        assertmsg = 'OSPF did not converge on {}:\n{}'.format(rname, diff)
        assert result, assertmsg
def test_bfd_fast_convergence():
    """
    Assert that BFD notices the link down after simulating network
    failure.
    """
    tgen = get_topogen()
    if tgen.routers_have_failure():
        pytest.skip(tgen.errors)

    # Disable r2-eth0 link
    router2 = tgen.gears["r2"]
    topotest.interface_set_status(router2,
                                  "r2-eth0",
                                  ifaceaction=False,
                                  vrf_name="r2-bfd-cust1")

    # Wait the minimum time we can before checking that BGP/BFD
    # converged.
    logger.info("waiting for BFD converge")

    # Check that BGP converged quickly.
    for router in tgen.routers().values():
        json_file = "{}/{}/peers.json".format(CWD, router.name)
        expected = json.loads(open(json_file).read())

        # Load the same file as previous test, but expect R1 to be down.
        if router.name == "r1":
            for peer in expected:
                if peer["peer"] == "192.168.0.2":
                    peer["status"] = "down"
        else:
            for peer in expected:
                if peer["peer"] == "192.168.0.1":
                    peer["status"] = "down"

        test_func = partial(topotest.router_json_cmp, router,
                            "show bfd peers json", expected)
        _, res = topotest.run_and_expect(test_func, None, count=40, wait=1)
        assertmsg = '"{}" JSON output mismatches'.format(router.name)
        assert res is None, assertmsg
示例#4
0
def test_ospf_link_down():
    "Test OSPF convergence after a link goes down"
    tgen = get_topogen()
    if tgen.routers_have_failure():
        pytest.skip('skipped because of router(s) failure')

    # Simulate a network down event on router3 switch3 interface.
    router3 = tgen.gears['r3']
    topotest.interface_set_status(router3, 'r3-eth0', ifaceaction=False, vrf_name='r3-cust1')

    # Expect convergence on all routers
    for rnum in range(1, 4):
        router = 'r{}'.format(rnum)
        logger.info('Waiting for router "%s" convergence after link failure', router)
        # Load expected results from the command
        reffile = os.path.join(CWD, '{}/ospfroute_down.txt'.format(router))
        expected = open(reffile).read()

        # Run test function until we get an result. Wait at most 60 seconds.
        test_func = partial(compare_show_ip_ospf_vrf, router, expected)
        result, diff = topotest.run_and_expect(test_func, '',
                                               count=25, wait=3)
        assert result, 'OSPF did not converge on {}:\n{}'.format(router, diff)
示例#5
0
def _test_reachability(tgen, testbin):
    waitlist = [
        "192.168.0.1,192.168.0.2,192.168.0.4",
        "192.168.0.2,192.168.0.4",
        "192.168.0.1,192.168.0.2,192.168.0.4",
    ]
    r2 = tgen.gears["r2"]
    r3 = tgen.gears["r3"]

    wait_args = [f"--wait={x}" for x in waitlist]

    p = None
    try:
        step("reachable: check for initial reachability")
        p = r3.popen(
            ["/usr/bin/timeout", "120", testbin, "-v", *wait_args],
            encoding=None,  # don't buffer
            stdin=subprocess.DEVNULL,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
        )
        _wait_output(p, "SUCCESS: {}".format(waitlist[0]))

        step("reachable: check for modified reachability")
        interface_set_status(r2, "r2-eth0", False)
        _wait_output(p, "SUCCESS: {}".format(waitlist[1]))

        step("reachable: check for restored reachability")
        interface_set_status(r2, "r2-eth0", True)
        _wait_output(p, "SUCCESS: {}".format(waitlist[2]))
    except Exception as error:
        logging.error("ERROR: %s", error)
        raise
    finally:
        if p:
            p.terminate()
            p.wait()
示例#6
0
def test_bfd_fast_convergence():
    """
    Assert that BFD notices the link down after simulating network
    failure.
    """
    tgen = get_topogen()
    if tgen.routers_have_failure():
        pytest.skip(tgen.errors)

    # Disable r2-eth0 link
    router2 = tgen.gears['r2']
    topotest.interface_set_status(router2, 'r2-eth0', ifaceaction=False, vrf_name='r2-cust1')

    # Wait the minimum time we can before checking that BGP/BFD
    # converged.
    logger.info('waiting for BFD converge')

    # Check that BGP converged quickly.
    for router in tgen.routers().values():
        json_file = '{}/{}/peers.json'.format(CWD, router.name)
        expected = json.loads(open(json_file).read())

        # Load the same file as previous test, but expect R1 to be down.
        if router.name == 'r1':
            for peer in expected:
                if peer['peer'] == '192.168.0.2':
                    peer['status'] = 'down'
        else:
            for peer in expected:
                if peer['peer'] == '192.168.0.1':
                    peer['status'] = 'down'

        test_func = partial(topotest.router_json_cmp,
            router, 'show bfd peers json', expected)
        _, res = topotest.run_and_expect(test_func, None, count=20, wait=0.5)
        assertmsg = '"{}" JSON output mismatches'.format(router.name)
        assert res is None, assertmsg