Bug-4827: BGP Add-Path OpenConfig Support 09/37709/3
authorMilos Fabian <milfabia@cisco.com>
Mon, 11 Apr 2016 21:12:56 +0000 (23:12 +0200)
committerRobert Varga <nite@hq.sk>
Sun, 8 May 2016 07:25:38 +0000 (07:25 +0000)
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 <milfabia@cisco.com>
14 files changed:
bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPGlobalProviderImpl.java
bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPNeighborProviderImpl.java
bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/util/OpenConfigUtil.java
bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPGlobalProviderImplTest.java
bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/openconfig/BGPNeighborProviderImplTest.java
bgp/openconfig-impl/src/test/java/org/opendaylight/protocol/bgp/openconfig/impl/util/OpenConfigUtilTest.java
bgp/openconfig-spi/pom.xml
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfiguration.java
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfiguration.java
bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfigurationTest.java
bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfigurationTest.java
bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/n/paths/AddPathBestNPathSelection.java
bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java
bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModule.java

index 4f53842a3d96552bef61bd5a7c2cd00bfd540e1f..3d5f7cecbc9f2afb262fec0b30a00f771f2aef56 100644 (file)
@@ -72,7 +72,8 @@ final class BGPGlobalProviderImpl extends AbstractBGPOpenConfigMapper<BGPRibInst
         bgpBuilder.setNeighbors(new NeighborsBuilder().build());
         bgpBuilder.setPeerGroups(new PeerGroupsBuilder().setPeerGroup(Collections.singletonList(APP_PEER_GROUP)).build());
         final Global global = new GlobalBuilder()
-            .setAfiSafis(new AfiSafisBuilder().setAfiSafi(OpenConfigUtil.toAfiSafis(config.getTableTypes())).build())
+            .setAfiSafis(new AfiSafisBuilder().setAfiSafi(OpenConfigUtil.toAfiSafis(config.getTableTypes(),
+                    (afiSafi, tableType) -> OpenConfigUtil.toGlobalAfiSafiMultiPath(afiSafi, tableType, config.getPathSelectionModes()))).build())
             .setConfig(new ConfigBuilder()
                 .setAs(config.getLocalAs())
                 .setRouterId(config.getBgpRibId()).build()).build();
