forked from Mirror/frr

This test ensures that the regex used to filter as paths has to be expressed in the asnotation of the BGP instance where prefixes are received. 2 aspaths have been forged, both for AS 65540, but only the former is expressed in asdot. If the local BGP instance is expressed in asdot format, then only the former ASPATH will match properly the incoming update. Reversely, when the local BGP instance is expressed in plain format, then only the latter ASPATH will match properly the incoming update. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
123 lines
3.6 KiB
Python
123 lines
3.6 KiB
Python
#!/usr/bin/env python
|
|
|
|
#
|
|
# test_bgp_asdot_regex.py
|
|
# Part of Topotests
|
|
#
|
|
# Copyright 2022 6WIND S.A.
|
|
#
|
|
# Permission to use, copy, modify, and/or distribute this software
|
|
# for any purpose with or without fee is hereby granted, provided
|
|
# that the above copyright notice and this permission notice appear
|
|
# in all copies.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
|
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
|
|
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
|
|
# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
|
# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
# OF THIS SOFTWARE.
|
|
#
|
|
|
|
"""
|
|
test_bgp_asdot_regex.py:
|
|
|
|
Test how regex applies when asnotation to forge bgp config is based on dot or not.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import json
|
|
import pytest
|
|
from functools import partial
|
|
|
|
# add after imports, before defining classes or functions:
|
|
pytestmark = [pytest.mark.bgpd]
|
|
|
|
CWD = os.path.dirname(os.path.realpath(__file__))
|
|
sys.path.append(os.path.join(CWD, "../"))
|
|
|
|
# pylint: disable=C0413
|
|
from lib import topotest
|
|
from lib.topogen import Topogen, TopoRouter, get_topogen
|
|
from lib.topolog import logger
|
|
|
|
pytestmark = [pytest.mark.bgpd]
|
|
|
|
|
|
def build_topo(tgen):
|
|
for routern in range(1, 3):
|
|
tgen.add_router("r{}".format(routern))
|
|
|
|
switch = tgen.add_switch("s1")
|
|
switch.add_link(tgen.gears["r1"])
|
|
switch.add_link(tgen.gears["r2"])
|
|
|
|
|
|
def setup_module(mod):
|
|
tgen = Topogen(build_topo, mod.__name__)
|
|
tgen.start_topology()
|
|
|
|
router_list = tgen.routers()
|
|
|
|
for i, (rname, router) in enumerate(router_list.items(), 1):
|
|
router.load_config(
|
|
TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
|
|
)
|
|
router.load_config(
|
|
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
|
)
|
|
|
|
tgen.start_router()
|
|
|
|
|
|
def teardown_module(mod):
|
|
tgen = get_topogen()
|
|
tgen.stop_topology()
|
|
|
|
|
|
def test_bgp_asdot_regex():
|
|
tgen = get_topogen()
|
|
|
|
if tgen.routers_have_failure():
|
|
pytest.skip(tgen.errors)
|
|
|
|
router1 = tgen.gears["r1"]
|
|
router2 = 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": 1}},
|
|
}
|
|
}
|
|
return topotest.json_cmp(output, expected)
|
|
|
|
logger.info("Check if neighbor sessions are up in {}".format(router1.name))
|
|
test_func = partial(_bgp_converge, router1)
|
|
success, result = topotest.run_and_expect(test_func, None, count=15, wait=0.5)
|
|
assert result is None, 'Failed to see BGP convergence in "{}"'.format(router1.name)
|
|
|
|
logger.info("BGP neighbor session is up in {}".format(router1.name))
|
|
|
|
logger.info("waiting for bgp peers exchanging UPDATES")
|
|
|
|
for router in tgen.routers().values():
|
|
ref_file = "{}/{}/show_bgp_ipv4.json".format(CWD, router.name)
|
|
expected = json.loads(open(ref_file).read())
|
|
test_func = partial(
|
|
topotest.router_json_cmp, router, "show bgp ipv4 unicast json", expected
|
|
)
|
|
_, res = topotest.run_and_expect(test_func, None, count=40, wait=2.5)
|
|
assertmsg = "{}: BGP UPDATE exchange failure".format(router.name)
|
|
assert res is None, assertmsg
|
|
|
|
|
|
if __name__ == "__main__":
|
|
args = ["-s"] + sys.argv[1:]
|
|
sys.exit(pytest.main(args))
|