def test_PIM_hello_tx_rx_p1(request): """ TC_54 Verify received and transmit hello stats are getting cleared after PIM nbr reset """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) # Creating configuration from JSON kill_iperf(tgen) clear_ip_mroute(tgen) reset_config_on_routers(tgen) clear_ip_pim_interface_traffic(tgen, topo) # Don"t run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) step( "Remove c1-c2 connected link to simulate topo " "c1(LHR)---l1(RP)----r2---f1-----c2(FHR)" ) intf_c1_c2 = topo["routers"]["c1"]["links"]["c2"]["interface"] intf_c2_c1 = topo["routers"]["c2"]["links"]["c1"]["interface"] shutdown_bringup_interface(tgen, "c1", intf_c1_c2, False) shutdown_bringup_interface(tgen, "c2", intf_c2_c1, False) step("Enable the PIM on all the interfaces of FRR1, FRR2, FRR3") step( "Enable IGMP of FRR1 interface and send IGMP joins " " from FRR1 node for group range (225.1.1.1-5)" ) intf_c1_i4 = topo["routers"]["c1"]["links"]["i4"]["interface"] input_dict = { "c1": {"igmp": {"interfaces": {intf_c1_i4: {"igmp": {"version": "2"}}}}} } result = create_igmp_config(tgen, topo, input_dict) assert result is True, "Testcase {}: Failed Error: {}".format(tc_name, result) input_join = {"i4": topo["routers"]["i4"]["links"]["c1"]["interface"]} for recvr, recvr_intf in input_join.items(): result = config_to_send_igmp_join_and_traffic( tgen, topo, tc_name, recvr, recvr_intf, GROUP_RANGE_1, join=True ) assert result is True, "Testcase {}: Failed Error: {}".format(tc_name, result) result = iperfSendIGMPJoin(tgen, recvr, IGMP_JOIN_RANGE_1, join_interval=1) assert result is True, "Testcase {}: Failed Error: {}".format(tc_name, result) step("Configure static RP for (225.1.1.1-5) as R2") input_dict = { "l1": { "pim": { "rp": [ { "rp_addr": topo["routers"]["l1"]["links"]["lo"]["ipv4"].split( "/" )[0], "group_addr_range": GROUP_RANGE, } ] } } } result = create_pim_config(tgen, topo, input_dict) assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) step("Send Mcast traffic from C2 to all the groups ( 225.1.1.1 to 225.1.1.5)") input_src = {"i5": topo["routers"]["i5"]["links"]["c2"]["interface"]} for src, src_intf in input_src.items(): result = config_to_send_igmp_join_and_traffic( tgen, topo, tc_name, src, src_intf, GROUP_RANGE_1, traffic=True ) assert result is True, "Testcase {}: Failed Error: {}".format(tc_name, result) result = iperfSendTraffic(tgen, src, IGMP_JOIN_RANGE_1, 32, 2500) assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) source_i5 = topo["routers"]["i5"]["links"]["c2"]["ipv4"].split("/")[0] input_dict_starg = [ { "dut": "c1", "src_address": "*", "iif": topo["routers"]["c1"]["links"]["l1"]["interface"], "oil": topo["routers"]["c1"]["links"]["i4"]["interface"], } ] input_dict_sg = [ { "dut": "c1", "src_address": source_i5, "iif": topo["routers"]["c1"]["links"]["l1"]["interface"], "oil": topo["routers"]["c1"]["links"]["i4"]["interface"], } ] step("(*,G) and (S,G) created on f1 and node verify using 'show ip mroute'") for data in input_dict_sg: result = verify_ip_mroutes( tgen, data["dut"], data["src_address"], IGMP_JOIN_RANGE_1, data["iif"], data["oil"], ) assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) for data in input_dict_starg: result = verify_ip_mroutes( tgen, data["dut"], data["src_address"], IGMP_JOIN_RANGE_1, data["iif"], data["oil"], ) assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) intf_l1_c1 = topo["routers"]["l1"]["links"]["c1"]["interface"] intf_c1_l1 = topo["routers"]["c1"]["links"]["l1"]["interface"] step("verify before stats on C1") state_dict = {"c1": {intf_c1_l1: ["helloTx", "helloRx"],}} c1_state_before = verify_pim_interface_traffic(tgen, state_dict) assert isinstance( c1_state_before, dict ), "Testcase{} : Failed \n state_before is not dictionary \n " "Error: {}".format(tc_name, result) step("Flap PIM nbr while doing interface c1-l1 interface shut from f1 side") shutdown_bringup_interface(tgen, "c1", intf_c1_l1, False) step( "After shut of local interface from c1 , verify rx/tx hello counters are cleared on c1 side" "verify using 'show ip pim interface traffic'" ) shutdown_bringup_interface(tgen, "c1", intf_c1_l1, True) step("verify stats after on c1") c1_state_after = verify_pim_interface_traffic(tgen, state_dict) assert isinstance( c1_state_after, dict ), "Testcase{} : Failed \n state_before is not dictionary \n " "Error: {}".format(tc_name, result) step("verify stats not increamented on c1") result = verify_state_incremented(c1_state_before, c1_state_after) assert ( result is not True ), "Testcase{} : Failed Error: {}" "stats incremented".format(tc_name, result) step("verify before stats on l1") l1_state_dict = {"l1": {intf_l1_c1: ["helloTx", "helloRx"],}} l1_state_before = verify_pim_interface_traffic(tgen, l1_state_dict) assert isinstance( l1_state_before, dict ), "Testcase{} : Failed \n state_before is not dictionary \n " "Error: {}".format(tc_name, result) step("Flap PIM nbr while doing interface r2-c1 shut from r2 side") shutdown_bringup_interface(tgen, "l1", intf_l1_c1, False) step( "After shut the interface from r2 side , verify r2 side rx and tx of hello" "counters are resetted show ip pim interface traffic" ) shutdown_bringup_interface(tgen, "l1", intf_l1_c1, True) step("verify stats after on l1") l1_state_after = verify_pim_interface_traffic(tgen, l1_state_dict) assert isinstance( l1_state_after, dict ), "Testcase{} : Failed \n state_before is not dictionary \n " "Error: {}".format(tc_name, result) step("verify stats not increamented on l1") result = verify_state_incremented(l1_state_before, l1_state_after) assert ( result is not True ), "Testcase{} : Failed Error: {}" "stats incremented".format(tc_name, result) step("Reinit the dict") c1_state_before = {} l1_state_before = {} c1_state_after = {} l1_state_after = {} step("verify before stats on C1") state_dict = {"c1": {intf_c1_l1: ["helloTx", "helloRx"],}} c1_state_before = verify_pim_interface_traffic(tgen, state_dict) assert isinstance( c1_state_before, dict ), "Testcase{} : Failed \n state_before is not dictionary \n " "Error: {}".format(tc_name, result) step("Flap c1-r2 pim nbr while changing ip address from c1 side") c1_l1_ip_subnet = topo["routers"]["c1"]["links"]["l1"]["ipv4"] raw_config = { "c1": { "raw_config": [ "interface {}".format(intf_c1_l1), "no ip address {}".format(c1_l1_ip_subnet), "ip address {}".format(NEW_ADDRESS_2_SUBNET), ] } } result = apply_raw_config(tgen, raw_config) assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) step("verify stats after on c1") c1_state_after = verify_pim_interface_traffic(tgen, state_dict) assert isinstance( c1_state_after, dict ), "Testcase{} : Failed \n state_before is not dictionary \n " "Error: {}".format(tc_name, result) step("verify stats not increamented on c1") result = verify_state_incremented(c1_state_before, c1_state_after) assert ( result is not True ), "Testcase{} : Failed Error: {}" "stats incremented".format(tc_name, result) write_test_footer(tc_name)
def test_pimv6_add_delete_static_RP_p0(request): """ TC_1: Verify upstream interfaces(IIF) and join state are updated properly after adding and deleting the static RP TC_2: Verify IIF and OIL in "show ip pim state" updated properly after adding and deleting the static RP TC_3: (*, G) Mroute entry are cleared when static RP gets deleted TC_4: Verify (*,G) prune is send towards the RP after deleting the static RP TOPOlogy used: r0------r1-----r2 iperf DUT RP """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) # Don"t run this test if we have any failure. if tgen.routers_have_failure(): check_router_status(tgen) step("Shut link b/w R1 and R3 and R1 and R4 as per tescase topology") intf_r1_r3 = TOPO["routers"]["r1"]["links"]["r3"]["interface"] intf_r1_r4 = TOPO["routers"]["r1"]["links"]["r4"]["interface"] for intf in [intf_r1_r3, intf_r1_r4]: shutdown_bringup_interface(tgen, "r1", intf, ifaceaction=False) step("Enable PIM between r1 and r2") step("Enable MLD on r1 interface and send IGMP " "join (FF08::1) to r1") step("Configure r2 loopback interface as RP") input_dict = { "r2": { "pim6": { "rp": [{ "rp_addr": TOPO["routers"]["r2"]["links"]["lo"]["ipv6"].split("/")[0], "group_addr_range": GROUP_RANGE_V6, }] } } } result = create_pim_config(tgen, TOPO, input_dict) assert result is True, "Testcase {} : Failed Error: {}".format( tc_name, result) step("Verify show ip pim interface traffic without any mld join") state_dict = { "r1": { TOPO["routers"]["r1"]["links"]["r2"]["interface"]: ["pruneTx"] } } state_before = verify_pim_interface_traffic(tgen, state_dict, addr_type="ipv6") assert isinstance( state_before, dict ), "Testcase{} : Failed \n state_before is not dictionary \n " "Error: {}".format( tc_name, result) step("send mld join (FF08::1) to R1") intf = TOPO["routers"]["r0"]["links"]["r1"]["interface"] intf_ip = TOPO["routers"]["r0"]["links"]["r1"]["ipv6"].split("/")[0] result = socat_send_igmp_join_traffic(tgen, "r0", "UDP6-RECV", IGMP_JOIN_V6, intf, intf_ip, join=True) assert result is True, "Testcase {}: Failed Error: {}".format( tc_name, result) step("r1: Verify RP info") dut = "r1" oif = TOPO["routers"]["r1"]["links"]["r2"]["interface"] iif = TOPO["routers"]["r1"]["links"]["r0"]["interface"] rp_address = TOPO["routers"]["r2"]["links"]["lo"]["ipv6"].split("/")[0] result = verify_pim_rp_info(tgen, TOPO, dut, GROUP_RANGE_V6, oif, rp_address, SOURCE) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("r1: Verify upstream IIF interface") result = verify_upstream_iif(tgen, dut, oif, STAR, IGMP_JOIN_V6) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("r1: Verify upstream join state and join timer") result = verify_join_state_and_timer(tgen, dut, oif, STAR, IGMP_JOIN_V6) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("r1: Verify PIM state") result = verify_pim_state(tgen, dut, oif, iif, IGMP_JOIN_V6) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("r1: Verify ip mroutes") result = verify_mroutes(tgen, dut, STAR, IGMP_JOIN_V6, oif, iif) assert result is True, "Testcase {} :Failed \n Error: {}".format( tc_name, result) step("r1: Delete RP configuration") input_dict = { "r2": { "pim6": { "rp": [{ "rp_addr": TOPO["routers"]["r2"]["links"]["lo"]["ipv6"].split("/")[0], "group_addr_range": GROUP_RANGE_V6, "delete": True, }] } } } result = create_pim_config(tgen, TOPO, input_dict) assert result is True, "Testcase {} : Failed Error: {}".format( tc_name, result) step("r1: Verify RP info") result = verify_pim_rp_info(tgen, TOPO, dut, GROUP_RANGE_V6, oif, rp_address, SOURCE, expected=False) assert ( result is not True ), "Testcase {} :Failed \n " "RP: {} info is still present \n Error: {}".format( tc_name, rp_address, result) step("r1: Verify upstream IIF interface") result = verify_upstream_iif(tgen, dut, oif, STAR, IGMP_JOIN_V6, expected=False) assert result is not True, ( "Testcase {} :Failed \n " "Upstream ({}, {}) is still in join state \n Error: {}".format( tc_name, STAR, IGMP_JOIN_V6, result)) step("r1: Verify upstream join state and join timer") result = verify_join_state_and_timer(tgen, dut, oif, STAR, IGMP_JOIN_V6, expected=False) assert result is not True, ( "Testcase {} :Failed \n " "Upstream ({}, {}) timer is still running \n Error: {}".format( tc_name, STAR, IGMP_JOIN_V6, result)) step("r1: Verify PIM state") result = verify_pim_state(tgen, dut, oif, iif, IGMP_JOIN_V6, expected=False) assert result is not True, ( "Testcase {} :Failed \n " "PIM state for group: {} is still Active \n Error: {}".format( tc_name, IGMP_JOIN_V6, result)) step("r1: Verify ip mroutes") result = verify_mroutes(tgen, dut, STAR, IGMP_JOIN_V6, oif, iif, expected=False) assert result is not True, ( "Testcase {} :Failed \n " "mroute ({}, {}) is still present \n Error: {}".format( tc_name, STAR, IGMP_JOIN_V6, result)) step("r1: Verify show ip pim interface traffic without any IGMP join") state_after = verify_pim_interface_traffic(tgen, state_dict, addr_type="ipv6") assert isinstance( state_after, dict ), "Testcase{} : Failed \n state_before is not dictionary \n " "Error: {}".format( tc_name, result) result = verify_state_incremented(state_before, state_after) assert result is True, "Testcase{} : Failed Error: {}".format( tc_name, result) write_test_footer(tc_name)