-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bgpd: Do not send Deconfig/Shutdown message when restarting
We might disable sending unconfig/shutdown notifications when Graceful-Restart is enabled and negotiated. Signed-off-by: Donatas Abraitis <[email protected]> (cherry picked from commit 95098d9)
- Loading branch information
1 parent
99477bc
commit 54acee4
Showing
7 changed files
with
181 additions
and
8 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
Empty file.
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,11 @@ | ||
router bgp 65001 | ||
no bgp ebgp-requires-policy | ||
bgp graceful-restart | ||
bgp graceful-restart preserve-fw-state | ||
neighbor 192.168.255.2 remote-as external | ||
neighbor 192.168.255.2 timers 1 3 | ||
neighbor 192.168.255.2 timers connect 1 | ||
address-family ipv4 | ||
redistribute connected | ||
exit-address-family | ||
! |
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,9 @@ | ||
! | ||
interface lo | ||
ip address 172.16.255.1/32 | ||
! | ||
interface r1-eth0 | ||
ip address 192.168.255.1/24 | ||
! | ||
ip forwarding | ||
! |
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,11 @@ | ||
router bgp 65002 | ||
no bgp ebgp-requires-policy | ||
bgp graceful-restart | ||
bgp graceful-restart preserve-fw-state | ||
neighbor 192.168.255.1 remote-as external | ||
neighbor 192.168.255.1 timers 1 3 | ||
neighbor 192.168.255.1 timers connect 1 | ||
address-family ipv4 | ||
redistribute connected | ||
exit-address-family | ||
! |
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,9 @@ | ||
! | ||
interface lo | ||
ip address 172.16.255.2/32 | ||
! | ||
interface r2-eth0 | ||
ip address 192.168.255.2/24 | ||
! | ||
ip forwarding | ||
! |
114 changes: 114 additions & 0 deletions
114
tests/topotests/bgp_gr_restart_retain_routes/test_bgp_gr_restart_retain_routes.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,114 @@ | ||
#!/usr/bin/env python | ||
|
||
# | ||
# Copyright (c) 2022 by | ||
# Donatas Abraitis <[email protected]> | ||
# | ||
# 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 if routes are retained during BGP restarts. | ||
""" | ||
|
||
import os | ||
import sys | ||
import json | ||
import pytest | ||
import functools | ||
|
||
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, stop_router | ||
|
||
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_gr_restart_retain_routes(): | ||
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(r2.vtysh_cmd("show bgp ipv4 neighbors 192.168.255.1 json")) | ||
expected = { | ||
"192.168.255.1": { | ||
"bgpState": "Established", | ||
"addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 2}}, | ||
} | ||
} | ||
return topotest.json_cmp(output, expected) | ||
|
||
def _bgp_check_retained_routes(): | ||
output = json.loads(r2.vtysh_cmd("show bgp ipv4 unicast 172.16.255.1/32 json")) | ||
expected = {"paths": [{"stale": True}]} | ||
return topotest.json_cmp(output, expected) | ||
|
||
step("Initial BGP converge") | ||
test_func = functools.partial(_bgp_converge) | ||
_, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) | ||
assert result is None, "Failed to see BGP convergence on R2" | ||
|
||
step("Restart R1") | ||
stop_router(tgen, "r1") | ||
|
||
step("Check if routes are retained at R2") | ||
test_func = functools.partial(_bgp_check_retained_routes) | ||
_, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5) | ||
assert result is None, "Failed to see BGP retained routes on R2" | ||
|
||
|
||
if __name__ == "__main__": | ||
args = ["-s"] + sys.argv[1:] | ||
sys.exit(pytest.main(args)) |