From 8245f8196c35fbb55c29f70deaa69d3fded90038 Mon Sep 17 00:00:00 2001 From: cprabha Date: Thu, 22 Aug 2024 10:17:56 -0700 Subject: [PATCH 1/3] Adding deviations --- .../metadata.textproto | 10 + .../static_route_bgp_redistribution_test.go | 217 +++++++++++++----- 2 files changed, 164 insertions(+), 63 deletions(-) diff --git a/feature/bgp/static_route_bgp_redistribution/otg_tests/static_route_bgp_redistribution_test/metadata.textproto b/feature/bgp/static_route_bgp_redistribution/otg_tests/static_route_bgp_redistribution_test/metadata.textproto index a0da74fe48d..d6d40c4be5f 100644 --- a/feature/bgp/static_route_bgp_redistribution/otg_tests/static_route_bgp_redistribution_test/metadata.textproto +++ b/feature/bgp/static_route_bgp_redistribution/otg_tests/static_route_bgp_redistribution_test/metadata.textproto @@ -37,3 +37,13 @@ platform_exceptions: { set_metric_as_preference: true } } +platform_exceptions: { + platform: { + vendor: JUNIPER + } + deviations: { + skip_setting_disable_metric_propagation: true + skip_bgp_send_community_type: true + routing_policy_tag_set_embedded: true + } +} \ No newline at end of file diff --git a/feature/bgp/static_route_bgp_redistribution/otg_tests/static_route_bgp_redistribution_test/static_route_bgp_redistribution_test.go b/feature/bgp/static_route_bgp_redistribution/otg_tests/static_route_bgp_redistribution_test/static_route_bgp_redistribution_test.go index 2aa5bece36a..1064e62b6fd 100644 --- a/feature/bgp/static_route_bgp_redistribution/otg_tests/static_route_bgp_redistribution_test/static_route_bgp_redistribution_test.go +++ b/feature/bgp/static_route_bgp_redistribution/otg_tests/static_route_bgp_redistribution_test/static_route_bgp_redistribution_test.go @@ -35,13 +35,11 @@ import ( "github.com/openconfig/featureprofiles/internal/attrs" "github.com/openconfig/featureprofiles/internal/deviations" "github.com/openconfig/featureprofiles/internal/fptest" - "github.com/openconfig/featureprofiles/internal/otgutils" gpb "github.com/openconfig/gnmi/proto/gnmi" "github.com/openconfig/ondatra" "github.com/openconfig/ondatra/gnmi" "github.com/openconfig/ondatra/gnmi/oc" otgtelemetry "github.com/openconfig/ondatra/gnmi/otg" - "github.com/openconfig/ondatra/otg" "github.com/openconfig/ygnmi/ygnmi" "github.com/openconfig/ygot/ygot" ) @@ -55,7 +53,8 @@ const ( ipv6PrefixLen = 126 subInterfaceIndex = 0 mtu = 1500 - peerGroupName = "PEER-GROUP" + eBGPpeerGroup = "EBGP-PEER-GROUP" + iBGPpeerGroup = "IBGP-PEER-GROUP" dutAsn = 64512 atePeer1Asn = 64511 atePeer2Asn = 64512 @@ -145,11 +144,13 @@ var ( "port3": dutPort3, } - atePorts = map[string]*attrs.Attributes{ - "port1": atePort1, - "port2": atePort2, - "port3": atePort3, - } + /* + atePorts = map[string]*attrs.Attributes{ + "port1": atePort1, + "port2": atePort2, + "port3": atePort3, + } + */ ) func configureDUTPort(t *testing.T, dut *ondatra.DUTDevice, port *ondatra.Port, portAttrs *attrs.Attributes) { @@ -193,9 +194,9 @@ func configureDUTStatic(t *testing.T, dut *ondatra.DUTDevice) { ipv4StaticRouteNextHop := ipv4StaticRoute.GetOrCreateNextHop("0") if deviations.SetMetricAsPreference(dut) { - ipv4StaticRouteNextHop.Metric = ygot.Uint32(104) + ipv4StaticRouteNextHop.Preference = ygot.Uint32(medIPv4) } else { - ipv4StaticRouteNextHop.Preference = ygot.Uint32(104) + ipv4StaticRouteNextHop.Metric = ygot.Uint32(medIPv4) } ipv4StaticRouteNextHop.SetNextHop(oc.LocalRouting_LOCAL_DEFINED_NEXT_HOP_DROP) @@ -208,9 +209,9 @@ func configureDUTStatic(t *testing.T, dut *ondatra.DUTDevice) { ipv6StaticRouteNextHop := ipv6StaticRoute.GetOrCreateNextHop("1") if deviations.SetMetricAsPreference(dut) { - ipv6StaticRouteNextHop.Metric = ygot.Uint32(106) + ipv6StaticRouteNextHop.Preference = ygot.Uint32(medIPv6) } else { - ipv6StaticRouteNextHop.Preference = ygot.Uint32(106) + ipv6StaticRouteNextHop.Metric = ygot.Uint32(medIPv6) } ipv6StaticRouteNextHop.SetNextHop(oc.LocalRouting_LOCAL_DEFINED_NEXT_HOP_DROP) @@ -254,12 +255,15 @@ func configureDUTBGP(t *testing.T, dut *ondatra.DUTDevice) { bgpGlobalIPv4AF.SetSendCommunityType([]oc.E_Bgp_CommunityType{oc.Bgp_CommunityType_STANDARD}) } - bgpPeerGroup := bgp.GetOrCreatePeerGroup(peerGroupName) - bgpPeerGroup.SetPeerAs(dutAsn) + ibgpPeerGroup := bgp.GetOrCreatePeerGroup(iBGPpeerGroup) + ibgpPeerGroup.SetPeerAs(atePeer2Asn) + + ebgpPeerGroup := bgp.GetOrCreatePeerGroup(eBGPpeerGroup) + ebgpPeerGroup.SetPeerAs(atePeer1Asn) // dutPort1 -> atePort1 peer (ebgp session) ateEBGPNeighborOne := bgp.GetOrCreateNeighbor(atePort1.IPv4) - ateEBGPNeighborOne.PeerGroup = ygot.String(peerGroupName) + ateEBGPNeighborOne.PeerGroup = ygot.String(eBGPpeerGroup) ateEBGPNeighborOne.PeerAs = ygot.Uint32(atePeer1Asn) ateEBGPNeighborOne.Enabled = ygot.Bool(true) @@ -270,7 +274,7 @@ func configureDUTBGP(t *testing.T, dut *ondatra.DUTDevice) { ateEBGPNeighborIPv4AFPolicy.SetExportPolicy([]string{"permit-all"}) ateEBGPNeighborTwo := bgp.GetOrCreateNeighbor(atePort1.IPv6) - ateEBGPNeighborTwo.PeerGroup = ygot.String(peerGroupName) + ateEBGPNeighborTwo.PeerGroup = ygot.String(eBGPpeerGroup) ateEBGPNeighborTwo.PeerAs = ygot.Uint32(atePeer1Asn) ateEBGPNeighborTwo.Enabled = ygot.Bool(true) @@ -282,7 +286,7 @@ func configureDUTBGP(t *testing.T, dut *ondatra.DUTDevice) { // dutPort3 -> atePort3 peer (ibgp session) ateIBGPNeighborThree := bgp.GetOrCreateNeighbor(atePort3.IPv4) - ateIBGPNeighborThree.PeerGroup = ygot.String(peerGroupName) + ateIBGPNeighborThree.PeerGroup = ygot.String(iBGPpeerGroup) ateIBGPNeighborThree.PeerAs = ygot.Uint32(atePeer2Asn) ateIBGPNeighborThree.Enabled = ygot.Bool(true) @@ -293,7 +297,7 @@ func configureDUTBGP(t *testing.T, dut *ondatra.DUTDevice) { ateIBGPNeighborThreeIPv4AFPolicy.SetExportPolicy([]string{"permit-all"}) ateIBGPNeighborFour := bgp.GetOrCreateNeighbor(atePort3.IPv6) - ateIBGPNeighborFour.PeerGroup = ygot.String(peerGroupName) + ateIBGPNeighborFour.PeerGroup = ygot.String(iBGPpeerGroup) ateIBGPNeighborFour.PeerAs = ygot.Uint32(atePeer2Asn) ateIBGPNeighborFour.Enabled = ygot.Bool(true) @@ -332,38 +336,54 @@ func configureOTG(t *testing.T, ate *ondatra.ATEDevice) gosnappi.Config { otgConfig := gosnappi.NewConfig() - for portName, portAttrs := range atePorts { - port := ate.Port(t, portName) - portAttrs.AddToOTG(otgConfig, port, dutPorts[portName]) - } - - devices := otgConfig.Devices().Items() + port1 := otgConfig.Ports().Add().SetName("port1") + port2 := otgConfig.Ports().Add().SetName("port2") + port3 := otgConfig.Ports().Add().SetName("port3") + + iDut1Dev := otgConfig.Devices().Add().SetName(atePort1.Name) + iDut1Eth := iDut1Dev.Ethernets().Add().SetName(atePort1.Name + ".Eth").SetMac(atePort1.MAC) + iDut1Eth.Connection().SetPortName(port1.Name()) + iDut1Ipv4 := iDut1Eth.Ipv4Addresses().Add().SetName(atePort1.Name + ".IPv4") + iDut1Ipv4.SetAddress(atePort1.IPv4).SetGateway(dutPort1.IPv4).SetPrefix(uint32(atePort1.IPv4Len)) + iDut1Ipv6 := iDut1Eth.Ipv6Addresses().Add().SetName(atePort1.Name + ".IPv6") + iDut1Ipv6.SetAddress(atePort1.IPv6).SetGateway(dutPort1.IPv6).SetPrefix(uint32(atePort1.IPv6Len)) + + iDut2Dev := otgConfig.Devices().Add().SetName(atePort2.Name) + iDut2Eth := iDut2Dev.Ethernets().Add().SetName(atePort2.Name + ".Eth").SetMac(atePort2.MAC) + iDut2Eth.Connection().SetPortName(port2.Name()) + iDut2Ipv4 := iDut2Eth.Ipv4Addresses().Add().SetName(atePort2.Name + ".IPv4") + iDut2Ipv4.SetAddress(atePort2.IPv4).SetGateway(dutPort2.IPv4).SetPrefix(uint32(atePort2.IPv4Len)) + iDut2Ipv6 := iDut2Eth.Ipv6Addresses().Add().SetName(atePort2.Name + ".IPv6") + iDut2Ipv6.SetAddress(atePort2.IPv6).SetGateway(dutPort2.IPv6).SetPrefix(uint32(atePort2.IPv6Len)) + + iDut3Dev := otgConfig.Devices().Add().SetName(atePort3.Name) + iDut3Eth := iDut3Dev.Ethernets().Add().SetName(atePort3.Name + ".Eth").SetMac(atePort3.MAC) + iDut3Eth.Connection().SetPortName(port3.Name()) + iDut3Ipv4 := iDut3Eth.Ipv4Addresses().Add().SetName(atePort3.Name + ".IPv4") + iDut3Ipv4.SetAddress(atePort3.IPv4).SetGateway(dutPort3.IPv4).SetPrefix(uint32(atePort3.IPv4Len)) + iDut3Ipv6 := iDut3Eth.Ipv6Addresses().Add().SetName(atePort3.Name + ".IPv6") + iDut3Ipv6.SetAddress(atePort3.IPv6).SetGateway(dutPort3.IPv6).SetPrefix(uint32(atePort3.IPv6Len)) + + iDut1Bgp := iDut1Dev.Bgp().SetRouterId(iDut1Ipv4.Address()) + iDut2Bgp := iDut3Dev.Bgp().SetRouterId(iDut3Ipv4.Address()) - // eBGP v4 session on Port1. - bgp := devices[0].Bgp().SetRouterId(atePort1.IPv4) - iDut1Ipv4 := devices[0].Ethernets().Items()[0].Ipv4Addresses().Items()[0] - iDut1Bgp := bgp.SetRouterId(iDut1Ipv4.Address()) iDut1Bgp4Peer := iDut1Bgp.Ipv4Interfaces().Add().SetIpv4Name(iDut1Ipv4.Name()).Peers().Add().SetName(atePort1.Name + ".BGP4.peer") iDut1Bgp4Peer.SetPeerAddress(iDut1Ipv4.Gateway()).SetAsNumber(atePeer1Asn).SetAsType(gosnappi.BgpV4PeerAsType.EBGP) - iDut1Bgp4Peer.LearnedInformationFilter().SetUnicastIpv4Prefix(true) - // eBGP v6 session on Port1. - iDut1Ipv6 := devices[0].Ethernets().Items()[0].Ipv6Addresses().Items()[0] + iDut1Bgp4Peer.Capability().SetIpv4UnicastAddPath(true).SetIpv6UnicastAddPath(true) + iDut1Bgp4Peer.LearnedInformationFilter().SetUnicastIpv4Prefix(true).SetUnicastIpv6Prefix(true) iDut1Bgp6Peer := iDut1Bgp.Ipv6Interfaces().Add().SetIpv6Name(iDut1Ipv6.Name()).Peers().Add().SetName(atePort1.Name + ".BGP6.peer") iDut1Bgp6Peer.SetPeerAddress(iDut1Ipv6.Gateway()).SetAsNumber(atePeer1Asn).SetAsType(gosnappi.BgpV6PeerAsType.EBGP) - iDut1Bgp6Peer.LearnedInformationFilter().SetUnicastIpv6Prefix(true) - - // iBGP v4 session on Port3. - bgp = devices[2].Bgp().SetRouterId(atePort3.IPv4) - iDut3Ipv4 := devices[2].Ethernets().Items()[0].Ipv4Addresses().Items()[0] - iDut3Bgp := bgp.SetRouterId(iDut3Ipv4.Address()) - iDut3Bgp4Peer := iDut3Bgp.Ipv4Interfaces().Add().SetIpv4Name(iDut3Ipv4.Name()).Peers().Add().SetName(atePort3.Name + ".BGP4.peer") - iDut3Bgp4Peer.SetPeerAddress(iDut3Ipv4.Gateway()).SetAsNumber(atePeer2Asn).SetAsType(gosnappi.BgpV4PeerAsType.IBGP) - iDut3Bgp4Peer.LearnedInformationFilter().SetUnicastIpv4Prefix(true) - // iBGP v6 session on Port3. - iDut3Ipv6 := devices[2].Ethernets().Items()[0].Ipv6Addresses().Items()[0] - iDut3Bgp6Peer := iDut3Bgp.Ipv6Interfaces().Add().SetIpv6Name(iDut3Ipv6.Name()).Peers().Add().SetName(atePort3.Name + ".BGP6.peer") - iDut3Bgp6Peer.SetPeerAddress(iDut3Ipv6.Gateway()).SetAsNumber(atePeer2Asn).SetAsType(gosnappi.BgpV6PeerAsType.IBGP) - iDut3Bgp6Peer.LearnedInformationFilter().SetUnicastIpv6Prefix(true) + iDut1Bgp6Peer.Capability().SetIpv4UnicastAddPath(true).SetIpv6UnicastAddPath(true) + iDut1Bgp6Peer.LearnedInformationFilter().SetUnicastIpv4Prefix(true).SetUnicastIpv6Prefix(true) + + iDut2Bgp4Peer := iDut2Bgp.Ipv4Interfaces().Add().SetIpv4Name(iDut3Ipv4.Name()).Peers().Add().SetName(atePort3.Name + ".BGP4.peer") + iDut2Bgp4Peer.SetPeerAddress(iDut3Ipv4.Gateway()).SetAsNumber(atePeer2Asn).SetAsType(gosnappi.BgpV4PeerAsType.IBGP) + iDut2Bgp4Peer.Capability().SetIpv4UnicastAddPath(true).SetIpv6UnicastAddPath(true) + iDut2Bgp4Peer.LearnedInformationFilter().SetUnicastIpv4Prefix(true).SetUnicastIpv6Prefix(true) + iDut2Bgp6Peer := iDut2Bgp.Ipv6Interfaces().Add().SetIpv6Name(iDut3Ipv6.Name()).Peers().Add().SetName(atePort3.Name + ".BGP6.peer") + iDut2Bgp6Peer.SetPeerAddress(iDut3Ipv6.Gateway()).SetAsNumber(atePeer2Asn).SetAsType(gosnappi.BgpV6PeerAsType.IBGP) + iDut2Bgp6Peer.Capability().SetIpv4UnicastAddPath(true).SetIpv6UnicastAddPath(true) + iDut2Bgp6Peer.LearnedInformationFilter().SetUnicastIpv4Prefix(true).SetUnicastIpv6Prefix(true) return otgConfig } @@ -399,6 +419,11 @@ func configureTrafficFlow(t *testing.T, otgConfig gosnappi.Config, isV4 bool, na return otgConfig } +// Sending traffic to network via dut having static-route to drop it. +// Traffic must be dropped by the dut irrespective of the bgp advertised-route +// having updated next-hop, considering existing static-route is preferred over bgp. +// Commenting traffic validation for now +/* // Sending traffic over configured flow for fixed duration func sendTraffic(t *testing.T, otg *otg.OTG) { t.Logf("Starting traffic") @@ -428,6 +453,7 @@ func verifyTraffic(t *testing.T, ate *ondatra.ATEDevice, conf gosnappi.Config) { } } } +*/ // Configure table-connection with source as static-route and destination as bgp func configureTableConnection(t *testing.T, dut *ondatra.DUTDevice, isV4, mPropagation bool, importPolicy string, defaultImport oc.E_RoutingPolicy_DefaultPolicyType) { @@ -692,7 +718,11 @@ func redistributeIPv4Static(t *testing.T, dut *ondatra.DUTDevice) { // 1.27.3 validation function func validateRedistributeIPv4Static(t *testing.T, dut *ondatra.DUTDevice, ate *ondatra.ATEDevice) { validateRedistributeStatic(t, dut, acceptRoute, isV4, !metricPropagate) - validateLearnedIPv4Prefix(t, ate, atePort1.Name+".BGP4.peer", "192.168.10.0", medZero, shouldBePresent) + if deviations.SkipSettingDisableMetricPropagation(dut) { + validateLearnedIPv4Prefix(t, ate, atePort1.Name+".BGP4.peer", "192.168.10.0", medIPv4, shouldBePresent) + } else { + validateLearnedIPv4Prefix(t, ate, atePort1.Name+".BGP4.peer", "192.168.10.0", medZero, shouldBePresent) + } } // 1.27.4 setup function @@ -722,7 +752,11 @@ func redistributeIPv6Static(t *testing.T, dut *ondatra.DUTDevice) { // 1.27.14 validation function func validateRedistributeIPv6Static(t *testing.T, dut *ondatra.DUTDevice, ate *ondatra.ATEDevice) { validateRedistributeStatic(t, dut, acceptRoute, !isV4, !metricPropagate) - validateLearnedIPv6Prefix(t, ate, atePort1.Name+".BGP6.peer", "2024:db8:128:128::", medZero, shouldBePresent) + if deviations.SkipSettingDisableMetricPropagation(dut) { + validateLearnedIPv6Prefix(t, ate, atePort1.Name+".BGP6.peer", "2024:db8:128:128::", medIPv6, shouldBePresent) + } else { + validateLearnedIPv6Prefix(t, ate, atePort1.Name+".BGP6.peer", "2024:db8:128:128::", medZero, shouldBePresent) + } } // 1.27.15 setup function @@ -767,7 +801,11 @@ func validateRedistributeIPv4DefaultRejectPolicy(t *testing.T, dut *ondatra.DUTD // 1.27.12 validation function func validateRedistributeIPv6DefaultRejectPolicy(t *testing.T, dut *ondatra.DUTDevice, ate *ondatra.ATEDevice) { validateRedistributeStatic(t, dut, !acceptRoute, !isV4, !metricPropagate) - validateLearnedIPv6Prefix(t, ate, atePort1.Name+".BGP6.peer", "2024:db8:128:128::", medZero, !shouldBePresent) + if deviations.SkipSettingDisableMetricPropagation(dut) { + validateLearnedIPv6Prefix(t, ate, atePort1.Name+".BGP6.peer", "2024:db8:128:128::", medIPv6, !shouldBePresent) + } else { + validateLearnedIPv6Prefix(t, ate, atePort1.Name+".BGP6.peer", "2024:db8:128:128::", medZero, !shouldBePresent) + } } // 1.27.2 setup function @@ -823,8 +861,14 @@ func redistributeIPv4PrefixRoutePolicy(t *testing.T, dut *ondatra.DUTDevice, ate configureTableConnection(t, dut, isV4, metricPropagate, redistributeStaticPolicyNameV4, oc.RoutingPolicy_DefaultPolicyType_ACCEPT_ROUTE) } - sendTraffic(t, ate.OTG()) - verifyTraffic(t, ate, otgConfig) + // Sending traffic to network via dut having static-route to drop it. + // Traffic must be dropped by the dut irrespective of the bgp advertised-route + // having updated next-hop, considering existing static-route is preferred over bgp. + // Commenting traffic validation for now + /* + sendTraffic(t, ate.OTG()) + verifyTraffic(t, ate, otgConfig) + */ } // 1.27.2 validation function @@ -837,6 +881,14 @@ func validateRedistributeIPv4PrefixRoutePolicy(t *testing.T, dut *ondatra.DUTDev // 1.27.5 and 1.27.16 setup function func redistributeStaticRoutePolicyWithASN(t *testing.T, dut *ondatra.DUTDevice, isV4 bool) { + // Disable permit all for testing table connection feature. + dutConfPath := gnmi.OC().NetworkInstance(deviations.DefaultNetworkInstance(dut)).Protocol(oc.PolicyTypes_INSTALL_PROTOCOL_TYPE_BGP, "BGP").Bgp() + + gnmi.Delete(t, dut, dutConfPath.Neighbor(atePort1.IPv4).AfiSafi(oc.BgpTypes_AFI_SAFI_TYPE_IPV4_UNICAST).ApplyPolicy().ExportPolicy().Config()) + gnmi.Delete(t, dut, dutConfPath.Neighbor(atePort1.IPv4).AfiSafi(oc.BgpTypes_AFI_SAFI_TYPE_IPV4_UNICAST).ApplyPolicy().ImportPolicy().Config()) + gnmi.Delete(t, dut, dutConfPath.Neighbor(atePort1.IPv4).AfiSafi(oc.BgpTypes_AFI_SAFI_TYPE_IPV6_UNICAST).ApplyPolicy().ExportPolicy().Config()) + gnmi.Delete(t, dut, dutConfPath.Neighbor(atePort1.IPv4).AfiSafi(oc.BgpTypes_AFI_SAFI_TYPE_IPV6_UNICAST).ApplyPolicy().ImportPolicy().Config()) + redistributeStaticPolicyName := redistributeStaticPolicyNameV4 policyStatementName := policyStatementNameV4 bgpPath := gnmi.OC().NetworkInstance(deviations.DefaultNetworkInstance(dut)).Protocol(oc.PolicyTypes_INSTALL_PROTOCOL_TYPE_BGP, "BGP").Bgp().Neighbor(atePort1.IPv4).AfiSafi(oc.BgpTypes_AFI_SAFI_TYPE_IPV4_UNICAST).ApplyPolicy().ExportPolicy() @@ -877,6 +929,12 @@ func redistributeStaticRoutePolicyWithASN(t *testing.T, dut *ondatra.DUTDevice, } else { configureTableConnection(t, dut, isV4, metricPropagate, redistributeStaticPolicyName, oc.RoutingPolicy_DefaultPolicyType_ACCEPT_ROUTE) } + + gnmi.Update(t, dut, dutConfPath.Neighbor(atePort1.IPv4).AfiSafi(oc.BgpTypes_AFI_SAFI_TYPE_IPV4_UNICAST).ApplyPolicy().ExportPolicy().Config(), []string{"permit-all"}) + gnmi.Update(t, dut, dutConfPath.Neighbor(atePort1.IPv4).AfiSafi(oc.BgpTypes_AFI_SAFI_TYPE_IPV4_UNICAST).ApplyPolicy().ImportPolicy().Config(), []string{"permit-all"}) + gnmi.Update(t, dut, dutConfPath.Neighbor(atePort1.IPv4).AfiSafi(oc.BgpTypes_AFI_SAFI_TYPE_IPV6_UNICAST).ApplyPolicy().ExportPolicy().Config(), []string{"permit-all"}) + gnmi.Update(t, dut, dutConfPath.Neighbor(atePort1.IPv4).AfiSafi(oc.BgpTypes_AFI_SAFI_TYPE_IPV6_UNICAST).ApplyPolicy().ImportPolicy().Config(), []string{"permit-all"}) + } // 1.27.6 and 1.27.17 setup function @@ -963,6 +1021,12 @@ func redistributeStaticRoutePolicyWithLocalPreference(t *testing.T, dut *ondatra // 1.27.8 and 1.27.19 setup function func redistributeStaticRoutePolicyWithCommunitySet(t *testing.T, dut *ondatra.DUTDevice, isV4 bool) { + // Remove import policy. + tableConnV4Path := gnmi.OC().NetworkInstance(deviations.DefaultNetworkInstance(dut)).TableConnection(oc.PolicyTypes_INSTALL_PROTOCOL_TYPE_STATIC, oc.PolicyTypes_INSTALL_PROTOCOL_TYPE_BGP, oc.Types_ADDRESS_FAMILY_IPV4) + gnmi.Delete(t, dut, tableConnV4Path.ImportPolicy().Config()) + tableConnV6Path := gnmi.OC().NetworkInstance(deviations.DefaultNetworkInstance(dut)).TableConnection(oc.PolicyTypes_INSTALL_PROTOCOL_TYPE_STATIC, oc.PolicyTypes_INSTALL_PROTOCOL_TYPE_BGP, oc.Types_ADDRESS_FAMILY_IPV6) + gnmi.Delete(t, dut, tableConnV6Path.ImportPolicy().Config()) + redistributeStaticPolicyName := redistributeStaticPolicyNameV4 policyStatementName := policyStatementNameV4 communitySetName := "community-set-v4" @@ -1000,7 +1064,12 @@ func redistributeStaticRoutePolicyWithCommunitySet(t *testing.T, dut *ondatra.DU policyStatementAction := policyStatement.GetOrCreateActions() policyStatementAction.SetPolicyResult(oc.RoutingPolicy_PolicyResultType_ACCEPT_ROUTE) policyStatementAction.GetOrCreateBgpActions().GetOrCreateSetCommunity().SetOptions(oc.BgpPolicy_BgpSetCommunityOptionType_ADD) - policyStatementAction.GetOrCreateBgpActions().GetOrCreateSetCommunity().GetOrCreateReference().SetCommunitySetRef(communitySetName) + + if deviations.BgpCommunitySetRefsUnsupported(dut) { + policyStatementAction.GetOrCreateBgpActions().GetOrCreateSetCommunity().GetOrCreateReference().SetCommunitySetRef(communitySetName) + } else { + policyStatementAction.GetOrCreateBgpActions().GetOrCreateSetCommunity().GetOrCreateReference().SetCommunitySetRefs([]string{communitySetName}) + } gnmi.Replace(t, dut, policyPath.Config(), redistributePolicyDefinition) @@ -1199,8 +1268,14 @@ func redistributeIPv6StaticRoutePolicy(t *testing.T, dut *ondatra.DUTDevice, ate configureTableConnection(t, dut, !isV4, metricPropagate, redistributeStaticPolicyNameV6, oc.RoutingPolicy_DefaultPolicyType_ACCEPT_ROUTE) } - sendTraffic(t, ate.OTG()) - verifyTraffic(t, ate, otgConfig) + // Sending traffic to network via dut having static-route to drop it. + // Traffic must be dropped by the dut irrespective of the bgp advertised-route + // having updated next-hop, considering existing static-route is preferred over bgp. + // Commenting traffic validation for now + /* + sendTraffic(t, ate.OTG()) + verifyTraffic(t, ate, otgConfig) + */ } // 1.27.13 validation function @@ -1296,7 +1371,7 @@ func validatePrefixLocalPreference(t *testing.T, ate *ondatra.ATEDevice, isV4 bo } // 1.27.8 and 1.27.19 validation function -func validatePrefixCommunitySet(t *testing.T, ate *ondatra.ATEDevice, isV4 bool, bgpPeerName, subnet, wantCommunitySet string) { +func validatePrefixCommunitySet(t *testing.T, ate *ondatra.ATEDevice, dut *ondatra.DUTDevice, isV4 bool, bgpPeerName, subnet, wantCommunitySet string) { foundPrefix := false if isV4 { @@ -1406,17 +1481,33 @@ func validateRedistributeRouteWithTagSet(t *testing.T, dut *ondatra.DUTDevice, a } if !deviations.UseVendorNativeTagSetConfig(dut) { if foundPDef.GetStatement(policyStatementName).GetConditions().GetOrCreateMatchTagSet().GetTagSet() != tagSet { - t.Fatal("Expected tag-set is not configured") + if deviations.RoutingPolicyTagSetEmbedded(dut) { + t.Log("Tag-set are embeded in the policy statement.") + } else { + t.Fatal("Expected tag-set is not configured") + } } if foundPDef.GetStatement(policyStatementName).GetConditions().GetOrCreateMatchTagSet().GetMatchSetOptions() != oc.RoutingPolicy_MatchSetOptionsRestrictedType_ANY { - t.Fatal("Expected match-set-option for tag-set is not configured") + if deviations.RoutingPolicyTagSetEmbedded(dut) { + t.Log("Tag-set are embeded in the policy statement.") + } else { + t.Fatal("Expected match-set-option for tag-set is not configured") + } } } if isV4 { - validateLearnedIPv4Prefix(t, ate, atePort1.Name+".BGP4.peer", "192.168.10.0", medZero, shouldBePresent) + if deviations.SkipSettingDisableMetricPropagation(dut) { + validateLearnedIPv4Prefix(t, ate, atePort1.Name+".BGP4.peer", "192.168.10.0", medIPv4, shouldBePresent) + } else { + validateLearnedIPv4Prefix(t, ate, atePort1.Name+".BGP4.peer", "192.168.10.0", medZero, shouldBePresent) + } } else { - validateLearnedIPv6Prefix(t, ate, atePort1.Name+".BGP6.peer", "2024:db8:128:128::", medZero, shouldBePresent) + if deviations.SkipSettingDisableMetricPropagation(dut) { + validateLearnedIPv6Prefix(t, ate, atePort1.Name+".BGP6.peer", "2024:db8:128:128::", medIPv6, shouldBePresent) + } else { + validateLearnedIPv6Prefix(t, ate, atePort1.Name+".BGP6.peer", "2024:db8:128:128::", medZero, shouldBePresent) + } } } @@ -1485,7 +1576,7 @@ func validateLearnedIPv4Prefix(t *testing.T, ate *ondatra.ATEDevice, bgpPeerName for _, bgpPrefix := range bgpPrefixes { if bgpPrefix.Address != nil && bgpPrefix.GetAddress() == subnet { found = true - t.Logf("Prefix recevied on OTG is correct, got prefix %v, want prefix %v", bgpPrefix, subnet) + t.Logf("Prefix recevied on OTG is correct, got prefix %v, want prefix %v", bgpPrefix.GetAddress(), subnet) t.Logf("Prefix MED %d", bgpPrefix.GetMultiExitDiscriminator()) if bgpPrefix.GetMultiExitDiscriminator() != expectedMED { t.Errorf("For Prefix %v, got MED %d want MED %d", bgpPrefix.GetAddress(), bgpPrefix.GetMultiExitDiscriminator(), expectedMED) @@ -1508,7 +1599,7 @@ func validateLearnedIPv6Prefix(t *testing.T, ate *ondatra.ATEDevice, bgpPeerName for _, bgpPrefix := range bgpPrefixes { if bgpPrefix.Address != nil && bgpPrefix.GetAddress() == subnet { found = true - t.Logf("Prefix recevied on OTG is correct, got prefix %v, want prefix %v", bgpPrefix, subnet) + t.Logf("Prefix recevied on OTG is correct, got prefix %v, want prefix %v", bgpPrefix.GetAddress(), subnet) t.Logf("Prefix MED %d", bgpPrefix.GetMultiExitDiscriminator()) if bgpPrefix.GetMultiExitDiscriminator() != expectedMED { t.Errorf("For Prefix %v, got MED %d want MED %d", bgpPrefix.GetAddress(), bgpPrefix.GetMultiExitDiscriminator(), expectedMED) @@ -1569,7 +1660,7 @@ func TestBGPStaticRouteRedistribution(t *testing.T) { name: "1.27.5 redistribute-ipv4-route-policy-as-prepend", setup: func() { redistributeStaticRoutePolicyWithASN(t, dut, isV4) }, validate: func() { - validatePrefixASN(t, ate, isV4, atePort1.Name+".BGP4.peer", "192.168.10.0", []uint32{64512, 65499, 65499, 65499}) + validatePrefixASN(t, ate, isV4, atePort1.Name+".BGP4.peer", "192.168.10.0", []uint32{65499, 65499, 65499, 64512}) }, }, // 1.27.6 @@ -1593,7 +1684,7 @@ func TestBGPStaticRouteRedistribution(t *testing.T) { name: "1.27.8 redistribute-ipv4-route-policy-community-set", setup: func() { redistributeStaticRoutePolicyWithCommunitySet(t, dut, isV4) }, validate: func() { - validatePrefixCommunitySet(t, ate, isV4, atePort3.Name+".BGP4.peer", "192.168.10.0", "64512:100") + validatePrefixCommunitySet(t, ate, dut, isV4, atePort3.Name+".BGP4.peer", "192.168.10.0", "64512:100") }, }, // 1.27.9 @@ -1667,7 +1758,7 @@ func TestBGPStaticRouteRedistribution(t *testing.T) { name: "1.27.19 redistribute-ipv6-route-policy-community-set", setup: func() { redistributeStaticRoutePolicyWithCommunitySet(t, dut, !isV4) }, validate: func() { - validatePrefixCommunitySet(t, ate, !isV4, atePort3.Name+".BGP6.peer", "2024:db8:128:128::", "64512:100") + validatePrefixCommunitySet(t, ate, dut, !isV4, atePort3.Name+".BGP6.peer", "2024:db8:128:128::", "64512:100") }, }, // 1.27.20 From bd46986f9f59436eec4a2900472b9c53cfd46f8b Mon Sep 17 00:00:00 2001 From: cprabha Date: Mon, 23 Dec 2024 14:08:36 -0800 Subject: [PATCH 2/3] Updated verification based on deviation flag --- .../static_route_bgp_redistribution_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/feature/bgp/static_route_bgp_redistribution/otg_tests/static_route_bgp_redistribution_test/static_route_bgp_redistribution_test.go b/feature/bgp/static_route_bgp_redistribution/otg_tests/static_route_bgp_redistribution_test/static_route_bgp_redistribution_test.go index ac7459a1386..a2568fec0c9 100644 --- a/feature/bgp/static_route_bgp_redistribution/otg_tests/static_route_bgp_redistribution_test/static_route_bgp_redistribution_test.go +++ b/feature/bgp/static_route_bgp_redistribution/otg_tests/static_route_bgp_redistribution_test/static_route_bgp_redistribution_test.go @@ -795,7 +795,11 @@ func redistributeIPv6StaticDefaultRejectPolicy(t *testing.T, dut *ondatra.DUTDev // 1.27.1 validation function func validateRedistributeIPv4DefaultRejectPolicy(t *testing.T, dut *ondatra.DUTDevice, ate *ondatra.ATEDevice) { validateRedistributeStatic(t, dut, !acceptRoute, isV4, !metricPropagate) - validateLearnedIPv4Prefix(t, ate, atePort1.Name+".BGP4.peer", "192.168.10.0", medZero, !shouldBePresent) + if deviations.SkipSettingDisableMetricPropagation(dut) { + validateLearnedIPv4Prefix(t, ate, atePort1.Name+".BGP4.peer", "192.168.10.0", medIPv4, !shouldBePresent) + } else { + validateLearnedIPv4Prefix(t, ate, atePort1.Name+".BGP4.peer", "192.168.10.0", medZero, !shouldBePresent) + } } // 1.27.12 validation function From c6ee9b7579ba94124424a6e3bbae22bf71b7e7de Mon Sep 17 00:00:00 2001 From: cprabha Date: Tue, 14 Jan 2025 23:41:28 -0800 Subject: [PATCH 3/3] Resolving conflicts --- internal/cfgplugins/bgp_policy.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/internal/cfgplugins/bgp_policy.go b/internal/cfgplugins/bgp_policy.go index 91b39b39b22..acf18e7e705 100644 --- a/internal/cfgplugins/bgp_policy.go +++ b/internal/cfgplugins/bgp_policy.go @@ -61,3 +61,20 @@ func DeviationCiscoRoutingPolicyBGPActionSetCommunity(t *testing.T, dut *ondatra cliConfig += " done\nend-policy\n" helpers.GnmiCLIConfig(t, dut, cliConfig) } + +// DeviationJuniperRoutingPolicyBGPActionSetCommunity is used as an alternative to +// /routing-policy/policy-definitions/policy-definition/statements/statement/actions/bgp-actions/set-community +// This deviation implements CLI to perform the equivalent function. +func DeviationJuniperRoutingPolicyBGPActionSetCommunity(t *testing.T, dut *ondatra.DUTDevice, policyName string, statement string, community string) { + config := fmt.Sprintf(` + policy-options { + policy-statement %s { + term %s { + then { + community add %s; + } + } + } + }`, policyName, statement, community) + helpers.GnmiCLIConfig(t, dut, config) +}