From ba607a7906f72ad4104a1069afa6aa8b4b302f75 Mon Sep 17 00:00:00 2001 From: Sonic Build Admin Date: Wed, 21 Jan 2026 02:23:58 +0000 Subject: [PATCH] [hft]: Fix TAM type capability enable list **What I did** Enable TAM type capability based on its type **Why I did it** The previous implementation was ambiguous **How I verified it** Check Azp **Details if related** --- .../high_frequency_telemetry/hftelprofile.cpp | 47 ++++++++++++------- tests/test_hft.py | 47 ++++++++++++++++--- 2 files changed, 70 insertions(+), 24 deletions(-) diff --git a/orchagent/high_frequency_telemetry/hftelprofile.cpp b/orchagent/high_frequency_telemetry/hftelprofile.cpp index 2d25f4be..c453d2af 100644 --- a/orchagent/high_frequency_telemetry/hftelprofile.cpp +++ b/orchagent/high_frequency_telemetry/hftelprofile.cpp @@ -706,25 +706,38 @@ sai_object_id_t HFTelProfile::getTAMTelTypeObjID(sai_object_type_t object_type) attr.value.s32 = SAI_TAM_TELEMETRY_TYPE_COUNTER_SUBSCRIPTION; attrs.push_back(attr); - attr.id = SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_PORT_STATS; - attr.value.booldata = true; - attrs.push_back(attr); - - attr.id = SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_PORT_STATS_INGRESS; - attr.value.booldata = true; - attrs.push_back(attr); - - attr.id = SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_PORT_STATS_EGRESS; - attr.value.booldata = true; - attrs.push_back(attr); + if (object_type == SAI_OBJECT_TYPE_PORT) + { + attr.id = SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_PORT_STATS; + attr.value.booldata = true; + attrs.push_back(attr); - attr.id = SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_MMU_STATS; - attr.value.booldata = true; - attrs.push_back(attr); + attr.id = SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_PORT_STATS_INGRESS; + attr.value.booldata = true; + attrs.push_back(attr); - attr.id = SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_OUTPUT_QUEUE_STATS; - attr.value.booldata = true; - attrs.push_back(attr); + attr.id = SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_PORT_STATS_EGRESS; + attr.value.booldata = true; + attrs.push_back(attr); + } + else if (object_type == SAI_OBJECT_TYPE_BUFFER_POOL || + object_type == SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP) + { + attr.id = SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_MMU_STATS; + attr.value.booldata = true; + attrs.push_back(attr); + } + else if (object_type == SAI_OBJECT_TYPE_QUEUE) + { + attr.id = SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_OUTPUT_QUEUE_STATS; + attr.value.booldata = true; + attrs.push_back(attr); + } + else + { + SWSS_LOG_THROW("Unsupported object type %s for high frequency telemetry", + sai_serialize_object_type(object_type).c_str()); + } attr.id = SAI_TAM_TEL_TYPE_ATTR_MODE ; attr.value.s32 = SAI_TAM_TEL_TYPE_MODE_SINGLE_TYPE; diff --git a/tests/test_hft.py b/tests/test_hft.py index 5b7ace4e..9a47034a 100644 --- a/tests/test_hft.py +++ b/tests/test_hft.py @@ -110,6 +110,8 @@ def get_asic_db_objects(self, dvs): asic_db, "ASIC_STATE:SAI_OBJECT_TYPE_PORT") buffer_pool_tbl = swsscommon.Table( asic_db, "ASIC_STATE:SAI_OBJECT_TYPE_BUFFER_POOL") + queue_tbl = swsscommon.Table( + asic_db, "ASIC_STATE:SAI_OBJECT_TYPE_QUEUE") return { "tam_transport": self._get_table_entries(tam_transport_tbl), @@ -124,7 +126,8 @@ def get_asic_db_objects(self, dvs): hostif_trap_tbl), "host_trap_group": self._get_table_entries(host_trap_group_tbl), "ports": self._get_table_entries(ports_tbl), - "buffer_pool": self._get_table_entries(buffer_pool_tbl) + "buffer_pool": self._get_table_entries(buffer_pool_tbl), + "queues": self._get_table_entries(queue_tbl) } def _get_table_entries(self, table): @@ -186,10 +189,19 @@ def verify_asic_db_objects(self, asic_db, groups=[(1, 1)], watermark_count=0): "SAI_TAM_TELEMETRY_TYPE_COUNTER_SUBSCRIPTION", \ "Expected tam telemetry type to be " \ "SAI_TAM_TELEMETRY_TYPE_COUNTER_SUBSCRIPTION" - assert tam_tel_type[ - "SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_PORT_STATS"] == \ - "true", \ - "Expected tam telemetry to be switch enable port stats" + enable_capability = False + enable_capability = enable_capability or tam_tel_type.get( + "SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_PORT_STATS", "false") == \ + "true" + enable_capability = enable_capability or tam_tel_type.get( + "SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_MMU_STATS", "false") == \ + "true" + enable_capability = enable_capability or tam_tel_type.get( + "SAI_TAM_TEL_TYPE_ATTR_SWITCH_ENABLE_OUTPUT_QUEUE_STATS", "false") == \ + "true" + assert enable_capability, \ + "Expected tam telemetry to have at least one enable " \ + "capability set to true" assert tam_tel_type["SAI_TAM_TEL_TYPE_ATTR_MODE"] == \ "SAI_TAM_TEL_TYPE_MODE_SINGLE_TYPE", \ "Expected tam telemetry to be mode single type" @@ -249,8 +261,8 @@ def verify_asic_db_objects(self, asic_db, groups=[(1, 1)], watermark_count=0): # Fix: Use only the object ID subscription_oid = tam_counter_sub[ "SAI_TAM_COUNTER_SUBSCRIPTION_ATTR_OBJECT_ID"] - assert (subscription_oid in asic_db["ports"] or subscription_oid in asic_db["buffer_pool"]), \ - "Expected tam counter subscription to reference port" + assert (subscription_oid in asic_db["ports"] or subscription_oid in asic_db["buffer_pool"] or subscription_oid in asic_db["queues"]), \ + "Expected tam counter subscription to reference port, buffer_pool, or queue" # Only check if we have counter subscriptions if counters_number > 0: @@ -533,6 +545,27 @@ def test_hft_missing_fields_with_disabled_status(self, dvs, testlog): self.delete_hft_group(dvs) self.delete_hft_profile(dvs) + def test_hft_buffer_queue_group(self, dvs, testlog): + """Test HFT with QUEUE (buffer queue) objects.""" + self.create_hft_profile(dvs) + self.create_hft_group(dvs, + group_name="QUEUE", + object_names="Ethernet0|7", + object_counters="PACKETS") + + time.sleep(5) + + asic_db = self.get_asic_db_objects(dvs) + self.verify_asic_db_objects(asic_db, groups=[(1, 1)]) + + self.delete_hft_group(dvs, group_name="QUEUE") + time.sleep(2) + + asic_db = self.get_asic_db_objects(dvs) + self.verify_asic_db_objects(asic_db, groups=[]) + + self.delete_hft_profile(dvs) + def test_hft_multiple_groups(self, dvs, testlog): """Test HFT with multiple groups and objects.""" # Create HFT profile and groups