Esempio n. 1
0
def run_test_t0(fanouthosts,
                duthost,
                ptfhost,
                conn_graph_facts,
                leaf_fanouts,
                dscp,
                dscp_bg,
                queue_paused,
                send_pause,
                pfc_pause,
                pause_prio,
                pause_time=65535,
                max_test_intfs_count=128):
    """
    @Summary: Run a series of tests on a T0 topology.
    For the T0 topology, we only test Vlan (server-faced) interfaces.
    @param conn_graph_facts: Testbed topology
    @param leaf_fanouts: Leaf fanout switches
    @param dscp: DSCP value of test data packets
    @param dscp_bg: DSCP value of background data packets
    @param queue_paused: if the queue is expected to be paused
    @param send_pause: send pause frames or not
    @param pfc_pause: send PFC pause frames or not
    @param pause_prio: priority of PFC franme
    @param pause_time: pause time quanta. It is 65535 (maximum pause time quanta) by default.
    @param max_test_intfs_count: maximum count of interfaces to test. By default, it is a very large value to cover all the interfaces.
    return: Return # of iterations and # of passed iterations for each tested interface.
    """

    """ Clear DUT's PFC counters """
    duthost.sonic_pfc_counters(method="clear")

    """ Disable DUT's PFC wd """
    duthost.shell('sudo pfcwd stop')

    """ Generate a T0 testbed configuration """
    dut_intfs, ptf_intfs, ptf_ip_addrs, ptf_mac_addrs = gen_testbed_t0(duthost)
    results = dict()

    for i in range(min(max_test_intfs_count, len(ptf_intfs))):
        src_index = i
        dst_index = (i + 1) % len(ptf_intfs)

        src_intf = ptf_intfs[src_index]
        dst_intf = ptf_intfs[dst_index]

        src_ip = ptf_ip_addrs[src_index]
        dst_ip = ptf_ip_addrs[dst_index]

        src_mac = ptf_mac_addrs[src_index]
        dst_mac = ptf_mac_addrs[dst_index]

        """ DUT interface to pause """
        dut_intf_paused = dut_intfs[dst_index]

        """ Clear MAC table in DUT """
        duthost.shell('sonic-clear fdb all')
        time.sleep(2)

        if send_pause:
            peer_device = conn_graph_facts['device_conn'][dut_intf_paused]['peerdevice']
            peer_port = conn_graph_facts['device_conn'][dut_intf_paused]['peerport']
            peer_port_name = eos_to_linux_intf(peer_port)
            peerdev_ans = fanouthosts[peer_device]

            if not pfc_pause:
                pause_prio = None

            start_pause(host_ans=peerdev_ans,
                        pkt_gen_path=PFC_GEN_REMOTE_PATH,
                        intf=peer_port_name,
                        pkt_count=PFC_PKT_COUNT,
                        pause_duration=pause_time,
                        pause_priority=pause_prio)

            """ Wait for PFC pause frame generation """
            time.sleep(1)

        """ Run PTF test """
        intf_info = '--interface %d@%s --interface %d@%s' % (src_index, src_intf, dst_index, dst_intf)

        test_params = ("mac_src=\'%s\';" % src_mac
                       + "mac_dst=\'%s\';" % dst_mac
                       + "ip_src=\'%s\';" % src_ip
                       + "ip_dst=\'%s\';" % dst_ip
                       + "dscp=%d;" % dscp
                       + "dscp_bg=%d;" % dscp_bg
                       + "pkt_count=%d;" % PTF_PKT_COUNT
                       + "pkt_intvl=%f;" % PTF_PKT_INTVL_SEC
                       + "port_src=%d;" % src_index
                       + "port_dst=%d;" % dst_index
                       + "queue_paused=%s;" % queue_paused
                       + "dut_has_mac=False")

        cmd = 'ptf --test-dir %s %s --test-params="%s"' % (os.path.dirname(PTF_FILE_REMOTE_PATH), intf_info, test_params)
        print cmd
        stdout = ansible_stdout_to_str(ptfhost.shell(cmd)['stdout'])
        words = stdout.split()

        """
        Expected format: "Passes: a / b"
        where a is # of passed iterations and b is total # of iterations
        """
        if len(words) != 4:
            print 'Unknown PTF test result format'
            results[dut_intf_paused] = [0, 0]

        else:
            results[dut_intf_paused] = [int(words[1]), int(words[3])]
        time.sleep(1)

        if send_pause:
            """ Stop PFC / FC storm """
            stop_pause(peerdev_ans, PFC_GEN_FILE)
            time.sleep(1)

    return results
