From 2c2d3822747691d10f8601a2671a26407599cfd2 Mon Sep 17 00:00:00 2001 From: Vineet Mittal Date: Tue, 16 Jun 2026 22:09:22 +0000 Subject: [PATCH] Add v2r mapping for VoQ counters in VoQ Chassis - Add v2rSystemPortVoQStats() for VoQ counter translation with wildcard, single-switch, and system-port query support - Add parseVoQName() and buildVoQJsonKey() helper functions - Add initCountersVoQNameMap() initializer function - Add getVoQCountersMap() with namespace-aware OID resolution - Add resolveVoQNamespace() for safe namespace fallback - Register */VoQs path in pathTransFuncTbl - Fix trie wildcard matching with backtracking for real switch names - Add comprehensive unit tests for VoQ translation logic Signed-off-by: Vineet Mittal --- gnmi_server/server_test.go | 161 ++++++ go.mod | 2 +- sonic_data_client/db_client.go | 4 + sonic_data_client/trie.go | 37 +- sonic_data_client/virtual_db.go | 225 +++++++++ sonic_data_client/virtual_db_test.go | 525 ++++++++++++++++++++ telemetry/telemetry_test.go | 2 +- testdata/COUNTERS:SwitchName*.txt | 236 +++++++++ testdata/COUNTERS:SwitchName.txt | 120 +++++ testdata/COUNTERS:SwitchName:SystemPort.txt | 64 +++ testdata/COUNTERS:SwitchName_single.txt | 114 +++++ testdata/COUNTERS:SwitchName_star.txt | 226 +++++++++ testdata/COUNTERS:SwitchName_sysport.txt | 58 +++ testdata/COUNTERS:oid:0x160000000091c.txt | 7 + testdata/COUNTERS:oid:0x160000000091d.txt | 7 + testdata/COUNTERS:oid:0x160000000091e.txt | 7 + testdata/COUNTERS:oid:0x160000000092a.txt | 7 + testdata/COUNTERS_VOQ_NAME_MAP.txt | 34 ++ 18 files changed, 1819 insertions(+), 17 deletions(-) create mode 100644 testdata/COUNTERS:SwitchName*.txt create mode 100644 testdata/COUNTERS:SwitchName.txt create mode 100644 testdata/COUNTERS:SwitchName:SystemPort.txt create mode 100644 testdata/COUNTERS:SwitchName_single.txt create mode 100644 testdata/COUNTERS:SwitchName_star.txt create mode 100644 testdata/COUNTERS:SwitchName_sysport.txt create mode 100644 testdata/COUNTERS:oid:0x160000000091c.txt create mode 100644 testdata/COUNTERS:oid:0x160000000091d.txt create mode 100644 testdata/COUNTERS:oid:0x160000000091e.txt create mode 100644 testdata/COUNTERS:oid:0x160000000092a.txt create mode 100644 testdata/COUNTERS_VOQ_NAME_MAP.txt diff --git a/gnmi_server/server_test.go b/gnmi_server/server_test.go index a372e8c38..381aa693d 100644 --- a/gnmi_server/server_test.go +++ b/gnmi_server/server_test.go @@ -839,6 +839,48 @@ func initFullCountersDb(t *testing.T, namespace string) { } mpi_switch_counter := loadConfig(t, "COUNTERS:oid:0x21000000000000", countersSwitch_id_Byte) loadDB(t, rclient, mpi_switch_counter) + + // VoQ name map + fileName = "../testdata/COUNTERS_VOQ_NAME_MAP.txt" + countersVoQNameMapByte, err := ioutil.ReadFile(fileName) + if err != nil { + t.Fatalf("read file %v err: %v", fileName, err) + } + mpi_voqname_map := loadConfig(t, "COUNTERS_VOQ_NAME_MAP", countersVoQNameMapByte) + loadDB(t, rclient, mpi_voqname_map) + + // VoQ OID counters + fileName = "../testdata/COUNTERS:oid:0x160000000092a.txt" + countersVoQ92aByte, err := ioutil.ReadFile(fileName) + if err != nil { + t.Fatalf("read file %v err: %v", fileName, err) + } + mpi_counter = loadConfig(t, "COUNTERS:oid:0x160000000092a", countersVoQ92aByte) + loadDB(t, rclient, mpi_counter) + + fileName = "../testdata/COUNTERS:oid:0x160000000091c.txt" + countersVoQ91cByte, err := ioutil.ReadFile(fileName) + if err != nil { + t.Fatalf("read file %v err: %v", fileName, err) + } + mpi_counter = loadConfig(t, "COUNTERS:oid:0x160000000091c", countersVoQ91cByte) + loadDB(t, rclient, mpi_counter) + + fileName = "../testdata/COUNTERS:oid:0x160000000091d.txt" + countersVoQ91dByte, err := ioutil.ReadFile(fileName) + if err != nil { + t.Fatalf("read file %v err: %v", fileName, err) + } + mpi_counter = loadConfig(t, "COUNTERS:oid:0x160000000091d", countersVoQ91dByte) + loadDB(t, rclient, mpi_counter) + + fileName = "../testdata/COUNTERS:oid:0x160000000091e.txt" + countersVoQ91eByte, err := ioutil.ReadFile(fileName) + if err != nil { + t.Fatalf("read file %v err: %v", fileName, err) + } + mpi_counter = loadConfig(t, "COUNTERS:oid:0x160000000091e", countersVoQ91eByte) + loadDB(t, rclient, mpi_counter) } func prepareConfigDb(t *testing.T, namespace string) { @@ -1122,6 +1164,48 @@ func prepareDb(t *testing.T, namespace string) { sid2_counter := loadConfig(t, "COUNTERS:oid:0x54000000004f64", sid2_byte) loadDB(t, rclient, sid2_counter) + // VoQ name map + fileName = "../testdata/COUNTERS_VOQ_NAME_MAP.txt" + countersVoQNameMapByte, err := ioutil.ReadFile(fileName) + if err != nil { + t.Fatalf("read file %v err: %v", fileName, err) + } + mpi_voqname_map := loadConfig(t, "COUNTERS_VOQ_NAME_MAP", countersVoQNameMapByte) + loadDB(t, rclient, mpi_voqname_map) + + // VoQ OID counters + fileName = "../testdata/COUNTERS:oid:0x160000000092a.txt" + countersVoQ92aByte, err := ioutil.ReadFile(fileName) + if err != nil { + t.Fatalf("read file %v err: %v", fileName, err) + } + mpi_counter = loadConfig(t, "COUNTERS:oid:0x160000000092a", countersVoQ92aByte) + loadDB(t, rclient, mpi_counter) + + fileName = "../testdata/COUNTERS:oid:0x160000000091c.txt" + countersVoQ91cByte, err := ioutil.ReadFile(fileName) + if err != nil { + t.Fatalf("read file %v err: %v", fileName, err) + } + mpi_counter = loadConfig(t, "COUNTERS:oid:0x160000000091c", countersVoQ91cByte) + loadDB(t, rclient, mpi_counter) + + fileName = "../testdata/COUNTERS:oid:0x160000000091d.txt" + countersVoQ91dByte, err := ioutil.ReadFile(fileName) + if err != nil { + t.Fatalf("read file %v err: %v", fileName, err) + } + mpi_counter = loadConfig(t, "COUNTERS:oid:0x160000000091d", countersVoQ91dByte) + loadDB(t, rclient, mpi_counter) + + fileName = "../testdata/COUNTERS:oid:0x160000000091e.txt" + countersVoQ91eByte, err := ioutil.ReadFile(fileName) + if err != nil { + t.Fatalf("read file %v err: %v", fileName, err) + } + mpi_counter = loadConfig(t, "COUNTERS:oid:0x160000000091e", countersVoQ91eByte) + loadDB(t, rclient, mpi_counter) + // Load CONFIG_DB for alias translation prepareConfigDb(t, namespace) @@ -2406,6 +2490,32 @@ func runTestSubscribe(t *testing.T, namespace string) { countersPortNameMapJsonUpdate := tmp.(map[string]interface{}) countersPortNameMapJsonUpdate["test_field"] = "test_value" + // VoQ test data + fileName = "../testdata/COUNTERS:SwitchName_star.txt" + countersSwitchNameWildVoQsByte, err := ioutil.ReadFile(fileName) + if err != nil { + t.Fatalf("read file %v err: %v", fileName, err) + } + var countersSwitchNameWildVoQsJson interface{} + json.Unmarshal(countersSwitchNameWildVoQsByte, &countersSwitchNameWildVoQsJson) + + fileName = "../testdata/COUNTERS:SwitchName_single.txt" + countersSwitchNameVoQsByte, err := ioutil.ReadFile(fileName) + if err != nil { + t.Fatalf("read file %v err: %v", fileName, err) + } + var countersSwitchNameVoQsJson interface{} + json.Unmarshal(countersSwitchNameVoQsByte, &countersSwitchNameVoQsJson) + + fileName = "../testdata/COUNTERS:SwitchName_sysport.txt" + countersSystemPortVoQsByte, err := ioutil.ReadFile(fileName) + if err != nil { + t.Fatalf("read file %v err: %v", fileName, err) + } + var countersSystemPortVoQsJson interface{} + json.Unmarshal(countersSystemPortVoQsByte, &countersSystemPortVoQsJson) + // end of VoQ test data + // for table key subscription fileName = "../testdata/COUNTERS:Ethernet68.txt" countersEthernet68Byte, err := ioutil.ReadFile(fileName) @@ -3385,6 +3495,57 @@ func runTestSubscribe(t *testing.T, namespace string) { client.Sync{}, }, }, + { + desc: "poll query for COUNTERS/SwitchName*/VoQs", + poll: 1, + q: client.Query{ + Target: "COUNTERS_DB", + Type: client.Poll, + Queries: []client.Path{{"COUNTERS", "SwitchName*", "VoQs"}}, + TLS: &tls.Config{InsecureSkipVerify: true}, + }, + wantNoti: []client.Notification{ + client.Connected{}, + client.Update{Path: []string{"COUNTERS_DB", "COUNTERS", "SwitchName*", "VoQs"}, TS: time.Unix(0, 200), Val: countersSwitchNameWildVoQsJson}, + client.Sync{}, + client.Update{Path: []string{"COUNTERS_DB", "COUNTERS", "SwitchName*", "VoQs"}, TS: time.Unix(0, 200), Val: countersSwitchNameWildVoQsJson}, + client.Sync{}, + }, + }, + { + desc: "poll query for COUNTERS/str2-7804-lc7-1/VoQs", + poll: 1, + q: client.Query{ + Target: "COUNTERS_DB", + Type: client.Poll, + Queries: []client.Path{{"COUNTERS", "str2-7804-lc7-1", "VoQs"}}, + TLS: &tls.Config{InsecureSkipVerify: true}, + }, + wantNoti: []client.Notification{ + client.Connected{}, + client.Update{Path: []string{"COUNTERS_DB", "COUNTERS", "str2-7804-lc7-1", "VoQs"}, TS: time.Unix(0, 200), Val: countersSwitchNameVoQsJson}, + client.Sync{}, + client.Update{Path: []string{"COUNTERS_DB", "COUNTERS", "str2-7804-lc7-1", "VoQs"}, TS: time.Unix(0, 200), Val: countersSwitchNameVoQsJson}, + client.Sync{}, + }, + }, + { + desc: "poll query for COUNTERS/str2-7804-lc7-1|Asic0|Ethernet68/VoQs", + poll: 1, + q: client.Query{ + Target: "COUNTERS_DB", + Type: client.Poll, + Queries: []client.Path{{"COUNTERS", "str2-7804-lc7-1|Asic0|Ethernet68", "VoQs"}}, + TLS: &tls.Config{InsecureSkipVerify: true}, + }, + wantNoti: []client.Notification{ + client.Connected{}, + client.Update{Path: []string{"COUNTERS_DB", "COUNTERS", "str2-7804-lc7-1|Asic0|Ethernet68", "VoQs"}, TS: time.Unix(0, 200), Val: countersSystemPortVoQsJson}, + client.Sync{}, + client.Update{Path: []string{"COUNTERS_DB", "COUNTERS", "str2-7804-lc7-1|Asic0|Ethernet68", "VoQs"}, TS: time.Unix(0, 200), Val: countersSystemPortVoQsJson}, + client.Sync{}, + }, + }, { desc: "poll query for COUNTERS/Ethernet68/Queues with field value change", poll: 3, diff --git a/go.mod b/go.mod index 314290ebe..8a14cd0f1 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/Azure/sonic-mgmt-common v0.0.0-00010101000000-000000000000 github.com/Workiva/go-datastructures v1.0.50 github.com/agiledragon/gomonkey/v2 v2.8.0 + github.com/alicebob/miniredis/v2 v2.35.0 github.com/c9s/goprocinfo v0.0.0-20191125144613-4acdd056c72d github.com/dgrijalva/jwt-go v3.2.1-0.20210802184156-9742bd7fca1c+incompatible github.com/fsnotify/fsnotify v1.4.7 @@ -32,7 +33,6 @@ require ( ) require ( - github.com/alicebob/miniredis/v2 v2.35.0 // indirect github.com/antchfx/jsonquery v1.1.4 // indirect github.com/antchfx/xmlquery v1.3.1 // indirect github.com/antchfx/xpath v1.1.10 // indirect diff --git a/sonic_data_client/db_client.go b/sonic_data_client/db_client.go index c00ed34d1..6b4db21b8 100644 --- a/sonic_data_client/db_client.go +++ b/sonic_data_client/db_client.go @@ -704,6 +704,10 @@ func populateDbtablePath(prefix, path *gnmipb.Path, pathG2S *map[*gnmipb.Path][] if err != nil { log.Errorf("Could not create CountersAclRuleMap: %v", err) } + err = initCountersVoQNameMap() + if err != nil { + log.Errorf("Could not create CountersVoQNameMap: %v", err) + } } fullPath := path diff --git a/sonic_data_client/trie.go b/sonic_data_client/trie.go index a6d4cf162..29050f983 100644 --- a/sonic_data_client/trie.go +++ b/sonic_data_client/trie.go @@ -136,21 +136,12 @@ func findNode(node *Node, keys []string) *Node { } if len(keys) == 0 { - return node - } - - n, ok := node.Children()[keys[0]] - if !ok { - var val string - for val, n = range node.wildcards { - if strings.HasPrefix(keys[0], val[:len(val)-1]) { - ok = true - break - } - } - if !ok { - return nil + // Only succeed if this node has a terminal child, ensuring + // backtracking tries other wildcards when a path dead-ends. + if _, ok := node.Children()[""]; ok { + return node } + return nil } var nkeys []string @@ -158,5 +149,21 @@ func findNode(node *Node, keys []string) *Node { nkeys = keys[1:] } - return findNode(n, nkeys) + // Try exact match first + if n, ok := node.Children()[keys[0]]; ok { + if result := findNode(n, nkeys); result != nil { + return result + } + } + + // Try all matching wildcards with backtracking + for val, n := range node.wildcards { + if strings.HasPrefix(keys[0], val[:len(val)-1]) { + if result := findNode(n, nkeys); result != nil { + return result + } + } + } + + return nil } diff --git a/sonic_data_client/virtual_db.go b/sonic_data_client/virtual_db.go index 015eeb565..14d5f5852 100644 --- a/sonic_data_client/virtual_db.go +++ b/sonic_data_client/virtual_db.go @@ -5,6 +5,7 @@ import ( "os" "strings" + "github.com/go-redis/redis" log "github.com/golang/glog" sdcfg "github.com/sonic-net/sonic-gnmi/sonic_db_config" ) @@ -37,6 +38,12 @@ var ( // Queue name to oid map in COUNTERS table of COUNTERS_DB countersQueueNameMap = make(map[string]string) + // VoQ name to oid map in COUNTERS table of COUNTERS_DB + countersVoQNameMap = make(map[string]string) + + // VoQ OID to namespace map (which Redis namespace holds the counter data for each OID) + countersVoQOidNamespaceMap = make(map[string]string) + // MY_SID prefix to oid map in COUNTERS table of COUNTERS_DB countersSidMap = make(map[string]string) @@ -74,6 +81,9 @@ var ( }, { // Queue stats for one or all Ethernet ports path: []string{"COUNTERS_DB", "COUNTERS", "Ethernet*", "Queues"}, transFunc: v2rTranslate(v2rEthPortQueStats), + }, { // VoQ stats for one or all System Ports + path: []string{"COUNTERS_DB", "COUNTERS", "*", "VoQs"}, + transFunc: v2rTranslate(v2rSystemPortVoQStats), }, { // PFC WD stats for one or all Ethernet ports path: []string{"COUNTERS_DB", "COUNTERS", "Ethernet*", "Pfcwd"}, transFunc: v2rTranslate(v2rEthPortPfcwdStats), @@ -189,6 +199,65 @@ func initCountersAclRuleMap() error { return nil } +func initCountersVoQNameMap() error { + var err error + if len(countersVoQNameMap) == 0 { + countersVoQNameMap, countersVoQOidNamespaceMap, err = getVoQCountersMap("COUNTERS_VOQ_NAME_MAP") + if err != nil { + return err + } + } + return nil +} + +// getVoQCountersMap loads the VoQ name-to-OID map and determines which Redis +// namespace actually holds the counter data for each OID. On multi-ASIC VoQ +// chassis devices, the name map is replicated across all namespace DBs but the +// actual counter OIDs may only exist in one namespace's COUNTERS table. +func getVoQCountersMap(tableName string) (map[string]string, map[string]string, error) { + counterMap := make(map[string]string) + oidNsMap := make(map[string]string) + dbName := "COUNTERS_DB" + redisClientMap, err := GetRedisClientsForDb(dbName) + if err != nil { + return nil, nil, err + } + + // First pass: collect name->oid mapping from all namespaces + for namespace, redisDb := range redisClientMap { + fv, err := redisDb.HGetAll(tableName).Result() + if err != nil { + log.V(2).Infof("redis HGetAll failed for COUNTERS_DB in namespace %v, tableName: %s", namespace, tableName) + return nil, nil, err + } + addmap(counterMap, fv) + log.V(6).Infof("tableName: %s in namespace %v, map entries: %d", tableName, namespace, len(fv)) + } + + // Second pass: determine which namespace has counter data for each OID + for namespace, redisDb := range redisClientMap { + keys, err := redisDb.Keys("COUNTERS:oid:*").Result() + if err != nil { + log.V(2).Infof("redis Keys failed for COUNTERS:oid:* in namespace %v: %v", namespace, err) + continue + } + existingOids := make(map[string]bool, len(keys)) + for _, key := range keys { + // "COUNTERS:oid:0x..." -> "oid:0x..." + oid := strings.TrimPrefix(key, "COUNTERS:") + existingOids[oid] = true + } + for _, oid := range counterMap { + if existingOids[oid] { + oidNsMap[oid] = namespace + } + } + } + + log.V(4).Infof("getVoQCountersMap: %d VoQ entries, %d OID-namespace mappings", len(counterMap), len(oidNsMap)) + return counterMap, oidNsMap, nil +} + func initAliasMap() error { var err error if len(alias2nameMap) == 0 { @@ -1081,6 +1150,8 @@ func ClearMappings() { alias2nameMap, countersFabricPortNameMap, countersQueueNameMap, + countersVoQNameMap, + countersVoQOidNamespaceMap, countersAclRuleMap, } for _, counterMap := range counterMaps { @@ -1139,6 +1210,160 @@ func v2rEthPortPGPeriodicWMs(paths []string) ([]tablePath, error) { return tblPaths, nil } +// parseVoQName parses VoQ name in format "str2-7804-lc7-1|Asic0|Ethernet84:3" +// Returns: switchId, asicNamespace, interfaceName, voqIndex, error +func parseVoQName(voqName string) (string, string, string, string, error) { + // Split by "|" to separate switch, asic, and interface parts + parts := strings.Split(voqName, "|") + if len(parts) != 3 { + return "", "", "", "", fmt.Errorf("invalid VoQ name format: %v, expected format: switch|asic|interface:voq", voqName) + } + + switchId := parts[0] // "str2-7804-lc7-1" + asicNamespace := parts[1] // "Asic0" + interfacePart := parts[2] // "Ethernet84:3" + + // Split interface part by ":" to get interface and VoQ index + interfaceVoq := strings.Split(interfacePart, ":") + if len(interfaceVoq) != 2 { + return "", "", "", "", fmt.Errorf("invalid interface:voq format in: %v", interfacePart) + } + + interfaceName := interfaceVoq[0] // "Ethernet84" + voqIndex := interfaceVoq[1] // "3" + + return switchId, asicNamespace, interfaceName, voqIndex, nil +} + +// buildVoQJsonKey builds the JSON key for VoQ output +func buildVoQJsonKey(switchId, asicNamespace, interfaceName, voqIndex string) string { + // Return format: "str2-7804-lc7-1|Asic0|Ethernet84:3" + return fmt.Sprintf("%s|%s|%s:%s", switchId, asicNamespace, interfaceName, voqIndex) +} + +// resolveVoQNamespace determines the correct Redis namespace for a VoQ OID. +// It checks the pre-computed oid-to-namespace map first, validates that the +// cached namespace is currently active (part of the active namespace set returned +// by GetRedisClientsForDb), and falls back to deriving the namespace from the +// VoQ name's asic component. +func resolveVoQNamespace(oid, asicNamespace string, activeNamespaces map[string]*redis.Client) string { + if ns, ok := countersVoQOidNamespaceMap[oid]; ok { + if activeNamespaces[ns] != nil { + return ns + } + } + return strings.ToLower(asicNamespace) +} + +// Populate real data paths from paths like +// [COUNTERS_DB COUNTERS SwitchName* VoQs] or [COUNTERS_DB COUNTERS SwitchName VoQs] or [COUNTERS_DB COUNTERS SwitchName|Asic|Port VoQs] +func v2rSystemPortVoQStats(paths []string) ([]tablePath, error) { + // paths[DbIdx] = "COUNTERS_DB" + separator, _ := GetTableKeySeparator(paths[DbIdx], "") + // Get the currently active Redis clients for namespace validation + activeNamespaces, _ := GetRedisClientsForDb(paths[DbIdx]) + var tblPaths []tablePath + + // VoQs on all SwitchName* (str2-7804*) + if strings.HasSuffix(paths[KeyIdx], "*") { + for voqName, oid := range countersVoQNameMap { + switchId, asicNamespace, interfaceName, voqIndex, err := parseVoQName(voqName) + if err != nil { + log.V(2).Infof("Failed to parse VoQ name %v: %v", voqName, err) + continue + } + + // Look up the namespace where this OID's counter data actually lives. + // Fall back to deriving from the VoQ name if not found or stale. + namespace := resolveVoQNamespace(oid, asicNamespace, activeNamespaces) + + // Build JSON key for output with vendor alias + jsonVoqKey := buildVoQJsonKey(switchId, asicNamespace, interfaceName, voqIndex) + + // Create table path for VoQ stats + tblPath := tablePath{ + dbNamespace: namespace, + dbName: paths[DbIdx], + tableName: paths[TblIdx], + tableKey: oid, + delimitor: separator, + jsonTableKey: jsonVoqKey, + } + tblPaths = append(tblPaths, tblPath) + } + } else if strings.Contains(paths[KeyIdx], "|") { + //VoQs on single SwitchName-SystemPort (str2-7804-lc7-1|Asic0|Ethernet84) + // Find all VoQs for this specific interface + requestedSystemPort := paths[KeyIdx] // e.g., "str2-7804-lc7-1|Asic0|Ethernet84" + for voqName, oid := range countersVoQNameMap { + // Filter: only process VoQs that match the requested system port + if !strings.Contains(voqName, requestedSystemPort) { + continue + } + + switchId, asicNamespace, interfaceName, voqIndex, err := parseVoQName(voqName) + if err != nil { + log.V(2).Infof("Failed to parse VoQ name %v: %v", voqName, err) + continue + } + + // Look up the namespace where this OID's counter data actually lives. + // Fall back to deriving from the VoQ name if not found or stale. + namespace := resolveVoQNamespace(oid, asicNamespace, activeNamespaces) + + // Build JSON key for output with requested interface name (could be alias) + jsonVoqKey := buildVoQJsonKey(switchId, asicNamespace, interfaceName, voqIndex) + + // Create table path for VoQ stats + tblPath := tablePath{ + dbNamespace: namespace, + dbName: paths[DbIdx], + tableName: paths[TblIdx], + tableKey: oid, + delimitor: separator, + jsonTableKey: jsonVoqKey, + } + tblPaths = append(tblPaths, tblPath) + } + } else { + //VoQs on single SwitchName (str2-7804-lc7-1) + // Find all VoQs for this specific SwitchName + requestedSwitchName := paths[KeyIdx] // e.g., "str2-7804-lc7-1" + for voqName, oid := range countersVoQNameMap { + // Filter: only process VoQs that match the requested switch name + if !strings.HasPrefix(voqName, requestedSwitchName+"|") { + continue + } + + switchId, asicNamespace, interfaceName, voqIndex, err := parseVoQName(voqName) + if err != nil { + log.V(2).Infof("Failed to parse VoQ name %v: %v", voqName, err) + continue + } + + // Look up the namespace where this OID's counter data actually lives. + // Fall back to deriving from the VoQ name if not found or stale. + namespace := resolveVoQNamespace(oid, asicNamespace, activeNamespaces) + + // Build JSON key for output with requested interface name (could be alias) + jsonVoqKey := buildVoQJsonKey(switchId, asicNamespace, interfaceName, voqIndex) + + // Create table path for VoQ stats + tblPath := tablePath{ + dbNamespace: namespace, + dbName: paths[DbIdx], + tableName: paths[TblIdx], + tableKey: oid, + delimitor: separator, + jsonTableKey: jsonVoqKey, + } + tblPaths = append(tblPaths, tblPath) + } + } + log.V(6).Infof("v2rSystemPortVoQStats: %v", tblPaths) + return tblPaths, nil +} + func lookupV2R(paths []string) ([]tablePath, error) { n, ok := v2rTrie.Find(paths) if ok { diff --git a/sonic_data_client/virtual_db_test.go b/sonic_data_client/virtual_db_test.go index dc1da8325..079caaa33 100644 --- a/sonic_data_client/virtual_db_test.go +++ b/sonic_data_client/virtual_db_test.go @@ -4,6 +4,8 @@ import ( "sort" "testing" + "github.com/alicebob/miniredis/v2" + "github.com/go-redis/redis" sdcfg "github.com/sonic-net/sonic-gnmi/sonic_db_config" ) @@ -356,3 +358,526 @@ func TestV2rPortPhyAttrFieldStats_SingleMissingNamespace(t *testing.T) { t.Fatal("expected error for port missing namespace, got nil") } } + +// -------------------------------------------------------------------------- +// Tests for Trie findNode backtracking (trie.go) +// -------------------------------------------------------------------------- + +func TestTrieBacktracking_VoQOverEthernet(t *testing.T) { + // Ensure the global trie correctly routes VoQ paths through the "*" wildcard + // when "Ethernet*" is also present at the same level. + sdcfg.Init() + + // "str2-7804-lc7-1" with "VoQs" suffix should match "*" -> "VoQs" (VoQ handler) + keys := []string{"COUNTERS_DB", "COUNTERS", "str2-7804-lc7-1", "VoQs"} + node, ok := v2rTrie.Find(keys) + if !ok || node == nil { + t.Fatal("expected trie to find VoQ path for str2-7804-lc7-1/VoQs") + } + + // "str2-7804-lc7-1|Asic0|Ethernet68" with "VoQs" should also match + keys = []string{"COUNTERS_DB", "COUNTERS", "str2-7804-lc7-1|Asic0|Ethernet68", "VoQs"} + node, ok = v2rTrie.Find(keys) + if !ok || node == nil { + t.Fatal("expected trie to find VoQ path for system port/VoQs") + } +} + +func TestTrieBacktracking_EthernetStillWorks(t *testing.T) { + sdcfg.Init() + + // "Ethernet68" alone should still match "Ethernet*" (port stats) + keys := []string{"COUNTERS_DB", "COUNTERS", "Ethernet68"} + node, ok := v2rTrie.Find(keys) + if !ok || node == nil { + t.Fatal("expected trie to find Ethernet port stats path") + } + + // "Ethernet68" with "Queues" should match "Ethernet*" -> "Queues" + keys = []string{"COUNTERS_DB", "COUNTERS", "Ethernet68", "Queues"} + node, ok = v2rTrie.Find(keys) + if !ok || node == nil { + t.Fatal("expected trie to find Ethernet queue stats path") + } + + // "Ethernet68" with a field should match "Ethernet*" -> "*" + keys = []string{"COUNTERS_DB", "COUNTERS", "Ethernet68", "SAI_PORT_STAT_IF_IN_OCTETS"} + node, ok = v2rTrie.Find(keys) + if !ok || node == nil { + t.Fatal("expected trie to find Ethernet field stats path") + } +} + +func TestTrieBacktracking_NonExistentPath(t *testing.T) { + sdcfg.Init() + + // Path that doesn't match anything + keys := []string{"COUNTERS_DB", "COUNTERS", "str2-7804-lc7-1", "NonExistent"} + _, ok := v2rTrie.Find(keys) + if ok { + t.Fatal("expected trie NOT to find non-existent path") + } +} + +// -------------------------------------------------------------------------- +// Tests for parseVoQName (virtual_db.go) +// -------------------------------------------------------------------------- + +func TestParseVoQName_Valid(t *testing.T) { + switchId, asicNs, ifName, voqIdx, err := parseVoQName("str2-7804-lc7-1|Asic0|Ethernet84:3") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if switchId != "str2-7804-lc7-1" { + t.Errorf("switchId = %q, want str2-7804-lc7-1", switchId) + } + if asicNs != "Asic0" { + t.Errorf("asicNamespace = %q, want Asic0", asicNs) + } + if ifName != "Ethernet84" { + t.Errorf("interfaceName = %q, want Ethernet84", ifName) + } + if voqIdx != "3" { + t.Errorf("voqIndex = %q, want 3", voqIdx) + } +} + +func TestParseVoQName_InvalidPipeParts(t *testing.T) { + _, _, _, _, err := parseVoQName("str2-7804-lc7-1|Asic0") + if err == nil { + t.Fatal("expected error for only 2 pipe-separated parts") + } +} + +func TestParseVoQName_InvalidInterfaceFormat(t *testing.T) { + _, _, _, _, err := parseVoQName("str2-7804-lc7-1|Asic0|Ethernet84") + if err == nil { + t.Fatal("expected error for missing colon in interface:voq") + } +} + +// -------------------------------------------------------------------------- +// Tests for buildVoQJsonKey (virtual_db.go) +// -------------------------------------------------------------------------- + +func TestBuildVoQJsonKey(t *testing.T) { + key := buildVoQJsonKey("str2-7804-lc7-1", "Asic0", "Ethernet84", "3") + expected := "str2-7804-lc7-1|Asic0|Ethernet84:3" + if key != expected { + t.Errorf("got %q, want %q", key, expected) + } +} + +// -------------------------------------------------------------------------- +// Tests for resolveVoQNamespace (virtual_db.go) +// -------------------------------------------------------------------------- + +func TestResolveVoQNamespace_FoundInMap(t *testing.T) { + origMap := countersVoQOidNamespaceMap + defer func() { countersVoQOidNamespaceMap = origMap }() + + countersVoQOidNamespaceMap = map[string]string{ + "oid:0x123": "asic0", + } + + activeNs := map[string]*redis.Client{ + "asic0": redis.NewClient(&redis.Options{Addr: "localhost:6379"}), + } + + ns := resolveVoQNamespace("oid:0x123", "Asic1", activeNs) + if ns != "asic0" { + t.Errorf("got %q, want asic0", ns) + } +} + +func TestResolveVoQNamespace_StaleNamespace(t *testing.T) { + origMap := countersVoQOidNamespaceMap + defer func() { countersVoQOidNamespaceMap = origMap }() + + countersVoQOidNamespaceMap = map[string]string{ + "oid:0x123": "asic2", // mapped to asic2 + } + + // activeNamespaces does NOT contain asic2 + activeNs := map[string]*redis.Client{ + "asic0": redis.NewClient(&redis.Options{Addr: "localhost:6379"}), + } + + ns := resolveVoQNamespace("oid:0x123", "Asic1", activeNs) + if ns != "asic1" { // falls back to lower(asicNamespace) + t.Errorf("got %q, want asic1", ns) + } +} + +func TestResolveVoQNamespace_NotInMap(t *testing.T) { + origMap := countersVoQOidNamespaceMap + defer func() { countersVoQOidNamespaceMap = origMap }() + + countersVoQOidNamespaceMap = map[string]string{} + + activeNs := map[string]*redis.Client{ + "asic0": redis.NewClient(&redis.Options{Addr: "localhost:6379"}), + } + + ns := resolveVoQNamespace("oid:0x999", "Asic0", activeNs) + if ns != "asic0" { // falls back to lower(asicNamespace) + t.Errorf("got %q, want asic0", ns) + } +} + +// -------------------------------------------------------------------------- +// Tests for v2rSystemPortVoQStats (virtual_db.go) +// -------------------------------------------------------------------------- + +func setupVoQMaps(t *testing.T) func() { + t.Helper() + + origVoQNameMap := countersVoQNameMap + origVoQOidNsMap := countersVoQOidNamespaceMap + origTarget2Redis := Target2RedisDb + + countersVoQNameMap = map[string]string{ + "str2-7804-lc7-1|Asic0|Ethernet68:0": "oid:0x160000000091c", + "str2-7804-lc7-1|Asic0|Ethernet68:1": "oid:0x160000000091d", + "str2-7804-lc7-1|Asic0|Ethernet84:0": "oid:0x160000000091e", + "str2-7804-lc7-1|Asic0|Ethernet84:1": "oid:0x160000000092a", + } + countersVoQOidNamespaceMap = map[string]string{ + "oid:0x160000000091c": "", + "oid:0x160000000091d": "", + "oid:0x160000000091e": "", + "oid:0x160000000092a": "", + } + + // Set up a minimal Target2RedisDb so GetRedisClientsForDb returns a client + Target2RedisDb = map[string]map[string]*redis.Client{ + "": { + "COUNTERS_DB": redis.NewClient(&redis.Options{Addr: "localhost:6379"}), + }, + } + + return func() { + countersVoQNameMap = origVoQNameMap + countersVoQOidNamespaceMap = origVoQOidNsMap + Target2RedisDb = origTarget2Redis + } +} + +func TestV2rSystemPortVoQStats_Wildcard(t *testing.T) { + sdcfg.Init() + restore := setupVoQMaps(t) + defer restore() + + paths := []string{"COUNTERS_DB", "COUNTERS", "SwitchName*", "VoQs"} + tblPaths, err := v2rSystemPortVoQStats(paths) + if err != nil { + t.Fatalf("v2rSystemPortVoQStats returned error: %v", err) + } + if len(tblPaths) != 4 { + t.Fatalf("expected 4 table paths, got %d", len(tblPaths)) + } + + // Verify all paths have expected fields + for _, tp := range tblPaths { + if tp.dbName != "COUNTERS_DB" { + t.Errorf("dbName = %q, want COUNTERS_DB", tp.dbName) + } + if tp.tableName != "COUNTERS" { + t.Errorf("tableName = %q, want COUNTERS", tp.tableName) + } + if tp.jsonTableKey == "" { + t.Error("jsonTableKey should not be empty for wildcard VoQ query") + } + } +} + +func TestV2rSystemPortVoQStats_SingleSwitch(t *testing.T) { + sdcfg.Init() + restore := setupVoQMaps(t) + defer restore() + + paths := []string{"COUNTERS_DB", "COUNTERS", "str2-7804-lc7-1", "VoQs"} + tblPaths, err := v2rSystemPortVoQStats(paths) + if err != nil { + t.Fatalf("v2rSystemPortVoQStats returned error: %v", err) + } + // All 4 VoQs belong to str2-7804-lc7-1 + if len(tblPaths) != 4 { + t.Fatalf("expected 4 table paths for single switch, got %d", len(tblPaths)) + } +} + +func TestV2rSystemPortVoQStats_SystemPort(t *testing.T) { + sdcfg.Init() + restore := setupVoQMaps(t) + defer restore() + + paths := []string{"COUNTERS_DB", "COUNTERS", "str2-7804-lc7-1|Asic0|Ethernet68", "VoQs"} + tblPaths, err := v2rSystemPortVoQStats(paths) + if err != nil { + t.Fatalf("v2rSystemPortVoQStats returned error: %v", err) + } + // Only 2 VoQs match Ethernet68 + if len(tblPaths) != 2 { + t.Fatalf("expected 2 table paths for system port, got %d", len(tblPaths)) + } + + sort.Slice(tblPaths, func(i, j int) bool { + return tblPaths[i].jsonTableKey < tblPaths[j].jsonTableKey + }) + + if tblPaths[0].jsonTableKey != "str2-7804-lc7-1|Asic0|Ethernet68:0" { + t.Errorf("jsonTableKey = %q, want str2-7804-lc7-1|Asic0|Ethernet68:0", tblPaths[0].jsonTableKey) + } + if tblPaths[1].jsonTableKey != "str2-7804-lc7-1|Asic0|Ethernet68:1" { + t.Errorf("jsonTableKey = %q, want str2-7804-lc7-1|Asic0|Ethernet68:1", tblPaths[1].jsonTableKey) + } +} + +func TestV2rSystemPortVoQStats_NoMatch(t *testing.T) { + sdcfg.Init() + restore := setupVoQMaps(t) + defer restore() + + // Query for a switch name that doesn't exist in the map + paths := []string{"COUNTERS_DB", "COUNTERS", "nonexistent-switch", "VoQs"} + tblPaths, err := v2rSystemPortVoQStats(paths) + if err != nil { + t.Fatalf("v2rSystemPortVoQStats returned error: %v", err) + } + if len(tblPaths) != 0 { + t.Errorf("expected 0 table paths for non-existent switch, got %d", len(tblPaths)) + } +} + +func TestV2rSystemPortVoQStats_SystemPortNoMatch(t *testing.T) { + sdcfg.Init() + restore := setupVoQMaps(t) + defer restore() + + paths := []string{"COUNTERS_DB", "COUNTERS", "str2-7804-lc7-1|Asic0|Ethernet99", "VoQs"} + tblPaths, err := v2rSystemPortVoQStats(paths) + if err != nil { + t.Fatalf("v2rSystemPortVoQStats returned error: %v", err) + } + if len(tblPaths) != 0 { + t.Errorf("expected 0 table paths for non-existent system port, got %d", len(tblPaths)) + } +} + +// -------------------------------------------------------------------------- +// Tests for getVoQCountersMap (virtual_db.go) - uses miniredis +// -------------------------------------------------------------------------- + +func setupMiniredisForVoQ(t *testing.T) (*miniredis.Miniredis, func()) { + t.Helper() + + mr := miniredis.RunT(t) + + // Populate COUNTERS_VOQ_NAME_MAP hash + mr.HSet("COUNTERS_VOQ_NAME_MAP", "str2-7804-lc7-1|Asic0|Ethernet84:0", "oid:0x160000000091c") + mr.HSet("COUNTERS_VOQ_NAME_MAP", "str2-7804-lc7-1|Asic0|Ethernet84:1", "oid:0x160000000091d") + + // Populate COUNTERS:oid:* keys so the second pass can find them + mr.Set("COUNTERS:oid:0x160000000091c", "exists") + mr.Set("COUNTERS:oid:0x160000000091d", "exists") + + origTarget := Target2RedisDb + ns, _ := sdcfg.GetDbDefaultNamespace() + Target2RedisDb = map[string]map[string]*redis.Client{ + ns: { + "COUNTERS_DB": redis.NewClient(&redis.Options{Addr: mr.Addr()}), + }, + } + + return mr, func() { + Target2RedisDb = origTarget + } +} + +func TestGetVoQCountersMap_Success(t *testing.T) { + sdcfg.Init() + _, restore := setupMiniredisForVoQ(t) + defer restore() + + counterMap, oidNsMap, err := getVoQCountersMap("COUNTERS_VOQ_NAME_MAP") + if err != nil { + t.Fatalf("getVoQCountersMap returned error: %v", err) + } + if len(counterMap) != 2 { + t.Errorf("expected 2 entries in counterMap, got %d", len(counterMap)) + } + if counterMap["str2-7804-lc7-1|Asic0|Ethernet84:0"] != "oid:0x160000000091c" { + t.Errorf("unexpected OID for Ethernet84:0: %v", counterMap["str2-7804-lc7-1|Asic0|Ethernet84:0"]) + } + if len(oidNsMap) != 2 { + t.Errorf("expected 2 OID-namespace mappings, got %d", len(oidNsMap)) + } +} + +func TestGetVoQCountersMap_EmptyTable(t *testing.T) { + sdcfg.Init() + mr := miniredis.RunT(t) + + origTarget := Target2RedisDb + ns, _ := sdcfg.GetDbDefaultNamespace() + Target2RedisDb = map[string]map[string]*redis.Client{ + ns: { + "COUNTERS_DB": redis.NewClient(&redis.Options{Addr: mr.Addr()}), + }, + } + defer func() { Target2RedisDb = origTarget }() + + counterMap, oidNsMap, err := getVoQCountersMap("COUNTERS_VOQ_NAME_MAP") + if err != nil { + t.Fatalf("getVoQCountersMap returned error: %v", err) + } + if len(counterMap) != 0 { + t.Errorf("expected 0 entries, got %d", len(counterMap)) + } + if len(oidNsMap) != 0 { + t.Errorf("expected 0 OID-namespace mappings, got %d", len(oidNsMap)) + } +} + +func TestGetVoQCountersMap_NoRedisClients(t *testing.T) { + sdcfg.Init() + + origTarget := Target2RedisDb + Target2RedisDb = map[string]map[string]*redis.Client{} + defer func() { Target2RedisDb = origTarget }() + + // With no Redis clients, GetRedisClientsForDb returns empty map + counterMap, oidNsMap, err := getVoQCountersMap("COUNTERS_VOQ_NAME_MAP") + if err != nil { + t.Fatalf("getVoQCountersMap returned error: %v", err) + } + if len(counterMap) != 0 { + t.Errorf("expected 0 entries, got %d", len(counterMap)) + } + if len(oidNsMap) != 0 { + t.Errorf("expected 0 OID-namespace mappings, got %d", len(oidNsMap)) + } +} + +// -------------------------------------------------------------------------- +// Tests for initCountersVoQNameMap (virtual_db.go) +// -------------------------------------------------------------------------- + +func TestInitCountersVoQNameMap_Success(t *testing.T) { + sdcfg.Init() + _, restore := setupMiniredisForVoQ(t) + defer restore() + + origVoQMap := countersVoQNameMap + origVoQOidMap := countersVoQOidNamespaceMap + countersVoQNameMap = make(map[string]string) + countersVoQOidNamespaceMap = make(map[string]string) + defer func() { + countersVoQNameMap = origVoQMap + countersVoQOidNamespaceMap = origVoQOidMap + }() + + err := initCountersVoQNameMap() + if err != nil { + t.Fatalf("initCountersVoQNameMap returned error: %v", err) + } + if len(countersVoQNameMap) != 2 { + t.Errorf("expected 2 VoQ entries, got %d", len(countersVoQNameMap)) + } +} + +func TestInitCountersVoQNameMap_AlreadyPopulated(t *testing.T) { + sdcfg.Init() + + origVoQMap := countersVoQNameMap + countersVoQNameMap = map[string]string{"existing": "oid:0x1"} + defer func() { countersVoQNameMap = origVoQMap }() + + // Should not re-initialize if already populated + err := initCountersVoQNameMap() + if err != nil { + t.Fatalf("initCountersVoQNameMap returned error: %v", err) + } + if len(countersVoQNameMap) != 1 { + t.Errorf("should not have re-initialized, expected 1, got %d", len(countersVoQNameMap)) + } +} + +// -------------------------------------------------------------------------- +// Tests for v2rSystemPortVoQStats with invalid VoQ names (error branches) +// -------------------------------------------------------------------------- + +func TestV2rSystemPortVoQStats_InvalidVoQName_Wildcard(t *testing.T) { + sdcfg.Init() + restore := setupVoQMaps(t) + defer restore() + + // Add an invalid VoQ name (missing colon separator) + countersVoQNameMap["badformat-no-pipes"] = "oid:0xBAD1" + + paths := []string{"COUNTERS_DB", "COUNTERS", "SwitchName*", "VoQs"} + tblPaths, err := v2rSystemPortVoQStats(paths) + if err != nil { + t.Fatalf("v2rSystemPortVoQStats returned error: %v", err) + } + // Should still get 4 valid paths (the invalid one is skipped) + if len(tblPaths) != 4 { + t.Errorf("expected 4 valid table paths, got %d", len(tblPaths)) + } +} + +func TestV2rSystemPortVoQStats_InvalidVoQName_SystemPort(t *testing.T) { + sdcfg.Init() + restore := setupVoQMaps(t) + defer restore() + + // Add an invalid VoQ name that contains the requested system port string + countersVoQNameMap["str2-7804-lc7-1|Asic0|Ethernet68-nocoIndex"] = "oid:0xBAD2" + + paths := []string{"COUNTERS_DB", "COUNTERS", "str2-7804-lc7-1|Asic0|Ethernet68", "VoQs"} + tblPaths, err := v2rSystemPortVoQStats(paths) + if err != nil { + t.Fatalf("v2rSystemPortVoQStats returned error: %v", err) + } + // Should get 2 valid paths (Ethernet68:0 and Ethernet68:1), the invalid one is skipped + if len(tblPaths) != 2 { + t.Errorf("expected 2 valid table paths, got %d", len(tblPaths)) + } +} + +func TestV2rSystemPortVoQStats_InvalidVoQName_SingleSwitch(t *testing.T) { + sdcfg.Init() + restore := setupVoQMaps(t) + defer restore() + + // Add an invalid VoQ name that starts with "str2-7804-lc7-1|" but has bad format + countersVoQNameMap["str2-7804-lc7-1|BadNoThirdPipe"] = "oid:0xBAD3" + + paths := []string{"COUNTERS_DB", "COUNTERS", "str2-7804-lc7-1", "VoQs"} + tblPaths, err := v2rSystemPortVoQStats(paths) + if err != nil { + t.Fatalf("v2rSystemPortVoQStats returned error: %v", err) + } + // Should get 4 valid paths (the invalid one is skipped) + if len(tblPaths) != 4 { + t.Errorf("expected 4 valid table paths, got %d", len(tblPaths)) + } +} + +// -------------------------------------------------------------------------- +// Tests for trie findNode dead-end (trie.go line 144) +// -------------------------------------------------------------------------- + +func TestTrieBacktracking_DeadEndAtNonTerminal(t *testing.T) { + sdcfg.Init() + + // Search for a path that matches "*" wildcard at COUNTERS level but + // "*" node is non-terminal (it has "VoQs" child but no "" terminal). + // This exercises line 144 (return nil when keys==0 at non-terminal). + keys := []string{"COUNTERS_DB", "COUNTERS", "random-switch-name"} + _, ok := v2rTrie.Find(keys) + if ok { + t.Fatal("expected trie NOT to find path ending at non-terminal node") + } +} diff --git a/telemetry/telemetry_test.go b/telemetry/telemetry_test.go index 21ce8fa41..704d743cf 100644 --- a/telemetry/telemetry_test.go +++ b/telemetry/telemetry_test.go @@ -1278,7 +1278,7 @@ func TestINotifyCertMonitoringCertValidationFails(t *testing.T) { testServerCert := filepath.Join(tmpDir, "server.crt") testServerKey := filepath.Join(tmpDir, "server.key") - timeoutInterval := 5 + timeoutInterval := 10 ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeoutInterval)*time.Second) defer cancel() diff --git a/testdata/COUNTERS:SwitchName*.txt b/testdata/COUNTERS:SwitchName*.txt new file mode 100644 index 000000000..d8e5a8616 --- /dev/null +++ b/testdata/COUNTERS:SwitchName*.txt @@ -0,0 +1,236 @@ +{ + "sonic-db:COUNTERS_DB": { + "str2-7804-lc7-1": { + "COUNTERS": { + "str2-7804-lc7-1|Asic0|Ethernet0:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + } + } + } + "str2-7804-lc7-2": { + "COUNTERS": { + "str2-7804-lc7-2|Asic0|Ethernet0:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet0:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet0:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet0:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet0:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet0:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet0:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet0:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet68:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet68:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet68:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet68:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet68:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet68:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet68:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-2|Asic0|Ethernet68:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + } + } + } + } +} diff --git a/testdata/COUNTERS:SwitchName.txt b/testdata/COUNTERS:SwitchName.txt new file mode 100644 index 000000000..7ad49b909 --- /dev/null +++ b/testdata/COUNTERS:SwitchName.txt @@ -0,0 +1,120 @@ +{ + "sonic-db:COUNTERS_DB": { + "str2-7804-lc7-1": { + "COUNTERS": { + "str2-7804-lc7-1|Asic0|Ethernet0:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet0:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + } + } + } + } +} diff --git a/testdata/COUNTERS:SwitchName:SystemPort.txt b/testdata/COUNTERS:SwitchName:SystemPort.txt new file mode 100644 index 000000000..5d7aaae66 --- /dev/null +++ b/testdata/COUNTERS:SwitchName:SystemPort.txt @@ -0,0 +1,64 @@ +{ + "sonic-db:COUNTERS_DB": { + "str2-7804-lc7-1": { + "COUNTERS": { + "str2-7804-lc7-1|Asic0|Ethernet68:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + }, + "str2-7804-lc7-1|Asic0|Ethernet68:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36", + } + } + } + } +} diff --git a/testdata/COUNTERS:SwitchName_single.txt b/testdata/COUNTERS:SwitchName_single.txt new file mode 100644 index 000000000..b553af27b --- /dev/null +++ b/testdata/COUNTERS:SwitchName_single.txt @@ -0,0 +1,114 @@ +{ + "str2-7804-lc7-1|Asic0|Ethernet0:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + } +} diff --git a/testdata/COUNTERS:SwitchName_star.txt b/testdata/COUNTERS:SwitchName_star.txt new file mode 100644 index 000000000..afd886195 --- /dev/null +++ b/testdata/COUNTERS:SwitchName_star.txt @@ -0,0 +1,226 @@ +{ + "str2-7804-lc7-1|Asic0|Ethernet0:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet0:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet0:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet0:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet0:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet0:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet0:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet0:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet0:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet0:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet68:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet68:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet68:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet68:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet68:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet68:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet68:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-2|Asic0|Ethernet68:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + } +} diff --git a/testdata/COUNTERS:SwitchName_sysport.txt b/testdata/COUNTERS:SwitchName_sysport.txt new file mode 100644 index 000000000..b6b51b4d9 --- /dev/null +++ b/testdata/COUNTERS:SwitchName_sysport.txt @@ -0,0 +1,58 @@ +{ + "str2-7804-lc7-1|Asic0|Ethernet68:0": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:1": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:2": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:3": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:4": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:5": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:6": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + }, + "str2-7804-lc7-1|Asic0|Ethernet68:7": { + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" + } +} diff --git a/testdata/COUNTERS:oid:0x160000000091c.txt b/testdata/COUNTERS:oid:0x160000000091c.txt new file mode 100644 index 000000000..20daec4b4 --- /dev/null +++ b/testdata/COUNTERS:oid:0x160000000091c.txt @@ -0,0 +1,7 @@ +{ + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" +} diff --git a/testdata/COUNTERS:oid:0x160000000091d.txt b/testdata/COUNTERS:oid:0x160000000091d.txt new file mode 100644 index 000000000..20daec4b4 --- /dev/null +++ b/testdata/COUNTERS:oid:0x160000000091d.txt @@ -0,0 +1,7 @@ +{ + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" +} diff --git a/testdata/COUNTERS:oid:0x160000000091e.txt b/testdata/COUNTERS:oid:0x160000000091e.txt new file mode 100644 index 000000000..20daec4b4 --- /dev/null +++ b/testdata/COUNTERS:oid:0x160000000091e.txt @@ -0,0 +1,7 @@ +{ + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" +} diff --git a/testdata/COUNTERS:oid:0x160000000092a.txt b/testdata/COUNTERS:oid:0x160000000092a.txt new file mode 100644 index 000000000..20daec4b4 --- /dev/null +++ b/testdata/COUNTERS:oid:0x160000000092a.txt @@ -0,0 +1,7 @@ +{ + "SAI_QUEUE_STAT_DROPPED_BYTES": "4545", + "SAI_QUEUE_STAT_DROPPED_PACKETS": "0", + "SAI_QUEUE_STAT_CREDIT_WD_DELETED_PACKETS": "0", + "SAI_QUEUE_STAT_BYTES": "0", + "SAI_QUEUE_STAT_PACKETS": "36" +} diff --git a/testdata/COUNTERS_VOQ_NAME_MAP.txt b/testdata/COUNTERS_VOQ_NAME_MAP.txt new file mode 100644 index 000000000..2216b9b75 --- /dev/null +++ b/testdata/COUNTERS_VOQ_NAME_MAP.txt @@ -0,0 +1,34 @@ +{ + "str2-7804-lc7-1|Asic0|Ethernet0:0": "oid:0x160000000092a", + "str2-7804-lc7-1|Asic0|Ethernet0:1": "oid:0x160000000091c", + "str2-7804-lc7-1|Asic0|Ethernet0:2": "oid:0x160000000091d", + "str2-7804-lc7-1|Asic0|Ethernet0:3": "oid:0x160000000091e", + "str2-7804-lc7-1|Asic0|Ethernet0:4": "oid:0x160000000092a", + "str2-7804-lc7-1|Asic0|Ethernet0:5": "oid:0x160000000091c", + "str2-7804-lc7-1|Asic0|Ethernet0:6": "oid:0x160000000091d", + "str2-7804-lc7-1|Asic0|Ethernet0:7": "oid:0x160000000091e", + "str2-7804-lc7-2|Asic0|Ethernet0:0": "oid:0x160000000092a", + "str2-7804-lc7-2|Asic0|Ethernet0:1": "oid:0x160000000091c", + "str2-7804-lc7-2|Asic0|Ethernet0:2": "oid:0x160000000091d", + "str2-7804-lc7-2|Asic0|Ethernet0:3": "oid:0x160000000091e", + "str2-7804-lc7-2|Asic0|Ethernet0:4": "oid:0x160000000092a", + "str2-7804-lc7-2|Asic0|Ethernet0:5": "oid:0x160000000091c", + "str2-7804-lc7-2|Asic0|Ethernet0:6": "oid:0x160000000091d", + "str2-7804-lc7-2|Asic0|Ethernet0:7": "oid:0x160000000091e", + "str2-7804-lc7-1|Asic0|Ethernet68:0": "oid:0x160000000092a", + "str2-7804-lc7-1|Asic0|Ethernet68:1": "oid:0x160000000091c", + "str2-7804-lc7-1|Asic0|Ethernet68:2": "oid:0x160000000091d", + "str2-7804-lc7-1|Asic0|Ethernet68:3": "oid:0x160000000091e", + "str2-7804-lc7-1|Asic0|Ethernet68:4": "oid:0x160000000092a", + "str2-7804-lc7-1|Asic0|Ethernet68:5": "oid:0x160000000091c", + "str2-7804-lc7-1|Asic0|Ethernet68:6": "oid:0x160000000091d", + "str2-7804-lc7-1|Asic0|Ethernet68:7": "oid:0x160000000091e", + "str2-7804-lc7-2|Asic0|Ethernet68:0": "oid:0x160000000092a", + "str2-7804-lc7-2|Asic0|Ethernet68:1": "oid:0x160000000091c", + "str2-7804-lc7-2|Asic0|Ethernet68:2": "oid:0x160000000091d", + "str2-7804-lc7-2|Asic0|Ethernet68:3": "oid:0x160000000091e", + "str2-7804-lc7-2|Asic0|Ethernet68:4": "oid:0x160000000092a", + "str2-7804-lc7-2|Asic0|Ethernet68:5": "oid:0x160000000091c", + "str2-7804-lc7-2|Asic0|Ethernet68:6": "oid:0x160000000091d", + "str2-7804-lc7-2|Asic0|Ethernet68:7": "oid:0x160000000091e" +}