Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import (
"github.com/openconfig/featureprofiles/internal/cfgplugins"
"github.com/openconfig/featureprofiles/internal/deviations"
"github.com/openconfig/featureprofiles/internal/fptest"
"github.com/openconfig/featureprofiles/internal/helpers"
"github.com/openconfig/featureprofiles/internal/otgutils"
"github.com/openconfig/ondatra"
"github.com/openconfig/ondatra/gnmi"
Expand Down Expand Up @@ -106,10 +107,27 @@ func TestMain(m *testing.M) {

func TestRemoteSyslog(t *testing.T) {
dut := ondatra.DUT(t, "dut")
if dut.Vendor() == ondatra.NOKIA {
helpers.GnmiCLIConfig(t, dut, "set / system logging subsystem-facility local7")
Comment thread
AmrNJ marked this conversation as resolved.
Outdated
t.Cleanup(func() {
helpers.GnmiCLIConfig(t, dut, "delete / system logging subsystem-facility")
})
}
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)
Expand All @@ -136,11 +154,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)
Expand All @@ -165,10 +188,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)
})
Expand All @@ -188,13 +218,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)
}
}
}

Expand All @@ -212,9 +241,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())
Expand Down Expand Up @@ -242,7 +270,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)
}
}
}

Expand All @@ -254,7 +284,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))
}
Expand Down Expand Up @@ -464,6 +494,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 {
Expand All @@ -473,25 +504,27 @@ 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)
Comment thread
AmrNJ marked this conversation as resolved.

packetSource := gopacket.NewPacketSource(handle, handle.LinkType())

foundV4 := false
foundV6 := false
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) {
Comment thread
AmrNJ marked this conversation as resolved.
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) {
Comment thread
AmrNJ marked this conversation as resolved.
foundV6 = true
t.Logf("tos %d, payload %d, content %d, length %d", ipv6.TrafficClass, len(ipv6.Payload), len(ipv6.Contents), ipv6.Length)
}
}

}

if !foundV4 {
Expand Down
Loading