Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
161 changes: 161 additions & 0 deletions gnmi_server/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
4 changes: 4 additions & 0 deletions sonic_data_client/db_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
37 changes: 22 additions & 15 deletions sonic_data_client/trie.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,27 +136,34 @@ 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
if len(keys) > 1 {
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
}
Loading
Loading