]> git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/bgp_tcp_mss/test_bgp_tcp_mss.py
e7948eaaac47edb948024c5fb8d24e25f1e3e20e
[mirror_frr.git] / tests / topotests / bgp_tcp_mss / test_bgp_tcp_mss.py
1 #!/usr/bin/env python
2 # SPDX-License-Identifier: ISC
3
4 #
5 # bgp_tcp_mss.py
6 # Part of NetDEF Topology Tests
7 #
8 # Copyright (c) 2021 by
9 # Abhinay Ramesh <rabhinay@vmware.com>
10 #
11
12 """
13 bgp_tcp_mss.py:
14
15 Test if works the following commands:
16 router bgp 65000
17 neighbor 192.168.255.2 tcp-mss 500
18
19 Need to verify if the tcp-mss value is reflected in the TCP session.
20 """
21
22 import os
23 import sys
24 import json
25 import pytest
26 import functools
27
28 # add after imports, before defining classes or functions:
29 pytestmark = [pytest.mark.bgpd]
30
31 CWD = os.path.dirname(os.path.realpath(__file__))
32 sys.path.append(os.path.join(CWD, "../"))
33
34 # pylint: disable=C0413
35 from lib import topotest
36 from lib.topogen import Topogen, TopoRouter, get_topogen
37 from lib.topolog import logger
38
39 pytestmark = [pytest.mark.bgpd]
40
41
42 def build_topo(tgen):
43 for routern in range(1, 3):
44 tgen.add_router("r{}".format(routern))
45
46 switch = tgen.add_switch("s1")
47 switch.add_link(tgen.gears["r1"])
48 switch.add_link(tgen.gears["r2"])
49
50
51 def setup_module(mod):
52 tgen = Topogen(build_topo, mod.__name__)
53 tgen.start_topology()
54
55 router_list = tgen.routers()
56
57 for i, (rname, router) in enumerate(router_list.items(), 1):
58 router.load_config(
59 TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.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_tcp_mss():
74 tgen = get_topogen()
75
76 if tgen.routers_have_failure():
77 pytest.skip(tgen.errors)
78
79 router1 = tgen.gears["r1"]
80 router2 = tgen.gears["r2"]
81
82 def _bgp_converge(router):
83 output = json.loads(router.vtysh_cmd("show ip bgp neighbor 192.168.255.2 json"))
84 expected = {
85 "192.168.255.2": {
86 "bgpState": "Established",
87 "addressFamilyInfo": {"ipv4Unicast": {"acceptedPrefixCounter": 0}},
88 }
89 }
90 return topotest.json_cmp(output, expected)
91
92 def _bgp_conf_tcp_mss(router, as_num, neigh):
93 router.vtysh_cmd(
94 """configure terminal
95 router bgp {0}
96 neighbor {1} tcp-mss 500""".format(
97 as_num, neigh
98 )
99 )
100
101 def _bgp_clear_session(router):
102 router.vtysh_cmd("clear bgp *")
103
104 def _bgp_check_neighbor_tcp_mss(router, neigh):
105 output = json.loads(router.vtysh_cmd("show bgp neighbor {} json".format(neigh)))
106 expected = {
107 "{}".format(neigh): {"bgpTcpMssConfigured": 500, "bgpTcpMssSynced": 488}
108 }
109 return topotest.json_cmp(output, expected)
110
111 logger.info("Check if neighbor sessions are up in {}".format(router1.name))
112 test_func = functools.partial(_bgp_converge, router1)
113 success, result = topotest.run_and_expect(test_func, None, count=15, wait=0.5)
114 assert result is None, 'Failed to see BGP convergence in "{}"'.format(router1.name)
115
116 logger.info("BGP neighbor session is up in {}".format(router1.name))
117
118 logger.info(
119 "Configure tcp-mss 500 on {} and reset the session".format(router1.name)
120 )
121 _bgp_conf_tcp_mss(router1, "65000", "192.168.255.2")
122 _bgp_clear_session(router1)
123
124 logger.info(
125 "Configure tcp-mss 500 on {} and reset the session".format(router2.name)
126 )
127 _bgp_conf_tcp_mss(router2, "65001", "192.168.255.1")
128 _bgp_clear_session(router2)
129
130 logger.info(
131 "Check if neighbor session is up after reset in {}".format(router1.name)
132 )
133 test_func = functools.partial(_bgp_converge, router1)
134 success, result = topotest.run_and_expect(test_func, None, count=15, wait=0.5)
135 assert result is None, 'Failed to see BGP convergence after reset in "{}"'.format(
136 router1.name
137 )
138
139 logger.info(
140 "Verify if TCP MSS value is synced with neighbor in {}".format(router1.name)
141 )
142 test_func = functools.partial(_bgp_check_neighbor_tcp_mss, router1, "192.168.255.2")
143 success, result = topotest.run_and_expect(test_func, None, count=10, wait=0.5)
144 assert (
145 result is None
146 ), 'Failed to sync TCP MSS value over BGP session in "{}"'.format(router1.name)
147 logger.info("TCP MSS value is synced with neighbor in {}".format(router1.name))
148
149 logger.info(
150 "Verify if TCP MSS value is synced with neighbor in {}".format(router2.name)
151 )
152 test_func = functools.partial(_bgp_check_neighbor_tcp_mss, router2, "192.168.255.1")
153 success, result = topotest.run_and_expect(test_func, None, count=10, wait=0.5)
154 assert (
155 result is None
156 ), 'Failed to sync TCP MSS value over BGP session in "{}"'.format(router2.name)
157 logger.info("TCP MSS value is synced with neighbor in {}".format(router2.name))
158
159
160 if __name__ == "__main__":
161 args = ["-s"] + sys.argv[1:]
162 sys.exit(pytest.main(args))