From b5287c7ba4d4c9f255de5e1c00cfa5ed34b75bd1 Mon Sep 17 00:00:00 2001 From: Milos Fabian Date: Mon, 11 Apr 2016 23:12:56 +0200 Subject: [PATCH] Bug-4827: BGP Add-Path OpenConfig Support Added mapping from BGP RIB and Peer Module to OpenConfig API to support BGP Add-Path configuration. In "Neighbor" configuration per AFI/SAFI Add-Path capability is exposed (enabled). In "Global" configuration per AFI/SAFI path selection strategy is exposed (enabled+maximum paths). For the sake of gathering info about path selection modes, expose "N" value in AddPathBestNPathSelection. Change-Id: Icedecb0e9d18e6fd3b29bfd28d49172209bfbe37 Signed-off-by: Milos Fabian --- .../openconfig/BGPGlobalProviderImpl.java | 3 +- .../openconfig/BGPNeighborProviderImpl.java | 3 +- .../openconfig/impl/util/OpenConfigUtil.java | 59 ++++++++++++++++-- .../openconfig/BGPGlobalProviderImplTest.java | 2 +- .../BGPNeighborProviderImplTest.java | 3 +- .../impl/util/OpenConfigUtilTest.java | 60 +++++++++++++++++-- bgp/openconfig-spi/pom.xml | 4 ++ .../pojo/BGPPeerInstanceConfiguration.java | 10 +++- .../spi/pojo/BGPRibInstanceConfiguration.java | 11 +++- .../BGPPeerInstanceConfigurationTest.java | 8 ++- .../pojo/BGPRibInstanceConfigurationTest.java | 8 ++- .../n/paths/AddPathBestNPathSelection.java | 8 ++- .../yang/bgp/rib/impl/BGPPeerModule.java | 2 +- .../yang/bgp/rib/impl/RIBImplModule.java | 3 +- 14 files changed, 162 insertions(+), 22 deletions(-) diff --git a/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPGlobalProviderImpl.java b/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPGlobalProviderImpl.java index 4f53842a3d..3d5f7cecbc 100644 --- a/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPGlobalProviderImpl.java +++ b/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPGlobalProviderImpl.java @@ -72,7 +72,8 @@ final class BGPGlobalProviderImpl extends AbstractBGPOpenConfigMapper OpenConfigUtil.toGlobalAfiSafiMultiPath(afiSafi, tableType, config.getPathSelectionModes()))).build()) .setConfig(new ConfigBuilder() .setAs(config.getLocalAs()) .setRouterId(config.getBgpRibId()).build()).build(); diff --git a/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPNeighborProviderImpl.java b/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPNeighborProviderImpl.java index 41d681ad58..ce2b514dac 100644 --- a/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPNeighborProviderImpl.java +++ b/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPNeighborProviderImpl.java @@ -63,7 +63,8 @@ final class BGPNeighborProviderImpl extends AbstractBGPNeighborProvider OpenConfigUtil.toNeigborAfiSafiMultiPath(afiSAfi, tableType, config.getAddPathCapabilities()))) .build()) .setTimers(new TimersBuilder().setConfig( new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.timers.ConfigBuilder() diff --git a/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/util/OpenConfigUtil.java b/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/util/OpenConfigUtil.java index ccafcd2320..210324126b 100644 --- a/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/util/OpenConfigUtil.java +++ b/bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/util/OpenConfigUtil.java @@ -12,11 +12,23 @@ import com.google.common.base.Optional; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.function.BiFunction; +import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode; +import org.opendaylight.protocol.bgp.mode.impl.add.n.paths.AddPathBestNPathSelection; import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.use.multiple.paths.UseMultiplePathsBuilder; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.use.multiple.paths.use.multiple.paths.ConfigBuilder; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.use.multiple.paths.use.multiple.paths.EbgpBuilder; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.use.multiple.paths.use.multiple.paths.IbgpBuilder; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.AfiSafi1; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.AfiSafi1Builder; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.AfiSafi2; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.AfiSafi2Builder; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4LABELLEDUNICAST; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST; @@ -31,9 +43,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labe import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateAddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateSubsequentAddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamilies; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev150930.Ipv4Flow; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev150930.Ipv6Flow; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev150930.Linkstate; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.MplsLabeledVpnSubsequentAddressFamily; @@ -79,12 +93,13 @@ public final class OpenConfigUtil { return Optional.fromNullable(TABLETYPE_TO_AFISAFI.get(tableType)); } - public static List toAfiSafis(final List advertizedTables) { + public static List toAfiSafis(final List advertizedTables, final BiFunction function) { final List afiSafis = new ArrayList<>(advertizedTables.size()); for (final BgpTableType tableType : advertizedTables) { - final Optional afiSafi = toAfiSafi(new BgpTableTypeImpl(tableType.getAfi(), tableType.getSafi())); - if (afiSafi.isPresent()) { - afiSafis.add(afiSafi.get()); + final Optional afiSafiMaybe = toAfiSafi(new BgpTableTypeImpl(tableType.getAfi(), tableType.getSafi())); + if (afiSafiMaybe.isPresent()) { + final AfiSafi afiSafi = function.apply(afiSafiMaybe.get(), tableType); + afiSafis.add(afiSafi); } } return afiSafis; @@ -93,4 +108,40 @@ public final class OpenConfigUtil { public static String getModuleName(final String provider) { return provider.substring(provider.lastIndexOf('=') + 2, provider.length() - 2); } + + public static AfiSafi toNeigborAfiSafiMultiPath(final AfiSafi afiSafi, final BgpTableType tableType, final Collection addPathCapabilities) { + final java.util.Optional addPathMayBe = addPathCapabilities.stream().filter( + af -> af.getAfi() == tableType.getAfi() && af.getSafi() == tableType.getSafi()).findFirst(); + if (addPathMayBe.isPresent()) { + final AfiSafi2 afiSafi3 = new AfiSafi2Builder().setUseMultiplePaths( + new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.use.multiple.paths.neighbor.UseMultiplePathsBuilder().setConfig( + new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.use.multiple.paths.neighbor.use.multiple.paths.ConfigBuilder() + .setEnabled(true).build()).build()).build(); + return new AfiSafiBuilder(afiSafi).addAugmentation(AfiSafi2.class, afiSafi3).build(); + } + return afiSafi; + } + + public static AfiSafi toGlobalAfiSafiMultiPath(final AfiSafi afiSafi, final BgpTableType tableType, final Map pathSelectionModes) { + final PathSelectionMode pathSelection = pathSelectionModes.get(new TablesKey(tableType.getAfi(), tableType.getSafi())); + if (pathSelection == null) { + return afiSafi; + } + final Long maxPaths; + if (pathSelection instanceof AddPathBestNPathSelection) { + maxPaths = ((AddPathBestNPathSelection) pathSelection).getNBestPaths(); + } else { + maxPaths = null; + } + final AfiSafi1 afiSafi1 = new AfiSafi1Builder().setUseMultiplePaths( + new UseMultiplePathsBuilder().setConfig(new ConfigBuilder().setEnabled(true).build()) + .setEbgp(maxPaths != null ? new EbgpBuilder().setConfig( + new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.use.multiple.paths.use.multiple.paths.ebgp.ConfigBuilder() + .setMaximumPaths(maxPaths) + .build()).build() : null) + .setIbgp(maxPaths != null ? new IbgpBuilder().setConfig( + new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.use.multiple.paths.use.multiple.paths.ibgp.ConfigBuilder() + .setMaximumPaths(maxPaths).build()).build() : null).build()).build(); + return new AfiSafiBuilder(afiSafi).addAugmentation(AfiSafi1.class, afiSafi1).build(); + } } diff --git a/bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPGlobalProviderImplTest.java b/bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPGlobalProviderImplTest.java index c87dd6615d..3bc50cf243 100644 --- a/bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPGlobalProviderImplTest.java +++ b/bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPGlobalProviderImplTest.java @@ -65,7 +65,7 @@ public class BGPGlobalProviderImplTest { public void testApply() { final Bgp bgp = this.globalProvider.apply(new BGPRibInstanceConfiguration(new InstanceConfigurationIdentifier("instanceName"), new AsNumber(1L), new Ipv4Address("1.2.3.4"), null, - Lists.newArrayList(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)))); + Lists.newArrayList(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)), Collections.emptyMap())); final BgpBuilder bgpBuilder = new BgpBuilder(); bgpBuilder.setNeighbors(new NeighborsBuilder().build()); bgpBuilder.setPeerGroups(new PeerGroupsBuilder().setPeerGroup( diff --git a/bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPNeighborProviderImplTest.java b/bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPNeighborProviderImplTest.java index 1eb7d3b94a..506b7c93da 100644 --- a/bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPNeighborProviderImplTest.java +++ b/bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPNeighborProviderImplTest.java @@ -13,6 +13,7 @@ import static org.junit.Assert.assertEquals; import com.google.common.base.Optional; import com.google.common.collect.Lists; import java.math.BigDecimal; +import java.util.Collections; import java.util.List; import org.junit.Before; import org.junit.Test; @@ -119,7 +120,7 @@ public class BGPNeighborProviderImplTest { private BGPPeerInstanceConfiguration createConfiguration(final InstanceConfigurationIdentifier confId, final IpAddress ip, final PortNumber port, final short holdTimer, final PeerRole role, final boolean active, final List advertized, final AsNumber as, final Optional passwd) { - return new BGPPeerInstanceConfiguration(confId, ip, port, holdTimer, role, active, advertized, as, passwd); + return new BGPPeerInstanceConfiguration(confId, ip, port, holdTimer, role, active, advertized, as, passwd, Collections.emptyList()); } private Neighbor createNeighbor(final List families, final IpAddress ip, final String passwd, final AsNumber as, final PeerType peerType, final PeerRole role, final short timer, final boolean passive) { diff --git a/bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/util/OpenConfigUtilTest.java b/bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/util/OpenConfigUtilTest.java index 7607dfe467..d477f59cd4 100644 --- a/bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/util/OpenConfigUtilTest.java +++ b/bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/util/OpenConfigUtilTest.java @@ -11,6 +11,7 @@ package org.opendaylight.protocol.bgp.openconfig.impl.util; import static org.junit.Assert.assertEquals; import static org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil.getModuleName; import static org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil.toAfiSafi; + import com.google.common.collect.Lists; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -18,16 +19,26 @@ import java.util.Collections; import java.util.List; import org.junit.Assert; import org.junit.Test; +import org.opendaylight.protocol.bgp.mode.impl.add.all.paths.AllPathSelection; +import org.opendaylight.protocol.bgp.mode.impl.add.n.paths.AddPathBestNPathSelection; import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.use.multiple.paths.UseMultiplePaths; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.AfiSafi1; +import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.AfiSafi2; import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.SendReceive; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamiliesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily; public class OpenConfigUtilTest { + private static final BgpTableType BGP_TABLE_TYPE_IPV4 = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); + private static final AfiSafi AFISAFI_IPV4 = new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build(); private static final String TEST = "/modules/module[type='dom-concurrent-data-broker'][name='concurrent-data-broker']"; @Test @@ -38,14 +49,55 @@ public class OpenConfigUtilTest { @Test public void testToAfiSafi() { - assertEquals(toAfiSafi(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)).get(), - new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build()); + assertEquals(toAfiSafi(BGP_TABLE_TYPE_IPV4).get(), + AFISAFI_IPV4); } @Test public void testToAfiSafis() { - final List afiSafis = OpenConfigUtil.toAfiSafis(Lists.newArrayList(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class))); - Assert.assertEquals(Collections.singletonList(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build()), afiSafis); + final List afiSafis = OpenConfigUtil.toAfiSafis(Lists.newArrayList(BGP_TABLE_TYPE_IPV4), + (afisafi, tableType) -> afisafi); + Assert.assertEquals(Collections.singletonList(AFISAFI_IPV4), afiSafis); + } + + @Test + public void toNeigborAfiSafiMultiPathMatch() { + final AfiSafi afiSafi = OpenConfigUtil.toNeigborAfiSafiMultiPath(AFISAFI_IPV4, BGP_TABLE_TYPE_IPV4, + Lists.newArrayList(new AddressFamiliesBuilder(BGP_TABLE_TYPE_IPV4).setSendReceive(SendReceive.Both).build())); + Assert.assertTrue(afiSafi.getAugmentation(AfiSafi2.class).getUseMultiplePaths().getConfig().isEnabled()); + } + + @Test + public void toNeigborAfiSafiMultiPathNoMatch() { + final AfiSafi afiSafi = OpenConfigUtil.toNeigborAfiSafiMultiPath(AFISAFI_IPV4, BGP_TABLE_TYPE_IPV4, Collections.emptyList()); + Assert.assertEquals(AFISAFI_IPV4, afiSafi); + } + + @Test + public void toGlobalAfiSafiMultiPathNPaths() { + final AfiSafi afiSafi = OpenConfigUtil.toGlobalAfiSafiMultiPath(AFISAFI_IPV4, BGP_TABLE_TYPE_IPV4, + Collections.singletonMap(new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class), new AddPathBestNPathSelection(5L))); + final UseMultiplePaths multiplePaths = afiSafi.getAugmentation(AfiSafi1.class).getUseMultiplePaths(); + Assert.assertTrue(multiplePaths.getConfig().isEnabled()); + Assert.assertEquals(5, multiplePaths.getIbgp().getConfig().getMaximumPaths().intValue()); + Assert.assertEquals(5, multiplePaths.getEbgp().getConfig().getMaximumPaths().intValue()); + } + + @Test + public void toGlobalAfiSafiMultiPathAllPaths() { + final AfiSafi afiSafi = OpenConfigUtil.toGlobalAfiSafiMultiPath(AFISAFI_IPV4, BGP_TABLE_TYPE_IPV4, + Collections.singletonMap(new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class), new AllPathSelection())); + final UseMultiplePaths multiplePaths = afiSafi.getAugmentation(AfiSafi1.class).getUseMultiplePaths(); + Assert.assertTrue(multiplePaths.getConfig().isEnabled()); + Assert.assertNull(multiplePaths.getIbgp()); + Assert.assertNull(multiplePaths.getEbgp()); + } + + @Test + public void toGlobalAfiSafiMultiPathNoMatch() { + final AfiSafi afiSafi = OpenConfigUtil.toGlobalAfiSafiMultiPath(AFISAFI_IPV4, BGP_TABLE_TYPE_IPV4, + Collections.emptyMap()); + Assert.assertEquals(AFISAFI_IPV4, afiSafi); } @Test(expected=UnsupportedOperationException.class) diff --git a/bgp/openconfig-spi/pom.xml b/bgp/openconfig-spi/pom.xml index e89ae61d0b..ee1b16e24b 100644 --- a/bgp/openconfig-spi/pom.xml +++ b/bgp/openconfig-spi/pom.xml @@ -40,6 +40,10 @@ ${project.groupId} bgp-rib-api + + ${project.groupId} + bgp-path-selection-mode + org.opendaylight.mdsal.model ietf-inet-types-2013-07-15 diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfiguration.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfiguration.java index e0b66a5fd9..fcc91ec27a 100644 --- a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfiguration.java +++ b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfiguration.java @@ -16,6 +16,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamilies; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.tcpmd5.cfg.rev140427.Rfc2385Key; @@ -33,10 +34,13 @@ public final class BGPPeerInstanceConfiguration extends AbstractInstanceConfigur private final List advertizedTables; private final AsNumber asNumber; private final Optional password; + private final List addPathCapabilities; public BGPPeerInstanceConfiguration(final InstanceConfigurationIdentifier identifier, final IpAddress host, final PortNumber port, final short holdTimer, final PeerRole peerRole, - final boolean active, final List advertizedTables, final AsNumber asNumber, final Optional password) { + final boolean active, final List advertizedTables, final AsNumber asNumber, final Optional password, + final List addPathCapabilities) { super(identifier); + this.addPathCapabilities = addPathCapabilities; this.host = Preconditions.checkNotNull(host); this.port = Preconditions.checkNotNull(port); this.holdTimer = Preconditions.checkNotNull(holdTimer); @@ -79,4 +83,8 @@ public final class BGPPeerInstanceConfiguration extends AbstractInstanceConfigur return password; } + public List getAddPathCapabilities() { + return addPathCapabilities; + } + } diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfiguration.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfiguration.java index 1f95660075..e4e24a6a17 100644 --- a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfiguration.java +++ b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfiguration.java @@ -11,10 +11,13 @@ package org.opendaylight.protocol.bgp.openconfig.spi.pojo; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import java.util.List; +import java.util.Map; +import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode; import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; /** * POJO for holding BGP RIB module instance configuration @@ -26,10 +29,12 @@ public final class BGPRibInstanceConfiguration extends AbstractInstanceConfigura private final Ipv4Address bgpRibId; private final Ipv4Address clusterId; private final List tableTypes; + private final Map pathSelectionModes; public BGPRibInstanceConfiguration(final InstanceConfigurationIdentifier identifier, final AsNumber localAs, final Ipv4Address bgpRibId, - final Ipv4Address clusterId, final List tableTypes) { + final Ipv4Address clusterId, final List tableTypes, final Map pathSelectionModes) { super(identifier); + this.pathSelectionModes = pathSelectionModes; this.localAs = Preconditions.checkNotNull(localAs); this.bgpRibId = Preconditions.checkNotNull(bgpRibId); this.clusterId = clusterId; @@ -52,4 +57,8 @@ public final class BGPRibInstanceConfiguration extends AbstractInstanceConfigura return tableTypes; } + public Map getPathSelectionModes() { + return pathSelectionModes; + } + } diff --git a/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfigurationTest.java b/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfigurationTest.java index 1d2500116f..bae03e8cc2 100644 --- a/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfigurationTest.java +++ b/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfigurationTest.java @@ -18,7 +18,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.tcpmd5.cfg.rev140427.Rfc2385Key; @@ -31,7 +30,7 @@ public class BGPPeerInstanceConfigurationTest { private static final AsNumber AS_NUMBER = new AsNumber(72L); private final BGPPeerInstanceConfiguration config = new BGPPeerInstanceConfiguration(INSTANCE_NAME, HOST, PORT, HOLD_TIMER, PeerRole.Ibgp, - Boolean.FALSE, Collections.emptyList(), AS_NUMBER, Optional.absent()); + Boolean.FALSE, Collections.emptyList(), AS_NUMBER, Optional.absent(), Collections.emptyList()); @Test public final void testGetHost() { @@ -78,4 +77,9 @@ public class BGPPeerInstanceConfigurationTest { assertEquals(INSTANCE_NAME, config.getIdentifier()); } + @Test + public final void testGetAddPathCapabilities() { + assertEquals(Collections.EMPTY_LIST, config.getAddPathCapabilities()); + } + } diff --git a/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfigurationTest.java b/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfigurationTest.java index de1a1ddbe5..1272cb6680 100644 --- a/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfigurationTest.java +++ b/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfigurationTest.java @@ -16,7 +16,6 @@ import org.junit.Test; import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; ; @@ -28,7 +27,7 @@ public class BGPRibInstanceConfigurationTest { private static final AsNumber AS_NUMBER = new AsNumber(72L); private final BGPRibInstanceConfiguration config = new BGPRibInstanceConfiguration(INSTANCE_NAME, AS_NUMBER, BGP_ID, CLUSTER_ID, - Collections.emptyList()); + Collections.emptyList(), Collections.emptyMap()); @Test public final void testGetLocalAs() { @@ -55,4 +54,9 @@ public class BGPRibInstanceConfigurationTest { assertEquals(INSTANCE_NAME, config.getIdentifier()); } + @Test + public final void testGetPathSelectionModes() { + assertEquals(Collections.EMPTY_MAP, config.getPathSelectionModes()); + } + } diff --git a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/AddPathBestNPathSelection.java b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/AddPathBestNPathSelection.java index 44197e495d..5e05237bd9 100644 --- a/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/AddPathBestNPathSelection.java +++ b/bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/AddPathBestNPathSelection.java @@ -26,9 +26,13 @@ public class AddPathBestNPathSelection implements PathSelectionMode { @Override public RouteEntry createRouteEntry(final boolean isComplex) { if (isComplex) { - return new ComplexRouteEntry(this.nBestPaths); + return new ComplexRouteEntry(this.getNBestPaths()); } else { - return new SimpleRouteEntry(this.nBestPaths); + return new SimpleRouteEntry(this.getNBestPaths()); } } + + public Long getNBestPaths() { + return nBestPaths; + } } \ No newline at end of file diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java b/bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java index cb673e032f..69b256e112 100755 --- a/bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java @@ -279,7 +279,7 @@ public final class BGPPeerModule extends org.opendaylight.controller.config.yang this.bgpPeerInstanceConfiguration = new BGPPeerInstanceConfiguration(identifier, Rev130715Util.getIpvAddress(getNormalizedHost()), Rev130715Util.getPort(getPort().getValue()), getHoldtimer(), getPeerRole(), getInitiateConnection(), getAdvertizedTableDependency(), Rev130715Util.getASNumber(getAsOrDefault(getRibDependency()).getValue()), - getOptionaPassword(getPassword())); + getOptionaPassword(getPassword()), getAddPathDependency()); } @Override diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModule.java b/bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModule.java index b7ea5c75cd..62a355c58a 100755 --- a/bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModule.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModule.java @@ -122,7 +122,8 @@ public final class RIBImplModule extends org.opendaylight.controller.config.yang final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber as = Rev130715Util.getASNumber(getLocalAs()); final Ipv4Address bgpRibId = Rev130715Util.getIpv4Address(getBgpRibId()); final Ipv4Address clusterId = Rev130715Util.getIpv4Address(getClusterId()); - this.bgpRibConfig = new BGPRibInstanceConfiguration(identifier, as, bgpRibId, clusterId, tableDependency); + this.bgpRibConfig = new BGPRibInstanceConfiguration(identifier, as, bgpRibId, clusterId, tableDependency, + mapBestPathSelectionStrategyByFamily(getRibPathSelectionModeDependency())); } @Override -- 2.36.6