Skip to content

Commit 7ee3eb9

Browse files
ansrajpu-gitmssonicbld
authored andcommitted
Qos test case added for verifying ECN configuration based on WRED profile (#20544)
* [GITPR_TBD]testQosSaiDscpEcn test added to qos tests Signed-off-by: ansrajpu <[email protected]> * [GITPR_TBD]testQosSaiDscpEcnTest updated for ecnconfig check Signed-off-by: ansrajpu <[email protected]> * [GITPR_TBD]Conditional mark skip added for testDscpEcn Signed-off-by: ansrajpu <[email protected]> * Flake8 fixes Signed-off-by: ansrajpu <[email protected]> * Flake8 fixes Signed-off-by: ansrajpu <[email protected]> * Flake8 fix Signed-off-by: ansrajpu <[email protected]> * Flake8 Signed-off-by: ansrajpu <[email protected]> * [GITPR_TBD]Counterpoll cmd changes for multi_asic Signed-off-by: ansrajpu <[email protected]> * Flake8 err fix Signed-off-by: ansrajpu <[email protected]> * Flake8 fixes Signed-off-by: ansrajpu <[email protected]> * [GITPR_20544]testQosSaiDscpEcn updated to validate pkt_range Signed-off-by: ansrajpu <[email protected]> * Flake8 fixed Signed-off-by: ansrajpu <[email protected]> * [GITPR_20544]Added fixture to enable_disable ecn config Signed-off-by: ansrajpu <[email protected]> * [GITPR_20544][Qos]Improvising assert check for ecn counters Signed-off-by: ansrajpu <[email protected]> * Flake8 fix Signed-off-by: ansrajpu <[email protected]> * rebase correction Signed-off-by: ansrajpu <[email protected]> --------- Signed-off-by: ansrajpu <[email protected]> Signed-off-by: mssonicbld <[email protected]>
1 parent db852a4 commit 7ee3eb9

File tree

7 files changed

+502
-158
lines changed

7 files changed

+502
-158
lines changed

tests/common/plugins/conditional_mark/tests_mark_conditions.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3627,7 +3627,7 @@ qos/test_ecn_config.py:
36273627
skip:
36283628
reason: "This test only support on cisco device"
36293629
conditions:
3630-
- "asic_type not in ['cisco-8000']"
3630+
- "asic_type not in ['cisco-8000', 'broadcom']"
36313631

36323632
qos/test_oq_watchdog.py:
36333633
skip:
@@ -3760,6 +3760,12 @@ qos/test_qos_sai.py::TestQosSai::testQosSaiDot1pQueueMapping:
37603760
- "topo_type in ['m0', 'mx', 'm1']"
37613761
- "topo_name not in constants['QOS_SAI_TOPO'] and asic_type not in ['mellanox']"
37623762

3763+
qos/test_qos_sai.py::TestQosSai::testQosSaiDscpEcn:
3764+
skip:
3765+
reason: "Unsupported testbed type."
3766+
conditions:
3767+
- "asic_type not in ['broadcom'] and asic_subtype not in ['broadcom-dnx']"
3768+
37633769
qos/test_qos_sai.py::TestQosSai::testQosSaiDscpQueueMapping:
37643770
skip:
37653771
reason: "Unsupported testbed type."

tests/qos/files/qos_params.j2c.yaml

Lines changed: 66 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -327,31 +327,38 @@ qos_params:
327327
pkts_num_fill_egr_min: 0
328328
cell_size: 4096
329329
ecn_1:
330-
dscp: 8
330+
dscp: 3
331331
ecn: 0
332-
num_of_pkts: 5000
333-
limit: 182000
334-
min_limit: 180000
332+
num_of_pkts: 8500
333+
limit: 8500
334+
min_limit: 2000
335335
cell_size: 4096
336336
ecn_2:
337-
dscp: 8
337+
dscp: 3
338338
ecn: 1
339-
num_of_pkts: 2047
340-
limit: 182320
341-
min_limit: 0
339+
num_of_pkts: 1800
340+
limit: 1800
341+
min_limit: 2000
342342
cell_size: 4096
343343
ecn_3:
344-
dscp: 0
345-
ecn: 0
346-
num_of_pkts: 5000
347-
limit: 182000
348-
min_limit: 180000
344+
dscp: 3
345+
ecn: 2
346+
num_of_pkts: 8500
347+
limit: 6500
348+
min_limit: 2000
349349
cell_size: 4096
350350
ecn_4:
351+
dscp: 3
352+
ecn: 1
353+
num_of_pkts: 8500
354+
limit: 6500
355+
min_limit: 2000
356+
cell_size: 4096
357+
ecn_5:
351358
dscp: 0
352359
ecn: 1
353-
num_of_pkts: 2047
354-
limit: 182320
360+
num_of_pkts: 8500
361+
limit: 0
355362
min_limit: 0
356363
cell_size: 4096
357364
wrr:
@@ -705,31 +712,38 @@ qos_params:
705712
pkts_num_fill_egr_min: 0
706713
cell_size: 4096
707714
ecn_1:
708-
dscp: 8
715+
dscp: 3
709716
ecn: 0
710-
num_of_pkts: 5000
711-
limit: 182000
712-
min_limit: 180000
717+
num_of_pkts: 8500
718+
limit: 8500
719+
min_limit: 2000
713720
cell_size: 4096
714721
ecn_2:
715-
dscp: 8
722+
dscp: 3
716723
ecn: 1
717-
num_of_pkts: 2047
718-
limit: 182320
719-
min_limit: 0
724+
num_of_pkts: 1800
725+
limit: 1800
726+
min_limit: 2000
720727
cell_size: 4096
721728
ecn_3:
722-
dscp: 0
723-
ecn: 0
724-
num_of_pkts: 5000
725-
limit: 182000
726-
min_limit: 180000
729+
dscp: 3
730+
ecn: 2
731+
num_of_pkts: 8500
732+
limit: 6500
733+
min_limit: 2000
727734
cell_size: 4096
728735
ecn_4:
736+
dscp: 3
737+
ecn: 1
738+
num_of_pkts: 8500
739+
limit: 6500
740+
min_limit: 2000
741+
cell_size: 4096
742+
ecn_5:
729743
dscp: 0
730744
ecn: 1
731-
num_of_pkts: 2047
732-
limit: 182320
745+
num_of_pkts: 8500
746+
limit: 0
733747
min_limit: 0
734748
cell_size: 4096
735749
wrr:
@@ -1398,31 +1412,38 @@ qos_params:
13981412
pkts_num_fill_egr_min: 0
13991413
cell_size: 4096
14001414
ecn_1:
1401-
dscp: 8
1415+
dscp: 3
14021416
ecn: 0
1403-
num_of_pkts: 5000
1404-
limit: 182000
1405-
min_limit: 180000
1417+
num_of_pkts: 8500
1418+
limit: 8500
1419+
min_limit: 2000
14061420
cell_size: 4096
14071421
ecn_2:
1408-
dscp: 8
1422+
dscp: 3
14091423
ecn: 1
1410-
num_of_pkts: 2047
1411-
limit: 182320
1412-
min_limit: 0
1424+
num_of_pkts: 1800
1425+
limit: 1800
1426+
min_limit: 2000
14131427
cell_size: 4096
14141428
ecn_3:
1415-
dscp: 0
1416-
ecn: 0
1417-
num_of_pkts: 5000
1418-
limit: 182000
1419-
min_limit: 180000
1429+
dscp: 3
1430+
ecn: 2
1431+
num_of_pkts: 8500
1432+
limit: 6500
1433+
min_limit: 2000
14201434
cell_size: 4096
14211435
ecn_4:
1436+
dscp: 3
1437+
ecn: 1
1438+
num_of_pkts: 8500
1439+
limit: 6500
1440+
min_limit: 2000
1441+
cell_size: 4096
1442+
ecn_5:
14221443
dscp: 0
14231444
ecn: 1
1424-
num_of_pkts: 2047
1425-
limit: 182320
1445+
num_of_pkts: 8500
1446+
limit: 0
14261447
min_limit: 0
14271448
cell_size: 4096
14281449
wrr:

tests/qos/qos_fixtures.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,35 @@ def leaf_fanouts(conn_graph_facts): # noqa: F811
6060
leaf_fanouts.append(peer_device)
6161

6262
return leaf_fanouts
63+
64+
65+
@pytest.fixture(scope="module")
66+
def lossless_prio_list(duthosts, enum_rand_one_per_hwsku_frontend_hostname, enum_rand_one_frontend_asic_index):
67+
"""
68+
This fixture returns the list of lossless priorities
69+
70+
Args:
71+
duthosts (pytest fixture) : list of DUTs
72+
enum_rand_one_per_hwsku_frontend_hostname (pytest fixture): DUT hostname
73+
74+
Returns:
75+
Lossless priorities (list)
76+
"""
77+
duthost = duthosts[enum_rand_one_per_hwsku_frontend_hostname]
78+
config_facts = duthost.config_facts(host=duthost.hostname, asic_index=enum_rand_one_frontend_asic_index,
79+
source="running")['ansible_facts']
80+
81+
if "PORT_QOS_MAP" not in list(config_facts.keys()):
82+
return None
83+
84+
port_qos_map = config_facts["PORT_QOS_MAP"]
85+
if len(list(port_qos_map.keys())) == 0:
86+
return None
87+
88+
""" Here we assume all the ports have the same lossless priorities """
89+
intf = list(port_qos_map.keys())[0]
90+
if 'pfc_enable' not in port_qos_map[intf]:
91+
return None
92+
93+
result = [int(x) for x in port_qos_map[intf]['pfc_enable'].split(',')]
94+
return result

tests/qos/qos_sai_base.py

Lines changed: 92 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818
from tests.common.mellanox_data import is_mellanox_device as isMellanoxDevice
1919
from tests.common.cisco_data import is_cisco_device, copy_dshell_script_cisco_8000, run_dshell_command
2020
from tests.common.dualtor.dual_tor_common import active_standby_ports # noqa: F401
21-
from tests.common.dualtor.dual_tor_utils \
22-
import upper_tor_host, lower_tor_host, dualtor_ports, is_tunnel_qos_remap_enabled # noqa: F401
23-
from tests.common.dualtor.mux_simulator_control \
24-
import toggle_all_simulator_ports, check_mux_status, validate_check_result # noqa: F401
21+
from tests.common.dualtor.dual_tor_utils import (upper_tor_host, # noqa: F401
22+
lower_tor_host, dualtor_ports, is_tunnel_qos_remap_enabled)
23+
from tests.common.dualtor.mux_simulator_control import (toggle_all_simulator_ports, # noqa: F401
24+
check_mux_status, validate_check_result)
2525
from tests.common.dualtor.constants import UPPER_TOR, LOWER_TOR # noqa: F401
2626
from tests.common.utilities import check_qos_db_fv_reference_with_table
2727
from tests.common.fixtures.duthost_utils import dut_qos_maps, separated_dscp_to_tc_map_on_uplink # noqa: F401
@@ -464,6 +464,11 @@ def __getEcnWredParam(self, dut_asic, table, port):
464464
Returns:
465465
wredProfile (dict): Map of ECN/WRED attributes
466466
"""
467+
if table == "QUEUE" and dut_asic.sonichost.facts['switch_type'] == 'voq':
468+
# For VoQ chassis, the buffer queues config is based on system port
469+
if dut_asic.sonichost.is_multi_asic:
470+
port = "{}|{}|{}".format(
471+
dut_asic.sonichost.hostname, dut_asic.namespace, port)
467472
if check_qos_db_fv_reference_with_table(dut_asic):
468473
out = dut_asic.run_redis_cmd(
469474
argv=[
@@ -1708,7 +1713,7 @@ def dutQosConfig(
17081713
self, duthosts, get_src_dst_asic_and_duts,
17091714
dutConfig, ingressLosslessProfile, ingressLossyProfile,
17101715
egressLosslessProfile, egressLossyProfile, sharedHeadroomPoolSize,
1711-
tbinfo, lower_tor_host # noqa: F811
1716+
tbinfo, lower_tor_host, ecnLosslessProfile # noqa: F811
17121717
):
17131718
"""
17141719
Prepares DUT host QoS configuration
@@ -2452,15 +2457,29 @@ def resetWatermark(
24522457
Returns:
24532458
None
24542459
"""
2455-
2456-
for dut_asic in get_src_dst_asic_and_duts['all_asics']:
2457-
dut_asic.command("counterpoll watermark enable")
2458-
dut_asic.command("counterpoll queue enable")
2460+
duthost = duthosts.frontend_nodes[0]
2461+
if duthost.sonichost.is_multi_asic:
2462+
for duthost in get_src_dst_asic_and_duts['all_duts']:
2463+
for asic in duthost.asics:
2464+
namespace_arg = '-n asic{}'.format(asic.asic_index)
2465+
duthost.command("sudo counterpoll watermark {} enable".format(namespace_arg))
2466+
duthost.command("sudo counterpoll queue {} enable".format(namespace_arg))
2467+
else:
2468+
for dut_asic in get_src_dst_asic_and_duts["all_asics"]:
2469+
dut_asic.command("counterpoll watermark enable")
2470+
dut_asic.command("counterpoll queue enable")
24592471

24602472
time.sleep(70)
2461-
for dut_asic in get_src_dst_asic_and_duts['all_asics']:
2462-
dut_asic.command("counterpoll watermark disable")
2463-
dut_asic.command("counterpoll queue disable")
2473+
if duthost.sonichost.is_multi_asic:
2474+
for duthost in get_src_dst_asic_and_duts['all_duts']:
2475+
for asic in duthost.asics:
2476+
namespace_arg = '-n asic{}'.format(asic.asic_index)
2477+
duthost.command("sudo counterpoll watermark {} disable".format(namespace_arg))
2478+
duthost.command("sudo counterpoll queue {} disable".format(namespace_arg))
2479+
else:
2480+
for dut_asic in get_src_dst_asic_and_duts['all_asics']:
2481+
dut_asic.command("counterpoll watermark disable")
2482+
dut_asic.command("counterpoll queue disable")
24642483

24652484
@pytest.fixture
24662485
def blockGrpcTraffic(self, tbinfo, lower_tor_host, nic_simulator_info): # noqa F811
@@ -3165,3 +3184,64 @@ def is_port_alpha_enabled(self, duthost):
31653184
sai_profile_content = duthost.shell(get_sai_profile_cmd)['stdout']
31663185
logging.info(f"sai_profile_content: {sai_profile_content}")
31673186
return "SAI_KEY_DISABLE_PORT_ALPHA=1" not in sai_profile_content
3187+
3188+
@pytest.fixture(scope='class', autouse=True)
3189+
def ecnLosslessProfile(
3190+
self, request, duthosts, get_src_dst_asic_and_duts, dutConfig, tbinfo, lower_tor_host # noqa F811
3191+
):
3192+
"""
3193+
Retreives ecn lossless profile
3194+
3195+
Args:
3196+
request (Fixture): pytest request object
3197+
duthost (AnsibleHost): Device Under Test (DUT)
3198+
dutConfig (Fixture, dict): Map of DUT config containing dut interfaces,
3199+
test port IDs, test port IPs,
3200+
and test ports
3201+
3202+
Returns:
3203+
ecnLosslessProfile (dict): Map of ecn marking for lossless queue
3204+
"""
3205+
3206+
dut_asic = get_src_dst_asic_and_duts['dst_asic']
3207+
dstport = dutConfig["dutInterfaces"][dutConfig["testPorts"]["dst_port_id"]]
3208+
3209+
yield self.__getEcnWredParam(
3210+
dut_asic,
3211+
"QUEUE",
3212+
dstport
3213+
)
3214+
3215+
@pytest.fixture(scope='class', autouse=True)
3216+
def enableECN(self, duthosts, get_src_dst_asic_and_duts):
3217+
"""
3218+
By default WRED_ECN_QUEUE and WRED_ECN_PORT are disabled for polling.
3219+
Enable flexcounter groups WRED_ECN_QUEUE and WRED_ECN_PORT using counterpoll CLI
3220+
"""
3221+
duthost = duthosts.frontend_nodes[0]
3222+
if duthost.sonichost.is_multi_asic:
3223+
for duthost in get_src_dst_asic_and_duts['all_duts']:
3224+
for asic in duthost.asics:
3225+
namespace_arg = '-n asic{}'.format(asic.asic_index)
3226+
duthost.command("sudo counterpoll wredqueue {} enable".format(namespace_arg))
3227+
duthost.command("sudo counterpoll wredport {} enable".format(namespace_arg))
3228+
duthost.command("sudo config save -y")
3229+
else:
3230+
for dut_asic in get_src_dst_asic_and_duts["all_asics"]:
3231+
dut_asic.command("counterpoll wredqueue enable")
3232+
dut_asic.command("counterpoll wredport enable")
3233+
duthost.command("sudo config save -y")
3234+
3235+
yield
3236+
if duthost.sonichost.is_multi_asic:
3237+
for duthost in get_src_dst_asic_and_duts['all_duts']:
3238+
for asic in duthost.asics:
3239+
namespace_arg = '-n asic{}'.format(asic.asic_index)
3240+
duthost.command("sudo counterpoll wredqueue {} disable".format(namespace_arg))
3241+
duthost.command("sudo counterpoll wredport {} disable".format(namespace_arg))
3242+
duthost.command("sudo config save -y")
3243+
else:
3244+
for dut_asic in get_src_dst_asic_and_duts["all_asics"]:
3245+
dut_asic.command("counterpoll wredqueue disable")
3246+
dut_asic.command("counterpoll wredport disable")
3247+
duthost.command("sudo config save -y")

0 commit comments

Comments
 (0)