2 # SPDX-License-Identifier: ISC
5 # Copyright (c) 2022 by VMware, Inc. ("VMware")
6 # Used Copyright (c) 2018 by Network Device Education Foundation,
7 # Inc. ("NetDEF") in this file.
11 Following tests are covered to test Multicast basic functionality:
18 r0-----r1-------------r3-----r5
24 - Create topology (setup module)
27 1. Configure multiple groups (10 grps) with same RP address
28 2. Verify IIF and OIL in updated in mroute when upstream interface
30 3. Verify RP info and (*,G) mroute after deleting the RP and shut /
31 no shut the RPF interface.
40 # Save the Current Working Directory to find configuration files.
41 CWD
= os
.path
.dirname(os
.path
.realpath(__file__
))
42 sys
.path
.append(os
.path
.join(CWD
, "../"))
43 sys
.path
.append(os
.path
.join(CWD
, "../lib/"))
45 # Required to instantiate the topology builder class.
47 # pylint: disable=C0413
48 # Import topogen and topotest helpers
49 from lib
.topogen
import Topogen
, get_topogen
51 from lib
.common_config
import (
55 reset_config_on_routers
,
57 shutdown_bringup_interface
,
63 socat_send_pim6_traffic
,
65 create_debug_log_config
,
70 verify_join_state_and_timer
,
73 verify_pim_interface_traffic
,
76 clear_pim6_interface_traffic
,
78 verify_pim6_neighbors
,
79 get_pim6_interface_traffic
,
80 clear_pim6_interfaces
,
83 from lib
.topolog
import logger
84 from lib
.topojson
import build_topo_from_json
, build_config_from_json
87 GROUP_RANGE_1
= "ff08::/64"
88 GROUP_ADDRESS_1
= "ff08::1"
89 GROUP_RANGE_3
= "ffaa::/64"
90 GROUP_ADDRESS_3
= "ffaa::1"
91 GROUP_RANGE_LIST_1
= [
98 GROUP_RANGE_LIST_2
= [
105 GROUP_ADDRESS_LIST_1
= ["ffaa::1", "ffaa::2", "ffaa::3", "ffaa::4", "ffaa::5"]
106 GROUP_ADDRESS_LIST_2
= ["ffaa::6", "ffaa::7", "ffaa::8", "ffaa::9", "ffaa::10"]
109 ASSERT_MSG
= "Testcase {} : Failed Error: {}"
111 pytestmark
= [pytest
.mark
.pim6d
]
114 def build_topo(tgen
):
117 # Building topology from json file
118 build_topo_from_json(tgen
, TOPO
)
121 def setup_module(mod
):
123 Sets up the pytest environment
128 testsuite_run_time
= time
.asctime(time
.localtime(time
.time()))
129 logger
.info("Testsuite start time: %s", testsuite_run_time
)
130 logger
.info("=" * 40)
137 r0-----r1-------------r3-----r5
143 logger
.info("Master Topology: \n %s", topology
)
145 logger
.info("Running setup_module to create topology")
147 # This function initiates the topology build with Topogen...
148 json_file
= "{}/multicast_pim6_static_rp.json".format(CWD
)
149 tgen
= Topogen(json_file
, mod
.__name
__)
151 TOPO
= tgen
.json_topo
153 # ... and here it calls Mininet initialization functions.
155 # Starting topology, create tmp files which are loaded to routers
156 # to start daemons and then start routers
159 # Don"t run this test if we have any failure.
160 if tgen
.routers_have_failure():
161 pytest
.skip(tgen
.errors
)
163 # Creating configuration from JSON
164 build_config_from_json(tgen
, TOPO
)
166 # Verify PIM6 neighbors
167 result
= verify_pim6_neighbors(tgen
, TOPO
)
168 assert result
is True, "setup_module :Failed \n Error:" " {}".format(result
)
170 logger
.info("Running setup_module() done")
173 def teardown_module():
174 """Teardown the pytest environment"""
176 logger
.info("Running teardown_module to delete topology")
179 # Stop toplogy and Remove tmp files
182 logger
.info("Testsuite end time: %s", time
.asctime(time
.localtime(time
.time())))
183 logger
.info("=" * 40)
186 #####################################################
190 #####################################################
193 def verify_state_incremented(state_before
, state_after
):
195 API to compare interface traffic state incrementing
199 * `state_before` : State dictionary for any particular instance
200 * `state_after` : State dictionary for any particular instance
203 for router
, state_data
in state_before
.items():
204 for state
, value
in state_data
.items():
205 if state_before
[router
][state
] >= state_after
[router
][state
]:
207 "[DUT: %s]: state %s value has not"
208 " incremented, Initial value: %s, "
209 "Current value: %s [FAILED!!]"
213 state_before
[router
][state
],
214 state_after
[router
][state
],
220 "[DUT: %s]: State %s value is "
221 "incremented, Initial value: %s, Current value: %s"
225 state_before
[router
][state
],
226 state_after
[router
][state
],
232 #####################################################
236 #####################################################
239 def test_pim6_multiple_groups_same_RP_address_p2(request
):
241 Configure multiple groups (10 grps) with same RP address
247 r0-----r1-------------r3-----r5
255 tc_name
= request
.node
.name
256 write_test_header(tc_name
)
258 # Don"t run this test if we have any failure.
259 if tgen
.routers_have_failure():
260 pytest
.skip(tgen
.errors
)
262 step("Creating configuration from JSON")
263 reset_config_on_routers(tgen
)
266 "r1": {"debug": {"log_file": "r1_debug.log", "enable": ["pim6d"]}},
267 "r2": {"debug": {"log_file": "r2_debug.log", "enable": ["pim6d"]}},
268 "r3": {"debug": {"log_file": "r3_debug.log", "enable": ["pim6d"]}},
269 "r4": {"debug": {"log_file": "r4_debug.log", "enable": ["pim6d"]}},
272 result
= create_debug_log_config(tgen
, input_dict
)
274 step("Enable MLD on r1 interface")
275 step("Enable the PIM6 on all the interfaces of r1, r2, r3 and r4 routers")
276 step("r2: Configure r2 as RP")
282 "rp_addr": TOPO
["routers"]["r2"]["links"]["lo"]["ipv6"].split(
285 "group_addr_range": GROUP_RANGE_3
,
292 result
= create_pim_config(tgen
, TOPO
, input_dict
)
293 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
295 step("r2: verify rp-info")
298 rp_address
= TOPO
["routers"]["r2"]["links"]["lo"]["ipv6"].split("/")[0]
299 result
= verify_pim_rp_info(tgen
, TOPO
, dut
, GROUP_RANGE_3
, oif
, rp_address
, SOURCE
)
300 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
302 group_address_list
= GROUP_ADDRESS_LIST_1
+ GROUP_ADDRESS_LIST_2
303 step("r0: Send MLD join for 10 groups")
304 intf
= TOPO
["routers"]["r0"]["links"]["r1"]["interface"]
305 intf_ip
= TOPO
["routers"]["r0"]["links"]["r1"]["ipv6"].split("/")[0]
306 result
= socat_send_mld_join(
307 tgen
, "r0", "UDP6-RECV", group_address_list
, intf
, intf_ip
309 assert result
is True, "Testcase {}: Failed Error: {}".format(tc_name
, result
)
311 step("r1: Verify MLD groups")
313 intf_r1_r0
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
314 result
= verify_mld_groups(tgen
, dut
, intf_r1_r0
, group_address_list
)
315 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
317 step("r5: Send multicast traffic for group {}".format(group_address_list
))
318 intf
= TOPO
["routers"]["r5"]["links"]["r3"]["interface"]
319 SOURCE_ADDRESS
= TOPO
["routers"]["r5"]["links"]["r3"]["ipv6"].split("/")[0]
320 result
= socat_send_pim6_traffic(tgen
, "r5", "UDP6-SEND", group_address_list
, intf
)
321 assert result
is True, "Testcase {}: Failed Error: {}".format(tc_name
, result
)
323 step("r1: Verify (*, G) upstream IIF interface")
325 iif
= TOPO
["routers"]["r1"]["links"]["r2"]["interface"]
326 result
= verify_upstream_iif(tgen
, dut
, iif
, STAR
, group_address_list
)
327 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
329 step("r1: Verify (*, G) upstream join state and join timer")
330 result
= verify_join_state_and_timer(
331 tgen
, dut
, iif
, STAR
, group_address_list
, addr_type
="ipv6"
333 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
335 step("r1: Verify (*, G) ip mroutes")
336 oif
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
337 result
= verify_mroutes(tgen
, dut
, STAR
, group_address_list
, iif
, oif
)
338 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
340 step("r1: Verify (S, G) ip mroutes")
341 iif
= TOPO
["routers"]["r1"]["links"]["r3"]["interface"]
342 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, group_address_list
, iif
, oif
)
343 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
345 step("r1: Verify (S, G) upstream IIF interface")
346 result
= verify_upstream_iif(tgen
, dut
, iif
, SOURCE_ADDRESS
, group_address_list
)
347 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
349 step("r1: Verify (S, G) upstream join state and join timer")
350 result
= verify_join_state_and_timer(
351 tgen
, dut
, iif
, SOURCE_ADDRESS
, group_address_list
, addr_type
="ipv6"
353 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
355 step("r2: Verify (*, G) upstream IIF interface")
358 result
= verify_upstream_iif(tgen
, dut
, iif
, STAR
, group_address_list
)
359 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
361 step("r2: Verify (*, G) upstream join state and join timer")
362 result
= verify_join_state_and_timer(
363 tgen
, dut
, iif
, STAR
, group_address_list
, addr_type
="ipv6"
365 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
367 step("r2: Verify (*, G) ip mroutes")
368 oif
= TOPO
["routers"]["r2"]["links"]["r1"]["interface"]
369 result
= verify_mroutes(tgen
, dut
, STAR
, group_address_list
, iif
, oif
)
370 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
372 step("r3: Verify (S, G) upstream IIF interface")
374 iif
= TOPO
["routers"]["r3"]["links"]["r5"]["interface"]
375 result
= verify_upstream_iif(tgen
, dut
, iif
, SOURCE_ADDRESS
, group_address_list
)
376 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
378 step("r3: Verify (S, G) upstream join state and join timer")
379 result
= verify_join_state_and_timer(
388 assert result
is not True, (
389 "Testcase {} : Failed \n "
390 "r3: (S,G) upstream state is joined and join timer is running\n Error: {}".format(
395 step("r3: Verify (S, G) ip mroutes")
396 oif
= TOPO
["routers"]["r3"]["links"]["r1"]["interface"]
397 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, group_address_list
, iif
, oif
)
398 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
400 step("r2: Verify (S, G) upstream IIF interface")
402 iif
= TOPO
["routers"]["r2"]["links"]["r3"]["interface"]
403 result
= verify_upstream_iif(
404 tgen
, dut
, iif
, SOURCE_ADDRESS
, group_address_list
, joinState
="NotJoined"
406 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
408 step("r2: Verify (S, G) upstream join state and join timer")
409 result
= verify_join_state_and_timer(
418 assert result
is not True, (
419 "Testcase {} : Failed \n "
420 "r2: (S,G) upstream state is joined and join timer is running\n Error: {}".format(
425 step("r2: Verify (S, G) ip mroutes")
427 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, group_address_list
, iif
, oif
)
428 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
430 step("r1: Delete RP configuration")
436 "rp_addr": TOPO
["routers"]["r2"]["links"]["lo"]["ipv6"].split(
439 "group_addr_range": GROUP_RANGE_3
,
447 result
= create_pim_config(tgen
, TOPO
, input_dict
)
448 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
450 step("r1: Shut the interface r1-r2-eth1 from R1 to R2")
452 intf
= TOPO
["routers"]["r1"]["links"]["r2"]["interface"]
453 shutdown_bringup_interface(tgen
, dut
, intf
, False)
455 step("r1: No Shut the interface r1-r2-eth1 from R1 to R2")
456 shutdown_bringup_interface(tgen
, dut
, intf
, True)
458 step("r1: Configure RP")
464 "rp_addr": TOPO
["routers"]["r2"]["links"]["lo"]["ipv6"].split(
467 "group_addr_range": GROUP_RANGE_3
,
474 result
= create_pim_config(tgen
, TOPO
, input_dict
)
475 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
477 step("r1: Shut the interface r1-r0-eth0 from R1 to R2")
478 intf
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
479 shutdown_bringup_interface(tgen
, dut
, intf
, False)
481 step("r1: No Shut the interface r1-r0-eth0 from R1 to R2")
482 shutdown_bringup_interface(tgen
, dut
, intf
, True)
484 step("r1: Verify (*, G) upstream IIF interface")
486 iif
= TOPO
["routers"]["r1"]["links"]["r2"]["interface"]
487 result
= verify_upstream_iif(tgen
, dut
, iif
, STAR
, group_address_list
)
488 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
490 step("r1: Verify (*, G) upstream join state and join timer")
491 result
= verify_join_state_and_timer(
492 tgen
, dut
, iif
, STAR
, group_address_list
, addr_type
="ipv6"
494 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
496 step("r1: Verify (*, G) ip mroutes")
497 oif
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
498 result
= verify_mroutes(tgen
, dut
, STAR
, group_address_list
, iif
, oif
)
499 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
501 step("r1: Verify (S, G) upstream IIF interface")
502 iif
= TOPO
["routers"]["r1"]["links"]["r3"]["interface"]
503 result
= verify_upstream_iif(tgen
, dut
, iif
, SOURCE_ADDRESS
, group_address_list
)
504 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
506 step("r1: Verify (S, G) upstream join state and join timer")
507 result
= verify_join_state_and_timer(
508 tgen
, dut
, iif
, SOURCE_ADDRESS
, group_address_list
, addr_type
="ipv6"
510 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
512 step("r1: Verify (S, G) ip mroutes")
513 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, group_address_list
, iif
, oif
)
514 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
516 step("r2: Verify (*, G) upstream IIF interface")
519 result
= verify_upstream_iif(tgen
, dut
, iif
, STAR
, group_address_list
)
520 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
522 step("r2: Verify (*, G) upstream join state and join timer")
523 result
= verify_join_state_and_timer(
524 tgen
, dut
, iif
, STAR
, group_address_list
, addr_type
="ipv6"
526 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
528 step("r2: Verify (*, G) ip mroutes")
529 oif
= TOPO
["routers"]["r2"]["links"]["r1"]["interface"]
530 result
= verify_mroutes(tgen
, dut
, STAR
, group_address_list
, iif
, oif
)
531 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
533 step("r3: Verify (S, G) upstream IIF interface")
535 iif
= TOPO
["routers"]["r3"]["links"]["r5"]["interface"]
536 result
= verify_upstream_iif(tgen
, dut
, iif
, SOURCE_ADDRESS
, group_address_list
)
537 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
539 step("r3: Verify (S, G) upstream join state and join timer")
540 result
= verify_join_state_and_timer(
549 assert result
is not True, (
550 "Testcase {} : Failed \n "
551 "r3: (S,G) upstream state is joined and join timer is running\n Error: {}".format(
556 step("r3: Verify (S, G) ip mroutes")
557 oif
= TOPO
["routers"]["r3"]["links"]["r1"]["interface"]
558 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, group_address_list
, iif
, oif
)
559 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
561 write_test_footer(tc_name
)
564 def test_pim6_multiple_groups_different_RP_address_p2(request
):
566 Verify IIF and OIL in updated in mroute when upstream interface
573 r0-----r1-------------r3-----r5
583 tc_name
= request
.node
.name
584 write_test_header(tc_name
)
586 # Don"t run this test if we have any failure.
587 if tgen
.routers_have_failure():
588 pytest
.skip(tgen
.errors
)
590 step("Creating configuration from JSON")
591 reset_config_on_routers(tgen
)
593 step("Enable MLD on r1 interface")
594 step("Enable the PIM6 on all the interfaces of r1, r2, r3 and r4 routers")
595 step("r2: Configure r2 as RP")
596 step("r4: Configure r4 as RP")
602 "rp_addr": TOPO
["routers"]["r2"]["links"]["lo"]["ipv6"].split(
605 "group_addr_range": GROUP_RANGE_LIST_1
,
614 "rp_addr": TOPO
["routers"]["r4"]["links"]["lo"]["ipv6"].split(
617 "group_addr_range": GROUP_RANGE_LIST_2
,
624 result
= create_pim_config(tgen
, TOPO
, input_dict
)
625 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
627 step("r2: Verify RP info")
630 rp_address
= TOPO
["routers"]["r2"]["links"]["lo"]["ipv6"].split("/")[0]
631 result
= verify_pim_rp_info(
632 tgen
, TOPO
, dut
, GROUP_RANGE_LIST_1
, oif
, rp_address
, SOURCE
634 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
636 step("r4: Verify RP info")
638 rp_address
= TOPO
["routers"]["r4"]["links"]["lo"]["ipv6"].split("/")[0]
639 result
= verify_pim_rp_info(
640 tgen
, TOPO
, dut
, GROUP_RANGE_LIST_2
, oif
, rp_address
, SOURCE
642 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
644 group_address_list
= GROUP_ADDRESS_LIST_1
+ GROUP_ADDRESS_LIST_2
645 step("r0: Send MLD join for 10 groups")
646 intf
= TOPO
["routers"]["r0"]["links"]["r1"]["interface"]
647 intf_ip
= TOPO
["routers"]["r0"]["links"]["r1"]["ipv6"].split("/")[0]
648 result
= socat_send_mld_join(
649 tgen
, "r0", "UDP6-RECV", group_address_list
, intf
, intf_ip
651 assert result
is True, "Testcase {}: Failed Error: {}".format(tc_name
, result
)
653 step("r1: Verify MLD groups")
655 intf_r1_r0
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
656 result
= verify_mld_groups(tgen
, dut
, intf_r1_r0
, group_address_list
)
657 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
659 step("r5: Send multicast traffic for group {}".format(group_address_list
))
660 intf
= TOPO
["routers"]["r5"]["links"]["r3"]["interface"]
661 SOURCE_ADDRESS
= TOPO
["routers"]["r5"]["links"]["r3"]["ipv6"].split("/")[0]
662 result
= socat_send_pim6_traffic(tgen
, "r5", "UDP6-SEND", group_address_list
, intf
)
663 assert result
is True, "Testcase {}: Failed Error: {}".format(tc_name
, result
)
665 step("r1: Verify (*, G) upstream IIF interface")
667 iif1
= TOPO
["routers"]["r1"]["links"]["r2"]["interface"]
668 iif2
= TOPO
["routers"]["r1"]["links"]["r4"]["interface"]
670 for _iif
, _group
in zip([iif1
, iif2
], [GROUP_ADDRESS_LIST_1
, GROUP_ADDRESS_LIST_2
]):
671 result
= verify_upstream_iif(tgen
, dut
, _iif
, STAR
, _group
)
672 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
674 step("r1: Verify (*, G) upstream join state and join timer")
675 result
= verify_join_state_and_timer(
676 tgen
, dut
, _iif
, STAR
, _group
, addr_type
="ipv6"
678 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
680 step("r1: Verify (*, G) ip mroutes")
681 iif
= TOPO
["routers"]["r1"]["links"]["r2"]["interface"]
682 oif
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
683 result
= verify_mroutes(tgen
, dut
, STAR
, GROUP_ADDRESS_LIST_1
, iif
, oif
)
684 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
686 step("r1: Verify (S, G) upstream IIF interface")
687 iif
= TOPO
["routers"]["r1"]["links"]["r3"]["interface"]
688 result
= verify_upstream_iif(tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
)
689 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
691 step("r1: Verify (S, G) upstream join state and join timer")
692 result
= verify_join_state_and_timer(
693 tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
, addr_type
="ipv6"
695 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
697 step("r1: Verify (S, G) ip mroutes")
698 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
, iif
, oif
)
699 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
701 step("r2: Verify (*, G) upstream IIF interface")
704 result
= verify_upstream_iif(tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_1
)
705 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
707 step("r2: Verify (*, G) upstream join state and join timer")
708 result
= verify_join_state_and_timer(
709 tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_1
, addr_type
="ipv6"
711 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
713 step("r2: Verify (*, G) ip mroutes")
714 oif
= TOPO
["routers"]["r2"]["links"]["r1"]["interface"]
715 result
= verify_mroutes(tgen
, dut
, STAR
, GROUP_ADDRESS_LIST_1
, iif
, oif
)
716 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
718 step("r2: Verify (S, G) upstream IIF interface")
719 iif
= TOPO
["routers"]["r2"]["links"]["r3"]["interface"]
720 result
= verify_upstream_iif(
721 tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
, joinState
="NotJoined"
723 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
725 step("r2: Verify (S, G) upstream join state and join timer")
726 result
= verify_join_state_and_timer(
731 GROUP_ADDRESS_LIST_1
,
735 assert result
is not True, (
736 "Testcase {} : Failed \n "
737 "r2: (S,G) upstream state is joined and join timer is running\n Error: {}".format(
742 step("r2: Verify (S, G) ip mroutes")
744 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
, iif
, oif
)
745 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
747 step("r3: Verify (S, G) upstream IIF interface")
749 iif
= TOPO
["routers"]["r3"]["links"]["r5"]["interface"]
750 result
= verify_upstream_iif(tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
)
751 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
753 step("r3: Verify (S, G) upstream join state and join timer")
754 result
= verify_join_state_and_timer(
759 GROUP_ADDRESS_LIST_1
,
763 assert result
is not True, (
764 "Testcase {} : Failed \n "
765 "r3: (S,G) upstream state is joined and join timer is running\n Error: {}".format(
770 step("r3: Verify (S, G) ip mroutes")
771 oif
= TOPO
["routers"]["r3"]["links"]["r1"]["interface"]
772 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
, iif
, oif
)
773 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
775 step("r1: Verify (*, G) upstream IIF interface")
777 iif
= TOPO
["routers"]["r1"]["links"]["r4"]["interface"]
778 result
= verify_upstream_iif(tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_2
)
779 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
781 step("r1: Verify (*, G) upstream join state and join timer")
782 result
= verify_join_state_and_timer(
783 tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_2
, addr_type
="ipv6"
785 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
787 step("r1: Verify (*, G) ip mroutes")
788 oif
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
789 result
= verify_mroutes(tgen
, dut
, STAR
, GROUP_ADDRESS_LIST_2
, iif
, oif
)
790 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
792 step("r1: Verify (S, G) upstream IIF interface")
793 iif
= TOPO
["routers"]["r1"]["links"]["r3"]["interface"]
794 result
= verify_upstream_iif(tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
)
795 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
797 step("r1: Verify (S, G) upstream join state and join timer")
798 result
= verify_join_state_and_timer(
799 tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
, addr_type
="ipv6"
801 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
803 step("r1: Verify (S, G) ip mroutes")
804 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
, iif
, oif
)
805 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
807 step("r4: Verify (*, G) upstream IIF interface")
810 result
= verify_upstream_iif(tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_2
)
811 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
813 step("r4: Verify (*, G) upstream join state and join timer")
814 result
= verify_join_state_and_timer(
815 tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_2
, addr_type
="ipv6"
817 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
819 step("r4: Verify (*, G) ip mroutes")
820 oif
= TOPO
["routers"]["r4"]["links"]["r1"]["interface"]
821 result
= verify_mroutes(tgen
, dut
, STAR
, GROUP_ADDRESS_LIST_2
, iif
, oif
)
822 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
824 step("r4: Verify (S, G) upstream IIF interface")
825 iif
= TOPO
["routers"]["r4"]["links"]["r3"]["interface"]
826 result
= verify_upstream_iif(
827 tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
, joinState
="NotJoined"
829 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
831 step("r4: Verify (S, G) upstream join state and join timer")
832 result
= verify_join_state_and_timer(
837 GROUP_ADDRESS_LIST_2
,
841 assert result
is not True, (
842 "Testcase {} : Failed \n "
843 "r4: (S,G) upstream state is joined and join timer is running\n Error: {}".format(
848 step("r4: Verify (S, G) ip mroutes")
850 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
, iif
, oif
)
851 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
853 step("r3: Verify (S, G) upstream IIF interface")
855 iif
= TOPO
["routers"]["r3"]["links"]["r5"]["interface"]
856 result
= verify_upstream_iif(tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
)
857 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
859 step("r3: Verify (S, G) upstream join state and join timer")
860 result
= verify_join_state_and_timer(
865 GROUP_ADDRESS_LIST_2
,
869 assert result
is not True, "Testcase {} :Failed \n Error: {}".format(
873 step("r3: Verify (S, G) ip mroutes")
874 oif
= TOPO
["routers"]["r3"]["links"]["r1"]["interface"]
875 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
, iif
, oif
)
876 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
878 step("Delete RP configuration")
884 "rp_addr": TOPO
["routers"]["r2"]["links"]["lo"]["ipv6"].split(
887 "group_addr_range": GROUP_RANGE_LIST_1
,
897 "rp_addr": TOPO
["routers"]["r4"]["links"]["lo"]["ipv6"].split(
900 "group_addr_range": GROUP_RANGE_LIST_2
,
908 result
= create_pim_config(tgen
, TOPO
, input_dict
)
909 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
911 step("r1, r2, r3, r4: Re-configure RP")
917 "rp_addr": TOPO
["routers"]["r2"]["links"]["lo"]["ipv6"].split(
920 "group_addr_range": GROUP_RANGE_LIST_1
,
929 "rp_addr": TOPO
["routers"]["r4"]["links"]["lo"]["ipv6"].split(
932 "group_addr_range": GROUP_RANGE_LIST_2
,
939 result
= create_pim_config(tgen
, TOPO
, input_dict
)
940 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
942 step("r1: Shut/No Shut the interfacesfrom R1 to R2, R4 and R0")
944 intf1
= TOPO
["routers"]["r1"]["links"]["r2"]["interface"]
945 intf2
= TOPO
["routers"]["r1"]["links"]["r4"]["interface"]
946 intf3
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
947 for intf
in [intf1
, intf2
, intf3
]:
948 shutdown_bringup_interface(tgen
, dut
, intf
, False)
949 shutdown_bringup_interface(tgen
, dut
, intf
, True)
951 step("r1: Verify (*, G) upstream IIF interface")
953 iif
= TOPO
["routers"]["r1"]["links"]["r2"]["interface"]
954 result
= verify_upstream_iif(tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_1
)
955 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
957 step("r1: Verify (*, G) upstream join state and join timer")
958 result
= verify_join_state_and_timer(
959 tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_1
, addr_type
="ipv6"
961 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
963 step("r1: Verify (*, G) ip mroutes")
964 oif
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
965 result
= verify_mroutes(tgen
, dut
, STAR
, GROUP_ADDRESS_LIST_1
, iif
, oif
)
966 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
968 step("r1: Verify (S, G) upstream IIF interface")
969 iif
= TOPO
["routers"]["r1"]["links"]["r3"]["interface"]
970 result
= verify_upstream_iif(tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
)
971 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
973 step("r1: Verify (S, G) upstream join state and join timer")
974 result
= verify_join_state_and_timer(
975 tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
, addr_type
="ipv6"
977 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
979 step("r1: Verify (S, G) ip mroutes")
980 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
, iif
, oif
)
981 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
983 step("r2: Verify (*, G) upstream IIF interface")
986 result
= verify_upstream_iif(tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_1
)
987 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
989 step("r2: Verify (*, G) upstream join state and join timer")
990 result
= verify_join_state_and_timer(
991 tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_1
, addr_type
="ipv6"
993 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
995 step("r2: Verify (*, G) ip mroutes")
996 oif
= TOPO
["routers"]["r2"]["links"]["r1"]["interface"]
997 result
= verify_mroutes(tgen
, dut
, STAR
, GROUP_ADDRESS_LIST_1
, iif
, oif
)
998 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1000 step("r2: Verify (S, G) upstream IIF interface")
1001 iif
= TOPO
["routers"]["r2"]["links"]["r3"]["interface"]
1002 result
= verify_upstream_iif(
1003 tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
, joinState
="NotJoined"
1005 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1007 step("r2: Verify (S, G) upstream join state and join timer")
1008 result
= verify_join_state_and_timer(
1013 GROUP_ADDRESS_LIST_1
,
1017 assert result
is not True, (
1018 "Testcase {} : Failed \n "
1019 "r2: (S,G) upstream state is joined and join timer is running\n Error: {}".format(
1024 step("r2: Verify (S, G) ip mroutes")
1026 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
, iif
, oif
)
1027 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1029 step("r3: Verify (S, G) upstream IIF interface")
1031 iif
= TOPO
["routers"]["r3"]["links"]["r5"]["interface"]
1032 result
= verify_upstream_iif(tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
)
1033 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1035 step("r3: Verify (S, G) upstream join state and join timer")
1036 result
= verify_join_state_and_timer(
1041 GROUP_ADDRESS_LIST_1
,
1045 assert result
is not True, (
1046 "Testcase {} : Failed \n "
1047 "r3: (S,G) upstream state is joined and join timer is running\n Error: {}".format(
1052 step("r3: Verify (S, G) ip mroutes")
1053 oif
= TOPO
["routers"]["r3"]["links"]["r1"]["interface"]
1054 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_1
, iif
, oif
)
1055 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1057 step("r1: Verify (*, G) upstream IIF interface")
1059 iif
= TOPO
["routers"]["r1"]["links"]["r4"]["interface"]
1060 result
= verify_upstream_iif(tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_2
)
1061 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1063 step("r1: Verify (*, G) upstream join state and join timer")
1064 result
= verify_join_state_and_timer(
1065 tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_2
, addr_type
="ipv6"
1067 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1069 step("r1: Verify (*, G) ip mroutes")
1070 oif
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
1071 result
= verify_mroutes(tgen
, dut
, STAR
, GROUP_ADDRESS_LIST_2
, iif
, oif
)
1072 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1074 step("r1: Verify (S, G) upstream IIF interface")
1075 iif
= TOPO
["routers"]["r1"]["links"]["r3"]["interface"]
1076 result
= verify_upstream_iif(tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
)
1077 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1079 step("r1: Verify (S, G) upstream join state and join timer")
1080 result
= verify_join_state_and_timer(
1081 tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
, addr_type
="ipv6"
1083 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1085 step("r1: Verify (S, G) ip mroutes")
1086 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
, iif
, oif
)
1087 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1089 step("r4: Verify (*, G) upstream IIF interface")
1092 result
= verify_upstream_iif(tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_2
)
1093 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1095 step("r4: Verify (*, G) upstream join state and join timer")
1096 result
= verify_join_state_and_timer(
1097 tgen
, dut
, iif
, STAR
, GROUP_ADDRESS_LIST_2
, addr_type
="ipv6"
1099 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1101 step("r4: Verify (*, G) ip mroutes")
1102 oif
= TOPO
["routers"]["r4"]["links"]["r1"]["interface"]
1103 result
= verify_mroutes(tgen
, dut
, STAR
, GROUP_ADDRESS_LIST_2
, iif
, oif
)
1104 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1106 step("r4: Verify (S, G) upstream IIF interface")
1107 iif
= TOPO
["routers"]["r4"]["links"]["r3"]["interface"]
1108 result
= verify_upstream_iif(
1109 tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
, joinState
="NotJoined"
1111 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1113 step("r4: Verify (S, G) upstream join state and join timer")
1114 result
= verify_join_state_and_timer(
1119 GROUP_ADDRESS_LIST_2
,
1123 assert result
is not True, (
1124 "Testcase {} : Failed \n "
1125 "r4: (S,G) upstream state is joined and join timer is running\n Error: {}".format(
1130 step("r4: Verify (S, G) ip mroutes")
1132 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
, iif
, oif
)
1133 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1135 step("r3: Verify (S, G) upstream IIF interface")
1137 iif
= TOPO
["routers"]["r3"]["links"]["r5"]["interface"]
1138 result
= verify_upstream_iif(tgen
, dut
, iif
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
)
1139 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1141 step("r3: Verify (S, G) upstream join state and join timer")
1142 result
= verify_join_state_and_timer(
1147 GROUP_ADDRESS_LIST_2
,
1151 assert result
is not True, (
1152 "Testcase {} : Failed \n "
1153 "r3: (S,G) upstream state is joined and join timer is running\n Error: {}".format(
1158 step("r3: Verify (S, G) ip mroutes")
1159 oif
= TOPO
["routers"]["r3"]["links"]["r1"]["interface"]
1160 result
= verify_mroutes(tgen
, dut
, SOURCE_ADDRESS
, GROUP_ADDRESS_LIST_2
, iif
, oif
)
1161 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1163 write_test_footer(tc_name
)
1166 def test_pim6_delete_RP_shut_noshut_upstream_interface_p1(request
):
1168 Verify RP info and (*,G) mroute after deleting the RP and shut /
1169 no shut the RPF interface.
1175 r0-----r1-------------r3
1178 tgen
= get_topogen()
1179 tc_name
= request
.node
.name
1180 write_test_header(tc_name
)
1182 # Don"t run this test if we have any failure.
1183 if tgen
.routers_have_failure():
1184 pytest
.skip(tgen
.errors
)
1186 step("Creating configuration from JSON")
1187 reset_config_on_routers(tgen
)
1189 step("Enable MLD on r1 interface")
1190 step("Enable the PIM6 on all the interfaces of r1, r2, r3 and r4 routers")
1191 step("r2: Configure r2 as RP")
1197 "rp_addr": TOPO
["routers"]["r2"]["links"]["lo"]["ipv6"].split(
1200 "group_addr_range": GROUP_RANGE_1
,
1207 result
= create_pim_config(tgen
, TOPO
, input_dict
)
1208 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1210 step("r2: verify rp-info")
1213 rp_address
= TOPO
["routers"]["r2"]["links"]["lo"]["ipv6"].split("/")[0]
1214 result
= verify_pim_rp_info(
1215 tgen
, TOPO
, dut
, GROUP_ADDRESS_1
, oif
, rp_address
, SOURCE
1217 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1219 step("r0: Send MLD join")
1220 intf
= TOPO
["routers"]["r0"]["links"]["r1"]["interface"]
1221 intf_ip
= TOPO
["routers"]["r0"]["links"]["r1"]["ipv6"].split("/")[0]
1222 result
= socat_send_mld_join(
1223 tgen
, "r0", "UDP6-RECV", GROUP_ADDRESS_1
, intf
, intf_ip
1225 assert result
is True, "Testcase {}: Failed Error: {}".format(tc_name
, result
)
1227 step("r1: Verify MLD groups")
1229 intf_r1_r0
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
1230 result
= verify_mld_groups(tgen
, dut
, intf_r1_r0
, GROUP_ADDRESS_1
)
1231 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1233 step("r1: Verify (*, G) ip mroutes created")
1234 iif
= TOPO
["routers"]["r1"]["links"]["r2"]["interface"]
1235 oif
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
1236 result
= verify_mroutes(tgen
, dut
, STAR
, GROUP_ADDRESS_1
, iif
, oif
)
1237 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1239 step("r2: Verify (*, G) ip mroutes created")
1242 oif
= TOPO
["routers"]["r2"]["links"]["r1"]["interface"]
1243 result
= verify_mroutes(tgen
, dut
, STAR
, GROUP_ADDRESS_1
, iif
, oif
)
1244 assert result
is True, ASSERT_MSG
.format(tc_name
, result
)
1246 step("r1: Delete RP configuration")
1252 "rp_addr": TOPO
["routers"]["r2"]["links"]["lo"]["ipv6"].split(
1255 "group_addr_range": GROUP_RANGE_1
,
1263 result
= create_pim_config(tgen
, TOPO
, input_dict
)
1264 assert result
is True, "Testcase {} : Failed Error: {}".format(tc_name
, result
)
1266 step("r1: Shut/No Shut the interface r1-r2-eth1/r1-r0-eth0 from R1 to R2")
1268 intf1
= TOPO
["routers"]["r1"]["links"]["r2"]["interface"]
1269 intf2
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
1270 for intf
in [intf1
, intf2
]:
1271 shutdown_bringup_interface(tgen
, dut
, intf
, False)
1272 shutdown_bringup_interface(tgen
, dut
, intf
, True)
1274 step("r2: Shut the RP interface lo")
1277 shutdown_bringup_interface(tgen
, dut
, intf
, False)
1279 step("r1: Shut the interface r1-r2-eth1/r1-r3-eth2 towards RP")
1280 intf3
= TOPO
["routers"]["r1"]["links"]["r3"]["interface"]
1281 for intf
in [intf1
, intf3
]:
1282 shutdown_bringup_interface(tgen
, dut
, intf
, False)
1284 step("r1: Verify (*, G) ip mroutes cleared")
1286 iif
= TOPO
["routers"]["r1"]["links"]["r2"]["interface"]
1287 oif
= TOPO
["routers"]["r1"]["links"]["r0"]["interface"]
1288 result
= verify_mroutes(tgen
, dut
, STAR
, GROUP_ADDRESS_1
, iif
, oif
, expected
=False)
1289 assert result
is not True, (
1290 "Testcase {} : Failed \n "
1291 "r1: (*,G) mroutes are not cleared after shut of R1 to R0 link\n Error: {}".format(
1296 step("r2: Verify (*, G) ip mroutes cleared")
1299 oif
= TOPO
["routers"]["r2"]["links"]["r1"]["interface"]
1300 result
= verify_mroutes(tgen
, dut
, STAR
, GROUP_ADDRESS_1
, iif
, oif
, expected
=False)
1301 assert result
is not True, (
1302 "Testcase {} : Failed \n "
1303 "r2: (*,G) mroutes are not cleared after shut of R1 to R0 link\n Error: {}".format(
1308 write_test_footer(tc_name
)
1311 if __name__
== "__main__":
1312 args
= ["-s"] + sys
.argv
[1:]
1313 sys
.exit(pytest
.main(args
))