]> git.proxmox.com Git - mirror_frr.git/blame - tests/topotests/bgp_gr_restart_retain_routes/test_bgp_gr_restart_retain_routes.py
*: auto-convert to SPDX License IDs
[mirror_frr.git] / tests / topotests / bgp_gr_restart_retain_routes / test_bgp_gr_restart_retain_routes.py
CommitLineData
95098d96 1#!/usr/bin/env python
acddc0ed 2# SPDX-License-Identifier: ISC
95098d96
DA
3
4#
5# Copyright (c) 2022 by
6# Donatas Abraitis <donatas@opensourcerouting.org>
7#
95098d96
DA
8
9"""
10Test if routes are retained during BGP restarts.
11"""
12
13import os
14import sys
15import json
16import pytest
17import functools
18
19CWD = os.path.dirname(os.path.realpath(__file__))
20sys.path.append(os.path.join(CWD, "../"))
21
22# pylint: disable=C0413
23from lib import topotest
24from lib.topogen import Topogen, TopoRouter, get_topogen
25from lib.common_config import step, stop_router
26
27pytestmark = [pytest.mark.bgpd]
28
29
30def build_topo(tgen):
31 for routern in range(1, 3):
32 tgen.add_router("r{}".format(routern))
33
34 switch = tgen.add_switch("s1")
35 switch.add_link(tgen.gears["r1"])
36 switch.add_link(tgen.gears["r2"])
37
38
39def setup_module(mod):
40 tgen = Topogen(build_topo, mod.__name__)
41 tgen.start_topology()
42
43 router_list = tgen.routers()
44
45 for i, (rname, router) in enumerate(router_list.items(), 1):
46 router.load_config(
47 TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
48 )
49 router.load_config(
50 TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
51 )
52
53 tgen.start_router()
54
55
56def teardown_module(mod):
57 tgen = get_topogen()
58 tgen.stop_topology()
59
60
61def test_bgp_gr_restart_retain_routes():
62 tgen = get_topogen()
63
64 if tgen.routers_have_failure():
65 pytest.skip(tgen.errors)
66
67 r1 = tgen.gears["r1"]
68 r2 = tgen.gears["r2"]
69
70 def _bgp_converge():
71 output = json.loads(r2.vtysh_cmd("show bgp ipv4 neighbors 192.168.255.1 json"))
72 expected = {
73 "192.168.255.1": {
74 "bgpState": "Established",
75 "addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 2}},
76 }
77 }
78 return topotest.json_cmp(output, expected)
79
18e427bc 80 def _bgp_check_bgp_retained_routes():
95098d96
DA
81 output = json.loads(r2.vtysh_cmd("show bgp ipv4 unicast 172.16.255.1/32 json"))
82 expected = {"paths": [{"stale": True}]}
83 return topotest.json_cmp(output, expected)
84
18e427bc
DA
85 def _bgp_check_kernel_retained_routes():
86 output = (
87 r2.cmd("ip route show 172.16.255.1/32 proto bgp dev r2-eth0")
88 .replace("\n", "")
89 .rstrip()
90 )
91 expected = "172.16.255.1 via 192.168.255.1 metric 20"
92 diff = topotest.get_textdiff(
93 output, expected, "Actual IP Routing Table", "Expected IP RoutingTable"
94 )
95 if diff:
96 return False
97 return True
98
95098d96
DA
99 step("Initial BGP converge")
100 test_func = functools.partial(_bgp_converge)
101 _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
102 assert result is None, "Failed to see BGP convergence on R2"
103
104 step("Restart R1")
105 stop_router(tgen, "r1")
106
18e427bc
DA
107 step("Check if routes (BGP) are retained at R2")
108 test_func = functools.partial(_bgp_check_bgp_retained_routes)
95098d96
DA
109 _, result = topotest.run_and_expect(test_func, None, count=60, wait=0.5)
110 assert result is None, "Failed to see BGP retained routes on R2"
111
18e427bc
DA
112 step("Check if routes (Kernel) are retained at R2")
113 assert _bgp_check_kernel_retained_routes() == True
114
95098d96
DA
115
116if __name__ == "__main__":
117 args = ["-s"] + sys.argv[1:]
118 sys.exit(pytest.main(args))