index 41d681ad587f191114c844a10e42f6de18bf7ad3..ce2b514dacee644b93a111020e9213dce4a960e8 100644 (file)
@@ -63,7 +63,8 @@ final class BGPNeighborProviderImpl extends AbstractBGPNeighborProvider<BGPPeerI
                     .build())
             .setAfiSafis(
                     new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder()
-                    .setAfiSafi(OpenConfigUtil.toAfiSafis(config.getAdvertizedTables()))
+                    .setAfiSafi(OpenConfigUtil.toAfiSafis(config.getAdvertizedTables(),
+                            (afiSAfi, tableType) -> 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()
index ccafcd2320edd0c2a6738610830567363b6d937e..210324126be70112dfc2eeec5e6bc70309f3d1b3 100644 (file)
@@ -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<AfiSafi> toAfiSafis(final List<BgpTableType> advertizedTables) {
+    public static List<AfiSafi> toAfiSafis(final List<BgpTableType> advertizedTables, final BiFunction<AfiSafi, BgpTableType, AfiSafi> function) {
         final List<AfiSafi> afiSafis = new ArrayList<>(advertizedTables.size());
         for (final BgpTableType tableType : advertizedTables) {
-            final Optional<AfiSafi> afiSafi = toAfiSafi(new BgpTableTypeImpl(tableType.getAfi(), tableType.getSafi()));
-            if (afiSafi.isPresent()) {
-                afiSafis.add(afiSafi.get());
+            final Optional<AfiSafi> 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<AddressFamilies> addPathCapabilities) {
+        final java.util.Optional<AddressFamilies> 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<TablesKey, PathSelectionMode> 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();
+    }
 }
index c87dd6615dc197943814e263e6a011d41605a23e..3bc50cf243e9e4a2782868f882241cc834de5872 100644 (file)
@@ -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.<BgpTableType>newArrayList(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class))));
+                Lists.<BgpTableType>newArrayList(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)), Collections.emptyMap()));
         final BgpBuilder bgpBuilder = new BgpBuilder();
         bgpBuilder.setNeighbors(new NeighborsBuilder().build());
         bgpBuilder.setPeerGroups(new PeerGroupsBuilder().setPeerGroup(
index 1eb7d3b94adb62594f0ed65858b72179393b2659..506b7c93da992fababb9532e697dfefeaa81e7d7 100644 (file)
@@ -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<BgpTableType> advertized, final AsNumber as, final Optional<Rfc2385Key> 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<AfiSafi> families, final IpAddress ip, final String passwd, final AsNumber as, final PeerType peerType, final PeerRole role, final short timer, final boolean passive) {
index 7607dfe467d3ac96e14f35c0e7a10e6124e51560..d477f59cd41b3bd500d6eb91e70abe99d9f8c488 100644 (file)
@@ -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<AfiSafi> afiSafis = OpenConfigUtil.toAfiSafis(Lists.<BgpTableType>newArrayList(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)));
-        Assert.assertEquals(Collections.singletonList(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build()), afiSafis);
+        final List<AfiSafi> afiSafis = OpenConfigUtil.toAfiSafis(Lists.<BgpTableType>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)
index e89ae61d0bfd4b74d33c470390fa6f0727a9725c..ee1b16e24b782c169d8c49142315a830f41a8345 100644 (file)
             <groupId>${project.groupId}</groupId>
             <artifactId>bgp-rib-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>bgp-path-selection-mode</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal.model</groupId>
             <artifactId>ietf-inet-types-2013-07-15</artifactId>
index e0b66a5fd90c554fa1d0681264367a0325920c5a..fcc91ec27a5f1e5ded105002ec7c70e4f2cb74bf 100644 (file)
@@ -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<BgpTableType> advertizedTables;
     private final AsNumber asNumber;
     private final Optional<Rfc2385Key> password;
+    private final List<AddressFamilies> addPathCapabilities;
 
     public BGPPeerInstanceConfiguration(final InstanceConfigurationIdentifier identifier, final IpAddress host, final PortNumber port, final short holdTimer, final PeerRole peerRole,
-            final boolean active, final List<BgpTableType> advertizedTables, final AsNumber asNumber, final Optional<Rfc2385Key> password) {
+            final boolean active, final List<BgpTableType> advertizedTables, final AsNumber asNumber, final Optional<Rfc2385Key> password,
+            final List<AddressFamilies> 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<AddressFamilies> getAddPathCapabilities() {
+        return addPathCapabilities;
+    }
+
 }
index 1f956600756c233d52a4867020bf48bbabc13202..e4e24a6a1775910e4d5f8bd29126da5e71345390 100644 (file)
@@ -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<BgpTableType> tableTypes;
+    private final Map<TablesKey, PathSelectionMode> pathSelectionModes;
 
     public BGPRibInstanceConfiguration(final InstanceConfigurationIdentifier identifier, final AsNumber localAs, final Ipv4Address bgpRibId,
-            final Ipv4Address clusterId, final List<BgpTableType> tableTypes) {
+            final Ipv4Address clusterId, final List<BgpTableType> tableTypes, final Map<TablesKey, PathSelectionMode> 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<TablesKey, PathSelectionMode> getPathSelectionModes() {
+        return pathSelectionModes;
+    }
+
 }
index 1d2500116fdcbae7d94973e2e77fe1655dde5d97..bae03e8cc2efb0418a47b70fa3ef6b5f92b82a87 100644 (file)
@@ -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.<BgpTableType>emptyList(), AS_NUMBER, Optional.<Rfc2385Key>absent());
+            Boolean.FALSE, Collections.emptyList(), AS_NUMBER, Optional.<Rfc2385Key>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());
+    }
+
 }
index de1a1ddbe5d6e32cdee9a2f1d07c25152b7db091..1272cb6680335a129533729d7395bf6c4d337c0a 100644 (file)
@@ -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.<BgpTableType>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());
+    }
+
 }
index 44197e495dc8b195449e9b0ee8671f877f7ea478..5e05237bd9eefdcfbd1048850f459e9a4ceaf429 100644 (file)
@@ -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
index cb673e032fc4137316da7cbd4bcd6e35b7c1c1cf..69b256e11213a164169907e8373e19aa448a2918 100755 (executable)
@@ -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
index b7ea5c75cd896d7f1b555a4eea5fd8b038c39fac..62a355c58ab809d02bf2b002db9bf372a154e48d 100755 (executable)
@@ -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