Esempio n. 2
0
def run_test(pfc_test_setup,
             fanouthosts,
             duthost,
             ptfhost,
             conn_graph_facts,
             fanout_info,
             traffic_params,
             pause_prio=None,
             queue_paused=True,
             send_pause=True,
             pfc_pause=True,
             max_test_intfs_count=128):
    """
    Run the test

    Args:
        pfc_test_setup(fixture) : setup fixture
        fanouthosts(AnsibleHost) : fanout instance
        duthost(AnsibleHost) : dut instance
        ptfhost(AnsibleHost) : ptf instance
        conn_graph_facts(fixture) : Testbed topology
        fanout_info(fixture) : fanout graph info
        traffic_params(dict) : dict containing the dscp of test dscp and background dscp
        pause_prio(string) : priority of PFC franme
        queue_paused(bool) : if the queue is expected to be paused
        send_pause(bool) : send pause frames or not
        pfc_pause(bool) : send PFC pause frames or not
        max_test_intfs_count(int) : maximum count of interfaces to test. By default, it is a very large value to cover all the interfaces

    Return:
        Number of iterations and number of passed iterations for each tested interface.
    """

    setup = pfc_test_setup
    dut_intfs = setup['vlan_members']
    ptf_intfs = setup['ptf_intfs']
    ptf_ip_addrs = setup['vlan_ip_addrs']
    ptf_mac_addrs = setup['vlan_mac_addrs']
    """ Clear DUT's PFC counters """
    duthost.sonic_pfc_counters(method="clear")

    results = dict()

    all_peer_dev = set()
    storm_handle = None
    for i in range(min(max_test_intfs_count, len(ptf_intfs))):
        src_index = i
        dst_index = (i + 1) % len(ptf_intfs)

        src_intf = ptf_intfs[src_index]
        dst_intf = ptf_intfs[dst_index]

        src_ip = ptf_ip_addrs[src_index]
        dst_ip = ptf_ip_addrs[dst_index]

        src_mac = ptf_mac_addrs[src_index]
        dst_mac = ptf_mac_addrs[dst_index]
        """ DUT interface to pause """
        dut_intf_paused = dut_intfs[dst_index]
        """ Clear MAC table in DUT """
        duthost.shell('sonic-clear fdb all')
        time.sleep(2)

        if send_pause:
            peer_device = conn_graph_facts['device_conn'][
                duthost.hostname][dut_intf_paused]['peerdevice']
            peer_port = conn_graph_facts['device_conn'][
                duthost.hostname][dut_intf_paused]['peerport']
            peer_info = {
                'peerdevice': peer_device,
                'pfc_fanout_interface': peer_port
            }

            if not pfc_pause:
                pause_prio = None

            if not storm_handle:
                storm_handle = PFCStorm(duthost,
                                        fanout_info,
                                        fanouthosts,
                                        pfc_queue_idx=pause_prio,
                                        pfc_frames_number=PFC_PKT_COUNT,
                                        peer_info=peer_info)

            storm_handle.update_peer_info(peer_info)
            if not all_peer_dev or peer_device not in all_peer_dev:
                storm_handle.deploy_pfc_gen()
            all_peer_dev.add(peer_device)
            storm_handle.start_storm()
            """ Wait for PFC pause frame generation """
            time.sleep(1)
        """ Run PTF test """
        logger.info("Running test: src intf: {} dest intf: {}".format(
            dut_intfs[src_index], dut_intfs[dst_index]))
        intf_info = '--interface %d@%s --interface %d@%s' % (
            src_index, src_intf, dst_index, dst_intf)

        test_params = ("mac_src=\'%s\';" % src_mac +
                       "mac_dst=\'%s\';" % dst_mac +
                       "ip_src=\'%s\';" % src_ip + "ip_dst=\'%s\';" % dst_ip +
                       "dscp=%d;" % traffic_params['dscp'] +
                       "dscp_bg=%d;" % traffic_params['dscp_bg'] +
                       "pkt_count=%d;" % PTF_PKT_COUNT +
                       "pkt_intvl=%f;" % PTF_PKT_INTVL_SEC +
                       "port_src=%d;" % src_index +
                       "port_dst=%d;" % dst_index +
                       "queue_paused=%s;" % queue_paused + "dut_has_mac=False")

        cmd = 'ptf --test-dir %s pfc_pause_test %s --test-params="%s"' % (
            os.path.dirname(PTF_FILE_REMOTE_PATH), intf_info, test_params)
        print cmd
        stdout = ansible_stdout_to_str(ptfhost.shell(cmd)['stdout'])
        words = stdout.split()
        """
        Expected format: "Passes: a / b"
        where a is # of passed iterations and b is total # of iterations
        """
        if len(words) != 4:
            print 'Unknown PTF test result format'
            results[dut_intf_paused] = [0, 0]

        else:
            results[dut_intf_paused] = [int(words[1]), int(words[3])]
        time.sleep(1)

        if send_pause:
            """ Stop PFC / FC storm """
            storm_handle.stop_storm()
            time.sleep(1)

    return results