From 83553f62e44b3085529736c00de60df6a0e25baf Mon Sep 17 00:00:00 2001 From: Dinesh Kumar Sellappan <40899231+selldinesh@users.noreply.github.com> Date: Thu, 19 Sep 2024 22:55:26 -0700 Subject: [PATCH] [Fix] Accomodating the infra change for multidut ECN and PFCWD cases (#14305) Description of PR Summary: Accomodating the infra change for multidut ECN and PFCWD cases Fixes # (issue) #13389 #13769 Approach What is the motivation for this PR? To accomodate the infra change from PR 14127 How did you do it? Added a pytest fixture called get_snappi_ports and get_snappi_ports_for_rdma whcih selects the ports from the information provided in MULTIDUT_PORT_INFO in variables.py co-authorized by: jianquanye@microsoft.com --- .../test_multidut_dequeue_ecn_with_snappi.py | 89 ++-- .../test_multidut_red_accuracy_with_snappi.py | 88 ++-- .../test_multidut_pfcwd_a2a_with_snappi.py | 84 ++-- .../test_multidut_pfcwd_basic_with_snappi.py | 471 ++++++++---------- ..._multidut_pfcwd_burst_storm_with_snappi.py | 86 ++-- .../test_multidut_pfcwd_m2o_with_snappi.py | 83 ++- ...tidut_pfcwd_runtime_traffic_with_snappi.py | 78 +-- tests/snappi_tests/test_multidut_snappi.py | 88 ++-- tests/snappi_tests/variables.py | 8 +- 9 files changed, 512 insertions(+), 563 deletions(-) diff --git a/tests/snappi_tests/multidut/ecn/test_multidut_dequeue_ecn_with_snappi.py b/tests/snappi_tests/multidut/ecn/test_multidut_dequeue_ecn_with_snappi.py index 69e3c50d4e..299134eee2 100644 --- a/tests/snappi_tests/multidut/ecn/test_multidut_dequeue_ecn_with_snappi.py +++ b/tests/snappi_tests/multidut/ecn/test_multidut_dequeue_ecn_with_snappi.py @@ -2,15 +2,14 @@ import random import logging -from tests.common.helpers.assertions import pytest_assert, pytest_require +from tests.common.helpers.assertions import pytest_assert, pytest_require # noqa: F401 from tests.common.fixtures.conn_graph_facts import conn_graph_facts, \ - fanout_graph_facts # noqa: F401 + fanout_graph_facts_multidut # noqa: F401 from tests.common.snappi_tests.snappi_fixtures import snappi_api_serv_ip, snappi_api_serv_port, \ - snappi_api, snappi_dut_base_config, get_tgen_peer_ports, get_multidut_snappi_ports, \ - get_multidut_tgen_peer_port_set, cleanup_config # noqa: F401 + snappi_api, snappi_dut_base_config, get_snappi_ports, get_snappi_ports_for_rdma, cleanup_config # noqa: F401 from tests.common.snappi_tests.qos_fixtures import prio_dscp_map, lossless_prio_list # noqa F401 -from tests.snappi_tests.variables import config_set, line_card_choice +from tests.snappi_tests.variables import MULTIDUT_PORT_INFO, MULTIDUT_TESTBED from tests.snappi_tests.multidut.ecn.files.multidut_helper import run_ecn_test from tests.common.snappi_tests.read_pcap import is_ecn_marked from tests.snappi_tests.files.helper import skip_ecn_tests @@ -20,17 +19,16 @@ pytestmark = [pytest.mark.topology('multidut-tgen')] -@pytest.mark.parametrize('line_card_choice', [line_card_choice]) -@pytest.mark.parametrize('linecard_configuration_set', [config_set]) +@pytest.mark.parametrize("multidut_port_info", MULTIDUT_PORT_INFO[MULTIDUT_TESTBED]) def test_dequeue_ecn(request, snappi_api, # noqa: F811 conn_graph_facts, # noqa: F811 - fanout_graph_facts, # noqa: F811 + fanout_graph_facts_multidut, # noqa: F811 duthosts, - rand_one_dut_lossless_prio, - line_card_choice, - linecard_configuration_set, - get_multidut_snappi_ports, # noqa: F811 + lossless_prio_list, # noqa: F811 + get_snappi_ports, # noqa: F811 + tbinfo, # noqa: F811 + multidut_port_info, # noqa: F811 prio_dscp_map): # noqa: F811 """ Test if the device under test (DUT) performs ECN marking at the egress @@ -39,48 +37,50 @@ def test_dequeue_ecn(request, request (pytest fixture): pytest request object snappi_api (pytest fixture): SNAPPI session conn_graph_facts (pytest fixture): connection graph - fanout_graph_facts (pytest fixture): fanout graph + fanout_graph_facts_multidut (pytest fixture): fanout graph duthosts (pytest fixture): list of DUTs + lossless_prio_list (pytest fixture): list of all the lossless priorities rand_one_dut_lossless_prio (str): name of lossless priority to test, e.g., 's6100-1|3' line_card_choice: Line card choice to be mentioned in the variable.py file linecard_configuration_set : Line card classification, (min 1 or max 2 hostnames and asics to be given) prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority). - + tbinfo (pytest fixture): fixture provides information about testbed + get_snappi_ports (pytest fixture): gets snappi ports and connected DUT port info and returns as a list Returns: N/A """ - if line_card_choice not in linecard_configuration_set.keys(): - pytest_require(False, "Invalid line_card_choice value passed in parameter") - - if (len(linecard_configuration_set[line_card_choice]['hostname']) == 2): - dut_list = random.sample(duthosts.frontend_nodes, 2) - duthost1, duthost2 = dut_list - elif (len(linecard_configuration_set[line_card_choice]['hostname']) == 1): - dut_list = [dut for dut in duthosts.frontend_nodes if - linecard_configuration_set[line_card_choice]['hostname'] == [dut.hostname]] - duthost1, duthost2 = dut_list[0], dut_list[0] - else: - pytest_require(False, "Hostname can't be an empty list") - - snappi_port_list = get_multidut_snappi_ports(line_card_choice=line_card_choice, - line_card_info=linecard_configuration_set[line_card_choice]) - if len(snappi_port_list) < 2: - pytest_require(False, "Need Minimum of 2 ports for the test") - - snappi_ports = get_multidut_tgen_peer_port_set(line_card_choice, snappi_port_list, config_set, 2) - - testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(dut_list, - snappi_ports, - snappi_api) - - _, lossless_prio = rand_one_dut_lossless_prio.split('|') - skip_ecn_tests(duthost1) - skip_ecn_tests(duthost2) + for testbed_subtype, rdma_ports in multidut_port_info.items(): + tx_port_count = 1 + rx_port_count = 1 + snappi_port_list = get_snappi_ports + pytest_assert(MULTIDUT_TESTBED == tbinfo['conf-name'], + "The testbed name from testbed file doesn't match with MULTIDUT_TESTBED in variables.py ") + pytest_assert(len(snappi_port_list) >= tx_port_count + rx_port_count, + "Need Minimum of 2 ports defined in ansible/files/*links.csv file") + + pytest_assert(len(rdma_ports['tx_ports']) >= tx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Tx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + + pytest_assert(len(rdma_ports['rx_ports']) >= rx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Rx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + logger.info('Running test for testbed subtype: {}'.format(testbed_subtype)) + snappi_ports = get_snappi_ports_for_rdma(snappi_port_list, rdma_ports, + tx_port_count, rx_port_count, MULTIDUT_TESTBED) + testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(duthosts, + snappi_ports, + snappi_api) + + lossless_prio = random.sample(lossless_prio_list, 1) + skip_ecn_tests(snappi_ports[0]['duthost']) + skip_ecn_tests(snappi_ports[1]['duthost']) lossless_prio = int(lossless_prio) snappi_extra_params = SnappiTestParams() - snappi_extra_params.multi_dut_params.duthost1 = duthost1 - snappi_extra_params.multi_dut_params.duthost2 = duthost2 + snappi_extra_params.multi_dut_params.multi_dut_ports = snappi_ports snappi_extra_params.packet_capture_type = packet_capture.IP_CAPTURE snappi_extra_params.is_snappi_ingress_port_cap = True @@ -99,7 +99,7 @@ def test_dequeue_ecn(request, testbed_config=testbed_config, port_config_list=port_config_list, conn_data=conn_graph_facts, - fanout_data=fanout_graph_facts, + fanout_data=fanout_graph_facts_multidut, dut_port=snappi_ports[0]['peer_port'], lossless_prio=lossless_prio, prio_dscp_map=prio_dscp_map, @@ -117,3 +117,4 @@ def test_dequeue_ecn(request, # Check if the last packet is not ECN marked pytest_assert(not is_ecn_marked(ip_pkts[-1]), "The last packet should not be marked") + cleanup_config(duthosts, snappi_ports) diff --git a/tests/snappi_tests/multidut/ecn/test_multidut_red_accuracy_with_snappi.py b/tests/snappi_tests/multidut/ecn/test_multidut_red_accuracy_with_snappi.py index 9181870b56..27a8a6906c 100644 --- a/tests/snappi_tests/multidut/ecn/test_multidut_red_accuracy_with_snappi.py +++ b/tests/snappi_tests/multidut/ecn/test_multidut_red_accuracy_with_snappi.py @@ -3,14 +3,13 @@ import random import logging from tabulate import tabulate # noqa F401 -from tests.common.helpers.assertions import pytest_assert, pytest_require -from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts # noqa: F401 +from tests.common.helpers.assertions import pytest_assert, pytest_require # noqa: F401 +from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts_multidut # noqa: F401 from tests.common.snappi_tests.snappi_fixtures import snappi_api_serv_ip, snappi_api_serv_port, \ - snappi_api, snappi_dut_base_config, get_tgen_peer_ports, get_multidut_snappi_ports, \ - get_multidut_tgen_peer_port_set # noqa: F401 + snappi_api, snappi_dut_base_config, get_snappi_ports, get_snappi_ports_for_rdma, cleanup_config # noqa: F401 from tests.common.snappi_tests.qos_fixtures import prio_dscp_map, \ lossless_prio_list # noqa F401 -from tests.snappi_tests.variables import config_set, line_card_choice +from tests.snappi_tests.variables import MULTIDUT_PORT_INFO, MULTIDUT_TESTBED from tests.snappi_tests.files.helper import skip_ecn_tests from tests.common.snappi_tests.read_pcap import is_ecn_marked from tests.snappi_tests.multidut.ecn.files.multidut_helper import run_ecn_test @@ -20,17 +19,16 @@ pytestmark = [pytest.mark.topology('multidut-tgen')] -@pytest.mark.parametrize('line_card_choice', [line_card_choice]) -@pytest.mark.parametrize('linecard_configuration_set', [config_set]) +@pytest.mark.parametrize("multidut_port_info", MULTIDUT_PORT_INFO[MULTIDUT_TESTBED]) def test_red_accuracy(request, snappi_api, # noqa: F811 conn_graph_facts, # noqa: F811 - fanout_graph_facts, # noqa: F811 + fanout_graph_facts_multidut, # noqa: F811 duthosts, - rand_one_dut_lossless_prio, - line_card_choice, - linecard_configuration_set, - get_multidut_snappi_ports, # noqa: F811 + lossless_prio_list, # noqa: F811 + get_snappi_ports, # noqa: F811 + tbinfo, # noqa: F811 + multidut_port_info, # noqa: F811 prio_dscp_map): # noqa: F811 """ Measure RED/ECN marking accuracy of the device under test (DUT). @@ -42,12 +40,11 @@ def test_red_accuracy(request, conn_graph_facts (pytest fixture): connection graph fanout_graph_facts (pytest fixture): fanout graph duthosts (pytest fixture): list of DUTs - rand_one_dut_lossless_prio (str): name of lossless priority to test, e.g., 's6100-1|3' + lossless_prio_list (pytest fixture): list of all the lossless priorities prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority). - line_card_choice: Line card choice to be mentioned in the variable.py file - linecard_configuration_set : Line card classification, (min 1 or max 2 hostnames and asics to be given) prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority). - + tbinfo (pytest fixture): fixture provides information about testbed + get_snappi_ports (pytest fixture): gets snappi ports and connected DUT port info and returns as a list Returns: N/A """ @@ -55,37 +52,35 @@ def test_red_accuracy(request, # if disable_test: # pytest.skip("test_red_accuracy is disabled") - if line_card_choice not in linecard_configuration_set.keys(): - pytest_require(False, "Invalid line_card_choice value passed in parameter") - - if (len(linecard_configuration_set[line_card_choice]['hostname']) == 2): - dut_list = random.sample(duthosts.frontend_nodes, 2) - duthost1, duthost2 = dut_list - elif (len(linecard_configuration_set[line_card_choice]['hostname']) == 1): - dut_list = [dut for dut in duthosts.frontend_nodes if - linecard_configuration_set[line_card_choice]['hostname'] == [dut.hostname]] # noqa: E501 - duthost1, duthost2 = dut_list[0], dut_list[0] - else: - pytest_require(False, "Hostname can't be an empty list") - - snappi_port_list = get_multidut_snappi_ports(line_card_choice=line_card_choice, - line_card_info=linecard_configuration_set[line_card_choice]) - if len(snappi_port_list) < 2: - pytest_require(False, "Need Minimum of 2 ports for the test") - - snappi_ports = get_multidut_tgen_peer_port_set(line_card_choice, snappi_port_list, config_set, 2) - - testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(dut_list, - snappi_ports, - snappi_api) - - _, lossless_prio = rand_one_dut_lossless_prio.split('|') - skip_ecn_tests(duthost1) or skip_ecn_tests(duthost2) - lossless_prio = int(lossless_prio) + for testbed_subtype, rdma_ports in multidut_port_info.items(): + tx_port_count = 1 + rx_port_count = 1 + snappi_port_list = get_snappi_ports + pytest_assert(MULTIDUT_TESTBED == tbinfo['conf-name'], + "The testbed name from testbed file doesn't match with MULTIDUT_TESTBED in variables.py ") + pytest_assert(len(snappi_port_list) >= tx_port_count + rx_port_count, + "Need Minimum of 2 ports defined in ansible/files/*links.csv file") + + pytest_assert(len(rdma_ports['tx_ports']) >= tx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Tx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + + pytest_assert(len(rdma_ports['rx_ports']) >= rx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Rx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + logger.info('Running test for testbed subtype: {}'.format(testbed_subtype)) + snappi_ports = get_snappi_ports_for_rdma(snappi_port_list, rdma_ports, + tx_port_count, rx_port_count, MULTIDUT_TESTBED) + testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(duthosts, + snappi_ports, + snappi_api) + + skip_ecn_tests(snappi_ports[0]['duthost']) or skip_ecn_tests(snappi_ports[1]['duthost']) + lossless_prio = random.sample(lossless_prio_list, 1) snappi_extra_params = SnappiTestParams() - snappi_extra_params.multi_dut_params.duthost1 = duthost1 - snappi_extra_params.multi_dut_params.duthost2 = duthost2 snappi_extra_params.multi_dut_params.multi_dut_ports = snappi_ports snappi_extra_params.packet_capture_type = packet_capture.IP_CAPTURE @@ -107,7 +102,7 @@ def test_red_accuracy(request, testbed_config=testbed_config, port_config_list=port_config_list, conn_data=conn_graph_facts, - fanout_data=fanout_graph_facts, + fanout_data=fanout_graph_facts_multidut, dut_port=snappi_ports[0]['peer_port'], lossless_prio=lossless_prio, prio_dscp_map=prio_dscp_map, @@ -145,3 +140,4 @@ def test_red_accuracy(request, for queue, mark_cnt in list(queue_mark_cnt.items()): output_table.append([queue, float(mark_cnt)/num_iterations]) logger.info(tabulate(output_table, headers=['Queue Length', 'ECN Marking Probability'])) + cleanup_config(duthosts, snappi_ports) diff --git a/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_a2a_with_snappi.py b/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_a2a_with_snappi.py index f968114f9a..bb9237fcbc 100644 --- a/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_a2a_with_snappi.py +++ b/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_a2a_with_snappi.py @@ -1,30 +1,29 @@ import pytest import random -from tests.common.helpers.assertions import pytest_require -from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts # noqa: F401 +import logging +from tests.common.helpers.assertions import pytest_assert # noqa F401 +from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts_multidut # noqa: F401 from tests.common.snappi_tests.snappi_fixtures import snappi_api_serv_ip, snappi_api_serv_port, \ - snappi_api, snappi_dut_base_config, get_tgen_peer_ports, get_multidut_snappi_ports, \ - get_multidut_tgen_peer_port_set, cleanup_config # noqa: F401 + snappi_api, snappi_dut_base_config, get_snappi_ports, get_snappi_ports_for_rdma, cleanup_config # noqa: F401 from tests.common.snappi_tests.qos_fixtures import prio_dscp_map, all_prio_list,\ lossless_prio_list, lossy_prio_list # noqa F401 -from tests.snappi_tests.variables import config_set, line_card_choice +from tests.snappi_tests.variables import MULTIDUT_PORT_INFO, MULTIDUT_TESTBED from tests.snappi_tests.multidut.pfcwd.files.pfcwd_multidut_multi_node_helper import run_pfcwd_multi_node_test from tests.common.snappi_tests.snappi_test_params import SnappiTestParams - +logger = logging.getLogger(__name__) pytestmark = [pytest.mark.topology('multidut-tgen')] @pytest.mark.parametrize("trigger_pfcwd", [False]) -@pytest.mark.parametrize('line_card_choice', [line_card_choice]) -@pytest.mark.parametrize('linecard_configuration_set', [config_set]) +@pytest.mark.parametrize("multidut_port_info", MULTIDUT_PORT_INFO[MULTIDUT_TESTBED]) def test_multidut_pfcwd_all_to_all(snappi_api, # noqa: F811 conn_graph_facts, # noqa: F811 - fanout_graph_facts, # noqa: F811 + fanout_graph_facts_multidut, # noqa: F811 duthosts, - line_card_choice, - rand_one_dut_lossless_prio, - linecard_configuration_set, - get_multidut_snappi_ports, # noqa: F811 + lossless_prio_list, # noqa: F811 + get_snappi_ports, # noqa: F811 + tbinfo, # noqa: F811 + multidut_port_info, # noqa: F811 trigger_pfcwd, prio_dscp_map, # noqa: F811 lossy_prio_list): # noqa: F811 @@ -36,52 +35,51 @@ def test_multidut_pfcwd_all_to_all(snappi_api, # noqa: F811 snappi_api (pytest fixture): SNAPPI session conn_graph_facts (pytest fixture): connection graph fanout_graph_facts (pytest fixture): fanout graph - frontend_duthosts (pytest fixture): list of frontend DUTs. - rand_one_dut_lossless_prio (str): lossless priority to test, e.g., 's6100-1|3' + duthosts (pytest fixture): list of DUTs. + lossless_prio_list (pytest fixture): list of all the lossless priorities lossy_prio_list (pytest fixture): list of lossy priorities prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority) trigger_pfcwd (bool): if PFC watchdog is expected to be triggered - line_card_choice: Line card choice to be mentioned in the variable.py file - linecard_configuration_set : Line card classification, (min 1 or max 2 hostnames and asics to be given) + tbinfo (pytest fixture): fixture provides information about testbed + get_snappi_ports (pytest fixture): gets snappi ports and connected DUT port info and returns as a list Returns: N/A """ - if line_card_choice not in linecard_configuration_set.keys(): - pytest_require(False, "Invalid line_card_choice value passed in parameter") - - if (len(linecard_configuration_set[line_card_choice]['hostname']) == 2): - dut_list = random.sample(duthosts.frontend_nodes, 2) - duthost1, duthost2 = dut_list - elif (len(linecard_configuration_set[line_card_choice]['hostname']) == 1): - dut_list = [dut for dut in duthosts.frontend_nodes if - linecard_configuration_set[line_card_choice]['hostname'] == [dut.hostname]] - duthost1, duthost2 = dut_list[0], dut_list[0] - else: - pytest_require(False, "Hostname can't be an empty list") + for testbed_subtype, rdma_ports in multidut_port_info.items(): + tx_port_count = 2 + rx_port_count = 1 + snappi_port_list = get_snappi_ports + pytest_assert(MULTIDUT_TESTBED == tbinfo['conf-name'], + "The testbed name from testbed file doesn't match with MULTIDUT_TESTBED in variables.py ") + pytest_assert(len(snappi_port_list) >= tx_port_count + rx_port_count, + "Need Minimum of 3 ports defined in ansible/files/*links.csv file") - snappi_port_list = get_multidut_snappi_ports(line_card_choice=line_card_choice, - line_card_info=linecard_configuration_set[line_card_choice]) - if len(snappi_port_list) < 3: - pytest_require(False, "Need Minimum of 3 ports for the test") - snappi_ports = get_multidut_tgen_peer_port_set(line_card_choice, snappi_port_list, config_set, 3) + pytest_assert(len(rdma_ports['tx_ports']) >= tx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Tx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) - testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(dut_list, - snappi_ports, - snappi_api) + pytest_assert(len(rdma_ports['rx_ports']) >= rx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Rx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + logger.info('Running test for testbed subtype: {}'.format(testbed_subtype)) + snappi_ports = get_snappi_ports_for_rdma(snappi_port_list, rdma_ports, + tx_port_count, rx_port_count, MULTIDUT_TESTBED) + testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(duthosts, + snappi_ports, + snappi_api) - _, lossless_prio = rand_one_dut_lossless_prio.split('|') - lossless_prio = int(lossless_prio) + lossless_prio = random.sample(lossless_prio_list, 1) snappi_extra_params = SnappiTestParams() - snappi_extra_params.multi_dut_params.duthost1 = duthost1 - snappi_extra_params.multi_dut_params.duthost2 = duthost2 snappi_extra_params.multi_dut_params.multi_dut_ports = snappi_ports run_pfcwd_multi_node_test(api=snappi_api, testbed_config=testbed_config, port_config_list=port_config_list, conn_data=conn_graph_facts, - fanout_data=fanout_graph_facts, + fanout_data=fanout_graph_facts_multidut, dut_port=snappi_ports[0]['peer_port'], pause_prio_list=[lossless_prio], test_prio_list=[lossless_prio], @@ -91,4 +89,4 @@ def test_multidut_pfcwd_all_to_all(snappi_api, # noqa: F811 pattern="all to all", snappi_extra_params=snappi_extra_params) - cleanup_config(dut_list, snappi_ports) + cleanup_config(duthosts, snappi_ports) diff --git a/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_basic_with_snappi.py b/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_basic_with_snappi.py index bf298f6e76..f039f9b897 100644 --- a/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_basic_with_snappi.py +++ b/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_basic_with_snappi.py @@ -3,35 +3,31 @@ import logging import re from collections import defaultdict -from tests.common.helpers.assertions import pytest_require, pytest_assert -from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts # noqa: F401 +from tests.common.helpers.assertions import pytest_require, pytest_assert # noqa: F401 +from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts_multidut # noqa: F401 from tests.common.snappi_tests.snappi_fixtures import snappi_api_serv_ip, snappi_api_serv_port, \ - snappi_api, snappi_dut_base_config, get_tgen_peer_ports, get_multidut_snappi_ports, \ - get_multidut_tgen_peer_port_set, cleanup_config # noqa: F401 + snappi_api, snappi_dut_base_config, get_snappi_ports, get_snappi_ports_for_rdma, cleanup_config # noqa: F401 from tests.common.snappi_tests.qos_fixtures import prio_dscp_map, lossless_prio_list # noqa F401 -from tests.snappi_tests.variables import config_set, line_card_choice +from tests.snappi_tests.variables import MULTIDUT_PORT_INFO, MULTIDUT_TESTBED from tests.common.reboot import reboot # noqa: F401 from tests.common.utilities import wait_until # noqa: F401 from tests.snappi_tests.multidut.pfcwd.files.pfcwd_multidut_basic_helper import run_pfcwd_basic_test from tests.common.snappi_tests.snappi_test_params import SnappiTestParams -from tests.snappi_tests.files.helper import skip_warm_reboot, skip_pfcwd_test -from tests.common.config_reload import config_reload - +from tests.snappi_tests.files.helper import skip_warm_reboot, skip_pfcwd_test # noqa: F401 logger = logging.getLogger(__name__) pytestmark = [pytest.mark.topology('multidut-tgen')] @pytest.mark.parametrize("trigger_pfcwd", [True, False]) -@pytest.mark.parametrize('line_card_choice', [line_card_choice]) -@pytest.mark.parametrize('linecard_configuration_set', [config_set]) +@pytest.mark.parametrize("multidut_port_info", MULTIDUT_PORT_INFO[MULTIDUT_TESTBED]) def test_pfcwd_basic_single_lossless_prio(snappi_api, # noqa: F811 conn_graph_facts, # noqa: F811 - fanout_graph_facts, # noqa: F811 + fanout_graph_facts_multidut, # noqa: F811 duthosts, - line_card_choice, - linecard_configuration_set, - get_multidut_snappi_ports, # noqa: F811 - enum_dut_lossless_prio, + lossless_prio_list, # noqa: F811 + get_snappi_ports, # noqa: F811 + tbinfo, # noqa: F811 + multidut_port_info, prio_dscp_map, # noqa F811 trigger_pfcwd): """ @@ -40,75 +36,71 @@ def test_pfcwd_basic_single_lossless_prio(snappi_api, # noqa: Args: snappi_api (pytest fixture): SNAPPI session conn_graph_facts (pytest fixture): connection graph - fanout_graph_facts (pytest fixture): fanout graph + fanout_graph_facts_multidut (pytest fixture): fanout graph duthosts (pytest fixture): list of DUTs - enum_dut_lossless_prio (str): name of lossless priority to test, e.g., 's6100-1|3' prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority) trigger_pfcwd (bool): if PFC watchdog is expected to be triggered - line_card_choice: Line card choice to be mentioned in the variable.py file - linecard_configuration_set : Line card classification, (min 1 or max 2 hostnames and asics to be given) - get_multidut_snappi_ports: Populates tgen and connected DUT ports info of T0 testbed and returns as a list Returns: N/A """ - if line_card_choice not in linecard_configuration_set.keys(): - pytest_require(False, "Invalid line_card_choice value passed in parameter") - - if (len(linecard_configuration_set[line_card_choice]['hostname']) == 2): - dut_list = random.sample(duthosts.frontend_nodes, 2) - duthost1, duthost2 = dut_list - elif (len(linecard_configuration_set[line_card_choice]['hostname']) == 1): - dut_list = [dut for dut in duthosts.frontend_nodes if - linecard_configuration_set[line_card_choice]['hostname'] == [dut.hostname]] - duthost1, duthost2 = dut_list[0], dut_list[0] - else: - pytest_require(False, "Hostname can't be an empty list") - - snappi_port_list = get_multidut_snappi_ports(line_card_choice=line_card_choice, - line_card_info=linecard_configuration_set[line_card_choice]) - pytest_assert(len(snappi_port_list) >= 2, "Need Minimum of 2 ports for the test") - snappi_ports = get_multidut_tgen_peer_port_set(line_card_choice, snappi_port_list, config_set, 2) - - testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(dut_list, - snappi_ports, - snappi_api) - skip_pfcwd_test(duthost=duthost1, trigger_pfcwd=trigger_pfcwd) - skip_pfcwd_test(duthost=duthost2, trigger_pfcwd=trigger_pfcwd) - - _, lossless_prio = enum_dut_lossless_prio.split('|') + for testbed_subtype, rdma_ports in multidut_port_info.items(): + tx_port_count = 1 + rx_port_count = 1 + snappi_port_list = get_snappi_ports + pytest_assert(MULTIDUT_TESTBED == tbinfo['conf-name'], + "The testbed name from testbed file doesn't match with MULTIDUT_TESTBED in variables.py ") + pytest_assert(len(snappi_port_list) >= tx_port_count + rx_port_count, + "Need Minimum of 2 ports defined in ansible/files/*links.csv file") + + pytest_assert(len(rdma_ports['tx_ports']) >= tx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Tx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + + pytest_assert(len(rdma_ports['rx_ports']) >= rx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Rx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + logger.info('Running test for testbed subtype: {}'.format(testbed_subtype)) + snappi_ports = get_snappi_ports_for_rdma(snappi_port_list, rdma_ports, + tx_port_count, rx_port_count, MULTIDUT_TESTBED) + testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(duthosts, + snappi_ports, + snappi_api) + skip_pfcwd_test(duthost=snappi_ports[0]['duthost'], trigger_pfcwd=trigger_pfcwd) + skip_pfcwd_test(duthost=snappi_ports[1]['duthost'], trigger_pfcwd=trigger_pfcwd) + + lossless_prio = random.sample(lossless_prio_list, 1) lossless_prio = int(lossless_prio) snappi_extra_params = SnappiTestParams() - snappi_extra_params.multi_dut_params.duthost1 = duthost1 - snappi_extra_params.multi_dut_params.duthost2 = duthost2 snappi_extra_params.multi_dut_params.multi_dut_ports = snappi_ports run_pfcwd_basic_test(api=snappi_api, testbed_config=testbed_config, port_config_list=port_config_list, conn_data=conn_graph_facts, - fanout_data=fanout_graph_facts, + fanout_data=fanout_graph_facts_multidut, dut_port=snappi_ports[0]['peer_port'], prio_list=[lossless_prio], prio_dscp_map=prio_dscp_map, trigger_pfcwd=trigger_pfcwd, snappi_extra_params=snappi_extra_params) - cleanup_config(dut_list, snappi_ports) + cleanup_config(duthosts, snappi_ports) @pytest.mark.parametrize("trigger_pfcwd", [True, False]) -@pytest.mark.parametrize('line_card_choice', [line_card_choice]) -@pytest.mark.parametrize('linecard_configuration_set', [config_set]) +@pytest.mark.parametrize("multidut_port_info", MULTIDUT_PORT_INFO[MULTIDUT_TESTBED]) def test_pfcwd_basic_multi_lossless_prio(snappi_api, # noqa F811 conn_graph_facts, # noqa F811 - fanout_graph_facts, # noqa F811 + fanout_graph_facts_multidut, # noqa F811 duthosts, - line_card_choice, - linecard_configuration_set, - get_multidut_snappi_ports, # noqa F811 - lossless_prio_list, # noqa F811 + lossless_prio_list, # noqa: F811 + get_snappi_ports, # noqa: F811 + tbinfo, # noqa: F811 + multidut_port_info, prio_dscp_map, # noqa F811 trigger_pfcwd): """ @@ -117,74 +109,70 @@ def test_pfcwd_basic_multi_lossless_prio(snappi_api, # noqa F811 Args: snappi_api (pytest fixture): SNAPPI session conn_graph_facts (pytest fixture): connection graph - fanout_graph_facts (pytest fixture): fanout graph + fanout_graph_facts_multidut (pytest fixture): fanout graph duthosts (pytest fixture): list of DUTs lossless_prio_list (pytest fixture): list of all the lossless priorities prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority) trigger_pfcwd (bool): if PFC watchdog is expected to be triggered - line_card_choice: Line card choice to be mentioned in the variable.py file - linecard_configuration_set : Line card classification, (min 1 or max 2 hostnames and asics to be given) - get_multidut_snappi_ports: Populates tgen and connected DUT ports info of T0 testbed and returns as a list Returns: N/A """ - if line_card_choice not in linecard_configuration_set.keys(): - pytest_require(False, "Invalid line_card_choice value passed in parameter") - - if (len(linecard_configuration_set[line_card_choice]['hostname']) == 2): - dut_list = random.sample(duthosts.frontend_nodes, 2) - duthost1, duthost2 = dut_list - elif (len(linecard_configuration_set[line_card_choice]['hostname']) == 1): - dut_list = [dut for dut in duthosts.frontend_nodes if - linecard_configuration_set[line_card_choice]['hostname'] == [dut.hostname]] - duthost1, duthost2 = dut_list[0], dut_list[0] - else: - pytest_require(False, "Hostname can't be an empty list") - - snappi_port_list = get_multidut_snappi_ports(line_card_choice=line_card_choice, - line_card_info=linecard_configuration_set[line_card_choice]) - pytest_assert(len(snappi_port_list) >= 2, "Need Minimum of 2 ports for the test") - - snappi_ports = get_multidut_tgen_peer_port_set(line_card_choice, snappi_port_list, config_set, 2) - - testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(dut_list, - snappi_ports, - snappi_api) + for testbed_subtype, rdma_ports in multidut_port_info.items(): + tx_port_count = 1 + rx_port_count = 1 + snappi_port_list = get_snappi_ports + pytest_assert(MULTIDUT_TESTBED == tbinfo['conf-name'], + "The testbed name from testbed file doesn't match with MULTIDUT_TESTBED in variables.py ") + pytest_assert(len(snappi_port_list) >= tx_port_count + rx_port_count, + "Need Minimum of 2 ports defined in ansible/files/*links.csv file") + + pytest_assert(len(rdma_ports['tx_ports']) >= tx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Tx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + + pytest_assert(len(rdma_ports['rx_ports']) >= rx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Rx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + logger.info('Running test for testbed subtype: {}'.format(testbed_subtype)) + snappi_ports = get_snappi_ports_for_rdma(snappi_port_list, rdma_ports, + tx_port_count, rx_port_count, MULTIDUT_TESTBED) + testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(duthosts, + snappi_ports, + snappi_api) snappi_extra_params = SnappiTestParams() - snappi_extra_params.multi_dut_params.duthost1 = duthost1 - snappi_extra_params.multi_dut_params.duthost2 = duthost2 snappi_extra_params.multi_dut_params.multi_dut_ports = snappi_ports run_pfcwd_basic_test(api=snappi_api, testbed_config=testbed_config, port_config_list=port_config_list, conn_data=conn_graph_facts, - fanout_data=fanout_graph_facts, + fanout_data=fanout_graph_facts_multidut, dut_port=snappi_ports[0]['peer_port'], prio_list=lossless_prio_list, prio_dscp_map=prio_dscp_map, trigger_pfcwd=trigger_pfcwd, snappi_extra_params=snappi_extra_params) - cleanup_config(dut_list, snappi_ports) + cleanup_config(duthosts, snappi_ports) @pytest.mark.disable_loganalyzer @pytest.mark.parametrize('reboot_type', ['warm', 'cold', 'fast']) @pytest.mark.parametrize("trigger_pfcwd", [True, False]) -@pytest.mark.parametrize('line_card_choice', [line_card_choice]) -@pytest.mark.parametrize('linecard_configuration_set', [config_set]) +@pytest.mark.parametrize("multidut_port_info", MULTIDUT_PORT_INFO[MULTIDUT_TESTBED]) def test_pfcwd_basic_single_lossless_prio_reboot(snappi_api, # noqa F811 conn_graph_facts, # noqa F811 - fanout_graph_facts, # noqa F811 + fanout_graph_facts_multidut, # noqa F811 localhost, duthosts, - rand_one_dut_lossless_prio, - line_card_choice, - linecard_configuration_set, - get_multidut_snappi_ports, # noqa F811 + lossless_prio_list, # noqa: F811 + get_snappi_ports, # noqa: F811 + tbinfo, # noqa: F811 + multidut_port_info, prio_dscp_map, # noqa F811 reboot_type, trigger_pfcwd): @@ -194,52 +182,48 @@ def test_pfcwd_basic_single_lossless_prio_reboot(snappi_api, # no Args: snappi_api (pytest fixture): SNAPPI session conn_graph_facts (pytest fixture): connection graph - fanout_graph_facts (pytest fixture): fanout graph + fanout_graph_facts_multidut (pytest fixture): fanout graph localhost (pytest fixture): localhost handle duthosts (pytest fixture): list of DUTs - rand_one_dut_lossless_prio (str): name of lossless priority to test, e.g., 's6100-1|3' prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority) reboot_type (str): reboot type to be issued on the DUT trigger_pfcwd (bool): if PFC watchdog is expected to be triggered - line_card_choice: Line card choice to be mentioned in the variable.py file - linecard_configuration_set : Line card classification, (min 1 or max 2 hostnames and asics to be given) - get_multidut_snappi_ports: Populates tgen and connected DUT ports info of T0 testbed and returns as a list Returns: N/A """ - if line_card_choice not in linecard_configuration_set.keys(): - pytest_require(False, "Invalid line_card_choice value passed in parameter") - - if (len(linecard_configuration_set[line_card_choice]['hostname']) == 2): - dut_list = random.sample(duthosts.frontend_nodes, 2) - duthost1, duthost2 = dut_list - elif (len(linecard_configuration_set[line_card_choice]['hostname']) == 1): - dut_list = [dut for dut in duthosts.frontend_nodes if - linecard_configuration_set[line_card_choice]['hostname'] == [dut.hostname]] - duthost1, duthost2 = dut_list[0], dut_list[0] - else: - pytest_require(False, "Hostname can't be an empty list") - - skip_warm_reboot(duthost=duthost1, reboot_type=reboot_type) - skip_warm_reboot(duthost=duthost2, reboot_type=reboot_type) - snappi_port_list = get_multidut_snappi_ports(line_card_choice=line_card_choice, - line_card_info=linecard_configuration_set[line_card_choice]) - pytest_assert(len(snappi_port_list) >= 2, "Need Minimum of 2 ports for the test") - snappi_ports = get_multidut_tgen_peer_port_set(line_card_choice, snappi_port_list, config_set, 2) - testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(dut_list, - snappi_ports, - snappi_api) - - _, lossless_prio = rand_one_dut_lossless_prio.split('|') + for testbed_subtype, rdma_ports in multidut_port_info.items(): + tx_port_count = 1 + rx_port_count = 1 + snappi_port_list = get_snappi_ports + pytest_assert(MULTIDUT_TESTBED == tbinfo['conf-name'], + "The testbed name from testbed file doesn't match with MULTIDUT_TESTBED in variables.py ") + pytest_assert(len(snappi_port_list) >= tx_port_count + rx_port_count, + "Need Minimum of 2 ports defined in ansible/files/*links.csv file") + + pytest_assert(len(rdma_ports['tx_ports']) >= tx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Tx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + + pytest_assert(len(rdma_ports['rx_ports']) >= rx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Rx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + logger.info('Running test for testbed subtype: {}'.format(testbed_subtype)) + snappi_ports = get_snappi_ports_for_rdma(snappi_port_list, rdma_ports, + tx_port_count, rx_port_count, MULTIDUT_TESTBED) + testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(duthosts, + snappi_ports, + snappi_api) + + lossless_prio = random.sample(lossless_prio_list, 1) lossless_prio = int(lossless_prio) snappi_extra_params = SnappiTestParams() - snappi_extra_params.multi_dut_params.duthost1 = duthost1 - snappi_extra_params.multi_dut_params.duthost2 = duthost2 snappi_extra_params.multi_dut_params.multi_dut_ports = snappi_ports - for duthost in dut_list: + for duthost in [snappi_ports[0]['duthost'], snappi_ports[1]['duthost']]: logger.info("Issuing a {} reboot on the dut {}".format(reboot_type, duthost.hostname)) reboot(duthost, localhost, reboot_type=reboot_type, safe_reboot=True) logger.info("Wait until the system is stable") @@ -250,30 +234,29 @@ def test_pfcwd_basic_single_lossless_prio_reboot(snappi_api, # no testbed_config=testbed_config, port_config_list=port_config_list, conn_data=conn_graph_facts, - fanout_data=fanout_graph_facts, + fanout_data=fanout_graph_facts_multidut, dut_port=snappi_ports[0]['peer_port'], prio_list=[lossless_prio], prio_dscp_map=prio_dscp_map, trigger_pfcwd=trigger_pfcwd, snappi_extra_params=snappi_extra_params) - cleanup_config(dut_list, snappi_ports) + cleanup_config(duthosts, snappi_ports) @pytest.mark.disable_loganalyzer @pytest.mark.parametrize('reboot_type', ['warm', 'cold', 'fast']) @pytest.mark.parametrize("trigger_pfcwd", [True, False]) -@pytest.mark.parametrize('line_card_choice', [line_card_choice]) -@pytest.mark.parametrize('linecard_configuration_set', [config_set]) +@pytest.mark.parametrize("multidut_port_info", MULTIDUT_PORT_INFO[MULTIDUT_TESTBED]) def test_pfcwd_basic_multi_lossless_prio_reboot(snappi_api, # noqa F811 conn_graph_facts, # noqa F811 - fanout_graph_facts, # noqa F811 + fanout_graph_facts_multidut, # noqa F811 localhost, duthosts, - line_card_choice, - linecard_configuration_set, - get_multidut_snappi_ports, # noqa F811 - lossless_prio_list, # noqa F811 + lossless_prio_list, # noqa: F811 + get_snappi_ports, # noqa: F811 + tbinfo, # noqa: F811 + multidut_port_info, prio_dscp_map, # noqa F811 reboot_type, trigger_pfcwd): @@ -283,46 +266,43 @@ def test_pfcwd_basic_multi_lossless_prio_reboot(snappi_api, # no Args: snappi_api (pytest fixture): SNAPPI session conn_graph_facts (pytest fixture): connection graph - fanout_graph_facts (pytest fixture): fanout graph + fanout_graph_facts_multidut (pytest fixture): fanout graph localhost (pytest fixture): localhost handle duthosts (pytest fixture): list of DUTs lossless_prio_list (pytest fixture): list of all the lossless priorities prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority) reboot_type (str): reboot type to be issued on the DUT trigger_pfcwd (bool): if PFC watchdog is expected to be triggered - line_card_choice: Line card choice to be mentioned in the variable.py file - linecard_configuration_set : Line card classification, (min 1 or max 2 hostnames and asics to be given) - get_multidut_snappi_ports: Populates tgen and connected DUT ports info of T0 testbed and returns as a list Returns: N/A """ - if line_card_choice not in linecard_configuration_set.keys(): - pytest_require(False, "Invalid line_card_choice value passed in parameter") - - if (len(linecard_configuration_set[line_card_choice]['hostname']) == 2): - dut_list = random.sample(duthosts.frontend_nodes, 2) - duthost1, duthost2 = dut_list - elif (len(linecard_configuration_set[line_card_choice]['hostname']) == 1): - dut_list = [dut for dut in duthosts.frontend_nodes if - linecard_configuration_set[line_card_choice]['hostname'] == [dut.hostname]] - duthost1, duthost2 = dut_list[0], dut_list[0] - else: - pytest_require(False, "Hostname can't be an empty list") - - skip_warm_reboot(duthost=duthost1, reboot_type=reboot_type) - skip_warm_reboot(duthost=duthost2, reboot_type=reboot_type) - - snappi_port_list = get_multidut_snappi_ports(line_card_choice=line_card_choice, - line_card_info=linecard_configuration_set[line_card_choice]) - pytest_assert(len(snappi_port_list) >= 2, "Need Minimum of 2 ports for the test") - snappi_ports = get_multidut_tgen_peer_port_set(line_card_choice, snappi_port_list, config_set, 2) - - testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(dut_list, - snappi_ports, - snappi_api) - - for duthost in dut_list: + for testbed_subtype, rdma_ports in multidut_port_info.items(): + tx_port_count = 1 + rx_port_count = 1 + snappi_port_list = get_snappi_ports + pytest_assert(MULTIDUT_TESTBED == tbinfo['conf-name'], + "The testbed name from testbed file doesn't match with MULTIDUT_TESTBED in variables.py ") + pytest_assert(len(snappi_port_list) >= tx_port_count + rx_port_count, + "Need Minimum of 2 ports defined in ansible/files/*links.csv file") + + pytest_assert(len(rdma_ports['tx_ports']) >= tx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Tx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + + pytest_assert(len(rdma_ports['rx_ports']) >= rx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Rx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + logger.info('Running test for testbed subtype: {}'.format(testbed_subtype)) + snappi_ports = get_snappi_ports_for_rdma(snappi_port_list, rdma_ports, + tx_port_count, rx_port_count, MULTIDUT_TESTBED) + testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(duthosts, + snappi_ports, + snappi_api) + + for duthost in [snappi_ports[0]['duthost'], snappi_ports[1]['duthost']]: logger.info("Issuing a {} reboot on the dut {}".format(reboot_type, duthost.hostname)) reboot(duthost, localhost, reboot_type=reboot_type, safe_reboot=True) logger.info("Wait until the system is stable") @@ -330,37 +310,34 @@ def test_pfcwd_basic_multi_lossless_prio_reboot(snappi_api, # no "Not all critical services are fully started") snappi_extra_params = SnappiTestParams() - snappi_extra_params.multi_dut_params.duthost1 = duthost1 - snappi_extra_params.multi_dut_params.duthost2 = duthost2 snappi_extra_params.multi_dut_params.multi_dut_ports = snappi_ports run_pfcwd_basic_test(api=snappi_api, testbed_config=testbed_config, port_config_list=port_config_list, conn_data=conn_graph_facts, - fanout_data=fanout_graph_facts, + fanout_data=fanout_graph_facts_multidut, dut_port=snappi_ports[0]['peer_port'], prio_list=lossless_prio_list, prio_dscp_map=prio_dscp_map, trigger_pfcwd=trigger_pfcwd, snappi_extra_params=snappi_extra_params) - cleanup_config(dut_list, snappi_ports) + cleanup_config(duthosts, snappi_ports) @pytest.mark.disable_loganalyzer @pytest.mark.parametrize('restart_service', ['swss']) @pytest.mark.parametrize("trigger_pfcwd", [True, False]) -@pytest.mark.parametrize('line_card_choice', [line_card_choice]) -@pytest.mark.parametrize('linecard_configuration_set', [config_set]) +@pytest.mark.parametrize("multidut_port_info", MULTIDUT_PORT_INFO[MULTIDUT_TESTBED]) def test_pfcwd_basic_single_lossless_prio_service_restart(snappi_api, # noqa F811 conn_graph_facts, # noqa F811 - fanout_graph_facts, # noqa F811 + fanout_graph_facts_multidut, # noqa F811 duthosts, - line_card_choice, - linecard_configuration_set, - get_multidut_snappi_ports, # noqa F811 - rand_one_dut_lossless_prio, + lossless_prio_list, # noqa: F811 + get_snappi_ports, # noqa: F811 + tbinfo, # noqa: F811 + multidut_port_info, prio_dscp_map, # noqa F811 restart_service, trigger_pfcwd): @@ -370,44 +347,43 @@ def test_pfcwd_basic_single_lossless_prio_service_restart(snappi_api, Args: snappi_api (pytest fixture): SNAPPI session conn_graph_facts (pytest fixture): connection graph - fanout_graph_facts (pytest fixture): fanout graph + fanout_graph_facts_multidut (pytest fixture): fanout graph duthosts (pytest fixture): list of DUTs - rand_one_dut_lossless_prio (str): name of lossless priority to test, e.g., 's6100-1|3' prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority) restart_service (str): service to restart on the DUT. Only 'swss' affects pfcwd currently trigger_pfcwd (bool): if PFC watchdog is expected to be triggered - line_card_choice: Line card choice to be mentioned in the variable.py file - linecard_configuration_set : Line card classification, (min 1 or max 2 hostnames and asics to be given) - get_multidut_snappi_ports: Populates tgen and connected DUT ports info of T0 testbed and returns as a list Returns: N/A """ - if line_card_choice not in linecard_configuration_set.keys(): - pytest_require(False, "Invalid line_card_choice value passed in parameter") - - if (len(linecard_configuration_set[line_card_choice]['hostname']) == 2): - dut_list = random.sample(duthosts.frontend_nodes, 2) - duthost1, duthost2 = dut_list - elif (len(linecard_configuration_set[line_card_choice]['hostname']) == 1): - dut_list = [dut for dut in duthosts.frontend_nodes if - linecard_configuration_set[line_card_choice]['hostname'] == [dut.hostname]] - duthost1, duthost2 = dut_list[0], dut_list[0] - else: - pytest_require(False, "Hostname can't be an empty list") - - snappi_port_list = get_multidut_snappi_ports(line_card_choice=line_card_choice, - line_card_info=linecard_configuration_set[line_card_choice]) - pytest_assert(len(snappi_port_list) >= 2, "Need Minimum of 2 ports for the test") - snappi_ports = get_multidut_tgen_peer_port_set(line_card_choice, snappi_port_list, config_set, 2) - - testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(dut_list, - snappi_ports, - snappi_api) - _, lossless_prio = rand_one_dut_lossless_prio.split('|') + for testbed_subtype, rdma_ports in multidut_port_info.items(): + tx_port_count = 1 + rx_port_count = 1 + snappi_port_list = get_snappi_ports + pytest_assert(MULTIDUT_TESTBED == tbinfo['conf-name'], + "The testbed name from testbed file doesn't match with MULTIDUT_TESTBED in variables.py ") + pytest_assert(len(snappi_port_list) >= tx_port_count + rx_port_count, + "Need Minimum of 2 ports defined in ansible/files/*links.csv file") + + pytest_assert(len(rdma_ports['tx_ports']) >= tx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Tx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + + pytest_assert(len(rdma_ports['rx_ports']) >= rx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Rx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + logger.info('Running test for testbed subtype: {}'.format(testbed_subtype)) + snappi_ports = get_snappi_ports_for_rdma(snappi_port_list, rdma_ports, + tx_port_count, rx_port_count, MULTIDUT_TESTBED) + testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(duthosts, + snappi_ports, + snappi_api) + lossless_prio = random.sample(lossless_prio_list, 1) lossless_prio = int(lossless_prio) - if (duthost1.is_multi_asic): + if (snappi_ports[0]['duthost'].is_multi_asic): ports_dict = defaultdict(list) for port in snappi_ports: ports_dict[port['peer_device']].append(port['asic_value']) @@ -415,9 +391,8 @@ def test_pfcwd_basic_single_lossless_prio_service_restart(snappi_api, for k in ports_dict.keys(): ports_dict[k] = list(set(ports_dict[k])) - logger.info('Line Card Choice:{}'.format(line_card_choice)) logger.info('Port dictionary:{}'.format(ports_dict)) - for duthost in dut_list: + for duthost in [snappi_ports[0]['duthost'], snappi_ports[1]['duthost']]: asic_list = ports_dict[duthost.hostname] for asic in asic_list: asic_id = re.match(r"(asic)(\d+)", asic).group(2) @@ -429,7 +404,7 @@ def test_pfcwd_basic_single_lossless_prio_service_restart(snappi_api, pytest_assert(wait_until(300, 20, 0, duthost.critical_services_fully_started), "Not all critical services are fully started") else: - for duthost in dut_list: + for duthost in [snappi_ports[0]['duthost'], snappi_ports[1]['duthost']]: logger.info("Issuing a restart of service {} on the dut {}".format(restart_service, duthost.hostname)) duthost.command("systemctl reset-failed {}".format(restart_service)) duthost.command("systemctl restart {}".format(restart_service)) @@ -438,37 +413,34 @@ def test_pfcwd_basic_single_lossless_prio_service_restart(snappi_api, "Not all critical services are fully started") snappi_extra_params = SnappiTestParams() - snappi_extra_params.multi_dut_params.duthost1 = duthost1 - snappi_extra_params.multi_dut_params.duthost2 = duthost2 snappi_extra_params.multi_dut_params.multi_dut_ports = snappi_ports run_pfcwd_basic_test(api=snappi_api, testbed_config=testbed_config, port_config_list=port_config_list, conn_data=conn_graph_facts, - fanout_data=fanout_graph_facts, + fanout_data=fanout_graph_facts_multidut, dut_port=snappi_ports[0]['peer_port'], prio_list=[lossless_prio], prio_dscp_map=prio_dscp_map, trigger_pfcwd=trigger_pfcwd, snappi_extra_params=snappi_extra_params) - config_reload(sonic_host=duthost, config_source='config_db', safe_reload=True) + cleanup_config(duthosts, snappi_ports) @pytest.mark.disable_loganalyzer @pytest.mark.parametrize('restart_service', ['swss']) @pytest.mark.parametrize("trigger_pfcwd", [True, False]) -@pytest.mark.parametrize('line_card_choice', [line_card_choice]) -@pytest.mark.parametrize('linecard_configuration_set', [config_set]) +@pytest.mark.parametrize("multidut_port_info", MULTIDUT_PORT_INFO[MULTIDUT_TESTBED]) def test_pfcwd_basic_multi_lossless_prio_restart_service(snappi_api, # noqa F811 conn_graph_facts, # noqa F811 - fanout_graph_facts, # noqa F811 + fanout_graph_facts_multidut, # noqa F811 duthosts, - line_card_choice, - linecard_configuration_set, - get_multidut_snappi_ports, # noqa F811 - lossless_prio_list, # noqa F811 + lossless_prio_list, # noqa: F811 + get_snappi_ports, # noqa: F811 + tbinfo, # noqa: F811 + multidut_port_info, prio_dscp_map, # noqa F811 restart_service, trigger_pfcwd): @@ -478,42 +450,42 @@ def test_pfcwd_basic_multi_lossless_prio_restart_service(snappi_api, Args: snappi_api (pytest fixture): SNAPPI session conn_graph_facts (pytest fixture): connection graph - fanout_graph_facts (pytest fixture): fanout graph + fanout_graph_facts_multidut (pytest fixture): fanout graph duthosts (pytest fixture): list of DUTs lossless_prio_list (pytest fixture): list of all the lossless priorities prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority) restart_service (str): service to restart on the DUT. Only 'swss' affects pfcwd currently trigger_pfcwd (bool): if PFC watchdog is expected to be triggered - line_card_choice: Line card choice to be mentioned in the variable.py file - linecard_configuration_set : Line card classification, (min 1 or max 2 hostnames and asics to be given) - get_multidut_snappi_ports: Populates tgen and connected DUT ports info of T0 testbed and returns as a list Returns: N/A """ - if line_card_choice not in linecard_configuration_set.keys(): - pytest_require(False, "Invalid line_card_choice value passed in parameter") - - if (len(linecard_configuration_set[line_card_choice]['hostname']) == 2): - dut_list = random.sample(duthosts.frontend_nodes, 2) - duthost1, duthost2 = dut_list - elif (len(linecard_configuration_set[line_card_choice]['hostname']) == 1): - dut_list = [dut for dut in duthosts.frontend_nodes if - linecard_configuration_set[line_card_choice]['hostname'] == [dut.hostname]] - duthost1, duthost2 = dut_list[0], dut_list[0] - else: - pytest_require(False, "Hostname can't be an empty list") - - snappi_port_list = get_multidut_snappi_ports(line_card_choice=line_card_choice, - line_card_info=linecard_configuration_set[line_card_choice]) - pytest_assert(len(snappi_port_list) >= 2, "Need Minimum of 2 ports for the test") - snappi_ports = get_multidut_tgen_peer_port_set(line_card_choice, snappi_port_list, config_set, 2) - - testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(dut_list, - snappi_ports, - snappi_api) - - if (duthost1.is_multi_asic): + for testbed_subtype, rdma_ports in multidut_port_info.items(): + tx_port_count = 1 + rx_port_count = 1 + snappi_port_list = get_snappi_ports + pytest_assert(MULTIDUT_TESTBED == tbinfo['conf-name'], + "The testbed name from testbed file doesn't match with MULTIDUT_TESTBED in variables.py ") + pytest_assert(len(snappi_port_list) >= tx_port_count + rx_port_count, + "Need Minimum of 2 ports defined in ansible/files/*links.csv file") + + pytest_assert(len(rdma_ports['tx_ports']) >= tx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Tx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + + pytest_assert(len(rdma_ports['rx_ports']) >= rx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Rx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + logger.info('Running test for testbed subtype: {}'.format(testbed_subtype)) + snappi_ports = get_snappi_ports_for_rdma(snappi_port_list, rdma_ports, + tx_port_count, rx_port_count, MULTIDUT_TESTBED) + testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(duthosts, + snappi_ports, + snappi_api) + + if (snappi_ports[0]['duthost'].is_multi_asic): ports_dict = defaultdict(list) for port in snappi_ports: ports_dict[port['peer_device']].append(port['asic_value']) @@ -521,9 +493,8 @@ def test_pfcwd_basic_multi_lossless_prio_restart_service(snappi_api, for k in ports_dict.keys(): ports_dict[k] = list(set(ports_dict[k])) - logger.info('Line Card Choice:{}'.format(line_card_choice)) logger.info('Port dictionary:{}'.format(ports_dict)) - for duthost in dut_list: + for duthost in [snappi_ports[0]['duthost'], snappi_ports[1]['duthost']]: asic_list = ports_dict[duthost.hostname] for asic in asic_list: asic_id = re.match(r"(asic)(\d+)", asic).group(2) @@ -535,7 +506,7 @@ def test_pfcwd_basic_multi_lossless_prio_restart_service(snappi_api, pytest_assert(wait_until(300, 20, 0, duthost.critical_services_fully_started), "Not all critical services are fully started") else: - for duthost in dut_list: + for duthost in [snappi_ports[0]['duthost'], snappi_ports[1]['duthost']]: logger.info("Issuing a restart of service {} on the dut {}".format(restart_service, duthost.hostname)) duthost.command("systemctl reset-failed {}".format(restart_service)) duthost.command("systemctl restart {}".format(restart_service)) @@ -544,18 +515,16 @@ def test_pfcwd_basic_multi_lossless_prio_restart_service(snappi_api, "Not all critical services are fully started") snappi_extra_params = SnappiTestParams() - snappi_extra_params.multi_dut_params.duthost1 = duthost1 - snappi_extra_params.multi_dut_params.duthost2 = duthost2 snappi_extra_params.multi_dut_params.multi_dut_ports = snappi_ports run_pfcwd_basic_test(api=snappi_api, testbed_config=testbed_config, port_config_list=port_config_list, conn_data=conn_graph_facts, - fanout_data=fanout_graph_facts, + fanout_data=fanout_graph_facts_multidut, dut_port=snappi_ports[0]['peer_port'], prio_list=lossless_prio_list, prio_dscp_map=prio_dscp_map, trigger_pfcwd=trigger_pfcwd, snappi_extra_params=snappi_extra_params) - config_reload(sonic_host=duthost, config_source='config_db', safe_reload=True) + cleanup_config(duthosts, snappi_ports) diff --git a/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_burst_storm_with_snappi.py b/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_burst_storm_with_snappi.py index d283b61247..612db2059c 100644 --- a/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_burst_storm_with_snappi.py +++ b/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_burst_storm_with_snappi.py @@ -1,31 +1,30 @@ import pytest import random -from tests.common.helpers.assertions import pytest_require -from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts # noqa: F401 +import logging +from tests.common.helpers.assertions import pytest_require, pytest_assert # noqa: F401 +from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts_multidut # noqa: F401 from tests.common.snappi_tests.snappi_fixtures import snappi_api_serv_ip, snappi_api_serv_port, \ - snappi_api, snappi_dut_base_config, get_tgen_peer_ports, get_multidut_snappi_ports, \ - get_multidut_tgen_peer_port_set, cleanup_config # noqa: F401 + snappi_api, snappi_dut_base_config, get_snappi_ports, get_snappi_ports_for_rdma, cleanup_config # noqa: F401 from tests.common.snappi_tests.qos_fixtures import prio_dscp_map, all_prio_list,\ lossless_prio_list, lossy_prio_list # noqa F401 -from tests.snappi_tests.variables import config_set, line_card_choice +from tests.snappi_tests.variables import MULTIDUT_PORT_INFO, MULTIDUT_TESTBED from tests.snappi_tests.multidut.pfcwd.files.pfcwd_multidut_burst_storm_helper import run_pfcwd_burst_storm_test from tests.common.snappi_tests.snappi_test_params import SnappiTestParams - +logger = logging.getLogger(__name__) pytestmark = [pytest.mark.topology('multidut-tgen')] -@pytest.mark.parametrize('line_card_choice', [line_card_choice]) -@pytest.mark.parametrize('linecard_configuration_set', [config_set]) +@pytest.mark.parametrize("multidut_port_info", MULTIDUT_PORT_INFO[MULTIDUT_TESTBED]) def test_pfcwd_burst_storm_single_lossless_prio(snappi_api, # noqa: F811 conn_graph_facts, # noqa: F811 - fanout_graph_facts, # noqa: F811 + fanout_graph_facts_multidut, # noqa: F811 duthosts, - rand_one_dut_lossless_prio, - line_card_choice, - linecard_configuration_set, - get_multidut_snappi_ports, # noqa: F811 + lossless_prio_list, # noqa: F811 + get_snappi_ports, # noqa: F811 + tbinfo, # noqa: F811 + multidut_port_info, prio_dscp_map, # noqa: F811 - lossy_prio_list): # noqa: F811 + ): """ Test PFC watchdog under bursty PFC storms on a single lossless priority @@ -33,57 +32,54 @@ def test_pfcwd_burst_storm_single_lossless_prio(snappi_api, # noqa: Args: snappi_api (pytest fixture): SNAPPI session conn_graph_facts (pytest fixture): connection graph - fanout_graph_facts (pytest fixture): fanout graph + fanout_graph_facts_multidut (pytest fixture): fanout graph duthosts (pytest fixture): list of DUTs rand_one_dut_lossless_prio (str): name of lossless priority to test, e.g., 's6100-1|3' prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority) lossy_prio_list (pytest fixture): list of lossy priorities - line_card_choice: Line card choice to be mentioned in the variable.py file - linecard_configuration_set : Line card classification, (min 1 or max 2 hostnames and asics to be given) - get_multidut_snappi_ports: Populates tgen and connected DUT ports info of T0 testbed and returns as a list + tbinfo (pytest fixture): fixture provides information about testbed + get_snappi_ports (pytest fixture): gets snappi ports and connected DUT port info and returns as a list Returns: N/A """ - if line_card_choice not in linecard_configuration_set.keys(): - pytest_require(False, "Invalid line_card_choice value passed in parameter") - - if (len(linecard_configuration_set[line_card_choice]['hostname']) == 2): - dut_list = random.sample(duthosts.frontend_nodes, 2) - duthost1, duthost2 = dut_list - elif (len(linecard_configuration_set[line_card_choice]['hostname']) == 1): - dut_list = [dut for dut in duthosts.frontend_nodes if - linecard_configuration_set[line_card_choice]['hostname'] == [dut.hostname]] - duthost1, duthost2 = dut_list[0], dut_list[0] - else: - pytest_require(False, "Hostname can't be an empty list") - - snappi_port_list = get_multidut_snappi_ports(line_card_choice=line_card_choice, - line_card_info=linecard_configuration_set[line_card_choice]) - if len(snappi_port_list) < 2: - pytest_require(False, "Need Minimum of 2 ports for the test") + for testbed_subtype, rdma_ports in multidut_port_info.items(): + tx_port_count = 1 + rx_port_count = 1 + snappi_port_list = get_snappi_ports + pytest_assert(MULTIDUT_TESTBED == tbinfo['conf-name'], + "The testbed name from testbed file doesn't match with MULTIDUT_TESTBED in variables.py ") + pytest_assert(len(snappi_port_list) >= tx_port_count + rx_port_count, + "Need Minimum of 2 ports defined in ansible/files/*links.csv file") - snappi_ports = get_multidut_tgen_peer_port_set(line_card_choice, snappi_port_list, config_set, 2) + pytest_assert(len(rdma_ports['tx_ports']) >= tx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Tx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) - testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(dut_list, - snappi_ports, - snappi_api) + pytest_assert(len(rdma_ports['rx_ports']) >= rx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Rx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + logger.info('Running test for testbed subtype: {}'.format(testbed_subtype)) + snappi_ports = get_snappi_ports_for_rdma(snappi_port_list, rdma_ports, + tx_port_count, rx_port_count, MULTIDUT_TESTBED) + testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(duthosts, + snappi_ports, + snappi_api) - _, lossless_prio = rand_one_dut_lossless_prio.split('|') - lossless_prio = int(lossless_prio) + lossless_prio = random.sample(lossless_prio_list, 1) snappi_extra_params = SnappiTestParams() - snappi_extra_params.multi_dut_params.duthost1 = duthost1 - snappi_extra_params.multi_dut_params.duthost2 = duthost2 snappi_extra_params.multi_dut_params.multi_dut_ports = snappi_ports run_pfcwd_burst_storm_test(api=snappi_api, testbed_config=testbed_config, port_config_list=port_config_list, conn_data=conn_graph_facts, - fanout_data=fanout_graph_facts, + fanout_data=fanout_graph_facts_multidut, dut_port=snappi_ports[0]['peer_port'], prio_list=[lossless_prio], prio_dscp_map=prio_dscp_map, snappi_extra_params=snappi_extra_params) - cleanup_config(dut_list, snappi_ports) + cleanup_config(duthosts, snappi_ports) diff --git a/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_m2o_with_snappi.py b/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_m2o_with_snappi.py index 66f60dab99..a6bbbf4446 100644 --- a/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_m2o_with_snappi.py +++ b/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_m2o_with_snappi.py @@ -1,30 +1,29 @@ import pytest import random -from tests.common.helpers.assertions import pytest_require -from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts # noqa: F401 +import logging +from tests.common.helpers.assertions import pytest_require, pytest_assert # noqa: F401 +from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts_multidut # noqa: F401 from tests.common.snappi_tests.snappi_fixtures import snappi_api_serv_ip, snappi_api_serv_port, \ - snappi_api, snappi_dut_base_config, get_tgen_peer_ports, get_multidut_snappi_ports, \ - get_multidut_tgen_peer_port_set, cleanup_config # noqa: F401 + snappi_api, snappi_dut_base_config, get_snappi_ports, get_snappi_ports_for_rdma, cleanup_config # noqa: F401 from tests.common.snappi_tests.qos_fixtures import prio_dscp_map, all_prio_list,\ lossless_prio_list, lossy_prio_list # noqa F401 -from tests.snappi_tests.variables import config_set, line_card_choice +from tests.snappi_tests.variables import MULTIDUT_PORT_INFO, MULTIDUT_TESTBED from tests.snappi_tests.multidut.pfcwd.files.pfcwd_multidut_multi_node_helper import run_pfcwd_multi_node_test from tests.common.snappi_tests.snappi_test_params import SnappiTestParams - +logger = logging.getLogger(__name__) pytestmark = [pytest.mark.topology('multidut-tgen')] @pytest.mark.parametrize("trigger_pfcwd", [True]) -@pytest.mark.parametrize('line_card_choice', [line_card_choice]) -@pytest.mark.parametrize('linecard_configuration_set', [config_set]) +@pytest.mark.parametrize("multidut_port_info", MULTIDUT_PORT_INFO[MULTIDUT_TESTBED]) def test_pfcwd_many_to_one(snappi_api, # noqa: F811 conn_graph_facts, # noqa: F811 - fanout_graph_facts, # noqa: F811 + fanout_graph_facts_multidut, # noqa: F811 duthosts, - rand_one_dut_lossless_prio, - line_card_choice, - linecard_configuration_set, - get_multidut_snappi_ports, # noqa: F811 + lossless_prio_list, # noqa: F811 + get_snappi_ports, # noqa: F811 + tbinfo, # noqa: F811 + multidut_port_info, trigger_pfcwd, prio_dscp_map, # noqa: F811 lossy_prio_list,): # noqa: F811 @@ -35,55 +34,53 @@ def test_pfcwd_many_to_one(snappi_api, # noqa: F811 Args: snappi_api (pytest fixture): SNAPPI session conn_graph_facts (pytest fixture): connection graph - fanout_graph_facts (pytest fixture): fanout graph + fanout_graph_facts_multidut (pytest fixture): fanout graph duthosts (pytest fixture): list of DUTs rand_one_dut_lossless_prio (str): lossless priority to test, e.g., 's6100-1|3' lossy_prio_list (pytest fixture): list of lossy priorities prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority) trigger_pfcwd (bool): if PFC watchdog is expected to be triggered - line_card_choice: Line card choice to be mentioned in the variable.py file - linecard_configuration_set : Line card classification, (min 1 or max 2 hostnames and asics to be given) + tbinfo (pytest fixture): fixture provides information about testbed + get_snappi_ports (pytest fixture): gets snappi ports and connected DUT port info and returns as a list Returns: N/A """ - if line_card_choice not in linecard_configuration_set.keys(): - pytest_require(False, "Invalid line_card_choice value passed in parameter") - - if (len(linecard_configuration_set[line_card_choice]['hostname']) == 2): - dut_list = random.sample(duthosts.frontend_nodes, 2) - duthost1, duthost2 = dut_list - elif (len(linecard_configuration_set[line_card_choice]['hostname']) == 1): - dut_list = [dut for dut in duthosts.frontend_nodes if - linecard_configuration_set[line_card_choice]['hostname'] == [dut.hostname]] - duthost1, duthost2 = dut_list[0], dut_list[0] - else: - pytest_require(False, "Hostname can't be an empty list") - - snappi_port_list = get_multidut_snappi_ports(line_card_choice=line_card_choice, - line_card_info=linecard_configuration_set[line_card_choice]) - if len(snappi_port_list) < 3: - pytest_require(False, "Need Minimum of 3 ports for the test") + for testbed_subtype, rdma_ports in multidut_port_info.items(): + tx_port_count = 2 + rx_port_count = 1 + snappi_port_list = get_snappi_ports + pytest_assert(MULTIDUT_TESTBED == tbinfo['conf-name'], + "The testbed name from testbed file doesn't match with MULTIDUT_TESTBED in variables.py ") + pytest_assert(len(snappi_port_list) >= tx_port_count + rx_port_count, + "Need Minimum of 3 ports defined in ansible/files/*links.csv file") - snappi_ports = get_multidut_tgen_peer_port_set(line_card_choice, snappi_port_list, config_set, 3) + pytest_assert(len(rdma_ports['tx_ports']) >= tx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Tx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) - testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(dut_list, - snappi_ports, - snappi_api) + pytest_assert(len(rdma_ports['rx_ports']) >= rx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Rx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + logger.info('Running test for testbed subtype: {}'.format(testbed_subtype)) + snappi_ports = get_snappi_ports_for_rdma(snappi_port_list, rdma_ports, + tx_port_count, rx_port_count, MULTIDUT_TESTBED) + testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(duthosts, + snappi_ports, + snappi_api) - _, lossless_prio = rand_one_dut_lossless_prio.split('|') - lossless_prio = int(lossless_prio) + lossless_prio = random.sample(lossless_prio_list, 1) snappi_extra_params = SnappiTestParams() - snappi_extra_params.multi_dut_params.duthost1 = duthost1 - snappi_extra_params.multi_dut_params.duthost2 = duthost2 snappi_extra_params.multi_dut_params.multi_dut_ports = snappi_ports run_pfcwd_multi_node_test(api=snappi_api, testbed_config=testbed_config, port_config_list=port_config_list, conn_data=conn_graph_facts, - fanout_data=fanout_graph_facts, + fanout_data=fanout_graph_facts_multidut, dut_port=snappi_ports[0]['peer_port'], pause_prio_list=[lossless_prio], test_prio_list=[lossless_prio], @@ -93,4 +90,4 @@ def test_pfcwd_many_to_one(snappi_api, # noqa: F811 pattern="many to one", snappi_extra_params=snappi_extra_params) - cleanup_config(dut_list, snappi_ports) + cleanup_config(duthosts, snappi_ports) diff --git a/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_runtime_traffic_with_snappi.py b/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_runtime_traffic_with_snappi.py index 6ec6297d1b..fbe603b109 100644 --- a/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_runtime_traffic_with_snappi.py +++ b/tests/snappi_tests/multidut/pfcwd/test_multidut_pfcwd_runtime_traffic_with_snappi.py @@ -1,28 +1,28 @@ import pytest -import random +import logging from tests.common.helpers.assertions import pytest_require, pytest_assert # noqa: F401 -from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts # noqa: F401 +from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts_multidut # noqa: F401 from tests.common.snappi_tests.snappi_fixtures import snappi_api_serv_ip, snappi_api_serv_port,\ - snappi_api, snappi_dut_base_config, get_tgen_peer_ports, get_multidut_snappi_ports,\ - get_multidut_tgen_peer_port_set, cleanup_config # noqa: F401 + snappi_api, snappi_dut_base_config, get_snappi_ports, get_snappi_ports_for_rdma, cleanup_config # noqa: F401 from tests.common.snappi_tests.qos_fixtures import prio_dscp_map # noqa: F401 -from tests.snappi_tests.variables import config_set, line_card_choice -from tests.snappi_tests.multidut.pfcwd.files.pfcwd_multidut_runtime_traffic_helper import run_pfcwd_runtime_traffic_test +from tests.snappi_tests.variables import MULTIDUT_PORT_INFO, MULTIDUT_TESTBED +from tests.snappi_tests.multidut.pfcwd.files.\ + pfcwd_multidut_runtime_traffic_helper import run_pfcwd_runtime_traffic_test from tests.common.snappi_tests.snappi_test_params import SnappiTestParams +logger = logging.getLogger(__name__) pytestmark = [pytest.mark.topology('multidut-tgen')] -@pytest.mark.parametrize('line_card_choice', [line_card_choice]) -@pytest.mark.parametrize('linecard_configuration_set', [config_set]) +@pytest.mark.parametrize("multidut_port_info", MULTIDUT_PORT_INFO[MULTIDUT_TESTBED]) def test_pfcwd_runtime_traffic(snappi_api, # noqa: F811 conn_graph_facts, # noqa: F811 - fanout_graph_facts, # noqa: F811 + fanout_graph_facts_multidut, # noqa: F811 duthosts, prio_dscp_map, # noqa: F811 - line_card_choice, - linecard_configuration_set, - get_multidut_snappi_ports # noqa: F811 + get_snappi_ports, # noqa: F811 + tbinfo, # noqa: F811 + multidut_port_info, # noqa: F811 ): """ Test PFC watchdog's impact on runtime traffic @@ -30,45 +30,45 @@ def test_pfcwd_runtime_traffic(snappi_api, # noqa: F811 Args: snappi_api (pytest fixture): SNAPPI session conn_graph_facts (pytest fixture): connection graph - fanout_graph_facts (pytest fixture): fanout graph + fanout_graph_facts_multidut (pytest fixture): fanout graph duthosts (pytest fixture): list of DUTs prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority) - line_card_choice: Line card choice to be mentioned in the variable.py file - linecard_configuration_set : Line card classification, (min 1 or max 2 hostnames and asics to be given) - get_multidut_snappi_ports: Populates tgen and connected DUT ports info of T0 testbed and returns as a list + tbinfo (pytest fixture): fixture provides information about testbed + get_snappi_ports (pytest fixture): gets snappi ports and connected DUT port info and returns as a list Returns: N/A """ - pytest_assert(line_card_choice in linecard_configuration_set.keys(), "Invalid line_card_choice in parameter") + for testbed_subtype, rdma_ports in multidut_port_info.items(): + tx_port_count = 1 + rx_port_count = 1 + snappi_port_list = get_snappi_ports + pytest_assert(MULTIDUT_TESTBED == tbinfo['conf-name'], + "The testbed name from testbed file doesn't match with MULTIDUT_TESTBED in variables.py ") + pytest_assert(len(snappi_port_list) >= tx_port_count + rx_port_count, + "Need Minimum of 2 ports defined in ansible/files/*links.csv file") - if (len(linecard_configuration_set[line_card_choice]['hostname']) == 2): - dut_list = random.sample(duthosts.frontend_nodes, 2) - duthost1, duthost2 = dut_list - elif (len(linecard_configuration_set[line_card_choice]['hostname']) == 1): - dut_list = [dut for dut in duthosts.frontend_nodes if - linecard_configuration_set[line_card_choice]['hostname'] == [dut.hostname]] # noqa: E501 - duthost1, duthost2 = dut_list[0], dut_list[0] - elif len(linecard_configuration_set[line_card_choice]['hostname']) == 0: - assert False, "Hostname can't be an empty list" + pytest_assert(len(rdma_ports['tx_ports']) >= tx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Tx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) - snappi_port_list = get_multidut_snappi_ports(line_card_choice=line_card_choice, - line_card_info=linecard_configuration_set[line_card_choice]) - pytest_require(len(snappi_port_list) >= 2, "Need Minimum of 2 ports for the test") - - snappi_ports = get_multidut_tgen_peer_port_set(line_card_choice, snappi_port_list, config_set, 2) - - testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(dut_list, - snappi_ports, - snappi_api) + pytest_assert(len(rdma_ports['rx_ports']) >= rx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Rx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + logger.info('Running test for testbed subtype: {}'.format(testbed_subtype)) + snappi_ports = get_snappi_ports_for_rdma(snappi_port_list, rdma_ports, + tx_port_count, rx_port_count, MULTIDUT_TESTBED) + testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(duthosts, + snappi_ports, + snappi_api) all_prio_list = prio_dscp_map.keys() snappi_extra_params = SnappiTestParams() - snappi_extra_params.duthost1 = duthost1 snappi_extra_params.rx_port = snappi_ports[0] snappi_extra_params.rx_port_id = snappi_ports[0]["port_id"] - snappi_extra_params.duthost2 = duthost2 snappi_extra_params.tx_port = snappi_ports[1] snappi_extra_params.tx_port_id = snappi_ports[1]["port_id"] @@ -76,10 +76,10 @@ def test_pfcwd_runtime_traffic(snappi_api, # noqa: F811 testbed_config=testbed_config, port_config_list=port_config_list, conn_data=conn_graph_facts, - fanout_data=fanout_graph_facts, + fanout_data=fanout_graph_facts_multidut, dut_port=snappi_ports[0]['peer_port'], prio_list=all_prio_list, prio_dscp_map=prio_dscp_map, snappi_extra_params=snappi_extra_params) - cleanup_config(dut_list, snappi_ports) + cleanup_config(duthosts, snappi_ports) diff --git a/tests/snappi_tests/test_multidut_snappi.py b/tests/snappi_tests/test_multidut_snappi.py index f5f2cae18c..016a222634 100644 --- a/tests/snappi_tests/test_multidut_snappi.py +++ b/tests/snappi_tests/test_multidut_snappi.py @@ -1,24 +1,24 @@ import time import pytest import random +import logging from tests.common.helpers.assertions import pytest_assert, pytest_require -from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts # noqa: F401 +from tests.common.fixtures.conn_graph_facts import conn_graph_facts, fanout_graph_facts_multidut # noqa: F401 from tests.common.snappi_tests.snappi_fixtures import snappi_api_serv_ip, snappi_api_serv_port, snappi_api, \ - snappi_dut_base_config, get_multidut_snappi_ports, get_multidut_tgen_peer_port_set # noqa: F401 + snappi_dut_base_config, get_snappi_ports, get_snappi_ports_for_rdma, cleanup_config # noqa: F401 from tests.common.snappi_tests.snappi_helpers import wait_for_arp from tests.common.snappi_tests.port import select_ports from tests.common.snappi_tests.qos_fixtures import prio_dscp_map # noqa: F401 -from tests.snappi_tests.variables import config_set, line_card_choice - +from tests.snappi_tests.variables import MULTIDUT_PORT_INFO, MULTIDUT_TESTBED +logger = logging.getLogger(__name__) SNAPPI_POLL_DELAY_SEC = 2 -pytestmark = [pytest.mark.topology('snappi')] +pytestmark = [pytest.mark.topology('multidut-tgen')] @pytest.mark.disable_loganalyzer def __gen_all_to_all_traffic(testbed_config, port_config_list, - dut_hostname, conn_data, fanout_data, priority, @@ -84,18 +84,17 @@ def __gen_all_to_all_traffic(testbed_config, return testbed_config -@pytest.mark.parametrize('line_card_choice', [line_card_choice]) -@pytest.mark.parametrize('linecard_configuration_set', [config_set]) +@pytest.mark.parametrize("multidut_port_info", MULTIDUT_PORT_INFO[MULTIDUT_TESTBED]) def test_snappi(request, duthosts, snappi_api, # noqa: F811 conn_graph_facts, # noqa: F811 - fanout_graph_facts, # noqa: F811 - rand_one_dut_lossless_prio, + fanout_graph_facts_multidut, # noqa: F811 + lossless_prio_list, # noqa: F811 + get_snappi_ports, # noqa: F811 + tbinfo, # noqa: F811 + multidut_port_info, prio_dscp_map, # noqa: F811 - line_card_choice, - linecard_configuration_set, - get_multidut_snappi_ports # noqa: F811 ): """ @@ -105,48 +104,47 @@ def test_snappi(request, snappi_api (pytest fixture): Snappi session snappi_testbed_config (pytest fixture): testbed configuration information conn_graph_facts (pytest fixture): connection graph - fanout_graph_facts (pytest fixture): fanout graph - rand_one_dut_lossless_prio (str): name of lossless priority to test + fanout_graph_facts_multidut (pytest fixture): fanout graph prio_dscp_map (pytest fixture): priority vs. DSCP map (key = priority) - + tbinfo (pytest fixture): fixture provides information about testbed + get_snappi_ports (pytest fixture): gets snappi ports and connected DUT port info and returns as a list Returns: N/A """ - # - if line_card_choice not in linecard_configuration_set.keys(): - assert False, "Invalid line_card_choice value passed in parameter" - - if len(linecard_configuration_set[line_card_choice]['hostname']) > 1: - dut_list = random.sample(list(duthosts), 2) - elif len(linecard_configuration_set[line_card_choice]['hostname']) == 1: - dut_list = [dut for dut in duthosts - if linecard_configuration_set[line_card_choice]['hostname'] == [dut.hostname]] - else: - assert False, "Hostname can't be an empty list" - - snappi_port_list = get_multidut_snappi_ports(line_card_choice=line_card_choice, - line_card_info=linecard_configuration_set[line_card_choice]) - if len(snappi_port_list) < 2: - assert False, "Need Minimum of 2 ports for the test" - - snappi_ports = get_multidut_tgen_peer_port_set(line_card_choice, - snappi_port_list, - config_set, - 2) - - testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(dut_list, - snappi_ports, - snappi_api) - - dut_hostname, lossless_prio = rand_one_dut_lossless_prio.split('|') + for testbed_subtype, rdma_ports in multidut_port_info.items(): + tx_port_count = 1 + rx_port_count = 1 + snappi_port_list = get_snappi_ports + pytest_assert(MULTIDUT_TESTBED == tbinfo['conf-name'], + "The testbed name from testbed file doesn't match with MULTIDUT_TESTBED in variables.py ") + pytest_assert(len(snappi_port_list) >= tx_port_count + rx_port_count, + "Need Minimum of 2 ports defined in ansible/files/*links.csv file") + + pytest_assert(len(rdma_ports['tx_ports']) >= tx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Tx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + + pytest_assert(len(rdma_ports['rx_ports']) >= rx_port_count, + 'MULTIDUT_PORT_INFO doesn\'t have the required Rx ports defined for \ + testbed {}, subtype {} in variables.py'. + format(MULTIDUT_TESTBED, testbed_subtype)) + logger.info('Running test for testbed subtype: {}'.format(testbed_subtype)) + snappi_ports = get_snappi_ports_for_rdma(snappi_port_list, rdma_ports, + tx_port_count, rx_port_count, MULTIDUT_TESTBED) + testbed_config, port_config_list, snappi_ports = snappi_dut_base_config(duthosts, + snappi_ports, + snappi_api) + + lossless_prio = random.sample(lossless_prio_list, 1) + lossless_prio = int(lossless_prio) pytest_require(len(port_config_list) >= 2, "This test requires at least 2 ports") config = __gen_all_to_all_traffic(testbed_config=testbed_config, port_config_list=port_config_list, - dut_hostname=dut_hostname, conn_data=conn_graph_facts, - fanout_data=fanout_graph_facts, + fanout_data=fanout_graph_facts_multidut, priority=int(lossless_prio), prio_dscp_map=prio_dscp_map) diff --git a/tests/snappi_tests/variables.py b/tests/snappi_tests/variables.py index 9f08cbd971..c862c0c2f3 100644 --- a/tests/snappi_tests/variables.py +++ b/tests/snappi_tests/variables.py @@ -31,28 +31,22 @@ } }) )} + ''' In this file user can modify the line_card_choice and it chooses the corresponding hostname and asic values from the config_set hostnames can be modified according to the dut hostname mentioned in the snappi_sonic_devices.csv and asic values based on if its a chassis based dut - chassis_single_line_card_single_asic : this option selects the ports form the hostname and its respective asic value - chassis_single_line_card_multi_asic : this option selects the ports from the hostname and minimum of 1 port from each of the asic values - chassis_multi_line_card_single_asic : this option selects min 1 port from each of the hostnames and its asic value - chassis_multi_line_card_multi_asic : this option selects min of 1 port from hostname1 and asic1 and 1 port from hostname2 and asic2 - non_chassis_multi_line_card : this option selects min of 1 port from hostname1 and 1 port from hostname2 - non_chassis_single_line_card : this option selects all the ports from the hostname - ''' line_card_choice = 'chassis_multi_line_card_multi_asic' config_set = {