def run_pfcwd_runtime_traffic_test(api, testbed_config, conn_data, fanout_data, duthost, dut_port, prio_list, prio_dscp_map): """ Test PFC watchdog's impact on runtime traffic Args: api (obj): IXIA session testbed_config (obj): L2/L3 config of a T0 testbed conn_data (dict): the dictionary returned by conn_graph_fact. fanout_data (dict): the dictionary returned by fanout_graph_fact. duthost (Ansible host instance): device under test dut_port (str): DUT port to test prio_list (list): priorities of data flows prio_dscp_map (dict): Priority vs. DSCP map (key = priority). Returns: N/A """ pytest_assert(testbed_config is not None, 'Fail to get L2/3 testbed config') stop_pfcwd(duthost) """ Get the ID of the port to test """ port_id = get_dut_port_id(dut_hostname=duthost.hostname, dut_port=dut_port, conn_data=conn_data, fanout_data=fanout_data) pytest_assert(port_id is not None, 'Fail to get ID for port {}'.format(dut_port)) flows = __gen_traffic(testbed_config=testbed_config, port_id=port_id, data_flow_name=DATA_FLOW_NAME, data_flow_dur_sec=DATA_FLOW_DURATION_SEC, data_pkt_size=DATA_PKT_SIZE, prio_list=prio_list, prio_dscp_map=prio_dscp_map) """ Tgen config = testbed config + flow config """ config = testbed_config config.flows = flows all_flow_names = [flow.name for flow in flows] flow_stats = __run_traffic(api=api, config=config, duthost=duthost, all_flow_names=all_flow_names, pfcwd_start_delay_sec=PFCWD_START_DELAY_SEC, exp_dur_sec=DATA_FLOW_DURATION_SEC) speed_str = config.layer1[0].speed speed_gbps = int(speed_str.split('_')[1]) __verify_results(rows=flow_stats, speed_gbps=speed_gbps, data_flow_dur_sec=DATA_FLOW_DURATION_SEC, data_pkt_size=DATA_PKT_SIZE, tolerance=TOLERANCE_THRESHOLD)
def run_ecn_test(api, testbed_config, conn_data, fanout_data, duthost, dut_port, kmin, kmax, pmax, pkt_size, pkt_cnt, lossless_prio, prio_dscp_map, iters): """ Run a ECN test Args: api (obj): IXIA session testbed_config (obj): L2/L3 config of a T0 testbed conn_data (dict): the dictionary returned by conn_graph_fact. fanout_data (dict): the dictionary returned by fanout_graph_fact. duthost (Ansible host instance): device under test dut_port (str): DUT port to test kmin (int): RED/ECN minimum threshold in bytes kmax (int): RED/ECN maximum threshold in bytes pmax (int): RED/ECN maximum marking probability in percentage pkt_size (int): data packet size in bytes pkt_cnt (int): data packet count lossless_prio (int): lossless priority prio_dscp_map (dict): Priority vs. DSCP map (key = priority). iters (int): # of iterations in the test Returns: Return captured IP packets (list of list) """ pytest_assert(testbed_config is not None, 'Failed to get L2/3 testbed config') stop_pfcwd(duthost) disable_packet_aging(duthost) """ Configure WRED/ECN thresholds """ config_result = config_wred(host_ans=duthost, kmin=kmin, kmax=kmax, pmax=pmax) pytest_assert(config_result is True, 'Failed to configure WRED/ECN at the DUT') """ Enable ECN marking """ enable_ecn(host_ans=duthost, prio=lossless_prio) """ Configure PFC threshold to 2 ^ 3 """ config_result = config_ingress_lossless_buffer_alpha(host_ans=duthost, alpha_log2=3) pytest_assert(config_result is True, 'Failed to configure PFC threshold to 8') """ Get the ID of the port to test """ port_id = get_dut_port_id(dut_hostname=duthost.hostname, dut_port=dut_port, conn_data=conn_data, fanout_data=fanout_data) pytest_assert(port_id is not None, 'Failed to get ID for port {}'.format(dut_port)) """ Generate packet capture config """ capture_config = __config_capture_ip_pkt(testbed_config=testbed_config, port_id=port_id) """ Generate traffic config """ flows = __gen_traffic(testbed_config=testbed_config, port_id=port_id, pause_flow_name=PAUSE_FLOW_NAME, data_flow_name=DATA_FLOW_NAME, prio=lossless_prio, data_pkt_size=pkt_size, data_pkt_cnt=pkt_cnt, data_flow_delay_sec=DATA_START_DELAY_SEC, exp_dur_sec=EXP_DURATION_SEC, prio_dscp_map=prio_dscp_map) """ Tgen config = testbed config + flow config + capture config""" config = testbed_config config.flows = flows config.captures = capture_config """ Run traffic and capture packets """ capture_port_name = capture_config[0].port_names[0] result = [] for i in range(iters): pcap_file_name = '{}-{}.pcap'.format(capture_port_name, i) __run_traffic(api=api, config=config, all_flow_names=[PAUSE_FLOW_NAME, DATA_FLOW_NAME], exp_dur_sec=EXP_DURATION_SEC, capture_port_name=capture_port_name, pcap_file_name=pcap_file_name) result.append(__get_ip_pkts(pcap_file_name)) return result
def run_pfc_test(api, testbed_config, port_config_list, conn_data, fanout_data, duthost, dut_port, global_pause, pause_prio_list, test_prio_list, bg_prio_list, prio_dscp_map, test_traffic_pause): """ Run a PFC test Args: api (obj): IXIA session testbed_config (obj): testbed L1/L2/L3 configuration port_config_list (list): list of port configuration conn_data (dict): the dictionary returned by conn_graph_fact. fanout_data (dict): the dictionary returned by fanout_graph_fact. duthost (Ansible host instance): device under test dut_port (str): DUT port to test global_pause (bool): if pause frame is IEEE 802.3X pause pause_prio_list (list): priorities to pause for pause frames test_prio_list (list): priorities of test flows bg_prio_list (list): priorities of background flows prio_dscp_map (dict): Priority vs. DSCP map (key = priority). test_traffic_pause (bool): if test flows are expected to be paused Returns: N/A """ pytest_assert(testbed_config is not None, 'Fail to get L2/3 testbed config') stop_pfcwd(duthost) disable_packet_aging(duthost) """ Get the ID of the port to test """ port_id = get_dut_port_id(dut_hostname=duthost.hostname, dut_port=dut_port, conn_data=conn_data, fanout_data=fanout_data) pytest_assert(port_id is not None, 'Fail to get ID for port {}'.format(dut_port)) """ Rate percent must be an integer """ test_flow_rate_percent = int(TEST_FLOW_AGGR_RATE_PERCENT / len(test_prio_list)) bg_flow_rate_percent = int(BG_FLOW_AGGR_RATE_PERCENT / len(bg_prio_list)) """ Generate traffic config """ flows = __gen_traffic(testbed_config=testbed_config, port_config_list=port_config_list, port_id=port_id, duthost=duthost, pause_flow_name=PAUSE_FLOW_NAME, global_pause=global_pause, pause_prio_list=pause_prio_list, test_flow_name=TEST_FLOW_NAME, test_flow_prio_list=test_prio_list, test_flow_rate_percent=test_flow_rate_percent, bg_flow_name=BG_FLOW_NAME, bg_flow_prio_list=bg_prio_list, bg_flow_rate_percent=bg_flow_rate_percent, data_flow_dur_sec=DATA_FLOW_DURATION_SEC, data_flow_delay_sec=DATA_FLOW_DELAY_SEC, data_pkt_size=DATA_PKT_SIZE, prio_dscp_map=prio_dscp_map) """ Tgen config = testbed config + flow config """ config = testbed_config config.flows = flows """ import json config_json = json.dumps(config, indent=2, default=lambda x: x.__dict__) print(config_json) """ all_flow_names = [flow.name for flow in flows] data_flow_names = [flow.name for flow in flows if PAUSE_FLOW_NAME not in flow.name] """ Run traffic """ flow_stats = __run_traffic(api=api, config=config, data_flow_names=data_flow_names, all_flow_names=all_flow_names, exp_dur_sec=DATA_FLOW_DURATION_SEC+DATA_FLOW_DELAY_SEC) speed_str = config.layer1[0].speed speed_gbps = int(speed_str.split('_')[1]) """ Verify experiment results """ __verify_results(rows=flow_stats, duthost=duthost, pause_flow_name=PAUSE_FLOW_NAME, test_flow_name=TEST_FLOW_NAME, bg_flow_name=BG_FLOW_NAME, data_flow_dur_sec=DATA_FLOW_DURATION_SEC, test_flow_rate_percent=test_flow_rate_percent, bg_flow_rate_percent=bg_flow_rate_percent, data_pkt_size=DATA_PKT_SIZE, speed_gbps=speed_gbps, test_flow_pause=test_traffic_pause, tolerance=TOLERANCE_THRESHOLD)