]> git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/bgp_default_originate/test_bgp_default_originate_2links.py
Merge pull request #12791 from taspelund/loc_rib_json_fix
[mirror_frr.git] / tests / topotests / bgp_default_originate / test_bgp_default_originate_2links.py
1 #!/usr/bin/env python
2 # SPDX-License-Identifier: ISC
3 #
4 # Copyright (c) 2022 by VMware, Inc. ("VMware")
5 # Shreenidhi A R <rshreenidhi@vmware.com>
6 # Used Copyright (c) 2018 by Network Device Education Foundation, Inc. ("NetDEF")
7 # in this file.
8 #
9 """
10 Following tests are covered.
11 1. Verify default-originate route with default static and network command
12 2. Verify default-originate route with aggregate summary command
13 3. Verfiy default-originate behaviour in ecmp
14 """
15 import os
16 import sys
17 import time
18 import pytest
19 import datetime
20 from copy import deepcopy
21 from lib.topolog import logger
22
23 # pylint: disable=C0413
24 # Import topogen and topotest helpers
25 from lib.topogen import Topogen, get_topogen
26 from lib.topojson import build_config_from_json
27 from lib.topolog import logger
28
29 from lib.bgp import (
30 verify_bgp_convergence,
31 create_router_bgp,
32 verify_bgp_rib,
33 get_dut_as_number,
34 verify_rib_default_route,
35 verify_fib_default_route,
36 )
37 from lib.common_config import (
38 verify_fib_routes,
39 step,
40 create_prefix_lists,
41 run_frr_cmd,
42 create_route_maps,
43 shutdown_bringup_interface,
44 get_frr_ipv6_linklocal,
45 start_topology,
46 apply_raw_config,
47 write_test_header,
48 check_address_types,
49 write_test_footer,
50 reset_config_on_routers,
51 create_static_routes,
52 check_router_status,
53 )
54
55 # Save the Current Working Directory to find configuration files.
56 CWD = os.path.dirname(os.path.realpath(__file__))
57 sys.path.append(os.path.join(CWD, "../"))
58 sys.path.append(os.path.join(CWD, "../lib/"))
59
60 # Required to instantiate the topology builder class.
61
62 # pylint: disable=C0413
63 # Import topogen and topotest helpers
64
65 # Global variables
66 topo = None
67 NETWORK1_1 = {"ipv4": "198.51.1.1/32", "ipv6": "2001:DB8::1:1/128"}
68 NETWORK1_2 = {"ipv4": "198.51.1.2/32", "ipv6": "2001:DB8::1:2/128"}
69 NETWORK1_3 = {"ipv4": "198.51.1.3/32", "ipv6": "2001:DB8::1:3/128"}
70 NETWORK1_4 = {"ipv4": "198.51.1.4/32", "ipv6": "2001:DB8::1:4/128"}
71 NETWORK1_5 = {"ipv4": "198.51.1.5/32", "ipv6": "2001:DB8::1:5/128"}
72
73 ipv4_uptime_dict = {
74 "r2": {
75 "static_routes": [
76 {"network": "0.0.0.0/0"},
77 ]
78 }
79 }
80
81 ipv6_uptime_dict = {
82 "r2": {
83 "static_routes": [
84 {"network": "::/0"},
85 ]
86 }
87 }
88
89 DEFAULT_ROUTES = {"ipv4": "0.0.0.0/0", "ipv6": "0::0/0"}
90 NEXT_HOP_IP = {"ipv4": "Null0", "ipv6": "Null0"}
91
92 pytestmark = [pytest.mark.bgpd]
93
94
95 def setup_module(mod):
96 """
97 Sets up the pytest environment
98
99 * `mod`: module name
100 """
101 testsuite_run_time = time.asctime(time.localtime(time.time()))
102 logger.info("Testsuite start time: {}".format(testsuite_run_time))
103 logger.info("=" * 40)
104
105 logger.info("Running setup_module to create topology")
106
107 # This function initiates the topology build with Topogen...
108 json_file = "{}/bgp_default_originate_2links.json".format(CWD)
109 tgen = Topogen(json_file, mod.__name__)
110 global topo
111 topo = tgen.json_topo
112 # ... and here it calls Mininet initialization functions.
113
114 # Starting topology, create tmp files which are loaded to routers
115 # to start daemons and then start routers
116 start_topology(tgen)
117
118 # Creating configuration from JSON
119 build_config_from_json(tgen, topo)
120
121 global ADDR_TYPES
122 global BGP_CONVERGENCE
123 global DEFAULT_ROUTES
124 global DEFAULT_ROUTE_NXT_HOP_LINK1, DEFAULT_ROUTE_NXT_HOP_LINK2
125 ADDR_TYPES = check_address_types()
126 BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo)
127 assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error: {}".format(
128 BGP_CONVERGENCE
129 )
130
131 DEFAULT_ROUTES = {"ipv4": "0.0.0.0/0", "ipv6": "0::0/0"}
132
133 interface = topo["routers"]["r1"]["links"]["r2-link1"]["interface"]
134 ipv6_link_local = get_frr_ipv6_linklocal(tgen, "r1", intf=interface)
135 ipv4_nxt_hop = topo["routers"]["r1"]["links"]["r2-link1"]["ipv4"].split("/")[0]
136 ipv6_nxt_hop = topo["routers"]["r1"]["links"]["r2-link1"]["ipv6"].split("/")[0]
137 DEFAULT_ROUTE_NXT_HOP_LINK1 = {"ipv4": ipv4_nxt_hop, "ipv6": ipv6_link_local}
138
139 interface = topo["routers"]["r1"]["links"]["r2-link2"]["interface"]
140 ipv6_link_local = get_frr_ipv6_linklocal(tgen, "r1", intf=interface)
141 ipv4_nxt_hop = topo["routers"]["r1"]["links"]["r2-link2"]["ipv4"].split("/")[0]
142 ipv6_nxt_hop = topo["routers"]["r1"]["links"]["r2-link2"]["ipv6"].split("/")[0]
143 DEFAULT_ROUTE_NXT_HOP_LINK2 = {"ipv4": ipv4_nxt_hop, "ipv6": ipv6_link_local}
144 logger.info("Running setup_module() done")
145
146
147 def teardown_module():
148 """Teardown the pytest environment"""
149
150 logger.info("Running teardown_module to delete topology")
151
152 tgen = get_topogen()
153
154 # Stop toplogy and Remove tmp files
155 tgen.stop_topology()
156
157 logger.info(
158 "Testsuite end time: {}".format(time.asctime(time.localtime(time.time())))
159 )
160 logger.info("=" * 40)
161
162
163 #####################################################
164 #
165 # Local API's
166 #
167 #####################################################
168
169
170 def get_rib_route_uptime(tgen, addr_type, dut, input_dict):
171 """
172 Verify route uptime in RIB using "show ip route"
173
174 Parameters
175 ----------
176 * `tgen` : topogen object
177 * `addr_type` : ip type, ipv4/ipv6
178 * `dut`: Device Under Test, for which user wants to test the data
179 * `input_dict` : input dict, has details of static routes
180 * `route_uptime`: uptime of the routes
181
182 Usage
183 -----
184 # Creating static routes for r1
185 input_dict_r1 = {
186 "r1": {
187 "static_routes": [
188 {
189 "network": "147.10.13.4/32"
190 },
191 {
192 "network": "147.10.12.0/24"
193 },
194 {
195 "network": "147.10.13.4/32"
196 },
197 {
198 "network": "147.10.13.4/32"
199 },
200 {
201 "network": "147.10.13.4/32"
202 }
203 ]
204 }
205 }
206
207
208 Returns
209 -------
210 errormsg(str) or True
211 """
212
213 logger.info("Entering lib API: get_rib_route_uptime()")
214 route_time = []
215 out_route_dict = {}
216 router_list = tgen.routers()
217 for routerInput in input_dict.keys():
218 for router, rnode in router_list.items():
219 if router != dut:
220 continue
221
222 logger.info("Checking router %s RIB:", router)
223
224 # Verifying RIB routes
225 if addr_type == "ipv4":
226 command = "show ip route"
227 else:
228 command = "show ipv6 route"
229
230 if "static_routes" in input_dict[routerInput]:
231 static_routes = input_dict[routerInput]["static_routes"]
232
233 for static_route in static_routes:
234 if "vrf" in static_route and static_route["vrf"] is not None:
235
236 logger.info(
237 "[DUT: {}]: Verifying routes for VRF:"
238 " {}".format(router, static_route["vrf"])
239 )
240 cmd = "{} vrf {}".format(command, static_route["vrf"])
241
242 else:
243 cmd = "{}".format(command)
244
245 cmd = "{} json".format(cmd)
246
247 rib_routes_json = run_frr_cmd(rnode, cmd, isjson=True)
248
249 if bool(rib_routes_json) is False:
250 errormsg = "No route found in rib of router {}..".format(router)
251 return errormsg
252 network = static_route["network"]
253 route_time.append(rib_routes_json[network][0]["uptime"])
254
255 logger.info("Exiting lib API: get_rib_route_uptime()")
256 return route_time
257
258
259 def verify_the_uptime(time_stamp_before, time_stamp_after, incremented=None):
260 """
261 time_stamp_before : string the time stamp captured
262 time_stamp_after : string the time stamp captured
263 """
264 uptime_before = datetime.datetime.strptime(time_stamp_before[0], "%H:%M:%S")
265 uptime_after = datetime.datetime.strptime(time_stamp_after[0], "%H:%M:%S")
266
267 if incremented == True:
268 if uptime_before < uptime_after:
269 logger.info(
270 " The Uptime [{}] is incremented than [{}].......PASSED ".format(
271 time_stamp_before, time_stamp_after
272 )
273 )
274 return True
275 else:
276 logger.error(
277 " The Uptime [{}] is expected to be incremented than [{}].......FAILED ".format(
278 time_stamp_before, time_stamp_after
279 )
280 )
281 return False
282 else:
283 logger.info(
284 " The Uptime [{}] is not incremented than [{}] ".format(
285 time_stamp_before, time_stamp_after
286 )
287 )
288 return True
289
290
291 def get_best_path_route_in_FIB(tgen, topo, dut, network):
292 """
293 API to verify the best route in FIB and return the ipv4 and ipv6 nexthop for the given route
294 command
295 =======
296 show ip route
297 show ipv6 route
298 params
299 ======
300 dut : device under test :
301 network ; route (ip) to which the best route to be retrieved
302 Returns
303 ========
304 on success : return dict with next hops for the best hop
305 on failure : return error message with boolean False
306 """
307 is_ipv4_best_path_found = False
308 is_ipv6_best_path_found = False
309 rnode = tgen.routers()[dut]
310 ipv4_show_bgp_json = run_frr_cmd(rnode, "sh ip bgp json ", isjson=True)
311 ipv6_show_bgp_json = run_frr_cmd(
312 rnode, "sh ip bgp ipv6 unicast json ", isjson=True
313 )
314 output_dict = {"ipv4": None, "ipv6": None}
315 ipv4_nxt_hop_count = len(ipv4_show_bgp_json["routes"][network["ipv4"]])
316 for index in range(ipv4_nxt_hop_count):
317 if "bestpath" in ipv4_show_bgp_json["routes"][network["ipv4"]][index].keys():
318 best_path_ip = ipv4_show_bgp_json["routes"][network["ipv4"]][index][
319 "nexthops"
320 ][0]["ip"]
321 output_dict["ipv4"] = best_path_ip
322 logger.info(
323 "[DUT [{}]] Best path for the route {} is {} ".format(
324 dut, network["ipv4"], best_path_ip
325 )
326 )
327 is_ipv4_best_path_found = True
328 else:
329 logger.error("ERROR....! No Best Path Found in BGP RIB.... FAILED")
330
331 ipv6_nxt_hop_count = len(ipv6_show_bgp_json["routes"][network["ipv6"]])
332 for index in range(ipv6_nxt_hop_count):
333 if "bestpath" in ipv6_show_bgp_json["routes"][network["ipv6"]][index].keys():
334 ip_add_count = len(
335 ipv6_show_bgp_json["routes"][network["ipv6"]][index]["nexthops"]
336 )
337 for i_index in range(ip_add_count):
338 if (
339 "global"
340 in ipv6_show_bgp_json["routes"][network["ipv6"]][index]["nexthops"][
341 i_index
342 ]["scope"]
343 ):
344 best_path_ip = ipv6_show_bgp_json["routes"][network["ipv6"]][index][
345 "nexthops"
346 ][i_index]["ip"]
347 output_dict["ipv6"] = best_path_ip
348 logger.info(
349 "[DUT [{}]] Best path for the route {} is {} ".format(
350 dut, network["ipv6"], best_path_ip
351 )
352 )
353
354 else:
355 logger.error("ERROR....! No Best Path Found in BGP RIB.... FAILED")
356 if is_ipv4_best_path_found:
357 return output_dict
358 else:
359 logger.error("ERROR...! Unable to find the Best Path in the RIB")
360 return False
361
362
363 #####################################################
364 #
365 # Testcases
366 #
367 #####################################################
368
369
370 def test_verify_bgp_default_originate_with_default_static_route_p1(request):
371 """
372 Summary: "Verify default-originate route with default static and network command "
373
374 """
375 tgen = get_topogen()
376 global BGP_CONVERGENCE, DEFAULT_ROUTE_NXT_HOP_LINK1, DEFAULT_ROUTE_NXT_HOP_LINK2, DEFAULT_ROUTES
377
378 if BGP_CONVERGENCE != True:
379 pytest.skip("skipped because of BGP Convergence failure")
380 # test case name
381 tc_name = request.node.name
382 write_test_header(tc_name)
383 if tgen.routers_have_failure():
384 check_router_status(tgen)
385 reset_config_on_routers(tgen)
386
387 step("Configure 2 link between R1 and R2")
388 step("Configure IPV4 and IPV6 EBGP between R1 and R2 both the links")
389 step("Configure default-originate on R1 IPv4 and IPv6 BGP session link-1 only ")
390 local_as = get_dut_as_number(tgen, dut="r1")
391 default_originate_config = {
392 "r1": {
393 "bgp": {
394 "local_as": local_as,
395 "address_family": {
396 "ipv4": {
397 "unicast": {
398 "default_originate": {"r2": {"dest-link": "r1-link1"}}
399 }
400 },
401 "ipv6": {
402 "unicast": {
403 "default_originate": {"r2": {"dest-link": "r1-link1"}}
404 }
405 },
406 },
407 }
408 }
409 }
410 result = create_router_bgp(tgen, topo, default_originate_config)
411 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
412
413 step("Verify IPv4/IPv6 default originate routes present on R2 nexthop as link-1")
414 for addr_type in ADDR_TYPES:
415 static_routes_input = {
416 "r2": {
417 "static_routes": [
418 {
419 "network": [DEFAULT_ROUTES[addr_type]],
420 "next_hop": DEFAULT_ROUTE_NXT_HOP_LINK1[addr_type],
421 }
422 ]
423 }
424 }
425
426 result = verify_fib_routes(
427 tgen,
428 addr_type,
429 "r2",
430 static_routes_input,
431 next_hop=DEFAULT_ROUTE_NXT_HOP_LINK1[addr_type],
432 )
433 assert result is True, "Testcase {} : Failed \n Error: {}".format(
434 tc_name, result
435 )
436
437 result = verify_bgp_rib(
438 tgen,
439 addr_type,
440 "r2",
441 static_routes_input,
442 next_hop=DEFAULT_ROUTE_NXT_HOP_LINK1[addr_type],
443 )
444 assert result is True, "Testcase {} : Failed \n Error: {}".format(
445 tc_name, result
446 )
447
448 step(
449 "Configure network command on R1 (0.0.0.0/0 and 0::0/0) for IPv4 and IPv6 address family "
450 )
451 DEFAULT_ROUTES = {"ipv4": "0.0.0.0/0", "ipv6": "0::0/0"}
452 for addr_type in ADDR_TYPES:
453 input_advertise = {
454 "r1": {
455 "bgp": {
456 "address_family": {
457 addr_type: {
458 "unicast": {
459 "advertise_networks": [
460 {"network": [DEFAULT_ROUTES[addr_type]]}
461 ]
462 }
463 }
464 }
465 }
466 }
467 }
468
469 result = create_router_bgp(tgen, topo, input_advertise)
470 assert result is True, "Testcase {} :Failed \n Error: {}".format(
471 tc_name, result
472 )
473
474 step("No change on IPv4/IPv6 default-originate route advertised from link1")
475 result = verify_rib_default_route(
476 tgen,
477 topo,
478 dut="r2",
479 routes=DEFAULT_ROUTES,
480 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
481 )
482 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
483 result = verify_fib_default_route(
484 tgen,
485 topo,
486 dut="r2",
487 routes=DEFAULT_ROUTES,
488 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
489 )
490 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
491
492 step("verify 0.0.0.0/0 and 0::0/0 route also get advertised from link-2 ")
493 result = verify_rib_default_route(
494 tgen,
495 topo,
496 dut="r2",
497 routes=DEFAULT_ROUTES,
498 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
499 )
500 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
501 result = verify_fib_default_route(
502 tgen,
503 topo,
504 dut="r2",
505 routes=DEFAULT_ROUTES,
506 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
507 )
508 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
509
510 step(
511 "Before removing default originate from R1 link -1 IPv4 and IPv6 address family taking the uptime snapshot"
512 )
513 uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
514 uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
515
516 step("Remove default originate from R1 link -1 IPv4 and IPv6 address family ")
517 local_as = get_dut_as_number(tgen, dut="r1")
518 default_originate_config = {
519 "r1": {
520 "bgp": {
521 "local_as": local_as,
522 "address_family": {
523 "ipv4": {
524 "unicast": {
525 "default_originate": {
526 "r2": {"dest-link": "r1-link1", "delete": True}
527 }
528 }
529 },
530 "ipv6": {
531 "unicast": {
532 "default_originate": {
533 "r2": {"dest-link": "r1-link1", "delete": True}
534 }
535 }
536 },
537 },
538 }
539 }
540 }
541 result = create_router_bgp(tgen, topo, default_originate_config)
542 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
543
544 step("Routes must be learned from network command")
545 result = verify_rib_default_route(
546 tgen,
547 topo,
548 dut="r2",
549 routes=DEFAULT_ROUTES,
550 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
551 )
552 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
553 result = verify_fib_default_route(
554 tgen,
555 topo,
556 dut="r2",
557 routes=DEFAULT_ROUTES,
558 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
559 )
560 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
561
562 result = verify_rib_default_route(
563 tgen,
564 topo,
565 dut="r2",
566 routes=DEFAULT_ROUTES,
567 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
568 )
569 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
570 result = verify_fib_default_route(
571 tgen,
572 topo,
573 dut="r2",
574 routes=DEFAULT_ROUTES,
575 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
576 )
577 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
578
579 step("After removing the default originate on R1 taking the uptime snapshot")
580 uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
581 uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
582
583 step(
584 "After removing the default-originate uptime should get reset for link-1 learn route"
585 )
586 result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False)
587 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
588
589 result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False)
590 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
591
592 step("Taking uptime snapshot before configuring default - originate")
593 uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
594 uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
595
596 step(
597 "Configure default-originate on R1 link-1 again for IPv4 and IPv6 address family"
598 )
599 local_as = get_dut_as_number(tgen, dut="r1")
600 default_originate_config = {
601 "r1": {
602 "bgp": {
603 "local_as": local_as,
604 "address_family": {
605 "ipv4": {
606 "unicast": {
607 "default_originate": {
608 "r2": {
609 "dest-link": "r1-link1",
610 }
611 }
612 }
613 },
614 "ipv6": {
615 "unicast": {
616 "default_originate": {
617 "r2": {
618 "dest-link": "r1-link1",
619 }
620 }
621 }
622 },
623 },
624 }
625 }
626 }
627 result = create_router_bgp(tgen, topo, default_originate_config)
628 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
629
630 step("Verify No change on R2 routing and BGP table for both the links ")
631 result = verify_rib_default_route(
632 tgen,
633 topo,
634 dut="r2",
635 routes=DEFAULT_ROUTES,
636 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
637 )
638 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
639 result = verify_fib_default_route(
640 tgen,
641 topo,
642 dut="r2",
643 routes=DEFAULT_ROUTES,
644 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
645 )
646 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
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_LINK2,
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_LINK2,
662 )
663 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
664
665 step("Taking snapshot after configuring default - originate")
666 uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
667 uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
668
669 step(
670 "After configuring the default-originate uptime should not get reset for link-1 learn route"
671 )
672 result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=True)
673 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
674
675 result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=True)
676 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
677
678 step("Taking uptime snapshot before removing network 0.0.0.0 ")
679 uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
680 uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
681
682 step("Remove network command from R1 IPv4/IPv6 address family ")
683 DEFAULT_ROUTES = {"ipv4": "0.0.0.0/0", "ipv6": "0::0/0"}
684 for addr_type in ADDR_TYPES:
685 input_advertise = {
686 "r1": {
687 "bgp": {
688 "address_family": {
689 addr_type: {
690 "unicast": {
691 "advertise_networks": [
692 {
693 "network": [DEFAULT_ROUTES[addr_type]],
694 "delete": True,
695 }
696 ]
697 }
698 }
699 }
700 }
701 }
702 }
703
704 result = create_router_bgp(tgen, topo, input_advertise)
705 assert result is True, "Testcase {} :Failed \n Error: {}".format(
706 tc_name, result
707 )
708
709 step(
710 "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"
711 )
712 result = verify_rib_default_route(
713 tgen,
714 topo,
715 dut="r2",
716 routes=DEFAULT_ROUTES,
717 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
718 )
719 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
720 result = verify_fib_default_route(
721 tgen,
722 topo,
723 dut="r2",
724 routes=DEFAULT_ROUTES,
725 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
726 )
727 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
728
729 result = verify_rib_default_route(
730 tgen,
731 topo,
732 dut="r2",
733 routes=DEFAULT_ROUTES,
734 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
735 expected=False,
736 )
737 assert (
738 result is not True
739 ), "Testcase {} : Failed \n Route from link2 is not expected \n Error: {}".format(
740 tc_name, result
741 )
742 result = verify_fib_default_route(
743 tgen,
744 topo,
745 dut="r2",
746 routes=DEFAULT_ROUTES,
747 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
748 expected=False,
749 )
750 assert (
751 result is not True
752 ), "Testcase {} : Failed\n Route from link2 is not expected \n Error: {}".format(
753 tc_name, result
754 )
755
756 uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
757 uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
758
759 step(
760 "After removing default originate command on R1 verify that the uptime got reset on R2"
761 )
762
763 result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False)
764 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
765
766 result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False)
767 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
768
769 step("Taking uptime snapshot before configuring static route network")
770 uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
771 uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
772
773 step(
774 "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"
775 )
776 static_routes_input = {
777 "r1": {
778 "static_routes": [
779 {
780 "network": "0.0.0.0/0",
781 "next_hop": NEXT_HOP_IP["ipv4"],
782 },
783 {
784 "network": "0::0/0",
785 "next_hop": NEXT_HOP_IP["ipv6"],
786 },
787 ]
788 }
789 }
790 result = create_static_routes(tgen, static_routes_input)
791 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
792
793 step("verifyIPv4 and IPv6 static routes are configure and up on R1 ")
794 for addr_type in ADDR_TYPES:
795 static_routes_input = {
796 "r1": {
797 "static_routes": [
798 {
799 "network": "0.0.0.0/0",
800 "next_hop": NEXT_HOP_IP["ipv4"],
801 },
802 {
803 "network": "0::0/0",
804 "next_hop": NEXT_HOP_IP["ipv6"],
805 },
806 ]
807 }
808 }
809 result = verify_fib_routes(tgen, addr_type, "r1", static_routes_input)
810 assert result is True, "Testcase {} : Failed \n Error: {}".format(
811 tc_name, result
812 )
813
814 step("Configure redistribute static on IPv4 and IPv6 address family")
815 redistribute_static = {
816 "r1": {
817 "bgp": {
818 "address_family": {
819 "ipv4": {"unicast": {"redistribute": [{"redist_type": "static"}]}},
820 "ipv6": {"unicast": {"redistribute": [{"redist_type": "static"}]}},
821 }
822 }
823 }
824 }
825 result = create_router_bgp(tgen, topo, redistribute_static)
826 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
827
828 step("Verify No change on IPv4/IPv6 default-originate route advertised from link1")
829 result = verify_rib_default_route(
830 tgen,
831 topo,
832 dut="r2",
833 routes=DEFAULT_ROUTES,
834 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
835 )
836 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
837 result = verify_fib_default_route(
838 tgen,
839 topo,
840 dut="r2",
841 routes=DEFAULT_ROUTES,
842 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
843 )
844 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
845
846 step("verify 0.0.0.0/0 and 0::0/0 route also get advertised from link-2 ")
847 result = verify_rib_default_route(
848 tgen,
849 topo,
850 dut="r2",
851 routes=DEFAULT_ROUTES,
852 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
853 )
854 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
855 result = verify_fib_default_route(
856 tgen,
857 topo,
858 dut="r2",
859 routes=DEFAULT_ROUTES,
860 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
861 expected=False,
862 )
863 assert (
864 result is not True
865 ), "Testcase {} : Failed\n Best Path sould be advertised in routes\n Error: {}".format(
866 tc_name, result
867 )
868
869 step("Taking uptime snapshot before removing default originate")
870 uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
871 uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
872
873 step("Remove default-originate from link-1 from IPv4 and IPv6 neighbor ")
874 local_as = get_dut_as_number(tgen, dut="r1")
875 default_originate_config = {
876 "r1": {
877 "bgp": {
878 "local_as": local_as,
879 "address_family": {
880 "ipv4": {
881 "unicast": {
882 "default_originate": {
883 "r2": {"dest-link": "r1-link1", "delete": True}
884 }
885 }
886 },
887 "ipv6": {
888 "unicast": {
889 "default_originate": {
890 "r2": {"dest-link": "r1-link1", "delete": True}
891 }
892 }
893 },
894 },
895 }
896 }
897 }
898 result = create_router_bgp(tgen, topo, default_originate_config)
899 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
900
901 step("Taking uptime snapshot after removing default originate")
902 uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
903 uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
904
905 step("verify the up time , up time should get reset ")
906 result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False)
907 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
908
909 result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False)
910 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
911
912 step("Verify No change on IPv4/IPv6 default-originate route advertised from link1")
913 result = verify_rib_default_route(
914 tgen,
915 topo,
916 dut="r2",
917 routes=DEFAULT_ROUTES,
918 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
919 )
920 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
921 result = verify_fib_default_route(
922 tgen,
923 topo,
924 dut="r2",
925 routes=DEFAULT_ROUTES,
926 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
927 )
928 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
929
930 result = verify_rib_default_route(
931 tgen,
932 topo,
933 dut="r2",
934 routes=DEFAULT_ROUTES,
935 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
936 )
937 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
938 result = verify_fib_default_route(
939 tgen,
940 topo,
941 dut="r2",
942 routes=DEFAULT_ROUTES,
943 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
944 )
945 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
946
947 step("Taking uptime snapshot before configuring default originate")
948 uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
949 uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
950
951 step(
952 " Configure default-originate on link-1 again for IPv4 and IPv6 address family"
953 )
954 local_as = get_dut_as_number(tgen, dut="r1")
955 default_originate_config = {
956 "r1": {
957 "bgp": {
958 "local_as": local_as,
959 "address_family": {
960 "ipv4": {
961 "unicast": {
962 "default_originate": {
963 "r2": {
964 "dest-link": "r1-link1",
965 }
966 }
967 }
968 },
969 "ipv6": {
970 "unicast": {
971 "default_originate": {
972 "r2": {
973 "dest-link": "r1-link1",
974 }
975 }
976 }
977 },
978 },
979 }
980 }
981 }
982 result = create_router_bgp(tgen, topo, default_originate_config)
983 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
984
985 step("Verify No change on IPv4/IPv6 default-originate route advertised from link1")
986 result = verify_rib_default_route(
987 tgen,
988 topo,
989 dut="r2",
990 routes=DEFAULT_ROUTES,
991 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
992 )
993 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
994 result = verify_fib_default_route(
995 tgen,
996 topo,
997 dut="r2",
998 routes=DEFAULT_ROUTES,
999 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
1000 )
1001 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1002
1003 result = verify_rib_default_route(
1004 tgen,
1005 topo,
1006 dut="r2",
1007 routes=DEFAULT_ROUTES,
1008 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
1009 )
1010 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1011 result = verify_fib_default_route(
1012 tgen,
1013 topo,
1014 dut="r2",
1015 routes=DEFAULT_ROUTES,
1016 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
1017 expected=False,
1018 )
1019 assert result is not True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1020
1021 step("Taking uptime snapshot after configuring default originate")
1022 uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
1023 uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
1024
1025 step("After configuring the default originate the uptime should not get reset ")
1026 result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False)
1027 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1028 result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False)
1029 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1030
1031 step("Taking uptime snapshot before removing redisctribute static ")
1032 uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
1033 uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
1034
1035 step("Remove redistribute static from IPv4 and IPv6 address family ")
1036 input_dict_1 = {
1037 "r1": {
1038 "bgp": {
1039 "local_as": get_dut_as_number(tgen, dut="r1"),
1040 "address_family": {
1041 "ipv4": {
1042 "unicast": {
1043 "redistribute": [{"redist_type": "static", "delete": True}]
1044 }
1045 },
1046 "ipv6": {
1047 "unicast": {
1048 "redistribute": [{"redist_type": "static", "delete": True}]
1049 }
1050 },
1051 },
1052 }
1053 }
1054 }
1055
1056 result = create_router_bgp(tgen, topo, input_dict_1)
1057 assert result is True, "Testcase {} :Failed \n Error: {}".format(tc_name, result)
1058
1059 step("Verify No change on IPv4/IPv6 default-originate route advertised from link1")
1060 result = verify_rib_default_route(
1061 tgen,
1062 topo,
1063 dut="r2",
1064 routes=DEFAULT_ROUTES,
1065 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
1066 )
1067 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1068 result = verify_fib_default_route(
1069 tgen,
1070 topo,
1071 dut="r2",
1072 routes=DEFAULT_ROUTES,
1073 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
1074 )
1075 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1076
1077 result = verify_rib_default_route(
1078 tgen,
1079 topo,
1080 dut="r2",
1081 routes=DEFAULT_ROUTES,
1082 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
1083 expected=False,
1084 )
1085 assert result is not True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1086 result = verify_fib_default_route(
1087 tgen,
1088 topo,
1089 dut="r2",
1090 routes=DEFAULT_ROUTES,
1091 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
1092 expected=False,
1093 )
1094 assert result is not True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1095
1096 step("Taking uptime snapshot before removing redisctribute static ")
1097 uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
1098 uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
1099
1100 step("After removing default originate the route uptime should get reset ")
1101 result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=True)
1102 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1103
1104 result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=True)
1105 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1106 write_test_footer(tc_name)
1107
1108
1109 def test_verify_bgp_default_originate_with_aggregate_summary_p1(request):
1110 """
1111 Summary: "Verify default-originate route with aggregate summary command"
1112 """
1113 tgen = get_topogen()
1114 global BGP_CONVERGENCE
1115 tc_name = request.node.name
1116 write_test_header(tc_name)
1117 if tgen.routers_have_failure():
1118 check_router_status(tgen)
1119 reset_config_on_routers(tgen)
1120 if BGP_CONVERGENCE != True:
1121 pytest.skip("skipped because of BGP Convergence failure")
1122
1123 step("After changing the BGP AS Path Verify the BGP Convergence")
1124 BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo)
1125 assert BGP_CONVERGENCE is True, "setup_module :Failed \n Error: {}".format(
1126 BGP_CONVERGENCE
1127 )
1128
1129 step("Configure default-originate on R1 IPv4 and IPv6 BGP session link-1 only")
1130 local_as = get_dut_as_number(tgen, dut="r1")
1131 default_originate_config = {
1132 "r1": {
1133 "bgp": {
1134 "local_as": local_as,
1135 "address_family": {
1136 "ipv4": {
1137 "unicast": {
1138 "default_originate": {"r2": {"dest-link": "r1-link1"}}
1139 }
1140 },
1141 "ipv6": {
1142 "unicast": {
1143 "default_originate": {"r2": {"dest-link": "r1-link1"}}
1144 }
1145 },
1146 },
1147 }
1148 }
1149 }
1150 result = create_router_bgp(tgen, topo, default_originate_config)
1151 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
1152
1153 step(
1154 "Verify IPv4/IPv6 default originate routes present on R2 nexthop as link-1,on R2"
1155 )
1156 result = verify_rib_default_route(
1157 tgen,
1158 topo,
1159 dut="r2",
1160 routes=DEFAULT_ROUTES,
1161 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
1162 )
1163 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1164 result = verify_fib_default_route(
1165 tgen,
1166 topo,
1167 dut="r2",
1168 routes=DEFAULT_ROUTES,
1169 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
1170 )
1171 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1172
1173 step("Configure 5 static route for IPv4 and IPv6 on R0")
1174 for addr_type in ADDR_TYPES:
1175 input_advertise = {
1176 "r1": {
1177 "bgp": {
1178 "address_family": {
1179 addr_type: {
1180 "unicast": {
1181 "advertise_networks": [
1182 {
1183 "network": [NETWORK1_1[addr_type]],
1184 "next_hop": NEXT_HOP_IP[addr_type],
1185 },
1186 {
1187 "network": [NETWORK1_2[addr_type]],
1188 "next_hop": NEXT_HOP_IP[addr_type],
1189 },
1190 {
1191 "network": [NETWORK1_3[addr_type]],
1192 "next_hop": NEXT_HOP_IP[addr_type],
1193 },
1194 {
1195 "network": [NETWORK1_4[addr_type]],
1196 "next_hop": NEXT_HOP_IP[addr_type],
1197 },
1198 {
1199 "network": [NETWORK1_5[addr_type]],
1200 "next_hop": NEXT_HOP_IP[addr_type],
1201 },
1202 ]
1203 }
1204 }
1205 }
1206 }
1207 }
1208 }
1209
1210 result = create_router_bgp(tgen, topo, input_advertise)
1211 assert result is True, "Testcase {} :Failed \n Error: {}".format(
1212 tc_name, result
1213 )
1214
1215 step("Before configuring the aggregate route taking uptime snapshot ")
1216 uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
1217 uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
1218
1219 step("Configure aggregate summary command for IPv4 and IPv6 address family ")
1220 local_as = get_dut_as_number(tgen, dut="r1")
1221 raw_config = {
1222 "r1": {
1223 "raw_config": [
1224 "router bgp {}".format(local_as),
1225 "address-family ipv4 unicast",
1226 "aggregate-address {} summary-only".format("0.0.0.0/0 "),
1227 "exit-address-family",
1228 "address-family ipv6 unicast",
1229 "aggregate-address {} summary-only".format("0::0/0"),
1230 "exit-address-family",
1231 ]
1232 }
1233 }
1234 result = apply_raw_config(tgen, raw_config)
1235 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1236
1237 step(
1238 "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"
1239 )
1240 result = verify_rib_default_route(
1241 tgen,
1242 topo,
1243 dut="r2",
1244 routes=DEFAULT_ROUTES,
1245 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
1246 )
1247 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1248 result = verify_fib_default_route(
1249 tgen,
1250 topo,
1251 dut="r2",
1252 routes=DEFAULT_ROUTES,
1253 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
1254 )
1255 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1256
1257 result = verify_rib_default_route(
1258 tgen,
1259 topo,
1260 dut="r2",
1261 routes=DEFAULT_ROUTES,
1262 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
1263 )
1264 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1265 result = verify_fib_default_route(
1266 tgen,
1267 topo,
1268 dut="r2",
1269 routes=DEFAULT_ROUTES,
1270 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
1271 )
1272 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1273
1274 step("After configuring the aggregate route taking uptime snapshot ")
1275 uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
1276 uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
1277
1278 step(
1279 "After Configuring the aggregate route uptime should get reset for link-1 learn route"
1280 )
1281 result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False)
1282 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1283
1284 result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False)
1285 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1286
1287 step("Before removing default originate taking uptime snapshot ")
1288 uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
1289 uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
1290
1291 step("Remove default originate from R1 link -1 IPv4 and IPv6 address family")
1292 local_as = get_dut_as_number(tgen, dut="r1")
1293 default_originate_config = {
1294 "r1": {
1295 "bgp": {
1296 "local_as": local_as,
1297 "address_family": {
1298 "ipv4": {
1299 "unicast": {
1300 "default_originate": {
1301 "r2": {"dest-link": "r1-link1", "delete": True}
1302 }
1303 }
1304 },
1305 "ipv6": {
1306 "unicast": {
1307 "default_originate": {
1308 "r2": {"dest-link": "r1-link1", "delete": True}
1309 }
1310 }
1311 },
1312 },
1313 }
1314 }
1315 }
1316 result = create_router_bgp(tgen, topo, default_originate_config)
1317 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
1318
1319 step(
1320 "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"
1321 )
1322 result = verify_rib_default_route(
1323 tgen,
1324 topo,
1325 dut="r2",
1326 routes=DEFAULT_ROUTES,
1327 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
1328 )
1329 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1330 result = verify_fib_default_route(
1331 tgen,
1332 topo,
1333 dut="r2",
1334 routes=DEFAULT_ROUTES,
1335 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
1336 )
1337 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1338
1339 step("After removing default origin taking uptime snapshot ")
1340 uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
1341 uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
1342
1343 step(
1344 "After removing the default-originate uptime should get reset for link-1 learn route"
1345 )
1346 result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False)
1347 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1348
1349 result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False)
1350 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1351
1352 step("Before Configuring default origin taking uptime snapshot ")
1353 uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
1354 uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
1355
1356 step(
1357 "Configure default-originate on R1 link-1 again for IPv4 and IPv6 address family"
1358 )
1359 local_as = get_dut_as_number(tgen, dut="r1")
1360 default_originate_config = {
1361 "r1": {
1362 "bgp": {
1363 "local_as": local_as,
1364 "address_family": {
1365 "ipv4": {
1366 "unicast": {
1367 "default_originate": {
1368 "r2": {
1369 "dest-link": "r1-link1",
1370 }
1371 }
1372 }
1373 },
1374 "ipv6": {
1375 "unicast": {
1376 "default_originate": {
1377 "r2": {
1378 "dest-link": "r1-link1",
1379 }
1380 }
1381 }
1382 },
1383 },
1384 }
1385 }
1386 }
1387 result = create_router_bgp(tgen, topo, default_originate_config)
1388 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
1389
1390 step("After Configuring default originate taking uptime snapshot")
1391 uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
1392 uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
1393
1394 step(
1395 "After Configuring the default-originate uptime should get reset for link-1 learn route"
1396 )
1397 result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False)
1398 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1399
1400 result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False)
1401 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1402
1403 step("Before removing aggregate -summary command taking the uptime snapshot ")
1404 uptime_before_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
1405 uptime_before_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
1406
1407 step("remove aggregate summary command for IPv4 and IPv6 address family ")
1408 local_as = get_dut_as_number(tgen, dut="r1")
1409 raw_config = {
1410 "r1": {
1411 "raw_config": [
1412 "router bgp {}".format(local_as),
1413 "address-family ipv4 unicast",
1414 "no aggregate-address {} summary-only".format("0.0.0.0/0"),
1415 "exit-address-family",
1416 "address-family ipv6 unicast",
1417 "no aggregate-address {} summary-only".format("0::0/0"),
1418 "exit-address-family",
1419 ]
1420 }
1421 }
1422 result = apply_raw_config(tgen, raw_config)
1423 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1424
1425 step("Verify Default-originate IPv4/IPv6 route learn on link-1 ")
1426 result = verify_rib_default_route(
1427 tgen,
1428 topo,
1429 dut="r2",
1430 routes=DEFAULT_ROUTES,
1431 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
1432 )
1433 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1434 result = verify_fib_default_route(
1435 tgen,
1436 topo,
1437 dut="r2",
1438 routes=DEFAULT_ROUTES,
1439 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK1,
1440 )
1441 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1442
1443 step("Verify 0.0.0.0/0 and 0::0/0 route get removed from link-2 ")
1444 result = verify_rib_default_route(
1445 tgen,
1446 topo,
1447 dut="r2",
1448 routes=DEFAULT_ROUTES,
1449 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
1450 expected=False,
1451 )
1452 assert result is not True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1453 result = verify_fib_default_route(
1454 tgen,
1455 topo,
1456 dut="r2",
1457 routes=DEFAULT_ROUTES,
1458 expected_nexthop=DEFAULT_ROUTE_NXT_HOP_LINK2,
1459 expected=False,
1460 )
1461 assert result is not True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1462
1463 step("After removing aggregate -summary command taking the uptime snapshot ")
1464 uptime_after_ipv4 = get_rib_route_uptime(tgen, "ipv4", "r2", ipv4_uptime_dict)
1465 uptime_after_ipv6 = get_rib_route_uptime(tgen, "ipv6", "r2", ipv6_uptime_dict)
1466
1467 step("After removing aggregate command uptime should get reset ")
1468 result = verify_the_uptime(uptime_before_ipv4, uptime_after_ipv4, incremented=False)
1469 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1470
1471 result = verify_the_uptime(uptime_before_ipv6, uptime_after_ipv6, incremented=False)
1472 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1473 write_test_footer(tc_name)
1474
1475
1476 def test_verify_default_originate_with_2way_ecmp_p2(request):
1477 """
1478 Summary: "Verify default-originate route with 3 way ECMP and traffic "
1479 """
1480
1481 tgen = get_topogen()
1482 global BGP_CONVERGENCE
1483 global DEFAULT_ROUTES
1484 DEFAULT_ROUTES = {"ipv4": "0.0.0.0/0", "ipv6": "0::0/0"}
1485
1486 if BGP_CONVERGENCE != True:
1487 pytest.skip("skipped because of BGP Convergence failure")
1488 # test case name
1489 tc_name = request.node.name
1490 write_test_header(tc_name)
1491 if tgen.routers_have_failure():
1492 check_router_status(tgen)
1493 reset_config_on_routers(tgen)
1494
1495 step("Populating next-hops details")
1496 r1_r2_ipv4_neighbor_ips = []
1497 r1_r2_ipv6_neighbor_ips = []
1498 r1_link = None
1499 for index in range(1, 3):
1500 r1_link = "r1-link" + str(index)
1501 r1_r2_ipv4_neighbor_ips.append(
1502 topo["routers"]["r2"]["links"][r1_link]["ipv4"].split("/")[0]
1503 )
1504 r1_r2_ipv6_neighbor_ips.append(
1505 topo["routers"]["r2"]["links"][r1_link]["ipv6"].split("/")[0]
1506 )
1507
1508 step(
1509 "Configure default-originate on R1 for all the neighbor of IPv4 and IPv6 peers "
1510 )
1511 local_as = get_dut_as_number(tgen, dut="r1")
1512 for index in range(2):
1513 raw_config = {
1514 "r1": {
1515 "raw_config": [
1516 "router bgp {}".format(local_as),
1517 "address-family ipv4 unicast",
1518 "neighbor {} default-originate".format(
1519 r1_r2_ipv4_neighbor_ips[index]
1520 ),
1521 "exit-address-family",
1522 "address-family ipv6 unicast",
1523 "neighbor {} default-originate ".format(
1524 r1_r2_ipv6_neighbor_ips[index]
1525 ),
1526 "exit-address-family",
1527 ]
1528 }
1529 }
1530 result = apply_raw_config(tgen, raw_config)
1531 assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result)
1532
1533 step(
1534 "After configuring default-originate command , verify default routes are advertised on R2 "
1535 )
1536
1537 r2_link = None
1538 for index in range(1, 3):
1539 r2_link = "r2-link" + str(index)
1540 ipv4_nxt_hop = topo["routers"]["r1"]["links"][r2_link]["ipv4"].split("/")[0]
1541 interface = topo["routers"]["r1"]["links"][r2_link]["interface"]
1542 ipv6_link_local_nxt_hop = get_frr_ipv6_linklocal(tgen, "r1", intf=interface)
1543 DEFAULT_ROUTE_NXT_HOP = {"ipv4": ipv4_nxt_hop, "ipv6": ipv6_link_local_nxt_hop}
1544
1545 result = verify_rib_default_route(
1546 tgen,
1547 topo,
1548 dut="r2",
1549 routes=DEFAULT_ROUTES,
1550 expected_nexthop=DEFAULT_ROUTE_NXT_HOP,
1551 )
1552 assert result is True, "Testcase {} : Failed \n Error: {}".format(
1553 tc_name, result
1554 )
1555
1556 step("Ping R1 configure IPv4 and IPv6 loopback address from R2")
1557 pingaddr = topo["routers"]["r1"]["links"]["lo"]["ipv4"].split("/")[0]
1558 router = tgen.gears["r2"]
1559 output = router.run("ping -c 4 -w 4 {}".format(pingaddr))
1560 assert " 0% packet loss" in output, "Ping R1->R2 FAILED"
1561 logger.info("Ping from R1 to R2 ... success")
1562
1563 step("Shuting up the active route")
1564 network = {"ipv4": "0.0.0.0/0", "ipv6": "::/0"}
1565 ipv_dict = get_best_path_route_in_FIB(tgen, topo, dut="r2", network=network)
1566 dut_links = topo["routers"]["r1"]["links"]
1567 active_interface = None
1568 for key, values in dut_links.items():
1569 ipv4_address = dut_links[key]["ipv4"].split("/")[0]
1570 ipv6_address = dut_links[key]["ipv6"].split("/")[0]
1571 if ipv_dict["ipv4"] == ipv4_address and ipv_dict["ipv6"] == ipv6_address:
1572 active_interface = dut_links[key]["interface"]
1573
1574 logger.info(
1575 "Shutting down the interface {} on router {} ".format(active_interface, "r1")
1576 )
1577 shutdown_bringup_interface(tgen, "r1", active_interface, False)
1578
1579 step("Verify the complete convergence to fail after shutting the interface")
1580 result = verify_bgp_convergence(tgen, topo, expected=False)
1581 assert (
1582 result is not True
1583 ), " Testcase {} : After shuting down the interface Convergence is expected to be Failed".format(
1584 tc_name
1585 )
1586
1587 step(
1588 "Verify routes from active best path is not received from r1 after shuting the interface"
1589 )
1590 r2_link = None
1591 for index in range(1, 3):
1592 r2_link = "r2-link" + str(index)
1593 ipv4_nxt_hop = topo["routers"]["r1"]["links"][r2_link]["ipv4"].split("/")[0]
1594 interface = topo["routers"]["r1"]["links"][r2_link]["interface"]
1595 ipv6_link_local_nxt_hop = get_frr_ipv6_linklocal(tgen, "r1", intf=interface)
1596 DEFAULT_ROUTE_NXT_HOP = {"ipv4": ipv4_nxt_hop, "ipv6": ipv6_link_local_nxt_hop}
1597 if index == 1:
1598 result = verify_rib_default_route(
1599 tgen,
1600 topo,
1601 dut="r2",
1602 routes=DEFAULT_ROUTES,
1603 expected_nexthop=DEFAULT_ROUTE_NXT_HOP,
1604 expected=False,
1605 )
1606 assert result is not True, "Testcase {} : Failed \n Error: {}".format(
1607 tc_name, result
1608 )
1609 else:
1610 result = verify_rib_default_route(
1611 tgen,
1612 topo,
1613 dut="r2",
1614 routes=DEFAULT_ROUTES,
1615 expected_nexthop=DEFAULT_ROUTE_NXT_HOP,
1616 )
1617 assert result is True, "Testcase {} : Failed \n Error: {}".format(
1618 tc_name, result
1619 )
1620
1621 step("Ping R1 configure IPv4 and IPv6 loopback address from R2")
1622 pingaddr = topo["routers"]["r1"]["links"]["lo"]["ipv4"].split("/")[0]
1623 router = tgen.gears["r2"]
1624 output = router.run("ping -c 4 -w 4 {}".format(pingaddr))
1625 assert " 0% packet loss" in output, "Ping R1->R2 FAILED"
1626 logger.info("Ping from R1 to R2 ... success")
1627
1628 step("No Shuting up the active route")
1629
1630 shutdown_bringup_interface(tgen, "r1", active_interface, True)
1631
1632 step("Verify the complete convergence after bringup the interface")
1633 result = verify_bgp_convergence(tgen, topo)
1634 assert (
1635 result is True
1636 ), " Testcase {} : After bringing up the interface complete convergence is expected ".format(
1637 tc_name
1638 )
1639
1640 step("Verify all the routes are received from r1 after no shuting the interface")
1641 r2_link = None
1642 for index in range(1, 3):
1643 r2_link = "r2-link" + str(index)
1644 ipv4_nxt_hop = topo["routers"]["r1"]["links"][r2_link]["ipv4"].split("/")[0]
1645 interface = topo["routers"]["r1"]["links"][r2_link]["interface"]
1646 ipv6_link_local_nxt_hop = get_frr_ipv6_linklocal(tgen, "r1", intf=interface)
1647 DEFAULT_ROUTE_NXT_HOP = {"ipv4": ipv4_nxt_hop, "ipv6": ipv6_link_local_nxt_hop}
1648 if index == 1:
1649 result = verify_rib_default_route(
1650 tgen,
1651 topo,
1652 dut="r2",
1653 routes=DEFAULT_ROUTES,
1654 expected_nexthop=DEFAULT_ROUTE_NXT_HOP,
1655 )
1656 assert result is True, "Testcase {} : Failed \n Error: {}".format(
1657 tc_name, result
1658 )
1659 else:
1660 result = verify_rib_default_route(
1661 tgen,
1662 topo,
1663 dut="r2",
1664 routes=DEFAULT_ROUTES,
1665 expected_nexthop=DEFAULT_ROUTE_NXT_HOP,
1666 )
1667 assert result is True, "Testcase {} : Failed \n Error: {}".format(
1668 tc_name, result
1669 )
1670
1671 step(
1672 "Configure IPv4 and IPv6 route-map with deny option on R2 to filter default route 0.0.0.0/0 and 0::0/0"
1673 )
1674 DEFAULT_ROUTES = {"ipv4": "0.0.0.0/0", "ipv6": "0::0/0"}
1675 input_dict_3 = {
1676 "r2": {
1677 "prefix_lists": {
1678 "ipv4": {
1679 "Pv4": [
1680 {
1681 "seqid": "1",
1682 "network": DEFAULT_ROUTES["ipv4"],
1683 "action": "permit",
1684 }
1685 ]
1686 },
1687 "ipv6": {
1688 "Pv6": [
1689 {
1690 "seqid": "1",
1691 "network": DEFAULT_ROUTES["ipv6"],
1692 "action": "permit",
1693 }
1694 ]
1695 },
1696 }
1697 }
1698 }
1699 result = create_prefix_lists(tgen, input_dict_3)
1700 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
1701
1702 input_dict_3 = {
1703 "r2": {
1704 "route_maps": {
1705 "RMv4": [
1706 {
1707 "action": "deny",
1708 "seq_id": "1",
1709 "match": {"ipv4": {"prefix_lists": "Pv4"}},
1710 },
1711 ],
1712 "RMv6": [
1713 {
1714 "action": "deny",
1715 "seq_id": "1",
1716 "match": {"ipv6": {"prefix_lists": "Pv6"}},
1717 },
1718 ],
1719 }
1720 }
1721 }
1722 result = create_route_maps(tgen, input_dict_3)
1723 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
1724
1725 step("Apply route-map IN direction of R2 ( R2-R1) for IPv4 and IPv6 BGP neighbors")
1726 r2_link = None
1727 for index in range(1, 3):
1728 r2_link = "r2-link" + str(index)
1729 input_dict_4 = {
1730 "r2": {
1731 "bgp": {
1732 "address_family": {
1733 "ipv4": {
1734 "unicast": {
1735 "neighbor": {
1736 "r1": {
1737 "dest_link": {
1738 r2_link: {
1739 "route_maps": [
1740 {"name": "RMv4", "direction": "in"}
1741 ]
1742 },
1743 }
1744 }
1745 }
1746 }
1747 },
1748 "ipv6": {
1749 "unicast": {
1750 "neighbor": {
1751 "r1": {
1752 "dest_link": {
1753 r2_link: {
1754 "route_maps": [
1755 {"name": "RMv6", "direction": "in"}
1756 ]
1757 },
1758 }
1759 }
1760 }
1761 }
1762 },
1763 }
1764 }
1765 }
1766 }
1767 result = create_router_bgp(tgen, topo, input_dict_4)
1768 assert result is True, "Testcase {} : Failed \n Error: {}".format(
1769 tc_name, result
1770 )
1771
1772 step("After applying the route-map the routes are not expected in RIB ")
1773 r2_link = None
1774 for index in range(1, 3):
1775 r2_link = "r2-link" + str(index)
1776 ipv4_nxt_hop = topo["routers"]["r1"]["links"][r2_link]["ipv4"].split("/")[0]
1777 interface = topo["routers"]["r1"]["links"][r2_link]["interface"]
1778 ipv6_link_local_nxt_hop = get_frr_ipv6_linklocal(tgen, "r1", intf=interface)
1779 DEFAULT_ROUTE_NXT_HOP = {"ipv4": ipv4_nxt_hop, "ipv6": ipv6_link_local_nxt_hop}
1780
1781 result = verify_rib_default_route(
1782 tgen,
1783 topo,
1784 dut="r2",
1785 routes=DEFAULT_ROUTES,
1786 expected_nexthop=DEFAULT_ROUTE_NXT_HOP,
1787 expected=False,
1788 )
1789 assert result is not True, "Testcase {} : Failed \n Error: {}".format(
1790 tc_name, result
1791 )
1792
1793 write_test_footer(tc_name)
1794
1795
1796 if __name__ == "__main__":
1797 args = ["-s"] + sys.argv[1:]
1798 sys.exit(pytest.main(args))