From 6b99d7610fb06dc767de8bb43db4de0273e8c34f Mon Sep 17 00:00:00 2001 From: Zain Budhwani Date: Tue, 1 Jul 2025 19:10:19 +0000 Subject: [PATCH 1/4] Fix buffer queue cnt test to account for different BUFFER_QUEUE configs --- tests/telemetry/test_telemetry.py | 59 +++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 18 deletions(-) diff --git a/tests/telemetry/test_telemetry.py b/tests/telemetry/test_telemetry.py index 4e90f75418d..361f43d022f 100644 --- a/tests/telemetry/test_telemetry.py +++ b/tests/telemetry/test_telemetry.py @@ -31,7 +31,7 @@ def load_new_cfg(duthost, data): duthost.copy(content=json.dumps(data, indent=4), dest=CFG_DB_PATH) - config_reload(duthost, config_source='config_db', safe_reload=True, check_intf_up_ports=True, wait_for_bgp=True) + config_reload(duthost, config_source='config_db', safe_reload=True, check_intf_up_ports=True, wait_for_bgp=True, yang_validate=False) # config reload overrides testing telemetry config, ensure testing config exists setup_telemetry_forpyclient(duthost) @@ -186,26 +186,49 @@ def test_telemetry_queue_buffer_cnt(duthosts, enum_rand_one_per_hwsku_hostname, interface_buffer_queues = [bq for bq in buffer_queues if any(val in interface_to_check for val in bq.split('|'))] + """If all queues for that pool are in the same pool ex Ethernet0|0-9 + We will modify to separate the first queue and the remaining such + that we get a separate entry for Ethernet0|0 and Ethernet0|1-9""" + bq_entry = interface_buffer_queues[0] + if len(interface_buffer_queues) == 1: + iface, q_range = bq_entry.split('|') + if '-' in q_range: # Grouped queues + start, end = map(int, q_range.split('-')) + if start < end: + single_queue_entry = f"{iface}|{start}" + remaining_queue_entry = f"{iface}|{start + 1}-{end}" + profile = data['BUFFER_QUEUE'][bq_entry]['profile'] + data['BUFFER_QUEUE'][remaining_queue_entry] = { "profile": profile } + data['BUFFER_QUEUE'][single_queue_entry] = { "profile": profile } + del data['BUFFER_QUEUE'][bq_entry] + bq_entry = single_queue_entry + else: + pytest.skip("Invalid buffer queue range") + # Add create_only_config_db_buffers entry to device metadata to enable # counters optimization and get number of queue counters of Ethernet0 prior # to removing buffer queues - data['DEVICE_METADATA']["localhost"]["create_only_config_db_buffers"] \ - = "true" - load_new_cfg(duthost, data) - pytest_assert(wait_until(120, 20, 0, check_buffer_queues_cnt_cmd_output, ptfhost, gnxi_path, - dut_ip, interface_to_check, env.gnmi_port), "gnmi server not fully restarted") - pre_del_cnt = get_buffer_queues_cnt(ptfhost, gnxi_path, dut_ip, interface_to_check, env.gnmi_port) - - # Remove buffer queue and reload and get new number of queue counters - del data['BUFFER_QUEUE'][interface_buffer_queues[0]] - load_new_cfg(duthost, data) - pytest_assert(wait_until(120, 20, 0, check_buffer_queues_cnt_cmd_output, ptfhost, gnxi_path, - dut_ip, interface_to_check, env.gnmi_port), "gnmi server not fully restarted") - post_del_cnt = get_buffer_queues_cnt(ptfhost, gnxi_path, dut_ip, interface_to_check, env.gnmi_port) - - pytest_assert(pre_del_cnt > post_del_cnt, - "Number of queue counters count differs from expected") - + try: + data['DEVICE_METADATA']["localhost"]["create_only_config_db_buffers"] \ + = "true" + load_new_cfg(duthost, data) + pytest_assert(wait_until(120, 20, 0, check_buffer_queues_cnt_cmd_output, ptfhost, gnxi_path, + dut_ip, interface_to_check, env.gnmi_port), "gnmi server not fully restarted") + pre_del_cnt = get_buffer_queues_cnt(ptfhost, gnxi_path, dut_ip, interface_to_check, env.gnmi_port) + + # Remove buffer queue and reload and get new number of queue counters + del data['BUFFER_QUEUE'][bq_entry] + load_new_cfg(duthost, data) + pytest_assert(wait_until(120, 20, 0, check_buffer_queues_cnt_cmd_output, ptfhost, gnxi_path, + dut_ip, interface_to_check, env.gnmi_port), "gnmi server not fully restarted") + post_del_cnt = get_buffer_queues_cnt(ptfhost, gnxi_path, dut_ip, interface_to_check, env.gnmi_port) + + pytest_assert(pre_del_cnt > post_del_cnt, + "Number of queue counters count differs from expected") + finally: + data = json.loads(duthost.shell("cat {}".format(ORIG_CFG_DB), + verbose=False)['stdout']) + load_new_cfg(duthost, data) @pytest.mark.parametrize('setup_streaming_telemetry', [False], indirect=True) def test_osbuild_version(duthosts, enum_rand_one_per_hwsku_hostname, ptfhost, From cfd7333a2a2c3205c7070ffb5a17a72493121d14 Mon Sep 17 00:00:00 2001 From: Zain Budhwani Date: Tue, 1 Jul 2025 20:30:01 +0000 Subject: [PATCH 2/4] Update error message and fix edge case where there is only one port queue entry --- tests/telemetry/test_telemetry.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/telemetry/test_telemetry.py b/tests/telemetry/test_telemetry.py index 361f43d022f..46f31d2ec62 100644 --- a/tests/telemetry/test_telemetry.py +++ b/tests/telemetry/test_telemetry.py @@ -189,6 +189,7 @@ def test_telemetry_queue_buffer_cnt(duthosts, enum_rand_one_per_hwsku_hostname, """If all queues for that pool are in the same pool ex Ethernet0|0-9 We will modify to separate the first queue and the remaining such that we get a separate entry for Ethernet0|0 and Ethernet0|1-9""" + single_key = False bq_entry = interface_buffer_queues[0] if len(interface_buffer_queues) == 1: iface, q_range = bq_entry.split('|') @@ -204,6 +205,8 @@ def test_telemetry_queue_buffer_cnt(duthosts, enum_rand_one_per_hwsku_hostname, bq_entry = single_queue_entry else: pytest.skip("Invalid buffer queue range") + else: + single_key = True # Add create_only_config_db_buffers entry to device metadata to enable # counters optimization and get number of queue counters of Ethernet0 prior @@ -213,14 +216,15 @@ def test_telemetry_queue_buffer_cnt(duthosts, enum_rand_one_per_hwsku_hostname, = "true" load_new_cfg(duthost, data) pytest_assert(wait_until(120, 20, 0, check_buffer_queues_cnt_cmd_output, ptfhost, gnxi_path, - dut_ip, interface_to_check, env.gnmi_port), "gnmi server not fully restarted") + dut_ip, interface_to_check, env.gnmi_port), "Unable to get data from COUNTERS_QUEUE_NAME_MAP") pre_del_cnt = get_buffer_queues_cnt(ptfhost, gnxi_path, dut_ip, interface_to_check, env.gnmi_port) # Remove buffer queue and reload and get new number of queue counters del data['BUFFER_QUEUE'][bq_entry] load_new_cfg(duthost, data) - pytest_assert(wait_until(120, 20, 0, check_buffer_queues_cnt_cmd_output, ptfhost, gnxi_path, - dut_ip, interface_to_check, env.gnmi_port), "gnmi server not fully restarted") + if not single_key: + pytest_assert(wait_until(120, 20, 0, check_buffer_queues_cnt_cmd_output, ptfhost, gnxi_path, + dut_ip, interface_to_check, env.gnmi_port), "Unable to get data from COUNTERS_QUEUE_NAME_MAP") post_del_cnt = get_buffer_queues_cnt(ptfhost, gnxi_path, dut_ip, interface_to_check, env.gnmi_port) pytest_assert(pre_del_cnt > post_del_cnt, From 6bdd9ed81f0d9da3ae1034f1af057acc231ff1e4 Mon Sep 17 00:00:00 2001 From: Zain Budhwani Date: Tue, 1 Jul 2025 20:40:53 +0000 Subject: [PATCH 3/4] Fix precommit checks --- tests/telemetry/test_telemetry.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/telemetry/test_telemetry.py b/tests/telemetry/test_telemetry.py index 46f31d2ec62..4cc0e9723e2 100644 --- a/tests/telemetry/test_telemetry.py +++ b/tests/telemetry/test_telemetry.py @@ -31,7 +31,8 @@ def load_new_cfg(duthost, data): duthost.copy(content=json.dumps(data, indent=4), dest=CFG_DB_PATH) - config_reload(duthost, config_source='config_db', safe_reload=True, check_intf_up_ports=True, wait_for_bgp=True, yang_validate=False) + config_reload(duthost, config_source='config_db', safe_reload=True, check_intf_up_ports=True, + wait_for_bgp=True, yang_validate=False) # config reload overrides testing telemetry config, ensure testing config exists setup_telemetry_forpyclient(duthost) @@ -199,8 +200,8 @@ def test_telemetry_queue_buffer_cnt(duthosts, enum_rand_one_per_hwsku_hostname, single_queue_entry = f"{iface}|{start}" remaining_queue_entry = f"{iface}|{start + 1}-{end}" profile = data['BUFFER_QUEUE'][bq_entry]['profile'] - data['BUFFER_QUEUE'][remaining_queue_entry] = { "profile": profile } - data['BUFFER_QUEUE'][single_queue_entry] = { "profile": profile } + data['BUFFER_QUEUE'][remaining_queue_entry] = {"profile": profile} + data['BUFFER_QUEUE'][single_queue_entry] = {"profile": profile} del data['BUFFER_QUEUE'][bq_entry] bq_entry = single_queue_entry else: @@ -216,7 +217,7 @@ def test_telemetry_queue_buffer_cnt(duthosts, enum_rand_one_per_hwsku_hostname, = "true" load_new_cfg(duthost, data) pytest_assert(wait_until(120, 20, 0, check_buffer_queues_cnt_cmd_output, ptfhost, gnxi_path, - dut_ip, interface_to_check, env.gnmi_port), "Unable to get data from COUNTERS_QUEUE_NAME_MAP") + dut_ip, interface_to_check, env.gnmi_port), "Unable to get map data") pre_del_cnt = get_buffer_queues_cnt(ptfhost, gnxi_path, dut_ip, interface_to_check, env.gnmi_port) # Remove buffer queue and reload and get new number of queue counters @@ -224,7 +225,7 @@ def test_telemetry_queue_buffer_cnt(duthosts, enum_rand_one_per_hwsku_hostname, load_new_cfg(duthost, data) if not single_key: pytest_assert(wait_until(120, 20, 0, check_buffer_queues_cnt_cmd_output, ptfhost, gnxi_path, - dut_ip, interface_to_check, env.gnmi_port), "Unable to get data from COUNTERS_QUEUE_NAME_MAP") + dut_ip, interface_to_check, env.gnmi_port), "Unable to get map data") post_del_cnt = get_buffer_queues_cnt(ptfhost, gnxi_path, dut_ip, interface_to_check, env.gnmi_port) pytest_assert(pre_del_cnt > post_del_cnt, @@ -234,6 +235,7 @@ def test_telemetry_queue_buffer_cnt(duthosts, enum_rand_one_per_hwsku_hostname, verbose=False)['stdout']) load_new_cfg(duthost, data) + @pytest.mark.parametrize('setup_streaming_telemetry', [False], indirect=True) def test_osbuild_version(duthosts, enum_rand_one_per_hwsku_hostname, ptfhost, setup_streaming_telemetry, gnxi_path): From c0f8b5928c53e845d87058cb6c2719e449309e11 Mon Sep 17 00:00:00 2001 From: Zain Budhwani Date: Wed, 2 Jul 2025 17:13:02 +0000 Subject: [PATCH 4/4] Address review comments --- tests/telemetry/test_telemetry.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/tests/telemetry/test_telemetry.py b/tests/telemetry/test_telemetry.py index 4cc0e9723e2..9f5b3aae804 100644 --- a/tests/telemetry/test_telemetry.py +++ b/tests/telemetry/test_telemetry.py @@ -186,12 +186,15 @@ def test_telemetry_queue_buffer_cnt(duthosts, enum_rand_one_per_hwsku_hostname, pytest.skip("Skipping test as there are none interfaces in admin'up' state with buffer queues to check") interface_buffer_queues = [bq for bq in buffer_queues if any(val in interface_to_check for val in bq.split('|'))] + if len(interface_buffer_queues) == 0: + pytest.skip("No valid entry for any interface:queue entry") """If all queues for that pool are in the same pool ex Ethernet0|0-9 We will modify to separate the first queue and the remaining such that we get a separate entry for Ethernet0|0 and Ethernet0|1-9""" - single_key = False + is_single_queue = False bq_entry = interface_buffer_queues[0] + if len(interface_buffer_queues) == 1: iface, q_range = bq_entry.split('|') if '-' in q_range: # Grouped queues @@ -207,7 +210,8 @@ def test_telemetry_queue_buffer_cnt(duthosts, enum_rand_one_per_hwsku_hostname, else: pytest.skip("Invalid buffer queue range") else: - single_key = True + # Single queue entry for port such as Ethernet0|0 + is_single_queue = True # Add create_only_config_db_buffers entry to device metadata to enable # counters optimization and get number of queue counters of Ethernet0 prior @@ -217,15 +221,17 @@ def test_telemetry_queue_buffer_cnt(duthosts, enum_rand_one_per_hwsku_hostname, = "true" load_new_cfg(duthost, data) pytest_assert(wait_until(120, 20, 0, check_buffer_queues_cnt_cmd_output, ptfhost, gnxi_path, - dut_ip, interface_to_check, env.gnmi_port), "Unable to get map data") + dut_ip, interface_to_check, env.gnmi_port), + "Unable to get count of buffer queues from COUNTERS_QUEUE_NAME_MAP") pre_del_cnt = get_buffer_queues_cnt(ptfhost, gnxi_path, dut_ip, interface_to_check, env.gnmi_port) # Remove buffer queue and reload and get new number of queue counters del data['BUFFER_QUEUE'][bq_entry] load_new_cfg(duthost, data) - if not single_key: + if not is_single_queue: pytest_assert(wait_until(120, 20, 0, check_buffer_queues_cnt_cmd_output, ptfhost, gnxi_path, - dut_ip, interface_to_check, env.gnmi_port), "Unable to get map data") + dut_ip, interface_to_check, env.gnmi_port), + "Unable to get count of buffer queues from COUNTERS_QUEUE_NAME_MAP") post_del_cnt = get_buffer_queues_cnt(ptfhost, gnxi_path, dut_ip, interface_to_check, env.gnmi_port) pytest_assert(pre_del_cnt > post_del_cnt,