def test_mroute_with_RP_default_route_all_nodes_p2(request): """ TC_50 Verify mroute when LHR,FHR,RP and transit routers reachable using default routes """ 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 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("Verify mroutes and iff upstream") 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) result = verify_upstream_iif( tgen, data["dut"], data["iif"], data["src_address"], IGMP_JOIN_RANGE_1 ) 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) result = verify_upstream_iif( tgen, data["dut"], data["iif"], data["src_address"], IGMP_JOIN_RANGE_1 ) assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) step("Delete static routes RP on all the nodes") input_dict = { "c2": { "static_routes": [ {"network": ["1.0.4.11/32"], "next_hop": "10.0.3.2", "delete": True} ] }, "c1": { "static_routes": [ {"network": ["1.0.4.11/32"], "next_hop": "10.0.2.2", "delete": True} ] }, "r2": { "static_routes": [ {"network": ["1.0.4.11/32"], "next_hop": "10.0.12.1", "delete": True} ] }, "f1": { "static_routes": [ {"network": ["1.0.4.11/32"], "next_hop": "10.0.7.2", "delete": True} ] }, } result = create_static_routes(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error {}".format(tc_name, result) step("Verify RP info unknown after removing static route from c2 ") dut = "c2" rp_address = topo["routers"]["l1"]["links"]["lo"]["ipv4"].split("/")[0] SOURCE = "Static" result = verify_pim_rp_info( tgen, topo, dut, GROUP_RANGE_1, "Unknown", rp_address, SOURCE ) assert result is True, "Testcase {} :Failed \n 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"], expected=False, ) assert result is not True, ("Testcase {} : Failed \n " "mroutes are still present \n Error: {}".format( tc_name, result )) result = verify_upstream_iif( tgen, data["dut"], data["iif"], data["src_address"], IGMP_JOIN_RANGE_1, expected=False, ) assert result is not True, ("Testcase {} : Failed \n " "upstream is still present \n Error: {}".format( tc_name, result )) step("Configure default routes on all the nodes") intf_f1_c2 = topo["routers"]["f1"]["links"]["c2"]["ipv4"].split("/")[0] intf_l1_c1 = topo["routers"]["l1"]["links"]["c1"]["ipv4"].split("/")[0] intf_l1_r2 = topo["routers"]["l1"]["links"]["r2"]["ipv4"].split("/")[0] intf_r2_f1 = topo["routers"]["r2"]["links"]["f1"]["ipv4"].split("/")[0] input_dict = { "c1": {"static_routes": [{"network": "0.0.0.0/0", "next_hop": intf_l1_c1}]}, "c2": {"static_routes": [{"network": "0.0.0.0/0", "next_hop": intf_f1_c2}]}, "r2": {"static_routes": [{"network": "0.0.0.0/0", "next_hop": intf_l1_r2}]}, "f1": {"static_routes": [{"network": "0.0.0.0/0", "next_hop": intf_r2_f1}]}, } result = create_static_routes(tgen, input_dict) assert result is True, "Testcase {} :Failed \n Error {}".format(tc_name, result) step("applying ip nht config on c2") raw_config = { "c1": {"raw_config": ["ip nht resolve-via-default"]}, "c2": {"raw_config": ["ip nht resolve-via-default"]}, "r2": {"raw_config": ["ip nht resolve-via-default"]}, "f1": {"raw_config": ["ip nht resolve-via-default"]}, "l1": {"raw_config": ["ip nht resolve-via-default"]}, } result = apply_raw_config(tgen, raw_config) assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) step("Verify RP info Not unknown after removing static route from c2 ") dut = "c2" step("Verify RP info is NOT unknown after removing static route from c2 ") result = verify_pim_rp_info( tgen, topo, dut, GROUP_RANGE_1, "Unknown", rp_address, SOURCE, expected=False ) assert result is not True, ("Testcase {} : Failed \n " "RP info is unknown after removing static route from c2 \n Error: {}".format( tc_name, result )) step("Verify (s,g) populated after adding default route ") 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) result = verify_upstream_iif( tgen, data["dut"], data["iif"], data["src_address"], IGMP_JOIN_RANGE_1 ) assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) step("Verify (*,g) populated after adding default route ") 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) result = verify_upstream_iif( tgen, data["dut"], data["iif"], data["src_address"], IGMP_JOIN_RANGE_1 ) assert result is True, "Testcase {} : Failed Error: {}".format(tc_name, result) write_test_footer(tc_name)
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_BSR_election_p0(request): """ Verify group to RP mapping in FRR node when 2 BSR are present in the network and both are having same BSR priority Topology used: b1_____ | | s1-----f1-----i1-----l1----r1 | ______| b2 b1 - BSR 1 b2 - BSR 2 s1 - Source f1 - FHR i1 - Intermediate Router (also RP) r1 - Receiver """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) 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) reset_config_on_routers(tgen) result = pre_config_to_bsm(tgen, topo, tc_name, "b1", "s1", "r1", "f1", "i1", "l1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) result = pre_config_to_bsm(tgen, topo, tc_name, "b2", "s1", "r1", "f1", "i1", "l1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) GROUP_ADDRESS = "225.1.1.1" # Use scapy to send pre-defined packet from senser to receiver step("Send BSR packet from b1 to FHR") result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet3") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) bsr_ip1 = topo["routers"]["b1"]["bsm"]["bsr_packets"]["packet1"][ "bsr"].split("/")[0] time.sleep(1) result = iperfSendIGMPJoin(tgen, "r1", GROUP_ADDRESS, join_interval=1) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Verify bsr state in FHR step("Verify if b1 is chosen as bsr in f1") result = verify_pim_bsr(tgen, topo, "f1", bsr_ip1) assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) dut = "l1" group = "225.1.1.0/24" # Find the elected rp from bsrp-info step("Find the elected rp from bsrp-info in LHR in l1") rp = find_rp_from_bsrp_info(tgen, dut, bsr_ip1, group) assert rp is not {}, "Testcase {} :Failed \n Error {}".format( tc_name, result) # Check RP detail in LHR step("Verify RP in LHR l1") result = verify_pim_grp_rp_source(tgen, topo, dut, group, "BSR", rp[group]) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Send BSR packet from b2 with same priority step("Send BSR packet from b2 to FHR with same priority") result = scapy_send_bsr_raw_packet(tgen, topo, "b2", "f1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) bsr_ip2 = topo["routers"]["b2"]["bsm"]["bsr_packets"]["packet2"][ "bsr"].split("/")[0] time.sleep(1) logger.info("BSR b1:" + bsr_ip1 + " BSR b2:" + bsr_ip2) # Verify bsr state in FHR step("Verify if b2 is not chosen as bsr in f1") result = verify_pim_bsr(tgen, topo, "f1", bsr_ip2, expected=False) assert ( result is not True ), "Testcase {} : Failed \n " "b2 is chosen as bsr in f1 \n Error: {}".format( tc_name, result) # Verify if b1 is still chosen as bsr step("Verify if b1 is still chosen as bsr in f1") result = verify_pim_bsr(tgen, topo, "f1", bsr_ip1) assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) # Verify if that rp is installed step("Verify that same RP in istalled in LHR l1") result = verify_pim_grp_rp_source(tgen, topo, dut, group, "BSR", rp[group]) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) step("clear BSM database before moving to next case") clear_bsrp_data(tgen, topo) write_test_footer(tc_name)
def test_RP_hash_p0(request): """ Verify RP is selected based on hash function, when BSR advertising the group to RP mapping with same priority Topology used: b1_____ | | s1-----f1-----i1-----l1----r1 | ______| b2 b1 - BSR 1 b2 - BSR 2 s1 - Source f1 - FHR i1 - Intermediate Router (also RP) r1 - Receiver """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) 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) reset_config_on_routers(tgen) result = pre_config_to_bsm(tgen, topo, tc_name, "b1", "s1", "r1", "f1", "i1", "l1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) result = pre_config_to_bsm(tgen, topo, tc_name, "b2", "s1", "r1", "f1", "i1", "l1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) GROUP_ADDRESS = "225.1.1.1" # Use scapy to send pre-defined packet from senser to receiver result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet7") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) bsr_ip = topo["routers"]["b1"]["bsm"]["bsr_packets"]["packet1"][ "bsr"].split("/")[0] time.sleep(1) result = iperfSendIGMPJoin(tgen, "r1", GROUP_ADDRESS, join_interval=1) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) dut = "l1" # Verify bsr state in FHR step("Verify if b1 chosen as BSR in f1") result = verify_pim_bsr(tgen, topo, "f1", bsr_ip) assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) group = "225.1.1.0/24" # Find the elected rp from bsrp-info step("Find the elected rp from bsrp-info in LHR l1") rp = find_rp_from_bsrp_info(tgen, dut, bsr_ip, group) assert rp is not {}, "Testcase {} :Failed \n Error {}".format( tc_name, result) # Verify if RP with highest hash value is chosen step("Verify if RP(2.2.2.2) with highest hash value is chosen in l1") if rp[group] == "2.2.2.2": result = True else: result = "rp expected: 2.2.2.2 got:" + rp[group] assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Check RP detail in LHR step("Verify RP in LHR") result = verify_pim_grp_rp_source(tgen, topo, dut, group, "BSR", rp[group]) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) step("clear BSM database before moving to next case") clear_bsrp_data(tgen, topo) write_test_footer(tc_name)
def test_RP_priority_p0(request): """ Verify group to RP info is updated correctly, when BSR advertising the same RP with different priority Topology used: b1_____ | | s1-----f1-----i1-----l1----r1 | ______| b2 b1 - BSR 1 b2 - BSR 2 s1 - Source f1 - FHR i1 - Intermediate Router (also RP) r1 - Receiver """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) 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) reset_config_on_routers(tgen) result = pre_config_to_bsm(tgen, topo, tc_name, "b1", "s1", "r1", "f1", "i1", "l1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) result = pre_config_to_bsm(tgen, topo, tc_name, "b2", "s1", "r1", "f1", "i1", "l1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) GROUP_ADDRESS = "225.1.1.1" # Use scapy to send pre-defined packet from senser to receiver step("Send BSR packet from b1 to FHR") result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) bsr_ip = topo["routers"]["b1"]["bsm"]["bsr_packets"]["packet1"][ "bsr"].split("/")[0] time.sleep(1) result = iperfSendIGMPJoin(tgen, "r1", GROUP_ADDRESS, join_interval=1) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Verify bsr state in FHR step("Verify if b1 is chosen as bsr in f1") result = verify_pim_bsr(tgen, topo, "f1", bsr_ip) assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) dut = "l1" group = "225.1.1.0/24" # Find the elected rp from bsrp-info step("Find the elected rp from bsrp-info in LHR l1") rp1 = find_rp_from_bsrp_info(tgen, dut, bsr_ip, group) assert rp1 is not {}, "Testcase {} :Failed \n Error {}".format( tc_name, result) # Check RP detail in LHR step("Verify RP in LHR l1") result = verify_pim_grp_rp_source(tgen, topo, dut, group, "BSR", rp1[group]) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Send BSR packet from b1 after deleting high prio rp for 225.1.1.0/24 step("Send BSM from b1 to FHR deleting high prio rp for 225.1.1.0/24") result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet6") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) # Find the elected rp from bsrp-info step("Find the elected rp from bsrp-info in LHR l1") rp2 = find_rp_from_bsrp_info(tgen, dut, bsr_ip, group) assert rp2 is not {}, "Testcase {} :Failed \n Error {}".format( tc_name, result) logger.info("RP old: {} RP2 new: {} ".format(rp1[group], rp2[group])) # Verify is the rp is different now assert rp1[group] != rp2[group], "Testcase {} :Failed \n Error {}".format( tc_name, result) rp_add1 = rp1[group] rp_add2 = rp2[group] # Verify if that rp is installed step("Verify new RP in LHR installed") result = verify_pim_grp_rp_source(tgen, topo, dut, group, "BSR", rp_add2) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Send BSR packet from b1 after putting back high prio rp for 225.1.1.0/24 step("Send BSM from b1 to FHR put back old high prio rp for 225.1.1.0/24") result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) # Find the elected rp from bsrp-info step("Find the elected rp from bsrp-info in LHR") rp2 = find_rp_from_bsrp_info(tgen, dut, bsr_ip, group) assert rp2 is not {}, "Testcase {} :Failed \n Error : RP not Found".format( tc_name) # Verify is the rp is different now step("Verify now old RP is elected again") assert ( rp_add1 == rp2[group] ), "Testcase {} :Failed \n Error : rp expected {} rp received {}".format( tc_name, rp_add1, rp2[group] if group in rp2 else None) # Verify if that rp is installed step("Verify new RP in LHR installed") result = verify_pim_grp_rp_source(tgen, topo, dut, group, "BSR", rp_add1) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) step("clear BSM database before moving to next case") clear_bsrp_data(tgen, topo) write_test_footer(tc_name)
def test_overlapping_group_p0(request): """ Verify group to RP updated correctly on FRR router, when BSR advertising the overlapping group address Topology used: b1_____ | | s1-----f1-----i1-----l1----r1 | ______| b2 b1 - BSR 1 b2 - BSR 2 s1 - Source f1 - FHR i1 - Intermediate Router (also RP) r1 - Receiver """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) 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) reset_config_on_routers(tgen) result = pre_config_to_bsm(tgen, topo, tc_name, "b1", "s1", "r1", "f1", "i1", "l1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) result = pre_config_to_bsm(tgen, topo, tc_name, "b2", "s1", "r1", "f1", "i1", "l1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) GROUP_ADDRESS = "225.1.1.1" # Use scapy to send pre-defined packet from senser to receiver step("Send BSR packet from b1 to FHR") result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet4") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) bsr_ip = topo["routers"]["b1"]["bsm"]["bsr_packets"]["packet1"][ "bsr"].split("/")[0] time.sleep(1) result = iperfSendIGMPJoin(tgen, "r1", GROUP_ADDRESS, join_interval=1) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Verify bsr state in FHR step("Verify if b1 is chosen as bsr in f1") result = verify_pim_bsr(tgen, topo, "f1", bsr_ip) assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) dut = "l1" group1 = "225.1.1.1/32" # Find the elected rp from bsrp-info fro group 225.1.1.1/32 step("Find the elected rp from bsrp-info in LHR for 225.1.1.1/32") rp1 = find_rp_from_bsrp_info(tgen, dut, bsr_ip, group1) assert rp1 is not {}, "Testcase {} :Failed \n Error {}".format( tc_name, result) group2 = "225.1.1.0/24" # Find the elected rp from bsrp-info fro group 225.1.1.0/24 step("Find the elected rp from bsrp-info in LHR for 225.1.1.0/24") rp2 = find_rp_from_bsrp_info(tgen, dut, bsr_ip, group2) assert rp2 is not {}, "Testcase {} :Failed \n Error {}".format( tc_name, result) iif = "l1-i1-eth0" # Verify upstream rpf for 225.1.1.1 is chosen as rp1 step("Verify upstream rpf for 225.1.1.1 is chosen as rp1 in l1") result = verify_ip_pim_upstream_rpf(tgen, topo, dut, iif, GROUP_ADDRESS, rp1) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Send BSR packet from b1 with rp for 225.1.1.1/32 removed step("Send BSR packet from b1 with rp for 225.1.1.1/32 removed") result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet5") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) # Verify upstream rpf for 225.1.1.1 is chosen as rp1 step("Verify upstream rpf for 225.1.1.1 is chosen as rp2 in l1") result = verify_ip_pim_upstream_rpf(tgen, topo, dut, iif, GROUP_ADDRESS, rp2) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Verify IIF/OIL in pim state step("Verify iif is installed after rp change in l1") oil = "l1-r1-eth1" result = verify_pim_state(tgen, dut, iif, oil, GROUP_ADDRESS) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) step("clear BSM database before moving to next case") clear_bsrp_data(tgen, topo) write_test_footer(tc_name)
def test_starg_mroute_p0(request): """ 1. Verify (*,G) mroute detail on FRR router after BSM rp installed Topology used: b1_____ | | s1-----f1-----i1-----l1----r1 | ______| b2 b1 - BSR 1 b2 - BSR 2 s1 - Source f1 - FHR i1 - Intermediate Router (also RP) r1 - Receiver """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) 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) reset_config_on_routers(tgen) result = pre_config_to_bsm(tgen, topo, tc_name, "b1", "s1", "r1", "f1", "i1", "l1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) result = pre_config_to_bsm(tgen, topo, tc_name, "b2", "s1", "r1", "f1", "i1", "l1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) GROUP_ADDRESS = "226.1.1.1" # Use scapy to send pre-defined packet from senser to receiver result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) bsr_ip = topo["routers"]["b1"]["bsm"]["bsr_packets"]["packet1"][ "bsr"].split("/")[0] time.sleep(1) result = iperfSendIGMPJoin(tgen, "r1", GROUP_ADDRESS, join_interval=1) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Verify bsr state in FHR result = verify_pim_bsr(tgen, topo, "f1", bsr_ip) assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) # Check igmp groups step("Verify IGMP groups in LHR l1") dut = "l1" intf = "l1-r1-eth1" result = verify_igmp_groups(tgen, dut, intf, GROUP_ADDRESS) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) group = "226.1.1.1/32" src_addr = "*" # Find the elected rp from bsrp-info step("Find the elected rp from bsrp-info in LHR in l1") rp = find_rp_from_bsrp_info(tgen, dut, bsr_ip, group) assert rp is not {}, "Testcase {} :Failed \n Error {}".format( tc_name, result) # Check RP detail in LHR step("Verify RP in LHR in l1") result = verify_pim_grp_rp_source(tgen, topo, dut, group, "BSR", rp[group]) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Verify join state and join timer step("Verify join state and join timer in l1") iif = "l1-i1-eth0" result = verify_join_state_and_timer(tgen, dut, iif, src_addr, GROUP_ADDRESS) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Verify upstream IIF interface step("Verify upstream IIF interface in l1") result = verify_upstream_iif(tgen, dut, iif, src_addr, GROUP_ADDRESS) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Verify IIF/OIL in pim state oil = "l1-r1-eth1" result = verify_pim_state(tgen, dut, iif, oil, GROUP_ADDRESS) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Verify ip mroute step("Verify ip mroute in l1") src_addr = "*" result = verify_ip_mroutes(tgen, dut, src_addr, GROUP_ADDRESS, iif, oil) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Remove the group rp mapping and send bsm step( "Remove the grp-rp mapping by sending bsm with hold time 0 for grp-rp") result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet2") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) # Check RP unreachable step("Check RP unreachability in l1") iif = "Unknown" result = verify_upstream_iif(tgen, dut, iif, src_addr, GROUP_ADDRESS, joinState="NotJoined") assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Verify that it is not installed step("Verify that iif is not installed in l1") iif = "<iif?>" result = verify_pim_state(tgen, dut, iif, oil, GROUP_ADDRESS, installed_fl=0) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Verify mroute not installed step("Verify mroute not installed in l1") result = verify_ip_mroutes(tgen, dut, src_addr, GROUP_ADDRESS, iif, oil, retry_timeout=20, expected=False) assert ( result is not True ), "Testcase {} : Failed \n " "mroute installed in l1 \n Error: {}".format( tc_name, result) # Send BSM again to configure rp step("Add back RP by sending BSM from b1") result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) # Verify that (*,G) installed in mroute again iif = "l1-i1-eth0" result = verify_ip_mroutes(tgen, dut, src_addr, GROUP_ADDRESS, iif, oil) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) step("clear BSM database before moving to next case") clear_bsrp_data(tgen, topo) write_test_footer(tc_name)
def test_RP_with_all_ip_octet_p1(request): """ Verify when candidate RP advertised with 32 mask length and contain all the contacts Topology used: b1_____ | | s1-----f1-----i1-----l1----r1 | ______| b2 b1 - BSR 1 b2 - BSR 2 s1 - Source f1 - FHR i1 - Intermediate Router (also RP) r1 - Receiver """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) 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("pre-configure BSM packet") result = pre_config_to_bsm(tgen, topo, tc_name, "b1", "s1", "r1", "f1", "i1", "l1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) step( "Send the IGMP group (225.100.100.100) from receiver connected to FRR") GROUP_ADDRESS = "225.200.100.100" # Use scapy to send pre-defined packet from senser to receiver step("Configure cisco-1 as BSR1") result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet8") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) bsr_ip = topo["routers"]["b1"]["bsm"]["bsr_packets"]["packet8"][ "bsr"].split("/")[0] time.sleep(1) result = iperfSendIGMPJoin(tgen, "r1", GROUP_ADDRESS, join_interval=1) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) dut = "l1" step( "Groups are shown with candidate RP with correct mask length 'show ip pim bsrp-info'" ) step("Verify if b1 chosen as BSR in f1") result = verify_pim_bsr(tgen, topo, "f1", bsr_ip) assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) group = topo["routers"]["b1"]["bsm"]["bsr_packets"]["packet9"]["group"] step("Find the elected rp from bsrp-info in LHR l1") rp = find_rp_from_bsrp_info(tgen, dut, bsr_ip, group) assert rp is not {}, "Testcase {} :Failed \n Error {}".format( tc_name, result) step("Verify RP in LHR") result = verify_pim_grp_rp_source(tgen, topo, dut, group, "BSR", rp[group]) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) step("clear BSM database before moving to next case") clear_bsrp_data(tgen, topo) write_test_footer(tc_name)
def test_BSM_fragmentation_p1(request): """ Verify fragmentation of bootstrap message Topology used: b1_____ | | s1-----f1-----i1-----l1----r1 | ______| b2 b1 - BSR 1 b2 - BSR 2 s1 - Source f1 - FHR i1 - Intermediate Router (also RP) r1 - Receiver """ tgen = get_topogen() tc_name = request.node.name write_test_header(tc_name) kill_iperf(tgen) clear_ip_mroute(tgen) reset_config_on_routers(tgen) clear_ip_pim_interface_traffic(tgen, topo) reset_config_on_routers(tgen) # Don"t run this test if we have any failure. if tgen.routers_have_failure(): pytest.skip(tgen.errors) result = pre_config_to_bsm(tgen, topo, tc_name, "b1", "s1", "r1", "f1", "i1", "l1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) result = pre_config_to_bsm(tgen, topo, tc_name, "b2", "s1", "r1", "f1", "i1", "l1", "packet1") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) GROUP_ADDRESS = "225.1.1.1" bsr_ip = topo["routers"]["b1"]["bsm"]["bsr_packets"]["packet1"][ "bsr"].split("/")[0] step("Send BSM and verify if all routers have same bsrp before fragment") result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet1") # Verify bsr state in FHR step("Verify if b1 chosen as BSR in f1") result = verify_pim_bsr(tgen, topo, "f1", bsr_ip) assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) fhr_node = tgen.routers()["f1"] inter_node = tgen.routers()["i1"] lhr_node = tgen.routers()["l1"] # Verify if bsrp list is same across f1, i1 and l1 step("Verify if bsrp list is same across f1, i1 and l1") bsrp_f1 = fhr_node.vtysh_cmd("show ip pim bsrp-info json", isjson=True) logger.info("show_ip_pim_bsrp_info_json f1: \n %s", bsrp_f1) bsrp_i1 = inter_node.vtysh_cmd("show ip pim bsrp-info json", isjson=True) logger.info("show_ip_pim_bsrp_info_json i1: \n %s", bsrp_i1) bsrp_l1 = lhr_node.vtysh_cmd("show ip pim bsrp-info json", isjson=True) logger.info("show_ip_pim_bsrp_info_json l1: \n %s", bsrp_l1) if bsrp_f1 == bsrp_l1: result = True else: result = "bsrp info in f1 is not same in l1" assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) # set mtu of fhr(f1) to i1 interface to 100 so that bsm fragments step("set mtu of fhr(f1) to i1 interface to 100 so that bsm fragments") fhr_node.run("ifconfig f1-i1-eth2 mtu 100") inter_node.run("ifconfig i1-f1-eth0 mtu 100") # Use scapy to send pre-defined packet from senser to receiver result = scapy_send_bsr_raw_packet(tgen, topo, "b1", "f1", "packet2") assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) result = iperfSendIGMPJoin(tgen, "r1", GROUP_ADDRESS, join_interval=1) assert result is True, "Testcase {}:Failed \n Error: {}".format( tc_name, result) # Verify bsr state in FHR step("Verify if b1 chosen as BSR") result = verify_pim_bsr(tgen, topo, "f1", bsr_ip) assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) # Verify if bsrp list is same across f1, i1 and l1 step( "Verify if bsrp list is same across f1, i1 and l1 after fragmentation") bsrp_f1 = fhr_node.vtysh_cmd("show ip pim bsrp-info json", isjson=True) logger.info("show_ip_pim_bsrp_info_json f1: \n %s", bsrp_f1) bsrp_i1 = inter_node.vtysh_cmd("show ip pim bsrp-info json", isjson=True) logger.info("show_ip_pim_bsrp_info_json i1: \n %s", bsrp_i1) bsrp_l1 = lhr_node.vtysh_cmd("show ip pim bsrp-info json", isjson=True) logger.info("show_ip_pim_bsrp_info_json l1: \n %s", bsrp_l1) if bsrp_f1 == bsrp_l1: result = True else: result = "bsrp info in f1 is not same in l1" assert result is True, "Testcase {} :Failed \n Error {}".format( tc_name, result) step("clear BSM database before moving to next case") clear_bsrp_data(tgen, topo) write_test_footer(tc_name)