3 # Copyright (c) 2022 by VMware, Inc. ("VMware")
4 # Used Copyright (c) 2018 by Network Device Education Foundation, Inc. ("NetDEF")
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
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
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
31 from copy
import deepcopy
32 from lib
.topolog
import logger
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
41 verify_bgp_convergence
,
45 verify_rib_default_route
,
46 verify_fib_default_route
,
48 from lib
.common_config
import (
52 get_frr_ipv6_linklocal
,
58 reset_config_on_routers
,
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/"))
68 # Required to instantiate the topology builder class.
70 # pylint: disable=C0413
71 # Import topogen and topotest helpers
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"}
84 {"network": "0.0.0.0/0"},
97 DEFAULT_ROUTES
= {"ipv4": "0.0.0.0/0", "ipv6": "0::0/0"}
98 NEXT_HOP_IP
= {"ipv4": "Null0", "ipv6": "Null0"}
100 pytestmark
= [pytest
.mark
.bgpd
]
103 def setup_module(mod
):
105 Sets up the pytest environment
109 testsuite_run_time
= time
.asctime(time
.localtime(time
.time()))
110 logger
.info("Testsuite start time: {}".format(testsuite_run_time
))
111 logger
.info("=" * 40)
113 logger
.info("Running setup_module to create topology")
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
__)
119 topo
= tgen
.json_topo
120 # ... and here it calls Mininet initialization functions.
122 # Starting topology, create tmp files which are loaded to routers
123 # to start daemons and then start routers
126 # Creating configuration from JSON
127 build_config_from_json(tgen
, topo
)
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(
139 DEFAULT_ROUTES
= {"ipv4": "0.0.0.0/0", "ipv6": "0::0/0"}
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
}
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")
155 def teardown_module():
156 """Teardown the pytest environment"""
158 logger
.info("Running teardown_module to delete topology")
162 # Stop toplogy and Remove tmp files
166 "Testsuite end time: {}".format(time
.asctime(time
.localtime(time
.time())))
168 logger
.info("=" * 40)
171 #####################################################
175 #####################################################
178 def get_rib_route_uptime(tgen
, addr_type
, dut
, input_dict
):
180 Verify route uptime in RIB using "show ip route"
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
192 # Creating static routes for r1
197 "network": "147.10.13.4/32"
200 "network": "147.10.12.0/24"
203 "network": "147.10.13.4/32"
206 "network": "147.10.13.4/32"
209 "network": "147.10.13.4/32"
218 errormsg(str) or True
221 logger
.info("Entering lib API: get_rib_route_uptime()")
224 router_list
= tgen
.routers()
225 for routerInput
in input_dict
.keys():
226 for router
, rnode
in router_list
.items():
230 logger
.info("Checking router %s RIB:", router
)
232 # Verifying RIB routes
233 if addr_type
== "ipv4":
234 command
= "show ip route"
236 command
= "show ipv6 route"
238 if "static_routes" in input_dict
[routerInput
]:
239 static_routes
= input_dict
[routerInput
]["static_routes"]
241 for static_route
in static_routes
:
242 if "vrf" in static_route
and static_route
["vrf"] is not None:
245 "[DUT: {}]: Verifying routes for VRF:"
246 " {}".format(router
, static_route
["vrf"])
248 cmd
= "{} vrf {}".format(command
, static_route
["vrf"])
251 cmd
= "{}".format(command
)
253 cmd
= "{} json".format(cmd
)
255 rib_routes_json
= run_frr_cmd(rnode
, cmd
, isjson
=True)
257 if bool(rib_routes_json
) is False:
258 errormsg
= "No route found in rib of router {}..".format(router
)
260 network
= static_route
["network"]
261 route_time
.append(rib_routes_json
[network
][0]["uptime"])
263 logger
.info("Exiting lib API: get_rib_route_uptime()")
267 def verify_the_uptime(time_stamp_before
, time_stamp_after
, incremented
=None):
269 time_stamp_before : string the time stamp captured
270 time_stamp_after : string the time stamp captured
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")
275 if incremented
== True:
276 if uptime_before
< uptime_after
:
278 " The Uptime [{}] is incremented than [{}].......PASSED ".format(
279 time_stamp_before
, time_stamp_after
285 " The Uptime [{}] is expected to be incremented than [{}].......FAILED ".format(
286 time_stamp_before
, time_stamp_after
292 " The Uptime [{}] is not incremented than [{}] ".format(
293 time_stamp_before
, time_stamp_after
299 #####################################################
303 #####################################################
306 def test_verify_bgp_default_originate_with_default_static_route_p1(request
):
308 Summary: "Verify default-originate route with default static and network command "
312 global BGP_CONVERGENCE
, DEFAULT_ROUTE_NXT_HOP_LINK1
, DEFAULT_ROUTE_NXT_HOP_LINK2
, DEFAULT_ROUTES
314 if BGP_CONVERGENCE
!= True:
315 pytest
.skip("skipped because of BGP Convergence failure")
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
)
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
= {
330 "local_as": local_as
,
334 "default_originate": {"r2": {"dest-link": "r1-link1"}}
339 "default_originate": {"r2": {"dest-link": "r1-link1"}}
346 result
= create_router_bgp(tgen
, topo
, default_originate_config
)
347 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
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
= {
355 "network": [DEFAULT_ROUTES
[addr_type
]],
356 "next_hop": DEFAULT_ROUTE_NXT_HOP_LINK1
[addr_type
],
362 result
= verify_fib_routes(
367 next_hop
=DEFAULT_ROUTE_NXT_HOP_LINK1
[addr_type
],
369 assert result
is True, "Testcase {} : Failed \n Error: {}".format(
373 result
= verify_bgp_rib(
378 next_hop
=DEFAULT_ROUTE_NXT_HOP_LINK1
[addr_type
],
380 assert result
is True, "Testcase {} : Failed \n Error: {}".format(
385 "Configure network command on R1 (0.0.0.0/0 and 0::0/0) for IPv4 and IPv6 address family "
387 DEFAULT_ROUTES
= {"ipv4": "0.0.0.0/0", "ipv6": "0::0/0"}
388 for addr_type
in ADDR_TYPES
:
395 "advertise_networks": [
396 {"network": [DEFAULT_ROUTES
[addr_type
]]}
405 result
= create_router_bgp(tgen
, topo
, input_advertise
)
406 assert result
is True, "Testcase {} :Failed \n Error: {}".format(
410 step("No change on IPv4/IPv6 default-originate route advertised from link1")
411 result
= verify_rib_default_route(
415 routes
=DEFAULT_ROUTES
,
416 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
418 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
419 result
= verify_fib_default_route(
423 routes
=DEFAULT_ROUTES
,
424 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
426 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
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(
433 routes
=DEFAULT_ROUTES
,
434 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
436 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
437 result
= verify_fib_default_route(
441 routes
=DEFAULT_ROUTES
,
442 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
444 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
447 "Before removing default originate from R1 link -1 IPv4 and IPv6 address family taking the uptime snapshot"
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
)
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
= {
457 "local_as": local_as
,
461 "default_originate": {
462 "r2": {"dest-link": "r1-link1", "delete": True}
468 "default_originate": {
469 "r2": {"dest-link": "r1-link1", "delete": True}
477 result
= create_router_bgp(tgen
, topo
, default_originate_config
)
478 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
480 step("Routes must be learned from network command")
481 result
= verify_rib_default_route(
485 routes
=DEFAULT_ROUTES
,
486 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
488 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
489 result
= verify_fib_default_route(
493 routes
=DEFAULT_ROUTES
,
494 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
496 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
498 result
= verify_rib_default_route(
502 routes
=DEFAULT_ROUTES
,
503 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
505 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
506 result
= verify_fib_default_route(
510 routes
=DEFAULT_ROUTES
,
511 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
513 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
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
)
520 "After removing the default-originate uptime should get reset for link-1 learn route"
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
)
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
)
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
)
533 "Configure default-originate on R1 link-1 again for IPv4 and IPv6 address family"
535 local_as
= get_dut_as_number(tgen
, dut
="r1")
536 default_originate_config
= {
539 "local_as": local_as
,
543 "default_originate": {
545 "dest-link": "r1-link1",
552 "default_originate": {
554 "dest-link": "r1-link1",
563 result
= create_router_bgp(tgen
, topo
, default_originate_config
)
564 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
566 step("Verify No change on R2 routing and BGP table for both the links ")
567 result
= verify_rib_default_route(
571 routes
=DEFAULT_ROUTES
,
572 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
574 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
575 result
= verify_fib_default_route(
579 routes
=DEFAULT_ROUTES
,
580 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
582 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
584 result
= verify_rib_default_route(
588 routes
=DEFAULT_ROUTES
,
589 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
591 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
592 result
= verify_fib_default_route(
596 routes
=DEFAULT_ROUTES
,
597 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
599 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
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
)
606 "After configuring the default-originate uptime should not get reset for link-1 learn route"
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
)
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
)
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
)
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
:
627 "advertise_networks": [
629 "network": [DEFAULT_ROUTES
[addr_type
]],
640 result
= create_router_bgp(tgen
, topo
, input_advertise
)
641 assert result
is True, "Testcase {} :Failed \n Error: {}".format(
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"
648 result
= verify_rib_default_route(
652 routes
=DEFAULT_ROUTES
,
653 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
655 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
656 result
= verify_fib_default_route(
660 routes
=DEFAULT_ROUTES
,
661 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
663 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
665 result
= verify_rib_default_route(
669 routes
=DEFAULT_ROUTES
,
670 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
675 ), "Testcase {} : Failed \n Route from link2 is not expected \n Error: {}".format(
678 result
= verify_fib_default_route(
682 routes
=DEFAULT_ROUTES
,
683 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
688 ), "Testcase {} : Failed\n Route from link2 is not expected \n Error: {}".format(
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
)
696 "After removing default originate command on R1 verify that the uptime got reset on R2"
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
)
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
)
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
)
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"
712 static_routes_input
= {
716 "network": "0.0.0.0/0",
717 "next_hop": NEXT_HOP_IP
["ipv4"],
721 "next_hop": NEXT_HOP_IP
["ipv6"],
726 result
= create_static_routes(tgen
, static_routes_input
)
727 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
729 step("verifyIPv4 and IPv6 static routes are configure and up on R1 ")
730 for addr_type
in ADDR_TYPES
:
731 static_routes_input
= {
735 "network": "0.0.0.0/0",
736 "next_hop": NEXT_HOP_IP
["ipv4"],
740 "next_hop": NEXT_HOP_IP
["ipv6"],
745 result
= verify_fib_routes(tgen
, addr_type
, "r1", static_routes_input
)
746 assert result
is True, "Testcase {} : Failed \n Error: {}".format(
750 step("Configure redistribute static on IPv4 and IPv6 address family")
751 redistribute_static
= {
755 "ipv4": {"unicast": {"redistribute": [{"redist_type": "static"}]}},
756 "ipv6": {"unicast": {"redistribute": [{"redist_type": "static"}]}},
761 result
= create_router_bgp(tgen
, topo
, redistribute_static
)
762 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
764 step("Verify No change on IPv4/IPv6 default-originate route advertised from link1")
765 result
= verify_rib_default_route(
769 routes
=DEFAULT_ROUTES
,
770 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
772 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
773 result
= verify_fib_default_route(
777 routes
=DEFAULT_ROUTES
,
778 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
780 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
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(
787 routes
=DEFAULT_ROUTES
,
788 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
790 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
791 result
= verify_fib_default_route(
795 routes
=DEFAULT_ROUTES
,
796 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
801 ), "Testcase {} : Failed\n Best Path sould be advertised in routes\n Error: {}".format(
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
)
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
= {
814 "local_as": local_as
,
818 "default_originate": {
819 "r2": {"dest-link": "r1-link1", "delete": True}
825 "default_originate": {
826 "r2": {"dest-link": "r1-link1", "delete": True}
834 result
= create_router_bgp(tgen
, topo
, default_originate_config
)
835 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
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
)
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
)
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
)
848 step("Verify No change on IPv4/IPv6 default-originate route advertised from link1")
849 result
= verify_rib_default_route(
853 routes
=DEFAULT_ROUTES
,
854 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
856 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
857 result
= verify_fib_default_route(
861 routes
=DEFAULT_ROUTES
,
862 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
864 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
866 result
= verify_rib_default_route(
870 routes
=DEFAULT_ROUTES
,
871 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
873 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
874 result
= verify_fib_default_route(
878 routes
=DEFAULT_ROUTES
,
879 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
881 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
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
)
888 " Configure default-originate on link-1 again for IPv4 and IPv6 address family"
890 local_as
= get_dut_as_number(tgen
, dut
="r1")
891 default_originate_config
= {
894 "local_as": local_as
,
898 "default_originate": {
900 "dest-link": "r1-link1",
907 "default_originate": {
909 "dest-link": "r1-link1",
918 result
= create_router_bgp(tgen
, topo
, default_originate_config
)
919 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
921 step("Verify No change on IPv4/IPv6 default-originate route advertised from link1")
922 result
= verify_rib_default_route(
926 routes
=DEFAULT_ROUTES
,
927 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
929 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
930 result
= verify_fib_default_route(
934 routes
=DEFAULT_ROUTES
,
935 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
937 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
939 result
= verify_rib_default_route(
943 routes
=DEFAULT_ROUTES
,
944 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
946 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
947 result
= verify_fib_default_route(
951 routes
=DEFAULT_ROUTES
,
952 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
955 assert result
is not True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
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
)
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
)
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
)
971 step("Remove redistribute static from IPv4 and IPv6 address family ")
975 "local_as": get_dut_as_number(tgen
, dut
="r1"),
979 "redistribute": [{"redist_type": "static", "delete": True}]
984 "redistribute": [{"redist_type": "static", "delete": True}]
992 result
= create_router_bgp(tgen
, topo
, input_dict_1
)
993 assert result
is True, "Testcase {} :Failed \n Error: {}".format(tc_name
, result
)
995 step("Verify No change on IPv4/IPv6 default-originate route advertised from link1")
996 result
= verify_rib_default_route(
1000 routes
=DEFAULT_ROUTES
,
1001 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
1003 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1004 result
= verify_fib_default_route(
1008 routes
=DEFAULT_ROUTES
,
1009 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
1011 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1013 result
= verify_rib_default_route(
1017 routes
=DEFAULT_ROUTES
,
1018 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
1021 assert result
is not True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1022 result
= verify_fib_default_route(
1026 routes
=DEFAULT_ROUTES
,
1027 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
1030 assert result
is not True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
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
)
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
)
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
)
1045 def test_verify_bgp_default_originate_with_aggregate_summary_p1(request
):
1047 Summary: "Verify default-originate route with aggregate summary command"
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")
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(
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
= {
1070 "local_as": local_as
,
1074 "default_originate": {"r2": {"dest-link": "r1-link1"}}
1079 "default_originate": {"r2": {"dest-link": "r1-link1"}}
1086 result
= create_router_bgp(tgen
, topo
, default_originate_config
)
1087 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
1090 "Verify IPv4/IPv6 default originate routes present on R2 nexthop as link-1,on R2"
1092 result
= verify_rib_default_route(
1096 routes
=DEFAULT_ROUTES
,
1097 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
1099 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1100 result
= verify_fib_default_route(
1104 routes
=DEFAULT_ROUTES
,
1105 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
1107 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1109 step("Configure 5 static route for IPv4 and IPv6 on R0")
1110 for addr_type
in ADDR_TYPES
:
1117 "advertise_networks": [
1119 "network": [NETWORK1_1
[addr_type
]],
1120 "next_hop": NEXT_HOP_IP
[addr_type
],
1123 "network": [NETWORK1_2
[addr_type
]],
1124 "next_hop": NEXT_HOP_IP
[addr_type
],
1127 "network": [NETWORK1_3
[addr_type
]],
1128 "next_hop": NEXT_HOP_IP
[addr_type
],
1131 "network": [NETWORK1_4
[addr_type
]],
1132 "next_hop": NEXT_HOP_IP
[addr_type
],
1135 "network": [NETWORK1_5
[addr_type
]],
1136 "next_hop": NEXT_HOP_IP
[addr_type
],
1146 result
= create_router_bgp(tgen
, topo
, input_advertise
)
1147 assert result
is True, "Testcase {} :Failed \n Error: {}".format(
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
)
1155 step("Configure aggregate summary command for IPv4 and IPv6 address family ")
1156 local_as
= get_dut_as_number(tgen
, dut
="r1")
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",
1170 result
= apply_raw_config(tgen
, raw_config
)
1171 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
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"
1176 result
= verify_rib_default_route(
1180 routes
=DEFAULT_ROUTES
,
1181 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
1183 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1184 result
= verify_fib_default_route(
1188 routes
=DEFAULT_ROUTES
,
1189 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
1191 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1193 result
= verify_rib_default_route(
1197 routes
=DEFAULT_ROUTES
,
1198 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
1200 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1201 result
= verify_fib_default_route(
1205 routes
=DEFAULT_ROUTES
,
1206 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
1208 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
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
)
1215 "After Configuring the aggregate route uptime should get reset for link-1 learn route"
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
)
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
)
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
)
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
= {
1232 "local_as": local_as
,
1236 "default_originate": {
1237 "r2": {"dest-link": "r1-link1", "delete": True}
1243 "default_originate": {
1244 "r2": {"dest-link": "r1-link1", "delete": True}
1252 result
= create_router_bgp(tgen
, topo
, default_originate_config
)
1253 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
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"
1258 result
= verify_rib_default_route(
1262 routes
=DEFAULT_ROUTES
,
1263 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
1265 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1266 result
= verify_fib_default_route(
1270 routes
=DEFAULT_ROUTES
,
1271 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
1273 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
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
)
1280 "After removing the default-originate uptime should get reset for link-1 learn route"
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
)
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
)
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
)
1293 "Configure default-originate on R1 link-1 again for IPv4 and IPv6 address family"
1295 local_as
= get_dut_as_number(tgen
, dut
="r1")
1296 default_originate_config
= {
1299 "local_as": local_as
,
1303 "default_originate": {
1305 "dest-link": "r1-link1",
1312 "default_originate": {
1314 "dest-link": "r1-link1",
1323 result
= create_router_bgp(tgen
, topo
, default_originate_config
)
1324 assert result
is True, "Testcase {} : Failed \n Error: {}".format(tc_name
, result
)
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
)
1331 "After Configuring the default-originate uptime should get reset for link-1 learn route"
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
)
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
)
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
)
1343 step("remove aggregate summary command for IPv4 and IPv6 address family ")
1344 local_as
= get_dut_as_number(tgen
, dut
="r1")
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",
1358 result
= apply_raw_config(tgen
, raw_config
)
1359 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1361 step("Verify Default-originate IPv4/IPv6 route learn on link-1 ")
1362 result
= verify_rib_default_route(
1366 routes
=DEFAULT_ROUTES
,
1367 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
1369 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1370 result
= verify_fib_default_route(
1374 routes
=DEFAULT_ROUTES
,
1375 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK1
,
1377 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1379 step("Verify 0.0.0.0/0 and 0::0/0 route get removed from link-2 ")
1380 result
= verify_rib_default_route(
1384 routes
=DEFAULT_ROUTES
,
1385 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
1388 assert result
is not True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1389 result
= verify_fib_default_route(
1393 routes
=DEFAULT_ROUTES
,
1394 expected_nexthop
=DEFAULT_ROUTE_NXT_HOP_LINK2
,
1397 assert result
is not True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
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
)
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
)
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
)
1412 if __name__
== "__main__":
1413 args
= ["-s"] + sys
.argv
[1:]
1414 sys
.exit(pytest
.main(args
))