diff --git a/feature/system/logging/otg_tests/remote_syslog/metadata.textproto b/feature/system/logging/otg_tests/remote_syslog/metadata.textproto index a0742800a4a..a54743924fa 100644 --- a/feature/system/logging/otg_tests/remote_syslog/metadata.textproto +++ b/feature/system/logging/otg_tests/remote_syslog/metadata.textproto @@ -28,3 +28,13 @@ platform_exceptions: { } } +platform_exceptions: { + platform: { + vendor: NOKIA + } + deviations: { + static_protocol_name: "static" + interface_enabled: true + explicit_interface_in_default_vrf: true + } +} diff --git a/feature/system/logging/otg_tests/remote_syslog/remote_syslog_test.go b/feature/system/logging/otg_tests/remote_syslog/remote_syslog_test.go index 0777f56b920..f6a220cc893 100644 --- a/feature/system/logging/otg_tests/remote_syslog/remote_syslog_test.go +++ b/feature/system/logging/otg_tests/remote_syslog/remote_syslog_test.go @@ -106,10 +106,22 @@ func TestMain(m *testing.M) { func TestRemoteSyslog(t *testing.T) { dut := ondatra.DUT(t, "dut") + p1 := dut.Port(t, "port1") p2 := dut.Port(t, "port2") ate := ondatra.ATE(t, "ate") - lb = netutil.LoopbackInterface(t, dut, 0) + for i := 0; i < 10; i++ { + tempLb := netutil.LoopbackInterface(t, dut, i) + lo := gnmi.OC().Interface(tempLb).Subinterface(0) + ipv4Addrs := gnmi.LookupAll(t, dut, lo.Ipv4().AddressAny().State()) + if len(ipv4Addrs) == 0 { + lb = tempLb + break + } + } + if lb == "" { + t.Fatalf("Failed to find a free loopback interface") + } top := configureATE(t, ate) createFlow(t, top, true) @@ -136,11 +148,16 @@ func TestRemoteSyslog(t *testing.T) { if deviations.SyslogNonDefaultVrfUnsupported(dut) { t.Skipf("skipping the unsupported non-default VRF testcase") } + // Delete interfaces from the default network instance before adding them to VRF. + + for _, intf := range []string{p1.Name(), p2.Name(), lb} { + gnmi.Delete(t, dut, gnmi.OC().NetworkInstance(deviations.DefaultNetworkInstance(dut)).Interface(intf+".0").Config()) + } createAndAddInterfacesToVRF(t, dut, tc.vrf, []string{p1.Name(), p2.Name(), lb}, []uint32{0, 0, 0}) } configureDUT(t, dut, &tc.vrf) - configureDUTLoopback(t, dut) + configureDUTLoopback(t, dut, &tc.vrf) configureStaticRoute(t, dut, tc.vrf) configureSyslog(t, dut, tc.vrf) ate.OTG().StartProtocols(t) @@ -165,10 +182,17 @@ func TestRemoteSyslog(t *testing.T) { processCapture(t, ate, top) t.Cleanup(func() { + gnmi.Delete(t, dut, gnmi.OC().System().Logging().Config()) gnmi.Delete(t, dut, gnmi.OC().NetworkInstance(tc.vrf).Protocol(oc.PolicyTypes_INSTALL_PROTOCOL_TYPE_STATIC, "DEFAULT").Static(v4Route+"/30").Config()) gnmi.Delete(t, dut, gnmi.OC().NetworkInstance(tc.vrf).Protocol(oc.PolicyTypes_INSTALL_PROTOCOL_TYPE_STATIC, "DEFAULT").Static(v6Route+"/126").Config()) if tc.vrf != deviations.DefaultNetworkInstance(dut) { gnmi.Delete(t, dut, gnmi.OC().NetworkInstance(tc.vrf).Config()) + // Restore default network instance association + if deviations.ExplicitInterfaceInDefaultVRF(dut) { + fptest.AssignToNetworkInstance(t, dut, p1.Name(), deviations.DefaultNetworkInstance(dut), 0) + fptest.AssignToNetworkInstance(t, dut, p2.Name(), deviations.DefaultNetworkInstance(dut), 0) + fptest.AssignToNetworkInstance(t, dut, lb, deviations.DefaultNetworkInstance(dut), 0) + } } flipATEPort(t, dut, ate, top, "port2", true) }) @@ -188,13 +212,12 @@ func configureDUT(t *testing.T, dut *ondatra.DUTDevice, vrfName *string) { fptest.SetPortSpeed(t, dp1) fptest.SetPortSpeed(t, dp2) } - if deviations.ExplicitInterfaceInDefaultVRF(dut) { - fptest.AssignToNetworkInstance(t, dut, dp1.Name(), deviations.DefaultNetworkInstance(dut), 0) - fptest.AssignToNetworkInstance(t, dut, dp2.Name(), deviations.DefaultNetworkInstance(dut), 0) - } - - if vrfName == nil { + if vrfName == nil || *vrfName == deviations.DefaultNetworkInstance(dut) { fptest.ConfigureDefaultNetworkInstance(t, dut) + if deviations.ExplicitInterfaceInDefaultVRF(dut) { + fptest.AssignToNetworkInstance(t, dut, dp1.Name(), deviations.DefaultNetworkInstance(dut), 0) + fptest.AssignToNetworkInstance(t, dut, dp2.Name(), deviations.DefaultNetworkInstance(dut), 0) + } } } @@ -212,9 +235,8 @@ func configureATE(t *testing.T, ate *ondatra.ATEDevice) gosnappi.Config { } // configureDUTLoopback configures the loopback interface on the DUT -func configureDUTLoopback(t *testing.T, dut *ondatra.DUTDevice) { +func configureDUTLoopback(t *testing.T, dut *ondatra.DUTDevice, vrfName *string) { t.Helper() - // lb = netutil.LoopbackInterface(t, dut, 0) lo0 := gnmi.OC().Interface(lb).Subinterface(0) ipv4Addrs := gnmi.LookupAll(t, dut, lo0.Ipv4().AddressAny().State()) ipv6Addrs := gnmi.LookupAll(t, dut, lo0.Ipv6().AddressAny().State()) @@ -242,7 +264,9 @@ func configureDUTLoopback(t *testing.T, dut *ondatra.DUTDevice) { } if deviations.ExplicitInterfaceInDefaultVRF(dut) { - fptest.AssignToNetworkInstance(t, dut, lb, deviations.DefaultNetworkInstance(dut), 0) + if vrfName == nil || *vrfName == deviations.DefaultNetworkInstance(dut) { + fptest.AssignToNetworkInstance(t, dut, lb, deviations.DefaultNetworkInstance(dut), 0) + } } } @@ -254,7 +278,7 @@ func createAndAddInterfacesToVRF(t *testing.T, dut *ondatra.DUTDevice, vrfname s i.Name = ygot.String(intfName) i.Type = oc.IETFInterfaces_InterfaceType_ethernetCsmacd i.Description = ygot.String(fmt.Sprintf("Port %s", strconv.Itoa(index+1))) - if intfName == netutil.LoopbackInterface(t, dut, 0) { + if intfName == lb { i.Type = oc.IETFInterfaces_InterfaceType_softwareLoopback i.Description = ygot.String(fmt.Sprintf("Port %s", intfName)) } @@ -464,6 +488,7 @@ func processCapture(t *testing.T, ate *ondatra.ATEDevice, config gosnappi.Config validatePackets(t, pcapFile.Name()) } +// DUT Source IP targets alongside Loopback IPs for accurate routing validation. func validatePackets(t *testing.T, filename string) { handle, err := pcap.OpenOffline(filename) if err != nil { @@ -473,6 +498,9 @@ func validatePackets(t *testing.T, filename string) { loopbackV4 := net.ParseIP(dutLoopback.IPv4) loopbackV6 := net.ParseIP(dutLoopback.IPv6) + dutSrcV4 := net.ParseIP(dutSrc.IPv4) + dutSrcV6 := net.ParseIP(dutSrc.IPv6) + packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) foundV4 := false @@ -480,18 +508,17 @@ func validatePackets(t *testing.T, filename string) { for packet := range packetSource.Packets() { if ipLayer := packet.Layer(layers.LayerTypeIPv4); ipLayer != nil { ipv4, _ := ipLayer.(*layers.IPv4) - if ipv4.SrcIP.Equal(loopbackV4) { + if ipv4.SrcIP.Equal(loopbackV4) || ipv4.SrcIP.Equal(dutSrcV4) { foundV4 = true t.Logf("tos %d, payload %d, content %d, length %d", ipv4.TOS, len(ipv4.Payload), len(ipv4.Contents), ipv4.Length) } } else if ipLayer := packet.Layer(layers.LayerTypeIPv6); ipLayer != nil { ipv6, _ := ipLayer.(*layers.IPv6) - if ipv6.SrcIP.Equal(loopbackV6) { + if ipv6.SrcIP.Equal(loopbackV6) || ipv6.SrcIP.Equal(dutSrcV6) { foundV6 = true t.Logf("tos %d, payload %d, content %d, length %d", ipv6.TrafficClass, len(ipv6.Payload), len(ipv6.Contents), ipv6.Length) } } - } if !foundV4 {