BGPCEP-576: Neighbor’s local address configurable 90/70290/2
authorClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Tue, 3 Apr 2018 07:53:26 +0000 (09:53 +0200)
committerClaudio David Gasparini <claudio.gasparini@pantheon.tech>
Tue, 3 Apr 2018 19:12:23 +0000 (19:12 +0000)
Change-Id: Ic4aaf8dbb408e37a0df40e320793dc1330879b06
Signed-off-by: Claudio D. Gasparini <claudio.gasparini@pantheon.tech>
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPDispatcherImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtil.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPDispatcher.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ParserToSalTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java

index a35bd0a02330312d7239756431256fcf9a96c749..5ac92300d8e682da9471391e0a382b808b43c99a 100644 (file)
@@ -76,8 +76,10 @@ public class BGPDispatcherImpl implements BGPDispatcher, AutoCloseable {
         this.handlerFactory = new BGPHandlerFactory(messageRegistry);
     }
 
-    private synchronized Future<BGPSessionImpl> createClient(final InetSocketAddress remoteAddress,
-            final int retryTimer, final Bootstrap clientBootStrap) {
+    @VisibleForTesting
+    public synchronized Future<BGPSessionImpl> createClient(final InetSocketAddress localAddress,
+            final InetSocketAddress remoteAddress, final int retryTimer, final boolean reuseAddress) {
+        final Bootstrap clientBootStrap = createClientBootStrap(KeyMapping.getKeyMapping(), reuseAddress, localAddress);
         final BGPClientSessionNegotiatorFactory snf = new BGPClientSessionNegotiatorFactory(this.bgpPeerRegistry);
         final ChannelPipelineInitializer<BGPSessionImpl> initializer = BGPChannel.createChannelPipelineInitializer(
                 this.handlerFactory, snf);
@@ -90,15 +92,8 @@ public class BGPDispatcherImpl implements BGPDispatcher, AutoCloseable {
         return sessionPromise;
     }
 
-    @VisibleForTesting
-    public synchronized Future<BGPSessionImpl> createClient(final InetSocketAddress localAddress,
-            final InetSocketAddress remoteAddress, final int retryTimer, final boolean reuseAddress) {
-        final Bootstrap clientBootStrap = createClientBootStrap(KeyMapping.getKeyMapping(), reuseAddress);
-        clientBootStrap.localAddress(localAddress);
-        return createClient(remoteAddress, retryTimer, clientBootStrap);
-    }
-
-    private synchronized Bootstrap createClientBootStrap(final KeyMapping keys, final boolean reuseAddress) {
+    private synchronized Bootstrap createClientBootStrap(final KeyMapping keys, final boolean reuseAddress,
+            final InetSocketAddress localAddress) {
         final Bootstrap bootstrap = new Bootstrap();
         if (Epoll.isAvailable()) {
             bootstrap.channel(EpollSocketChannel.class);
@@ -123,12 +118,13 @@ public class BGPDispatcherImpl implements BGPDispatcher, AutoCloseable {
         if (bootstrap.config().group() == null) {
             bootstrap.group(this.workerGroup);
         }
+        bootstrap.localAddress(localAddress);
 
         return bootstrap;
     }
 
     @Override
-    public synchronized void close() throws InterruptedException {
+    public synchronized void close() {
         if (Epoll.isAvailable()) {
             LOG.debug("Closing Dispatcher");
             this.workerGroup.shutdownGracefully(0, TIMEOUT, TimeUnit.SECONDS);
@@ -138,8 +134,8 @@ public class BGPDispatcherImpl implements BGPDispatcher, AutoCloseable {
 
     @Override
     public synchronized Future<Void> createReconnectingClient(final InetSocketAddress remoteAddress,
-            final int retryTimer, final KeyMapping keys) {
-        return createReconnectingClient(remoteAddress, retryTimer, keys, null, false);
+            final InetSocketAddress localAddress, final int retryTimer, final KeyMapping keys) {
+        return createReconnectingClient(remoteAddress, retryTimer, keys, localAddress, false);
     }
 
     @VisibleForTesting
@@ -147,8 +143,7 @@ public class BGPDispatcherImpl implements BGPDispatcher, AutoCloseable {
             final int retryTimer, final KeyMapping keys, final InetSocketAddress localAddress,
             final boolean reuseAddress) {
         final BGPClientSessionNegotiatorFactory snf = new BGPClientSessionNegotiatorFactory(this.bgpPeerRegistry);
-        final Bootstrap bootstrap = createClientBootStrap(keys, reuseAddress);
-        bootstrap.localAddress(localAddress);
+        final Bootstrap bootstrap = createClientBootStrap(keys, reuseAddress, localAddress);
         final BGPReconnectPromise<?> reconnectPromise = new BGPReconnectPromise<>(GlobalEventExecutor.INSTANCE,
                 remoteAddress, retryTimer, bootstrap, this.bgpPeerRegistry,
                 BGPChannel.createChannelPipelineInitializer(this.handlerFactory, snf));
index 3189e6f7ef44f877b7ff96c6402c5cce60ea596e..fe4beb7b64215790bf9d987f97dcd5cece51c3d4 100644 (file)
@@ -9,7 +9,6 @@
 package org.opendaylight.protocol.bgp.rib.impl.config;
 
 import static java.util.Objects.requireNonNull;
-import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getGlobalClusterIdentifier;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
@@ -46,6 +45,7 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.p
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
 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.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.message.rev171207.open.message.BgpParameters;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.open.message.BgpParametersBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.open.message.bgp.parameters.OptionalCapabilities;
@@ -221,6 +221,7 @@ public final class BgpPeer implements PeerBean, BGPPeerStateConsumer {
         private final InetSocketAddress inetAddress;
         private final int retryTimer;
         private final KeyMapping keys;
+        private final InetSocketAddress localAddress;
         private final BGPPeer bgpPeer;
         private final IpAddress neighborAddress;
         private final BGPSessionPreferences prefs;
@@ -260,7 +261,7 @@ public final class BgpPeer implements PeerBean, BGPPeerStateConsumer {
 
             final List<BgpParameters> bgpParameters = getBgpParameters(afisSAfis, rib, tableTypeRegistry);
             final KeyMapping keyMapping = OpenConfigMappingUtil.getNeighborKey(neighbor);
-
+            final IpAddress neighborLocalAddress = OpenConfigMappingUtil.getLocalAddress(neighbor.getTransport());
             int hold = OpenConfigMappingUtil.getHoldTimer(neighbor, peerGroup);
             final AsNumber ribAs = rib.getLocalAs();
             final AsNumber neighborAs = OpenConfigMappingUtil.getPeerAs(neighbor, peerGroup, ribAs);
@@ -271,8 +272,13 @@ public final class BgpPeer implements PeerBean, BGPPeerStateConsumer {
             this.retryTimer = OpenConfigMappingUtil.getRetryTimer(neighbor, peerGroup);
             this.dispatcher = rib.getDispatcher();
 
-            this.inetAddress = Ipv4Util.toInetSocketAddress(this.neighborAddress,
-                    OpenConfigMappingUtil.getPort(neighbor, peerGroup));
+            final PortNumber port = OpenConfigMappingUtil.getPort(neighbor, peerGroup);
+            this.inetAddress = Ipv4Util.toInetSocketAddress(this.neighborAddress, port);
+            if (neighborLocalAddress != null) {
+                this.localAddress = Ipv4Util.toInetSocketAddress(neighborLocalAddress, port);
+            } else {
+                this.localAddress = null;
+            }
             this.keys = keyMapping;
         }
 
@@ -282,8 +288,8 @@ public final class BgpPeer implements PeerBean, BGPPeerStateConsumer {
             this.bgpPeer.instantiateServiceInstance();
             this.dispatcher.getBGPPeerRegistry().addPeer(this.neighborAddress, this.bgpPeer, this.prefs);
             if (this.activeConnection) {
-                this.connection = this.dispatcher.createReconnectingClient(this.inetAddress, this.retryTimer,
-                        this.keys);
+                this.connection = this.dispatcher.createReconnectingClient(this.inetAddress, this.localAddress,
+                        this.retryTimer, this.keys);
             }
         }
 
index d4bd0f6c412b0ceb650b1b158bad46004d404e41..30ccb2ec56a2d34e7145c8acd36bf0cdce573769 100644 (file)
@@ -33,6 +33,7 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.r
 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.rev151009.BgpNeighborAddPathsConfig;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborGroup;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborTransportConfig;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflector;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Timers;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
@@ -46,6 +47,7 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.PeerType;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
 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.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.rev171207.BgpTableType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.SendReceive;
@@ -411,4 +413,15 @@ public final class OpenConfigMappingUtil {
 
         return port;
     }
+
+    @Nullable
+    public static IpAddress getLocalAddress(@Nullable final Transport transport) {
+        if (transport != null && transport.getConfig() != null) {
+            final BgpNeighborTransportConfig.LocalAddress localAddress = transport.getConfig().getLocalAddress();
+            if (localAddress != null ) {
+                return localAddress.getIpAddress();
+            }
+        }
+        return null;
+    }
 }
index 03713c5776bca099e99074472c5c117df413623b..566c7490e257d563e869808d5f86b832343aad34 100755 (executable)
@@ -10,6 +10,8 @@ package org.opendaylight.protocol.bgp.rib.impl.spi;
 import io.netty.channel.ChannelFuture;
 import io.netty.util.concurrent.Future;
 import java.net.InetSocketAddress;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import org.opendaylight.protocol.concepts.KeyMapping;
 
 /**
@@ -20,11 +22,14 @@ public interface BGPDispatcher {
      * Creates Reconnecting client.
      *
      * @param remoteAddress remote Peer Address
+     * @param localAddress  local Peer address
      * @param retryTimer    Retry timer
      * @param keys          for TCPMD5
      * @return Future promising a client session
      */
-    Future<Void> createReconnectingClient(InetSocketAddress remoteAddress, int retryTimer, KeyMapping keys);
+    @Nonnull
+    Future<Void> createReconnectingClient(@Nonnull InetSocketAddress remoteAddress,
+            @Nullable InetSocketAddress localAddress, int retryTimer, @Nonnull KeyMapping keys);
 
     /**
      * Create new BGP server to accept incoming bgp connections (bound to provided socket localAddress).
@@ -32,6 +37,7 @@ public interface BGPDispatcher {
      * @param localAddress Peer localAddress
      * @return ChannelFuture promising a client session
      */
+    @Nonnull
     ChannelFuture createServer(InetSocketAddress localAddress);
 
     /**
@@ -39,5 +45,6 @@ public interface BGPDispatcher {
      *
      * @return BGPPeerRegistry
      */
+    @Nonnull
     BGPPeerRegistry getBGPPeerRegistry();
 }
index b80998dfa9813319d4ccc7c486c419baa55b6f3c..1dafdbc8b45f973e714267423b221966a07974e7 100755 (executable)
@@ -9,6 +9,8 @@ package org.opendaylight.protocol.bgp.rib.impl;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
 import static org.opendaylight.protocol.bgp.rib.impl.AbstractAddPathTest.AS_NUMBER;
 import static org.opendaylight.protocol.bgp.rib.impl.AbstractAddPathTest.BGP_ID;
 import static org.opendaylight.protocol.util.CheckUtil.readDataOperational;
@@ -83,8 +85,8 @@ public class ParserToSalTest extends DefaultRibPoliciesMockTest {
                 .getSingletonInstance().getMessageRegistry(), Lists.newArrayList(fixMessages(bgpMessages)));
 
         Mockito.doReturn(GlobalEventExecutor.INSTANCE.newSucceededFuture(null)).when(this.dispatcher)
-                .createReconnectingClient(Mockito.any(InetSocketAddress.class), Mockito.anyInt(),
-                        Mockito.any(KeyMapping.class));
+                .createReconnectingClient(any(InetSocketAddress.class), any(InetSocketAddress.class),
+                        anyInt(), any(KeyMapping.class));
 
         this.ext1 = new SimpleRIBExtensionProviderContext();
         this.ext2 = new SimpleRIBExtensionProviderContext();
index 44376e7afe7932a75046909610d520763f5e754d..30875e25835dbf0641cb7dd7c1819869e9f73000 100644 (file)
@@ -126,8 +126,8 @@ class AbstractConfig extends DefaultRibPoliciesMockTest {
         doReturn(this.listener).when(this.dataTreeChangeService).registerDataTreeChangeListener(any(), any());
         doReturn(new BgpId("127.0.0.1")).when(this.rib).getBgpIdentifier();
         doReturn(true).when(this.future).cancel(true);
-        doReturn(this.future).when(this.dispatcher)
-                .createReconnectingClient(any(InetSocketAddress.class), anyInt(), any(KeyMapping.class));
+        doReturn(this.future).when(this.dispatcher).createReconnectingClient(any(InetSocketAddress.class),
+                any(InetSocketAddress.class), anyInt(), any(KeyMapping.class));
         doReturn(this.dispatcher).when(this.rib).getDispatcher();
 
         doReturn(java.util.Optional.of(new BgpTableTypeImpl(Ipv4AddressFamily.class,
index c5b9fc3be0ad9de36575741233cd9cf8811ff15e..8de2f9878468fa6f6862c139ea48fa6c4fda0523 100644 (file)
@@ -15,6 +15,7 @@ import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 
 import java.math.BigDecimal;
 import java.net.InetSocketAddress;
@@ -133,14 +134,14 @@ public class BgpPeerTest extends AbstractConfig {
                 .setTransport(createTransport()).setAddPaths(createAddPath()).build();
 
         this.bgpPeer.start(this.rib, neighbor, null, this.peerGroupLoader, this.tableTypeRegistry);
-        Mockito.verify(this.rib).createPeerDOMChain(any());
-        Mockito.verify(this.rib, times(2)).getLocalAs();
-        Mockito.verify(this.rib).getLocalTables();
+        verify(this.rib).createPeerDOMChain(any());
+        verify(this.rib, times(2)).getLocalAs();
+        verify(this.rib).getLocalTables();
 
         this.bgpPeer.instantiateServiceInstance();
-        Mockito.verify(this.bgpPeerRegistry).addPeer(any(), any(), any());
-        Mockito.verify(this.dispatcher).createReconnectingClient(any(InetSocketAddress.class),
-                anyInt(), any(KeyMapping.class));
+        verify(this.bgpPeerRegistry).addPeer(any(), any(), any());
+        verify(this.dispatcher).createReconnectingClient(any(InetSocketAddress.class),
+                any(InetSocketAddress.class), anyInt(), any(KeyMapping.class));
 
         try {
             this.bgpPeer.start(this.rib, neighbor, null, this.peerGroupLoader, this.tableTypeRegistry);
@@ -151,24 +152,24 @@ public class BgpPeerTest extends AbstractConfig {
         this.bgpPeer.setServiceRegistration(this.serviceRegistration);
         this.bgpPeer.closeServiceInstance();
         this.bgpPeer.close();
-        Mockito.verify(this.future).cancel(true);
+        verify(this.future).cancel(true);
 
         this.bgpPeer.restart(this.rib, null, this.peerGroupLoader, this.tableTypeRegistry);
         this.bgpPeer.instantiateServiceInstance();
-        Mockito.verify(this.rib, times(2)).createPeerDOMChain(any());
-        Mockito.verify(this.rib, times(4)).getLocalAs();
-        Mockito.verify(this.rib, times(2)).getLocalTables();
+        verify(this.rib, times(2)).createPeerDOMChain(any());
+        verify(this.rib, times(4)).getLocalAs();
+        verify(this.rib, times(2)).getLocalTables();
 
         final Neighbor neighborExpected = createNeighborExpected(NEIGHBOR_ADDRESS);
         assertTrue(this.bgpPeer.containsEqualConfiguration(neighborExpected));
         assertFalse(this.bgpPeer.containsEqualConfiguration(createNeighborExpected(
                 new IpAddress(new Ipv4Address("127.0.0.2")))));
-        Mockito.verify(this.bgpPeerRegistry).removePeer(any(IpAddress.class));
+        verify(this.bgpPeerRegistry).removePeer(any(IpAddress.class));
 
         this.bgpPeer.closeServiceInstance();
         this.bgpPeer.close();
-        Mockito.verify(this.serviceRegistration).unregister();
-        Mockito.verify(this.future, times(2)).cancel(true);
+        verify(this.serviceRegistration).unregister();
+        verify(this.future, times(2)).cancel(true);
 
         final Neighbor neighborDiffConfig = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
                 .setAfiSafis(createAfiSafi()).build();
index c11358a266c0ebc98e09f9112f8f58b8a7303d1f..673136b8735460b338fa0a33b9cce7c21b641815 100644 (file)
@@ -48,6 +48,7 @@ import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
 import org.opendaylight.protocol.bgp.rib.spi.BGPPeerTracker;
 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.rev151009.BgpNeighborTransportConfig;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder;
@@ -75,6 +76,7 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.re
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
 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.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.rev171207.BgpTableType;
@@ -97,8 +99,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.open
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180321.PeerGroupTransportConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180321.PeerGroupTransportConfigBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.PeerRole;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.rib.TablesKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
 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;
@@ -115,6 +115,7 @@ public class OpenConfigMappingUtilTest {
     private static final NeighborKey NEIGHBOR_KEY = new NeighborKey(NEIGHBOR_ADDRESS);
     private static final Ipv4Address ROUTER_ID = new Ipv4Address("1.2.3.4");
     private static final Ipv4Address CLUSTER_ID = new Ipv4Address("4.3.2.1");
+    private static final Ipv4Address LOCAL_HOST = new Ipv4Address("127.0.0.1");
 
     private static final Long ALL_PATHS = 0L;
     private static final Long N_PATHS = 2L;
@@ -126,11 +127,8 @@ public class OpenConfigMappingUtilTest {
             UnicastSubsequentAddressFamily.class);
     private static final BgpTableType BGP_TABLE_TYPE_IPV6
             = new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class);
-    private static final AfiSafi AFISAFI_IPV4 = new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build();
-    private static final TablesKey K4 = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
 
     private static final AsNumber AS = new AsNumber(72L);
-    private static final BgpId BGP_ID = new BgpId(NEIGHBOR_ADDRESS.getIpv4Address());
     private static final List<AddressFamilies> FAMILIES;
     private static final List<BgpTableType> TABLE_TYPES;
     private static final List<AfiSafi> AFISAFIS = new ArrayList<>();
@@ -298,6 +296,20 @@ public class OpenConfigMappingUtilTest {
                 .setTransport(transport.setConfig(portConfigGroup).build()).build()));
     }
 
+    @Test
+    public void testGetLocalAddress() {
+        assertNull(OpenConfigMappingUtil.getLocalAddress(null));
+        final TransportBuilder transport = new TransportBuilder();
+        assertNull(OpenConfigMappingUtil.getLocalAddress(transport.build()));
+        assertNull(OpenConfigMappingUtil.getLocalAddress(transport.setConfig(
+                new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport
+                        .ConfigBuilder().build()).build()));
+        assertEquals(new IpAddress(LOCAL_HOST), OpenConfigMappingUtil.getLocalAddress(transport.setConfig(
+                new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport
+                        .ConfigBuilder().setLocalAddress(new BgpNeighborTransportConfig
+                        .LocalAddress(new IpAddress(new Ipv4Address(LOCAL_HOST.getValue())))).build()).build()));
+    }
+
     @Test
     public void testGetAfiSafiWithDefault() {
         final ImmutableList<AfiSafi> defaultValue