Skip to content
Merged
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
173 changes: 169 additions & 4 deletions sdn_tests/pins_ondatra/tests/gnmi_stress_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,12 @@ import (
"context"
"fmt"
"math/rand"
"sync"
"testing"
"time"

"github.com/sonic-net/sonic-mgmt/sdn_tests/pins_ondatra/infrastructure/binding/pinsbind"
"github.com/sonic-net/sonic-mgmt/sdn_tests/pins_ondatra/infrastructure/testhelper/testhelper"
gst "github.com/sonic-net/sonic-mgmt/sdn_tests/pins_ondatra/tests/ondatra/gnmi_stress_helper"
"github.com/sonic-net/sonic-mgmt/sdn_tests/pins_ondatra/infrastructure/binding/pinsbind"
"github.com/sonic-net/sonic-mgmt/sdn_tests/pins_ondatra/infrastructure/testhelper/testhelper"
gst "github.com/sonic-net/sonic-mgmt/sdn_tests/pins_ondatra/tests/gnmi_stress_helper"

gpb "github.com/openconfig/gnmi/proto/gnmi"
"github.com/openconfig/ondatra"
Expand All @@ -23,6 +22,36 @@ func TestMain(m *testing.M) {
ondatra.RunTests(m, pinsbind.New)
}

// gNMI load test - Replacing a single leaf 100 times.
func TestGNMILoadTest(t *testing.T) {
defer testhelper.NewTearDownOptions(t).WithID("f5e40be6-9913-4926-8d69-505e51f566f1").Teardown(t)
dut := ondatra.DUT(t, "DUT")
port, err := testhelper.RandomInterface(t, dut, nil)
if err != nil {
t.Fatalf("Failed to fetch random interface: %v", err)
}
oldMtu := gnmi.Get(t, dut, gnmi.OC().Interface(port).Mtu().Config())
gst.SanityCheck(t, dut, port)

for i := gst.MinMtuStepInc; i < gst.MaxMtuStepInc; i++ {
// Configure port MTU and verify that state path reflects configured MTU.
mtu := uint16(1500 + i)
gnmi.Replace(t, dut, gnmi.OC().Interface(port).Mtu().Config(), mtu)
gst.CollectPerformanceMetrics(t, dut)
got := gnmi.Get(t, dut, gnmi.OC().Interface(port).Mtu().Config())
if got != mtu {
t.Errorf("MTU matched failed! got:%v, want:%v", got, mtu)
}
}
t.Logf("After 10 seconds of idle time, the performance metrics are:")
time.Sleep(gst.IdleTime * time.Second)
gst.CollectPerformanceMetrics(t, dut)
// Replace the old MTU value as a test cleanup.
gnmi.Replace(t, dut, gnmi.OC().Interface(port).Mtu().Config(), oldMtu)
gst.SanityCheck(t, dut, port)

}

// gNMI load test short interval(30 minutes).
func TestGNMIShortStressTest(t *testing.T) {
defer testhelper.NewTearDownOptions(t).WithID("44fa854f-5d85-42aa-9ad0-4ee8dbce7f10").Teardown(t)
Expand All @@ -31,6 +60,142 @@ func TestGNMIShortStressTest(t *testing.T) {
gst.SanityCheck(t, dut)
}

// gNMI broken client test
func TestGNMIBrokenClientTest(t *testing.T) {
defer testhelper.NewTearDownOptions(t).WithID("cd36ba68-a2c1-485a-bc1a-c79463ed80d9").Teardown(t)
dut := ondatra.DUT(t, "DUT")
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
gst.SanityCheck(t, dut)
for i := 0; i < gst.MinIteration; i++ {
// Create getRequest message with ASCII encoding.
getRequest := &gpb.GetRequest{
Prefix: &gpb.Path{Origin: "openconfig", Target: dut.Name()},
Path: []*gpb.Path{{
Elem: []*gpb.PathElem{{
Name: "interfaces",
}},
}},
Type: gpb.GetRequest_ALL,
Encoding: gpb.Encoding_PROTO,
}
t.Logf("GetRequest:\n%v", getRequest)

// Fetch get client using the raw gNMI client.
gnmiClient, err := dut.RawAPIs().BindingDUT().DialGNMI(context.Background(), grpc.WithBlock())
if err != nil {
t.Fatalf("Unable to get gNMI client (%v)", err)
}
getResp, err := gnmiClient.Get(ctx, getRequest)
if err == nil {
t.Logf("GetResponse:\n%v", getResp)
t.Fatalf("The getRequest is successfully received on broken client")
}
if getResp != nil {
t.Fatalf("getResponse is received successfully")
}
}
gst.SanityCheck(t, dut)
}

// gNMI different leaf get test
func TestGNMIGetDifferentLeafTest(t *testing.T) {
defer testhelper.NewTearDownOptions(t).WithID("08f9ffba-54a9-4d47-a3dc-0e4420fe296b").Teardown(t)
dut := ondatra.DUT(t, "DUT")
gst.SanityCheck(t, dut)
rand.Seed(time.Now().Unix())
gst.CollectPerformanceMetrics(t, dut)
for i := 0; i < gst.AvgIteration; i++ {
port, err := testhelper.RandomInterface(t, dut, nil)
if err != nil {
t.Fatalf("Failed to fetch random interface: %v", err)
}
reqPath := fmt.Sprintf(gst.Path[rand.Intn(len(gst.Path))], port)
// Create Get Request.
sPath, err := ygot.StringToStructuredPath(reqPath)
if err != nil {
t.Fatalf("Unable to convert string to path (%v)", err)
}
paths := []*gpb.Path{sPath}

// Create getRequest message with data type.
getRequest := &gpb.GetRequest{
Prefix: &gpb.Path{Origin: "openconfig", Target: dut.Name()},
Path: paths,
Type: gpb.GetRequest_ALL,
Encoding: gpb.Encoding_PROTO,
}
t.Logf("GetRequest:\n%v", getRequest)

// Fetch get client using the raw gNMI client.
ctx := context.Background()
gnmiClient, err := dut.RawAPIs().BindingDUT().DialGNMI(ctx, grpc.WithBlock())
if err != nil {
t.Fatalf("Unable to get gNMI client (%v)", err)
}
getResp, err := gnmiClient.Get(ctx, getRequest)
if err != nil {
t.Fatalf("Error while calling Get Raw API: (%v)", err)
}

if getResp == nil {
t.Fatalf("Get response is nil")
}
t.Logf("GetResponse:\n%v", getResp)
gst.CollectPerformanceMetrics(t, dut)
}
t.Logf("After 10 seconds of idle time, the performance metrics are:")
time.Sleep(gst.IdleTime * time.Second)
gst.CollectPerformanceMetrics(t, dut)
gst.SanityCheck(t, dut)
}

// gNMI different subtrees get test
func TestGNMIGetDifferentSubtreeTest(t *testing.T) {
defer testhelper.NewTearDownOptions(t).WithID("357762b4-4d34-467e-b321-90a2d271d50d").Teardown(t)
dut := ondatra.DUT(t, "DUT")
gst.SanityCheck(t, dut)
rand.Seed(time.Now().Unix())
gst.CollectPerformanceMetrics(t, dut)
for i := 0; i < gst.MinIteration; i++ {
reqPath := gst.Subtree[rand.Intn(len(gst.Subtree))]
// Create Get Request.
sPath, err := ygot.StringToStructuredPath(reqPath)
if err != nil {
t.Fatalf("Unable to convert string to path (%v)", err)
}
// Create getRequest message with data type.
getRequest := &gpb.GetRequest{
Prefix: &gpb.Path{Origin: "openconfig", Target: dut.Name()},
Path: []*gpb.Path{sPath},
Type: gpb.GetRequest_ALL,
Encoding: gpb.Encoding_PROTO,
}
t.Logf("GetRequest:\n%v", getRequest)

// Fetch get client using the raw gNMI client.
ctx := context.Background()
gnmiClient, err := dut.RawAPIs().BindingDUT().DialGNMI(ctx, grpc.WithBlock())
if err != nil {
t.Fatalf("Unable to get gNMI client (%v)", err)
}
getResp, err := gnmiClient.Get(ctx, getRequest)
if err != nil {
t.Fatalf("Error while calling Get Raw API: (%v)", err)
}

if getResp == nil {
t.Fatalf("Get response is nil")
}
t.Logf("GetResponse:\n%v", getResp)
gst.CollectPerformanceMetrics(t, dut)
}
t.Logf("After 10 seconds of idle time, the performance metrics are:")
time.Sleep(gst.IdleTime * time.Second)
gst.CollectPerformanceMetrics(t, dut)
gst.SanityCheck(t, dut)
}

// gNMI different leaf get test
func TestGNMISetUpdateDifferentLeafTest(t *testing.T) {
defer testhelper.NewTearDownOptions(t).WithID("08f9ffba-54a9-4d47-a3dc-0e4420fe296b").Teardown(t)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package platforms_hardware_component_test

import (
"regexp"
"reflect"
"testing"
"time"

Expand Down