]>
Commit | Line | Data |
---|---|---|
27d78d31 A |
1 | #!/usr/bin/env python |
2 | # | |
3 | # Copyright (c) 2022 by VMware, Inc. ("VMware") | |
4 | # Used Copyright (c) 2018 by Network Device Education Foundation, Inc. ("NetDEF") | |
5 | # in this file. | |
6 | # | |
7 | # Permission to use, copy, modify, and/or distribute this software | |
8 | # for any purpose with or without fee is hereby granted, provided | |
9 | # that the above copyright notice and this permission notice appear | |
10 | # in all copies. | |
11 | # Shreenidhi A R <rshreenidhi@vmware.com> | |
12 | # THE SOFTWARE IS PROVIDED "AS IS" AND VMWARE DISCLAIMS ALL WARRANTIES | |
13 | # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
14 | # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL VMWARE BE LIABLE FOR | |
15 | # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY | |
16 | # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | |
17 | # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS | |
18 | # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | |
19 | # OF THIS SOFTWARE. | |
20 | # | |
21 | """ | |
22 | Following tests are covered. | |
23 | 1. Verify default-originate route with default static and network command | |
24 | 2. Verify default-originate route with aggregate summary command | |
25 | """ | |
26 | import os | |
27 | import sys | |
28 | import time | |
29 | import pytest | |
30 | import datetime | |
31 | from copy import deepcopy | |
32 | from lib.topolog import logger | |
33 | ||
34 | # pylint: disable=C0413 | |
35 | # Import topogen and topotest helpers | |
36 | from lib.topogen import Topogen, get_topogen | |
37 | from lib.topojson import build_config_from_json | |
38 | from lib.topolog import logger | |
39 | ||
40 | from lib.bgp import ( | |
41 | verify_bgp_convergence, | |
42 | create_router_bgp, | |
43 | verify_bgp_rib, | |
44 | get_dut_as_number, | |
45 | verify_rib_default_route, | |
46 | verify_fib_default_route, | |
47 | ) | |
48 | from lib.common_config import ( | |
49 | verify_fib_routes, | |
50 | step, | |
51 | run_frr_cmd, | |
52 | get_frr_ipv6_linklocal, | |
53 | start_topology, | |
54 | apply_raw_config, | |
55 | write_test_header, | |
56 | check_address_types, | |
57 | write_test_footer, | |
58 | reset_config_on_routers, | |
59 | create_static_routes, | |
60 | check_router_status, | |
61 | ) | |
62 | ||
63 | # Save the Current Working Directory to find configuration files. | |
64 | CWD = os.path.dirname(os.path.realpath(__file__)) | |
65 | sys.path.append(os.path.join(CWD, "../")) | |
66 | sys.path.append(os.path.join(CWD, "../lib/")) | |
67 | ||
68 | # Required to instantiate the topology builder class. | |
69 | ||
70 | # pylint: disable=C0413 | |
71 | # Import topogen and topotest helpers | |
72 | ||
73 | # Global variables | |
74 | topo = None | |
75 | NETWORK1_1 = {"ipv4": "198.51.1.1/32", "ipv6": "2001:DB8::1:1/128"} | |
76 | NETWORK1_2 = {"ipv4": "198.51.1.2/32", "ipv6": "2001:DB8::1:2/128"} | |
77 | NETWORK1_3 = {"ipv4": "198.51.1.3/32", "ipv6": "2001:DB8::1:3/128"} | |
78 | NETWORK1_4 = {"ipv4": "198.51.1.4/32", "ipv6": "2001:DB8::1:4/128"} | |
79 | NETWORK1_5 = {"ipv4": "198.51.1.5/32", "ipv6": "2001:DB8::1:5/128"} | |
80 | ||
81 | ipv4_uptime_dict = { | |
82 | "r2": { | |
83 | "static_routes": [ | |
84 | {"network": "0.0.0.0/0"}, | |
85 | ] | |
86 | } | |
87 | } | |
88 | ||
89 | ipv6_uptime_dict = { | |
90 | "r2": { | |
91 | "static_routes": [ | |
92 | {"network": "::/0"}, | |
93 | ] | |
94 | } | |
95 | } | |
96 | ||
97 | DEFAULT_ROUTES = {"ipv4": "0.0.0.0/0", "ipv6": "0::0/0"} | |
98 | NEXT_HOP_IP = {"ipv4": "Null0", "ipv6": "Null0"} | |
99 | ||
100 | pytestmark = [pytest.mark.bgpd] | |
101 | ||
102 | ||
103 | def setup_module(mod): | |
104 | """ | |
105 | Sets up the pytest environment | |
106 | ||
107 | * `mod`: module name | |
108 | """ | |
109 | testsuite_run_time = time.asctime(time.localtime(time.time())) | |
110 | logger.info("Testsuite start time: {}".format(testsuite_run_time)) | |
111 | logger.info("=" * 40) | |
112 | ||
113 | logger.info("Running setup_module to create topology") | |
114 | ||
115 | # This function initiates the topology build with Topogen... | |
116 | json_file = "{}/bgp_default_originate_2links.json".format(CWD) | |
117 | tgen = Topogen(json_file, mod.__name__) | |
118 | global topo | |
119 | topo = tgen.json_topo | |
120 | # ... and here it calls Mininet initialization functions. | |
121 | ||
122 | # Starting topology, create tmp files which are loaded to routers | |
123 | # to start daemons and then start routers | |
124 | start_topology(tgen) | |
125 | ||
126 | # Creating configuration from JSON | |
127 | build_config_from_json(tgen, topo) | |
128 | ||
129 | global ADDR_TYPES | |
130 | global BGP_CONVERGENCE | |
131 | global DEFAULT_ROUTES | |
132 | global DEFAULT_ROUTE_NXT_HOP_LINK1, DEFAULT_ROUTE_NXT_HOP_LINK2 | |
133 | ADDR_TYPES = check_address_types() | |
134 | BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo) | |
135 | assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error: {}".format( | |
136 | BGP_CONVERGENCE | |
137 | ) | |
138 | ||
139 | DEFAULT_ROUTES = {"ipv4": "0.0.0.0/0", "ipv6": "0::0/0"} | |
140 | ||
141 | interface = topo["routers"]["r1"]["links"]["r2-link1"]["interface"] | |
142 | ipv6_link_local = get_frr_ipv6_linklocal(tgen, "r1", intf=interface) | |
143 | ipv4_nxt_hop = topo["routers"]["r1"]["links"]["r2-link1"]["ipv4"].split("/")[0] | |
144 | ipv6_nxt_hop = topo["routers"]["r1"]["links"]["r2-link1"]["ipv6"].split("/")[0] | |
145 | DEFAULT_ROUTE_NXT_HOP_LINK1 = {"ipv4": ipv4_nxt_hop, "ipv6": ipv6_link_local} | |
146 | ||
147 | interface = topo["routers"]["r1"]["links"]["r2-link2"]["interface"] | |
148 | ipv6_link_local = get_frr_ipv6_linklocal(tgen, "r1", intf=interface) | |
149 | ipv4_nxt_hop = topo["routers"]["r1"]["links"]["r2-link2"]["ipv4"].split("/")[0] | |
150 | ipv6_nxt_hop = topo["routers"]["r1"]["links"]["r2-link2"]["ipv6"].split("/")[0] | |
151 | DEFAULT_ROUTE_NXT_HOP_LINK2 = {"ipv4": ipv4_nxt_hop, "ipv6": ipv6_link_local} | |
152 | logger.info("Running setup_module() done") | |
153 | ||
154 | ||
155 | def teardown_module(): | |
156 | """Teardown the pytest environment""" | |
157 | ||
158 | logger.info("Running teardown_module to delete topology") | |
159 | ||
160 | tgen = get_topogen() | |
161 | ||
162 | # Stop toplogy and Remove tmp files | |
163 | tgen.stop_topology() | |
164 | ||
165 | logger.info( | |
166 | "Testsuite end time: {}".format(time.asctime(time.localtime(time.time()))) | |
167 | ) | |
168 | logger.info("=" * 40) | |
169 | ||
170 | ||
171 | ##################################################### | |
172 | # | |
173 | # Local API's | |
174 | # | |
175 | ##################################################### | |
176 | ||
177 | ||
178 | def get_rib_route_uptime(tgen, addr_type, dut, input_dict): | |
179 | """ | |
180 | Verify route uptime in RIB using "show ip route" | |
181 | ||
182 | Parameters | |
183 | ---------- | |
184 | * `tgen` : topogen object | |
185 | * `addr_type` : ip type, ipv4/ipv6 | |
186 | * `dut`: Device Under Test, for which user wants to test the data | |
187 | * `input_dict` : input dict, has details of static routes | |
188 | * `route_uptime`: uptime of the routes | |
189 | ||
190 | Usage | |
191 | ----- | |
192 | # Creating static routes for r1 | |
193 | input_dict_r1 = { | |
194 | "r1": { | |
195 | "static_routes": [ | |
196 | { | |
197 | "network": "147.10.13.4/32" | |
198 | }, | |
199 | { | |
200 | "network": "147.10.12.0/24" | |
201 | }, | |
202 | { | |
203 | "network": "147.10.13.4/32" | |
204 | }, | |
205 | { | |
206 | "network": "147.10.13.4/32" | |
207 | }, | |
208 | { | |
209 | "network": "147.10.13.4/32" | |
210 | } | |
211 | ] | |
212 | } | |
213 | } | |
214 | ||
215 | ||
216 | Returns | |
217 | ------- | |
218 | errormsg(str) or True | |
219 | """ | |
220 | ||
221 | logger.info("Entering lib API: get_rib_route_uptime()") | |
222 | route_time = [] | |
223 | out_route_dict = {} | |
224 | router_list = tgen.routers() | |
225 | for routerInput in input_dict.keys(): | |
226 | for router, rnode in router_list.items(): | |
227 | if router != dut: | |
228 | continue | |
229 | ||
230 | logger.info("Checking router %s RIB:", router) | |
231 | ||
232 | # Verifying RIB routes | |
233 | if addr_type == "ipv4": | |
234 | command = "show ip route" | |
235 | else: | |
236 | command = "show ipv6 route" | |
237 | ||
238 | if "static_routes" in input_dict[routerInput]: | |
239 | static_routes = input_dict[routerInput]["static_routes"] | |
240 | ||
241 | for static_route in static_routes: | |
242 | if "vrf" in static_route and static_route["vrf"] is not None: | |
243 | ||
244 | logger.info( | |
245 | "[DUT: {}]: Verifying routes for VRF:" | |
246 | " {}".format(router, static_route["vrf"]) | |
247 | ) | |
248 | cmd = "{} vrf {}".format(command, static_route["vrf"]) | |
249 | ||
250 | else: | |
251 | cmd = "{}".format(command) | |
252 | ||
253 | cmd = "{} json".format(cmd) | |
254 | ||
255 | rib_routes_json = run_frr_cmd(rnode, cmd, isjson=True) | |
256 | ||
257 | if bool(rib_routes_json) is False: | |
258 | errormsg = "No route found in rib of router {}..".format(router) | |
259 | return errormsg | |
260 | network = static_route["network"] | |
261 | route_time.append(rib_routes_json[network][0]["uptime"]) | |
262 | ||
263 | logger.info("Exiting lib API: get_rib_route_uptime()") | |
264 | return route_time | |
265 | ||
266 | ||
267 | def verify_the_uptime(time_stamp_before, time_stamp_after, incremented=None): | |
268 | """ | |
269 | time_stamp_before : string the time stamp captured | |
270 | time_stamp_after : string the time stamp captured | |
271 | """ | |
272 | uptime_before = datetime.datetime.strptime(time_stamp_before[0], "%H:%M:%S") | |
273 | uptime_after = datetime.datetime.strptime(time_stamp_after[0], "%H:%M:%S") | |
274 | ||
275 | if incremented == True: | |
276 | if uptime_before < uptime_after: | |
277 | logger.info( | |
278 | " The Uptime [{}] is incremented than [{}].......PASSED ".format( | |
279 | time_stamp_before, time_stamp_after | |
280 | ) | |
281 | ) | |
282 | return True | |
283 | else: | |
284 | logger.error( | |
285 | " The Uptime [{}] is expected to be incremented than [{}].......FAILED ".format( | |
286 | time_stamp_before, time_stamp_after | |
287 | ) | |
288 | ) | |
289 | return False | |
290 | else: | |
291 | logger.info( | |
292 | " The Uptime [{}] is not incremented than [{}] ".format( | |
293 | time_stamp_before, time_stamp_after | |
294 | ) | |
295 | ) | |
296 | return True | |
297 | ||
298 | ||
299 | ##################################################### | |
300 | # | |
301 | # Testcases | |
302 | # | |
303 | ##################################################### | |
304 | ||
305 | ||
306 | def test_verify_bgp_default_originate_with_default_static_route_p1(request): | |
307 | """ | |
308 | Summary: "Verify default-originate route with default static and network command " | |
309 | ||
310 | """ | |
311 | tgen = get_topogen() | |
312 | global BGP_CONVERGENCE, DEFAULT_ROUTE_NXT_HOP_LINK1, DEFAULT_ROUTE_NXT_HOP_LINK2, DEFAULT_ROUTES | |
313 | ||
314 | if BGP_CONVERGENCE != True: | |
315 | pytest.skip("skipped because of BGP Convergence failure") | |
316 | # test case name | |
317 | tc_name = request.node.name | |
318 | write_test_header(tc_name) | |
319 | if tgen.routers_have_failure(): | |
320 | check_router_status(tgen) | |
321 | reset_config_on_routers(tgen) | |
322 | ||
323 | step("Configure 2 link between R1 and R2") | |
324 | step("Configure IPV4 and IPV6 EBGP between R1 and R2 both the links") | |
325 | step("Configure default-originate on R1 IPv4 and IPv6 BGP session link-1 only ") | |
326 | local_as = get_dut_as_number(tgen, dut="r1") | |
327 | default_originate_config = { | |
328 | "r1": { | |
329 | "bgp": { | |
330 | "local_as": local_as, | |
331 | "address_family": { | |
332 | "ipv4": { | |
333 | "unicast": { | |
334 | "default_originate": {"r2": {"dest-link": "r1-link1"}} | |
335 | } | |
336 | }, | |
337 | "ipv6": { | |
338 | "unicast": { | |
339 | "default_originate": {"r2": {"dest-link": "r1-link1"}} | |
340 | } | |
341 | }, | |
342 | }, | |
343 | } | |
344 | } | |
345 | } | |
346 | result = create_router_bgp(tgen, topo, default_originate_config) | |
347 | assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) | |
348 | ||
349 | step("Verify IPv4/IPv6 default originate routes present on R2 nexthop as link-1") | |
350 | for addr_type in ADDR_TYPES: | |
351 | static_routes_input = { | |
352 | "r2": { | |
353 | "static_routes": [ | |
354 | { | |
355 | "network": [DEFAULT_ROUTES[addr_type]], | |
356 | "next_hop": DEFAULT_ROUTE_NXT_HOP_LINK1[addr_type], | |
357 | } | |
358 | ] | |
359 | } | |
360 | } | |
361 | ||
362 | result = verify_fib_routes( | |
363 | tgen, | |
364 | addr_type, | |
365 | "r2", | |
366 | static_routes_input, | |
367 | next_hop=DEFAULT_ROUTE_NXT_HOP_LINK1[addr_type], | |
368 | ) | |
369 | assert result is True, "Testcase {} : Failed \n Error: {}".format( | |
370 | tc_name, result | |
371 | ) | |
372 | ||
373 | result = verify_bgp_rib( | |
374 | tgen, | |
375 | addr_type, | |
376 | "r2", | |
377 | static_routes_input, | |
378 | next_hop=DEFAULT_ROUTE_NXT_HOP_LINK1[addr_type], | |
379 | ) | |
380 | assert result is True, "Testcase {} : Failed \n Error: {}".format( | |
381 | tc_name, result | |
382 | ) | |
383 | ||
384 | step( | |
385 | "Configure network command on R1 (0.0.0.0/0 and 0::0/0) for IPv4 and IPv6 address family " | |
386 | ) | |
387 | DEFAULT_ROUTES = {"ipv4": "0.0.0.0/0", "ipv6": "0::0/0"} | |
388 | for addr_type in ADDR_TYPES: | |
389 | input_advertise = { | |
390 | "r1": { | |
391 | "bgp": { | |
392 | "address_family": { | |
393 | addr_type: { | |
394 | "unicast": { | |
395 | "advertise_networks": [ | |
396 | {"network": [DEFAULT_ROUTES[addr_type]]} | |
397 | ] | |
398 | } | |
399 | } | |
400 | } | |
401 | } | |
402 | } | |
403 | } | |
404 | ||
405 | result = create_router_bgp(tgen, topo, input_advertise) | |
406 | assert result is True, "Testcase {} :Failed \n Error: {}".format( | |
407 | tc_name, result | |
408 | ) | |
409 | ||
410 | step("No change on IPv4/IPv6 default-originate route advertised from link1") | |
411 | result = verify_rib_default_route( | |
412 | tgen, | |
413 | topo, | |
414 | dut="r2", | |
415 | routes=DEFAULT_ROUTES, | |
416 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
417 | ) | |
418 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
419 | result = verify_fib_default_route( | |
420 | tgen, | |
421 | topo, | |
422 | dut="r2", | |
423 | routes=DEFAULT_ROUTES, | |
424 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
425 | ) | |
426 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
427 | ||
428 | step("verify 0.0.0.0/0 and 0::0/0 route also get advertised from link-2 ") | |
429 | result = verify_rib_default_route( | |
430 | tgen, | |
431 | topo, | |
432 | dut="r2", | |
433 | routes=DEFAULT_ROUTES, | |
434 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
435 | ) | |
436 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
437 | result = verify_fib_default_route( | |
438 | tgen, | |
439 | topo, | |
440 | dut="r2", | |
441 | routes=DEFAULT_ROUTES, | |
442 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
443 | ) | |
444 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
445 | ||
446 | step( | |
447 | "Before removing default originate from R1 link -1 IPv4 and IPv6 address family taking the uptime snapshot" | |
448 | ) | |
449 | uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
450 | uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
451 | ||
452 | step("Remove default originate from R1 link -1 IPv4 and IPv6 address family ") | |
453 | local_as = get_dut_as_number(tgen, dut="r1") | |
454 | default_originate_config = { | |
455 | "r1": { | |
456 | "bgp": { | |
457 | "local_as": local_as, | |
458 | "address_family": { | |
459 | "ipv4": { | |
460 | "unicast": { | |
461 | "default_originate": { | |
462 | "r2": {"dest-link": "r1-link1", "delete": True} | |
463 | } | |
464 | } | |
465 | }, | |
466 | "ipv6": { | |
467 | "unicast": { | |
468 | "default_originate": { | |
469 | "r2": {"dest-link": "r1-link1", "delete": True} | |
470 | } | |
471 | } | |
472 | }, | |
473 | }, | |
474 | } | |
475 | } | |
476 | } | |
477 | result = create_router_bgp(tgen, topo, default_originate_config) | |
478 | assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) | |
479 | ||
480 | step("Routes must be learned from network command") | |
481 | result = verify_rib_default_route( | |
482 | tgen, | |
483 | topo, | |
484 | dut="r2", | |
485 | routes=DEFAULT_ROUTES, | |
486 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
487 | ) | |
488 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
489 | result = verify_fib_default_route( | |
490 | tgen, | |
491 | topo, | |
492 | dut="r2", | |
493 | routes=DEFAULT_ROUTES, | |
494 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
495 | ) | |
496 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
497 | ||
498 | result = verify_rib_default_route( | |
499 | tgen, | |
500 | topo, | |
501 | dut="r2", | |
502 | routes=DEFAULT_ROUTES, | |
503 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
504 | ) | |
505 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
506 | result = verify_fib_default_route( | |
507 | tgen, | |
508 | topo, | |
509 | dut="r2", | |
510 | routes=DEFAULT_ROUTES, | |
511 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
512 | ) | |
513 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
514 | ||
515 | step("After removing the default originate on R1 taking the uptime snapshot") | |
516 | uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
517 | uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
518 | ||
519 | step( | |
520 | "After removing the default-originate uptime should get reset for link-1 learn route" | |
521 | ) | |
522 | result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False) | |
523 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
524 | ||
525 | result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False) | |
526 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
527 | ||
528 | step("Taking uptime snapshot before configuring default - originate") | |
529 | uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
530 | uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
531 | ||
532 | step( | |
533 | "Configure default-originate on R1 link-1 again for IPv4 and IPv6 address family" | |
534 | ) | |
535 | local_as = get_dut_as_number(tgen, dut="r1") | |
536 | default_originate_config = { | |
537 | "r1": { | |
538 | "bgp": { | |
539 | "local_as": local_as, | |
540 | "address_family": { | |
541 | "ipv4": { | |
542 | "unicast": { | |
543 | "default_originate": { | |
544 | "r2": { | |
545 | "dest-link": "r1-link1", | |
546 | } | |
547 | } | |
548 | } | |
549 | }, | |
550 | "ipv6": { | |
551 | "unicast": { | |
552 | "default_originate": { | |
553 | "r2": { | |
554 | "dest-link": "r1-link1", | |
555 | } | |
556 | } | |
557 | } | |
558 | }, | |
559 | }, | |
560 | } | |
561 | } | |
562 | } | |
563 | result = create_router_bgp(tgen, topo, default_originate_config) | |
564 | assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) | |
565 | ||
566 | step("Verify No change on R2 routing and BGP table for both the links ") | |
567 | result = verify_rib_default_route( | |
568 | tgen, | |
569 | topo, | |
570 | dut="r2", | |
571 | routes=DEFAULT_ROUTES, | |
572 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
573 | ) | |
574 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
575 | result = verify_fib_default_route( | |
576 | tgen, | |
577 | topo, | |
578 | dut="r2", | |
579 | routes=DEFAULT_ROUTES, | |
580 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
581 | ) | |
582 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
583 | ||
584 | result = verify_rib_default_route( | |
585 | tgen, | |
586 | topo, | |
587 | dut="r2", | |
588 | routes=DEFAULT_ROUTES, | |
589 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
590 | ) | |
591 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
592 | result = verify_fib_default_route( | |
593 | tgen, | |
594 | topo, | |
595 | dut="r2", | |
596 | routes=DEFAULT_ROUTES, | |
597 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
598 | ) | |
599 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
600 | ||
601 | step("Taking snapshot after configuring default - originate") | |
602 | uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
603 | uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
604 | ||
605 | step( | |
606 | "After configuring the default-originate uptime should not get reset for link-1 learn route" | |
607 | ) | |
608 | result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=True) | |
609 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
610 | ||
611 | result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=True) | |
612 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
613 | ||
614 | step("Taking uptime snapshot before removing network 0.0.0.0 ") | |
615 | uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
616 | uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
617 | ||
618 | step("Remove network command from R1 IPv4/IPv6 address family ") | |
619 | DEFAULT_ROUTES = {"ipv4": "0.0.0.0/0", "ipv6": "0::0/0"} | |
620 | for addr_type in ADDR_TYPES: | |
621 | input_advertise = { | |
622 | "r1": { | |
623 | "bgp": { | |
624 | "address_family": { | |
625 | addr_type: { | |
626 | "unicast": { | |
627 | "advertise_networks": [ | |
628 | { | |
629 | "network": [DEFAULT_ROUTES[addr_type]], | |
630 | "delete": True, | |
631 | } | |
632 | ] | |
633 | } | |
634 | } | |
635 | } | |
636 | } | |
637 | } | |
638 | } | |
639 | ||
640 | result = create_router_bgp(tgen, topo, input_advertise) | |
641 | assert result is True, "Testcase {} :Failed \n Error: {}".format( | |
642 | tc_name, result | |
643 | ) | |
644 | ||
645 | step( | |
646 | "Verify 0.0.0.0/0 and 0::0/0 route get removed from link-2 and default-originate IPv4/IPv6 route learn on link-1" | |
647 | ) | |
648 | result = verify_rib_default_route( | |
649 | tgen, | |
650 | topo, | |
651 | dut="r2", | |
652 | routes=DEFAULT_ROUTES, | |
653 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
654 | ) | |
655 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
656 | result = verify_fib_default_route( | |
657 | tgen, | |
658 | topo, | |
659 | dut="r2", | |
660 | routes=DEFAULT_ROUTES, | |
661 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
662 | ) | |
663 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
664 | ||
665 | result = verify_rib_default_route( | |
666 | tgen, | |
667 | topo, | |
668 | dut="r2", | |
669 | routes=DEFAULT_ROUTES, | |
670 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
671 | expected=False, | |
672 | ) | |
673 | assert ( | |
674 | result is not True | |
675 | ), "Testcase {} : Failed \n Route from link2 is not expected \n Error: {}".format( | |
676 | tc_name, result | |
677 | ) | |
678 | result = verify_fib_default_route( | |
679 | tgen, | |
680 | topo, | |
681 | dut="r2", | |
682 | routes=DEFAULT_ROUTES, | |
683 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
684 | expected=False, | |
685 | ) | |
686 | assert ( | |
687 | result is not True | |
688 | ), "Testcase {} : Failed\n Route from link2 is not expected \n Error: {}".format( | |
689 | tc_name, result | |
690 | ) | |
691 | ||
692 | uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
693 | uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
694 | ||
695 | step( | |
696 | "After removing default originate command on R1 verify that the uptime got reset on R2" | |
697 | ) | |
698 | ||
699 | result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False) | |
700 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
701 | ||
702 | result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False) | |
703 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
704 | ||
705 | step("Taking uptime snapshot before configuring static route network") | |
706 | uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
707 | uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
708 | ||
709 | step( | |
710 | "Configure static default route for IPv4 and IPv6 (0.0.0.0/0 next-hop Null0 and 0::0/0 next-hop Null0) on R1" | |
711 | ) | |
712 | static_routes_input = { | |
713 | "r1": { | |
714 | "static_routes": [ | |
715 | { | |
716 | "network": "0.0.0.0/0", | |
717 | "next_hop": NEXT_HOP_IP["ipv4"], | |
718 | }, | |
719 | { | |
720 | "network": "0::0/0", | |
721 | "next_hop": NEXT_HOP_IP["ipv6"], | |
722 | }, | |
723 | ] | |
724 | } | |
725 | } | |
726 | result = create_static_routes(tgen, static_routes_input) | |
727 | assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) | |
728 | ||
729 | step("verifyIPv4 and IPv6 static routes are configure and up on R1 ") | |
730 | for addr_type in ADDR_TYPES: | |
731 | static_routes_input = { | |
732 | "r1": { | |
733 | "static_routes": [ | |
734 | { | |
735 | "network": "0.0.0.0/0", | |
736 | "next_hop": NEXT_HOP_IP["ipv4"], | |
737 | }, | |
738 | { | |
739 | "network": "0::0/0", | |
740 | "next_hop": NEXT_HOP_IP["ipv6"], | |
741 | }, | |
742 | ] | |
743 | } | |
744 | } | |
745 | result = verify_fib_routes(tgen, addr_type, "r1", static_routes_input) | |
746 | assert result is True, "Testcase {} : Failed \n Error: {}".format( | |
747 | tc_name, result | |
748 | ) | |
749 | ||
750 | step("Configure redistribute static on IPv4 and IPv6 address family") | |
751 | redistribute_static = { | |
752 | "r1": { | |
753 | "bgp": { | |
754 | "address_family": { | |
755 | "ipv4": {"unicast": {"redistribute": [{"redist_type": "static"}]}}, | |
756 | "ipv6": {"unicast": {"redistribute": [{"redist_type": "static"}]}}, | |
757 | } | |
758 | } | |
759 | } | |
760 | } | |
761 | result = create_router_bgp(tgen, topo, redistribute_static) | |
762 | assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) | |
763 | ||
764 | step("Verify No change on IPv4/IPv6 default-originate route advertised from link1") | |
765 | result = verify_rib_default_route( | |
766 | tgen, | |
767 | topo, | |
768 | dut="r2", | |
769 | routes=DEFAULT_ROUTES, | |
770 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
771 | ) | |
772 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
773 | result = verify_fib_default_route( | |
774 | tgen, | |
775 | topo, | |
776 | dut="r2", | |
777 | routes=DEFAULT_ROUTES, | |
778 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
779 | ) | |
780 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
781 | ||
782 | step("verify 0.0.0.0/0 and 0::0/0 route also get advertised from link-2 ") | |
783 | result = verify_rib_default_route( | |
784 | tgen, | |
785 | topo, | |
786 | dut="r2", | |
787 | routes=DEFAULT_ROUTES, | |
788 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
789 | ) | |
790 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
791 | result = verify_fib_default_route( | |
792 | tgen, | |
793 | topo, | |
794 | dut="r2", | |
795 | routes=DEFAULT_ROUTES, | |
796 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
797 | expected=False, | |
798 | ) | |
799 | assert ( | |
800 | result is not True | |
801 | ), "Testcase {} : Failed\n Best Path sould be advertised in routes\n Error: {}".format( | |
802 | tc_name, result | |
803 | ) | |
804 | ||
805 | step("Taking uptime snapshot before removing default originate") | |
806 | uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
807 | uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
808 | ||
809 | step("Remove default-originate from link-1 from IPv4 and IPv6 neighbor ") | |
810 | local_as = get_dut_as_number(tgen, dut="r1") | |
811 | default_originate_config = { | |
812 | "r1": { | |
813 | "bgp": { | |
814 | "local_as": local_as, | |
815 | "address_family": { | |
816 | "ipv4": { | |
817 | "unicast": { | |
818 | "default_originate": { | |
819 | "r2": {"dest-link": "r1-link1", "delete": True} | |
820 | } | |
821 | } | |
822 | }, | |
823 | "ipv6": { | |
824 | "unicast": { | |
825 | "default_originate": { | |
826 | "r2": {"dest-link": "r1-link1", "delete": True} | |
827 | } | |
828 | } | |
829 | }, | |
830 | }, | |
831 | } | |
832 | } | |
833 | } | |
834 | result = create_router_bgp(tgen, topo, default_originate_config) | |
835 | assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) | |
836 | ||
837 | step("Taking uptime snapshot after removing default originate") | |
838 | uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
839 | uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
840 | ||
841 | step("verify the up time , up time should get reset ") | |
842 | result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False) | |
843 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
844 | ||
845 | result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False) | |
846 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
847 | ||
848 | step("Verify No change on IPv4/IPv6 default-originate route advertised from link1") | |
849 | result = verify_rib_default_route( | |
850 | tgen, | |
851 | topo, | |
852 | dut="r2", | |
853 | routes=DEFAULT_ROUTES, | |
854 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
855 | ) | |
856 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
857 | result = verify_fib_default_route( | |
858 | tgen, | |
859 | topo, | |
860 | dut="r2", | |
861 | routes=DEFAULT_ROUTES, | |
862 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
863 | ) | |
864 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
865 | ||
866 | result = verify_rib_default_route( | |
867 | tgen, | |
868 | topo, | |
869 | dut="r2", | |
870 | routes=DEFAULT_ROUTES, | |
871 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
872 | ) | |
873 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
874 | result = verify_fib_default_route( | |
875 | tgen, | |
876 | topo, | |
877 | dut="r2", | |
878 | routes=DEFAULT_ROUTES, | |
879 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
880 | ) | |
881 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
882 | ||
883 | step("Taking uptime snapshot before configuring default originate") | |
884 | uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
885 | uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
886 | ||
887 | step( | |
888 | " Configure default-originate on link-1 again for IPv4 and IPv6 address family" | |
889 | ) | |
890 | local_as = get_dut_as_number(tgen, dut="r1") | |
891 | default_originate_config = { | |
892 | "r1": { | |
893 | "bgp": { | |
894 | "local_as": local_as, | |
895 | "address_family": { | |
896 | "ipv4": { | |
897 | "unicast": { | |
898 | "default_originate": { | |
899 | "r2": { | |
900 | "dest-link": "r1-link1", | |
901 | } | |
902 | } | |
903 | } | |
904 | }, | |
905 | "ipv6": { | |
906 | "unicast": { | |
907 | "default_originate": { | |
908 | "r2": { | |
909 | "dest-link": "r1-link1", | |
910 | } | |
911 | } | |
912 | } | |
913 | }, | |
914 | }, | |
915 | } | |
916 | } | |
917 | } | |
918 | result = create_router_bgp(tgen, topo, default_originate_config) | |
919 | assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) | |
920 | ||
921 | step("Verify No change on IPv4/IPv6 default-originate route advertised from link1") | |
922 | result = verify_rib_default_route( | |
923 | tgen, | |
924 | topo, | |
925 | dut="r2", | |
926 | routes=DEFAULT_ROUTES, | |
927 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
928 | ) | |
929 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
930 | result = verify_fib_default_route( | |
931 | tgen, | |
932 | topo, | |
933 | dut="r2", | |
934 | routes=DEFAULT_ROUTES, | |
935 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
936 | ) | |
937 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
938 | ||
939 | result = verify_rib_default_route( | |
940 | tgen, | |
941 | topo, | |
942 | dut="r2", | |
943 | routes=DEFAULT_ROUTES, | |
944 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
945 | ) | |
946 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
947 | result = verify_fib_default_route( | |
948 | tgen, | |
949 | topo, | |
950 | dut="r2", | |
951 | routes=DEFAULT_ROUTES, | |
952 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
953 | expected=False, | |
954 | ) | |
955 | assert result is not True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
956 | ||
957 | step("Taking uptime snapshot after configuring default originate") | |
958 | uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
959 | uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
960 | ||
961 | step("After configuring the default originate the uptime should not get reset ") | |
962 | result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False) | |
963 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
964 | result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False) | |
965 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
966 | ||
967 | step("Taking uptime snapshot before removing redisctribute static ") | |
968 | uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
969 | uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
970 | ||
971 | step("Remove redistribute static from IPv4 and IPv6 address family ") | |
972 | input_dict_1 = { | |
973 | "r1": { | |
974 | "bgp": { | |
975 | "local_as": get_dut_as_number(tgen, dut="r1"), | |
976 | "address_family": { | |
977 | "ipv4": { | |
978 | "unicast": { | |
979 | "redistribute": [{"redist_type": "static", "delete": True}] | |
980 | } | |
981 | }, | |
982 | "ipv6": { | |
983 | "unicast": { | |
984 | "redistribute": [{"redist_type": "static", "delete": True}] | |
985 | } | |
986 | }, | |
987 | }, | |
988 | } | |
989 | } | |
990 | } | |
991 | ||
992 | result = create_router_bgp(tgen, topo, input_dict_1) | |
993 | assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result) | |
994 | ||
995 | step("Verify No change on IPv4/IPv6 default-originate route advertised from link1") | |
996 | result = verify_rib_default_route( | |
997 | tgen, | |
998 | topo, | |
999 | dut="r2", | |
1000 | routes=DEFAULT_ROUTES, | |
1001 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
1002 | ) | |
1003 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1004 | result = verify_fib_default_route( | |
1005 | tgen, | |
1006 | topo, | |
1007 | dut="r2", | |
1008 | routes=DEFAULT_ROUTES, | |
1009 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
1010 | ) | |
1011 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1012 | ||
1013 | result = verify_rib_default_route( | |
1014 | tgen, | |
1015 | topo, | |
1016 | dut="r2", | |
1017 | routes=DEFAULT_ROUTES, | |
1018 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
1019 | expected=False, | |
1020 | ) | |
1021 | assert result is not True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1022 | result = verify_fib_default_route( | |
1023 | tgen, | |
1024 | topo, | |
1025 | dut="r2", | |
1026 | routes=DEFAULT_ROUTES, | |
1027 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
1028 | expected=False, | |
1029 | ) | |
1030 | assert result is not True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1031 | ||
1032 | step("Taking uptime snapshot before removing redisctribute static ") | |
1033 | uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
1034 | uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
1035 | ||
1036 | step("After removing default originate the route uptime should get reset ") | |
1037 | result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=True) | |
1038 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1039 | ||
1040 | result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=True) | |
1041 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1042 | write_test_footer(tc_name) | |
1043 | ||
1044 | ||
1045 | def test_verify_bgp_default_originate_with_aggregate_summary_p1(request): | |
1046 | """ | |
1047 | Summary: "Verify default-originate route with aggregate summary command" | |
1048 | """ | |
1049 | tgen = get_topogen() | |
1050 | global BGP_CONVERGENCE | |
1051 | tc_name = request.node.name | |
1052 | write_test_header(tc_name) | |
1053 | if tgen.routers_have_failure(): | |
1054 | check_router_status(tgen) | |
1055 | reset_config_on_routers(tgen) | |
1056 | if BGP_CONVERGENCE != True: | |
1057 | pytest.skip("skipped because of BGP Convergence failure") | |
1058 | ||
1059 | step("After changing the BGP AS Path Verify the BGP Convergence") | |
1060 | BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo) | |
1061 | assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error: {}".format( | |
1062 | BGP_CONVERGENCE | |
1063 | ) | |
1064 | ||
1065 | step("Configure default-originate on R1 IPv4 and IPv6 BGP session link-1 only") | |
1066 | local_as = get_dut_as_number(tgen, dut="r1") | |
1067 | default_originate_config = { | |
1068 | "r1": { | |
1069 | "bgp": { | |
1070 | "local_as": local_as, | |
1071 | "address_family": { | |
1072 | "ipv4": { | |
1073 | "unicast": { | |
1074 | "default_originate": {"r2": {"dest-link": "r1-link1"}} | |
1075 | } | |
1076 | }, | |
1077 | "ipv6": { | |
1078 | "unicast": { | |
1079 | "default_originate": {"r2": {"dest-link": "r1-link1"}} | |
1080 | } | |
1081 | }, | |
1082 | }, | |
1083 | } | |
1084 | } | |
1085 | } | |
1086 | result = create_router_bgp(tgen, topo, default_originate_config) | |
1087 | assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) | |
1088 | ||
1089 | step( | |
1090 | "Verify IPv4/IPv6 default originate routes present on R2 nexthop as link-1,on R2" | |
1091 | ) | |
1092 | result = verify_rib_default_route( | |
1093 | tgen, | |
1094 | topo, | |
1095 | dut="r2", | |
1096 | routes=DEFAULT_ROUTES, | |
1097 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
1098 | ) | |
1099 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1100 | result = verify_fib_default_route( | |
1101 | tgen, | |
1102 | topo, | |
1103 | dut="r2", | |
1104 | routes=DEFAULT_ROUTES, | |
1105 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
1106 | ) | |
1107 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1108 | ||
1109 | step("Configure 5 static route for IPv4 and IPv6 on R0") | |
1110 | for addr_type in ADDR_TYPES: | |
1111 | input_advertise = { | |
1112 | "r1": { | |
1113 | "bgp": { | |
1114 | "address_family": { | |
1115 | addr_type: { | |
1116 | "unicast": { | |
1117 | "advertise_networks": [ | |
1118 | { | |
1119 | "network": [NETWORK1_1[addr_type]], | |
1120 | "next_hop": NEXT_HOP_IP[addr_type], | |
1121 | }, | |
1122 | { | |
1123 | "network": [NETWORK1_2[addr_type]], | |
1124 | "next_hop": NEXT_HOP_IP[addr_type], | |
1125 | }, | |
1126 | { | |
1127 | "network": [NETWORK1_3[addr_type]], | |
1128 | "next_hop": NEXT_HOP_IP[addr_type], | |
1129 | }, | |
1130 | { | |
1131 | "network": [NETWORK1_4[addr_type]], | |
1132 | "next_hop": NEXT_HOP_IP[addr_type], | |
1133 | }, | |
1134 | { | |
1135 | "network": [NETWORK1_5[addr_type]], | |
1136 | "next_hop": NEXT_HOP_IP[addr_type], | |
1137 | }, | |
1138 | ] | |
1139 | } | |
1140 | } | |
1141 | } | |
1142 | } | |
1143 | } | |
1144 | } | |
1145 | ||
1146 | result = create_router_bgp(tgen, topo, input_advertise) | |
1147 | assert result is True, "Testcase {} :Failed \n Error: {}".format( | |
1148 | tc_name, result | |
1149 | ) | |
1150 | ||
1151 | step("Before configuring the aggregate route taking uptime snapshot ") | |
1152 | uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
1153 | uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
1154 | ||
1155 | step("Configure aggregate summary command for IPv4 and IPv6 address family ") | |
1156 | local_as = get_dut_as_number(tgen, dut="r1") | |
1157 | raw_config = { | |
1158 | "r1": { | |
1159 | "raw_config": [ | |
1160 | "router bgp {}".format(local_as), | |
1161 | "address-family ipv4 unicast", | |
1162 | "aggregate-address {} summary-only".format("0.0.0.0/0 "), | |
1163 | "exit-address-family", | |
1164 | "address-family ipv6 unicast", | |
1165 | "aggregate-address {} summary-only".format("0::0/0"), | |
1166 | "exit-address-family", | |
1167 | ] | |
1168 | } | |
1169 | } | |
1170 | result = apply_raw_config(tgen, raw_config) | |
1171 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1172 | ||
1173 | step( | |
1174 | "verify that no change on IPv4/IPv6 default-originate route advertised from link1 0.0.0.0/0 and 0::0/0 route also get advertised from link-2 on R2" | |
1175 | ) | |
1176 | result = verify_rib_default_route( | |
1177 | tgen, | |
1178 | topo, | |
1179 | dut="r2", | |
1180 | routes=DEFAULT_ROUTES, | |
1181 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
1182 | ) | |
1183 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1184 | result = verify_fib_default_route( | |
1185 | tgen, | |
1186 | topo, | |
1187 | dut="r2", | |
1188 | routes=DEFAULT_ROUTES, | |
1189 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
1190 | ) | |
1191 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1192 | ||
1193 | result = verify_rib_default_route( | |
1194 | tgen, | |
1195 | topo, | |
1196 | dut="r2", | |
1197 | routes=DEFAULT_ROUTES, | |
1198 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
1199 | ) | |
1200 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1201 | result = verify_fib_default_route( | |
1202 | tgen, | |
1203 | topo, | |
1204 | dut="r2", | |
1205 | routes=DEFAULT_ROUTES, | |
1206 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
1207 | ) | |
1208 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1209 | ||
1210 | step("After configuring the aggregate route taking uptime snapshot ") | |
1211 | uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
1212 | uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
1213 | ||
1214 | step( | |
1215 | "After Configuring the aggregate route uptime should get reset for link-1 learn route" | |
1216 | ) | |
1217 | result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False) | |
1218 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1219 | ||
1220 | result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False) | |
1221 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1222 | ||
1223 | step("Before removing default originate taking uptime snapshot ") | |
1224 | uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
1225 | uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
1226 | ||
1227 | step("Remove default originate from R1 link -1 IPv4 and IPv6 address family") | |
1228 | local_as = get_dut_as_number(tgen, dut="r1") | |
1229 | default_originate_config = { | |
1230 | "r1": { | |
1231 | "bgp": { | |
1232 | "local_as": local_as, | |
1233 | "address_family": { | |
1234 | "ipv4": { | |
1235 | "unicast": { | |
1236 | "default_originate": { | |
1237 | "r2": {"dest-link": "r1-link1", "delete": True} | |
1238 | } | |
1239 | } | |
1240 | }, | |
1241 | "ipv6": { | |
1242 | "unicast": { | |
1243 | "default_originate": { | |
1244 | "r2": {"dest-link": "r1-link1", "delete": True} | |
1245 | } | |
1246 | } | |
1247 | }, | |
1248 | }, | |
1249 | } | |
1250 | } | |
1251 | } | |
1252 | result = create_router_bgp(tgen, topo, default_originate_config) | |
1253 | assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) | |
1254 | ||
1255 | step( | |
1256 | "verify that no change on IPv4/IPv6 default-originate route advertised from link1 0.0.0.0/0 and 0::0/0 route also get advertised from link-2 on R2" | |
1257 | ) | |
1258 | result = verify_rib_default_route( | |
1259 | tgen, | |
1260 | topo, | |
1261 | dut="r2", | |
1262 | routes=DEFAULT_ROUTES, | |
1263 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
1264 | ) | |
1265 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1266 | result = verify_fib_default_route( | |
1267 | tgen, | |
1268 | topo, | |
1269 | dut="r2", | |
1270 | routes=DEFAULT_ROUTES, | |
1271 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
1272 | ) | |
1273 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1274 | ||
1275 | step("After removing default origin taking uptime snapshot ") | |
1276 | uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
1277 | uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
1278 | ||
1279 | step( | |
1280 | "After removing the default-originate uptime should get reset for link-1 learn route" | |
1281 | ) | |
1282 | result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False) | |
1283 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1284 | ||
1285 | result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False) | |
1286 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1287 | ||
1288 | step("Before Configuring default origin taking uptime snapshot ") | |
1289 | uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
1290 | uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
1291 | ||
1292 | step( | |
1293 | "Configure default-originate on R1 link-1 again for IPv4 and IPv6 address family" | |
1294 | ) | |
1295 | local_as = get_dut_as_number(tgen, dut="r1") | |
1296 | default_originate_config = { | |
1297 | "r1": { | |
1298 | "bgp": { | |
1299 | "local_as": local_as, | |
1300 | "address_family": { | |
1301 | "ipv4": { | |
1302 | "unicast": { | |
1303 | "default_originate": { | |
1304 | "r2": { | |
1305 | "dest-link": "r1-link1", | |
1306 | } | |
1307 | } | |
1308 | } | |
1309 | }, | |
1310 | "ipv6": { | |
1311 | "unicast": { | |
1312 | "default_originate": { | |
1313 | "r2": { | |
1314 | "dest-link": "r1-link1", | |
1315 | } | |
1316 | } | |
1317 | } | |
1318 | }, | |
1319 | }, | |
1320 | } | |
1321 | } | |
1322 | } | |
1323 | result = create_router_bgp(tgen, topo, default_originate_config) | |
1324 | assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result) | |
1325 | ||
1326 | step("After Configuring default originate taking uptime snapshot") | |
1327 | uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
1328 | uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
1329 | ||
1330 | step( | |
1331 | "After Configuring the default-originate uptime should get reset for link-1 learn route" | |
1332 | ) | |
1333 | result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False) | |
1334 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1335 | ||
1336 | result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False) | |
1337 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1338 | ||
1339 | step("Before removing aggregate -summary command taking the uptime snapshot ") | |
1340 | uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
1341 | uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
1342 | ||
1343 | step("remove aggregate summary command for IPv4 and IPv6 address family ") | |
1344 | local_as = get_dut_as_number(tgen, dut="r1") | |
1345 | raw_config = { | |
1346 | "r1": { | |
1347 | "raw_config": [ | |
1348 | "router bgp {}".format(local_as), | |
1349 | "address-family ipv4 unicast", | |
1350 | "no aggregate-address {} summary-only".format("0.0.0.0/0"), | |
1351 | "exit-address-family", | |
1352 | "address-family ipv6 unicast", | |
1353 | "no aggregate-address {} summary-only".format("0::0/0"), | |
1354 | "exit-address-family", | |
1355 | ] | |
1356 | } | |
1357 | } | |
1358 | result = apply_raw_config(tgen, raw_config) | |
1359 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1360 | ||
1361 | step("Verify Default-originate IPv4/IPv6 route learn on link-1 ") | |
1362 | result = verify_rib_default_route( | |
1363 | tgen, | |
1364 | topo, | |
1365 | dut="r2", | |
1366 | routes=DEFAULT_ROUTES, | |
1367 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
1368 | ) | |
1369 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1370 | result = verify_fib_default_route( | |
1371 | tgen, | |
1372 | topo, | |
1373 | dut="r2", | |
1374 | routes=DEFAULT_ROUTES, | |
1375 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1, | |
1376 | ) | |
1377 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1378 | ||
1379 | step("Verify 0.0.0.0/0 and 0::0/0 route get removed from link-2 ") | |
1380 | result = verify_rib_default_route( | |
1381 | tgen, | |
1382 | topo, | |
1383 | dut="r2", | |
1384 | routes=DEFAULT_ROUTES, | |
1385 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
1386 | expected=False, | |
1387 | ) | |
1388 | assert result is not True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1389 | result = verify_fib_default_route( | |
1390 | tgen, | |
1391 | topo, | |
1392 | dut="r2", | |
1393 | routes=DEFAULT_ROUTES, | |
1394 | expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2, | |
1395 | expected=False, | |
1396 | ) | |
1397 | assert result is not True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1398 | ||
1399 | step("After removing aggregate -summary command taking the uptime snapshot ") | |
1400 | uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict) | |
1401 | uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict) | |
1402 | ||
1403 | step("After removing aggregate command uptime should get reset ") | |
1404 | result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False) | |
1405 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1406 | ||
1407 | result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False) | |
1408 | assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) | |
1409 | write_test_footer(tc_name) | |
1410 | ||
1411 | ||
1412 | if __name__ == "__main__": | |
1413 | args = ["-s"] + sys.argv[1:] | |
1414 | sys.exit(pytest.main(args)) |