mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-05 11:48:50 +00:00
Merge pull request #6144 from ton31337/fix/python_formatter
tests: Run python formatter (black) for topotests
This commit is contained in:
commit
a5ba758e61
@ -33,7 +33,7 @@ import pytest
|
||||
|
||||
# Save the Current Working Directory to find configuration files.
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
# Import topogen and topotest helpers
|
||||
@ -44,23 +44,26 @@ from lib.topolog import logger
|
||||
# Required to instantiate the topology builder class.
|
||||
from mininet.topo import Topo
|
||||
|
||||
|
||||
class BFDTopo(Topo):
|
||||
"Test topology builder"
|
||||
|
||||
def build(self, *_args, **_opts):
|
||||
"Build function"
|
||||
tgen = get_topogen(self)
|
||||
|
||||
# Create 4 routers.
|
||||
for routern in range(1, 4):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch("s2")
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
switch.add_link(tgen.gears["r3"])
|
||||
|
||||
switch = tgen.add_switch('s2')
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch.add_link(tgen.gears['r3'])
|
||||
|
||||
def setup_module(mod):
|
||||
"Sets up the pytest environment"
|
||||
@ -71,16 +74,13 @@ def setup_module(mod):
|
||||
|
||||
for rname, router in router_list.iteritems():
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname)),
|
||||
TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)),
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_BFD,
|
||||
os.path.join(CWD, '{}/bfdd.conf'.format(rname))
|
||||
TopoRouter.RD_BFD, os.path.join(CWD, "{}/bfdd.conf".format(rname))
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_BGP,
|
||||
os.path.join(CWD, '{}/bgpd.conf'.format(rname))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
# Initialize all routers.
|
||||
@ -90,10 +90,11 @@ def setup_module(mod):
|
||||
# daemon exists.
|
||||
for router in router_list.values():
|
||||
# Check for Version
|
||||
if router.has_version('<', '5.1'):
|
||||
tgen.set_error('Unsupported FRR version')
|
||||
if router.has_version("<", "5.1"):
|
||||
tgen.set_error("Unsupported FRR version")
|
||||
break
|
||||
|
||||
|
||||
def teardown_module(_mod):
|
||||
"Teardown the pytest environment"
|
||||
tgen = get_topogen()
|
||||
@ -112,17 +113,17 @@ def test_protocols_convergence():
|
||||
# Check IPv6 routing tables.
|
||||
logger.info("Checking IPv6 routes for convergence")
|
||||
for router in tgen.routers().values():
|
||||
if router.name == 'r2':
|
||||
if router.name == "r2":
|
||||
continue
|
||||
json_file = '{}/{}/ipv6_routes.json'.format(CWD, router.name)
|
||||
json_file = "{}/{}/ipv6_routes.json".format(CWD, router.name)
|
||||
if not os.path.isfile(json_file):
|
||||
logger.info('skipping file {}'.format(json_file))
|
||||
logger.info("skipping file {}".format(json_file))
|
||||
continue
|
||||
expected = json.loads(open(json_file).read())
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show ipv6 route json', expected)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=40,
|
||||
wait=0.5)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show ipv6 route json", expected
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=40, wait=0.5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(router.name)
|
||||
assert result is None, assertmsg
|
||||
|
||||
@ -133,19 +134,21 @@ def test_bfd_connection():
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info('waiting for bfd peers to go up')
|
||||
logger.info("waiting for bfd peers to go up")
|
||||
for router in tgen.routers().values():
|
||||
if router.name == 'r2':
|
||||
if router.name == "r2":
|
||||
continue
|
||||
json_file = '{}/{}/peers.json'.format(CWD, router.name)
|
||||
json_file = "{}/{}/peers.json".format(CWD, router.name)
|
||||
expected = json.loads(open(json_file).read())
|
||||
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show bfd peers json', expected)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show bfd peers json", expected
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=32, wait=0.5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(router.name)
|
||||
assert result is None, assertmsg
|
||||
|
||||
|
||||
def test_bfd_loss_intermediate():
|
||||
"""
|
||||
Assert that BFD notices the bfd link down failure.
|
||||
@ -155,94 +158,98 @@ def test_bfd_loss_intermediate():
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info('removing IPv6 address from r2 to simulate loss of connectivity')
|
||||
logger.info("removing IPv6 address from r2 to simulate loss of connectivity")
|
||||
# Disable r2-eth0 ipv6 address
|
||||
cmd = 'vtysh -c \"configure terminal\" -c \"interface r2-eth1\" -c "no ipv6 address 2001:db8:4::2/64\"'
|
||||
tgen.net['r2'].cmd(cmd)
|
||||
|
||||
cmd = 'vtysh -c "configure terminal" -c "interface r2-eth1" -c "no ipv6 address 2001:db8:4::2/64"'
|
||||
tgen.net["r2"].cmd(cmd)
|
||||
|
||||
# Wait the minimum time we can before checking that BGP/BFD
|
||||
# converged.
|
||||
logger.info('waiting for BFD converge down')
|
||||
logger.info("waiting for BFD converge down")
|
||||
|
||||
# Check that BGP converged quickly.
|
||||
for router in tgen.routers().values():
|
||||
if router.name == 'r2':
|
||||
if router.name == "r2":
|
||||
continue
|
||||
json_file = '{}/{}/peers_down.json'.format(CWD, router.name)
|
||||
json_file = "{}/{}/peers_down.json".format(CWD, router.name)
|
||||
expected = json.loads(open(json_file).read())
|
||||
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show bfd peers json', expected)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show bfd peers json", expected
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=32, wait=0.5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(router.name)
|
||||
assert result is None, assertmsg
|
||||
|
||||
logger.info('waiting for BGP entries to become stale')
|
||||
logger.info("waiting for BGP entries to become stale")
|
||||
for router in tgen.routers().values():
|
||||
if router.name == 'r2':
|
||||
if router.name == "r2":
|
||||
continue
|
||||
json_file = '{}/{}/bgp_ipv6_routes_down.json'.format(CWD, router.name)
|
||||
json_file = "{}/{}/bgp_ipv6_routes_down.json".format(CWD, router.name)
|
||||
expected = json.loads(open(json_file).read())
|
||||
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show bgp ipv6 json', expected)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show bgp ipv6 json", expected
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=50, wait=1)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(router.name)
|
||||
assert result is None, assertmsg
|
||||
|
||||
logger.info("Checking IPv6 routes on r1 should still be present")
|
||||
for router in tgen.routers().values():
|
||||
if router.name == 'r2':
|
||||
if router.name == "r2":
|
||||
continue
|
||||
if router.name == 'r3':
|
||||
if router.name == "r3":
|
||||
continue
|
||||
json_file = '{}/r1/ipv6_routes.json'.format(CWD)
|
||||
json_file = "{}/r1/ipv6_routes.json".format(CWD)
|
||||
expected = json.loads(open(json_file).read())
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show ipv6 route json', expected)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=30,
|
||||
wait=0.5)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show ipv6 route json", expected
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(router.name)
|
||||
assert result is None, assertmsg
|
||||
|
||||
|
||||
def test_bfd_comes_back_again():
|
||||
"""
|
||||
Assert that BFD notices the bfd link up
|
||||
and that ipv6 entries appear back
|
||||
"""
|
||||
tgen = get_topogen()
|
||||
logger.info('re-adding IPv6 address from r2 to simulate connectivity is back')
|
||||
logger.info("re-adding IPv6 address from r2 to simulate connectivity is back")
|
||||
# adds back r2-eth0 ipv6 address
|
||||
cmd = 'vtysh -c \"configure terminal\" -c \"interface r2-eth1\" -c "ipv6 address 2001:db8:4::2/64\"'
|
||||
tgen.net['r2'].cmd(cmd)
|
||||
cmd = 'vtysh -c "configure terminal" -c "interface r2-eth1" -c "ipv6 address 2001:db8:4::2/64"'
|
||||
tgen.net["r2"].cmd(cmd)
|
||||
|
||||
# Wait the minimum time we can before checking that BGP/BFD
|
||||
# converged.
|
||||
logger.info('waiting for BFD to converge up')
|
||||
logger.info("waiting for BFD to converge up")
|
||||
|
||||
# Check that BGP converged quickly.
|
||||
for router in tgen.routers().values():
|
||||
if router.name == 'r2':
|
||||
if router.name == "r2":
|
||||
continue
|
||||
json_file = '{}/{}/peers.json'.format(CWD, router.name)
|
||||
json_file = "{}/{}/peers.json".format(CWD, router.name)
|
||||
expected = json.loads(open(json_file).read())
|
||||
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show bfd peers json', expected)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show bfd peers json", expected
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=16, wait=0.5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(router.name)
|
||||
assert result is None, assertmsg
|
||||
|
||||
|
||||
|
||||
def test_memory_leak():
|
||||
"Run the memory leak test and report results."
|
||||
tgen = get_topogen()
|
||||
if not tgen.is_memleak_enabled():
|
||||
pytest.skip('Memory leak test/report is disabled')
|
||||
pytest.skip("Memory leak test/report is disabled")
|
||||
|
||||
tgen.report_memory_leaks()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -34,7 +34,7 @@ import pytest
|
||||
|
||||
# Save the Current Working Directory to find configuration files.
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
# Import topogen and topotest helpers
|
||||
@ -45,27 +45,29 @@ from lib.topolog import logger
|
||||
# Required to instantiate the topology builder class.
|
||||
from mininet.topo import Topo
|
||||
|
||||
|
||||
class BFDTopo(Topo):
|
||||
"Test topology builder"
|
||||
|
||||
def build(self, *_args, **_opts):
|
||||
"Build function"
|
||||
tgen = get_topogen(self)
|
||||
|
||||
# Create 4 routers
|
||||
for routern in range(1, 5):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch('s2')
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch.add_link(tgen.gears['r3'])
|
||||
switch = tgen.add_switch("s2")
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
switch.add_link(tgen.gears["r3"])
|
||||
|
||||
switch = tgen.add_switch('s3')
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch.add_link(tgen.gears['r4'])
|
||||
switch = tgen.add_switch("s3")
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
switch.add_link(tgen.gears["r4"])
|
||||
|
||||
|
||||
def setup_module(mod):
|
||||
@ -76,16 +78,13 @@ def setup_module(mod):
|
||||
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))
|
||||
TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_BFD,
|
||||
os.path.join(CWD, '{}/bfdd.conf'.format(rname))
|
||||
TopoRouter.RD_BFD, os.path.join(CWD, "{}/bfdd.conf".format(rname))
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_BGP,
|
||||
os.path.join(CWD, '{}/bgpd.conf'.format(rname))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
# Initialize all routers.
|
||||
@ -95,8 +94,8 @@ def setup_module(mod):
|
||||
# daemon exists.
|
||||
for router in router_list.values():
|
||||
# Check for Version
|
||||
if router.has_version('<', '5.1'):
|
||||
tgen.set_error('Unsupported FRR version')
|
||||
if router.has_version("<", "5.1"):
|
||||
tgen.set_error("Unsupported FRR version")
|
||||
break
|
||||
|
||||
|
||||
@ -112,14 +111,15 @@ def test_bfd_connection():
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info('waiting for bfd peers to go up')
|
||||
logger.info("waiting for bfd peers to go up")
|
||||
|
||||
for router in tgen.routers().values():
|
||||
json_file = '{}/{}/peers.json'.format(CWD, router.name)
|
||||
json_file = "{}/{}/peers.json".format(CWD, router.name)
|
||||
expected = json.loads(open(json_file).read())
|
||||
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show bfd peers json', expected)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show bfd peers json", expected
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=8, wait=0.5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(router.name)
|
||||
assert result is None, assertmsg
|
||||
@ -131,15 +131,16 @@ def test_bgp_convergence():
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info('waiting for bgp peers to go up')
|
||||
logger.info("waiting for bgp peers to go up")
|
||||
|
||||
for router in tgen.routers().values():
|
||||
ref_file = '{}/{}/bgp_summary.json'.format(CWD, router.name)
|
||||
ref_file = "{}/{}/bgp_summary.json".format(CWD, router.name)
|
||||
expected = json.loads(open(ref_file).read())
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show ip bgp summary json', expected)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show ip bgp summary json", expected
|
||||
)
|
||||
_, res = topotest.run_and_expect(test_func, None, count=125, wait=1.0)
|
||||
assertmsg = '{}: bgp did not converge'.format(router.name)
|
||||
assertmsg = "{}: bgp did not converge".format(router.name)
|
||||
assert res is None, assertmsg
|
||||
|
||||
|
||||
@ -149,15 +150,16 @@ def test_bgp_fast_convergence():
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info('waiting for bgp peers converge')
|
||||
logger.info("waiting for bgp peers converge")
|
||||
|
||||
for router in tgen.routers().values():
|
||||
ref_file = '{}/{}/bgp_prefixes.json'.format(CWD, router.name)
|
||||
ref_file = "{}/{}/bgp_prefixes.json".format(CWD, router.name)
|
||||
expected = json.loads(open(ref_file).read())
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show ip bgp json', expected)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show ip bgp json", expected
|
||||
)
|
||||
_, res = topotest.run_and_expect(test_func, None, count=40, wait=0.5)
|
||||
assertmsg = '{}: bgp did not converge'.format(router.name)
|
||||
assertmsg = "{}: bgp did not converge".format(router.name)
|
||||
assert res is None, assertmsg
|
||||
|
||||
|
||||
@ -171,29 +173,30 @@ def test_bfd_fast_convergence():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
# Disable r1-eth0 link.
|
||||
tgen.gears['r1'].link_enable('r1-eth0', enabled=False)
|
||||
tgen.gears["r1"].link_enable("r1-eth0", enabled=False)
|
||||
|
||||
# Wait the minimum time we can before checking that BGP/BFD
|
||||
# converged.
|
||||
logger.info('waiting for BFD converge')
|
||||
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)
|
||||
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':
|
||||
if router.name == "r1":
|
||||
for peer in expected:
|
||||
if peer['peer'] == '192.168.0.2':
|
||||
peer['status'] = 'down'
|
||||
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'
|
||||
if peer["peer"] == "192.168.0.1":
|
||||
peer["status"] = "down"
|
||||
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show bfd peers json', expected)
|
||||
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
|
||||
@ -205,31 +208,27 @@ def test_bgp_fast_reconvergence():
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info('waiting for BGP re convergence')
|
||||
logger.info("waiting for BGP re convergence")
|
||||
|
||||
# Check that BGP converged quickly.
|
||||
for router in tgen.routers().values():
|
||||
ref_file = '{}/{}/bgp_prefixes.json'.format(CWD, router.name)
|
||||
ref_file = "{}/{}/bgp_prefixes.json".format(CWD, router.name)
|
||||
expected = json.loads(open(ref_file).read())
|
||||
|
||||
# Load the same file as previous test, but set networks to None
|
||||
# to test absence.
|
||||
if router.name == 'r1':
|
||||
expected['routes']['10.254.254.2/32'] = None
|
||||
expected['routes']['10.254.254.3/32'] = None
|
||||
expected['routes']['10.254.254.4/32'] = None
|
||||
if router.name == "r1":
|
||||
expected["routes"]["10.254.254.2/32"] = None
|
||||
expected["routes"]["10.254.254.3/32"] = None
|
||||
expected["routes"]["10.254.254.4/32"] = None
|
||||
else:
|
||||
expected['routes']['10.254.254.1/32'] = None
|
||||
expected["routes"]["10.254.254.1/32"] = None
|
||||
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show ip bgp json', expected)
|
||||
_, res = topotest.run_and_expect(
|
||||
test_func,
|
||||
None,
|
||||
count=3,
|
||||
wait=1
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show ip bgp json", expected
|
||||
)
|
||||
assertmsg = '{}: bgp did not converge'.format(router.name)
|
||||
_, res = topotest.run_and_expect(test_func, None, count=3, wait=1)
|
||||
assertmsg = "{}: bgp did not converge".format(router.name)
|
||||
assert res is None, assertmsg
|
||||
|
||||
|
||||
@ -237,11 +236,11 @@ def test_memory_leak():
|
||||
"Run the memory leak test and report results."
|
||||
tgen = get_topogen()
|
||||
if not tgen.is_memleak_enabled():
|
||||
pytest.skip('Memory leak test/report is disabled')
|
||||
pytest.skip("Memory leak test/report is disabled")
|
||||
|
||||
tgen.report_memory_leaks()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -35,7 +35,7 @@ import pytest
|
||||
|
||||
# Save the Current Working Directory to find configuration files.
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
# Import topogen and topotest helpers
|
||||
@ -49,25 +49,26 @@ from mininet.topo import Topo
|
||||
|
||||
class BFDTopo(Topo):
|
||||
"Test topology builder"
|
||||
|
||||
def build(self, *_args, **_opts):
|
||||
"Build function"
|
||||
tgen = get_topogen(self)
|
||||
|
||||
# Create 4 routers.
|
||||
for routern in range(1, 5):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch('s2')
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch.add_link(tgen.gears['r3'])
|
||||
switch = tgen.add_switch("s2")
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
switch.add_link(tgen.gears["r3"])
|
||||
|
||||
switch = tgen.add_switch('s3')
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch.add_link(tgen.gears['r4'])
|
||||
switch = tgen.add_switch("s3")
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
switch.add_link(tgen.gears["r4"])
|
||||
|
||||
|
||||
def setup_module(mod):
|
||||
@ -78,24 +79,19 @@ def setup_module(mod):
|
||||
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))
|
||||
TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_BFD,
|
||||
os.path.join(CWD, '{}/bfdd.conf'.format(rname))
|
||||
TopoRouter.RD_BFD, os.path.join(CWD, "{}/bfdd.conf".format(rname))
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_BGP,
|
||||
os.path.join(CWD, '{}/bgpd.conf'.format(rname))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_OSPF,
|
||||
os.path.join(CWD, '{}/ospfd.conf'.format(rname))
|
||||
TopoRouter.RD_OSPF, os.path.join(CWD, "{}/ospfd.conf".format(rname))
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_OSPF6,
|
||||
os.path.join(CWD, '{}/ospf6d.conf'.format(rname))
|
||||
TopoRouter.RD_OSPF6, os.path.join(CWD, "{}/ospf6d.conf".format(rname))
|
||||
)
|
||||
|
||||
# Initialize all routers.
|
||||
@ -105,8 +101,8 @@ def setup_module(mod):
|
||||
# daemon exists.
|
||||
for router in router_list.values():
|
||||
# Check for Version
|
||||
if router.has_version('<', '5.1'):
|
||||
tgen.set_error('Unsupported FRR version')
|
||||
if router.has_version("<", "5.1"):
|
||||
tgen.set_error("Unsupported FRR version")
|
||||
break
|
||||
|
||||
|
||||
@ -128,32 +124,32 @@ def test_protocols_convergence():
|
||||
# Check IPv4 routing tables.
|
||||
logger.info("Checking IPv4 routes for convergence")
|
||||
for router in tgen.routers().values():
|
||||
json_file = '{}/{}/ipv4_routes.json'.format(CWD, router.name)
|
||||
json_file = "{}/{}/ipv4_routes.json".format(CWD, router.name)
|
||||
if not os.path.isfile(json_file):
|
||||
logger.info('skipping file {}'.format(json_file))
|
||||
logger.info("skipping file {}".format(json_file))
|
||||
continue
|
||||
|
||||
expected = json.loads(open(json_file).read())
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show ip route json', expected)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=160,
|
||||
wait=0.5)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show ip route json", expected
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=160, wait=0.5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(router.name)
|
||||
assert result is None, assertmsg
|
||||
|
||||
# Check IPv6 routing tables.
|
||||
logger.info("Checking IPv6 routes for convergence")
|
||||
for router in tgen.routers().values():
|
||||
json_file = '{}/{}/ipv6_routes.json'.format(CWD, router.name)
|
||||
json_file = "{}/{}/ipv6_routes.json".format(CWD, router.name)
|
||||
if not os.path.isfile(json_file):
|
||||
logger.info('skipping file {}'.format(json_file))
|
||||
logger.info("skipping file {}".format(json_file))
|
||||
continue
|
||||
|
||||
expected = json.loads(open(json_file).read())
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show ipv6 route json', expected)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=160,
|
||||
wait=0.5)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show ipv6 route json", expected
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=160, wait=0.5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(router.name)
|
||||
assert result is None, assertmsg
|
||||
|
||||
@ -164,14 +160,15 @@ def test_bfd_connection():
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info('waiting for bfd peers to go up')
|
||||
logger.info("waiting for bfd peers to go up")
|
||||
|
||||
for router in tgen.routers().values():
|
||||
json_file = '{}/{}/peers.json'.format(CWD, router.name)
|
||||
json_file = "{}/{}/peers.json".format(CWD, router.name)
|
||||
expected = json.loads(open(json_file).read())
|
||||
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show bfd peers json', expected)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show bfd peers json", expected
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=8, wait=0.5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(router.name)
|
||||
assert result is None, assertmsg
|
||||
@ -181,11 +178,11 @@ def test_memory_leak():
|
||||
"Run the memory leak test and report results."
|
||||
tgen = get_topogen()
|
||||
if not tgen.is_memleak_enabled():
|
||||
pytest.skip('Memory leak test/report is disabled')
|
||||
pytest.skip("Memory leak test/report is disabled")
|
||||
|
||||
tgen.report_memory_leaks()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -35,7 +35,7 @@ import pytest
|
||||
|
||||
# Save the Current Working Directory to find configuration files.
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
# Import topogen and topotest helpers
|
||||
@ -46,27 +46,29 @@ from lib.topolog import logger
|
||||
# Required to instantiate the topology builder class.
|
||||
from mininet.topo import Topo
|
||||
|
||||
|
||||
class BFDTopo(Topo):
|
||||
"Test topology builder"
|
||||
|
||||
def build(self, *_args, **_opts):
|
||||
"Build function"
|
||||
tgen = get_topogen(self)
|
||||
|
||||
# Create 4 routers
|
||||
for routern in range(1, 5):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch('s2')
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch.add_link(tgen.gears['r3'])
|
||||
switch = tgen.add_switch("s2")
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
switch.add_link(tgen.gears["r3"])
|
||||
|
||||
switch = tgen.add_switch('s3')
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch.add_link(tgen.gears['r4'])
|
||||
switch = tgen.add_switch("s3")
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
switch.add_link(tgen.gears["r4"])
|
||||
|
||||
|
||||
def setup_module(mod):
|
||||
@ -78,47 +80,50 @@ def setup_module(mod):
|
||||
|
||||
# check for zebra capability
|
||||
for rname, router in router_list.iteritems():
|
||||
if router.check_capability(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
'--vrfwnetns'
|
||||
) == False:
|
||||
return pytest.skip('Skipping BFD Topo1 VRF NETNS feature. VRF NETNS backend not available on FRR')
|
||||
if router.check_capability(TopoRouter.RD_ZEBRA, "--vrfwnetns") == False:
|
||||
return pytest.skip(
|
||||
"Skipping BFD Topo1 VRF NETNS feature. VRF NETNS backend not available on FRR"
|
||||
)
|
||||
|
||||
if os.system('ip netns list') != 0:
|
||||
return pytest.skip('Skipping BFD Topo1 VRF NETNS Test. NETNS not available on System')
|
||||
if os.system("ip netns list") != 0:
|
||||
return pytest.skip(
|
||||
"Skipping BFD Topo1 VRF NETNS Test. NETNS not available on System"
|
||||
)
|
||||
|
||||
logger.info('Testing with VRF Namespace support')
|
||||
logger.info("Testing with VRF Namespace support")
|
||||
|
||||
cmds = ['if [ -e /var/run/netns/{0}-cust1 ] ; then ip netns del {0}-cust1 ; fi',
|
||||
'ip netns add {0}-cust1',
|
||||
'ip link set dev {0}-eth0 netns {0}-cust1',
|
||||
'ip netns exec {0}-cust1 ifconfig {0}-eth0 up']
|
||||
cmds2 = ['ip link set dev {0}-eth1 netns {0}-cust1',
|
||||
'ip netns exec {0}-cust1 ifconfig {0}-eth1 up',
|
||||
'ip link set dev {0}-eth2 netns {0}-cust1',
|
||||
'ip netns exec {0}-cust1 ifconfig {0}-eth2 up']
|
||||
cmds = [
|
||||
"if [ -e /var/run/netns/{0}-cust1 ] ; then ip netns del {0}-cust1 ; fi",
|
||||
"ip netns add {0}-cust1",
|
||||
"ip link set dev {0}-eth0 netns {0}-cust1",
|
||||
"ip netns exec {0}-cust1 ifconfig {0}-eth0 up",
|
||||
]
|
||||
cmds2 = [
|
||||
"ip link set dev {0}-eth1 netns {0}-cust1",
|
||||
"ip netns exec {0}-cust1 ifconfig {0}-eth1 up",
|
||||
"ip link set dev {0}-eth2 netns {0}-cust1",
|
||||
"ip netns exec {0}-cust1 ifconfig {0}-eth2 up",
|
||||
]
|
||||
|
||||
for rname, router in router_list.iteritems():
|
||||
# create VRF rx-cust1 and link rx-eth0 to rx-cust1
|
||||
for cmd in cmds:
|
||||
output = tgen.net[rname].cmd(cmd.format(rname))
|
||||
if rname == 'r2':
|
||||
if rname == "r2":
|
||||
for cmd in cmds2:
|
||||
output = tgen.net[rname].cmd(cmd.format(rname))
|
||||
|
||||
for rname, router in router_list.iteritems():
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname)),
|
||||
'--vrfwnetns'
|
||||
os.path.join(CWD, "{}/zebra.conf".format(rname)),
|
||||
"--vrfwnetns",
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_BFD,
|
||||
os.path.join(CWD, '{}/bfdd.conf'.format(rname))
|
||||
TopoRouter.RD_BFD, os.path.join(CWD, "{}/bfdd.conf".format(rname))
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_BGP,
|
||||
os.path.join(CWD, '{}/bgpd.conf'.format(rname))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
# Initialize all routers.
|
||||
@ -128,42 +133,49 @@ def setup_module(mod):
|
||||
# daemon exists.
|
||||
for router in router_list.values():
|
||||
# Check for Version
|
||||
if router.has_version('<', '5.1'):
|
||||
tgen.set_error('Unsupported FRR version')
|
||||
if router.has_version("<", "5.1"):
|
||||
tgen.set_error("Unsupported FRR version")
|
||||
break
|
||||
|
||||
|
||||
def teardown_module(_mod):
|
||||
"Teardown the pytest environment"
|
||||
tgen = get_topogen()
|
||||
# move back rx-eth0 to default VRF
|
||||
# delete rx-vrf
|
||||
cmds = ['ip netns exec {0}-cust1 ip link set {0}-eth0 netns 1',
|
||||
'ip netns delete {0}-cust1']
|
||||
cmds2 = ['ip netns exec {0}-cust1 ip link set {0}-eth1 netns 1',
|
||||
'ip netns exec {0}-cust2 ip link set {0}-eth1 netns 1']
|
||||
cmds = [
|
||||
"ip netns exec {0}-cust1 ip link set {0}-eth0 netns 1",
|
||||
"ip netns delete {0}-cust1",
|
||||
]
|
||||
cmds2 = [
|
||||
"ip netns exec {0}-cust1 ip link set {0}-eth1 netns 1",
|
||||
"ip netns exec {0}-cust2 ip link set {0}-eth1 netns 1",
|
||||
]
|
||||
|
||||
router_list = tgen.routers()
|
||||
for rname, router in router_list.iteritems():
|
||||
if rname == 'r2':
|
||||
if rname == "r2":
|
||||
for cmd in cmds2:
|
||||
tgen.net[rname].cmd(cmd.format(rname))
|
||||
for cmd in cmds:
|
||||
tgen.net[rname].cmd(cmd.format(rname))
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_bfd_connection():
|
||||
"Assert that the BFD peers can find themselves."
|
||||
tgen = get_topogen()
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info('waiting for bfd peers to go up')
|
||||
logger.info("waiting for bfd peers to go up")
|
||||
for router in tgen.routers().values():
|
||||
json_file = '{}/{}/peers.json'.format(CWD, router.name)
|
||||
json_file = "{}/{}/peers.json".format(CWD, router.name)
|
||||
expected = json.loads(open(json_file).read())
|
||||
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show bfd peers json', expected)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp, router, "show bfd peers json", expected
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=8, wait=0.5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(router.name)
|
||||
assert result is None, assertmsg
|
||||
@ -175,15 +187,19 @@ def test_bgp_convergence():
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info('waiting for bgp peers to go up')
|
||||
logger.info("waiting for bgp peers to go up")
|
||||
|
||||
for router in tgen.routers().values():
|
||||
ref_file = '{}/{}/bgp_summary.json'.format(CWD, router.name)
|
||||
ref_file = "{}/{}/bgp_summary.json".format(CWD, router.name)
|
||||
expected = json.loads(open(ref_file).read())
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show ip bgp vrf {}-cust1 summary json'.format(router.name), expected)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp,
|
||||
router,
|
||||
"show ip bgp vrf {}-cust1 summary json".format(router.name),
|
||||
expected,
|
||||
)
|
||||
_, res = topotest.run_and_expect(test_func, None, count=125, wait=1.0)
|
||||
assertmsg = '{}: bgp did not converge'.format(router.name)
|
||||
assertmsg = "{}: bgp did not converge".format(router.name)
|
||||
assert res is None, assertmsg
|
||||
|
||||
|
||||
@ -193,15 +209,19 @@ def test_bgp_fast_convergence():
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info('waiting for bgp peers converge')
|
||||
logger.info("waiting for bgp peers converge")
|
||||
|
||||
for router in tgen.routers().values():
|
||||
ref_file = '{}/{}/bgp_prefixes.json'.format(CWD, router.name)
|
||||
ref_file = "{}/{}/bgp_prefixes.json".format(CWD, router.name)
|
||||
expected = json.loads(open(ref_file).read())
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show ip bgp vrf {}-cust1 json'.format(router.name), expected)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp,
|
||||
router,
|
||||
"show ip bgp vrf {}-cust1 json".format(router.name),
|
||||
expected,
|
||||
)
|
||||
_, res = topotest.run_and_expect(test_func, None, count=40, wait=0.5)
|
||||
assertmsg = '{}: bgp did not converge'.format(router.name)
|
||||
assertmsg = "{}: bgp did not converge".format(router.name)
|
||||
assert res is None, assertmsg
|
||||
|
||||
|
||||
@ -215,30 +235,33 @@ def test_bfd_fast_convergence():
|
||||
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')
|
||||
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')
|
||||
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)
|
||||
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':
|
||||
if router.name == "r1":
|
||||
for peer in expected:
|
||||
if peer['peer'] == '192.168.0.2':
|
||||
peer['status'] = 'down'
|
||||
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'
|
||||
if peer["peer"] == "192.168.0.1":
|
||||
peer["status"] = "down"
|
||||
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show bfd peers json', expected)
|
||||
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
|
||||
@ -250,31 +273,30 @@ def test_bgp_fast_reconvergence():
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info('waiting for BGP re convergence')
|
||||
logger.info("waiting for BGP re convergence")
|
||||
|
||||
# Check that BGP converged quickly.
|
||||
for router in tgen.routers().values():
|
||||
ref_file = '{}/{}/bgp_prefixes.json'.format(CWD, router.name)
|
||||
ref_file = "{}/{}/bgp_prefixes.json".format(CWD, router.name)
|
||||
expected = json.loads(open(ref_file).read())
|
||||
|
||||
# Load the same file as previous test, but set networks to None
|
||||
# to test absence.
|
||||
if router.name == 'r1':
|
||||
expected['routes']['10.254.254.2/32'] = None
|
||||
expected['routes']['10.254.254.3/32'] = None
|
||||
expected['routes']['10.254.254.4/32'] = None
|
||||
if router.name == "r1":
|
||||
expected["routes"]["10.254.254.2/32"] = None
|
||||
expected["routes"]["10.254.254.3/32"] = None
|
||||
expected["routes"]["10.254.254.4/32"] = None
|
||||
else:
|
||||
expected['routes']['10.254.254.1/32'] = None
|
||||
expected["routes"]["10.254.254.1/32"] = None
|
||||
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show ip bgp vrf {}-cust1 json'.format(router.name), expected)
|
||||
_, res = topotest.run_and_expect(
|
||||
test_func,
|
||||
None,
|
||||
count=3,
|
||||
wait=1
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp,
|
||||
router,
|
||||
"show ip bgp vrf {}-cust1 json".format(router.name),
|
||||
expected,
|
||||
)
|
||||
assertmsg = '{}: bgp did not converge'.format(router.name)
|
||||
_, res = topotest.run_and_expect(test_func, None, count=3, wait=1)
|
||||
assertmsg = "{}: bgp did not converge".format(router.name)
|
||||
assert res is None, assertmsg
|
||||
|
||||
|
||||
@ -282,11 +304,11 @@ def test_memory_leak():
|
||||
"Run the memory leak test and report results."
|
||||
tgen = get_topogen()
|
||||
if not tgen.is_memleak_enabled():
|
||||
pytest.skip('Memory leak test/report is disabled')
|
||||
pytest.skip("Memory leak test/report is disabled")
|
||||
|
||||
tgen.report_memory_leaks()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -48,8 +48,8 @@ from copy import deepcopy
|
||||
|
||||
# Save the Current Working Directory to find configuration files.
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, '../lib/'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
sys.path.append(os.path.join(CWD, "../lib/"))
|
||||
|
||||
# Required to instantiate the topology builder class.
|
||||
|
||||
@ -59,30 +59,39 @@ from lib.topogen import Topogen, get_topogen
|
||||
from mininet.topo import Topo
|
||||
|
||||
from lib.common_config import (
|
||||
start_topology, write_test_header,
|
||||
write_test_footer, reset_config_on_routers, create_static_routes,
|
||||
verify_rib, verify_admin_distance_for_static_routes
|
||||
start_topology,
|
||||
write_test_header,
|
||||
write_test_footer,
|
||||
reset_config_on_routers,
|
||||
create_static_routes,
|
||||
verify_rib,
|
||||
verify_admin_distance_for_static_routes,
|
||||
)
|
||||
from lib.topolog import logger
|
||||
from lib.bgp import (
|
||||
verify_bgp_convergence, create_router_bgp, verify_router_id,
|
||||
modify_as_number, verify_as_numbers, clear_bgp_and_verify,
|
||||
verify_bgp_timers_and_functionality
|
||||
verify_bgp_convergence,
|
||||
create_router_bgp,
|
||||
verify_router_id,
|
||||
modify_as_number,
|
||||
verify_as_numbers,
|
||||
clear_bgp_and_verify,
|
||||
verify_bgp_timers_and_functionality,
|
||||
)
|
||||
from lib.topojson import build_topo_from_json, build_config_from_json
|
||||
|
||||
# Reading the data from JSON File for topology creation
|
||||
jsonFile = "{}/bgp_basic_functionality.json".format(CWD)
|
||||
try:
|
||||
with open(jsonFile, 'r') as topoJson:
|
||||
with open(jsonFile, "r") as topoJson:
|
||||
topo = json.load(topoJson)
|
||||
except IOError:
|
||||
assert False, "Could not read file {}".format(jsonFile)
|
||||
|
||||
#Global Variable
|
||||
# Global Variable
|
||||
KEEPALIVETIMER = 2
|
||||
HOLDDOWNTIMER = 6
|
||||
|
||||
|
||||
class CreateTopo(Topo):
|
||||
"""
|
||||
Test BasicTopo - topology 1
|
||||
@ -124,8 +133,9 @@ def setup_module(mod):
|
||||
|
||||
global BGP_CONVERGENCE
|
||||
BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo)
|
||||
assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error: {}". \
|
||||
format(BGP_CONVERGENCE)
|
||||
assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error: {}".format(
|
||||
BGP_CONVERGENCE
|
||||
)
|
||||
|
||||
logger.info("Running setup_module() done")
|
||||
|
||||
@ -140,8 +150,9 @@ def teardown_module():
|
||||
# Stop toplogy and Remove tmp files
|
||||
tgen.stop_topology()
|
||||
|
||||
logger.info("Testsuite end time: {}".
|
||||
format(time.asctime(time.localtime(time.time()))))
|
||||
logger.info(
|
||||
"Testsuite end time: {}".format(time.asctime(time.localtime(time.time())))
|
||||
)
|
||||
logger.info("=" * 40)
|
||||
|
||||
|
||||
@ -157,7 +168,7 @@ def test_modify_and_delete_router_id(request):
|
||||
|
||||
tgen = get_topogen()
|
||||
if BGP_CONVERGENCE is not True:
|
||||
pytest.skip('skipped because of BGP Convergence failure')
|
||||
pytest.skip("skipped because of BGP Convergence failure")
|
||||
|
||||
# test case name
|
||||
tc_name = request.node.name
|
||||
@ -165,59 +176,31 @@ def test_modify_and_delete_router_id(request):
|
||||
|
||||
# Modify router id
|
||||
input_dict = {
|
||||
'r1': {
|
||||
"bgp": {
|
||||
'router_id': '12.12.12.12'
|
||||
}
|
||||
},
|
||||
'r2': {
|
||||
"bgp": {
|
||||
'router_id': '22.22.22.22'
|
||||
}
|
||||
},
|
||||
'r3': {
|
||||
"bgp": {
|
||||
'router_id': '33.33.33.33'
|
||||
}
|
||||
},
|
||||
"r1": {"bgp": {"router_id": "12.12.12.12"}},
|
||||
"r2": {"bgp": {"router_id": "22.22.22.22"}},
|
||||
"r3": {"bgp": {"router_id": "33.33.33.33"}},
|
||||
}
|
||||
result = create_router_bgp(tgen, topo, input_dict)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".\
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
# Verifying router id once modified
|
||||
result = verify_router_id(tgen, topo, input_dict)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".\
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
# Delete router id
|
||||
input_dict = {
|
||||
'r1': {
|
||||
"bgp": {
|
||||
'del_router_id': True
|
||||
}
|
||||
},
|
||||
'r2': {
|
||||
"bgp": {
|
||||
'del_router_id': True
|
||||
}
|
||||
},
|
||||
'r3': {
|
||||
"bgp": {
|
||||
'del_router_id': True
|
||||
}
|
||||
},
|
||||
"r1": {"bgp": {"del_router_id": True}},
|
||||
"r2": {"bgp": {"del_router_id": True}},
|
||||
"r3": {"bgp": {"del_router_id": True}},
|
||||
}
|
||||
result = create_router_bgp(tgen, topo, input_dict)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
# Verifying router id once deleted
|
||||
# Once router-id is deleted, highest interface ip should become
|
||||
# router-id
|
||||
result = verify_router_id(tgen, topo, input_dict)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -229,41 +212,23 @@ def test_bgp_config_with_4byte_as_number(request):
|
||||
|
||||
tgen = get_topogen()
|
||||
if BGP_CONVERGENCE is not True:
|
||||
pytest.skip('skipped because of BGP Convergence failure')
|
||||
pytest.skip("skipped because of BGP Convergence failure")
|
||||
|
||||
# test case name
|
||||
tc_name = request.node.name
|
||||
write_test_header(tc_name)
|
||||
|
||||
input_dict = {
|
||||
"r1": {
|
||||
"bgp": {
|
||||
"local_as": 131079
|
||||
}
|
||||
},
|
||||
"r2": {
|
||||
"bgp": {
|
||||
"local_as": 131079
|
||||
}
|
||||
},
|
||||
"r3": {
|
||||
"bgp": {
|
||||
"local_as": 131079
|
||||
}
|
||||
},
|
||||
"r4": {
|
||||
"bgp": {
|
||||
"local_as": 131080
|
||||
}
|
||||
}
|
||||
"r1": {"bgp": {"local_as": 131079}},
|
||||
"r2": {"bgp": {"local_as": 131079}},
|
||||
"r3": {"bgp": {"local_as": 131079}},
|
||||
"r4": {"bgp": {"local_as": 131080}},
|
||||
}
|
||||
result = modify_as_number(tgen, topo, input_dict)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
result = verify_as_numbers(tgen, topo, input_dict)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -275,7 +240,7 @@ def test_bgp_timers_functionality(request):
|
||||
|
||||
tgen = get_topogen()
|
||||
if BGP_CONVERGENCE is not True:
|
||||
pytest.skip('skipped because of BGP Convergence failure')
|
||||
pytest.skip("skipped because of BGP Convergence failure")
|
||||
|
||||
# test case name
|
||||
tc_name = request.node.name
|
||||
@ -293,10 +258,10 @@ def test_bgp_timers_functionality(request):
|
||||
"unicast": {
|
||||
"neighbor": {
|
||||
"r2": {
|
||||
"dest_link":{
|
||||
"dest_link": {
|
||||
"r1": {
|
||||
"keepalivetimer": KEEPALIVETIMER,
|
||||
"holddowntimer": HOLDDOWNTIMER
|
||||
"holddowntimer": HOLDDOWNTIMER,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -308,16 +273,14 @@ def test_bgp_timers_functionality(request):
|
||||
}
|
||||
}
|
||||
result = create_router_bgp(tgen, topo, deepcopy(input_dict))
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
# Api call to clear bgp, so timer modification would take place
|
||||
clear_bgp_and_verify(tgen, topo, 'r1')
|
||||
clear_bgp_and_verify(tgen, topo, "r1")
|
||||
|
||||
# Verifying bgp timers functionality
|
||||
result = verify_bgp_timers_and_functionality(tgen, topo, input_dict)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -327,7 +290,7 @@ def test_static_routes(request):
|
||||
|
||||
tgen = get_topogen()
|
||||
if BGP_CONVERGENCE is not True:
|
||||
pytest.skip('skipped because of BGP Convergence failure')
|
||||
pytest.skip("skipped because of BGP Convergence failure")
|
||||
|
||||
# test case name
|
||||
tc_name = request.node.name
|
||||
@ -339,17 +302,18 @@ def test_static_routes(request):
|
||||
# Api call to create static routes
|
||||
input_dict = {
|
||||
"r1": {
|
||||
"static_routes": [{
|
||||
"network": "10.0.20.1/32",
|
||||
"no_of_ip": 9,
|
||||
"admin_distance": 100,
|
||||
"next_hop": "10.0.0.2"
|
||||
}]
|
||||
"static_routes": [
|
||||
{
|
||||
"network": "10.0.20.1/32",
|
||||
"no_of_ip": 9,
|
||||
"admin_distance": 100,
|
||||
"next_hop": "10.0.0.2",
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
result = create_static_routes(tgen, input_dict)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
# Api call to redistribute static routes
|
||||
input_dict_1 = {
|
||||
@ -360,7 +324,7 @@ def test_static_routes(request):
|
||||
"unicast": {
|
||||
"redistribute": [
|
||||
{"redist_type": "static"},
|
||||
{"redist_type": "connected"}
|
||||
{"redist_type": "connected"},
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -370,17 +334,16 @@ def test_static_routes(request):
|
||||
}
|
||||
|
||||
result = create_router_bgp(tgen, topo, input_dict_1)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
# Verifying RIB routes
|
||||
dut = 'r3'
|
||||
protocol = 'bgp'
|
||||
next_hop = ['10.0.0.2', '10.0.0.5']
|
||||
result = verify_rib(tgen, 'ipv4', dut, input_dict, next_hop=next_hop,
|
||||
protocol=protocol)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
dut = "r3"
|
||||
protocol = "bgp"
|
||||
next_hop = ["10.0.0.2", "10.0.0.5"]
|
||||
result = verify_rib(
|
||||
tgen, "ipv4", dut, input_dict, next_hop=next_hop, protocol=protocol
|
||||
)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -390,7 +353,7 @@ def test_admin_distance_for_existing_static_routes(request):
|
||||
|
||||
tgen = get_topogen()
|
||||
if BGP_CONVERGENCE is not True:
|
||||
pytest.skip('skipped because of BGP Convergence failure')
|
||||
pytest.skip("skipped because of BGP Convergence failure")
|
||||
|
||||
# test case name
|
||||
tc_name = request.node.name
|
||||
@ -401,21 +364,21 @@ def test_admin_distance_for_existing_static_routes(request):
|
||||
|
||||
input_dict = {
|
||||
"r1": {
|
||||
"static_routes": [{
|
||||
"network": "10.0.20.1/32",
|
||||
"admin_distance": 10,
|
||||
"next_hop": "10.0.0.2"
|
||||
}]
|
||||
"static_routes": [
|
||||
{
|
||||
"network": "10.0.20.1/32",
|
||||
"admin_distance": 10,
|
||||
"next_hop": "10.0.0.2",
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
result = create_static_routes(tgen, input_dict)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
# Verifying admin distance once modified
|
||||
result = verify_admin_distance_for_static_routes(tgen, input_dict)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -425,7 +388,7 @@ def test_advertise_network_using_network_command(request):
|
||||
|
||||
tgen = get_topogen()
|
||||
if BGP_CONVERGENCE is not True:
|
||||
pytest.skip('skipped because of BGP Convergence failure')
|
||||
pytest.skip("skipped because of BGP Convergence failure")
|
||||
|
||||
# test case name
|
||||
tc_name = request.node.name
|
||||
@ -442,14 +405,8 @@ def test_advertise_network_using_network_command(request):
|
||||
"ipv4": {
|
||||
"unicast": {
|
||||
"advertise_networks": [
|
||||
{
|
||||
"network": "20.0.0.0/32",
|
||||
"no_of_network": 10
|
||||
},
|
||||
{
|
||||
"network": "30.0.0.0/32",
|
||||
"no_of_network": 10
|
||||
}
|
||||
{"network": "20.0.0.0/32", "no_of_network": 10},
|
||||
{"network": "30.0.0.0/32", "no_of_network": 10},
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -459,15 +416,13 @@ def test_advertise_network_using_network_command(request):
|
||||
}
|
||||
|
||||
result = create_router_bgp(tgen, topo, input_dict)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
# Verifying RIB routes
|
||||
dut = 'r2'
|
||||
dut = "r2"
|
||||
protocol = "bgp"
|
||||
result = verify_rib(tgen, 'ipv4', dut, input_dict, protocol=protocol)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
result = verify_rib(tgen, "ipv4", dut, input_dict, protocol=protocol)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -480,7 +435,7 @@ def test_clear_bgp_and_verify(request):
|
||||
|
||||
tgen = get_topogen()
|
||||
if BGP_CONVERGENCE is not True:
|
||||
pytest.skip('skipped because of BGP Convergence failure')
|
||||
pytest.skip("skipped because of BGP Convergence failure")
|
||||
|
||||
# test case name
|
||||
tc_name = request.node.name
|
||||
@ -490,9 +445,8 @@ def test_clear_bgp_and_verify(request):
|
||||
reset_config_on_routers(tgen)
|
||||
|
||||
# clear ip bgp
|
||||
result = clear_bgp_and_verify(tgen, topo, 'r1')
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
result = clear_bgp_and_verify(tgen, topo, "r1")
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -509,7 +463,7 @@ def test_bgp_with_loopback_interface(request):
|
||||
|
||||
tgen = get_topogen()
|
||||
if BGP_CONVERGENCE is not True:
|
||||
pytest.skip('skipped because of BGP Convergence failure')
|
||||
pytest.skip("skipped because of BGP Convergence failure")
|
||||
|
||||
# test case name
|
||||
tc_name = request.node.name
|
||||
@ -518,79 +472,51 @@ def test_bgp_with_loopback_interface(request):
|
||||
# Creating configuration from JSON
|
||||
reset_config_on_routers(tgen)
|
||||
|
||||
for routerN in sorted(topo['routers'].keys()):
|
||||
for bgp_neighbor in \
|
||||
topo['routers'][routerN]['bgp']['address_family']['ipv4'][
|
||||
'unicast']['neighbor'].keys():
|
||||
for routerN in sorted(topo["routers"].keys()):
|
||||
for bgp_neighbor in topo["routers"][routerN]["bgp"]["address_family"]["ipv4"][
|
||||
"unicast"
|
||||
]["neighbor"].keys():
|
||||
|
||||
# Adding ['source_link'] = 'lo' key:value pair
|
||||
topo['routers'][routerN]['bgp']['address_family']['ipv4'][
|
||||
'unicast']['neighbor'][bgp_neighbor]["dest_link"] = {
|
||||
'lo': {
|
||||
"source_link": "lo",
|
||||
}
|
||||
}
|
||||
topo["routers"][routerN]["bgp"]["address_family"]["ipv4"]["unicast"][
|
||||
"neighbor"
|
||||
][bgp_neighbor]["dest_link"] = {"lo": {"source_link": "lo",}}
|
||||
|
||||
# Creating configuration from JSON
|
||||
build_config_from_json(tgen, topo)
|
||||
|
||||
input_dict = {
|
||||
"r1": {
|
||||
"static_routes": [{
|
||||
"network": "1.0.2.17/32",
|
||||
"next_hop": "10.0.0.2"
|
||||
},
|
||||
{
|
||||
"network": "1.0.3.17/32",
|
||||
"next_hop": "10.0.0.6"
|
||||
}
|
||||
"static_routes": [
|
||||
{"network": "1.0.2.17/32", "next_hop": "10.0.0.2"},
|
||||
{"network": "1.0.3.17/32", "next_hop": "10.0.0.6"},
|
||||
]
|
||||
},
|
||||
"r2": {
|
||||
"static_routes": [{
|
||||
"network": "1.0.1.17/32",
|
||||
"next_hop": "10.0.0.1"
|
||||
},
|
||||
{
|
||||
"network": "1.0.3.17/32",
|
||||
"next_hop": "10.0.0.10"
|
||||
}
|
||||
"static_routes": [
|
||||
{"network": "1.0.1.17/32", "next_hop": "10.0.0.1"},
|
||||
{"network": "1.0.3.17/32", "next_hop": "10.0.0.10"},
|
||||
]
|
||||
},
|
||||
"r3": {
|
||||
"static_routes": [{
|
||||
"network": "1.0.1.17/32",
|
||||
"next_hop": "10.0.0.5"
|
||||
},
|
||||
{
|
||||
"network": "1.0.2.17/32",
|
||||
"next_hop": "10.0.0.9"
|
||||
},
|
||||
{
|
||||
"network": "1.0.4.17/32",
|
||||
"next_hop": "10.0.0.14"
|
||||
}
|
||||
"static_routes": [
|
||||
{"network": "1.0.1.17/32", "next_hop": "10.0.0.5"},
|
||||
{"network": "1.0.2.17/32", "next_hop": "10.0.0.9"},
|
||||
{"network": "1.0.4.17/32", "next_hop": "10.0.0.14"},
|
||||
]
|
||||
},
|
||||
"r4": {
|
||||
"static_routes": [{
|
||||
"network": "1.0.3.17/32",
|
||||
"next_hop": "10.0.0.13"
|
||||
}]
|
||||
}
|
||||
"r4": {"static_routes": [{"network": "1.0.3.17/32", "next_hop": "10.0.0.13"}]},
|
||||
}
|
||||
result = create_static_routes(tgen, input_dict)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
# Api call verify whether BGP is converged
|
||||
result = verify_bgp_convergence(tgen, topo)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}". \
|
||||
format(tc_name, result)
|
||||
assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -13,37 +13,54 @@ sleep(5)
|
||||
# 2nd arg is number of routes to send
|
||||
peer = int(argv[1])
|
||||
numRoutes = int(argv[2])
|
||||
if (peer <= 10):
|
||||
if peer <= 10:
|
||||
asnum = 99
|
||||
else:
|
||||
asnum = peer+100
|
||||
asnum = peer + 100
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n' % (i, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.201.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes per PE - different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.202.%s.0/24 med 100 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n' % (i, peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write(
|
||||
"announce route 10.203.%s.0/24 med %i next-hop 10.0.%i.%i origin igp\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce numRoutes equal routes with different med per PE and different neighbor AS, but same source AS
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (i, peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.204.%s.0/24 med %i next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (i, peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 2 different route per peer
|
||||
stdout.write('announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n' % (peer, (((peer-1) / 5) + 1), peer+100))
|
||||
stdout.write('announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n' % (peer, (((peer-1) / 5) + 1), peer+100, asnum))
|
||||
stdout.write(
|
||||
"announce route 10.205.%i.0/24 next-hop 10.0.%i.%i origin igp\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100)
|
||||
)
|
||||
stdout.write(
|
||||
"announce route 10.206.%i.0/24 next-hop 10.0.%i.%i origin igp as-path [ %i 200 ]\n"
|
||||
% (peer, (((peer - 1) / 5) + 1), peer + 100, asnum)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
||||
|
@ -34,7 +34,7 @@ import pytest
|
||||
|
||||
# Save the Current Working Directory to find configuration files.
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
# Import topogen and topotest helpers
|
||||
@ -61,23 +61,24 @@ class BGPECMPTopo1(Topo):
|
||||
tgen = get_topogen(self)
|
||||
|
||||
# Create the BGP router
|
||||
router = tgen.add_router('r1')
|
||||
router = tgen.add_router("r1")
|
||||
|
||||
# Setup Switches - 1 switch per 5 peering routers
|
||||
for swNum in range(1, (total_ebgp_peers + 4) / 5 + 1):
|
||||
switch = tgen.add_switch('s{}'.format(swNum))
|
||||
switch = tgen.add_switch("s{}".format(swNum))
|
||||
switch.add_link(router)
|
||||
|
||||
# Add 'total_ebgp_peers' number of eBGP ExaBGP neighbors
|
||||
for peerNum in range(1, total_ebgp_peers+1):
|
||||
swNum = ((peerNum - 1) / 5 + 1)
|
||||
for peerNum in range(1, total_ebgp_peers + 1):
|
||||
swNum = (peerNum - 1) / 5 + 1
|
||||
|
||||
peer_ip = '10.0.{}.{}'.format(swNum, peerNum + 100)
|
||||
peer_route = 'via 10.0.{}.1'.format(swNum)
|
||||
peer = tgen.add_exabgp_peer('peer{}'.format(peerNum),
|
||||
ip=peer_ip, defaultRoute=peer_route)
|
||||
peer_ip = "10.0.{}.{}".format(swNum, peerNum + 100)
|
||||
peer_route = "via 10.0.{}.1".format(swNum)
|
||||
peer = tgen.add_exabgp_peer(
|
||||
"peer{}".format(peerNum), ip=peer_ip, defaultRoute=peer_route
|
||||
)
|
||||
|
||||
switch = tgen.gears['s{}'.format(swNum)]
|
||||
switch = tgen.gears["s{}".format(swNum)]
|
||||
switch.add_link(peer)
|
||||
|
||||
|
||||
@ -87,6 +88,7 @@ class BGPECMPTopo1(Topo):
|
||||
#
|
||||
#####################################################
|
||||
|
||||
|
||||
def setup_module(module):
|
||||
tgen = Topogen(BGPECMPTopo1, module.__name__)
|
||||
tgen.start_topology()
|
||||
@ -95,21 +97,19 @@ def setup_module(module):
|
||||
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))
|
||||
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))
|
||||
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))
|
||||
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')
|
||||
env_file = os.path.join(CWD, "exabgp.env")
|
||||
peer.start(peer_dir, env_file)
|
||||
logger.info(pname)
|
||||
|
||||
@ -128,11 +128,11 @@ def test_bgp_convergence():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
# Expected result
|
||||
router = tgen.gears['r1']
|
||||
if router.has_version('<', '3.0'):
|
||||
reffile = os.path.join(CWD, 'r1/summary20.txt')
|
||||
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')
|
||||
reffile = os.path.join(CWD, "r1/summary.txt")
|
||||
|
||||
expected = json.loads(open(reffile).read())
|
||||
|
||||
@ -142,18 +142,19 @@ def test_bgp_convergence():
|
||||
with 'json') and compare with `data` contents.
|
||||
"""
|
||||
output = router.vtysh_cmd(cmd, isjson=True)
|
||||
if 'ipv4Unicast' in output:
|
||||
output['ipv4Unicast']['vrfName'] = \
|
||||
output['ipv4Unicast']['vrfName'].replace(
|
||||
'default', 'Default')
|
||||
elif 'vrfName' in output:
|
||||
output['vrfName'] = output['vrfName'].replace('default', 'Default')
|
||||
if "ipv4Unicast" in output:
|
||||
output["ipv4Unicast"]["vrfName"] = output["ipv4Unicast"]["vrfName"].replace(
|
||||
"default", "Default"
|
||||
)
|
||||
elif "vrfName" in output:
|
||||
output["vrfName"] = output["vrfName"].replace("default", "Default")
|
||||
return topotest.json_cmp(output, data)
|
||||
|
||||
test_func = functools.partial(
|
||||
_output_summary_cmp, router, 'show ip bgp summary json', expected)
|
||||
_output_summary_cmp, router, "show ip bgp summary json", expected
|
||||
)
|
||||
_, res = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
|
||||
assertmsg = 'BGP router network did not converge'
|
||||
assertmsg = "BGP router network did not converge"
|
||||
assert res is None, assertmsg
|
||||
|
||||
|
||||
@ -165,26 +166,26 @@ def test_bgp_ecmp():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
expect = {
|
||||
'routerId': '10.0.255.1',
|
||||
'routes': {
|
||||
},
|
||||
"routerId": "10.0.255.1",
|
||||
"routes": {},
|
||||
}
|
||||
|
||||
for net in range(1, 5):
|
||||
for subnet in range(0, 10):
|
||||
netkey = '10.20{}.{}.0/24'.format(net, subnet)
|
||||
expect['routes'][netkey] = []
|
||||
netkey = "10.20{}.{}.0/24".format(net, subnet)
|
||||
expect["routes"][netkey] = []
|
||||
for _ in range(0, 10):
|
||||
peer = {'multipath': True, 'valid': True}
|
||||
expect['routes'][netkey].append(peer)
|
||||
peer = {"multipath": True, "valid": True}
|
||||
expect["routes"][netkey].append(peer)
|
||||
|
||||
test_func = functools.partial(topotest.router_json_cmp,
|
||||
tgen.gears['r1'], 'show ip bgp json', expect)
|
||||
test_func = functools.partial(
|
||||
topotest.router_json_cmp, tgen.gears["r1"], "show ip bgp json", expect
|
||||
)
|
||||
_, res = topotest.run_and_expect(test_func, None, count=10, wait=0.5)
|
||||
assertmsg = 'expected multipath routes in "show ip bgp" output'
|
||||
assert res is None, assertmsg
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -41,10 +41,11 @@ import sys
|
||||
import time
|
||||
import json
|
||||
import pytest
|
||||
|
||||
# Save the Current Working Directory to find configuration files.
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, '../../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
sys.path.append(os.path.join(CWD, "../../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
# Import topogen and topotest helpers
|
||||
@ -52,15 +53,17 @@ from lib.topogen import Topogen, get_topogen
|
||||
from mininet.topo import Topo
|
||||
|
||||
from lib.common_config import (
|
||||
start_topology, write_test_header,
|
||||
start_topology,
|
||||
write_test_header,
|
||||
write_test_footer,
|
||||
verify_rib, create_static_routes, check_address_types,
|
||||
interface_status, reset_config_on_routers
|
||||
verify_rib,
|
||||
create_static_routes,
|
||||
check_address_types,
|
||||
interface_status,
|
||||
reset_config_on_routers,
|
||||
)
|
||||
from lib.topolog import logger
|
||||
from lib.bgp import (
|
||||
verify_bgp_convergence, create_router_bgp,
|
||||
clear_bgp_and_verify)
|
||||
from lib.bgp import verify_bgp_convergence, create_router_bgp, clear_bgp_and_verify
|
||||
from lib.topojson import build_topo_from_json, build_config_from_json
|
||||
|
||||
# Reading the data from JSON File for topology and configuration creation
|
||||
@ -130,27 +133,32 @@ def setup_module(mod):
|
||||
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))
|
||||
assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error:" " {}".format(
|
||||
BGP_CONVERGENCE
|
||||
)
|
||||
|
||||
link_data = [val for links, val in
|
||||
topo["routers"]["r2"]["links"].iteritems()
|
||||
if "r3" in links]
|
||||
link_data = [
|
||||
val
|
||||
for links, val in topo["routers"]["r2"]["links"].iteritems()
|
||||
if "r3" in links
|
||||
]
|
||||
for adt in ADDR_TYPES:
|
||||
NEXT_HOPS[adt] = [val[adt].split("/")[0] for val in link_data]
|
||||
if adt == "ipv4":
|
||||
NEXT_HOPS[adt] = sorted(
|
||||
NEXT_HOPS[adt], key=lambda x: int(x.split(".")[2]))
|
||||
NEXT_HOPS[adt] = sorted(NEXT_HOPS[adt], key=lambda x: int(x.split(".")[2]))
|
||||
elif adt == "ipv6":
|
||||
NEXT_HOPS[adt] = sorted(
|
||||
NEXT_HOPS[adt], key=lambda x: int(x.split(':')[-3], 16))
|
||||
NEXT_HOPS[adt], key=lambda x: int(x.split(":")[-3], 16)
|
||||
)
|
||||
|
||||
INTF_LIST_R2 = [val["interface"].split("/")[0] for val in link_data]
|
||||
INTF_LIST_R2 = sorted(INTF_LIST_R2, key=lambda x: int(x.split("eth")[1]))
|
||||
|
||||
link_data = [val for links, val in
|
||||
topo["routers"]["r3"]["links"].iteritems()
|
||||
if "r2" in links]
|
||||
link_data = [
|
||||
val
|
||||
for links, val in topo["routers"]["r3"]["links"].iteritems()
|
||||
if "r2" in links
|
||||
]
|
||||
INTF_LIST_R3 = [val["interface"].split("/")[0] for val in link_data]
|
||||
INTF_LIST_R3 = sorted(INTF_LIST_R3, key=lambda x: int(x.split("eth")[1]))
|
||||
|
||||
@ -179,40 +187,27 @@ def static_or_nw(tgen, topo, tc_name, test_type, dut):
|
||||
input_dict_static = {
|
||||
dut: {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK["ipv4"],
|
||||
"next_hop": NEXT_HOP_IP["ipv4"]
|
||||
},
|
||||
{
|
||||
"network": NETWORK["ipv6"],
|
||||
"next_hop": NEXT_HOP_IP["ipv6"]
|
||||
}
|
||||
{"network": NETWORK["ipv4"], "next_hop": NEXT_HOP_IP["ipv4"]},
|
||||
{"network": NETWORK["ipv6"], "next_hop": NEXT_HOP_IP["ipv6"]},
|
||||
]
|
||||
}
|
||||
}
|
||||
logger.info("Configuring static route on router %s", dut)
|
||||
result = create_static_routes(tgen, input_dict_static)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
input_dict_2 = {
|
||||
dut: {
|
||||
"bgp": {
|
||||
"address_family": {
|
||||
"ipv4": {
|
||||
"unicast": {
|
||||
"redistribute": [{
|
||||
"redist_type": "static"
|
||||
}]
|
||||
}
|
||||
"unicast": {"redistribute": [{"redist_type": "static"}]}
|
||||
},
|
||||
"ipv6": {
|
||||
"unicast": {
|
||||
"redistribute": [{
|
||||
"redist_type": "static"
|
||||
}]
|
||||
}
|
||||
}
|
||||
"unicast": {"redistribute": [{"redist_type": "static"}]}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -221,7 +216,8 @@ def static_or_nw(tgen, topo, tc_name, test_type, dut):
|
||||
logger.info("Configuring redistribute static route on router %s", dut)
|
||||
result = create_router_bgp(tgen, topo, input_dict_2)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
elif test_type == "advertise_nw":
|
||||
input_dict_nw = {
|
||||
@ -230,28 +226,29 @@ def static_or_nw(tgen, topo, tc_name, test_type, dut):
|
||||
"address_family": {
|
||||
"ipv4": {
|
||||
"unicast": {
|
||||
"advertise_networks": [
|
||||
{"network": NETWORK["ipv4"]}
|
||||
]
|
||||
"advertise_networks": [{"network": NETWORK["ipv4"]}]
|
||||
}
|
||||
},
|
||||
"ipv6": {
|
||||
"unicast": {
|
||||
"advertise_networks": [
|
||||
{"network": NETWORK["ipv6"]}
|
||||
]
|
||||
"advertise_networks": [{"network": NETWORK["ipv6"]}]
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("Advertising networks %s %s from router %s",
|
||||
NETWORK["ipv4"], NETWORK["ipv6"], dut)
|
||||
logger.info(
|
||||
"Advertising networks %s %s from router %s",
|
||||
NETWORK["ipv4"],
|
||||
NETWORK["ipv6"],
|
||||
dut,
|
||||
)
|
||||
result = create_router_bgp(tgen, topo, input_dict_nw)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("ecmp_num", ["8", "16", "32"])
|
||||
@ -274,20 +271,8 @@ def test_modify_ecmp_max_paths(request, ecmp_num, test_type):
|
||||
"r3": {
|
||||
"bgp": {
|
||||
"address_family": {
|
||||
"ipv4": {
|
||||
"unicast": {
|
||||
"maximum_paths": {
|
||||
"ebgp": ecmp_num,
|
||||
}
|
||||
}
|
||||
},
|
||||
"ipv6": {
|
||||
"unicast": {
|
||||
"maximum_paths": {
|
||||
"ebgp": ecmp_num,
|
||||
}
|
||||
}
|
||||
}
|
||||
"ipv4": {"unicast": {"maximum_paths": {"ebgp": ecmp_num,}}},
|
||||
"ipv6": {"unicast": {"maximum_paths": {"ebgp": ecmp_num,}}},
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -295,30 +280,27 @@ def test_modify_ecmp_max_paths(request, ecmp_num, test_type):
|
||||
|
||||
logger.info("Configuring bgp maximum-paths %s on router r3", ecmp_num)
|
||||
result = create_router_bgp(tgen, topo, input_dict)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
# Verifying RIB routes
|
||||
dut = "r3"
|
||||
protocol = "bgp"
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -338,44 +320,39 @@ def test_ecmp_after_clear_bgp(request):
|
||||
|
||||
static_or_nw(tgen, topo, tc_name, "redist_static", "r2")
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
# Clear bgp
|
||||
result = clear_bgp_and_verify(tgen, topo, dut)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -395,22 +372,20 @@ def test_ecmp_remove_redistribute_static(request):
|
||||
# Verifying RIB routes
|
||||
dut = "r3"
|
||||
protocol = "bgp"
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
input_dict_2 = {
|
||||
"r2": {
|
||||
@ -418,22 +393,14 @@ def test_ecmp_remove_redistribute_static(request):
|
||||
"address_family": {
|
||||
"ipv4": {
|
||||
"unicast": {
|
||||
"redistribute": [{
|
||||
"redist_type": "static",
|
||||
"delete": True
|
||||
|
||||
}]
|
||||
"redistribute": [{"redist_type": "static", "delete": True}]
|
||||
}
|
||||
},
|
||||
"ipv6": {
|
||||
"unicast": {
|
||||
"redistribute": [{
|
||||
"redist_type": "static",
|
||||
"delete": True
|
||||
|
||||
}]
|
||||
"redistribute": [{"redist_type": "static", "delete": True}]
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -441,76 +408,60 @@ def test_ecmp_remove_redistribute_static(request):
|
||||
|
||||
logger.info("Remove redistribute static")
|
||||
result = create_router_bgp(tgen, topo, input_dict_2)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
|
||||
# Verifying RIB routes
|
||||
dut = "r3"
|
||||
protocol = "bgp"
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3 are deleted", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=[], protocol=protocol, expected=False)
|
||||
assert result is not True, "Testcase {} : Failed \n Routes still" \
|
||||
" present in RIB".format(tc_name)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=[],
|
||||
protocol=protocol,
|
||||
expected=False,
|
||||
)
|
||||
assert (
|
||||
result is not True
|
||||
), "Testcase {} : Failed \n Routes still" " present in RIB".format(tc_name)
|
||||
|
||||
logger.info("Enable redistribute static")
|
||||
input_dict_2 = {
|
||||
"r2": {
|
||||
"bgp": {
|
||||
"address_family": {
|
||||
"ipv4": {
|
||||
"unicast": {
|
||||
"redistribute": [{
|
||||
"redist_type": "static"
|
||||
}]
|
||||
}
|
||||
},
|
||||
"ipv6": {
|
||||
"unicast": {
|
||||
"redistribute": [{
|
||||
"redist_type": "static"
|
||||
}]
|
||||
}
|
||||
}
|
||||
"ipv4": {"unicast": {"redistribute": [{"redist_type": "static"}]}},
|
||||
"ipv6": {"unicast": {"redistribute": [{"redist_type": "static"}]}},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
result = create_router_bgp(tgen, topo, input_dict_2)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
# Verifying RIB routes
|
||||
dut = "r3"
|
||||
protocol = "bgp"
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -537,37 +488,30 @@ def test_ecmp_shut_bgp_neighbor(request):
|
||||
static_or_nw(tgen, topo, tc_name, "redist_static", "r2")
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
for intf_num in range(len(INTF_LIST_R2)+1, 16):
|
||||
intf_val = INTF_LIST_R2[intf_num:intf_num+16]
|
||||
for intf_num in range(len(INTF_LIST_R2) + 1, 16):
|
||||
intf_val = INTF_LIST_R2[intf_num : intf_num + 16]
|
||||
|
||||
input_dict_1 = {
|
||||
"r2": {
|
||||
"interface_list": [intf_val],
|
||||
"status": "down"
|
||||
}
|
||||
}
|
||||
logger.info("Shutting down neighbor interface {} on r2".
|
||||
format(intf_val))
|
||||
input_dict_1 = {"r2": {"interface_list": [intf_val], "status": "down"}}
|
||||
logger.info("Shutting down neighbor interface {} on r2".format(intf_val))
|
||||
result = interface_status(tgen, topo, input_dict_1)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
if intf_num + 16 < 32:
|
||||
@ -575,52 +519,37 @@ def test_ecmp_shut_bgp_neighbor(request):
|
||||
else:
|
||||
check_hops = []
|
||||
|
||||
input_dict = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict,
|
||||
next_hop=check_hops,
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen, addr_type, dut, input_dict, next_hop=check_hops, protocol=protocol
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
input_dict_1 = {
|
||||
"r2": {
|
||||
"interface_list": INTF_LIST_R2,
|
||||
"status": "up"
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r2": {"interface_list": INTF_LIST_R2, "status": "up"}}
|
||||
|
||||
logger.info("Enabling all neighbor interface {} on r2")
|
||||
result = interface_status(tgen, topo, input_dict_1)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
static_or_nw(tgen, topo, tc_name, "redist_static", "r2")
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -643,22 +572,20 @@ def test_ecmp_remove_static_route(request):
|
||||
|
||||
static_or_nw(tgen, topo, tc_name, "redist_static", "r2")
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(
|
||||
tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type], protocol=protocol)
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict_2 = {
|
||||
@ -667,7 +594,7 @@ def test_ecmp_remove_static_route(request):
|
||||
{
|
||||
"network": NETWORK[addr_type],
|
||||
"next_hop": NEXT_HOP_IP[addr_type],
|
||||
"delete": True
|
||||
"delete": True,
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -676,23 +603,29 @@ def test_ecmp_remove_static_route(request):
|
||||
logger.info("Remove static routes")
|
||||
result = create_static_routes(tgen, input_dict_2)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
logger.info("Verifying %s routes on r3 are removed", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_2,
|
||||
next_hop=[], protocol=protocol, expected=False)
|
||||
assert result is not True, "Testcase {} : Failed \n Routes still" \
|
||||
" present in RIB".format(tc_name)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_2,
|
||||
next_hop=[],
|
||||
protocol=protocol,
|
||||
expected=False,
|
||||
)
|
||||
assert (
|
||||
result is not True
|
||||
), "Testcase {} : Failed \n Routes still" " present in RIB".format(tc_name)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
# Enable static routes
|
||||
input_dict_4 = {
|
||||
"r2": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type],
|
||||
"next_hop": NEXT_HOP_IP[addr_type]
|
||||
}
|
||||
{"network": NETWORK[addr_type], "next_hop": NEXT_HOP_IP[addr_type]}
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -700,14 +633,21 @@ def test_ecmp_remove_static_route(request):
|
||||
logger.info("Enable static route")
|
||||
result = create_static_routes(tgen, input_dict_4)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_4,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_4,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
|
||||
def test_ecmp_remove_nw_advertise(request):
|
||||
@ -727,22 +667,20 @@ def test_ecmp_remove_nw_advertise(request):
|
||||
reset_config_on_routers(tgen)
|
||||
static_or_nw(tgen, topo, tc_name, "advertise_nw", "r2")
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
input_dict_3 = {
|
||||
"r2": {
|
||||
@ -750,64 +688,59 @@ def test_ecmp_remove_nw_advertise(request):
|
||||
"address_family": {
|
||||
"ipv4": {
|
||||
"unicast": {
|
||||
"advertise_networks": [{
|
||||
"network": NETWORK["ipv4"],
|
||||
"delete": True
|
||||
}]
|
||||
}
|
||||
},
|
||||
"advertise_networks": [
|
||||
{"network": NETWORK["ipv4"], "delete": True}
|
||||
]
|
||||
}
|
||||
},
|
||||
"ipv6": {
|
||||
"unicast": {
|
||||
"advertise_networks": [{
|
||||
"network": NETWORK["ipv6"],
|
||||
"delete": True
|
||||
}]
|
||||
}
|
||||
"advertise_networks": [
|
||||
{"network": NETWORK["ipv6"], "delete": True}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("Withdraw advertised networks")
|
||||
result = create_router_bgp(tgen, topo, input_dict_3)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict,
|
||||
next_hop=[], protocol=protocol, expected=False)
|
||||
assert result is not True, "Testcase {} : Failed \n Routes still" \
|
||||
" present in RIB".format(tc_name)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict,
|
||||
next_hop=[],
|
||||
protocol=protocol,
|
||||
expected=False,
|
||||
)
|
||||
assert (
|
||||
result is not True
|
||||
), "Testcase {} : Failed \n Routes still" " present in RIB".format(tc_name)
|
||||
|
||||
static_or_nw(tgen, topo, tc_name, "advertise_nw", "r2")
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
|
@ -41,10 +41,11 @@ import sys
|
||||
import time
|
||||
import json
|
||||
import pytest
|
||||
|
||||
# Save the Current Working Directory to find configuration files.
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, '../../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
sys.path.append(os.path.join(CWD, "../../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
# Import topogen and topotest helpers
|
||||
@ -52,15 +53,17 @@ from lib.topogen import Topogen, get_topogen
|
||||
from mininet.topo import Topo
|
||||
|
||||
from lib.common_config import (
|
||||
start_topology, write_test_header,
|
||||
start_topology,
|
||||
write_test_header,
|
||||
write_test_footer,
|
||||
verify_rib, create_static_routes, check_address_types,
|
||||
interface_status, reset_config_on_routers
|
||||
verify_rib,
|
||||
create_static_routes,
|
||||
check_address_types,
|
||||
interface_status,
|
||||
reset_config_on_routers,
|
||||
)
|
||||
from lib.topolog import logger
|
||||
from lib.bgp import (
|
||||
verify_bgp_convergence, create_router_bgp,
|
||||
clear_bgp_and_verify)
|
||||
from lib.bgp import verify_bgp_convergence, create_router_bgp, clear_bgp_and_verify
|
||||
from lib.topojson import build_topo_from_json, build_config_from_json
|
||||
|
||||
# Reading the data from JSON File for topology and configuration creation
|
||||
@ -131,27 +134,32 @@ def setup_module(mod):
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo)
|
||||
assert BGP_CONVERGENCE is True, ("setup_module :Failed \n Error:"
|
||||
" {}".format(BGP_CONVERGENCE))
|
||||
assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error:" " {}".format(
|
||||
BGP_CONVERGENCE
|
||||
)
|
||||
|
||||
link_data = [val for links, val in
|
||||
topo["routers"]["r2"]["links"].iteritems()
|
||||
if "r3" in links]
|
||||
link_data = [
|
||||
val
|
||||
for links, val in topo["routers"]["r2"]["links"].iteritems()
|
||||
if "r3" in links
|
||||
]
|
||||
for adt in ADDR_TYPES:
|
||||
NEXT_HOPS[adt] = [val[adt].split("/")[0] for val in link_data]
|
||||
if adt == "ipv4":
|
||||
NEXT_HOPS[adt] = sorted(
|
||||
NEXT_HOPS[adt], key=lambda x: int(x.split(".")[2]))
|
||||
NEXT_HOPS[adt] = sorted(NEXT_HOPS[adt], key=lambda x: int(x.split(".")[2]))
|
||||
elif adt == "ipv6":
|
||||
NEXT_HOPS[adt] = sorted(
|
||||
NEXT_HOPS[adt], key=lambda x: int(x.split(':')[-3], 16))
|
||||
NEXT_HOPS[adt], key=lambda x: int(x.split(":")[-3], 16)
|
||||
)
|
||||
|
||||
INTF_LIST_R2 = [val["interface"].split("/")[0] for val in link_data]
|
||||
INTF_LIST_R2 = sorted(INTF_LIST_R2, key=lambda x: int(x.split("eth")[1]))
|
||||
|
||||
link_data = [val for links, val in
|
||||
topo["routers"]["r3"]["links"].iteritems()
|
||||
if "r2" in links]
|
||||
link_data = [
|
||||
val
|
||||
for links, val in topo["routers"]["r3"]["links"].iteritems()
|
||||
if "r2" in links
|
||||
]
|
||||
INTF_LIST_R3 = [val["interface"].split("/")[0] for val in link_data]
|
||||
INTF_LIST_R3 = sorted(INTF_LIST_R3, key=lambda x: int(x.split("eth")[1]))
|
||||
|
||||
@ -180,40 +188,27 @@ def static_or_nw(tgen, topo, tc_name, test_type, dut):
|
||||
input_dict_static = {
|
||||
dut: {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK["ipv4"],
|
||||
"next_hop": NEXT_HOP_IP["ipv4"]
|
||||
},
|
||||
{
|
||||
"network": NETWORK["ipv6"],
|
||||
"next_hop": NEXT_HOP_IP["ipv6"]
|
||||
}
|
||||
{"network": NETWORK["ipv4"], "next_hop": NEXT_HOP_IP["ipv4"]},
|
||||
{"network": NETWORK["ipv6"], "next_hop": NEXT_HOP_IP["ipv6"]},
|
||||
]
|
||||
}
|
||||
}
|
||||
logger.info("Configuring static route on router %s", dut)
|
||||
result = create_static_routes(tgen, input_dict_static)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
input_dict_2 = {
|
||||
dut: {
|
||||
"bgp": {
|
||||
"address_family": {
|
||||
"ipv4": {
|
||||
"unicast": {
|
||||
"redistribute": [{
|
||||
"redist_type": "static"
|
||||
}]
|
||||
}
|
||||
"unicast": {"redistribute": [{"redist_type": "static"}]}
|
||||
},
|
||||
"ipv6": {
|
||||
"unicast": {
|
||||
"redistribute": [{
|
||||
"redist_type": "static"
|
||||
}]
|
||||
}
|
||||
}
|
||||
"unicast": {"redistribute": [{"redist_type": "static"}]}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -222,7 +217,8 @@ def static_or_nw(tgen, topo, tc_name, test_type, dut):
|
||||
logger.info("Configuring redistribute static route on router %s", dut)
|
||||
result = create_router_bgp(tgen, topo, input_dict_2)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
elif test_type == "advertise_nw":
|
||||
input_dict_nw = {
|
||||
@ -231,28 +227,29 @@ def static_or_nw(tgen, topo, tc_name, test_type, dut):
|
||||
"address_family": {
|
||||
"ipv4": {
|
||||
"unicast": {
|
||||
"advertise_networks": [
|
||||
{"network": NETWORK["ipv4"]}
|
||||
]
|
||||
"advertise_networks": [{"network": NETWORK["ipv4"]}]
|
||||
}
|
||||
},
|
||||
"ipv6": {
|
||||
"unicast": {
|
||||
"advertise_networks": [
|
||||
{"network": NETWORK["ipv6"]}
|
||||
]
|
||||
"advertise_networks": [{"network": NETWORK["ipv6"]}]
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("Advertising networks %s %s from router %s",
|
||||
NETWORK["ipv4"], NETWORK["ipv6"], dut)
|
||||
logger.info(
|
||||
"Advertising networks %s %s from router %s",
|
||||
NETWORK["ipv4"],
|
||||
NETWORK["ipv6"],
|
||||
dut,
|
||||
)
|
||||
result = create_router_bgp(tgen, topo, input_dict_nw)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("ecmp_num", ["8", "16", "32"])
|
||||
@ -275,20 +272,8 @@ def test_modify_ecmp_max_paths(request, ecmp_num, test_type):
|
||||
"r3": {
|
||||
"bgp": {
|
||||
"address_family": {
|
||||
"ipv4": {
|
||||
"unicast": {
|
||||
"maximum_paths": {
|
||||
"ibgp": ecmp_num,
|
||||
}
|
||||
}
|
||||
},
|
||||
"ipv6": {
|
||||
"unicast": {
|
||||
"maximum_paths": {
|
||||
"ibgp": ecmp_num,
|
||||
}
|
||||
}
|
||||
}
|
||||
"ipv4": {"unicast": {"maximum_paths": {"ibgp": ecmp_num,}}},
|
||||
"ipv6": {"unicast": {"maximum_paths": {"ibgp": ecmp_num,}}},
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -296,30 +281,27 @@ def test_modify_ecmp_max_paths(request, ecmp_num, test_type):
|
||||
|
||||
logger.info("Configuring bgp maximum-paths %s on router r3", ecmp_num)
|
||||
result = create_router_bgp(tgen, topo, input_dict)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
# Verifying RIB routes
|
||||
dut = "r3"
|
||||
protocol = "bgp"
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -339,44 +321,39 @@ def test_ecmp_after_clear_bgp(request):
|
||||
|
||||
static_or_nw(tgen, topo, tc_name, "redist_static", "r2")
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
# Clear bgp
|
||||
result = clear_bgp_and_verify(tgen, topo, dut)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -396,22 +373,20 @@ def test_ecmp_remove_redistribute_static(request):
|
||||
# Verifying RIB routes
|
||||
dut = "r3"
|
||||
protocol = "bgp"
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
input_dict_2 = {
|
||||
"r2": {
|
||||
@ -419,22 +394,14 @@ def test_ecmp_remove_redistribute_static(request):
|
||||
"address_family": {
|
||||
"ipv4": {
|
||||
"unicast": {
|
||||
"redistribute": [{
|
||||
"redist_type": "static",
|
||||
"delete": True
|
||||
|
||||
}]
|
||||
"redistribute": [{"redist_type": "static", "delete": True}]
|
||||
}
|
||||
},
|
||||
"ipv6": {
|
||||
"unicast": {
|
||||
"redistribute": [{
|
||||
"redist_type": "static",
|
||||
"delete": True
|
||||
|
||||
}]
|
||||
"redistribute": [{"redist_type": "static", "delete": True}]
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -442,76 +409,60 @@ def test_ecmp_remove_redistribute_static(request):
|
||||
|
||||
logger.info("Remove redistribute static")
|
||||
result = create_router_bgp(tgen, topo, input_dict_2)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
|
||||
# Verifying RIB routes
|
||||
dut = "r3"
|
||||
protocol = "bgp"
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3 are deleted", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=[], protocol=protocol, expected=False)
|
||||
assert result is not True, "Testcase {} : Failed \n Routes still" \
|
||||
" present in RIB".format(tc_name)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=[],
|
||||
protocol=protocol,
|
||||
expected=False,
|
||||
)
|
||||
assert (
|
||||
result is not True
|
||||
), "Testcase {} : Failed \n Routes still" " present in RIB".format(tc_name)
|
||||
|
||||
logger.info("Enable redistribute static")
|
||||
input_dict_2 = {
|
||||
"r2": {
|
||||
"bgp": {
|
||||
"address_family": {
|
||||
"ipv4": {
|
||||
"unicast": {
|
||||
"redistribute": [{
|
||||
"redist_type": "static"
|
||||
}]
|
||||
}
|
||||
},
|
||||
"ipv6": {
|
||||
"unicast": {
|
||||
"redistribute": [{
|
||||
"redist_type": "static"
|
||||
}]
|
||||
}
|
||||
}
|
||||
"ipv4": {"unicast": {"redistribute": [{"redist_type": "static"}]}},
|
||||
"ipv6": {"unicast": {"redistribute": [{"redist_type": "static"}]}},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
result = create_router_bgp(tgen, topo, input_dict_2)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
# Verifying RIB routes
|
||||
dut = "r3"
|
||||
protocol = "bgp"
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -533,37 +484,30 @@ def test_ecmp_shut_bgp_neighbor(request):
|
||||
static_or_nw(tgen, topo, tc_name, "redist_static", "r2")
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
for intf_num in range(len(INTF_LIST_R2)+1, 16):
|
||||
intf_val = INTF_LIST_R2[intf_num:intf_num+16]
|
||||
for intf_num in range(len(INTF_LIST_R2) + 1, 16):
|
||||
intf_val = INTF_LIST_R2[intf_num : intf_num + 16]
|
||||
|
||||
input_dict_1 = {
|
||||
"r2": {
|
||||
"interface_list": [intf_val],
|
||||
"status": "down"
|
||||
}
|
||||
}
|
||||
logger.info("Shutting down neighbor interface {} on r2".
|
||||
format(intf_val))
|
||||
input_dict_1 = {"r2": {"interface_list": [intf_val], "status": "down"}}
|
||||
logger.info("Shutting down neighbor interface {} on r2".format(intf_val))
|
||||
result = interface_status(tgen, topo, input_dict_1)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
if intf_num + 16 < 32:
|
||||
@ -571,52 +515,37 @@ def test_ecmp_shut_bgp_neighbor(request):
|
||||
else:
|
||||
check_hops = []
|
||||
|
||||
input_dict = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict,
|
||||
next_hop=check_hops,
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen, addr_type, dut, input_dict, next_hop=check_hops, protocol=protocol
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
input_dict_1 = {
|
||||
"r2": {
|
||||
"interface_list": INTF_LIST_R2,
|
||||
"status": "up"
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r2": {"interface_list": INTF_LIST_R2, "status": "up"}}
|
||||
|
||||
logger.info("Enabling all neighbor interface {} on r2")
|
||||
result = interface_status(tgen, topo, input_dict_1)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
static_or_nw(tgen, topo, tc_name, "redist_static", "r2")
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -639,22 +568,20 @@ def test_ecmp_remove_static_route(request):
|
||||
|
||||
static_or_nw(tgen, topo, tc_name, "redist_static", "r2")
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict_1 = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict_1 = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(
|
||||
tgen, addr_type, dut, input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type], protocol=protocol)
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_1,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict_2 = {
|
||||
@ -663,7 +590,7 @@ def test_ecmp_remove_static_route(request):
|
||||
{
|
||||
"network": NETWORK[addr_type],
|
||||
"next_hop": NEXT_HOP_IP[addr_type],
|
||||
"delete": True
|
||||
"delete": True,
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -672,23 +599,29 @@ def test_ecmp_remove_static_route(request):
|
||||
logger.info("Remove static routes")
|
||||
result = create_static_routes(tgen, input_dict_2)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
logger.info("Verifying %s routes on r3 are removed", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_2,
|
||||
next_hop=[], protocol=protocol, expected=False)
|
||||
assert result is not True, "Testcase {} : Failed \n Routes still" \
|
||||
" present in RIB".format(tc_name)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_2,
|
||||
next_hop=[],
|
||||
protocol=protocol,
|
||||
expected=False,
|
||||
)
|
||||
assert (
|
||||
result is not True
|
||||
), "Testcase {} : Failed \n Routes still" " present in RIB".format(tc_name)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
# Enable static routes
|
||||
input_dict_4 = {
|
||||
"r2": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type],
|
||||
"next_hop": NEXT_HOP_IP[addr_type]
|
||||
}
|
||||
{"network": NETWORK[addr_type], "next_hop": NEXT_HOP_IP[addr_type]}
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -696,14 +629,21 @@ def test_ecmp_remove_static_route(request):
|
||||
logger.info("Enable static route")
|
||||
result = create_static_routes(tgen, input_dict_4)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict_4,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict_4,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
write_test_footer(tc_name)
|
||||
|
||||
@ -725,22 +665,20 @@ def test_ecmp_remove_nw_advertise(request):
|
||||
reset_config_on_routers(tgen)
|
||||
static_or_nw(tgen, topo, tc_name, "advertise_nw", "r2")
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
input_dict_3 = {
|
||||
"r2": {
|
||||
@ -748,64 +686,59 @@ def test_ecmp_remove_nw_advertise(request):
|
||||
"address_family": {
|
||||
"ipv4": {
|
||||
"unicast": {
|
||||
"advertise_networks": [{
|
||||
"network": NETWORK["ipv4"],
|
||||
"delete": True
|
||||
}]
|
||||
}
|
||||
},
|
||||
"advertise_networks": [
|
||||
{"network": NETWORK["ipv4"], "delete": True}
|
||||
]
|
||||
}
|
||||
},
|
||||
"ipv6": {
|
||||
"unicast": {
|
||||
"advertise_networks": [{
|
||||
"network": NETWORK["ipv6"],
|
||||
"delete": True
|
||||
}]
|
||||
}
|
||||
"advertise_networks": [
|
||||
{"network": NETWORK["ipv6"], "delete": True}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("Withdraw advertised networks")
|
||||
result = create_router_bgp(tgen, topo, input_dict_3)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
|
||||
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict,
|
||||
next_hop=[], protocol=protocol, expected=False)
|
||||
assert result is not True, "Testcase {} : Failed \n Routes still" \
|
||||
" present in RIB".format(tc_name)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict,
|
||||
next_hop=[],
|
||||
protocol=protocol,
|
||||
expected=False,
|
||||
)
|
||||
assert (
|
||||
result is not True
|
||||
), "Testcase {} : Failed \n Routes still" " present in RIB".format(tc_name)
|
||||
|
||||
static_or_nw(tgen, topo, tc_name, "advertise_nw", "r2")
|
||||
for addr_type in ADDR_TYPES:
|
||||
input_dict = {
|
||||
"r3": {
|
||||
"static_routes": [
|
||||
{
|
||||
"network": NETWORK[addr_type]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
input_dict = {"r3": {"static_routes": [{"network": NETWORK[addr_type]}]}}
|
||||
logger.info("Verifying %s routes on r3", addr_type)
|
||||
result = verify_rib(tgen, addr_type, dut, input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol)
|
||||
result = verify_rib(
|
||||
tgen,
|
||||
addr_type,
|
||||
dut,
|
||||
input_dict,
|
||||
next_hop=NEXT_HOPS[addr_type],
|
||||
protocol=protocol,
|
||||
)
|
||||
assert result is True, "Testcase {} : Failed \n Error: {}".format(
|
||||
tc_name, result)
|
||||
tc_name, result
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -31,7 +31,7 @@ import sys
|
||||
import pytest
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
from lib import topotest
|
||||
@ -47,7 +47,8 @@ class BGPVRFTopo(Topo):
|
||||
tgen = get_topogen(self)
|
||||
|
||||
for routern in range(1, 2):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
|
||||
def setup_module(mod):
|
||||
"Sets up the pytest environment"
|
||||
@ -58,17 +59,16 @@ def setup_module(mod):
|
||||
for rname, router in tgen.routers().iteritems():
|
||||
router.run("/bin/bash {}/setup_vrfs".format(CWD))
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname))
|
||||
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))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
# After loading the configurations, this function loads configured daemons.
|
||||
tgen.start_router()
|
||||
#tgen.mininet_cli()
|
||||
# tgen.mininet_cli()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
"Teardown the pytest environment"
|
||||
@ -77,6 +77,7 @@ def teardown_module(mod):
|
||||
# This function tears down the whole topology.
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_vrf_route_leak():
|
||||
logger.info("Ensure that routes are leaked back and forth")
|
||||
tgen = get_topogen()
|
||||
@ -84,49 +85,50 @@ def test_vrf_route_leak():
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
r1 = tgen.gears['r1']
|
||||
r1 = tgen.gears["r1"]
|
||||
|
||||
donna = r1.vtysh_cmd("show ip route vrf DONNA json", isjson=True)
|
||||
route0 = donna["10.0.0.0/24"][0]
|
||||
assert route0['protocol'] == "connected"
|
||||
assert route0["protocol"] == "connected"
|
||||
route1 = donna["10.0.1.0/24"][0]
|
||||
assert route1['protocol'] == "bgp"
|
||||
assert route1['selected'] == True
|
||||
nhop = route1['nexthops'][0]
|
||||
assert nhop['fib'] == True
|
||||
assert route1["protocol"] == "bgp"
|
||||
assert route1["selected"] == True
|
||||
nhop = route1["nexthops"][0]
|
||||
assert nhop["fib"] == True
|
||||
route2 = donna["10.0.2.0/24"][0]
|
||||
assert route2['protocol'] == "connected"
|
||||
assert route2["protocol"] == "connected"
|
||||
route3 = donna["10.0.3.0/24"][0]
|
||||
assert route3['protocol'] == "bgp"
|
||||
assert route3['selected'] == True
|
||||
nhop = route3['nexthops'][0]
|
||||
assert nhop['fib'] == True
|
||||
assert route3["protocol"] == "bgp"
|
||||
assert route3["selected"] == True
|
||||
nhop = route3["nexthops"][0]
|
||||
assert nhop["fib"] == True
|
||||
eva = r1.vtysh_cmd("show ip route vrf EVA json", isjson=True)
|
||||
route0 = eva["10.0.0.0/24"][0]
|
||||
assert route0['protocol'] == "bgp"
|
||||
assert route0['selected'] == True
|
||||
nhop = route0['nexthops'][0]
|
||||
assert nhop['fib'] == True
|
||||
assert route0["protocol"] == "bgp"
|
||||
assert route0["selected"] == True
|
||||
nhop = route0["nexthops"][0]
|
||||
assert nhop["fib"] == True
|
||||
route1 = eva["10.0.1.0/24"][0]
|
||||
assert route1['protocol'] == "connected"
|
||||
assert route1["protocol"] == "connected"
|
||||
route2 = eva["10.0.2.0/24"][0]
|
||||
assert route2['protocol'] == "bgp"
|
||||
assert route2['selected'] == True
|
||||
nhop = route2['nexthops'][0]
|
||||
assert nhop['fib'] == True
|
||||
assert route2["protocol"] == "bgp"
|
||||
assert route2["selected"] == True
|
||||
nhop = route2["nexthops"][0]
|
||||
assert nhop["fib"] == True
|
||||
route3 = eva["10.0.3.0/24"][0]
|
||||
assert route3['protocol'] == "connected"
|
||||
#tgen.mininet_cli()
|
||||
assert route3["protocol"] == "connected"
|
||||
# tgen.mininet_cli()
|
||||
|
||||
|
||||
def test_memory_leak():
|
||||
"Run the memory leak test and report results."
|
||||
tgen = get_topogen()
|
||||
if not tgen.is_memleak_enabled():
|
||||
pytest.skip('Memory leak test/report is disabled')
|
||||
pytest.skip("Memory leak test/report is disabled")
|
||||
|
||||
tgen.report_memory_leaks()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -39,7 +39,7 @@ import pytest
|
||||
import functools
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
from lib import topotest
|
||||
@ -47,16 +47,18 @@ from lib.topogen import Topogen, TopoRouter, get_topogen
|
||||
from lib.topolog import logger
|
||||
from mininet.topo import Topo
|
||||
|
||||
|
||||
class TemplateTopo(Topo):
|
||||
def build(self, *_args, **_opts):
|
||||
tgen = get_topogen(self)
|
||||
|
||||
for routern in range(1, 3):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
|
||||
def setup_module(mod):
|
||||
tgen = Topogen(TemplateTopo, mod.__name__)
|
||||
@ -66,51 +68,41 @@ def setup_module(mod):
|
||||
|
||||
for i, (rname, router) in enumerate(router_list.iteritems(), 1):
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname))
|
||||
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))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
tgen = get_topogen()
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_bgp_aggregate_address_origin():
|
||||
tgen = get_topogen()
|
||||
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
router = tgen.gears['r2']
|
||||
router = tgen.gears["r2"]
|
||||
|
||||
def _bgp_converge(router):
|
||||
output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
|
||||
expected = {
|
||||
'192.168.255.1': {
|
||||
'bgpState': 'Established',
|
||||
'addressFamilyInfo': {
|
||||
'ipv4Unicast': {
|
||||
'acceptedPrefixCounter': 3
|
||||
}
|
||||
}
|
||||
"192.168.255.1": {
|
||||
"bgpState": "Established",
|
||||
"addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 3}},
|
||||
}
|
||||
}
|
||||
return topotest.json_cmp(output, expected)
|
||||
|
||||
def _bgp_aggregate_address_has_metric(router):
|
||||
output = json.loads(router.vtysh_cmd("show ip bgp 172.16.255.0/24 json"))
|
||||
expected = {
|
||||
'paths': [
|
||||
{
|
||||
'origin': 'IGP'
|
||||
}
|
||||
]
|
||||
}
|
||||
expected = {"paths": [{"origin": "IGP"}]}
|
||||
return topotest.json_cmp(output, expected)
|
||||
|
||||
test_func = functools.partial(_bgp_converge, router)
|
||||
@ -121,8 +113,11 @@ def test_bgp_aggregate_address_origin():
|
||||
test_func = functools.partial(_bgp_aggregate_address_has_metric, router)
|
||||
success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5)
|
||||
|
||||
assert result is None, 'Failed to see applied ORIGIN (igp) for aggregated prefix in "{}"'.format(router)
|
||||
assert (
|
||||
result is None
|
||||
), 'Failed to see applied ORIGIN (igp) for aggregated prefix in "{}"'.format(router)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -42,7 +42,7 @@ import pytest
|
||||
import functools
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
from lib import topotest
|
||||
@ -50,16 +50,18 @@ from lib.topogen import Topogen, TopoRouter, get_topogen
|
||||
from lib.topolog import logger
|
||||
from mininet.topo import Topo
|
||||
|
||||
|
||||
class TemplateTopo(Topo):
|
||||
def build(self, *_args, **_opts):
|
||||
tgen = get_topogen(self)
|
||||
|
||||
for routern in range(1, 3):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
|
||||
def setup_module(mod):
|
||||
tgen = Topogen(TemplateTopo, mod.__name__)
|
||||
@ -69,51 +71,41 @@ def setup_module(mod):
|
||||
|
||||
for i, (rname, router) in enumerate(router_list.iteritems(), 1):
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname))
|
||||
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))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
tgen = get_topogen()
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_bgp_maximum_prefix_invalid():
|
||||
tgen = get_topogen()
|
||||
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
router = tgen.gears['r2']
|
||||
router = tgen.gears["r2"]
|
||||
|
||||
def _bgp_converge(router):
|
||||
output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
|
||||
expected = {
|
||||
'192.168.255.1': {
|
||||
'bgpState': 'Established',
|
||||
'addressFamilyInfo': {
|
||||
'ipv4Unicast': {
|
||||
'acceptedPrefixCounter': 3
|
||||
}
|
||||
}
|
||||
"192.168.255.1": {
|
||||
"bgpState": "Established",
|
||||
"addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 3}},
|
||||
}
|
||||
}
|
||||
return topotest.json_cmp(output, expected)
|
||||
|
||||
def _bgp_aggregate_address_has_metric(router):
|
||||
output = json.loads(router.vtysh_cmd("show ip bgp 172.16.255.0/24 json"))
|
||||
expected = {
|
||||
'paths': [
|
||||
{
|
||||
'metric': 123
|
||||
}
|
||||
]
|
||||
}
|
||||
expected = {"paths": [{"metric": 123}]}
|
||||
return topotest.json_cmp(output, expected)
|
||||
|
||||
test_func = functools.partial(_bgp_converge, router)
|
||||
@ -124,8 +116,11 @@ def test_bgp_maximum_prefix_invalid():
|
||||
test_func = functools.partial(_bgp_aggregate_address_has_metric, router)
|
||||
success, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5)
|
||||
|
||||
assert result is None, 'Failed to see applied metric for aggregated prefix in "{}"'.format(router)
|
||||
assert (
|
||||
result is None
|
||||
), 'Failed to see applied metric for aggregated prefix in "{}"'.format(router)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -37,7 +37,7 @@ import pytest
|
||||
import functools
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
from lib import topotest
|
||||
@ -45,17 +45,19 @@ from lib.topogen import Topogen, TopoRouter, get_topogen
|
||||
from lib.topolog import logger
|
||||
from mininet.topo import Topo
|
||||
|
||||
|
||||
class TemplateTopo(Topo):
|
||||
def build(self, *_args, **_opts):
|
||||
tgen = get_topogen(self)
|
||||
|
||||
for routern in range(1, 4):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
switch.add_link(tgen.gears["r3"])
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch.add_link(tgen.gears['r3'])
|
||||
|
||||
def setup_module(mod):
|
||||
tgen = Topogen(TemplateTopo, mod.__name__)
|
||||
@ -65,20 +67,20 @@ def setup_module(mod):
|
||||
|
||||
for i, (rname, router) in enumerate(router_list.iteritems(), 1):
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname))
|
||||
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))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
tgen = get_topogen()
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_bgp_as_wide_bgp_identifier():
|
||||
tgen = get_topogen()
|
||||
|
||||
@ -87,32 +89,31 @@ def test_bgp_as_wide_bgp_identifier():
|
||||
|
||||
def _bgp_converge(router):
|
||||
output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
|
||||
expected = {
|
||||
'192.168.255.1': {
|
||||
'bgpState': 'Established'
|
||||
}
|
||||
}
|
||||
expected = {"192.168.255.1": {"bgpState": "Established"}}
|
||||
return topotest.json_cmp(output, expected)
|
||||
|
||||
def _bgp_failed(router):
|
||||
output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
|
||||
expected = {
|
||||
'192.168.255.1': {
|
||||
'lastNotificationReason': 'OPEN Message Error/Bad BGP Identifier'
|
||||
"192.168.255.1": {
|
||||
"lastNotificationReason": "OPEN Message Error/Bad BGP Identifier"
|
||||
}
|
||||
}
|
||||
return topotest.json_cmp(output, expected)
|
||||
|
||||
test_func = functools.partial(_bgp_converge, tgen.gears['r1'])
|
||||
test_func = functools.partial(_bgp_converge, tgen.gears["r1"])
|
||||
success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
|
||||
|
||||
assert result is None, 'Failed to converge: "{}"'.format(tgen.gears['r1'])
|
||||
assert result is None, 'Failed to converge: "{}"'.format(tgen.gears["r1"])
|
||||
|
||||
test_func = functools.partial(_bgp_failed, tgen.gears['r3'])
|
||||
test_func = functools.partial(_bgp_failed, tgen.gears["r3"])
|
||||
success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
|
||||
|
||||
assert result is None, 'Bad BGP Identifier notification not sent: "{}"'.format(tgen.gears['r3'])
|
||||
assert result is None, 'Bad BGP Identifier notification not sent: "{}"'.format(
|
||||
tgen.gears["r3"]
|
||||
)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -37,7 +37,7 @@ import time
|
||||
import pytest
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
from lib import topotest
|
||||
@ -45,16 +45,18 @@ from lib.topogen import Topogen, TopoRouter, get_topogen
|
||||
from lib.topolog import logger
|
||||
from mininet.topo import Topo
|
||||
|
||||
|
||||
class TemplateTopo(Topo):
|
||||
def build(self, *_args, **_opts):
|
||||
tgen = get_topogen(self)
|
||||
|
||||
for routern in range(1, 3):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
|
||||
def setup_module(mod):
|
||||
tgen = Topogen(TemplateTopo, mod.__name__)
|
||||
@ -64,20 +66,20 @@ def setup_module(mod):
|
||||
|
||||
for i, (rname, router) in enumerate(router_list.iteritems(), 1):
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname))
|
||||
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))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
tgen = get_topogen()
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_bgp_maximum_prefix_invalid():
|
||||
tgen = get_topogen()
|
||||
|
||||
@ -86,20 +88,30 @@ def test_bgp_maximum_prefix_invalid():
|
||||
|
||||
def _bgp_converge(router):
|
||||
while True:
|
||||
output = json.loads(tgen.gears[router].vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
|
||||
if output['192.168.255.1']['bgpState'] == 'Established':
|
||||
if output['192.168.255.1']['addressFamilyInfo']['ipv4Unicast']['acceptedPrefixCounter'] == 2:
|
||||
output = json.loads(
|
||||
tgen.gears[router].vtysh_cmd("show ip bgp neighbor 192.168.255.1 json")
|
||||
)
|
||||
if output["192.168.255.1"]["bgpState"] == "Established":
|
||||
if (
|
||||
output["192.168.255.1"]["addressFamilyInfo"]["ipv4Unicast"][
|
||||
"acceptedPrefixCounter"
|
||||
]
|
||||
== 2
|
||||
):
|
||||
return True
|
||||
|
||||
def _bgp_comm_list_delete(router):
|
||||
output = json.loads(tgen.gears[router].vtysh_cmd("show ip bgp 172.16.255.254/32 json"))
|
||||
if '333:333' in output['paths'][0]['community']['list']:
|
||||
output = json.loads(
|
||||
tgen.gears[router].vtysh_cmd("show ip bgp 172.16.255.254/32 json")
|
||||
)
|
||||
if "333:333" in output["paths"][0]["community"]["list"]:
|
||||
return False
|
||||
return True
|
||||
|
||||
if _bgp_converge('r2'):
|
||||
assert _bgp_comm_list_delete('r2') == True
|
||||
if _bgp_converge("r2"):
|
||||
assert _bgp_comm_list_delete("r2") == True
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -42,7 +42,7 @@ import pytest
|
||||
import functools
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
from lib import topotest
|
||||
@ -50,16 +50,18 @@ from lib.topogen import Topogen, TopoRouter, get_topogen
|
||||
from lib.topolog import logger
|
||||
from mininet.topo import Topo
|
||||
|
||||
|
||||
class TemplateTopo(Topo):
|
||||
def build(self, *_args, **_opts):
|
||||
tgen = get_topogen(self)
|
||||
|
||||
for routern in range(1, 3):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
|
||||
def setup_module(mod):
|
||||
tgen = Topogen(TemplateTopo, mod.__name__)
|
||||
@ -69,51 +71,41 @@ def setup_module(mod):
|
||||
|
||||
for i, (rname, router) in enumerate(router_list.iteritems(), 1):
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname))
|
||||
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))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
tgen = get_topogen()
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_bgp_default_originate_route_map():
|
||||
tgen = get_topogen()
|
||||
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
router = tgen.gears['r2']
|
||||
router = tgen.gears["r2"]
|
||||
|
||||
def _bgp_converge(router):
|
||||
output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
|
||||
expected = {
|
||||
'192.168.255.1': {
|
||||
'bgpState': 'Established',
|
||||
'addressFamilyInfo': {
|
||||
'ipv4Unicast': {
|
||||
'acceptedPrefixCounter': 1
|
||||
}
|
||||
}
|
||||
"192.168.255.1": {
|
||||
"bgpState": "Established",
|
||||
"addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 1}},
|
||||
}
|
||||
}
|
||||
return topotest.json_cmp(output, expected)
|
||||
|
||||
def _bgp_default_route_has_metric(router):
|
||||
output = json.loads(router.vtysh_cmd("show ip bgp 0.0.0.0/0 json"))
|
||||
expected = {
|
||||
'paths': [
|
||||
{
|
||||
'metric': 123
|
||||
}
|
||||
]
|
||||
}
|
||||
expected = {"paths": [{"metric": 123}]}
|
||||
return topotest.json_cmp(output, expected)
|
||||
|
||||
test_func = functools.partial(_bgp_converge, router)
|
||||
@ -124,8 +116,11 @@ def test_bgp_default_originate_route_map():
|
||||
test_func = functools.partial(_bgp_default_route_has_metric, router)
|
||||
success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
|
||||
|
||||
assert result is None, 'Failed to see applied metric for default route in "{}"'.format(router)
|
||||
assert (
|
||||
result is None
|
||||
), 'Failed to see applied metric for default route in "{}"'.format(router)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -41,7 +41,7 @@ import pytest
|
||||
import functools
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
from lib import topotest
|
||||
@ -49,16 +49,18 @@ from lib.topogen import Topogen, TopoRouter, get_topogen
|
||||
from lib.topolog import logger
|
||||
from mininet.topo import Topo
|
||||
|
||||
|
||||
class TemplateTopo(Topo):
|
||||
def build(self, *_args, **_opts):
|
||||
tgen = get_topogen(self)
|
||||
|
||||
for routern in range(1, 3):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
|
||||
def setup_module(mod):
|
||||
tgen = Topogen(TemplateTopo, mod.__name__)
|
||||
@ -68,60 +70,51 @@ def setup_module(mod):
|
||||
|
||||
for i, (rname, router) in enumerate(router_list.iteritems(), 1):
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname))
|
||||
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))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
tgen = get_topogen()
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_bgp_maximum_prefix_invalid():
|
||||
tgen = get_topogen()
|
||||
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
router = tgen.gears['r1']
|
||||
router = tgen.gears["r1"]
|
||||
|
||||
def _bgp_converge(router):
|
||||
output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.2 json"))
|
||||
expected = {
|
||||
'192.168.255.2': {
|
||||
'bgpState': 'Established',
|
||||
'addressFamilyInfo': {
|
||||
'ipv4Unicast': {
|
||||
'acceptedPrefixCounter': 2
|
||||
}
|
||||
}
|
||||
"192.168.255.2": {
|
||||
"bgpState": "Established",
|
||||
"addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 2}},
|
||||
}
|
||||
}
|
||||
return topotest.json_cmp(output, expected)
|
||||
|
||||
def _bgp_distance_change(router):
|
||||
router.vtysh_cmd("""
|
||||
router.vtysh_cmd(
|
||||
"""
|
||||
configure terminal
|
||||
router bgp 65000
|
||||
address-family ipv4 unicast
|
||||
distance bgp 123 123 123
|
||||
""")
|
||||
"""
|
||||
)
|
||||
|
||||
def _bgp_check_distance_change(router):
|
||||
output = json.loads(router.vtysh_cmd("show ip route 172.16.255.254/32 json"))
|
||||
expected = {
|
||||
'172.16.255.254/32': [
|
||||
{
|
||||
'protocol': 'bgp',
|
||||
'distance': 123
|
||||
}
|
||||
]
|
||||
}
|
||||
expected = {"172.16.255.254/32": [{"protocol": "bgp", "distance": 123}]}
|
||||
return topotest.json_cmp(output, expected)
|
||||
|
||||
test_func = functools.partial(_bgp_converge, router)
|
||||
@ -134,8 +127,11 @@ def test_bgp_maximum_prefix_invalid():
|
||||
test_func = functools.partial(_bgp_check_distance_change, router)
|
||||
success, result = topotest.run_and_expect(test_func, None, count=15, wait=0.5)
|
||||
|
||||
assert result is None, 'Failed to see applied BGP distance in RIB "{}"'.format(router)
|
||||
assert result is None, 'Failed to see applied BGP distance in RIB "{}"'.format(
|
||||
router
|
||||
)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -37,7 +37,7 @@ import pytest
|
||||
import functools
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
from lib import topotest
|
||||
@ -45,24 +45,26 @@ from lib.topogen import Topogen, TopoRouter, get_topogen
|
||||
from lib.topolog import logger
|
||||
from mininet.topo import Topo
|
||||
|
||||
|
||||
class TemplateTopo(Topo):
|
||||
def build(self, *_args, **_opts):
|
||||
tgen = get_topogen(self)
|
||||
|
||||
for routern in range(1, 7):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch('s2')
|
||||
switch.add_link(tgen.gears['r3'])
|
||||
switch.add_link(tgen.gears['r4'])
|
||||
switch = tgen.add_switch("s2")
|
||||
switch.add_link(tgen.gears["r3"])
|
||||
switch.add_link(tgen.gears["r4"])
|
||||
|
||||
switch = tgen.add_switch("s3")
|
||||
switch.add_link(tgen.gears["r5"])
|
||||
switch.add_link(tgen.gears["r6"])
|
||||
|
||||
switch = tgen.add_switch('s3')
|
||||
switch.add_link(tgen.gears['r5'])
|
||||
switch.add_link(tgen.gears['r6'])
|
||||
|
||||
def setup_module(mod):
|
||||
tgen = Topogen(TemplateTopo, mod.__name__)
|
||||
@ -72,20 +74,20 @@ def setup_module(mod):
|
||||
|
||||
for i, (rname, router) in enumerate(router_list.iteritems(), 1):
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname))
|
||||
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))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
tgen = get_topogen()
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_ebgp_requires_policy():
|
||||
tgen = get_topogen()
|
||||
|
||||
@ -93,51 +95,46 @@ def test_ebgp_requires_policy():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
def _bgp_converge(router):
|
||||
output = json.loads(tgen.gears[router].vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
|
||||
expected = {
|
||||
'192.168.255.1': {
|
||||
'bgpState': 'Established'
|
||||
}
|
||||
}
|
||||
output = json.loads(
|
||||
tgen.gears[router].vtysh_cmd("show ip bgp neighbor 192.168.255.1 json")
|
||||
)
|
||||
expected = {"192.168.255.1": {"bgpState": "Established"}}
|
||||
return topotest.json_cmp(output, expected)
|
||||
|
||||
def _bgp_has_routes(router):
|
||||
output = json.loads(tgen.gears[router].vtysh_cmd("show ip bgp neighbor 192.168.255.1 routes json"))
|
||||
expected = {
|
||||
'routes': {
|
||||
'172.16.255.254/32': [
|
||||
{
|
||||
'valid': True
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
output = json.loads(
|
||||
tgen.gears[router].vtysh_cmd(
|
||||
"show ip bgp neighbor 192.168.255.1 routes json"
|
||||
)
|
||||
)
|
||||
expected = {"routes": {"172.16.255.254/32": [{"valid": True}]}}
|
||||
return topotest.json_cmp(output, expected)
|
||||
|
||||
test_func = functools.partial(_bgp_converge, 'r2')
|
||||
test_func = functools.partial(_bgp_converge, "r2")
|
||||
success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
|
||||
assert success is True, 'Failed bgp convergence (r2) in "{}"'.format(router)
|
||||
|
||||
test_func = functools.partial(_bgp_has_routes, 'r2')
|
||||
test_func = functools.partial(_bgp_has_routes, "r2")
|
||||
success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
|
||||
assert success is True, 'eBGP policy is not working (r2) in "{}"'.format(router)
|
||||
|
||||
test_func = functools.partial(_bgp_converge, 'r4')
|
||||
test_func = functools.partial(_bgp_converge, "r4")
|
||||
success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
|
||||
assert success is True, 'Failed bgp convergence (r4) in "{}"'.format(router)
|
||||
|
||||
test_func = functools.partial(_bgp_has_routes, 'r4')
|
||||
test_func = functools.partial(_bgp_has_routes, "r4")
|
||||
success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
|
||||
assert success is False, 'eBGP policy is not working (r4) in "{}"'.format(router)
|
||||
|
||||
test_func = functools.partial(_bgp_converge, 'r6')
|
||||
test_func = functools.partial(_bgp_converge, "r6")
|
||||
success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
|
||||
assert success is True, 'Failed bgp convergence (r6) in "{}"'.format(router)
|
||||
|
||||
test_func = functools.partial(_bgp_has_routes, 'r6')
|
||||
test_func = functools.partial(_bgp_has_routes, "r6")
|
||||
success, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
|
||||
assert success is True, 'eBGP policy is not working (r6) in "{}"'.format(router)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -25,65 +25,72 @@ import os
|
||||
import sys
|
||||
import pytest
|
||||
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), '../'))
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../"))
|
||||
|
||||
from lib.ltemplate import *
|
||||
|
||||
|
||||
def test_check_linux_vrf():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\', iproute2=\'4.9\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest('scripts/check_linux_vrf.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1', iproute2='4.9')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest("scripts/check_linux_vrf.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_adjacencies():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest('scripts/adjacencies.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest("scripts/adjacencies.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def SKIP_test_add_routes():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest('scripts/add_routes.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest("scripts/add_routes.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_check_routes():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest('scripts/check_routes.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest("scripts/check_routes.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
#manual data path setup test - remove once have bgp/zebra vrf path working
|
||||
|
||||
# manual data path setup test - remove once have bgp/zebra vrf path working
|
||||
def test_check_linux_mpls():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\', iproute2=\'4.9\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest('scripts/check_linux_mpls.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1', iproute2='4.9')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest("scripts/check_linux_mpls.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_del_bgp_instances():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest('scripts/del_bgp_instances.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest("scripts/del_bgp_instances.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
if __name__ == "__main__":
|
||||
retval = pytest.main(["-s"])
|
||||
sys.exit(retval)
|
||||
|
@ -34,7 +34,7 @@ import pytest
|
||||
|
||||
# Save the Current Working Directory to find configuration files.
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
# Import topogen and topotest helpers
|
||||
@ -48,17 +48,19 @@ from mininet.topo import Topo
|
||||
|
||||
class BGPIPV6RTADVTopo(Topo):
|
||||
"Test topology builder"
|
||||
|
||||
def build(self, *_args, **_opts):
|
||||
"Build function"
|
||||
tgen = get_topogen(self)
|
||||
|
||||
# Create 2 routers.
|
||||
tgen.add_router('r1')
|
||||
tgen.add_router('r2')
|
||||
tgen.add_router("r1")
|
||||
tgen.add_router("r2")
|
||||
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
|
||||
def setup_module(mod):
|
||||
"Sets up the pytest environment"
|
||||
@ -69,17 +71,16 @@ def setup_module(mod):
|
||||
|
||||
for rname, router in router_list.iteritems():
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname))
|
||||
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))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
# Initialize all routers.
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(_mod):
|
||||
"Teardown the pytest environment"
|
||||
tgen = get_topogen()
|
||||
@ -99,44 +100,51 @@ def test_protocols_convergence():
|
||||
# Check IPv4 routing tables.
|
||||
logger.info("Checking IPv4 routes for convergence")
|
||||
for router in tgen.routers().values():
|
||||
json_file = '{}/{}/ipv4_routes.json'.format(CWD, router.name)
|
||||
json_file = "{}/{}/ipv4_routes.json".format(CWD, router.name)
|
||||
if not os.path.isfile(json_file):
|
||||
logger.info('skipping file {}'.format(json_file))
|
||||
logger.info("skipping file {}".format(json_file))
|
||||
continue
|
||||
|
||||
expected = json.loads(open(json_file).read())
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show ip route json'.format(router.name), expected)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=160,
|
||||
wait=0.5)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp,
|
||||
router,
|
||||
"show ip route json".format(router.name),
|
||||
expected,
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=160, wait=0.5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(router.name)
|
||||
assert result is None, assertmsg
|
||||
|
||||
# Check IPv6 routing tables.
|
||||
logger.info("Checking IPv6 routes for convergence")
|
||||
for router in tgen.routers().values():
|
||||
json_file = '{}/{}/ipv6_routes.json'.format(CWD, router.name)
|
||||
json_file = "{}/{}/ipv6_routes.json".format(CWD, router.name)
|
||||
if not os.path.isfile(json_file):
|
||||
logger.info('skipping file {}'.format(json_file))
|
||||
logger.info("skipping file {}".format(json_file))
|
||||
continue
|
||||
|
||||
expected = json.loads(open(json_file).read())
|
||||
test_func = partial(topotest.router_json_cmp,
|
||||
router, 'show ipv6 route json'.format(router.name), expected)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=160,
|
||||
wait=0.5)
|
||||
test_func = partial(
|
||||
topotest.router_json_cmp,
|
||||
router,
|
||||
"show ipv6 route json".format(router.name),
|
||||
expected,
|
||||
)
|
||||
_, result = topotest.run_and_expect(test_func, None, count=160, wait=0.5)
|
||||
assertmsg = '"{}" JSON output mismatches'.format(router.name)
|
||||
assert result is None, assertmsg
|
||||
|
||||
|
||||
def test_memory_leak():
|
||||
"Run the memory leak test and report results."
|
||||
tgen = get_topogen()
|
||||
if not tgen.is_memleak_enabled():
|
||||
pytest.skip('Memory leak test/report is disabled')
|
||||
pytest.skip("Memory leak test/report is disabled")
|
||||
|
||||
tgen.report_memory_leaks()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -88,12 +88,15 @@ from lib.ltemplate import ltemplateRtrCmd
|
||||
from mininet.topo import Topo
|
||||
|
||||
import shutil
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
# test name based on directory
|
||||
TEST = os.path.basename(CWD)
|
||||
|
||||
|
||||
class ThisTestTopo(Topo):
|
||||
"Test topology builder"
|
||||
|
||||
def build(self, *_args, **_opts):
|
||||
"Build function"
|
||||
tgen = get_topogen(self)
|
||||
@ -102,68 +105,71 @@ class ThisTestTopo(Topo):
|
||||
# between routers, switches and hosts.
|
||||
#
|
||||
# Create P/PE routers
|
||||
tgen.add_router('r1')
|
||||
#check for mpls
|
||||
tgen.add_router("r1")
|
||||
# check for mpls
|
||||
if tgen.hasmpls != True:
|
||||
logger.info('MPLS not available, tests will be skipped')
|
||||
logger.info("MPLS not available, tests will be skipped")
|
||||
return
|
||||
for routern in range(2, 5):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
# Create CE routers
|
||||
for routern in range(1, 4):
|
||||
tgen.add_router('ce{}'.format(routern))
|
||||
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')
|
||||
# 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")
|
||||
|
||||
# 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[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("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")
|
||||
|
||||
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 ltemplatePreRouterStartHook():
|
||||
cc = ltemplateRtrCmd()
|
||||
tgen = get_topogen()
|
||||
logger.info('pre router-start hook')
|
||||
#check for mpls
|
||||
logger.info("pre router-start hook")
|
||||
# check for mpls
|
||||
if tgen.hasmpls != True:
|
||||
logger.info('MPLS not available, skipping setup')
|
||||
logger.info("MPLS not available, skipping setup")
|
||||
return False
|
||||
#check for normal init
|
||||
# check for normal init
|
||||
if len(tgen.net) == 1:
|
||||
logger.info('Topology not configured, skipping setup')
|
||||
logger.info("Topology not configured, skipping setup")
|
||||
return False
|
||||
#configure r2 mpls interfaces
|
||||
intfs = ['lo', 'r2-eth0', 'r2-eth1', 'r2-eth2']
|
||||
# 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 MPLS
|
||||
rtrs = ['r1', 'r3', 'r4']
|
||||
cmds = ['echo 1 > /proc/sys/net/mpls/conf/lo/input']
|
||||
cc.doCmd(tgen, "r2", "echo 1 > /proc/sys/net/mpls/conf/{}/input".format(intf))
|
||||
# configure MPLS
|
||||
rtrs = ["r1", "r3", "r4"]
|
||||
cmds = ["echo 1 > /proc/sys/net/mpls/conf/lo/input"]
|
||||
for rtr in rtrs:
|
||||
router = tgen.gears[rtr]
|
||||
for cmd in cmds:
|
||||
cc.doCmd(tgen, rtr, cmd)
|
||||
intfs = ['lo', rtr+'-eth0', rtr+'-eth4']
|
||||
intfs = ["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 mpls input')
|
||||
cc.doCmd(
|
||||
tgen, rtr, "echo 1 > /proc/sys/net/mpls/conf/{}/input".format(intf)
|
||||
)
|
||||
logger.info("setup mpls input")
|
||||
return True
|
||||
|
||||
|
||||
def ltemplatePostRouterStartHook():
|
||||
logger.info('post router-start hook')
|
||||
logger.info("post router-start hook")
|
||||
return True
|
||||
|
||||
|
@ -1,51 +1,193 @@
|
||||
from lutil import luCommand
|
||||
luCommand('r1','vtysh -c "show bgp next"','99.0.0.. valid', 'wait', 'See CE static NH')
|
||||
luCommand('r3','vtysh -c "show bgp next"','99.0.0.. valid', 'wait', 'See CE static NH')
|
||||
luCommand('r4','vtysh -c "show bgp next"','99.0.0.. valid', 'wait', 'See CE static NH')
|
||||
luCommand('r1','vtysh -c "show bgp ipv4 uni"','i5.*i5','wait','See CE routes')
|
||||
luCommand('r3','vtysh -c "show bgp ipv4 uni"','i5.*i5','wait','See CE routes')
|
||||
luCommand('r4','vtysh -c "show bgp ipv4 uni"','i5.*i5','wait','See CE routes')
|
||||
luCommand('ce1','vtysh -c "show bgp ipv4 uni 5.1.0.0/24"','','none','See CE routes')
|
||||
luCommand('r1','vtysh -c "show bgp ipv4 uni 5.1.0.0/24"','','none','See CE routes')
|
||||
luCommand('ce2','vtysh -c "show bgp ipv4 uni 5.1.0.0/24"','','none','See CE routes')
|
||||
luCommand('r3','vtysh -c "show bgp ipv4 uni 5.1.0.0/24"','','none','See CE routes')
|
||||
luCommand('ce3','vtysh -c "show bgp ipv4 uni 5.1.2.0/24"','','none','See CE routes')
|
||||
luCommand('r4','vtysh -c "show bgp ipv4 uni 5.1.2.0/24"','','none','See CE routes')
|
||||
|
||||
luCommand('r1','vtysh -c "add vrf cust1 prefix 99.0.0.1/32"','.','none','IP Address')
|
||||
luCommand('r1','vtysh -c "show vnc registrations local"','99.0.0.1','wait','Local Registration')
|
||||
luCommand('r1','vtysh -c "show vnc registrations imported"','2 out of 2 imported','wait','Imported Registrations')
|
||||
luCommand('r3','vtysh -c "show bgp ipv4 vpn"','i99.0.0.1/32','wait','See R1s static address')
|
||||
luCommand('r4','vtysh -c "show bgp ipv4 vpn"','i99.0.0.1/32','wait','See R1s static address')
|
||||
luCommand('r3','vtysh -c "show bgp ipv4 vpn rd 10:1"','i5.*i5','wait','See R1s imports')
|
||||
luCommand('r4','vtysh -c "show bgp ipv4 vpn rd 10:1"','i5.*i5','wait','See R1s imports')
|
||||
luCommand(
|
||||
"r1", 'vtysh -c "show bgp next"', "99.0.0.. valid", "wait", "See CE static NH"
|
||||
)
|
||||
luCommand(
|
||||
"r3", 'vtysh -c "show bgp next"', "99.0.0.. valid", "wait", "See CE static NH"
|
||||
)
|
||||
luCommand(
|
||||
"r4", 'vtysh -c "show bgp next"', "99.0.0.. valid", "wait", "See CE static NH"
|
||||
)
|
||||
luCommand("r1", 'vtysh -c "show bgp ipv4 uni"', "i5.*i5", "wait", "See CE routes")
|
||||
luCommand("r3", 'vtysh -c "show bgp ipv4 uni"', "i5.*i5", "wait", "See CE routes")
|
||||
luCommand("r4", 'vtysh -c "show bgp ipv4 uni"', "i5.*i5", "wait", "See CE routes")
|
||||
luCommand("ce1", 'vtysh -c "show bgp ipv4 uni 5.1.0.0/24"', "", "none", "See CE routes")
|
||||
luCommand("r1", 'vtysh -c "show bgp ipv4 uni 5.1.0.0/24"', "", "none", "See CE routes")
|
||||
luCommand("ce2", 'vtysh -c "show bgp ipv4 uni 5.1.0.0/24"', "", "none", "See CE routes")
|
||||
luCommand("r3", 'vtysh -c "show bgp ipv4 uni 5.1.0.0/24"', "", "none", "See CE routes")
|
||||
luCommand("ce3", 'vtysh -c "show bgp ipv4 uni 5.1.2.0/24"', "", "none", "See CE routes")
|
||||
luCommand("r4", 'vtysh -c "show bgp ipv4 uni 5.1.2.0/24"', "", "none", "See CE routes")
|
||||
|
||||
luCommand('r3','vtysh -c "add vrf cust1 prefix 99.0.0.2/32"','.','none','IP Address')
|
||||
luCommand('r3','vtysh -c "show vnc registrations local"','99.0.0.2','wait','Local Registration')
|
||||
have2ndImports = luCommand('r3','vtysh -c "show vnc registrations imported"','2 out of 2 imported','none','Imported Registrations',2)
|
||||
luCommand(
|
||||
"r1", 'vtysh -c "add vrf cust1 prefix 99.0.0.1/32"', ".", "none", "IP Address"
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show vnc registrations local"',
|
||||
"99.0.0.1",
|
||||
"wait",
|
||||
"Local Registration",
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show vnc registrations imported"',
|
||||
"2 out of 2 imported",
|
||||
"wait",
|
||||
"Imported Registrations",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show bgp ipv4 vpn"',
|
||||
"i99.0.0.1/32",
|
||||
"wait",
|
||||
"See R1s static address",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show bgp ipv4 vpn"',
|
||||
"i99.0.0.1/32",
|
||||
"wait",
|
||||
"See R1s static address",
|
||||
)
|
||||
luCommand(
|
||||
"r3", 'vtysh -c "show bgp ipv4 vpn rd 10:1"', "i5.*i5", "wait", "See R1s imports"
|
||||
)
|
||||
luCommand(
|
||||
"r4", 'vtysh -c "show bgp ipv4 vpn rd 10:1"', "i5.*i5", "wait", "See R1s imports"
|
||||
)
|
||||
|
||||
luCommand(
|
||||
"r3", 'vtysh -c "add vrf cust1 prefix 99.0.0.2/32"', ".", "none", "IP Address"
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show vnc registrations local"',
|
||||
"99.0.0.2",
|
||||
"wait",
|
||||
"Local Registration",
|
||||
)
|
||||
have2ndImports = luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show vnc registrations imported"',
|
||||
"2 out of 2 imported",
|
||||
"none",
|
||||
"Imported Registrations",
|
||||
2,
|
||||
)
|
||||
if have2ndImports:
|
||||
luCommand('r3','vtysh -c "show vnc registrations imported"','2 out of 2 imported','pass','Imported Registrations')
|
||||
luCommand('r1','vtysh -c "show bgp ipv4 vpn"','i99.0.0.2/32','wait','See R3s static address')
|
||||
luCommand('r4','vtysh -c "show bgp ipv4 vpn"','i99.0.0.2/32','wait','See R3s static address')
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show vnc registrations imported"',
|
||||
"2 out of 2 imported",
|
||||
"pass",
|
||||
"Imported Registrations",
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show bgp ipv4 vpn"',
|
||||
"i99.0.0.2/32",
|
||||
"wait",
|
||||
"See R3s static address",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show bgp ipv4 vpn"',
|
||||
"i99.0.0.2/32",
|
||||
"wait",
|
||||
"See R3s static address",
|
||||
)
|
||||
if have2ndImports:
|
||||
luCommand('r1','vtysh -c "show bgp ipv4 vpn rd 10:3"','i5.*i5','none','See R3s imports')
|
||||
luCommand('r4','vtysh -c "show bgp ipv4 vpn rd 10:3"','i5.*i5','none','See R3s imports')
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show bgp ipv4 vpn rd 10:3"',
|
||||
"i5.*i5",
|
||||
"none",
|
||||
"See R3s imports",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show bgp ipv4 vpn rd 10:3"',
|
||||
"i5.*i5",
|
||||
"none",
|
||||
"See R3s imports",
|
||||
)
|
||||
|
||||
luCommand('r4','vtysh -c "add vrf cust1 prefix 99.0.0.3/32"','.','none','IP Address')
|
||||
luCommand('r4','vtysh -c "show vnc registrations local"','99.0.0.3','wait','Local Registration')
|
||||
luCommand('r4','vtysh -c "show vnc registrations imported"','2 out of 2 imported','wait','Imported Registrations')
|
||||
luCommand('r1','vtysh -c "show bgp ipv4 vpn"','i99.0.0.3/32','wait','See R4s static address')
|
||||
luCommand('r3','vtysh -c "show bgp ipv4 vpn"','i99.0.0.3/32','wait','See R4s static address')
|
||||
luCommand('r1','vtysh -c "show bgp ipv4 vpn rd 10:4"','i5.*i5','wait','See R4s imports')
|
||||
luCommand('r3','vtysh -c "show bgp ipv4 vpn rd 10:4"','i5.*i5','wait','See R4s imports')
|
||||
luCommand(
|
||||
"r4", 'vtysh -c "add vrf cust1 prefix 99.0.0.3/32"', ".", "none", "IP Address"
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show vnc registrations local"',
|
||||
"99.0.0.3",
|
||||
"wait",
|
||||
"Local Registration",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show vnc registrations imported"',
|
||||
"2 out of 2 imported",
|
||||
"wait",
|
||||
"Imported Registrations",
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show bgp ipv4 vpn"',
|
||||
"i99.0.0.3/32",
|
||||
"wait",
|
||||
"See R4s static address",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show bgp ipv4 vpn"',
|
||||
"i99.0.0.3/32",
|
||||
"wait",
|
||||
"See R4s static address",
|
||||
)
|
||||
luCommand(
|
||||
"r1", 'vtysh -c "show bgp ipv4 vpn rd 10:4"', "i5.*i5", "wait", "See R4s imports"
|
||||
)
|
||||
luCommand(
|
||||
"r3", 'vtysh -c "show bgp ipv4 vpn rd 10:4"', "i5.*i5", "wait", "See R4s imports"
|
||||
)
|
||||
|
||||
|
||||
luCommand('r1','vtysh -c "show vnc registrations remote"','5.1.2.0/24 .*5.1.3.0/24','wait','R4s registrations')
|
||||
luCommand('r3','vtysh -c "show vnc registrations remote"','5.1.2.0/24 .*5.1.3.0/24','wait','R4s registrations')
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"5.1.2.0/24 .*5.1.3.0/24",
|
||||
"wait",
|
||||
"R4s registrations",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"5.1.2.0/24 .*5.1.3.0/24",
|
||||
"wait",
|
||||
"R4s registrations",
|
||||
)
|
||||
if have2ndImports:
|
||||
luCommand('r1','vtysh -c "show vnc registrations remote"','5.1.0.0/24 .*5.1.1.0/24','wait','Remote registrations')
|
||||
luCommand('r3','vtysh -c "show vnc registrations remote"','5.1.0.0/24 .*5.1.1.0/24','wait','Remote registrations')
|
||||
luCommand('r4','vtysh -c "show vnc registrations remote"','5.1.0.0/24 .*5.1.1.0/24','wait','Remote registrations')
|
||||
luCommand('r1','vtysh -c "show vnc registrations"','.','none')
|
||||
luCommand('r3','vtysh -c "show vnc registrations"','.','none')
|
||||
luCommand('r4','vtysh -c "show vnc registrations"','.','none')
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"5.1.0.0/24 .*5.1.1.0/24",
|
||||
"wait",
|
||||
"Remote registrations",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"5.1.0.0/24 .*5.1.1.0/24",
|
||||
"wait",
|
||||
"Remote registrations",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"5.1.0.0/24 .*5.1.1.0/24",
|
||||
"wait",
|
||||
"Remote registrations",
|
||||
)
|
||||
luCommand("r1", 'vtysh -c "show vnc registrations"', ".", "none")
|
||||
luCommand("r3", 'vtysh -c "show vnc registrations"', ".", "none")
|
||||
luCommand("r4", 'vtysh -c "show vnc registrations"', ".", "none")
|
||||
|
@ -1,20 +1,64 @@
|
||||
from lutil import luCommand
|
||||
luCommand('ce1','ping 192.168.1.1 -c 1',' 0. packet loss','pass','CE->PE ping')
|
||||
luCommand('ce2','ping 192.168.1.1 -c 1',' 0. packet loss','pass','CE->PE ping')
|
||||
luCommand('ce3','ping 192.168.1.1 -c 1',' 0. packet loss','pass','CE->PE ping')
|
||||
luCommand('ce1','vtysh -c "show bgp summary"',' 00:0','wait','Adjacencies up',180)
|
||||
luCommand('ce2','vtysh -c "show bgp summary"',' 00:0','wait','Adjacencies up',180)
|
||||
luCommand('ce3','vtysh -c "show bgp summary"',' 00:0','wait','Adjacencies up',180)
|
||||
luCommand('r1','ping 2.2.2.2 -c 1',' 0. packet loss','wait','PE->P2 (loopback) ping',60)
|
||||
luCommand('r3','ping 2.2.2.2 -c 1',' 0. packet loss','wait','PE->P2 (loopback) ping',60)
|
||||
luCommand('r4','ping 2.2.2.2 -c 1',' 0. packet loss','wait','PE->P2 (loopback) ping',60)
|
||||
luCommand('r2','vtysh -c "show bgp summary"',' 00:0.* 00:0.* 00:0','wait','Core adjacencies up',180)
|
||||
luCommand('r1','vtysh -c "show bgp summary"',' 00:0','wait','Core adjacencies up',180)
|
||||
luCommand('r3','vtysh -c "show bgp summary"',' 00:0','wait','Core adjacencies up',180)
|
||||
luCommand('r4','vtysh -c "show bgp summary"',' 00:0','wait','Core adjacencies up',180)
|
||||
luCommand('r1','vtysh -c "show bgp vrf all summary"',' 00:0.* 00:0','pass','All adjacencies up')
|
||||
luCommand('r3','vtysh -c "show bgp vrf all summary"',' 00:0.* 00:0','pass','All adjacencies up')
|
||||
luCommand('r4','vtysh -c "show bgp vrf all summary"',' 00:0.* 00:0','pass','All adjacencies up')
|
||||
luCommand('r1','ping 3.3.3.3 -c 1',' 0. packet loss','wait','PE->PE3 (loopback) ping')
|
||||
luCommand('r1','ping 4.4.4.4 -c 1',' 0. packet loss','wait','PE->PE4 (loopback) ping')
|
||||
luCommand('r4','ping 3.3.3.3 -c 1',' 0. packet loss','wait','PE->PE3 (loopback) ping')
|
||||
|
||||
luCommand("ce1", "ping 192.168.1.1 -c 1", " 0. packet loss", "pass", "CE->PE ping")
|
||||
luCommand("ce2", "ping 192.168.1.1 -c 1", " 0. packet loss", "pass", "CE->PE ping")
|
||||
luCommand("ce3", "ping 192.168.1.1 -c 1", " 0. packet loss", "pass", "CE->PE ping")
|
||||
luCommand("ce1", 'vtysh -c "show bgp summary"', " 00:0", "wait", "Adjacencies up", 180)
|
||||
luCommand("ce2", 'vtysh -c "show bgp summary"', " 00:0", "wait", "Adjacencies up", 180)
|
||||
luCommand("ce3", 'vtysh -c "show bgp summary"', " 00:0", "wait", "Adjacencies up", 180)
|
||||
luCommand(
|
||||
"r1", "ping 2.2.2.2 -c 1", " 0. packet loss", "wait", "PE->P2 (loopback) ping", 60
|
||||
)
|
||||
luCommand(
|
||||
"r3", "ping 2.2.2.2 -c 1", " 0. packet loss", "wait", "PE->P2 (loopback) ping", 60
|
||||
)
|
||||
luCommand(
|
||||
"r4", "ping 2.2.2.2 -c 1", " 0. packet loss", "wait", "PE->P2 (loopback) ping", 60
|
||||
)
|
||||
luCommand(
|
||||
"r2",
|
||||
'vtysh -c "show bgp summary"',
|
||||
" 00:0.* 00:0.* 00:0",
|
||||
"wait",
|
||||
"Core adjacencies up",
|
||||
180,
|
||||
)
|
||||
luCommand(
|
||||
"r1", 'vtysh -c "show bgp summary"', " 00:0", "wait", "Core adjacencies up", 180
|
||||
)
|
||||
luCommand(
|
||||
"r3", 'vtysh -c "show bgp summary"', " 00:0", "wait", "Core adjacencies up", 180
|
||||
)
|
||||
luCommand(
|
||||
"r4", 'vtysh -c "show bgp summary"', " 00:0", "wait", "Core adjacencies up", 180
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show bgp vrf all summary"',
|
||||
" 00:0.* 00:0",
|
||||
"pass",
|
||||
"All adjacencies up",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show bgp vrf all summary"',
|
||||
" 00:0.* 00:0",
|
||||
"pass",
|
||||
"All adjacencies up",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show bgp vrf all summary"',
|
||||
" 00:0.* 00:0",
|
||||
"pass",
|
||||
"All adjacencies up",
|
||||
)
|
||||
luCommand(
|
||||
"r1", "ping 3.3.3.3 -c 1", " 0. packet loss", "wait", "PE->PE3 (loopback) ping"
|
||||
)
|
||||
luCommand(
|
||||
"r1", "ping 4.4.4.4 -c 1", " 0. packet loss", "wait", "PE->PE4 (loopback) ping"
|
||||
)
|
||||
luCommand(
|
||||
"r4", "ping 3.3.3.3 -c 1", " 0. packet loss", "wait", "PE->PE3 (loopback) ping"
|
||||
)
|
||||
|
@ -1,17 +1,55 @@
|
||||
from lutil import luCommand
|
||||
luCommand('ce1','vtysh -c "show bgp ipv4 uni"','7 routes and 7','wait','Local and remote routes')
|
||||
luCommand('ce2','vtysh -c "show bgp ipv4 uni"','7 routes and 9','wait','Local and remote routes')
|
||||
luCommand('ce3','vtysh -c "show bgp ipv4 uni"','7 routes and 7','wait','Local and remote routes')
|
||||
luCommand('r1','vtysh -c "show bgp ipv4 uni"','7 routes and 9','pass','Unicast SAFI')
|
||||
luCommand('r2','vtysh -c "show bgp ipv4 uni"','No BGP prefixes displayed','pass','Unicast SAFI')
|
||||
luCommand('r3','vtysh -c "show bgp ipv4 uni"','7 routes and 9','pass','Unicast SAFI')
|
||||
luCommand('r4','vtysh -c "show bgp ipv4 uni"','7 routes and 9','pass','Unicast SAFI')
|
||||
have2ndImports = luCommand('r3','vtysh -c "show vnc registrations imported"','2 out of 2 imported','none','Imported Registrations',2)
|
||||
|
||||
luCommand(
|
||||
"ce1",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"7 routes and 7",
|
||||
"wait",
|
||||
"Local and remote routes",
|
||||
)
|
||||
luCommand(
|
||||
"ce2",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"7 routes and 9",
|
||||
"wait",
|
||||
"Local and remote routes",
|
||||
)
|
||||
luCommand(
|
||||
"ce3",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"7 routes and 7",
|
||||
"wait",
|
||||
"Local and remote routes",
|
||||
)
|
||||
luCommand(
|
||||
"r1", 'vtysh -c "show bgp ipv4 uni"', "7 routes and 9", "pass", "Unicast SAFI"
|
||||
)
|
||||
luCommand(
|
||||
"r2",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"No BGP prefixes displayed",
|
||||
"pass",
|
||||
"Unicast SAFI",
|
||||
)
|
||||
luCommand(
|
||||
"r3", 'vtysh -c "show bgp ipv4 uni"', "7 routes and 9", "pass", "Unicast SAFI"
|
||||
)
|
||||
luCommand(
|
||||
"r4", 'vtysh -c "show bgp ipv4 uni"', "7 routes and 9", "pass", "Unicast SAFI"
|
||||
)
|
||||
have2ndImports = luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show vnc registrations imported"',
|
||||
"2 out of 2 imported",
|
||||
"none",
|
||||
"Imported Registrations",
|
||||
2,
|
||||
)
|
||||
if have2ndImports:
|
||||
num = '9 routes and 9'
|
||||
num = "9 routes and 9"
|
||||
else:
|
||||
num = '7 routes and 7'
|
||||
luCommand('r1','vtysh -c "show bgp ipv4 vpn"',num,'pass','VPN SAFI')
|
||||
luCommand('r2','vtysh -c "show bgp ipv4 vpn"',num,'pass','VPN SAFI')
|
||||
luCommand('r3','vtysh -c "show bgp ipv4 vpn"',num,'pass','VPN SAFI')
|
||||
luCommand('r4','vtysh -c "show bgp ipv4 vpn"',num,'pass','VPN SAFI')
|
||||
num = "7 routes and 7"
|
||||
luCommand("r1", 'vtysh -c "show bgp ipv4 vpn"', num, "pass", "VPN SAFI")
|
||||
luCommand("r2", 'vtysh -c "show bgp ipv4 vpn"', num, "pass", "VPN SAFI")
|
||||
luCommand("r3", 'vtysh -c "show bgp ipv4 vpn"', num, "pass", "VPN SAFI")
|
||||
luCommand("r4", 'vtysh -c "show bgp ipv4 vpn"', num, "pass", "VPN SAFI")
|
||||
|
@ -1,17 +1,114 @@
|
||||
from lutil import luCommand
|
||||
luCommand('r1','vtysh -c "clear vrf cust1 prefix 99.0.0.1/32"','.','none','Cleared VRF route')
|
||||
luCommand('r3','vtysh -c "clear vrf cust1 prefix 99.0.0.2/32"','.','none','Cleared VRF route')
|
||||
luCommand('r4','vtysh -c "clear vrf cust1 prefix 99.0.0.3/32"','.','none','Cleared VRF route')
|
||||
luCommand('r1','vtysh -c "show vnc registrations local"','99.0.0.1','fail','Local Registration cleared')
|
||||
luCommand('r3','vtysh -c "show vnc registrations local"','99.0.0.2','fail','Local Registration cleared')
|
||||
luCommand('r4','vtysh -c "show vnc registrations local"','99.0.0.3','fail','Local Registration cleared')
|
||||
luCommand('r1','vtysh -c "show bgp ipv4 uni"','2 routes and 2','wait','Unicast SAFI updated')
|
||||
luCommand('r2','vtysh -c "show bgp ipv4 uni"','No BGP prefixes displayed','pass','Unicast SAFI')
|
||||
luCommand('r3','vtysh -c "show bgp ipv4 uni"','2 routes and 2','wait','Unicast SAFI updated')
|
||||
luCommand('r4','vtysh -c "show bgp ipv4 uni"','2 routes and 2','wait','Unicast SAFI updated')
|
||||
luCommand('ce1','vtysh -c "show bgp ipv4 uni"','2 routes and 2','wait','Local and remote routes')
|
||||
luCommand('ce2','vtysh -c "show bgp ipv4 uni"','2 routes and 2','wait','Local and remote routes')
|
||||
luCommand('ce3','vtysh -c "show bgp ipv4 uni"','2 routes and 2','wait','Local and remote routes')
|
||||
luCommand('r1','vtysh -c "show vnc registrations remote"','Prefix ','fail','Remote Registration cleared')
|
||||
luCommand('r3','vtysh -c "show vnc registrations remote"','Prefix ','fail','Remote Registration cleared')
|
||||
luCommand('r4','vtysh -c "show vnc registrations remote"','Prefix ','fail','Remote Registration cleared')
|
||||
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "clear vrf cust1 prefix 99.0.0.1/32"',
|
||||
".",
|
||||
"none",
|
||||
"Cleared VRF route",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "clear vrf cust1 prefix 99.0.0.2/32"',
|
||||
".",
|
||||
"none",
|
||||
"Cleared VRF route",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "clear vrf cust1 prefix 99.0.0.3/32"',
|
||||
".",
|
||||
"none",
|
||||
"Cleared VRF route",
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show vnc registrations local"',
|
||||
"99.0.0.1",
|
||||
"fail",
|
||||
"Local Registration cleared",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show vnc registrations local"',
|
||||
"99.0.0.2",
|
||||
"fail",
|
||||
"Local Registration cleared",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show vnc registrations local"',
|
||||
"99.0.0.3",
|
||||
"fail",
|
||||
"Local Registration cleared",
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"2 routes and 2",
|
||||
"wait",
|
||||
"Unicast SAFI updated",
|
||||
)
|
||||
luCommand(
|
||||
"r2",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"No BGP prefixes displayed",
|
||||
"pass",
|
||||
"Unicast SAFI",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"2 routes and 2",
|
||||
"wait",
|
||||
"Unicast SAFI updated",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"2 routes and 2",
|
||||
"wait",
|
||||
"Unicast SAFI updated",
|
||||
)
|
||||
luCommand(
|
||||
"ce1",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"2 routes and 2",
|
||||
"wait",
|
||||
"Local and remote routes",
|
||||
)
|
||||
luCommand(
|
||||
"ce2",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"2 routes and 2",
|
||||
"wait",
|
||||
"Local and remote routes",
|
||||
)
|
||||
luCommand(
|
||||
"ce3",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"2 routes and 2",
|
||||
"wait",
|
||||
"Local and remote routes",
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"Prefix ",
|
||||
"fail",
|
||||
"Remote Registration cleared",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"Prefix ",
|
||||
"fail",
|
||||
"Remote Registration cleared",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"Prefix ",
|
||||
"fail",
|
||||
"Remote Registration cleared",
|
||||
)
|
||||
|
@ -25,46 +25,51 @@ import os
|
||||
import sys
|
||||
import pytest
|
||||
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..'))
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))
|
||||
|
||||
from lib.ltemplate import *
|
||||
|
||||
|
||||
def test_adjacencies():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'3.1\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'3.1\', cli=True)'
|
||||
ltemplateTest('scripts/adjacencies.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('3.1')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'3.1\', cli=True)'
|
||||
ltemplateTest("scripts/adjacencies.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_add_routes():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'3.1\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'3.1\', cli=True)'
|
||||
ltemplateTest('scripts/add_routes.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('3.1')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'3.1\', cli=True)'
|
||||
ltemplateTest("scripts/add_routes.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_check_routes():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'3.1\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'3.1\', cli=True)'
|
||||
ltemplateTest('scripts/check_routes.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('3.1')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'3.1\', cli=True)'
|
||||
ltemplateTest("scripts/check_routes.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_cleanup_all():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'3.1\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'3.1\', cli=True)'
|
||||
ltemplateTest('scripts/cleanup_all.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('3.1')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'3.1\', cli=True)'
|
||||
ltemplateTest("scripts/cleanup_all.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
if __name__ == "__main__":
|
||||
retval = pytest.main(["-s"])
|
||||
sys.exit(retval)
|
||||
|
@ -89,12 +89,15 @@ from lib.ltemplate import ltemplateRtrCmd
|
||||
from mininet.topo import Topo
|
||||
|
||||
import shutil
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
# test name based on directory
|
||||
TEST = os.path.basename(CWD)
|
||||
|
||||
|
||||
class ThisTestTopo(Topo):
|
||||
"Test topology builder"
|
||||
|
||||
def build(self, *_args, **_opts):
|
||||
"Build function"
|
||||
tgen = get_topogen(self)
|
||||
@ -103,125 +106,148 @@ class ThisTestTopo(Topo):
|
||||
# between routers, switches and hosts.
|
||||
#
|
||||
# Create P/PE routers
|
||||
#check for mpls
|
||||
tgen.add_router('r1')
|
||||
# check for mpls
|
||||
tgen.add_router("r1")
|
||||
if tgen.hasmpls != True:
|
||||
logger.info('MPLS not available, tests will be skipped')
|
||||
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')
|
||||
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))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
# Create CE routers
|
||||
for routern in range(1, 5):
|
||||
tgen.add_router('ce{}'.format(routern))
|
||||
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')
|
||||
# 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[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("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")
|
||||
|
||||
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')
|
||||
|
||||
l3mdev_accept = 0
|
||||
|
||||
|
||||
def ltemplatePreRouterStartHook():
|
||||
global l3mdev_accept
|
||||
cc = ltemplateRtrCmd()
|
||||
krel = platform.release()
|
||||
tgen = get_topogen()
|
||||
logger.info('pre router-start hook, kernel=' + krel)
|
||||
logger.info("pre router-start hook, kernel=" + krel)
|
||||
|
||||
if topotest.version_cmp(krel, '4.15') >= 0 and \
|
||||
topotest.version_cmp(krel, '4.18') <= 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:
|
||||
if topotest.version_cmp(krel, "5.0") >= 0:
|
||||
l3mdev_accept = 1
|
||||
|
||||
logger.info('setting net.ipv4.tcp_l3mdev_accept={}'.format(l3mdev_accept))
|
||||
#check for mpls
|
||||
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')
|
||||
logger.info("MPLS not available, skipping setup")
|
||||
return False
|
||||
#check for normal init
|
||||
# check for normal init
|
||||
if len(tgen.net) == 1:
|
||||
logger.info('Topology not configured, skipping setup')
|
||||
logger.info("Topology not configured, skipping setup")
|
||||
return False
|
||||
#trace errors/unexpected output
|
||||
# trace errors/unexpected output
|
||||
cc.resetCounts()
|
||||
#configure r2 mpls interfaces
|
||||
intfs = ['lo', 'r2-eth0', 'r2-eth1', 'r2-eth2']
|
||||
# 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))
|
||||
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)]
|
||||
# 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']
|
||||
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']
|
||||
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']
|
||||
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)]
|
||||
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))
|
||||
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()))
|
||||
logger.info(
|
||||
"Unexpected output seen ({} times, tests will be skipped".format(
|
||||
cc.getOutput()
|
||||
)
|
||||
)
|
||||
else:
|
||||
InitSuccess = True
|
||||
logger.info('VRF config successful!')
|
||||
logger.info("VRF config successful!")
|
||||
return InitSuccess
|
||||
|
||||
|
||||
def ltemplatePostRouterStartHook():
|
||||
logger.info('post router-start hook')
|
||||
logger.info("post router-start hook")
|
||||
return True
|
||||
|
@ -1,13 +1,59 @@
|
||||
from lutil import luCommand
|
||||
luCommand('r1','vtysh -c "add vrf r1-cust1 prefix 99.0.0.1/32"','.','none','IP Address')
|
||||
luCommand('r3','vtysh -c "add vrf r3-cust1 prefix 99.0.0.2/32"','.','none','IP Address')
|
||||
luCommand('r4','vtysh -c "add vrf r4-cust1 prefix 99.0.0.3/32"','.','none','IP Address')
|
||||
luCommand('r1','vtysh -c "show vnc registrations local"','99.0.0.1','pass','Local Registration')
|
||||
luCommand('r3','vtysh -c "show vnc registrations local"','99.0.0.2','pass','Local Registration')
|
||||
luCommand('r4','vtysh -c "show vnc registrations local"','99.0.0.3','pass','Local Registration')
|
||||
luCommand('r1','vtysh -c "show vnc registrations remote"','4 out of 4','wait','Remote Registration', 10)
|
||||
luCommand('r3','vtysh -c "show vnc registrations remote"','6 out of 6','wait','Remote Registration', 10)
|
||||
luCommand('r4','vtysh -c "show vnc registrations remote"','4 out of 4','wait','Remote Registration', 10)
|
||||
luCommand('r1','vtysh -c "show vnc registrations"','.','none')
|
||||
luCommand('r3','vtysh -c "show vnc registrations"','.','none')
|
||||
luCommand('r4','vtysh -c "show vnc registrations"','.','none')
|
||||
|
||||
luCommand(
|
||||
"r1", 'vtysh -c "add vrf r1-cust1 prefix 99.0.0.1/32"', ".", "none", "IP Address"
|
||||
)
|
||||
luCommand(
|
||||
"r3", 'vtysh -c "add vrf r3-cust1 prefix 99.0.0.2/32"', ".", "none", "IP Address"
|
||||
)
|
||||
luCommand(
|
||||
"r4", 'vtysh -c "add vrf r4-cust1 prefix 99.0.0.3/32"', ".", "none", "IP Address"
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show vnc registrations local"',
|
||||
"99.0.0.1",
|
||||
"pass",
|
||||
"Local Registration",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show vnc registrations local"',
|
||||
"99.0.0.2",
|
||||
"pass",
|
||||
"Local Registration",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show vnc registrations local"',
|
||||
"99.0.0.3",
|
||||
"pass",
|
||||
"Local Registration",
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"4 out of 4",
|
||||
"wait",
|
||||
"Remote Registration",
|
||||
10,
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"6 out of 6",
|
||||
"wait",
|
||||
"Remote Registration",
|
||||
10,
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"4 out of 4",
|
||||
"wait",
|
||||
"Remote Registration",
|
||||
10,
|
||||
)
|
||||
luCommand("r1", 'vtysh -c "show vnc registrations"', ".", "none")
|
||||
luCommand("r3", 'vtysh -c "show vnc registrations"', ".", "none")
|
||||
luCommand("r4", 'vtysh -c "show vnc registrations"', ".", "none")
|
||||
|
@ -1,18 +1,64 @@
|
||||
from lutil import luCommand
|
||||
luCommand('ce1','vtysh -c "show bgp summary"',' 00:0','wait','Adjacencies up',180)
|
||||
luCommand('ce2','vtysh -c "show bgp summary"',' 00:0','wait','Adjacencies up',180)
|
||||
luCommand('ce3','vtysh -c "show bgp summary"',' 00:0','wait','Adjacencies up',180)
|
||||
luCommand('ce4','vtysh -c "show bgp vrf all summary"',' 00:0','wait','Adjacencies up',180)
|
||||
luCommand('r1','ping 2.2.2.2 -c 1',' 0. packet loss','wait','PE->P2 (loopback) ping',60)
|
||||
luCommand('r3','ping 2.2.2.2 -c 1',' 0. packet loss','wait','PE->P2 (loopback) ping',60)
|
||||
luCommand('r4','ping 2.2.2.2 -c 1',' 0. packet loss','wait','PE->P2 (loopback) ping',60)
|
||||
luCommand('r2','vtysh -c "show bgp summary"',' 00:0.* 00:0.* 00:0','wait','Core adjacencies up',180)
|
||||
luCommand('r1','vtysh -c "show bgp summary"',' 00:0','wait','Core adjacencies up', 180)
|
||||
luCommand('r3','vtysh -c "show bgp summary"',' 00:0','wait','Core adjacencies up', 180)
|
||||
luCommand('r4','vtysh -c "show bgp summary"',' 00:0','wait','Core adjacencies up', 180)
|
||||
luCommand('r1','vtysh -c "show bgp vrf all summary"',' 00:0.* 00:0','pass','All adjacencies up')
|
||||
luCommand('r3','vtysh -c "show bgp vrf all summary"',' 00:0.* 00:0','pass','All adjacencies up')
|
||||
luCommand('r4','vtysh -c "show bgp vrf all summary"',' 00:0.* 00:0.* 00:0','pass','All adjacencies up')
|
||||
luCommand('r1','ping 3.3.3.3 -c 1',' 0. packet loss','wait','PE->PE3 (loopback) ping')
|
||||
luCommand('r1','ping 4.4.4.4 -c 1',' 0. packet loss','wait','PE->PE4 (loopback) ping')
|
||||
luCommand('r4','ping 3.3.3.3 -c 1',' 0. packet loss','wait','PE->PE3 (loopback) ping')
|
||||
|
||||
luCommand("ce1", 'vtysh -c "show bgp summary"', " 00:0", "wait", "Adjacencies up", 180)
|
||||
luCommand("ce2", 'vtysh -c "show bgp summary"', " 00:0", "wait", "Adjacencies up", 180)
|
||||
luCommand("ce3", 'vtysh -c "show bgp summary"', " 00:0", "wait", "Adjacencies up", 180)
|
||||
luCommand(
|
||||
"ce4", 'vtysh -c "show bgp vrf all summary"', " 00:0", "wait", "Adjacencies up", 180
|
||||
)
|
||||
luCommand(
|
||||
"r1", "ping 2.2.2.2 -c 1", " 0. packet loss", "wait", "PE->P2 (loopback) ping", 60
|
||||
)
|
||||
luCommand(
|
||||
"r3", "ping 2.2.2.2 -c 1", " 0. packet loss", "wait", "PE->P2 (loopback) ping", 60
|
||||
)
|
||||
luCommand(
|
||||
"r4", "ping 2.2.2.2 -c 1", " 0. packet loss", "wait", "PE->P2 (loopback) ping", 60
|
||||
)
|
||||
luCommand(
|
||||
"r2",
|
||||
'vtysh -c "show bgp summary"',
|
||||
" 00:0.* 00:0.* 00:0",
|
||||
"wait",
|
||||
"Core adjacencies up",
|
||||
180,
|
||||
)
|
||||
luCommand(
|
||||
"r1", 'vtysh -c "show bgp summary"', " 00:0", "wait", "Core adjacencies up", 180
|
||||
)
|
||||
luCommand(
|
||||
"r3", 'vtysh -c "show bgp summary"', " 00:0", "wait", "Core adjacencies up", 180
|
||||
)
|
||||
luCommand(
|
||||
"r4", 'vtysh -c "show bgp summary"', " 00:0", "wait", "Core adjacencies up", 180
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show bgp vrf all summary"',
|
||||
" 00:0.* 00:0",
|
||||
"pass",
|
||||
"All adjacencies up",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show bgp vrf all summary"',
|
||||
" 00:0.* 00:0",
|
||||
"pass",
|
||||
"All adjacencies up",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show bgp vrf all summary"',
|
||||
" 00:0.* 00:0.* 00:0",
|
||||
"pass",
|
||||
"All adjacencies up",
|
||||
)
|
||||
luCommand(
|
||||
"r1", "ping 3.3.3.3 -c 1", " 0. packet loss", "wait", "PE->PE3 (loopback) ping"
|
||||
)
|
||||
luCommand(
|
||||
"r1", "ping 4.4.4.4 -c 1", " 0. packet loss", "wait", "PE->PE4 (loopback) ping"
|
||||
)
|
||||
luCommand(
|
||||
"r4", "ping 3.3.3.3 -c 1", " 0. packet loss", "wait", "PE->PE3 (loopback) ping"
|
||||
)
|
||||
|
@ -1,47 +1,83 @@
|
||||
from lutil import luCommand, luLast
|
||||
from lib import topotest
|
||||
|
||||
ret = luCommand('r2', 'ip -M route show',
|
||||
'\d*(?= via inet 10.0.2.4 dev r2-eth1)','wait','See mpls route to r4')
|
||||
ret = luCommand(
|
||||
"r2",
|
||||
"ip -M route show",
|
||||
"\d*(?= via inet 10.0.2.4 dev r2-eth1)",
|
||||
"wait",
|
||||
"See mpls route to r4",
|
||||
)
|
||||
found = luLast()
|
||||
|
||||
if ret != False and found != None:
|
||||
label4r4 = found.group(0)
|
||||
luCommand('r2', 'ip -M route show',
|
||||
'.', 'pass',
|
||||
'See %s as label to r4' % label4r4)
|
||||
ret = luCommand('r2', 'ip -M route show',
|
||||
'\d*(?= via inet 10.0.1.1 dev r2-eth0)', 'wait',
|
||||
'See mpls route to r1')
|
||||
luCommand("r2", "ip -M route show", ".", "pass", "See %s as label to r4" % label4r4)
|
||||
ret = luCommand(
|
||||
"r2",
|
||||
"ip -M route show",
|
||||
"\d*(?= via inet 10.0.1.1 dev r2-eth0)",
|
||||
"wait",
|
||||
"See mpls route to r1",
|
||||
)
|
||||
found = luLast()
|
||||
|
||||
if ret != False and found != None:
|
||||
label4r1 = found.group(0)
|
||||
luCommand('r2', 'ip -M route show',
|
||||
'.', 'pass', 'See %s as label to r1' % label4r1)
|
||||
luCommand("r2", "ip -M route show", ".", "pass", "See %s as label to r1" % label4r1)
|
||||
|
||||
luCommand('r1', 'ip route show vrf r1-cust1',
|
||||
'99.0.0.4', 'pass', 'VRF->MPLS PHP route installed')
|
||||
luCommand('r4', 'ip route show vrf r4-cust2',
|
||||
'99.0.0.1','pass', 'VRF->MPLS PHP route installed')
|
||||
luCommand(
|
||||
"r1",
|
||||
"ip route show vrf r1-cust1",
|
||||
"99.0.0.4",
|
||||
"pass",
|
||||
"VRF->MPLS PHP route installed",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
"ip route show vrf r4-cust2",
|
||||
"99.0.0.1",
|
||||
"pass",
|
||||
"VRF->MPLS PHP route installed",
|
||||
)
|
||||
|
||||
luCommand('r1', 'ip -M route show', '101', 'pass', 'MPLS->VRF route installed')
|
||||
luCommand('r4', 'ip -M route show', '1041', 'pass', 'MPLS->VRF1 route installed')
|
||||
luCommand('r4', 'ip -M route show', '1042', 'pass', 'MPLS->VRF2 route installed')
|
||||
luCommand("r1", "ip -M route show", "101", "pass", "MPLS->VRF route installed")
|
||||
luCommand("r4", "ip -M route show", "1041", "pass", "MPLS->VRF1 route installed")
|
||||
luCommand("r4", "ip -M route show", "1042", "pass", "MPLS->VRF2 route installed")
|
||||
|
||||
luCommand('ce1', 'ping 99.0.0.4 -I 99.0.0.1 -c 1',
|
||||
' 0. packet loss','wait','CE->CE (loopback) ping - l3vpn+zebra case')
|
||||
#skip due to VRF weirdness
|
||||
#luCommand('ce4', 'ping 99.0.0.1 -I 99.0.0.4 -c 1',
|
||||
luCommand(
|
||||
"ce1",
|
||||
"ping 99.0.0.4 -I 99.0.0.1 -c 1",
|
||||
" 0. packet loss",
|
||||
"wait",
|
||||
"CE->CE (loopback) ping - l3vpn+zebra case",
|
||||
)
|
||||
# skip due to VRF weirdness
|
||||
# luCommand('ce4', 'ping 99.0.0.1 -I 99.0.0.4 -c 1',
|
||||
# ' 0. packet loss','wait','CE->CE (loopback) ping - l3vpn+zebra case')
|
||||
|
||||
luCommand('ce1', 'ping 99.0.0.4 -I 99.0.0.1 -c 1',
|
||||
' 0. packet loss','wait','CE->CE (loopback) ping')
|
||||
#luCommand('ce4', 'ping 99.0.0.1 -I 99.0.0.4 -c 1',
|
||||
luCommand(
|
||||
"ce1",
|
||||
"ping 99.0.0.4 -I 99.0.0.1 -c 1",
|
||||
" 0. packet loss",
|
||||
"wait",
|
||||
"CE->CE (loopback) ping",
|
||||
)
|
||||
# luCommand('ce4', 'ping 99.0.0.1 -I 99.0.0.4 -c 1',
|
||||
# ' 0. packet loss','wait','CE->CE (loopback) ping')
|
||||
|
||||
luCommand('r3', 'ip -M route show', '103', 'pass', 'MPLS->VRF route installed')
|
||||
luCommand('ce2', 'ping 99.0.0.3 -I 99.0.0.2 -c 1',
|
||||
' 0. packet loss','wait','CE2->CE3 (loopback) ping')
|
||||
luCommand('ce3', 'ping 99.0.0.4 -I 99.0.0.3 -c 1',
|
||||
' 0. packet loss','wait','CE3->CE4 (loopback) ping')
|
||||
luCommand("r3", "ip -M route show", "103", "pass", "MPLS->VRF route installed")
|
||||
luCommand(
|
||||
"ce2",
|
||||
"ping 99.0.0.3 -I 99.0.0.2 -c 1",
|
||||
" 0. packet loss",
|
||||
"wait",
|
||||
"CE2->CE3 (loopback) ping",
|
||||
)
|
||||
luCommand(
|
||||
"ce3",
|
||||
"ping 99.0.0.4 -I 99.0.0.3 -c 1",
|
||||
" 0. packet loss",
|
||||
"wait",
|
||||
"CE3->CE4 (loopback) ping",
|
||||
)
|
||||
|
@ -1,27 +1,93 @@
|
||||
from lutil import luCommand
|
||||
from customize import l3mdev_accept
|
||||
|
||||
l3mdev_rtrs = ['r1', 'r3', 'r4', 'ce4']
|
||||
l3mdev_rtrs = ["r1", "r3", "r4", "ce4"]
|
||||
for rtr in l3mdev_rtrs:
|
||||
luCommand(rtr,'sysctl net.ipv4.tcp_l3mdev_accept',' = \d*','none','')
|
||||
luCommand(rtr, "sysctl net.ipv4.tcp_l3mdev_accept", " = \d*", "none", "")
|
||||
found = luLast()
|
||||
luCommand(rtr,'ss -naep',':179','pass','IPv4:bgp, l3mdev{}'.format(found.group(0)))
|
||||
luCommand(rtr,'ss -naep',':.*:179','pass','IPv6:bgp')
|
||||
luCommand(rtr,'sysctl net.ipv4.tcp_l3mdev_accept',' = {}'.format(l3mdev_accept),'pass','l3mdev matches expected (real/expected{}/{})'.format(found.group(0),l3mdev_accept))
|
||||
luCommand(
|
||||
rtr, "ss -naep", ":179", "pass", "IPv4:bgp, l3mdev{}".format(found.group(0))
|
||||
)
|
||||
luCommand(rtr, "ss -naep", ":.*:179", "pass", "IPv6:bgp")
|
||||
luCommand(
|
||||
rtr,
|
||||
"sysctl net.ipv4.tcp_l3mdev_accept",
|
||||
" = {}".format(l3mdev_accept),
|
||||
"pass",
|
||||
"l3mdev matches expected (real/expected{}/{})".format(
|
||||
found.group(0), l3mdev_accept
|
||||
),
|
||||
)
|
||||
|
||||
rtrs = ['r1', 'r3', 'r4']
|
||||
rtrs = ["r1", "r3", "r4"]
|
||||
for rtr in rtrs:
|
||||
luCommand(rtr, 'ip link show type vrf {}-cust1'.format(rtr),'cust1: .*UP','pass','VRF cust1 intf up')
|
||||
luCommand(rtr, 'ip add show vrf {}-cust1'.format(rtr),'r..eth4.*UP','pass','VRF cust1 IP intf up')
|
||||
luCommand(rtr, 'ip add show vrf {}-cust1'.format(rtr),'192.168','pass','VRF cust1 IP config')
|
||||
luCommand(rtr, 'ip route show vrf {}-cust1'.format(rtr),'192.168...0/24 dev r.-eth','pass','VRF cust1 interface route')
|
||||
luCommand('r4', 'ip link show type vrf r4-cust2','cust2: .*UP','pass','VRF cust2 up')
|
||||
luCommand('r4', 'ip add show vrf r4-cust2','r..eth5.*UP.* 192.168','pass','VRF cust1 IP config')
|
||||
luCommand(rtr, 'ip route show vrf r4-cust2'.format(rtr),'192.168...0/24 dev r.-eth','pass','VRF cust2 interface route')
|
||||
rtrs = ['ce1', 'ce2', 'ce3']
|
||||
luCommand(
|
||||
rtr,
|
||||
"ip link show type vrf {}-cust1".format(rtr),
|
||||
"cust1: .*UP",
|
||||
"pass",
|
||||
"VRF cust1 intf up",
|
||||
)
|
||||
luCommand(
|
||||
rtr,
|
||||
"ip add show vrf {}-cust1".format(rtr),
|
||||
"r..eth4.*UP",
|
||||
"pass",
|
||||
"VRF cust1 IP intf up",
|
||||
)
|
||||
luCommand(
|
||||
rtr,
|
||||
"ip add show vrf {}-cust1".format(rtr),
|
||||
"192.168",
|
||||
"pass",
|
||||
"VRF cust1 IP config",
|
||||
)
|
||||
luCommand(
|
||||
rtr,
|
||||
"ip route show vrf {}-cust1".format(rtr),
|
||||
"192.168...0/24 dev r.-eth",
|
||||
"pass",
|
||||
"VRF cust1 interface route",
|
||||
)
|
||||
luCommand("r4", "ip link show type vrf r4-cust2", "cust2: .*UP", "pass", "VRF cust2 up")
|
||||
luCommand(
|
||||
"r4",
|
||||
"ip add show vrf r4-cust2",
|
||||
"r..eth5.*UP.* 192.168",
|
||||
"pass",
|
||||
"VRF cust1 IP config",
|
||||
)
|
||||
luCommand(
|
||||
rtr,
|
||||
"ip route show vrf r4-cust2".format(rtr),
|
||||
"192.168...0/24 dev r.-eth",
|
||||
"pass",
|
||||
"VRF cust2 interface route",
|
||||
)
|
||||
rtrs = ["ce1", "ce2", "ce3"]
|
||||
for rtr in rtrs:
|
||||
luCommand(rtr, 'ip route show','192.168...0/24 dev ce.-eth0','pass','CE interface route')
|
||||
luCommand(rtr,'ping 192.168.1.1 -c 1',' 0. packet loss','wait','CE->PE ping')
|
||||
luCommand('ce4', 'ip link show type vrf ce4-cust2','cust2: .*UP','pass','VRF cust2 up')
|
||||
luCommand('ce4', 'ip route show vrf ce4-cust2','192.168...0/24 dev ce.-eth0','pass','CE interface route')
|
||||
luCommand('ce4','ping 192.168.2.1 -c 1 -I ce4-cust2',' 0. packet loss','wait','CE4->PE4 ping')
|
||||
luCommand(
|
||||
rtr,
|
||||
"ip route show",
|
||||
"192.168...0/24 dev ce.-eth0",
|
||||
"pass",
|
||||
"CE interface route",
|
||||
)
|
||||
luCommand(rtr, "ping 192.168.1.1 -c 1", " 0. packet loss", "wait", "CE->PE ping")
|
||||
luCommand(
|
||||
"ce4", "ip link show type vrf ce4-cust2", "cust2: .*UP", "pass", "VRF cust2 up"
|
||||
)
|
||||
luCommand(
|
||||
"ce4",
|
||||
"ip route show vrf ce4-cust2",
|
||||
"192.168...0/24 dev ce.-eth0",
|
||||
"pass",
|
||||
"CE interface route",
|
||||
)
|
||||
luCommand(
|
||||
"ce4",
|
||||
"ping 192.168.2.1 -c 1 -I ce4-cust2",
|
||||
" 0. packet loss",
|
||||
"wait",
|
||||
"CE4->PE4 ping",
|
||||
)
|
||||
|
@ -1,5 +1,5 @@
|
||||
from lutil import luCommand
|
||||
from bgprib import bgpribRequireVpnRoutes,bgpribRequireUnicastRoutes
|
||||
from bgprib import bgpribRequireVpnRoutes, bgpribRequireUnicastRoutes
|
||||
|
||||
########################################################################
|
||||
# CE routers: contain routes they originate
|
||||
@ -12,32 +12,32 @@ from bgprib import bgpribRequireVpnRoutes,bgpribRequireUnicastRoutes
|
||||
# ce4 vtysh -c "show bgp ipv4 uni"
|
||||
|
||||
want = [
|
||||
{'p':'5.1.0.0/24', 'n':'99.0.0.1'},
|
||||
{'p':'5.1.1.0/24', 'n':'99.0.0.1'},
|
||||
{'p':'99.0.0.1/32', 'n':'0.0.0.0'},
|
||||
{"p": "5.1.0.0/24", "n": "99.0.0.1"},
|
||||
{"p": "5.1.1.0/24", "n": "99.0.0.1"},
|
||||
{"p": "99.0.0.1/32", "n": "0.0.0.0"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('ce1','ipv4','','Cust 1 routes in ce1',want)
|
||||
bgpribRequireUnicastRoutes("ce1", "ipv4", "", "Cust 1 routes in ce1", want)
|
||||
|
||||
want = [
|
||||
{'p':'5.1.0.0/24', 'n':'99.0.0.2'},
|
||||
{'p':'5.1.1.0/24', 'n':'99.0.0.2'},
|
||||
{'p':'99.0.0.2/32', 'n':'0.0.0.0'},
|
||||
{"p": "5.1.0.0/24", "n": "99.0.0.2"},
|
||||
{"p": "5.1.1.0/24", "n": "99.0.0.2"},
|
||||
{"p": "99.0.0.2/32", "n": "0.0.0.0"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('ce2','ipv4','','Cust 2 routes in ce1',want)
|
||||
bgpribRequireUnicastRoutes("ce2", "ipv4", "", "Cust 2 routes in ce1", want)
|
||||
|
||||
want = [
|
||||
{'p':'5.1.2.0/24', 'n':'99.0.0.3'},
|
||||
{'p':'5.1.3.0/24', 'n':'99.0.0.3'},
|
||||
{'p':'99.0.0.3/32', 'n':'0.0.0.0'},
|
||||
{"p": "5.1.2.0/24", "n": "99.0.0.3"},
|
||||
{"p": "5.1.3.0/24", "n": "99.0.0.3"},
|
||||
{"p": "99.0.0.3/32", "n": "0.0.0.0"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('ce3','ipv4','','Cust 3 routes in ce1',want)
|
||||
bgpribRequireUnicastRoutes("ce3", "ipv4", "", "Cust 3 routes in ce1", want)
|
||||
|
||||
want = [
|
||||
{'p':'5.4.2.0/24', 'n':'99.0.0.4'},
|
||||
{'p':'5.4.3.0/24', 'n':'99.0.0.4'},
|
||||
{'p':'99.0.0.4/32', 'n':'0.0.0.0'},
|
||||
{"p": "5.4.2.0/24", "n": "99.0.0.4"},
|
||||
{"p": "5.4.3.0/24", "n": "99.0.0.4"},
|
||||
{"p": "99.0.0.4/32", "n": "0.0.0.0"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('ce4','ipv4','ce4-cust2','Cust 4 routes in ce1',want)
|
||||
bgpribRequireUnicastRoutes("ce4", "ipv4", "ce4-cust2", "Cust 4 routes in ce1", want)
|
||||
|
||||
|
||||
########################################################################
|
||||
@ -47,116 +47,169 @@ bgpribRequireUnicastRoutes('ce4','ipv4','ce4-cust2','Cust 4 routes in ce1',want)
|
||||
# r1 vtysh -c "show bgp vrf r1-cust1 ipv4"
|
||||
#
|
||||
want_r1_cust1_routes = [
|
||||
{'p':'5.1.0.0/24', 'n':'99.0.0.1'},
|
||||
{'p':'5.1.1.0/24', 'n':'99.0.0.1'},
|
||||
{'p':'99.0.0.1/32', 'n':'192.168.1.2'},
|
||||
{"p": "5.1.0.0/24", "n": "99.0.0.1"},
|
||||
{"p": "5.1.1.0/24", "n": "99.0.0.1"},
|
||||
{"p": "99.0.0.1/32", "n": "192.168.1.2"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('r1','ipv4','r1-cust1','Customer 1 routes in r1 vrf',want_r1_cust1_routes)
|
||||
bgpribRequireUnicastRoutes(
|
||||
"r1", "ipv4", "r1-cust1", "Customer 1 routes in r1 vrf", want_r1_cust1_routes
|
||||
)
|
||||
|
||||
want_r3_cust1_routes = [
|
||||
{'p':'5.1.0.0/24', 'n':'99.0.0.2'},
|
||||
{'p':'5.1.1.0/24', 'n':'99.0.0.2'},
|
||||
{'p':'99.0.0.2/32', 'n':'192.168.1.2'},
|
||||
{"p": "5.1.0.0/24", "n": "99.0.0.2"},
|
||||
{"p": "5.1.1.0/24", "n": "99.0.0.2"},
|
||||
{"p": "99.0.0.2/32", "n": "192.168.1.2"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('r3','ipv4','r3-cust1','Customer 1 routes in r3 vrf',want_r3_cust1_routes)
|
||||
bgpribRequireUnicastRoutes(
|
||||
"r3", "ipv4", "r3-cust1", "Customer 1 routes in r3 vrf", want_r3_cust1_routes
|
||||
)
|
||||
|
||||
want_r4_cust1_routes = [
|
||||
{'p':'5.1.2.0/24', 'n':'99.0.0.3'},
|
||||
{'p':'5.1.3.0/24', 'n':'99.0.0.3'},
|
||||
{'p':'99.0.0.3/32', 'n':'192.168.1.2'},
|
||||
{"p": "5.1.2.0/24", "n": "99.0.0.3"},
|
||||
{"p": "5.1.3.0/24", "n": "99.0.0.3"},
|
||||
{"p": "99.0.0.3/32", "n": "192.168.1.2"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('r4','ipv4','r4-cust1','Customer 1 routes in r4 vrf',want_r4_cust1_routes)
|
||||
bgpribRequireUnicastRoutes(
|
||||
"r4", "ipv4", "r4-cust1", "Customer 1 routes in r4 vrf", want_r4_cust1_routes
|
||||
)
|
||||
|
||||
want_r4_cust2_routes = [
|
||||
{'p':'5.4.2.0/24', 'n':'99.0.0.4'},
|
||||
{'p':'5.4.3.0/24', 'n':'99.0.0.4'},
|
||||
{'p':'99.0.0.4/32', 'n':'192.168.2.2'},
|
||||
{"p": "5.4.2.0/24", "n": "99.0.0.4"},
|
||||
{"p": "5.4.3.0/24", "n": "99.0.0.4"},
|
||||
{"p": "99.0.0.4/32", "n": "192.168.2.2"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('r4','ipv4','r4-cust2','Customer 2 routes in r4 vrf',want_r4_cust2_routes)
|
||||
bgpribRequireUnicastRoutes(
|
||||
"r4", "ipv4", "r4-cust2", "Customer 2 routes in r4 vrf", want_r4_cust2_routes
|
||||
)
|
||||
|
||||
########################################################################
|
||||
# PE routers: core unicast routes are empty
|
||||
########################################################################
|
||||
|
||||
luCommand('r1','vtysh -c "show bgp ipv4 uni"','No BGP prefixes displayed','pass','Core Unicast SAFI clean')
|
||||
luCommand('r2','vtysh -c "show bgp ipv4 uni"','No BGP prefixes displayed','pass','Core Unicast SAFI clean')
|
||||
luCommand('r3','vtysh -c "show bgp ipv4 uni"','No BGP prefixes displayed','pass','Core Unicast SAFI clean')
|
||||
luCommand('r4','vtysh -c "show bgp ipv4 uni"','No BGP prefixes displayed','pass','Core Unicast SAFI clean')
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"No BGP prefixes displayed",
|
||||
"pass",
|
||||
"Core Unicast SAFI clean",
|
||||
)
|
||||
luCommand(
|
||||
"r2",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"No BGP prefixes displayed",
|
||||
"pass",
|
||||
"Core Unicast SAFI clean",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"No BGP prefixes displayed",
|
||||
"pass",
|
||||
"Core Unicast SAFI clean",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"No BGP prefixes displayed",
|
||||
"pass",
|
||||
"Core Unicast SAFI clean",
|
||||
)
|
||||
|
||||
########################################################################
|
||||
# PE routers: local ce-originated routes are leaked to vpn
|
||||
########################################################################
|
||||
|
||||
# nhzero is for the new code that sets nh of locally-leaked routes to 0
|
||||
#nhzero = 1
|
||||
# nhzero = 1
|
||||
nhzero = 0
|
||||
|
||||
if nhzero:
|
||||
luCommand('r1','vtysh -c "show bgp ipv4 vpn"',
|
||||
'Distinguisher: *10:1.*5.1.0.0/24 *0.0.0.0 .*5.1.1.0/24 *0.0.0.0 .*99.0.0.1/32 *0.0.0.0 ',
|
||||
'pass','vrf->vpn routes')
|
||||
luCommand('r3','vtysh -c "show bgp ipv4 vpn"',
|
||||
'Distinguisher: *10:3.*5.1.0.0/24 *0.0.0.0 .*5.1.1.0/24 *0.0.0.0 .*99.0.0.2/32 *0.0.0.0 ',
|
||||
'pass','vrf->vpn routes')
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show bgp ipv4 vpn"',
|
||||
"Distinguisher: *10:1.*5.1.0.0/24 *0.0.0.0 .*5.1.1.0/24 *0.0.0.0 .*99.0.0.1/32 *0.0.0.0 ",
|
||||
"pass",
|
||||
"vrf->vpn routes",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show bgp ipv4 vpn"',
|
||||
"Distinguisher: *10:3.*5.1.0.0/24 *0.0.0.0 .*5.1.1.0/24 *0.0.0.0 .*99.0.0.2/32 *0.0.0.0 ",
|
||||
"pass",
|
||||
"vrf->vpn routes",
|
||||
)
|
||||
want = [
|
||||
{'rd':'10:41', 'p':'5.1.2.0/24', 'n':'0.0.0.0'},
|
||||
{'rd':'10:41', 'p':'5.1.3.0/24', 'n':'0.0.0.0'},
|
||||
{'rd':'10:41', 'p':'99.0.0.3/32', 'n':'0.0.0.0'},
|
||||
|
||||
{'rd':'10:42', 'p':'5.4.2.0/24', 'n':'0.0.0.0'},
|
||||
{'rd':'10:42', 'p':'5.4.3.0/24', 'n':'0.0.0.0'},
|
||||
{'rd':'10:42', 'p':'99.0.0.4/32', 'n':'0.0.0.0'},
|
||||
{"rd": "10:41", "p": "5.1.2.0/24", "n": "0.0.0.0"},
|
||||
{"rd": "10:41", "p": "5.1.3.0/24", "n": "0.0.0.0"},
|
||||
{"rd": "10:41", "p": "99.0.0.3/32", "n": "0.0.0.0"},
|
||||
{"rd": "10:42", "p": "5.4.2.0/24", "n": "0.0.0.0"},
|
||||
{"rd": "10:42", "p": "5.4.3.0/24", "n": "0.0.0.0"},
|
||||
{"rd": "10:42", "p": "99.0.0.4/32", "n": "0.0.0.0"},
|
||||
]
|
||||
bgpribRequireVpnRoutes('r4','vrf->vpn routes',want)
|
||||
bgpribRequireVpnRoutes("r4", "vrf->vpn routes", want)
|
||||
|
||||
else:
|
||||
luCommand('r1','vtysh -c "show bgp ipv4 vpn"',
|
||||
r'Distinguisher: *10:1.*5.1.0.0/24 *99.0.0.1\b.*5.1.1.0/24 *99.0.0.1\b.*99.0.0.1/32 *192.168.1.2\b',
|
||||
'pass','vrf->vpn routes')
|
||||
luCommand('r3','vtysh -c "show bgp ipv4 vpn"',
|
||||
r'Distinguisher: *10:3.*5.1.0.0/24 *99.0.0.2\b.*5.1.1.0/24 *99.0.0.2\b.*99.0.0.2/32 *192.168.1.2\b',
|
||||
'pass','vrf->vpn routes')
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show bgp ipv4 vpn"',
|
||||
r"Distinguisher: *10:1.*5.1.0.0/24 *99.0.0.1\b.*5.1.1.0/24 *99.0.0.1\b.*99.0.0.1/32 *192.168.1.2\b",
|
||||
"pass",
|
||||
"vrf->vpn routes",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show bgp ipv4 vpn"',
|
||||
r"Distinguisher: *10:3.*5.1.0.0/24 *99.0.0.2\b.*5.1.1.0/24 *99.0.0.2\b.*99.0.0.2/32 *192.168.1.2\b",
|
||||
"pass",
|
||||
"vrf->vpn routes",
|
||||
)
|
||||
want = [
|
||||
{'rd':'10:41', 'p':'5.1.2.0/24', 'n':'99.0.0.3'},
|
||||
{'rd':'10:41', 'p':'5.1.3.0/24', 'n':'99.0.0.3'},
|
||||
{'rd':'10:41', 'p':'99.0.0.3/32', 'n':'192.168.1.2'},
|
||||
|
||||
{'rd':'10:42', 'p':'5.4.2.0/24', 'n':'99.0.0.4'},
|
||||
{'rd':'10:42', 'p':'5.4.3.0/24', 'n':'99.0.0.4'},
|
||||
{'rd':'10:42', 'p':'99.0.0.4/32', 'n':'192.168.2.2'},
|
||||
{"rd": "10:41", "p": "5.1.2.0/24", "n": "99.0.0.3"},
|
||||
{"rd": "10:41", "p": "5.1.3.0/24", "n": "99.0.0.3"},
|
||||
{"rd": "10:41", "p": "99.0.0.3/32", "n": "192.168.1.2"},
|
||||
{"rd": "10:42", "p": "5.4.2.0/24", "n": "99.0.0.4"},
|
||||
{"rd": "10:42", "p": "5.4.3.0/24", "n": "99.0.0.4"},
|
||||
{"rd": "10:42", "p": "99.0.0.4/32", "n": "192.168.2.2"},
|
||||
]
|
||||
bgpribRequireVpnRoutes('r4','vrf->vpn routes',want)
|
||||
bgpribRequireVpnRoutes("r4", "vrf->vpn routes", want)
|
||||
|
||||
########################################################################
|
||||
# PE routers: exporting vrfs set MPLS vrf labels in kernel
|
||||
########################################################################
|
||||
|
||||
luCommand('r1','vtysh -c "show mpls table"',' 101 *BGP *r1-cust1','pass','vrf labels')
|
||||
luCommand('r3','vtysh -c "show mpls table"',' 103 *BGP *r3-cust1','pass','vrf labels')
|
||||
luCommand('r4','vtysh -c "show mpls table"',' 1041 *BGP *r4-cust1 .*1042 *BGP *r4-cust2','pass','vrf labels')
|
||||
luCommand(
|
||||
"r1", 'vtysh -c "show mpls table"', " 101 *BGP *r1-cust1", "pass", "vrf labels"
|
||||
)
|
||||
luCommand(
|
||||
"r3", 'vtysh -c "show mpls table"', " 103 *BGP *r3-cust1", "pass", "vrf labels"
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show mpls table"',
|
||||
" 1041 *BGP *r4-cust1 .*1042 *BGP *r4-cust2",
|
||||
"pass",
|
||||
"vrf labels",
|
||||
)
|
||||
|
||||
########################################################################
|
||||
# Core VPN router: all customer routes
|
||||
########################################################################
|
||||
|
||||
want_rd_routes = [
|
||||
{'rd':'10:1', 'p':'5.1.0.0/24', 'n':'1.1.1.1'},
|
||||
{'rd':'10:1', 'p':'5.1.0.0/24', 'n':'1.1.1.1'},
|
||||
{'rd':'10:1', 'p':'99.0.0.1/32', 'n':'1.1.1.1'},
|
||||
|
||||
{'rd':'10:3', 'p':'5.1.0.0/24', 'n':'3.3.3.3'},
|
||||
{'rd':'10:3', 'p':'5.1.0.0/24', 'n':'3.3.3.3'},
|
||||
{'rd':'10:3', 'p':'99.0.0.2/32', 'n':'3.3.3.3'},
|
||||
|
||||
{'rd':'10:41', 'p':'5.1.2.0/24', 'n':'4.4.4.4'},
|
||||
{'rd':'10:41', 'p':'5.1.3.0/24', 'n':'4.4.4.4'},
|
||||
{'rd':'10:41', 'p':'99.0.0.3/32', 'n':'4.4.4.4'},
|
||||
|
||||
{'rd':'10:42', 'p':'5.4.2.0/24', 'n':'4.4.4.4'},
|
||||
{'rd':'10:42', 'p':'5.4.3.0/24', 'n':'4.4.4.4'},
|
||||
{'rd':'10:42', 'p':'99.0.0.4/32', 'n':'4.4.4.4'},
|
||||
{"rd": "10:1", "p": "5.1.0.0/24", "n": "1.1.1.1"},
|
||||
{"rd": "10:1", "p": "5.1.0.0/24", "n": "1.1.1.1"},
|
||||
{"rd": "10:1", "p": "99.0.0.1/32", "n": "1.1.1.1"},
|
||||
{"rd": "10:3", "p": "5.1.0.0/24", "n": "3.3.3.3"},
|
||||
{"rd": "10:3", "p": "5.1.0.0/24", "n": "3.3.3.3"},
|
||||
{"rd": "10:3", "p": "99.0.0.2/32", "n": "3.3.3.3"},
|
||||
{"rd": "10:41", "p": "5.1.2.0/24", "n": "4.4.4.4"},
|
||||
{"rd": "10:41", "p": "5.1.3.0/24", "n": "4.4.4.4"},
|
||||
{"rd": "10:41", "p": "99.0.0.3/32", "n": "4.4.4.4"},
|
||||
{"rd": "10:42", "p": "5.4.2.0/24", "n": "4.4.4.4"},
|
||||
{"rd": "10:42", "p": "5.4.3.0/24", "n": "4.4.4.4"},
|
||||
{"rd": "10:42", "p": "99.0.0.4/32", "n": "4.4.4.4"},
|
||||
]
|
||||
bgpribRequireVpnRoutes('r2','Customer routes in provider vpn core',want_rd_routes)
|
||||
bgpribRequireVpnRoutes("r2", "Customer routes in provider vpn core", want_rd_routes)
|
||||
|
||||
########################################################################
|
||||
# PE routers: VPN routes from remote customers
|
||||
@ -165,46 +218,46 @@ bgpribRequireVpnRoutes('r2','Customer routes in provider vpn core',want_rd_route
|
||||
# r1 vtysh -c "show bgp ipv4 vpn"
|
||||
#
|
||||
want_r1_remote_vpn_routes = [
|
||||
{'rd':'10:3', 'p':'5.1.0.0/24', 'n':'3.3.3.3'},
|
||||
{'rd':'10:3', 'p':'5.1.1.0/24', 'n':'3.3.3.3'},
|
||||
{'rd':'10:3', 'p':'99.0.0.2/32', 'n':'3.3.3.3'},
|
||||
|
||||
{'rd':'10:41', 'p':'5.1.2.0/24', 'n':'4.4.4.4'},
|
||||
{'rd':'10:41', 'p':'5.1.3.0/24', 'n':'4.4.4.4'},
|
||||
{'rd':'10:41', 'p':'99.0.0.3/32', 'n':'4.4.4.4'},
|
||||
|
||||
{'rd':'10:42', 'p':'5.4.2.0/24', 'n':'4.4.4.4'},
|
||||
{'rd':'10:42', 'p':'5.4.3.0/24', 'n':'4.4.4.4'},
|
||||
{'rd':'10:42', 'p':'99.0.0.4/32', 'n':'4.4.4.4'},
|
||||
{"rd": "10:3", "p": "5.1.0.0/24", "n": "3.3.3.3"},
|
||||
{"rd": "10:3", "p": "5.1.1.0/24", "n": "3.3.3.3"},
|
||||
{"rd": "10:3", "p": "99.0.0.2/32", "n": "3.3.3.3"},
|
||||
{"rd": "10:41", "p": "5.1.2.0/24", "n": "4.4.4.4"},
|
||||
{"rd": "10:41", "p": "5.1.3.0/24", "n": "4.4.4.4"},
|
||||
{"rd": "10:41", "p": "99.0.0.3/32", "n": "4.4.4.4"},
|
||||
{"rd": "10:42", "p": "5.4.2.0/24", "n": "4.4.4.4"},
|
||||
{"rd": "10:42", "p": "5.4.3.0/24", "n": "4.4.4.4"},
|
||||
{"rd": "10:42", "p": "99.0.0.4/32", "n": "4.4.4.4"},
|
||||
]
|
||||
bgpribRequireVpnRoutes('r1','Remote Customer routes in R1 vpn',want_r1_remote_vpn_routes)
|
||||
bgpribRequireVpnRoutes(
|
||||
"r1", "Remote Customer routes in R1 vpn", want_r1_remote_vpn_routes
|
||||
)
|
||||
|
||||
want_r3_remote_vpn_routes = [
|
||||
{'rd':'10:1', 'p':'5.1.0.0/24', 'n':'1.1.1.1'},
|
||||
{'rd':'10:1', 'p':'5.1.1.0/24', 'n':'1.1.1.1'},
|
||||
{'rd':'10:1', 'p':'99.0.0.1/32', 'n':'1.1.1.1'},
|
||||
|
||||
{'rd':'10:41', 'p':'5.1.2.0/24', 'n':'4.4.4.4'},
|
||||
{'rd':'10:41', 'p':'5.1.3.0/24', 'n':'4.4.4.4'},
|
||||
{'rd':'10:41', 'p':'99.0.0.3/32', 'n':'4.4.4.4'},
|
||||
|
||||
{'rd':'10:42', 'p':'5.4.2.0/24', 'n':'4.4.4.4'},
|
||||
{'rd':'10:42', 'p':'5.4.3.0/24', 'n':'4.4.4.4'},
|
||||
{'rd':'10:42', 'p':'99.0.0.4/32', 'n':'4.4.4.4'},
|
||||
{"rd": "10:1", "p": "5.1.0.0/24", "n": "1.1.1.1"},
|
||||
{"rd": "10:1", "p": "5.1.1.0/24", "n": "1.1.1.1"},
|
||||
{"rd": "10:1", "p": "99.0.0.1/32", "n": "1.1.1.1"},
|
||||
{"rd": "10:41", "p": "5.1.2.0/24", "n": "4.4.4.4"},
|
||||
{"rd": "10:41", "p": "5.1.3.0/24", "n": "4.4.4.4"},
|
||||
{"rd": "10:41", "p": "99.0.0.3/32", "n": "4.4.4.4"},
|
||||
{"rd": "10:42", "p": "5.4.2.0/24", "n": "4.4.4.4"},
|
||||
{"rd": "10:42", "p": "5.4.3.0/24", "n": "4.4.4.4"},
|
||||
{"rd": "10:42", "p": "99.0.0.4/32", "n": "4.4.4.4"},
|
||||
]
|
||||
bgpribRequireVpnRoutes('r3','Remote Customer routes in R3 vpn',want_r3_remote_vpn_routes)
|
||||
bgpribRequireVpnRoutes(
|
||||
"r3", "Remote Customer routes in R3 vpn", want_r3_remote_vpn_routes
|
||||
)
|
||||
|
||||
want_r4_remote_vpn_routes = [
|
||||
{'rd':'10:1', 'p':'5.1.0.0/24', 'n':'1.1.1.1'},
|
||||
{'rd':'10:1', 'p':'5.1.1.0/24', 'n':'1.1.1.1'},
|
||||
{'rd':'10:1', 'p':'99.0.0.1/32', 'n':'1.1.1.1'},
|
||||
|
||||
{'rd':'10:3', 'p':'5.1.0.0/24', 'n':'3.3.3.3'},
|
||||
{'rd':'10:3', 'p':'5.1.1.0/24', 'n':'3.3.3.3'},
|
||||
{'rd':'10:3', 'p':'99.0.0.2/32', 'n':'3.3.3.3'},
|
||||
{"rd": "10:1", "p": "5.1.0.0/24", "n": "1.1.1.1"},
|
||||
{"rd": "10:1", "p": "5.1.1.0/24", "n": "1.1.1.1"},
|
||||
{"rd": "10:1", "p": "99.0.0.1/32", "n": "1.1.1.1"},
|
||||
{"rd": "10:3", "p": "5.1.0.0/24", "n": "3.3.3.3"},
|
||||
{"rd": "10:3", "p": "5.1.1.0/24", "n": "3.3.3.3"},
|
||||
{"rd": "10:3", "p": "99.0.0.2/32", "n": "3.3.3.3"},
|
||||
]
|
||||
bgpribRequireVpnRoutes('r4','Remote Customer routes in R4 vpn',want_r4_remote_vpn_routes)
|
||||
|
||||
bgpribRequireVpnRoutes(
|
||||
"r4", "Remote Customer routes in R4 vpn", want_r4_remote_vpn_routes
|
||||
)
|
||||
|
||||
|
||||
# r1 vtysh -c "show bgp vrf r1-cust1 ipv4"
|
||||
@ -213,54 +266,58 @@ bgpribRequireVpnRoutes('r4','Remote Customer routes in R4 vpn',want_r4_remote_vp
|
||||
# PE routers: VRFs contain routes from remote customer nets
|
||||
########################################################################
|
||||
want_r1_remote_cust1_routes = [
|
||||
{'p':'5.1.0.0/24', 'n':'3.3.3.3'},
|
||||
{'p':'5.1.1.0/24', 'n':'3.3.3.3'},
|
||||
{'p':'99.0.0.2/32', 'n':'3.3.3.3'},
|
||||
|
||||
{'p':'5.1.2.0/24', 'n':'4.4.4.4'},
|
||||
{'p':'5.1.3.0/24', 'n':'4.4.4.4'},
|
||||
{'p':'99.0.0.3/32', 'n':'4.4.4.4'},
|
||||
|
||||
{'p':'5.4.2.0/24', 'n':'4.4.4.4'},
|
||||
{'p':'5.4.3.0/24', 'n':'4.4.4.4'},
|
||||
{'p':'99.0.0.3/32', 'n':'4.4.4.4'},
|
||||
{"p": "5.1.0.0/24", "n": "3.3.3.3"},
|
||||
{"p": "5.1.1.0/24", "n": "3.3.3.3"},
|
||||
{"p": "99.0.0.2/32", "n": "3.3.3.3"},
|
||||
{"p": "5.1.2.0/24", "n": "4.4.4.4"},
|
||||
{"p": "5.1.3.0/24", "n": "4.4.4.4"},
|
||||
{"p": "99.0.0.3/32", "n": "4.4.4.4"},
|
||||
{"p": "5.4.2.0/24", "n": "4.4.4.4"},
|
||||
{"p": "5.4.3.0/24", "n": "4.4.4.4"},
|
||||
{"p": "99.0.0.3/32", "n": "4.4.4.4"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('r1','ipv4','r1-cust1','Customer 1 routes in r1 vrf',want_r1_remote_cust1_routes)
|
||||
bgpribRequireUnicastRoutes(
|
||||
"r1", "ipv4", "r1-cust1", "Customer 1 routes in r1 vrf", want_r1_remote_cust1_routes
|
||||
)
|
||||
|
||||
want_r3_remote_cust1_routes = [
|
||||
{'p':'5.1.0.0/24', 'n':'1.1.1.1'},
|
||||
{'p':'5.1.1.0/24', 'n':'1.1.1.1'},
|
||||
{'p':'99.0.0.1/32', 'n':'1.1.1.1'},
|
||||
|
||||
{'p':'5.1.2.0/24', 'n':'4.4.4.4'},
|
||||
{'p':'5.1.3.0/24', 'n':'4.4.4.4'},
|
||||
{'p':'99.0.0.3/32', 'n':'4.4.4.4'},
|
||||
|
||||
{'p':'5.4.2.0/24', 'n':'4.4.4.4'},
|
||||
{'p':'5.4.3.0/24', 'n':'4.4.4.4'},
|
||||
{'p':'99.0.0.3/32', 'n':'4.4.4.4'},
|
||||
{"p": "5.1.0.0/24", "n": "1.1.1.1"},
|
||||
{"p": "5.1.1.0/24", "n": "1.1.1.1"},
|
||||
{"p": "99.0.0.1/32", "n": "1.1.1.1"},
|
||||
{"p": "5.1.2.0/24", "n": "4.4.4.4"},
|
||||
{"p": "5.1.3.0/24", "n": "4.4.4.4"},
|
||||
{"p": "99.0.0.3/32", "n": "4.4.4.4"},
|
||||
{"p": "5.4.2.0/24", "n": "4.4.4.4"},
|
||||
{"p": "5.4.3.0/24", "n": "4.4.4.4"},
|
||||
{"p": "99.0.0.3/32", "n": "4.4.4.4"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('r3','ipv4','r3-cust1','Customer 1 routes in r3 vrf',want_r3_remote_cust1_routes)
|
||||
bgpribRequireUnicastRoutes(
|
||||
"r3", "ipv4", "r3-cust1", "Customer 1 routes in r3 vrf", want_r3_remote_cust1_routes
|
||||
)
|
||||
|
||||
want_r4_remote_cust1_routes = [
|
||||
{'p':'5.1.0.0/24', 'n':'1.1.1.1'},
|
||||
{'p':'5.1.1.0/24', 'n':'1.1.1.1'},
|
||||
{'p':'5.1.0.0/24', 'n':'3.3.3.3'},
|
||||
{'p':'5.1.1.0/24', 'n':'3.3.3.3'},
|
||||
{'p':'99.0.0.1/32', 'n':'1.1.1.1'},
|
||||
{'p':'99.0.0.2/32', 'n':'3.3.3.3'},
|
||||
{"p": "5.1.0.0/24", "n": "1.1.1.1"},
|
||||
{"p": "5.1.1.0/24", "n": "1.1.1.1"},
|
||||
{"p": "5.1.0.0/24", "n": "3.3.3.3"},
|
||||
{"p": "5.1.1.0/24", "n": "3.3.3.3"},
|
||||
{"p": "99.0.0.1/32", "n": "1.1.1.1"},
|
||||
{"p": "99.0.0.2/32", "n": "3.3.3.3"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('r4','ipv4','r4-cust1','Customer 1 routes in r4 vrf',want_r4_remote_cust1_routes)
|
||||
bgpribRequireUnicastRoutes(
|
||||
"r4", "ipv4", "r4-cust1", "Customer 1 routes in r4 vrf", want_r4_remote_cust1_routes
|
||||
)
|
||||
|
||||
want_r4_remote_cust2_routes = [
|
||||
{'p':'5.1.0.0/24', 'n':'1.1.1.1'},
|
||||
{'p':'5.1.1.0/24', 'n':'1.1.1.1'},
|
||||
{'p':'5.1.0.0/24', 'n':'3.3.3.3'},
|
||||
{'p':'5.1.1.0/24', 'n':'3.3.3.3'},
|
||||
{'p':'99.0.0.1/32', 'n':'1.1.1.1'},
|
||||
{'p':'99.0.0.2/32', 'n':'3.3.3.3'},
|
||||
{"p": "5.1.0.0/24", "n": "1.1.1.1"},
|
||||
{"p": "5.1.1.0/24", "n": "1.1.1.1"},
|
||||
{"p": "5.1.0.0/24", "n": "3.3.3.3"},
|
||||
{"p": "5.1.1.0/24", "n": "3.3.3.3"},
|
||||
{"p": "99.0.0.1/32", "n": "1.1.1.1"},
|
||||
{"p": "99.0.0.2/32", "n": "3.3.3.3"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('r4','ipv4','r4-cust2','Customer 2 routes in r4 vrf',want_r4_remote_cust2_routes)
|
||||
bgpribRequireUnicastRoutes(
|
||||
"r4", "ipv4", "r4-cust2", "Customer 2 routes in r4 vrf", want_r4_remote_cust2_routes
|
||||
)
|
||||
|
||||
|
||||
#########################################################################
|
||||
@ -270,49 +327,78 @@ bgpribRequireUnicastRoutes('r4','ipv4','r4-cust2','Customer 2 routes in r4 vrf',
|
||||
# r1 vtysh -c "show bgp vrf r1-cust1 ipv4"
|
||||
# r1 vtysh -c "show bgp vrf r1-cust1 ipv4 5.1.2.0/24"
|
||||
|
||||
luCommand('ce1','vtysh -c "show bgp ipv4 uni"','10 routes and 10','wait','Local and remote routes', 10)
|
||||
luCommand(
|
||||
"ce1",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"10 routes and 10",
|
||||
"wait",
|
||||
"Local and remote routes",
|
||||
10,
|
||||
)
|
||||
want = [
|
||||
{'p':'5.1.2.0/24', 'n':'192.168.1.1'},
|
||||
{'p':'5.1.3.0/24', 'n':'192.168.1.1'},
|
||||
{'p':'5.4.2.0/24', 'n':'192.168.1.1'},
|
||||
{'p':'5.4.3.0/24', 'n':'192.168.1.1'},
|
||||
{"p": "5.1.2.0/24", "n": "192.168.1.1"},
|
||||
{"p": "5.1.3.0/24", "n": "192.168.1.1"},
|
||||
{"p": "5.4.2.0/24", "n": "192.168.1.1"},
|
||||
{"p": "5.4.3.0/24", "n": "192.168.1.1"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('ce1','ipv4','','Cust 1 routes from remote',want)
|
||||
bgpribRequireUnicastRoutes("ce1", "ipv4", "", "Cust 1 routes from remote", want)
|
||||
|
||||
luCommand('ce2','vtysh -c "show bgp ipv4 uni"','10 routes and 12','wait','Local and remote routes', 10)
|
||||
luCommand(
|
||||
"ce2",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"10 routes and 12",
|
||||
"wait",
|
||||
"Local and remote routes",
|
||||
10,
|
||||
)
|
||||
want = [
|
||||
{'p':'5.1.0.0/24', 'n':'192.168.1.1'},
|
||||
{'p':'5.1.1.0/24', 'n':'192.168.1.1'},
|
||||
{'p':'5.1.2.0/24', 'n':'192.168.1.1'},
|
||||
{'p':'5.1.3.0/24', 'n':'192.168.1.1'},
|
||||
{'p':'5.4.2.0/24', 'n':'192.168.1.1'},
|
||||
{'p':'5.4.3.0/24', 'n':'192.168.1.1'},
|
||||
{"p": "5.1.0.0/24", "n": "192.168.1.1"},
|
||||
{"p": "5.1.1.0/24", "n": "192.168.1.1"},
|
||||
{"p": "5.1.2.0/24", "n": "192.168.1.1"},
|
||||
{"p": "5.1.3.0/24", "n": "192.168.1.1"},
|
||||
{"p": "5.4.2.0/24", "n": "192.168.1.1"},
|
||||
{"p": "5.4.3.0/24", "n": "192.168.1.1"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('ce2','ipv4','','Cust 1 routes from remote',want)
|
||||
bgpribRequireUnicastRoutes("ce2", "ipv4", "", "Cust 1 routes from remote", want)
|
||||
|
||||
# human readable output for debugging
|
||||
luCommand('r4','vtysh -c "show bgp vrf r4-cust1 ipv4 uni"')
|
||||
luCommand('r4','vtysh -c "show bgp vrf r4-cust2 ipv4 uni"')
|
||||
luCommand('r4','vtysh -c "show bgp ipv4 vpn"')
|
||||
luCommand('r4','vtysh -c "show ip route vrf r4-cust1"')
|
||||
luCommand('r4','vtysh -c "show ip route vrf r4-cust2"')
|
||||
luCommand("r4", 'vtysh -c "show bgp vrf r4-cust1 ipv4 uni"')
|
||||
luCommand("r4", 'vtysh -c "show bgp vrf r4-cust2 ipv4 uni"')
|
||||
luCommand("r4", 'vtysh -c "show bgp ipv4 vpn"')
|
||||
luCommand("r4", 'vtysh -c "show ip route vrf r4-cust1"')
|
||||
luCommand("r4", 'vtysh -c "show ip route vrf r4-cust2"')
|
||||
|
||||
luCommand('ce3','vtysh -c "show bgp ipv4 uni"','10 routes and 10','wait','Local and remote routes', 10)
|
||||
luCommand(
|
||||
"ce3",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"10 routes and 10",
|
||||
"wait",
|
||||
"Local and remote routes",
|
||||
10,
|
||||
)
|
||||
# Requires bvl-bug-degenerate-no-label fix (FRR PR #2053)
|
||||
want = [
|
||||
{'p':'5.1.0.0/24', 'n':'192.168.1.1'},
|
||||
{'p':'5.1.1.0/24', 'n':'192.168.1.1'},
|
||||
{'p':'5.4.2.0/24', 'n':'192.168.1.1'},
|
||||
{'p':'5.4.3.0/24', 'n':'192.168.1.1'},
|
||||
{"p": "5.1.0.0/24", "n": "192.168.1.1"},
|
||||
{"p": "5.1.1.0/24", "n": "192.168.1.1"},
|
||||
{"p": "5.4.2.0/24", "n": "192.168.1.1"},
|
||||
{"p": "5.4.3.0/24", "n": "192.168.1.1"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('ce3','ipv4','','Cust 1 routes from remote',want)
|
||||
bgpribRequireUnicastRoutes("ce3", "ipv4", "", "Cust 1 routes from remote", want)
|
||||
|
||||
luCommand('ce4','vtysh -c "show bgp vrf ce4-cust2 ipv4 uni"','10 routes and 10','wait','Local and remote routes', 10)
|
||||
luCommand(
|
||||
"ce4",
|
||||
'vtysh -c "show bgp vrf ce4-cust2 ipv4 uni"',
|
||||
"10 routes and 10",
|
||||
"wait",
|
||||
"Local and remote routes",
|
||||
10,
|
||||
)
|
||||
want = [
|
||||
{'p':'5.1.0.0/24', 'n':'192.168.2.1'},
|
||||
{'p':'5.1.1.0/24', 'n':'192.168.2.1'},
|
||||
{'p':'5.1.2.0/24', 'n':'192.168.2.1'},
|
||||
{'p':'5.1.3.0/24', 'n':'192.168.2.1'},
|
||||
{"p": "5.1.0.0/24", "n": "192.168.2.1"},
|
||||
{"p": "5.1.1.0/24", "n": "192.168.2.1"},
|
||||
{"p": "5.1.2.0/24", "n": "192.168.2.1"},
|
||||
{"p": "5.1.3.0/24", "n": "192.168.2.1"},
|
||||
]
|
||||
bgpribRequireUnicastRoutes('ce4','ipv4','ce4-cust2','Cust 2 routes from remote',want)
|
||||
|
||||
bgpribRequireUnicastRoutes(
|
||||
"ce4", "ipv4", "ce4-cust2", "Cust 2 routes from remote", want
|
||||
)
|
||||
|
@ -1,17 +1,120 @@
|
||||
from lutil import luCommand
|
||||
luCommand('r1','vtysh -c "clear vrf r1-cust1 prefix 99.0.0.1/32"','.','none','Cleared VRF route')
|
||||
luCommand('r3','vtysh -c "clear vrf r3-cust1 prefix 99.0.0.2/32"','.','none','Cleared VRF route')
|
||||
luCommand('r4','vtysh -c "clear vrf r3-cust1 prefix 99.0.0.3/32"','.','none','Cleared VRF route')
|
||||
luCommand('r1','vtysh -c "show vnc registrations local"','99.0.0.1','fail','Local Registration cleared')
|
||||
luCommand('r3','vtysh -c "show vnc registrations local"','99.0.0.2','fail','Local Registration cleared')
|
||||
luCommand('r4','vtysh -c "show vnc registrations local"','99.0.0.3','fail','Local Registration cleared')
|
||||
luCommand('r1','vtysh -c "show bgp ipv4 uni"','2 routes and 2','wait','Unicast SAFI updated', 10)
|
||||
luCommand('r2','vtysh -c "show bgp ipv4 uni"','No BGP prefixes displayed','pass','Unicast SAFI')
|
||||
luCommand('r3','vtysh -c "show bgp ipv4 uni"','2 routes and 2','wait','Unicast SAFI updated', 10)
|
||||
luCommand('r4','vtysh -c "show bgp ipv4 uni"','2 routes and 2','wait','Unicast SAFI updated', 10)
|
||||
luCommand('ce1','vtysh -c "show bgp ipv4 uni"','2 routes and 2','wait','Local and remote routes', 10)
|
||||
luCommand('ce2','vtysh -c "show bgp ipv4 uni"','2 routes and 2','wait','Local and remote routes', 10)
|
||||
luCommand('ce3','vtysh -c "show bgp ipv4 uni"','2 routes and 2','wait','Local and remote routes', 10)
|
||||
luCommand('r1','vtysh -c "show vnc registrations remote"','Prefix ','fail','Remote Registration cleared')
|
||||
luCommand('r3','vtysh -c "show vnc registrations remote"','Prefix ','fail','Remote Registration cleared')
|
||||
luCommand('r4','vtysh -c "show vnc registrations remote"','Prefix ','fail','Remote Registration cleared')
|
||||
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "clear vrf r1-cust1 prefix 99.0.0.1/32"',
|
||||
".",
|
||||
"none",
|
||||
"Cleared VRF route",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "clear vrf r3-cust1 prefix 99.0.0.2/32"',
|
||||
".",
|
||||
"none",
|
||||
"Cleared VRF route",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "clear vrf r3-cust1 prefix 99.0.0.3/32"',
|
||||
".",
|
||||
"none",
|
||||
"Cleared VRF route",
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show vnc registrations local"',
|
||||
"99.0.0.1",
|
||||
"fail",
|
||||
"Local Registration cleared",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show vnc registrations local"',
|
||||
"99.0.0.2",
|
||||
"fail",
|
||||
"Local Registration cleared",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show vnc registrations local"',
|
||||
"99.0.0.3",
|
||||
"fail",
|
||||
"Local Registration cleared",
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"2 routes and 2",
|
||||
"wait",
|
||||
"Unicast SAFI updated",
|
||||
10,
|
||||
)
|
||||
luCommand(
|
||||
"r2",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"No BGP prefixes displayed",
|
||||
"pass",
|
||||
"Unicast SAFI",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"2 routes and 2",
|
||||
"wait",
|
||||
"Unicast SAFI updated",
|
||||
10,
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"2 routes and 2",
|
||||
"wait",
|
||||
"Unicast SAFI updated",
|
||||
10,
|
||||
)
|
||||
luCommand(
|
||||
"ce1",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"2 routes and 2",
|
||||
"wait",
|
||||
"Local and remote routes",
|
||||
10,
|
||||
)
|
||||
luCommand(
|
||||
"ce2",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"2 routes and 2",
|
||||
"wait",
|
||||
"Local and remote routes",
|
||||
10,
|
||||
)
|
||||
luCommand(
|
||||
"ce3",
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
"2 routes and 2",
|
||||
"wait",
|
||||
"Local and remote routes",
|
||||
10,
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"Prefix ",
|
||||
"fail",
|
||||
"Remote Registration cleared",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"Prefix ",
|
||||
"fail",
|
||||
"Remote Registration cleared",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show vnc registrations remote"',
|
||||
"Prefix ",
|
||||
"fail",
|
||||
"Remote Registration cleared",
|
||||
)
|
||||
|
@ -1,7 +1,30 @@
|
||||
from lutil import luCommand
|
||||
|
||||
luCommand('r1','/usr/lib/frr/vtysh -c "conf ter" -c "no router bgp 5227 vrf r1-cust1" -c "no router bgp 5226"','.','none','Cleared bgp instances')
|
||||
luCommand('r2','/usr/lib/frr/vtysh -c "conf ter" -c "no router bgp 5226"','.','none','Cleared bgp instances')
|
||||
luCommand('r3','/usr/lib/frr/vtysh -c "conf ter" -c "no router bgp 5227 vrf r3-cust1" -c "no router bgp 5226"','.','none','Cleared bgp instances')
|
||||
luCommand('r4','/usr/lib/frr/vtysh -c "conf ter" -c "no router bgp 5228 vrf r4-cust2" -c "no router bgp 5227 vrf r4-cust1" -c "no router bgp 5226"','.','none','Cleared bgp instances')
|
||||
|
||||
luCommand(
|
||||
"r1",
|
||||
'/usr/lib/frr/vtysh -c "conf ter" -c "no router bgp 5227 vrf r1-cust1" -c "no router bgp 5226"',
|
||||
".",
|
||||
"none",
|
||||
"Cleared bgp instances",
|
||||
)
|
||||
luCommand(
|
||||
"r2",
|
||||
'/usr/lib/frr/vtysh -c "conf ter" -c "no router bgp 5226"',
|
||||
".",
|
||||
"none",
|
||||
"Cleared bgp instances",
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'/usr/lib/frr/vtysh -c "conf ter" -c "no router bgp 5227 vrf r3-cust1" -c "no router bgp 5226"',
|
||||
".",
|
||||
"none",
|
||||
"Cleared bgp instances",
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'/usr/lib/frr/vtysh -c "conf ter" -c "no router bgp 5228 vrf r4-cust2" -c "no router bgp 5227 vrf r4-cust1" -c "no router bgp 5226"',
|
||||
".",
|
||||
"none",
|
||||
"Cleared bgp instances",
|
||||
)
|
||||
|
@ -1,9 +1,22 @@
|
||||
from lutil import luCommand
|
||||
rtrs = ['ce1', 'ce2', 'ce3', 'r1', 'r2', 'r3', 'r4']
|
||||
|
||||
rtrs = ["ce1", "ce2", "ce3", "r1", "r2", "r3", "r4"]
|
||||
for rtr in rtrs:
|
||||
ret = luCommand(rtr, 'vtysh -c "show bgp neigh"', 'Notification received .([A-Za-z0-9/ ]*)', 'none', 'collect neighbor stats')
|
||||
ret = luCommand(
|
||||
rtr,
|
||||
'vtysh -c "show bgp neigh"',
|
||||
"Notification received .([A-Za-z0-9/ ]*)",
|
||||
"none",
|
||||
"collect neighbor stats",
|
||||
)
|
||||
found = luLast()
|
||||
if ret != False and found != None:
|
||||
val = found.group(1)
|
||||
ret = luCommand(rtr, 'vtysh -c "show bgp neigh"', 'Notification received', 'fail', 'Notify RXed! {}'.format(val))
|
||||
#done
|
||||
ret = luCommand(
|
||||
rtr,
|
||||
'vtysh -c "show bgp neigh"',
|
||||
"Notification received",
|
||||
"fail",
|
||||
"Notify RXed! {}".format(val),
|
||||
)
|
||||
# done
|
||||
|
@ -1,25 +1,87 @@
|
||||
from lutil import luCommand
|
||||
ret = luCommand('ce1', 'vtysh -c "show ip route" | grep -c \\ 10\\.\\*/32','(.*)','pass', 'Looking for sharp routes')
|
||||
|
||||
ret = luCommand(
|
||||
"ce1",
|
||||
'vtysh -c "show ip route" | grep -c \\ 10\\.\\*/32',
|
||||
"(.*)",
|
||||
"pass",
|
||||
"Looking for sharp routes",
|
||||
)
|
||||
found = luLast()
|
||||
if ret != False and found != None:
|
||||
num = int(found.group())
|
||||
luCommand('ce3', 'vtysh -c "show bgp sum"',
|
||||
'.', 'pass', 'See %s sharp routes' % num)
|
||||
luCommand(
|
||||
"ce3", 'vtysh -c "show bgp sum"', ".", "pass", "See %s sharp routes" % num
|
||||
)
|
||||
if num > 0:
|
||||
rtrs = ['ce1', 'ce2', 'ce3']
|
||||
rtrs = ["ce1", "ce2", "ce3"]
|
||||
for rtr in rtrs:
|
||||
luCommand(rtr, 'vtysh -c "show bgp ipv4 uni" | grep Display','.', 'none', 'BGP routes pre remove')
|
||||
luCommand(rtr, 'ip route show | cat -n | tail','.', 'none', 'Linux routes pre remove')
|
||||
wait = 2*num/500
|
||||
luCommand('ce1', 'vtysh -c "sharp remove routes 10.0.0.0 {}"'.format(num),'.','none','Removing {} routes'.format(num))
|
||||
luCommand('ce2', 'vtysh -c "sharp remove routes 10.0.0.0 {}"'.format(num),'.','none','Removing {} routes'.format(num))
|
||||
luCommand(
|
||||
rtr,
|
||||
'vtysh -c "show bgp ipv4 uni" | grep Display',
|
||||
".",
|
||||
"none",
|
||||
"BGP routes pre remove",
|
||||
)
|
||||
luCommand(
|
||||
rtr,
|
||||
"ip route show | cat -n | tail",
|
||||
".",
|
||||
"none",
|
||||
"Linux routes pre remove",
|
||||
)
|
||||
wait = 2 * num / 500
|
||||
luCommand(
|
||||
"ce1",
|
||||
'vtysh -c "sharp remove routes 10.0.0.0 {}"'.format(num),
|
||||
".",
|
||||
"none",
|
||||
"Removing {} routes".format(num),
|
||||
)
|
||||
luCommand(
|
||||
"ce2",
|
||||
'vtysh -c "sharp remove routes 10.0.0.0 {}"'.format(num),
|
||||
".",
|
||||
"none",
|
||||
"Removing {} routes".format(num),
|
||||
)
|
||||
for rtr in rtrs:
|
||||
luCommand(rtr, 'vtysh -c "show bgp ipv4 uni" | grep Display',' 10 route', 'wait', 'BGP routes removed', wait, wait_time=10)
|
||||
luCommand(rtr, 'vtysh -c "show bgp ipv4 uni"','.', 'none', 'BGP routes post remove')
|
||||
luCommand(
|
||||
rtr,
|
||||
'vtysh -c "show bgp ipv4 uni" | grep Display',
|
||||
" 10 route",
|
||||
"wait",
|
||||
"BGP routes removed",
|
||||
wait,
|
||||
wait_time=10,
|
||||
)
|
||||
luCommand(
|
||||
rtr,
|
||||
'vtysh -c "show bgp ipv4 uni"',
|
||||
".",
|
||||
"none",
|
||||
"BGP routes post remove",
|
||||
)
|
||||
for rtr in rtrs:
|
||||
luCommand(rtr, 'ip route show | grep -c \\^10\\.','^0$', 'wait', 'Linux routes removed', wait, wait_time=10)
|
||||
luCommand(rtr, 'ip route show','.', 'none', 'Linux routes post remove')
|
||||
rtrs = ['r1', 'r3', 'r4']
|
||||
luCommand(
|
||||
rtr,
|
||||
"ip route show | grep -c \\^10\\.",
|
||||
"^0$",
|
||||
"wait",
|
||||
"Linux routes removed",
|
||||
wait,
|
||||
wait_time=10,
|
||||
)
|
||||
luCommand(rtr, "ip route show", ".", "none", "Linux routes post remove")
|
||||
rtrs = ["r1", "r3", "r4"]
|
||||
for rtr in rtrs:
|
||||
luCommand(rtr, 'ip route show vrf {}-cust1 | grep -c \\^10\\.'.format(rtr),'^0$','wait','VRF route removed',wait, wait_time=10)
|
||||
#done
|
||||
luCommand(
|
||||
rtr,
|
||||
"ip route show vrf {}-cust1 | grep -c \\^10\\.".format(rtr),
|
||||
"^0$",
|
||||
"wait",
|
||||
"VRF route removed",
|
||||
wait,
|
||||
wait_time=10,
|
||||
)
|
||||
# done
|
||||
|
@ -1,29 +1,38 @@
|
||||
from lutil import luCommand
|
||||
|
||||
num = 50000
|
||||
b = int(num/(256*256))
|
||||
b = int(num / (256 * 256))
|
||||
if b > 0:
|
||||
r = num - b * (256*256)
|
||||
r = num - b * (256 * 256)
|
||||
else:
|
||||
r = num
|
||||
c = int(r/256)
|
||||
c = int(r / 256)
|
||||
if c > 0:
|
||||
d = r - c * 256 - 1
|
||||
d = r - c * 256 - 1
|
||||
else:
|
||||
d = r
|
||||
wait = 2*num/1000
|
||||
wait = 2 * num / 1000
|
||||
mem_z = {}
|
||||
mem_b = {}
|
||||
rtrs = ['ce1', 'ce2', 'ce3', 'r1', 'r2', 'r3', 'r4']
|
||||
rtrs = ["ce1", "ce2", "ce3", "r1", "r2", "r3", "r4"]
|
||||
for rtr in rtrs:
|
||||
mem_z[rtr] = {'value': 0, 'units': 'unknown'}
|
||||
mem_b[rtr] = {'value': 0, 'units': 'unknown'}
|
||||
ret = luCommand(rtr, 'vtysh -c "show memory"', 'zebra: System allocator statistics: Total heap allocated: *(\d*) ([A-Za-z]*) .*bgpd: System allocator statistics: Total heap allocated: *(\d*) ([A-Za-z]*)', 'none', 'collect bgpd memory stats')
|
||||
mem_z[rtr] = {"value": 0, "units": "unknown"}
|
||||
mem_b[rtr] = {"value": 0, "units": "unknown"}
|
||||
ret = luCommand(
|
||||
rtr,
|
||||
'vtysh -c "show memory"',
|
||||
"zebra: System allocator statistics: Total heap allocated: *(\d*) ([A-Za-z]*) .*bgpd: System allocator statistics: Total heap allocated: *(\d*) ([A-Za-z]*)",
|
||||
"none",
|
||||
"collect bgpd memory stats",
|
||||
)
|
||||
found = luLast()
|
||||
if ret != False and found != None:
|
||||
mem_z[rtr] = {'value': int(found.group(1)), 'units': found.group(2)}
|
||||
mem_b[rtr] = {'value': int(found.group(3)), 'units': found.group(4)}
|
||||
mem_z[rtr] = {"value": int(found.group(1)), "units": found.group(2)}
|
||||
mem_b[rtr] = {"value": int(found.group(3)), "units": found.group(4)}
|
||||
|
||||
luCommand('ce1', 'vtysh -c "show mem"', 'qmem sharpd', 'none','check if sharpd running')
|
||||
luCommand(
|
||||
"ce1", 'vtysh -c "show mem"', "qmem sharpd", "none", "check if sharpd running"
|
||||
)
|
||||
doSharp = False
|
||||
found = luLast()
|
||||
if ret != False and found != None:
|
||||
@ -31,47 +40,195 @@ if ret != False and found != None:
|
||||
doSharp = True
|
||||
|
||||
if doSharp != True:
|
||||
luCommand('ce1', 'vtysh -c "sharp data nexthop"', '.', 'pass','sharpd NOT running, skipping test')
|
||||
luCommand(
|
||||
"ce1",
|
||||
'vtysh -c "sharp data nexthop"',
|
||||
".",
|
||||
"pass",
|
||||
"sharpd NOT running, skipping test",
|
||||
)
|
||||
else:
|
||||
luCommand('ce1', 'vtysh -c "sharp install routes 10.0.0.0 nexthop 99.0.0.1 {}"'.format(num),'','pass','Adding {} routes'.format(num))
|
||||
luCommand('ce2', 'vtysh -c "sharp install routes 10.0.0.0 nexthop 99.0.0.2 {}"'.format(num),'','pass','Adding {} routes'.format(num))
|
||||
rtrs = ['ce1', 'ce2', 'ce3']
|
||||
luCommand(
|
||||
"ce1",
|
||||
'vtysh -c "sharp install routes 10.0.0.0 nexthop 99.0.0.1 {}"'.format(num),
|
||||
"",
|
||||
"pass",
|
||||
"Adding {} routes".format(num),
|
||||
)
|
||||
luCommand(
|
||||
"ce2",
|
||||
'vtysh -c "sharp install routes 10.0.0.0 nexthop 99.0.0.2 {}"'.format(num),
|
||||
"",
|
||||
"pass",
|
||||
"Adding {} routes".format(num),
|
||||
)
|
||||
rtrs = ["ce1", "ce2", "ce3"]
|
||||
for rtr in rtrs:
|
||||
luCommand(rtr, 'vtysh -c "show bgp ipv4 uni 10.{}.{}.{}"'.format(b,c,d), 'Last update:', 'wait', 'RXed last route, 10.{}.{}.{}'.format(b,c,d), wait, wait_time=10)
|
||||
luCommand(rtr, 'vtysh -c "show bgp ipv4 uni" | grep -c 10\\.\\*/32', str(num), 'wait', 'See all sharp routes in BGP', wait, wait_time=10)
|
||||
luCommand('r1', 'vtysh -c "show bgp vrf r1-cust1 ipv4 uni 10.{}.{}.{}"'.format(b,c,d),'99.0.0.1','wait','RXed -> 10.{}.{}.{} from CE1'.format(b,c,d), wait, wait_time=10)
|
||||
luCommand('r3', 'vtysh -c "show bgp vrf r3-cust1 ipv4 uni 10.{}.{}.{}"'.format(b,c,d),'99.0.0.2','wait','RXed -> 10.{}.{}.{} from CE2'.format(b,c,d), wait, wait_time=10)
|
||||
luCommand('r1', 'vtysh -c "show bgp ipv4 vpn 10.{}.{}.{}"'.format(b,c,d),'99.0.0.1','wait','see VPN safi -> 10.{}.{}.{} from CE1'.format(b,c,d))
|
||||
luCommand('r3', 'vtysh -c "show bgp ipv4 vpn 10.{}.{}.{}"'.format(b,c,d),'99.0.0.2','wait','see VPN safi -> 10.{}.{}.{} from CE2'.format(b,c,d))
|
||||
luCommand('r3', 'vtysh -c "show bgp ipv4 vpn 10.{}.{}.{}"'.format(b,c,d),'1.1.1.1','wait','see VPN safi -> 10.{}.{}.{} from CE1'.format(b,c,d))
|
||||
luCommand('r1', 'vtysh -c "show bgp ipv4 vpn 10.{}.{}.{}"'.format(b,c,d),'3.3.3.3','wait','see VPN safi -> 10.{}.{}.{} from CE2'.format(b,c,d))
|
||||
luCommand('r4', 'vtysh -c "show bgp ipv4 vpn 10.{}.{}.{}"'.format(b,c,d),'1.1.1.1','wait','see VPN safi -> 10.{}.{}.{} from CE1'.format(b,c,d))
|
||||
luCommand('r4', 'vtysh -c "show bgp ipv4 vpn 10.{}.{}.{}"'.format(b,c,d),'3.3.3.3','wait','see VPN safi -> 10.{}.{}.{} from CE2'.format(b,c,d))
|
||||
rtrs = ['ce1', 'ce2', 'ce3']
|
||||
luCommand(
|
||||
rtr,
|
||||
'vtysh -c "show bgp ipv4 uni 10.{}.{}.{}"'.format(b, c, d),
|
||||
"Last update:",
|
||||
"wait",
|
||||
"RXed last route, 10.{}.{}.{}".format(b, c, d),
|
||||
wait,
|
||||
wait_time=10,
|
||||
)
|
||||
luCommand(
|
||||
rtr,
|
||||
'vtysh -c "show bgp ipv4 uni" | grep -c 10\\.\\*/32',
|
||||
str(num),
|
||||
"wait",
|
||||
"See all sharp routes in BGP",
|
||||
wait,
|
||||
wait_time=10,
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show bgp vrf r1-cust1 ipv4 uni 10.{}.{}.{}"'.format(b, c, d),
|
||||
"99.0.0.1",
|
||||
"wait",
|
||||
"RXed -> 10.{}.{}.{} from CE1".format(b, c, d),
|
||||
wait,
|
||||
wait_time=10,
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show bgp vrf r3-cust1 ipv4 uni 10.{}.{}.{}"'.format(b, c, d),
|
||||
"99.0.0.2",
|
||||
"wait",
|
||||
"RXed -> 10.{}.{}.{} from CE2".format(b, c, d),
|
||||
wait,
|
||||
wait_time=10,
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show bgp ipv4 vpn 10.{}.{}.{}"'.format(b, c, d),
|
||||
"99.0.0.1",
|
||||
"wait",
|
||||
"see VPN safi -> 10.{}.{}.{} from CE1".format(b, c, d),
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show bgp ipv4 vpn 10.{}.{}.{}"'.format(b, c, d),
|
||||
"99.0.0.2",
|
||||
"wait",
|
||||
"see VPN safi -> 10.{}.{}.{} from CE2".format(b, c, d),
|
||||
)
|
||||
luCommand(
|
||||
"r3",
|
||||
'vtysh -c "show bgp ipv4 vpn 10.{}.{}.{}"'.format(b, c, d),
|
||||
"1.1.1.1",
|
||||
"wait",
|
||||
"see VPN safi -> 10.{}.{}.{} from CE1".format(b, c, d),
|
||||
)
|
||||
luCommand(
|
||||
"r1",
|
||||
'vtysh -c "show bgp ipv4 vpn 10.{}.{}.{}"'.format(b, c, d),
|
||||
"3.3.3.3",
|
||||
"wait",
|
||||
"see VPN safi -> 10.{}.{}.{} from CE2".format(b, c, d),
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show bgp ipv4 vpn 10.{}.{}.{}"'.format(b, c, d),
|
||||
"1.1.1.1",
|
||||
"wait",
|
||||
"see VPN safi -> 10.{}.{}.{} from CE1".format(b, c, d),
|
||||
)
|
||||
luCommand(
|
||||
"r4",
|
||||
'vtysh -c "show bgp ipv4 vpn 10.{}.{}.{}"'.format(b, c, d),
|
||||
"3.3.3.3",
|
||||
"wait",
|
||||
"see VPN safi -> 10.{}.{}.{} from CE2".format(b, c, d),
|
||||
)
|
||||
rtrs = ["ce1", "ce2", "ce3"]
|
||||
for rtr in rtrs:
|
||||
luCommand(rtr, 'ip route get 10.{}.{}.{}'.format(b,c,d),'dev','wait','Route to 10.{}.{}.{} available'.format(b,c,d), wait, wait_time=10)
|
||||
luCommand(rtr, 'ip route show | grep -c \\^10\\.', str(num), 'wait', 'See {} linux routes'.format(num), wait, wait_time=10)
|
||||
luCommand(
|
||||
rtr,
|
||||
"ip route get 10.{}.{}.{}".format(b, c, d),
|
||||
"dev",
|
||||
"wait",
|
||||
"Route to 10.{}.{}.{} available".format(b, c, d),
|
||||
wait,
|
||||
wait_time=10,
|
||||
)
|
||||
luCommand(
|
||||
rtr,
|
||||
"ip route show | grep -c \\^10\\.",
|
||||
str(num),
|
||||
"wait",
|
||||
"See {} linux routes".format(num),
|
||||
wait,
|
||||
wait_time=10,
|
||||
)
|
||||
|
||||
rtrs = ['r1', 'r3', 'r4']
|
||||
rtrs = ["r1", "r3", "r4"]
|
||||
for rtr in rtrs:
|
||||
luCommand(rtr, 'ip route get vrf {}-cust1 10.{}.{}.{}'.format(rtr,b,c,d),'dev','wait','VRF route available',wait, wait_time=10)
|
||||
luCommand(rtr, 'ip route show vrf {}-cust1 | grep -c \\^10\\.'.format(rtr), str(num), 'wait','See {} linux routes'.format(num), wait, wait_time=10)
|
||||
rtrs = ['ce1', 'ce2', 'ce3', 'r1', 'r2', 'r3', 'r4']
|
||||
luCommand(
|
||||
rtr,
|
||||
"ip route get vrf {}-cust1 10.{}.{}.{}".format(rtr, b, c, d),
|
||||
"dev",
|
||||
"wait",
|
||||
"VRF route available",
|
||||
wait,
|
||||
wait_time=10,
|
||||
)
|
||||
luCommand(
|
||||
rtr,
|
||||
"ip route show vrf {}-cust1 | grep -c \\^10\\.".format(rtr),
|
||||
str(num),
|
||||
"wait",
|
||||
"See {} linux routes".format(num),
|
||||
wait,
|
||||
wait_time=10,
|
||||
)
|
||||
rtrs = ["ce1", "ce2", "ce3", "r1", "r2", "r3", "r4"]
|
||||
for rtr in rtrs:
|
||||
ret = luCommand(rtr, 'vtysh -c "show memory"', 'zebra: System allocator statistics: Total heap allocated: *(\d*) ([A-Za-z]*) .*bgpd: System allocator statistics: Total heap allocated: *(\d*) ([A-Za-z]*)', 'none', 'collect bgpd memory stats')
|
||||
ret = luCommand(
|
||||
rtr,
|
||||
'vtysh -c "show memory"',
|
||||
"zebra: System allocator statistics: Total heap allocated: *(\d*) ([A-Za-z]*) .*bgpd: System allocator statistics: Total heap allocated: *(\d*) ([A-Za-z]*)",
|
||||
"none",
|
||||
"collect bgpd memory stats",
|
||||
)
|
||||
found = luLast()
|
||||
if ret != False and found != None:
|
||||
val_z = int(found.group(1))
|
||||
if mem_z[rtr]['units'] != found.group(2):
|
||||
if mem_z[rtr]["units"] != found.group(2):
|
||||
val_z *= 1000
|
||||
delta_z = val_z - int(mem_z[rtr]['value'])
|
||||
ave_z = float(delta_z)/float(num)
|
||||
delta_z = val_z - int(mem_z[rtr]["value"])
|
||||
ave_z = float(delta_z) / float(num)
|
||||
|
||||
val_b = int(found.group(3))
|
||||
if mem_b[rtr]['units'] != found.group(4):
|
||||
if mem_b[rtr]["units"] != found.group(4):
|
||||
val_b *= 1000
|
||||
delta_b = val_b - int(mem_b[rtr]['value'])
|
||||
ave_b = float(delta_b)/float(num)
|
||||
luCommand(rtr, 'vtysh -c "show thread cpu"', '.', 'pass', 'BGPd heap: {0} {1} --> {2} {3} ({4} {1}/vpn route)'.format(mem_b[rtr]['value'], mem_b[rtr]['units'], found.group(3), found.group(4), round(ave_b,4)))
|
||||
luCommand(rtr, 'vtysh -c "show thread cpu"', '.', 'pass', 'Zebra heap: {0} {1} --> {2} {3} ({4} {1}/vpn route)'.format(mem_z[rtr]['value'], mem_z[rtr]['units'], found.group(1), found.group(2), round(ave_z,4)))
|
||||
#done
|
||||
delta_b = val_b - int(mem_b[rtr]["value"])
|
||||
ave_b = float(delta_b) / float(num)
|
||||
luCommand(
|
||||
rtr,
|
||||
'vtysh -c "show thread cpu"',
|
||||
".",
|
||||
"pass",
|
||||
"BGPd heap: {0} {1} --> {2} {3} ({4} {1}/vpn route)".format(
|
||||
mem_b[rtr]["value"],
|
||||
mem_b[rtr]["units"],
|
||||
found.group(3),
|
||||
found.group(4),
|
||||
round(ave_b, 4),
|
||||
),
|
||||
)
|
||||
luCommand(
|
||||
rtr,
|
||||
'vtysh -c "show thread cpu"',
|
||||
".",
|
||||
"pass",
|
||||
"Zebra heap: {0} {1} --> {2} {3} ({4} {1}/vpn route)".format(
|
||||
mem_z[rtr]["value"],
|
||||
mem_z[rtr]["units"],
|
||||
found.group(1),
|
||||
found.group(2),
|
||||
round(ave_z, 4),
|
||||
),
|
||||
)
|
||||
# done
|
||||
|
@ -25,119 +25,132 @@ import os
|
||||
import sys
|
||||
import pytest
|
||||
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), '../'))
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../"))
|
||||
|
||||
from lib.ltemplate import *
|
||||
|
||||
|
||||
def test_check_linux_vrf():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\', iproute2=\'4.9\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest('scripts/check_linux_vrf.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1', iproute2='4.9')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest("scripts/check_linux_vrf.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_adjacencies():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest('scripts/adjacencies.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest("scripts/adjacencies.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_notification_check():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\', iproute2=\'4.9\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest('scripts/notification_check.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1', iproute2='4.9')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest("scripts/notification_check.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def SKIP_test_add_routes():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest('scripts/add_routes.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest("scripts/add_routes.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_check_routes():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest('scripts/check_routes.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest("scripts/check_routes.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
#manual data path setup test - remove once have bgp/zebra vrf path working
|
||||
|
||||
# manual data path setup test - remove once have bgp/zebra vrf path working
|
||||
def test_check_linux_mpls():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\', iproute2=\'4.9\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest('scripts/check_linux_mpls.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1', iproute2='4.9')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest("scripts/check_linux_mpls.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_notification_check():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\', iproute2=\'4.9\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest('scripts/notification_check.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1', iproute2='4.9')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest("scripts/notification_check.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_check_scale_up():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\', iproute2=\'4.9\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest('scripts/scale_up.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1', iproute2='4.9')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest("scripts/scale_up.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_notification_check():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\', iproute2=\'4.9\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest('scripts/notification_check.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1', iproute2='4.9')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest("scripts/notification_check.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_check_scale_down():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\', iproute2=\'4.9\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest('scripts/scale_down.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1', iproute2='4.9')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest("scripts/scale_down.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def test_notification_check():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\', iproute2=\'4.9\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest('scripts/notification_check.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1', iproute2='4.9')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True, iproute2=\'4.9\')'
|
||||
ltemplateTest("scripts/notification_check.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
|
||||
def SKIP_test_cleanup_all():
|
||||
CliOnFail = None
|
||||
# For debugging, uncomment the next line
|
||||
#CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = 'ltemplateVersionCheck(\'4.1\')'
|
||||
#uncomment next line to start cli *before* script is run
|
||||
#CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest('scripts/cleanup_all.py', False, CliOnFail, CheckFunc)
|
||||
# CliOnFail = 'tgen.mininet_cli'
|
||||
CheckFunc = "ltemplateVersionCheck('4.1')"
|
||||
# uncomment next line to start cli *before* script is run
|
||||
# CheckFunc = 'ltemplateVersionCheck(\'4.1\', cli=True)'
|
||||
ltemplateTest("scripts/cleanup_all.py", False, CliOnFail, CheckFunc)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
if __name__ == "__main__":
|
||||
retval = pytest.main(["-s"])
|
||||
sys.exit(retval)
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -35,7 +35,7 @@ import time
|
||||
import pytest
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
from lib import topotest
|
||||
@ -43,20 +43,22 @@ from lib.topogen import Topogen, TopoRouter, get_topogen
|
||||
from lib.topolog import logger
|
||||
from mininet.topo import Topo
|
||||
|
||||
|
||||
class TemplateTopo(Topo):
|
||||
def build(self, *_args, **_opts):
|
||||
tgen = get_topogen(self)
|
||||
|
||||
for routern in range(1, 5):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch("s2")
|
||||
switch.add_link(tgen.gears["r3"])
|
||||
switch.add_link(tgen.gears["r4"])
|
||||
|
||||
switch = tgen.add_switch('s2')
|
||||
switch.add_link(tgen.gears['r3'])
|
||||
switch.add_link(tgen.gears['r4'])
|
||||
|
||||
def setup_module(mod):
|
||||
tgen = Topogen(TemplateTopo, mod.__name__)
|
||||
@ -66,20 +68,20 @@ def setup_module(mod):
|
||||
|
||||
for i, (rname, router) in enumerate(router_list.iteritems(), 1):
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname))
|
||||
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))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
tgen = get_topogen()
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_bgp_remove_private_as():
|
||||
tgen = get_topogen()
|
||||
|
||||
@ -88,24 +90,29 @@ def test_bgp_remove_private_as():
|
||||
|
||||
def _bgp_converge(router):
|
||||
while True:
|
||||
output = json.loads(tgen.gears[router].vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
|
||||
if output['192.168.255.1']['bgpState'] == 'Established':
|
||||
output = json.loads(
|
||||
tgen.gears[router].vtysh_cmd("show ip bgp neighbor 192.168.255.1 json")
|
||||
)
|
||||
if output["192.168.255.1"]["bgpState"] == "Established":
|
||||
time.sleep(1)
|
||||
return True
|
||||
|
||||
def _bgp_as_path(router):
|
||||
output = json.loads(tgen.gears[router].vtysh_cmd("show ip bgp 172.16.255.254/32 json"))
|
||||
if output['prefix'] == '172.16.255.254/32':
|
||||
return output['paths'][0]['aspath']['segments'][0]['list']
|
||||
output = json.loads(
|
||||
tgen.gears[router].vtysh_cmd("show ip bgp 172.16.255.254/32 json")
|
||||
)
|
||||
if output["prefix"] == "172.16.255.254/32":
|
||||
return output["paths"][0]["aspath"]["segments"][0]["list"]
|
||||
|
||||
if _bgp_converge('r2'):
|
||||
assert len(_bgp_as_path('r2')) == 1
|
||||
assert 65000 not in _bgp_as_path('r2')
|
||||
if _bgp_converge("r2"):
|
||||
assert len(_bgp_as_path("r2")) == 1
|
||||
assert 65000 not in _bgp_as_path("r2")
|
||||
|
||||
if _bgp_converge('r4'):
|
||||
assert len(_bgp_as_path('r4')) == 2
|
||||
assert 3000 in _bgp_as_path('r4')
|
||||
if _bgp_converge("r4"):
|
||||
assert len(_bgp_as_path("r4")) == 2
|
||||
assert 3000 in _bgp_as_path("r4")
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -39,7 +39,7 @@ import time
|
||||
import pytest
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
from lib import topotest
|
||||
@ -47,16 +47,18 @@ from lib.topogen import Topogen, TopoRouter, get_topogen
|
||||
from lib.topolog import logger
|
||||
from mininet.topo import Topo
|
||||
|
||||
|
||||
class TemplateTopo(Topo):
|
||||
def build(self, *_args, **_opts):
|
||||
tgen = get_topogen(self)
|
||||
|
||||
for routern in range(1, 3):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
|
||||
def setup_module(mod):
|
||||
tgen = Topogen(TemplateTopo, mod.__name__)
|
||||
@ -66,20 +68,20 @@ def setup_module(mod):
|
||||
|
||||
for i, (rname, router) in enumerate(router_list.iteritems(), 1):
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname))
|
||||
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))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
tgen = get_topogen()
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_bgp_maximum_prefix_invalid():
|
||||
tgen = get_topogen()
|
||||
|
||||
@ -88,12 +90,16 @@ def test_bgp_maximum_prefix_invalid():
|
||||
|
||||
def _bgp_converge(router):
|
||||
while True:
|
||||
output = json.loads(tgen.gears[router].vtysh_cmd("show ip bgp neighbor 192.168.255.1 json"))
|
||||
if output['192.168.255.1']['connectionsEstablished'] > 0:
|
||||
output = json.loads(
|
||||
tgen.gears[router].vtysh_cmd("show ip bgp neighbor 192.168.255.1 json")
|
||||
)
|
||||
if output["192.168.255.1"]["connectionsEstablished"] > 0:
|
||||
return True
|
||||
|
||||
def _bgp_parsing_nlri(router):
|
||||
cmd_max_exceeded = 'grep "%MAXPFXEXCEED: No. of IPv4 Unicast prefix received" bgpd.log'
|
||||
cmd_max_exceeded = (
|
||||
'grep "%MAXPFXEXCEED: No. of IPv4 Unicast prefix received" bgpd.log'
|
||||
)
|
||||
cmdt_error_parsing_nlri = 'grep "Error parsing NLRI" bgpd.log'
|
||||
output_max_exceeded = tgen.gears[router].run(cmd_max_exceeded)
|
||||
output_error_parsing_nlri = tgen.gears[router].run(cmdt_error_parsing_nlri)
|
||||
@ -103,10 +109,10 @@ def test_bgp_maximum_prefix_invalid():
|
||||
return False
|
||||
return True
|
||||
|
||||
if _bgp_converge("r2"):
|
||||
assert _bgp_parsing_nlri("r2") == True
|
||||
|
||||
if _bgp_converge('r2'):
|
||||
assert _bgp_parsing_nlri('r2') == True
|
||||
|
||||
if __name__ == '__main__':
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -35,7 +35,7 @@ import pytest
|
||||
import functools
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, '../'))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
from lib import topotest
|
||||
@ -43,16 +43,18 @@ from lib.topogen import Topogen, TopoRouter, get_topogen
|
||||
from lib.topolog import logger
|
||||
from mininet.topo import Topo
|
||||
|
||||
|
||||
class TemplateTopo(Topo):
|
||||
def build(self, *_args, **_opts):
|
||||
tgen = get_topogen(self)
|
||||
|
||||
for routern in range(1, 3):
|
||||
tgen.add_router('r{}'.format(routern))
|
||||
tgen.add_router("r{}".format(routern))
|
||||
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["r1"])
|
||||
switch.add_link(tgen.gears["r2"])
|
||||
|
||||
switch = tgen.add_switch('s1')
|
||||
switch.add_link(tgen.gears['r1'])
|
||||
switch.add_link(tgen.gears['r2'])
|
||||
|
||||
def setup_module(mod):
|
||||
tgen = Topogen(TemplateTopo, mod.__name__)
|
||||
@ -62,38 +64,34 @@ def setup_module(mod):
|
||||
|
||||
for i, (rname, router) in enumerate(router_list.iteritems(), 1):
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA,
|
||||
os.path.join(CWD, '{}/zebra.conf'.format(rname))
|
||||
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))
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
tgen = get_topogen()
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_bgp_maximum_prefix_out():
|
||||
tgen = get_topogen()
|
||||
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
router = tgen.gears['r2']
|
||||
router = tgen.gears["r2"]
|
||||
|
||||
def _bgp_converge(router):
|
||||
output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.2 json"))
|
||||
expected = {
|
||||
'192.168.255.2': {
|
||||
'bgpState': 'Established',
|
||||
'addressFamilyInfo': {
|
||||
'ipv4Unicast': {
|
||||
'acceptedPrefixCounter': 2
|
||||
}
|
||||
}
|
||||
"192.168.255.2": {
|
||||
"bgpState": "Established",
|
||||
"addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 2}},
|
||||
}
|
||||
}
|
||||
return topotest.json_cmp(output, expected)
|
||||
@ -103,6 +101,7 @@ def test_bgp_maximum_prefix_out():
|
||||
|
||||
assert result is None, 'Failed bgp convergence in "{}"'.format(router)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -16,13 +16,16 @@ numRoutes = int(argv[2])
|
||||
|
||||
# Announce numRoutes different routes per PE
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n' % ((peer+100), i, peer, peer))
|
||||
stdout.write(
|
||||
"announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n"
|
||||
% ((peer + 100), i, peer, peer)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 1 overlapping route per peer
|
||||
stdout.write('announce route 10.0.1.0/24 next-hop 172.16.1.%i\n' % peer)
|
||||
stdout.write("announce route 10.0.1.0/24 next-hop 172.16.1.%i\n" % peer)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -16,13 +16,16 @@ numRoutes = int(argv[2])
|
||||
|
||||
# Announce numRoutes different routes per PE
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n' % ((peer+100), i, peer, peer))
|
||||
stdout.write(
|
||||
"announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n"
|
||||
% ((peer + 100), i, peer, peer)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 1 overlapping route per peer
|
||||
stdout.write('announce route 10.0.1.0/24 next-hop 172.16.1.%i\n' % peer)
|
||||
stdout.write("announce route 10.0.1.0/24 next-hop 172.16.1.%i\n" % peer)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -16,13 +16,16 @@ numRoutes = int(argv[2])
|
||||
|
||||
# Announce numRoutes different routes per PE
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n' % ((peer+100), i, peer, peer))
|
||||
stdout.write(
|
||||
"announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n"
|
||||
% ((peer + 100), i, peer, peer)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 1 overlapping route per peer
|
||||
stdout.write('announce route 10.0.1.0/24 next-hop 172.16.1.%i\n' % peer)
|
||||
stdout.write("announce route 10.0.1.0/24 next-hop 172.16.1.%i\n" % peer)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -16,13 +16,16 @@ numRoutes = int(argv[2])
|
||||
|
||||
# Announce numRoutes different routes per PE
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n' % ((peer+100), i, peer, peer))
|
||||
stdout.write(
|
||||
"announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n"
|
||||
% ((peer + 100), i, peer, peer)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 1 overlapping route per peer
|
||||
stdout.write('announce route 10.0.1.0/24 next-hop 172.16.1.%i\n' % peer)
|
||||
stdout.write("announce route 10.0.1.0/24 next-hop 172.16.1.%i\n" % peer)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -16,13 +16,16 @@ numRoutes = int(argv[2])
|
||||
|
||||
# Announce numRoutes different routes per PE
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n' % ((peer+100), i, peer, peer))
|
||||
stdout.write(
|
||||
"announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n"
|
||||
% ((peer + 100), i, peer, peer)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 1 overlapping route per peer
|
||||
stdout.write('announce route 10.0.1.0/24 next-hop 172.16.1.%i\n' % peer)
|
||||
stdout.write("announce route 10.0.1.0/24 next-hop 172.16.1.%i\n" % peer)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -16,13 +16,16 @@ numRoutes = int(argv[2])
|
||||
|
||||
# Announce numRoutes different routes per PE
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n' % ((peer+100), i, peer, peer))
|
||||
stdout.write(
|
||||
"announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n"
|
||||
% ((peer + 100), i, peer, peer)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 1 overlapping route per peer
|
||||
stdout.write('announce route 10.0.1.0/24 next-hop 172.16.1.%i\n' % peer)
|
||||
stdout.write("announce route 10.0.1.0/24 next-hop 172.16.1.%i\n" % peer)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-send.py: Send a few testroutes with ExaBGP
|
||||
"""
|
||||
|
||||
from sys import stdout,argv
|
||||
from sys import stdout, argv
|
||||
from time import sleep
|
||||
|
||||
sleep(5)
|
||||
@ -16,13 +16,16 @@ numRoutes = int(argv[2])
|
||||
|
||||
# Announce numRoutes different routes per PE
|
||||
for i in range(0, numRoutes):
|
||||
stdout.write('announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n' % ((peer+100), i, peer, peer))
|
||||
stdout.write(
|
||||
"announce route 10.%s.%s.0/24 med 100 community %i:1 next-hop 172.16.1.%i\n"
|
||||
% ((peer + 100), i, peer, peer)
|
||||
)
|
||||
stdout.flush()
|
||||
|
||||
# Announce 1 overlapping route per peer
|
||||
stdout.write('announce route 10.0.1.0/24 next-hop 172.16.1.%i\n' % peer)
|
||||
stdout.write("announce route 10.0.1.0/24 next-hop 172.16.1.%i\n" % peer)
|
||||
stdout.flush()
|
||||
|
||||
#Loop endlessly to allow ExaBGP to continue running
|
||||
# Loop endlessly to allow ExaBGP to continue running
|
||||
while True:
|
||||
sleep(1)
|
||||
|
@ -4,7 +4,7 @@
|
||||
exa-receive.py: Save received routes form ExaBGP into file
|
||||
"""
|
||||
|
||||
from sys import stdin,argv
|
||||
from sys import stdin, argv
|
||||
from datetime import datetime
|
||||
|
||||
# 1st arg is peer number
|
||||
@ -13,12 +13,12 @@ peer = int(argv[1])
|
||||
# When the parent dies we are seeing continual newlines, so we only access so many before stopping
|
||||
counter = 0
|
||||
|
||||
routesavefile = open('/tmp/peer%s-received.log' % peer, 'w')
|
||||
routesavefile = open("/tmp/peer%s-received.log" % peer, "w")
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = stdin.readline()
|
||||
timestamp = datetime.now().strftime('%Y%m%d_%H:%M:%S - ')
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H:%M:%S - ")
|
||||
routesavefile.write(timestamp + line)
|
||||
routesavefile.flush()
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user