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
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