forked from FRRouting/frr
-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request FRRouting#14154 from opensourcerouting/feature/bgp…
…d_handle_role_capability_using_dynamic_capability bgpd: Handle role capability using dynamic capability
- Loading branch information
Showing
5 changed files
with
207 additions
and
42 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
130 changes: 130 additions & 0 deletions
130
tests/topotests/bgp_dynamic_capability/test_bgp_dynamic_capability_role.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
#!/usr/bin/env python | ||
# SPDX-License-Identifier: ISC | ||
|
||
# Copyright (c) 2023 by | ||
# Donatas Abraitis <[email protected]> | ||
# | ||
|
||
""" | ||
Test if role capability is exchanged dynamically. | ||
""" | ||
|
||
import os | ||
import re | ||
import sys | ||
import json | ||
import pytest | ||
import functools | ||
|
||
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.common_config import step | ||
|
||
pytestmark = [pytest.mark.bgpd] | ||
|
||
|
||
def setup_module(mod): | ||
topodef = {"s1": ("r1", "r2")} | ||
tgen = Topogen(topodef, 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_dynamic_capability_role(): | ||
tgen = get_topogen() | ||
|
||
if tgen.routers_have_failure(): | ||
pytest.skip(tgen.errors) | ||
|
||
r1 = tgen.gears["r1"] | ||
r2 = tgen.gears["r2"] | ||
|
||
def _bgp_converge(): | ||
output = json.loads(r1.vtysh_cmd("show bgp neighbor json")) | ||
expected = { | ||
"192.168.1.2": { | ||
"bgpState": "Established", | ||
"localRole": "undefined", | ||
"remoteRole": "undefined", | ||
"neighborCapabilities": { | ||
"dynamic": "advertisedAndReceived", | ||
}, | ||
"connectionsEstablished": 1, | ||
"connectionsDropped": 0, | ||
} | ||
} | ||
return topotest.json_cmp(output, expected) | ||
|
||
test_func = functools.partial( | ||
_bgp_converge, | ||
) | ||
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1) | ||
assert result is None, "Can't converge" | ||
|
||
step("Set local-role and check if it's exchanged dynamically") | ||
|
||
r1.vtysh_cmd( | ||
""" | ||
configure terminal | ||
router bgp | ||
neighbor 192.168.1.2 local-role customer | ||
""" | ||
) | ||
|
||
r2.vtysh_cmd( | ||
""" | ||
configure terminal | ||
router bgp | ||
neighbor 192.168.1.1 local-role provider | ||
""" | ||
) | ||
|
||
def _bgp_check_if_session_not_reset(): | ||
output = json.loads(r1.vtysh_cmd("show bgp neighbor json")) | ||
expected = { | ||
"192.168.1.2": { | ||
"bgpState": "Established", | ||
"localRole": "customer", | ||
"remoteRole": "provider", | ||
"neighborCapabilities": { | ||
"dynamic": "advertisedAndReceived", | ||
"role": "advertisedAndReceived", | ||
}, | ||
"connectionsEstablished": 1, | ||
"connectionsDropped": 0, | ||
} | ||
} | ||
return topotest.json_cmp(output, expected) | ||
|
||
test_func = functools.partial( | ||
_bgp_check_if_session_not_reset, | ||
) | ||
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1) | ||
assert result is None, "Session was reset after setting role capability" | ||
|
||
|
||
if __name__ == "__main__": | ||
args = ["-s"] + sys.argv[1:] | ||
sys.exit(pytest.main(args)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters