]> git.puffer.fish Git - matthieu/frr.git/blob
9d61bbd643fe3816bae3c5219a66ea28ee8ca9d2
[matthieu/frr.git] /
1 #!/usr/bin/env python
2 # SPDX-License-Identifier: ISC
3
4 # Copyright (c) 2023 by
5 # Donatas Abraitis <donatas@opensourcerouting.org>
6 #
7
8 """
9 Test if static route with BGP conditional advertisement works correctly
10 if we modify the prefix-lists.
11 """
12
13 import os
14 import re
15 import sys
16 import json
17 import pytest
18 import functools
19
20 pytestmark = pytest.mark.bgpd
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 step
29
30 pytestmark = [pytest.mark.bgpd]
31
32
33 def setup_module(mod):
34 topodef = {"s1": ("r1", "r2"), "s2": ("r2", "r3")}
35 tgen = Topogen(topodef, mod.__name__)
36 tgen.start_topology()
37
38 router_list = tgen.routers()
39
40 for _, (rname, router) in enumerate(router_list.items(), 1):
41 router.load_frr_config(os.path.join(CWD, "{}/frr.conf".format(rname)))
42
43 tgen.start_router()
44
45
46 def teardown_module(mod):
47 tgen = get_topogen()
48 tgen.stop_topology()
49
50
51 def test_bgp_conditional_advertisements_static_route():
52 tgen = get_topogen()
53
54 if tgen.routers_have_failure():
55 pytest.skip(tgen.errors)
56
57 r2 = tgen.gears["r2"]
58
59 def _bgp_converge():
60 output = json.loads(
61 r2.vtysh_cmd(
62 "show bgp ipv4 unicast neighbor 192.168.1.1 advertised-routes json"
63 )
64 )
65 expected = {
66 "advertisedRoutes": {
67 "10.10.10.1/32": {
68 "valid": True,
69 }
70 },
71 "totalPrefixCounter": 1,
72 }
73 return topotest.json_cmp(output, expected)
74
75 test_func = functools.partial(
76 _bgp_converge,
77 )
78 _, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
79 assert result is None, "Can't converge"
80
81 step("Append prefix-list to advertise 10.10.10.2/32")
82
83 r2.vtysh_cmd(
84 """
85 configure terminal
86 ip prefix-list advertise seq 10 permit 10.10.10.2/32
87 """
88 )
89
90 def _bgp_check_advertised_after_update():
91 output = json.loads(
92 r2.vtysh_cmd(
93 "show bgp ipv4 unicast neighbor 192.168.1.1 advertised-routes json"
94 )
95 )
96 expected = {
97 "advertisedRoutes": {
98 "10.10.10.1/32": {
99 "valid": True,
100 },
101 "10.10.10.2/32": {
102 "valid": True,
103 },
104 },
105 "totalPrefixCounter": 2,
106 }
107 return topotest.json_cmp(output, expected)
108
109 test_func = functools.partial(
110 _bgp_check_advertised_after_update,
111 )
112 _, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
113 assert result is None, "10.10.10.2/32 is not advertised after prefix-list update"
114
115
116 if __name__ == "__main__":
117 args = ["-s"] + sys.argv[1:]
118 sys.exit(pytest.main(args))