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_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
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)
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()
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