]> git.proxmox.com Git - mirror_frr.git/blob - tests/topotests/bgp_gr_functionality_topo2/test_bgp_gr_functionality_topo2-1.py
293f3042eb692abe82239c6bfd0ce5cec3341aa9
[mirror_frr.git] / tests / topotests / bgp_gr_functionality_topo2 / test_bgp_gr_functionality_topo2-1.py
1 #!/usr/bin/env python
2 #
3 # Copyright (c) 2019 by VMware, Inc. ("VMware")
4 # Used Copyright (c) 2018 by Network Device Education Foundation, Inc. ("NetDEF")
5 # in this file.
6 #
7 # Permission to use, copy, modify, and/or distribute this software
8 # for any purpose with or without fee is hereby granted, provided
9 # that the above copyright notice and this permission notice appear
10 # in all copies.
11 #
12 # THE SOFTWARE IS PROVIDED "AS IS" AND VMWARE DISCLAIMS ALL WARRANTIES
13 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL VMWARE BE LIABLE FOR
15 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
16 # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
17 # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
18 # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
19 # OF THIS SOFTWARE.
20 #
21
22 """
23 Following tests are covered to test BGP Graceful Restart functionality.
24 Basic Common Test steps for all the test case below :
25 - Create topology (setup module)
26 Creating 7 routers topology
27 - Bring up topology
28 - Verify for bgp to converge
29 - Configure BGP Graceful Restart on both the routers.
30
31 TC_1_2:
32 Verify that EOR message is sent out only after initial convergence
33 Verify whether EOR message is received from all the peers after restart
34 TC_3:
35 Verify the selection deferral timer functionality when EOR is not sent
36 by the helper router
37 TC_11:
38 Verify that selection-deferral timer sets the maximum time to
39 avoid deadlock during which the best-path
40 TC_10:
41 Test Objective : Test GR scenarios on helper router by enabling
42 Graceful Restart for multiple address families.
43 TC_15:
44 Test Objective : Test GR scenarios by enabling Graceful Restart
45 for multiple address families..
46 TC_16:
47 Test Objective : Verify BGP-GR feature when restarting node
48 is a transit router for it's iBGP peers.
49 TC_18:
50 Test Objective : Verify that GR helper router deletes stale routes
51 received from restarting node, if GR capability is not present in
52 TC_19:
53 Test Objective : Verify that GR routers keeps all the routes
54 received from restarting node if both the routers are
55 TC_26:
56 Test Objective : Test GR scenarios on helper router by enabling
57 Graceful Restart for multiple address families.
58 TC_28:
59 Test Objective : Verify if helper node goes down before restarting
60 node comes up online, helper node sets the R-bit to avoid dead-lock
61 TC_29:
62 Test Objective : Change timers on the fly, and
63 verify if it takes immediate effect.
64 TC_33:
65 Test Objective : Helper router receives same prefixes from two
66 different routers (GR-restarting and GR-disabled). Keeps the
67 TC_34_1:
68 Test Objective : Restarting node doesn't preserve forwarding
69 state, helper router should not keep the stale entries.
70 TC_34_2:
71 Test Objective : Restarting node doesn't preserve the forwarding
72 state verify the behaviour on helper node, if it still keeps the
73 TC_32:
74 Test Objective : Restarting node is connected to multiple helper
75 nodes, one of them doesn't send EOR to restarting router. Verify
76 TC_37:
77 Test Objective : Verify if helper node restarts before sending the
78 EOR message, restarting node doesn't wait until stale path timer
79 TC_30:
80 Test Objective : Restarting node removes stale routes from Zebra
81 after receiving an EOR from helper router.
82
83 """
84
85 import os
86 import sys
87 import time
88 import pytest
89 from time import sleep
90
91 # Save the Current Working Directory to find configuration files.
92 CWD = os.path.dirname(os.path.realpath(__file__))
93 sys.path.append(os.path.join("../"))
94 sys.path.append(os.path.join("../lib/"))
95
96 # pylint: disable=C0413
97 # Import topogen and topotest helpers
98 from lib.topogen import Topogen, get_topogen
99 from lib.topolog import logger
100
101 # Required to instantiate the topology builder class.
102
103 # Import topoJson from lib, to create topology and initial configuration
104 from lib.topojson import build_config_from_json
105 from lib.bgp import (
106 clear_bgp,
107 verify_bgp_rib,
108 verify_graceful_restart,
109 create_router_bgp,
110 verify_r_bit,
111 verify_eor,
112 verify_f_bit,
113 verify_bgp_convergence,
114 verify_gr_address_family,
115 modify_bgp_config_when_bgpd_down,
116 verify_graceful_restart_timers,
117 verify_bgp_convergence_from_running_config,
118 )
119
120 from lib.common_config import (
121 write_test_header,
122 reset_config_on_routers,
123 start_topology,
124 kill_router_daemons,
125 start_router_daemons,
126 verify_rib,
127 check_address_types,
128 write_test_footer,
129 check_router_status,
130 step,
131 get_frr_ipv6_linklocal,
132 required_linux_kernel_version,
133 )
134
135 pytestmark = [pytest.mark.bgpd]
136
137
138 # Global variables
139 BGP_CONVERGENCE = False
140 GR_RESTART_TIMER = 5
141 GR_SELECT_DEFER_TIMER = 5
142 GR_STALEPATH_TIMER = 5
143 PREFERRED_NEXT_HOP = "link_local"
144 NEXT_HOP_4 = ["192.168.1.1", "192.168.4.2"]
145 NEXT_HOP_6 = ["fd00:0:0:1::1", "fd00:0:0:4::2"]
146
147
148 def setup_module(mod):
149 """
150 Sets up the pytest environment
151
152 * `mod`: module name
153 """
154
155 # Required linux kernel version for this suite to run.
156 result = required_linux_kernel_version("4.16")
157 if result is not True:
158 pytest.skip("Kernel requirements are not met, kernel version should be >=4.16")
159
160 global ADDR_TYPES
161
162 testsuite_run_time = time.asctime(time.localtime(time.time()))
163 logger.info("Testsuite start time: {}".format(testsuite_run_time))
164 logger.info("=" * 40)
165
166 logger.info("Running setup_module to create topology")
167
168 # This function initiates the topology build with Topogen...
169 json_file = "{}/bgp_gr_topojson_topo2.json".format(CWD)
170 tgen = Topogen(json_file, mod.__name__)
171 global topo
172 topo = tgen.json_topo
173 # ... and here it calls Mininet initialization functions.
174
175 # Starting topology, create tmp files which are loaded to routers
176 # to start daemons and then start routers
177 start_topology(tgen)
178
179 # Creating configuration from JSON
180 build_config_from_json(tgen, topo)
181
182 # Api call verify whether BGP is converged
183 ADDR_TYPES = check_address_types()
184
185 for addr_type in ADDR_TYPES:
186 BGP_CONVERGENCE = verify_bgp_convergence(tgen, topo)
187 assert BGP_CONVERGENCE is True, "setup_module : Failed \n Error:" " {}".format(
188 BGP_CONVERGENCE
189 )
190
191 logger.info("Running setup_module() done")
192
193
194 def teardown_module(mod):
195 """
196 Teardown the pytest environment
197
198 * `mod`: module name
199 """
200
201 logger.info("Running teardown_module to delete topology")
202
203 tgen = get_topogen()
204
205 # Stop toplogy and Remove tmp files
206 tgen.stop_topology()
207
208 logger.info(
209 "Testsuite end time: {}".format(time.asctime(time.localtime(time.time())))
210 )
211 logger.info("=" * 40)
212
213
214 def configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut, peer):
215 """
216 This function groups the repetitive function calls into one function.
217 """
218
219 logger.info("configure_gr_followed_by_clear: dut %s peer %s", dut, peer)
220
221 result = create_router_bgp(tgen, topo, input_dict)
222 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
223
224 for addr_type in ADDR_TYPES:
225 neighbor = topo["routers"][peer]["links"][dut][addr_type].split("/")[0]
226 clear_bgp(tgen, addr_type, dut, neighbor=neighbor)
227
228 for addr_type in ADDR_TYPES:
229 neighbor = topo["routers"][dut]["links"][peer][addr_type].split("/")[0]
230 clear_bgp(tgen, addr_type, peer, neighbor=neighbor)
231
232 result = verify_bgp_convergence_from_running_config(tgen)
233 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
234
235 return True
236
237
238 def next_hop_per_address_family(tgen, dut, peer, addr_type, next_hop_dict):
239 """
240 This function returns link_local or global next_hop per address-family
241 """
242
243 intferface = topo["routers"][peer]["links"]["{}-link1".format(dut)]["interface"]
244 if addr_type == "ipv6" and "link_local" in PREFERRED_NEXT_HOP:
245 next_hop = get_frr_ipv6_linklocal(tgen, peer, intf=intferface)
246 else:
247 next_hop = next_hop_dict[addr_type]
248
249 return next_hop
250
251
252 def test_BGP_GR_TC_1_2_p0(request):
253 """
254 Verify that EOR message is sent out only after initial convergence
255 Verify whether EOR message is received from all the peers after restart
256 """
257
258 tgen = get_topogen()
259 tc_name = request.node.name
260 write_test_header(tc_name)
261
262 # Check router status
263 check_router_status(tgen)
264
265 # Don't run this test if we have any failure.
266 if tgen.routers_have_failure():
267 pytest.skip(tgen.errors)
268
269 # Creating configuration from JSON
270 reset_config_on_routers(tgen)
271
272 logger.info(
273 "Verify EOR Sent and Received : BGP_GR_TC_1_2 >> "
274 "BGP GR [Helper Mode]R3-----R1[Restart Mode] "
275 )
276
277 # Configure graceful-restart
278 input_dict = {
279 "r3": {
280 "bgp": {
281 "address_family": {
282 "ipv4": {
283 "unicast": {
284 "neighbor": {
285 "r1": {
286 "dest_link": {
287 "r3": {"graceful-restart-helper": True}
288 }
289 }
290 }
291 }
292 },
293 "ipv6": {
294 "unicast": {
295 "neighbor": {
296 "r1": {
297 "dest_link": {
298 "r3": {"graceful-restart-helper": True}
299 }
300 }
301 }
302 }
303 },
304 }
305 }
306 },
307 "r1": {
308 "bgp": {
309 "graceful-restart": {
310 "graceful-restart": True,
311 "preserve-fw-state": True,
312 },
313 "address_family": {
314 "ipv4": {
315 "unicast": {
316 "neighbor": {
317 "r3": {"dest_link": {"r1": {"graceful-restart": True}}}
318 }
319 }
320 },
321 "ipv6": {
322 "unicast": {
323 "neighbor": {
324 "r3": {"dest_link": {"r1": {"graceful-restart": True}}}
325 }
326 }
327 },
328 },
329 }
330 },
331 }
332
333 configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut="r1", peer="r3")
334
335 for addr_type in ADDR_TYPES:
336 result = verify_graceful_restart(
337 tgen, topo, addr_type, input_dict, dut="r1", peer="r3"
338 )
339 assert result is True, "Testcase {} : Failed \n Error {}".format(
340 tc_name, result
341 )
342
343 # Verifying BGP RIB routes received from router R3
344 dut = "r1"
345 input_dict_1 = {key: topo["routers"][key] for key in ["r3"]}
346 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1)
347 assert result is True, "Testcase {} : Failed \n Error {}".format(
348 tc_name, result
349 )
350
351 # Verifying RIB routes
352 result = verify_rib(tgen, addr_type, dut, input_dict_1)
353 assert result is True, "Testcase {} : Failed \n Error {}".format(
354 tc_name, result
355 )
356
357 logger.info("R1 goes for reload")
358 kill_router_daemons(tgen, "r1", ["bgpd"])
359
360 for addr_type in ADDR_TYPES:
361 # Verifying RIB routes
362 input_dict_1 = {key: topo["routers"][key] for key in ["r3"]}
363 # Verifying RIB routes
364 result = verify_rib(tgen, addr_type, dut, input_dict_1)
365 assert result is True, "Testcase {} : Failed \n Error {}".format(
366 tc_name, result
367 )
368
369 logger.info("Starting bgpd process")
370 start_router_daemons(tgen, "r1", ["bgpd"])
371 logger.info("R1 is UP Now")
372
373 for addr_type in ADDR_TYPES:
374 result = verify_graceful_restart(
375 tgen, topo, addr_type, input_dict, dut="r1", peer="r3"
376 )
377 assert result is True, "Testcase {} : Failed \n Error {}".format(
378 tc_name, result
379 )
380
381 # Verifying BGP RIB routes received from router R3
382 input_dict_1 = {key: topo["routers"][key] for key in ["r3"]}
383 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1)
384 assert result is True, "Testcase {} : Failed \n Error {}".format(
385 tc_name, result
386 )
387
388 # Verifying RIB routes
389 result = verify_rib(tgen, addr_type, dut, input_dict_1)
390 assert result is True, "Testcase {} : Failed \n Error {}".format(
391 tc_name, result
392 )
393
394 # Verifying EOR on restarting router
395 result = verify_eor(tgen, topo, addr_type, input_dict, dut="r3", peer="r1")
396 assert result is True, "Testcase {} : Failed \n Error {}".format(
397 tc_name, result
398 )
399
400 write_test_footer(tc_name)
401
402
403 def test_BGP_GR_TC_3_p0(request):
404 """
405 Verify the selection deferral timer functionality when EOR is not sent
406 by the helper router
407 """
408
409 tgen = get_topogen()
410 tc_name = request.node.name
411 write_test_header(tc_name)
412
413 # Check router status
414 check_router_status(tgen)
415
416 # Don't run this test if we have any failure.
417 if tgen.routers_have_failure():
418 pytest.skip(tgen.errors)
419
420 # Creating configuration from JSON
421 reset_config_on_routers(tgen)
422
423 logger.info(
424 " Verify route download to RIB: BGP_GR_TC_3 >> "
425 "BGP GR [Helper Mode]R1-----R2[Restart Mode] "
426 )
427
428 # Configure graceful-restart
429 input_dict = {
430 "r1": {
431 "bgp": {
432 "graceful-restart": {
433 "disable-eor": True,
434 },
435 "address_family": {
436 "ipv4": {
437 "unicast": {
438 "neighbor": {
439 "r2": {
440 "dest_link": {
441 "r1": {"graceful-restart-helper": True}
442 }
443 }
444 }
445 }
446 },
447 "ipv6": {
448 "unicast": {
449 "neighbor": {
450 "r2": {
451 "dest_link": {
452 "r1": {"graceful-restart-helper": True}
453 }
454 }
455 }
456 }
457 },
458 },
459 }
460 },
461 "r2": {
462 "bgp": {
463 "graceful-restart": {
464 "graceful-restart": True,
465 "preserve-fw-state": True,
466 "timer": {"select-defer-time": GR_SELECT_DEFER_TIMER},
467 },
468 "address_family": {
469 "ipv4": {
470 "unicast": {
471 "neighbor": {
472 "r1": {"dest_link": {"r2": {"graceful-restart": True}}}
473 }
474 }
475 },
476 "ipv6": {
477 "unicast": {
478 "neighbor": {
479 "r1": {"dest_link": {"r2": {"graceful-restart": True}}}
480 }
481 }
482 },
483 },
484 }
485 },
486 }
487
488 configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut="r1", peer="r2")
489
490 for addr_type in ADDR_TYPES:
491 result = verify_graceful_restart(
492 tgen, topo, addr_type, input_dict, dut="r1", peer="r2"
493 )
494 assert result is True, "Testcase {} : Failed \n Error {}".format(
495 tc_name, result
496 )
497
498 # Verifying BGP RIB routes received from router R1
499 dut = "r2"
500 input_dict_1 = {key: topo["routers"][key] for key in ["r1"]}
501 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1)
502 assert result is True, "Testcase {} : Failed \n Error {}".format(
503 tc_name, result
504 )
505
506 # Verifying RIB routes
507 result = verify_rib(tgen, addr_type, dut, input_dict_1)
508 assert result is True, "Testcase {} : Failed \n Error {}".format(
509 tc_name, result
510 )
511
512 logger.info("R2 goes for reload ")
513 kill_router_daemons(tgen, "r2", ["bgpd"])
514
515 logger.info("R2 is about to come up now")
516 start_router_daemons(tgen, "r2", ["bgpd"])
517 logger.info("R2 is UP Now")
518
519 for addr_type in ADDR_TYPES:
520 # Verifying BGP RIB routes received from router R1
521 input_dict_1 = {key: topo["routers"][key] for key in ["r1"]}
522 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1)
523 assert result is True, "Testcase {} : Failed \n Error {}".format(
524 tc_name, result
525 )
526
527 # Verify EOR on restarting router
528 result = verify_eor(
529 tgen, topo, addr_type, input_dict, dut="r2", peer="r1", expected=False
530 )
531 assert result is not True, (
532 "Testcase {} : Failed \n "
533 "Expected: EOR should not be set to True in r2\n"
534 "Found: {}".format(tc_name, result)
535 )
536
537 logger.info(
538 "Waiting for selection deferral timer({} sec)..".format(GR_SELECT_DEFER_TIMER)
539 )
540 sleep(GR_SELECT_DEFER_TIMER)
541
542 for addr_type in ADDR_TYPES:
543 # Verifying RIB routes
544 result = verify_rib(tgen, addr_type, "r2", input_dict_1)
545 assert result is True, "Testcase {} : Failed \n Error {}".format(
546 tc_name, result
547 )
548
549 write_test_footer(tc_name)
550
551
552 def test_BGP_GR_TC_11_p0(request):
553 """
554 Verify that selection-deferral timer sets the maximum time to
555 avoid deadlock during which the best-path
556 selection process is deferred, after a peer session was restarted
557 """
558
559 tgen = get_topogen()
560 tc_name = request.node.name
561 write_test_header(tc_name)
562
563 # Check router status
564 check_router_status(tgen)
565
566 # Don't run this test if we have any failure.
567 if tgen.routers_have_failure():
568 pytest.skip(tgen.errors)
569
570 # Creating configuration from JSON
571 reset_config_on_routers(tgen)
572
573 logger.info("Verify EOR Sent after deferral timeout : BGP_GR_TC_11")
574
575 # Configure graceful-restart
576 input_dict = {
577 "r1": {
578 "bgp": {
579 "graceful-restart": {
580 "graceful-restart": True,
581 "select-defer-time": GR_SELECT_DEFER_TIMER,
582 },
583 "address_family": {
584 "ipv4": {
585 "unicast": {
586 "neighbor": {
587 "r2": {"dest_link": {"r1": {"graceful-restart": True}}},
588 "r3": {"dest_link": {"r1": {"graceful-restart": True}}},
589 }
590 }
591 },
592 "ipv6": {
593 "unicast": {
594 "neighbor": {
595 "r2": {"dest_link": {"r1": {"graceful-restart": True}}},
596 "r3": {"dest_link": {"r1": {"graceful-restart": True}}},
597 }
598 }
599 },
600 },
601 }
602 },
603 "r3": {
604 "bgp": {
605 "graceful-restart": {"disable-eor": True},
606 "address_family": {
607 "ipv4": {
608 "unicast": {
609 "neighbor": {
610 "r1": {
611 "dest_link": {
612 "r3": {"graceful-restart-helper": True}
613 }
614 }
615 }
616 }
617 },
618 "ipv6": {
619 "unicast": {
620 "neighbor": {
621 "r1": {
622 "dest_link": {
623 "r3": {"graceful-restart-helper": True}
624 }
625 }
626 }
627 }
628 },
629 },
630 }
631 },
632 }
633
634 result = create_router_bgp(tgen, topo, input_dict)
635 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
636
637 for addr_type in ADDR_TYPES:
638 clear_bgp(tgen, addr_type, "r1")
639 clear_bgp(tgen, addr_type, "r3")
640
641 result = verify_bgp_convergence_from_running_config(tgen, topo)
642 assert result is True, "Testcase {} : Failed \n Error: {}".format(tc_name, result)
643
644 for addr_type in ADDR_TYPES:
645 result = verify_graceful_restart(
646 tgen, topo, addr_type, input_dict, dut="r1", peer="r3"
647 )
648 assert result is True, "Testcase {} : Failed \n Error {}".format(
649 tc_name, result
650 )
651
652 # Verifying BGP RIB routes received from router R1
653 dut = "r1"
654 input_dict_1 = {key: topo["routers"][key] for key in ["r3"]}
655 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1)
656 assert result is True, "Testcase {} : Failed \n Error {}".format(
657 tc_name, result
658 )
659
660 # Verifying RIB routes
661 result = verify_rib(tgen, addr_type, dut, input_dict_1)
662 assert result is True, "Testcase {} : Failed \n Error {}".format(
663 tc_name, result
664 )
665
666 logger.info("R1 goes for reload")
667 kill_router_daemons(tgen, "r1", ["bgpd"])
668
669 logger.info("Starting bgpd process")
670 start_router_daemons(tgen, "r1", ["bgpd"])
671 logger.info("R1 is UP Now")
672
673 for addr_type in ADDR_TYPES:
674 # Verify EOR on restarting router
675 result = verify_eor(
676 tgen, topo, addr_type, input_dict, dut="r1", peer="r3", expected=False
677 )
678 assert result is not True, (
679 "Testcase {} : Failed \n "
680 "Expected: EOR should not be set to True in r1\n"
681 "Found: {}".format(tc_name, result)
682 )
683
684 logger.info(
685 "Waiting for selection deferral timer({} sec).. ".format(
686 GR_SELECT_DEFER_TIMER + 2
687 )
688 )
689 sleep(GR_SELECT_DEFER_TIMER + 2)
690
691 for addr_type in ADDR_TYPES:
692 # Verifying BGP RIB routes received from router R1
693 input_dict_1 = {key: topo["routers"][key] for key in ["r3"]}
694 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1)
695 assert result is True, "Testcase {} : Failed \n Error {}".format(
696 tc_name, result
697 )
698
699 # Verifying RIB routes
700 result = verify_rib(tgen, addr_type, dut, input_dict_1)
701 assert result is True, "Testcase {} : Failed \n Error {}".format(
702 tc_name, result
703 )
704
705 # Verifying EOR on restarting router
706 result = verify_eor(
707 tgen, topo, addr_type, input_dict, dut="r3", peer="r1", expected=False
708 )
709 assert result is not True, (
710 "Testcase {} : Failed \n "
711 "Expected: EOR should not be set to True in r3\n"
712 "Found: {}".format(tc_name, result)
713 )
714
715 write_test_footer(tc_name)
716
717
718 def test_BGP_GR_10_p2(request):
719 """
720 Test Objective : Test GR scenarios on helper router by enabling
721 Graceful Restart for multiple address families.
722 """
723
724 tgen = get_topogen()
725 tc_name = request.node.name
726 write_test_header(tc_name)
727
728 # Check router status
729 check_router_status(tgen)
730
731 # Don't run this test if we have any failure.
732 if tgen.routers_have_failure():
733 pytest.skip(tgen.errors)
734
735 # Creating configuration from JSON
736 reset_config_on_routers(tgen)
737
738 step("Test Setup: [Helper Mode]R3-----R1[Restart Mode] initialized")
739
740 # Configure graceful-restart
741 input_dict = {
742 "r1": {
743 "bgp": {
744 "address_family": {
745 "ipv4": {
746 "unicast": {
747 "neighbor": {
748 "r3": {
749 "dest_link": {
750 "r1": {
751 "next_hop_self": True,
752 "graceful-restart": True,
753 "activate": "ipv6",
754 }
755 }
756 }
757 }
758 }
759 },
760 "ipv6": {
761 "unicast": {
762 "neighbor": {
763 "r3": {
764 "dest_link": {
765 "r1": {
766 "next_hop_self": True,
767 "graceful-restart": True,
768 "activate": "ipv4",
769 }
770 }
771 }
772 }
773 }
774 },
775 }
776 }
777 },
778 "r3": {
779 "bgp": {
780 "address_family": {
781 "ipv4": {
782 "unicast": {
783 "neighbor": {
784 "r1": {
785 "dest_link": {
786 "r3": {
787 "graceful-restart-helper": True,
788 "activate": "ipv6",
789 }
790 }
791 }
792 }
793 }
794 },
795 "ipv6": {
796 "unicast": {
797 "neighbor": {
798 "r1": {
799 "dest_link": {
800 "r3": {
801 "graceful-restart-helper": True,
802 "activate": "ipv4",
803 }
804 }
805 }
806 }
807 }
808 },
809 }
810 }
811 },
812 }
813
814 configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut="r1", peer="r3")
815
816 for addr_type in ADDR_TYPES:
817 step(
818 "Verifying GR config and operational state for addr_type {}".format(
819 addr_type
820 )
821 )
822
823 result = verify_graceful_restart(
824 tgen, topo, addr_type, input_dict, dut="r1", peer="r3"
825 )
826 assert result is True, "Testcase {} : Failed \n Error {}".format(
827 tc_name, result
828 )
829
830 # Verifying BGP RIB routes
831 dut = "r3"
832 input_topo = {key: topo["routers"][key] for key in ["r1"]}
833 result = verify_bgp_rib(tgen, addr_type, dut, input_topo)
834 assert result is True, "Testcase {} : Failed \n Error {}".format(
835 tc_name, result
836 )
837
838 # Verifying RIB routes before shutting down BGPd daemon
839 result = verify_rib(tgen, addr_type, dut, input_topo)
840 assert result is True, "Testcase {} : Failed \n Error {}".format(
841 tc_name, result
842 )
843
844 # verify multi address family
845 result = verify_gr_address_family(
846 tgen,
847 topo,
848 addr_type,
849 "ipv4Unicast",
850 dut="r1",
851 peer="r3",
852 )
853 assert result is True, "Testcase {} : Failed \n Error {}".format(
854 tc_name, result
855 )
856
857 # verify multi address family
858 result = verify_gr_address_family(
859 tgen,
860 topo,
861 addr_type,
862 "ipv6Unicast",
863 dut="r1",
864 peer="r3",
865 )
866 assert result is True, "Testcase {} : Failed \n Error {}".format(
867 tc_name, result
868 )
869
870 # verify multi address family
871 result = verify_gr_address_family(
872 tgen,
873 topo,
874 addr_type,
875 "ipv4Unicast",
876 dut="r3",
877 peer="r1",
878 )
879 assert result is True, "Testcase {} : Failed \n Error {}".format(
880 tc_name, result
881 )
882
883 # verify multi address family
884 result = verify_gr_address_family(
885 tgen,
886 topo,
887 addr_type,
888 "ipv6Unicast",
889 dut="r3",
890 peer="r1",
891 )
892 assert result is True, "Testcase {} : Failed \n Error {}".format(
893 tc_name, result
894 )
895
896 step("Killing bgpd on r1")
897
898 # Kill BGPd daemon on R1
899 kill_router_daemons(tgen, "r1", ["bgpd"])
900
901 for addr_type in ADDR_TYPES:
902 # Verifying BGP RIB routes
903 input_topo = {key: topo["routers"][key] for key in ["r1"]}
904 result = verify_bgp_rib(tgen, addr_type, dut, input_topo)
905 assert result is True, "Testcase {} : Failed \n Error {}".format(
906 tc_name, result
907 )
908
909 # Verifying RIB routes before shutting down BGPd daemon
910 result = verify_rib(tgen, addr_type, dut, input_topo)
911 assert result is True, "Testcase {} : Failed \n Error {}".format(
912 tc_name, result
913 )
914
915 step("Starting bgpd on r1")
916
917 # Start BGPd daemon on R1
918 start_router_daemons(tgen, "r1", ["bgpd"])
919
920 for addr_type in ADDR_TYPES:
921 # Verifying BGP RIB routes
922 input_topo = {key: topo["routers"][key] for key in ["r1"]}
923 result = verify_bgp_rib(tgen, addr_type, dut, input_topo)
924 assert result is True, "Testcase {} : Failed \n Error {}".format(
925 tc_name, result
926 )
927
928 # Verifying RIB routes before shutting down BGPd daemon
929 result = verify_rib(tgen, addr_type, dut, input_topo)
930 assert result is True, "Testcase {} : Failed \n Error {}".format(
931 tc_name, result
932 )
933
934 write_test_footer(tc_name)
935
936
937 def BGP_GR_16_p2(request):
938 """
939 Test Objective : Verify BGP-GR feature when restarting node
940 is a transit router for it's iBGP peers.
941 """
942
943 tgen = get_topogen()
944 tc_name = request.node.name
945 write_test_header(tc_name)
946
947 # Check router status
948 check_router_status(tgen)
949
950 # Don't run this test if we have any failure.
951 if tgen.routers_have_failure():
952 pytest.skip(tgen.errors)
953
954 # Creating configuration from JSON
955 reset_config_on_routers(tgen)
956
957 logger.info(
958 "[Step 1] : Test Setup " "[Helper Mode]R3-----R1[Restart Mode] initialized"
959 )
960
961 # Configure graceful-restart and timers
962 input_dict = {
963 "r1": {
964 "bgp": {
965 "address_family": {
966 "ipv4": {
967 "unicast": {
968 "neighbor": {
969 "r3": {
970 "dest_link": {
971 "r1": {
972 "graceful-restart": True,
973 "next_hop_self": True,
974 }
975 }
976 }
977 }
978 }
979 },
980 "ipv6": {
981 "unicast": {
982 "neighbor": {
983 "r3": {
984 "dest_link": {
985 "r1": {
986 "graceful-restart": True,
987 "next_hop_self": True,
988 }
989 }
990 }
991 }
992 }
993 },
994 }
995 }
996 },
997 "r3": {
998 "bgp": {
999 "address_family": {
1000 "ipv4": {
1001 "unicast": {
1002 "neighbor": {
1003 "r1": {
1004 "dest_link": {
1005 "r3": {"graceful-restart-helper": True}
1006 }
1007 }
1008 }
1009 }
1010 },
1011 "ipv6": {
1012 "unicast": {
1013 "neighbor": {
1014 "r1": {
1015 "dest_link": {
1016 "r3": {"graceful-restart-helper": True}
1017 }
1018 }
1019 }
1020 }
1021 },
1022 }
1023 }
1024 },
1025 }
1026
1027 configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut="r1", peer="r3")
1028
1029 for addr_type in ADDR_TYPES:
1030 result = verify_graceful_restart(
1031 tgen, topo, addr_type, input_dict, dut="r1", peer="r3"
1032 )
1033 assert result is True, "Testcase {} : Failed \n Error {}".format(
1034 tc_name, result
1035 )
1036
1037 logger.info(
1038 "[Step 2] : Test Setup "
1039 "[Helper Mode]R3-----R1[Restart Mode]"
1040 "--------R6[Helper Mode] initialized"
1041 )
1042
1043 # Configure graceful-restart and timers
1044 input_dict = {
1045 "r1": {
1046 "bgp": {
1047 "address_family": {
1048 "ipv4": {
1049 "unicast": {
1050 "neighbor": {
1051 "r2": {"dest_link": {"r1": {"graceful-restart": True}}}
1052 }
1053 }
1054 },
1055 "ipv6": {
1056 "unicast": {
1057 "neighbor": {
1058 "r2": {"dest_link": {"r1": {"graceful-restart": True}}}
1059 }
1060 }
1061 },
1062 }
1063 }
1064 },
1065 "r2": {
1066 "bgp": {
1067 "address_family": {
1068 "ipv4": {
1069 "unicast": {
1070 "neighbor": {
1071 "r1": {
1072 "dest_link": {
1073 "r2": {"graceful-restart-helper": True}
1074 }
1075 }
1076 }
1077 }
1078 },
1079 "ipv6": {
1080 "unicast": {
1081 "neighbor": {
1082 "r1": {
1083 "dest_link": {
1084 "r2": {"graceful-restart-helper": True}
1085 }
1086 }
1087 }
1088 }
1089 },
1090 }
1091 }
1092 },
1093 }
1094
1095 configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut="r1", peer="r2")
1096
1097 for addr_type in ADDR_TYPES:
1098 result = verify_graceful_restart(
1099 tgen, topo, addr_type, input_dict, dut="r1", peer="r2"
1100 )
1101 assert result is True, "Testcase {} : Failed \n Error {}".format(
1102 tc_name, result
1103 )
1104
1105 # Verifying BGP RIB routes
1106 dut = "r3"
1107 input_dict_1 = {key: topo["routers"][key] for key in ["r1"]}
1108 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1)
1109 assert result is True, "Testcase {} : Failed \n Error {}".format(
1110 tc_name, result
1111 )
1112
1113 # Verifying RIB routes before shutting down BGPd daemon
1114 result = verify_rib(tgen, addr_type, dut, input_dict_1)
1115 assert result is True, "Testcase {} : Failed \n Error {}".format(
1116 tc_name, result
1117 )
1118
1119 # Verifying BGP RIB routes
1120 input_dict_2 = {key: topo["routers"][key] for key in ["r2"]}
1121 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_2)
1122 assert result is True, "Testcase {} : Failed \n Error {}".format(
1123 tc_name, result
1124 )
1125
1126 # Verifying RIB routes before shutting down BGPd daemon
1127 result = verify_rib(tgen, addr_type, dut, input_dict_2)
1128 assert result is True, "Testcase {} : Failed \n Error {}".format(
1129 tc_name, result
1130 )
1131
1132 # Kill BGPd daemon on R1
1133 kill_router_daemons(tgen, "r1", ["bgpd"])
1134
1135 for addr_type in ADDR_TYPES:
1136 # Verifying BGP RIB routes
1137 input_dict_1 = {key: topo["routers"][key] for key in ["r1"]}
1138 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1)
1139 assert result is True, "Testcase {} : Failed \n Error {}".format(
1140 tc_name, result
1141 )
1142
1143 # Verifying RIB routes before shutting down BGPd daemon
1144 result = verify_rib(tgen, addr_type, dut, input_dict_1)
1145 assert result is True, "Testcase {} : Failed \n Error {}".format(
1146 tc_name, result
1147 )
1148
1149 # Verifying BGP RIB routes
1150 input_dict_2 = {key: topo["routers"][key] for key in ["r2"]}
1151 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_2)
1152 assert result is True, "Testcase {} : Failed \n Error {}".format(
1153 tc_name, result
1154 )
1155
1156 # Verifying RIB routes before shutting down BGPd daemon
1157 result = verify_rib(tgen, addr_type, dut, input_dict_2)
1158 assert result is True, "Testcase {} : Failed \n Error {}".format(
1159 tc_name, result
1160 )
1161
1162 # Start BGPd daemon on R1
1163 start_router_daemons(tgen, "r1", ["bgpd"])
1164
1165 for addr_type in ADDR_TYPES:
1166 # Verifying BGP RIB routes
1167 input_dict_1 = {key: topo["routers"][key] for key in ["r1"]}
1168 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1)
1169 assert result is True, "Testcase {} : Failed \n Error {}".format(
1170 tc_name, result
1171 )
1172
1173 # Verifying RIB routes before shutting down BGPd daemon
1174 result = verify_rib(tgen, addr_type, dut, input_dict_1)
1175 assert result is True, "Testcase {} : Failed \n Error {}".format(
1176 tc_name, result
1177 )
1178
1179 # Verifying BGP RIB routes
1180 input_dict_2 = {key: topo["routers"][key] for key in ["r2"]}
1181 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_2)
1182 assert result is True, "Testcase {} : Failed \n Error {}".format(
1183 tc_name, result
1184 )
1185
1186 # Verifying RIB routes before shutting down BGPd daemon
1187 result = verify_rib(tgen, addr_type, dut, input_dict_2)
1188 assert result is True, "Testcase {} : Failed \n Error {}".format(
1189 tc_name, result
1190 )
1191
1192 result = verify_bgp_convergence_from_running_config(tgen, topo)
1193 assert result is True, "Testcase {} : Failed \n Error {}".format(
1194 tc_name, result
1195 )
1196
1197 write_test_footer(tc_name)
1198
1199
1200 def test_BGP_GR_18_p1(request):
1201 """
1202 Test Objective : Verify that GR helper router deletes stale routes
1203 received from restarting node, if GR capability is not present in
1204 restarting node's OPEN message.
1205 """
1206
1207 tgen = get_topogen()
1208 tc_name = request.node.name
1209 write_test_header(tc_name)
1210
1211 # Check router status
1212 check_router_status(tgen)
1213
1214 # Don't run this test if we have any failure.
1215 if tgen.routers_have_failure():
1216 pytest.skip(tgen.errors)
1217
1218 # Creating configuration from JSON
1219 reset_config_on_routers(tgen)
1220
1221 logger.info(
1222 "[Step 1] : Test Setup " "[Helper Mode]R6-----R1[Restart Mode] initialized"
1223 )
1224
1225 # Configure graceful-restart and timers
1226 input_dict = {
1227 "r1": {
1228 "bgp": {
1229 "address_family": {
1230 "ipv4": {
1231 "unicast": {
1232 "neighbor": {
1233 "r6": {"dest_link": {"r1": {"graceful-restart": True}}}
1234 }
1235 }
1236 },
1237 "ipv6": {
1238 "unicast": {
1239 "neighbor": {
1240 "r6": {"dest_link": {"r1": {"graceful-restart": True}}}
1241 }
1242 }
1243 },
1244 }
1245 }
1246 },
1247 "r6": {
1248 "bgp": {
1249 "address_family": {
1250 "ipv4": {
1251 "unicast": {
1252 "neighbor": {
1253 "r1": {
1254 "dest_link": {
1255 "r6": {"graceful-restart-helper": True}
1256 }
1257 }
1258 }
1259 }
1260 },
1261 "ipv6": {
1262 "unicast": {
1263 "neighbor": {
1264 "r1": {
1265 "dest_link": {
1266 "r6": {"graceful-restart-helper": True}
1267 }
1268 }
1269 }
1270 }
1271 },
1272 }
1273 }
1274 },
1275 }
1276
1277 configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut="r1", peer="r6")
1278
1279 for addr_type in ADDR_TYPES:
1280 result = verify_graceful_restart(
1281 tgen, topo, addr_type, input_dict, dut="r1", peer="r6"
1282 )
1283 assert result is True, "Testcase {} : Failed \n Error {}".format(
1284 tc_name, result
1285 )
1286
1287 logger.info(
1288 "[Step 2] : Test Setup "
1289 "[Helper Mode]R6-----R1[Restart Mode]"
1290 "--------R2[Helper Mode] initialized"
1291 )
1292
1293 # Configure graceful-restart and timers
1294 input_dict = {
1295 "r1": {
1296 "bgp": {
1297 "address_family": {
1298 "ipv4": {
1299 "unicast": {
1300 "neighbor": {
1301 "r2": {"dest_link": {"r1": {"graceful-restart": True}}}
1302 }
1303 }
1304 },
1305 "ipv6": {
1306 "unicast": {
1307 "neighbor": {
1308 "r2": {"dest_link": {"r1": {"graceful-restart": True}}}
1309 }
1310 }
1311 },
1312 }
1313 }
1314 },
1315 "r2": {
1316 "bgp": {
1317 "address_family": {
1318 "ipv4": {
1319 "unicast": {
1320 "neighbor": {
1321 "r1": {
1322 "dest_link": {
1323 "r2": {"graceful-restart-helper": True}
1324 }
1325 }
1326 }
1327 }
1328 },
1329 "ipv6": {
1330 "unicast": {
1331 "neighbor": {
1332 "r1": {
1333 "dest_link": {
1334 "r2": {"graceful-restart-helper": True}
1335 }
1336 }
1337 }
1338 }
1339 },
1340 }
1341 }
1342 },
1343 }
1344
1345 configure_gr_followed_by_clear(tgen, topo, input_dict, tc_name, dut="r1", peer="r2")
1346
1347 for addr_type in ADDR_TYPES:
1348 result = verify_graceful_restart(
1349 tgen, topo, addr_type, input_dict, dut="r1", peer="r2"
1350 )
1351 assert result is True, "Testcase {} : Failed \n Error {}".format(
1352 tc_name, result
1353 )
1354
1355 # Verifying BGP RIB routes
1356 dut = "r6"
1357 input_dict_1 = {key: topo["routers"][key] for key in ["r1"]}
1358 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1)
1359 assert result is True, "Testcase {} : Failed \n Error {}".format(
1360 tc_name, result
1361 )
1362
1363 # Verifying RIB routes before shutting down BGPd daemon
1364 result = verify_rib(tgen, addr_type, dut, input_dict_1)
1365 assert result is True, "Testcase {} : Failed \n Error {}".format(
1366 tc_name, result
1367 )
1368
1369 # Verifying BGP RIB routes
1370 dut = "r2"
1371 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1)
1372 assert result is True, "Testcase {} : Failed \n Error {}".format(
1373 tc_name, result
1374 )
1375
1376 # Verifying RIB routes before shutting down BGPd daemon
1377 result = verify_rib(tgen, addr_type, dut, input_dict_1)
1378 assert result is True, "Testcase {} : Failed \n Error {}".format(
1379 tc_name, result
1380 )
1381
1382 # Kill BGPd daemon on R1
1383 kill_router_daemons(tgen, "r1", ["bgpd"])
1384
1385 logger.info("[Step 3] : Configure R1 to prevent sending EOR")
1386
1387 # Modify graceful-restart config to prevent sending EOR
1388 input_dict_3 = {"r1": {"bgp": {"graceful-restart": {"disable-eor": True}}}}
1389
1390 result = modify_bgp_config_when_bgpd_down(tgen, topo, input_dict_3)
1391
1392 # Modify configuration to delete routes
1393 network = {"ipv4": "101.0.20.1/32", "ipv6": "1::1/128"}
1394 for addr_type in ADDR_TYPES:
1395 input_dict_3 = {
1396 "r1": {
1397 "bgp": {
1398 "address_family": {
1399 addr_type: {
1400 "unicast": {
1401 "advertise_networks": [
1402 {
1403 "network": network[addr_type],
1404 "no_of_network": 5,
1405 "delete": True,
1406 }
1407 ]
1408 }
1409 }
1410 }
1411 }
1412 }
1413 }
1414
1415 result = modify_bgp_config_when_bgpd_down(tgen, topo, input_dict_3)
1416 assert result is True, "Testcase {} : Failed \n Error {}".format(
1417 tc_name, result
1418 )
1419
1420 # Modify graceful-restart config
1421 input_dict_3 = {
1422 "r1": {
1423 "bgp": {
1424 "address_family": {
1425 "ipv4": {
1426 "unicast": {
1427 "neighbor": {
1428 "r2": {
1429 "dest_link": {
1430 "r1": {"graceful-restart-disable": True}
1431 }
1432 },
1433 "r6": {
1434 "dest_link": {
1435 "r1": {"graceful-restart-disable": True}
1436 }
1437 },
1438 }
1439 }
1440 },
1441 "ipv6": {
1442 "unicast": {
1443 "neighbor": {
1444 "r2": {
1445 "dest_link": {
1446 "r1": {"graceful-restart-disable": True}
1447 }
1448 },
1449 "r6": {
1450 "dest_link": {
1451 "r1": {"graceful-restart-disable": True}
1452 }
1453 },
1454 }
1455 }
1456 },
1457 }
1458 }
1459 }
1460 }
1461
1462 result = modify_bgp_config_when_bgpd_down(tgen, topo, input_dict_3)
1463 assert result is True, "Testcase {} : Failed \n Error {}".format(tc_name, result)
1464
1465 logger.info("[Step 4] : Bring up the BGPd daemon on R1 for 30" " seconds..")
1466
1467 # Start BGPd daemon on R1
1468 start_router_daemons(tgen, "r1", ["bgpd"])
1469
1470 for addr_type in ADDR_TYPES:
1471 # Verifying BGP RIB routes
1472 dut = "r6"
1473 input_dict_1 = {key: topo["routers"][key] for key in ["r1"]}
1474 result = verify_bgp_rib(tgen, addr_type, dut, input_dict_1, expected=False)
1475 assert result is not True, (
1476 "Testcase {} : Failed \n "
1477 "Expected: Routes should not be present in {} BGP RIB \n "
1478 "Found: {}".format(tc_name, dut, result)
1479 )
1480
1481 # Verifying RIB routes before shutting down BGPd daemon
1482 result = verify_rib(tgen, addr_type, dut, input_dict_1, expected=False)
1483 assert result is not True, (
1484 "Testcase {} : Failed \n "
1485 "Expected: Routes should not be present in {} FIB \n "
1486 "Found: {}".format(tc_name, dut, result)
1487 )
1488
1489 # Verifying BGP RIB routes
1490 dut = "r2"
1491 assert result is not True, (
1492 "Testcase {} : Failed \n "
1493 "Expected: Routes should not be present in {} BGP RIB \n "
1494 "Found: {}".format(tc_name, dut, result)
1495 )
1496
1497 # Verifying RIB routes before shutting down BGPd daemon
1498 result = verify_rib(tgen, addr_type, dut, input_dict_1, expected=False)
1499 assert result is not True, (
1500 "Testcase {} : Failed \n "
1501 "Expected: Routes should not be present in {} FIB \n "
1502 "Found: {}".format(tc_name, dut, result)
1503 )
1504
1505 write_test_footer(tc_name)
1506
1507
1508 if __name__ == "__main__":
1509 args = ["-s"] + sys.argv[1:]
1510 sys.exit(pytest.main(args))