From d34e2c82a1cc4ef1126710da126eea5fb4876700 Mon Sep 17 00:00:00 2001 From: "Fernando Molina Rodriguez (fmolinar)" Date: Mon, 27 Apr 2026 14:34:54 -0700 Subject: [PATCH 1/5] Refactor management HA test to use timeout constant for sleep durations and simplify loss checks --- .../management_ha_test/management_ha_test.go | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/feature/system/management/otg_tests/management_ha_test/management_ha_test.go b/feature/system/management/otg_tests/management_ha_test/management_ha_test.go index f0e09d93186..d5a386d42f2 100644 --- a/feature/system/management/otg_tests/management_ha_test/management_ha_test.go +++ b/feature/system/management/otg_tests/management_ha_test/management_ha_test.go @@ -39,11 +39,10 @@ import ( const ( prefixesStart = "2001:db8:1::1" - prefixP6Len = 128 - prefixesCount = 1 pathID = 1 defaultRoute = "0:0:0:0:0:0:0:0" ateNetPrefix = "2001:0db8::192:0:3:1" + timeout = 10 * time.Second ) var ( @@ -175,7 +174,8 @@ func TestManagementHA1(t *testing.T) { // Disable port1 to force traffic to port2 gnmi.Replace(t, dut, gnmi.OC().Interface(p1.Name()).Enabled().Config(), false) gnmi.Await(t, dut, gnmi.OC().Interface(p1.Name()).OperStatus().State(), 1*time.Minute, oc.Interface_OperStatus_DOWN) - time.Sleep(10 * time.Second) + t.Logf("sleeping for %v to ensure DUT has aged out ARP entry for port1", timeout) + time.Sleep(timeout) bs.ATE.OTG().StartTraffic(t) time.Sleep(30 * time.Second) @@ -186,7 +186,7 @@ func TestManagementHA1(t *testing.T) { framesRx := gnmi.Get(t, bs.ATE.OTG(), gnmi.OTG().Port(bs.ATE.Port(t, "port2").ID()).Counters().InFrames().State()) lossV6 := otgutils.GetFlowLossPct(t, bs.ATE.OTG(), "v6Flow", 10*time.Second) t.Logf("Frames sent/received: got: %d, want: %d, loss: %f", framesRx, framesTx, lossV6) - if lossV6 > lossTolerance || framesRx < framesTx { + if lossV6 > lossTolerance { t.Errorf("Frames sent/received: got: %d, want: %d", framesRx, framesTx) } }) @@ -201,7 +201,8 @@ func TestManagementHA1(t *testing.T) { gnmi.Replace(t, dut, gnmi.OC().Interface(p2.Name()).Enabled().Config(), false) gnmi.Await(t, dut, gnmi.OC().Interface(p1.Name()).OperStatus().State(), 1*time.Minute, oc.Interface_OperStatus_DOWN) gnmi.Await(t, dut, gnmi.OC().Interface(p2.Name()).OperStatus().State(), 1*time.Minute, oc.Interface_OperStatus_DOWN) - time.Sleep(10 * time.Second) + t.Logf("sleeping for %v to ensure DUT has aged out ARP entry for port1 and port2", timeout) + time.Sleep(timeout) bs.ATE.OTG().StartTraffic(t) time.Sleep(30 * time.Second) @@ -210,7 +211,8 @@ func TestManagementHA1(t *testing.T) { otgutils.LogPortMetrics(t, bs.ATE.OTG(), bs.ATETop) framesTx := gnmi.Get(t, bs.ATE.OTG(), gnmi.OTG().Port(bs.ATE.Port(t, "port4").ID()).Counters().OutFrames().State()) framesRx := gnmi.Get(t, bs.ATE.OTG(), gnmi.OTG().Port(bs.ATE.Port(t, "port3").ID()).Counters().InFrames().State()) - if lossPct(float64(framesTx), float64(framesRx)) > lossTolerance { + lossV6 := otgutils.GetFlowLossPct(t, bs.ATE.OTG(), "v6Flow", 10*time.Second) + if lossV6 > lossTolerance { t.Errorf("Frames sent/received: got: %d, want: %d", framesRx, framesTx) } }) @@ -223,7 +225,8 @@ func TestManagementHA1(t *testing.T) { // Disable Port 2 to force traffic to Port 1 gnmi.Replace(t, dut, gnmi.OC().Interface(p2.Name()).Enabled().Config(), false) gnmi.Await(t, dut, gnmi.OC().Interface(p2.Name()).OperStatus().State(), 1*time.Minute, oc.Interface_OperStatus_DOWN) - time.Sleep(5 * time.Second) + t.Logf("sleeping for %v to ensure DUT has aged out ARP entry for port1 and port2", timeout) + time.Sleep(timeout) bs.ATE.OTG().StartTraffic(t) time.Sleep(30 * time.Second) @@ -233,7 +236,7 @@ func TestManagementHA1(t *testing.T) { framesTx := gnmi.Get(t, bs.ATE.OTG(), gnmi.OTG().Port(bs.ATE.Port(t, "port4").ID()).Counters().OutFrames().State()) framesRx := gnmi.Get(t, bs.ATE.OTG(), gnmi.OTG().Port(bs.ATE.Port(t, "port1").ID()).Counters().InFrames().State()) lossV6 := otgutils.GetFlowLossPct(t, bs.ATE.OTG(), "v6Flow", 10*time.Second) - if lossV6 > lossTolerance || framesRx < framesTx { + if lossV6 > lossTolerance { t.Errorf("Frames sent/received: got: %d, want: %d", framesRx, framesTx) } }) @@ -304,7 +307,6 @@ func configureEmulatedNetworks(bs *cfgplugins.BGPSession) { bgp6PeerRoute.SetNextHopMode(gosnappi.BgpV6RouteRangeNextHopMode.MANUAL) bgp6PeerRoute.AddPath().SetPathId(pathID) - bgp6PeerRoute.Addresses().Add().SetAddress(prefixesStart).SetPrefix(prefixP6Len).SetCount(prefixesCount) bgp6PeerRoute.Addresses().Add().SetAddress(defaultRoute).SetPrefix(0) } } From 8dfea89e49a94e681fbf4a545b08f908478e1b5e Mon Sep 17 00:00:00 2001 From: Karthikeya Remilla Date: Tue, 28 Apr 2026 09:46:57 +0530 Subject: [PATCH 2/5] Update feature/system/management/otg_tests/management_ha_test/management_ha_test.go Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../otg_tests/management_ha_test/management_ha_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/system/management/otg_tests/management_ha_test/management_ha_test.go b/feature/system/management/otg_tests/management_ha_test/management_ha_test.go index d5a386d42f2..530c449d3d3 100644 --- a/feature/system/management/otg_tests/management_ha_test/management_ha_test.go +++ b/feature/system/management/otg_tests/management_ha_test/management_ha_test.go @@ -225,7 +225,7 @@ func TestManagementHA1(t *testing.T) { // Disable Port 2 to force traffic to Port 1 gnmi.Replace(t, dut, gnmi.OC().Interface(p2.Name()).Enabled().Config(), false) gnmi.Await(t, dut, gnmi.OC().Interface(p2.Name()).OperStatus().State(), 1*time.Minute, oc.Interface_OperStatus_DOWN) - t.Logf("sleeping for %v to ensure DUT has aged out ARP entry for port1 and port2", timeout) + t.Logf("sleeping for %v to ensure DUT has aged out ARP entry for port2", timeout) time.Sleep(timeout) bs.ATE.OTG().StartTraffic(t) From 7db658c909714fb589a7a85842e6de9955585871 Mon Sep 17 00:00:00 2001 From: Fernando Molina Rodriguez Date: Tue, 28 Apr 2026 10:47:18 -0700 Subject: [PATCH 3/5] Update feature/system/management/otg_tests/management_ha_test/management_ha_test.go Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../otg_tests/management_ha_test/management_ha_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/system/management/otg_tests/management_ha_test/management_ha_test.go b/feature/system/management/otg_tests/management_ha_test/management_ha_test.go index 530c449d3d3..82d8689505a 100644 --- a/feature/system/management/otg_tests/management_ha_test/management_ha_test.go +++ b/feature/system/management/otg_tests/management_ha_test/management_ha_test.go @@ -211,7 +211,7 @@ func TestManagementHA1(t *testing.T) { otgutils.LogPortMetrics(t, bs.ATE.OTG(), bs.ATETop) framesTx := gnmi.Get(t, bs.ATE.OTG(), gnmi.OTG().Port(bs.ATE.Port(t, "port4").ID()).Counters().OutFrames().State()) framesRx := gnmi.Get(t, bs.ATE.OTG(), gnmi.OTG().Port(bs.ATE.Port(t, "port3").ID()).Counters().InFrames().State()) - lossV6 := otgutils.GetFlowLossPct(t, bs.ATE.OTG(), "v6Flow", 10*time.Second) + lossV6 := otgutils.GetFlowLossPct(t, bs.ATE.OTG(), "v6Flow", timeout) if lossV6 > lossTolerance { t.Errorf("Frames sent/received: got: %d, want: %d", framesRx, framesTx) } From 5ed6b653bf68955e1201f92fd39dcf08b3f8843c Mon Sep 17 00:00:00 2001 From: "Fernando Molina Rodriguez (fmolinar)" Date: Tue, 28 Apr 2026 11:01:08 -0700 Subject: [PATCH 4/5] Refactor management HA test to improve loss reporting for IPv6 traffic --- .../management_ha_test/management_ha_test.go | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/feature/system/management/otg_tests/management_ha_test/management_ha_test.go b/feature/system/management/otg_tests/management_ha_test/management_ha_test.go index 82d8689505a..d41f44a08db 100644 --- a/feature/system/management/otg_tests/management_ha_test/management_ha_test.go +++ b/feature/system/management/otg_tests/management_ha_test/management_ha_test.go @@ -182,12 +182,9 @@ func TestManagementHA1(t *testing.T) { bs.ATE.OTG().StopTraffic(t) otgutils.LogFlowMetrics(t, bs.ATE.OTG(), bs.ATETop) otgutils.LogPortMetrics(t, bs.ATE.OTG(), bs.ATETop) - framesTx := gnmi.Get(t, bs.ATE.OTG(), gnmi.OTG().Port(bs.ATE.Port(t, "port4").ID()).Counters().OutFrames().State()) - framesRx := gnmi.Get(t, bs.ATE.OTG(), gnmi.OTG().Port(bs.ATE.Port(t, "port2").ID()).Counters().InFrames().State()) lossV6 := otgutils.GetFlowLossPct(t, bs.ATE.OTG(), "v6Flow", 10*time.Second) - t.Logf("Frames sent/received: got: %d, want: %d, loss: %f", framesRx, framesTx, lossV6) if lossV6 > lossTolerance { - t.Errorf("Frames sent/received: got: %d, want: %d", framesRx, framesTx) + t.Errorf("Loss percent for IPv6 Traffic: got: %f, want %f", lossV6, lossTolerance) } }) @@ -209,11 +206,9 @@ func TestManagementHA1(t *testing.T) { bs.ATE.OTG().StopTraffic(t) otgutils.LogFlowMetrics(t, bs.ATE.OTG(), bs.ATETop) otgutils.LogPortMetrics(t, bs.ATE.OTG(), bs.ATETop) - framesTx := gnmi.Get(t, bs.ATE.OTG(), gnmi.OTG().Port(bs.ATE.Port(t, "port4").ID()).Counters().OutFrames().State()) - framesRx := gnmi.Get(t, bs.ATE.OTG(), gnmi.OTG().Port(bs.ATE.Port(t, "port3").ID()).Counters().InFrames().State()) lossV6 := otgutils.GetFlowLossPct(t, bs.ATE.OTG(), "v6Flow", timeout) if lossV6 > lossTolerance { - t.Errorf("Frames sent/received: got: %d, want: %d", framesRx, framesTx) + t.Errorf("Loss percent for IPv6 Traffic: got: %f, want %f", lossV6, lossTolerance) } }) @@ -233,11 +228,9 @@ func TestManagementHA1(t *testing.T) { bs.ATE.OTG().StopTraffic(t) otgutils.LogFlowMetrics(t, bs.ATE.OTG(), bs.ATETop) otgutils.LogPortMetrics(t, bs.ATE.OTG(), bs.ATETop) - framesTx := gnmi.Get(t, bs.ATE.OTG(), gnmi.OTG().Port(bs.ATE.Port(t, "port4").ID()).Counters().OutFrames().State()) - framesRx := gnmi.Get(t, bs.ATE.OTG(), gnmi.OTG().Port(bs.ATE.Port(t, "port1").ID()).Counters().InFrames().State()) lossV6 := otgutils.GetFlowLossPct(t, bs.ATE.OTG(), "v6Flow", 10*time.Second) if lossV6 > lossTolerance { - t.Errorf("Frames sent/received: got: %d, want: %d", framesRx, framesTx) + t.Errorf("Loss percent for IPv6 Traffic: got: %f, want %f", lossV6, lossTolerance) } }) From 102fdc8e133d760a16be5a59650cfba36504fc53 Mon Sep 17 00:00:00 2001 From: "Fernando Molina Rodriguez (fmolinar)" Date: Fri, 1 May 2026 11:55:31 -0700 Subject: [PATCH 5/5] Remove unused lossPct function from management HA test --- .../otg_tests/management_ha_test/management_ha_test.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/feature/system/management/otg_tests/management_ha_test/management_ha_test.go b/feature/system/management/otg_tests/management_ha_test/management_ha_test.go index d41f44a08db..ed03cca553a 100644 --- a/feature/system/management/otg_tests/management_ha_test/management_ha_test.go +++ b/feature/system/management/otg_tests/management_ha_test/management_ha_test.go @@ -16,7 +16,6 @@ package management_ha_test import ( "fmt" - "math" "sort" "strconv" "testing" @@ -465,10 +464,6 @@ func configureImportExportBGPPolicy(t *testing.T, bs *cfgplugins.BGPSession, dut batchSet.Set(t, bs.DUT) } -func lossPct(tx, rx float64) float64 { - return (math.Abs(tx-rx) * 100) / tx -} - func getCiscoCLIRedisConfig(instanceName string, as uint32, vrf string) string { cfg := fmt.Sprintf("router bgp %d instance %s\n", as, instanceName) cfg = cfg + fmt.Sprintf(" vrf %s\n", vrf)