]> git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/bgp_conditional_advertisement_track_peer/test_bgp_conditional_advertisement_track_peer.py
Merge pull request #12791 from taspelund/loc_rib_json_fix
[mirror_frr.git] / tests / topotests / bgp_conditional_advertisement_track_peer / test_bgp_conditional_advertisement_track_peer.py
1 #!/usr/bin/env python
2 # SPDX-License-Identifier: ISC
3
4 #
5 # Copyright (c) 2022 by
6 # Donatas Abraitis <donatas@opensourcerouting.org>
7 #
8
9 """
10 Conditionally advertise 172.16.255.2/32 to r1, only if 172.16.255.3/32
11 is received from r3.
12
13 Also, withdraw if 172.16.255.3/32 disappears.
14 """
15
16 import os
17 import sys
18 import json
19 import pytest
20 import functools
21
22 CWD = os.path.dirname(os.path.realpath(__file__))
23 sys.path.append(os.path.join(CWD, "../"))
24
25 # pylint: disable=C0413
26 from lib import topotest
27 from lib.topogen import Topogen, TopoRouter, get_topogen
28 from lib.common_config import (
29 step,
30 )
31
32 pytestmark = [pytest.mark.bgpd]
33
34
35 def build_topo(tgen):
36 for routern in range(1, 5):
37 tgen.add_router("r{}".format(routern))
38
39 switch = tgen.add_switch("s1")
40 switch.add_link(tgen.gears["r1"])
41 switch.add_link(tgen.gears["r2"])
42
43 switch = tgen.add_switch("s2")
44 switch.add_link(tgen.gears["r2"])
45 switch.add_link(tgen.gears["r3"])
46
47
48 def setup_module(mod):
49 tgen = Topogen(build_topo, mod.__name__)
50 tgen.start_topology()
51
52 router_list = tgen.routers()
53
54 for i, (rname, router) in enumerate(router_list.items(), 1):
55 router.load_config(
56 TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
57 )
58 router.load_config(
59 TopoRouter.RD_STATIC, os.path.join(CWD, "{}/staticd.conf".format(rname))
60 )
61 router.load_config(
62 TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
63 )
64
65 tgen.start_router()
66
67
68 def teardown_module(mod):
69 tgen = get_topogen()
70 tgen.stop_topology()
71
72
73 def test_bgp_conditional_advertisement_track_peer():
74 tgen = get_topogen()
75
76 r1 = tgen.gears["r1"]
77 r2 = tgen.gears["r2"]
78 r3 = tgen.gears["r3"]
79
80 if tgen.routers_have_failure():
81 pytest.skip(tgen.errors)
82
83 def _bgp_converge():
84 output = json.loads(
85 r2.vtysh_cmd(
86 "show bgp ipv4 unicast neighbors 192.168.1.1 advertised-routes json"
87 )
88 )
89 expected = {
90 "advertisedRoutes": {"172.16.255.2/32": None},
91 "totalPrefixCounter": 0,
92 "filteredPrefixCounter": 0,
93 }
94 return topotest.json_cmp(output, expected)
95
96 # Verify if R2 does not send any routes to R1
97 test_func = functools.partial(_bgp_converge)
98 _, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5)
99 assert result is None, "R2 SHOULD not send any routes to R1"
100
101 step("Enable session between R2 and R3")
102 r3.vtysh_cmd(
103 """
104 configure terminal
105 router bgp
106 no neighbor 192.168.2.2 shutdown
107 """
108 )
109
110 def _bgp_check_conditional_static_routes_from_r2():
111 output = json.loads(r1.vtysh_cmd("show bgp ipv4 unicast json"))
112 expected = {
113 "routes": {
114 "172.16.255.2/32": [{"valid": True, "nexthops": [{"hostname": "r2"}]}]
115 }
116 }
117 return topotest.json_cmp(output, expected)
118
119 # Verify if R1 received 172.16.255.2/32 from R2
120 test_func = functools.partial(_bgp_check_conditional_static_routes_from_r2)
121 _, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5)
122 assert result is None, "R1 SHOULD receive 172.16.255.2/32 from R2"
123
124 step("Disable session between R2 and R3 again")
125 r3.vtysh_cmd(
126 """
127 configure terminal
128 router bgp
129 neighbor 192.168.2.2 shutdown
130 """
131 )
132
133 # Verify if R2 is not sending any routes to R1 again
134 test_func = functools.partial(_bgp_converge)
135 _, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5)
136 assert result is None, "R2 SHOULD not send any routes to R1"
137
138
139 if __name__ == "__main__":
140 args = ["-s"] + sys.argv[1:]
141 sys.exit(pytest.main(args))