Skip to content
30 changes: 18 additions & 12 deletions tests/generic_config_updater/test_pg_headroom_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ def ensure_dut_readiness(duthost):
delete_checkpoint(duthost)


def ensure_application_of_updated_config(duthost, xoff, values):
def ensure_application_of_updated_config(duthost, xoff, values, cli_namespace_prefix):
"""
Ensures application of the JSON patch config update

Expand All @@ -52,45 +52,50 @@ def ensure_application_of_updated_config(duthost, xoff, values):
values: expected value(s) for the xoff field
"""
def _confirm_value_in_app_and_asic_db():

for profile in xoff:
profile_data = duthost.shell('sonic-db-cli APPL_DB hgetall "BUFFER_PROFILE_TABLE:{}"'
.format(profile))["stdout"]
profile_data = duthost.shell('sonic-db-cli {} APPL_DB hgetall "BUFFER_PROFILE_TABLE:{}"'
.format(cli_namespace_prefix, profile))["stdout"]
profile_data = ast.literal_eval(profile_data)
if profile_data["xoff"] != xoff[profile]:
return False

count = 0
table_name = duthost.shell('sonic-db-cli ASIC_DB keys *BUFFER_PROFILE*')["stdout_lines"]
table_name = duthost.shell('sonic-db-cli {} ASIC_DB keys *BUFFER_PROFILE*'
.format(cli_namespace_prefix))["stdout_lines"]
for table in table_name:
profile_data = duthost.shell('sonic-db-cli ASIC_DB hgetall "{}"'.format(table))["stdout"]
profile_data = duthost.shell('sonic-db-cli {} ASIC_DB hgetall "{}"'
.format(cli_namespace_prefix, table))["stdout"]
profile_data = ast.literal_eval(profile_data)
if "SAI_BUFFER_PROFILE_ATTR_XOFF_TH" in profile_data:
count += 1
if profile_data["SAI_BUFFER_PROFILE_ATTR_XOFF_TH"] not in values:
return False
return count == len(values)

logger.info("Validating fields in APPL DB and ASIC DB...")
logger.info("Validating fields in APPL DB and ASIC DB for namespace prefix {}...".format(cli_namespace_prefix))
pytest_assert(
wait_until(READ_ASICDB_TIMEOUT, READ_ASICDB_INTERVAL, 0, _confirm_value_in_app_and_asic_db),
"APPL DB or ASIC DB does not properly reflect newly configured value(s) for xoff"
)


@pytest.mark.parametrize("operation", ["replace"])
def test_pg_headroom_update(duthost, ensure_dut_readiness, operation, skip_when_buffer_is_dynamic_model):
def test_pg_headroom_update(duthost, ensure_dut_readiness, operation, skip_when_buffer_is_dynamic_model,
enum_rand_one_frontend_asic_index, cli_namespace_prefix):
namespace = duthost.get_namespace_from_asic_id(enum_rand_one_frontend_asic_index)
asic_type = get_asic_name(duthost)
pytest_require("td2" not in asic_type, "PG headroom should be skipped on TD2")
tmpfile = generate_tmpfile(duthost)

json_patch = list()
values = list()
xoff = dict()
lossless_profiles = duthost.shell('sonic-db-cli CONFIG_DB keys *BUFFER_PROFILE\\|pg_lossless*')['stdout_lines']
lossless_profiles = duthost.shell('sonic-db-cli {} CONFIG_DB keys *BUFFER_PROFILE\\|pg_lossless*'
.format(cli_namespace_prefix))['stdout_lines']
for profile in lossless_profiles:
profile_name = profile.split('|')[-1]
value = duthost.shell('sonic-db-cli CONFIG_DB hget "{}" "xoff"'.format(profile))['stdout']
value = duthost.shell('sonic-db-cli {} CONFIG_DB hget "{}" "xoff"'
.format(cli_namespace_prefix, profile))['stdout']
value = int(value)
value -= 1000
xoff[profile_name] = str(value)
Expand All @@ -103,12 +108,13 @@ def test_pg_headroom_update(duthost, ensure_dut_readiness, operation, skip_when_
{"op": "{}".format(operation),
"path": "/BUFFER_PROFILE/{}/xoff".format(profile_name),
"value": "{}".format(value)})
json_patch = format_json_patch_for_multiasic(duthost=duthost, json_data=json_patch, is_asic_specific=True)
json_patch = format_json_patch_for_multiasic(duthost=duthost, json_data=json_patch,
is_asic_specific=True, asic_namespaces=[namespace])
try:
output = apply_patch(duthost, json_data=json_patch, dest_file=tmpfile)
if is_valid_platform_and_version(duthost, "BUFFER_PROFILE", "PG headroom modification", operation):
expect_op_success(duthost, output)
ensure_application_of_updated_config(duthost, xoff, values)
ensure_application_of_updated_config(duthost, xoff, values, cli_namespace_prefix)
else:
expect_op_failure(output)
finally:
Expand Down
Loading