Bug 5061: Integrate BGPPeerModule with blueprint 09/43709/1
authorMilos Fabian <milfabia@cisco.com>
Thu, 21 Jul 2016 09:02:11 +0000 (11:02 +0200)
committerMilos Fabian <milfabia@cisco.com>
Thu, 11 Aug 2016 11:54:10 +0000 (11:54 +0000)
Instead of creating a new BGPPeer instance via CSS module,
transform peer configuration to OpenConfig Neighbor DTO
and write to config DS. BGP deployer will take care of the instance creation.
Add more mapping utility funtions to OpenConfig mapping service.
Also we want to register peer instance as a runtime MX bean to collect statistics,
hence register Peer as a OSGi service and retreive it when module's createInstance
is invoked to register bean there.

Change-Id: Ic5b1ed556f3af000a96cde94aaa669fed2b64f74
Signed-off-by: Milos Fabian <milfabia@cisco.com>
(cherry picked from commit 912da09d223db30bc7db7e10b92f474ed82b87ea)

bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/BGPOpenConfigMappingServiceImpl.java
bgp/openconfig-impl/src/main/java/org/opendaylight/protocol/bgp/openconfig/impl/util/OpenConfigUtil.java
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPOpenConfigMappingService.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/BGPPeerModuleFactory.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.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/InstanceType.java
bgp/rib-impl/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/AbstractRIBImplModuleTest.java

index 588008ee68c307fb41b05ab92bcb5ee190a164d9..ccf252a85f5af22375c7b3a4d47d3567058e1a04 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.protocol.bgp.openconfig.impl;
 import static org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil.APPLICATION_PEER_GROUP_NAME;
 
 import com.google.common.base.Optional;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -25,7 +26,12 @@ import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
 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.rev151009.bgp.global.base.AfiSafisBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.ConfigBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflectorBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroup;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroupBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroupKey;
@@ -36,11 +42,14 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.t
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.NeighborsBuilder;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.PeerGroups;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.PeerGroupsBuilder;
+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.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolBuilder;
 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.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.SendReceive;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamilies;
@@ -51,9 +60,11 @@ 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.rev160614.Protocol1Builder;
 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.bgp.rib.rev130925.RibId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.SimpleRoutingPolicy;
 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.BgpId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.rfc2385.cfg.rev160324.Rfc2385Key;
 
 public final class BGPOpenConfigMappingServiceImpl implements BGPOpenConfigMappingService {
 
@@ -150,4 +161,50 @@ public final class BGPOpenConfigMappingServiceImpl implements BGPOpenConfigMappi
         return bgpBuilder.build();
     }
 
+    @Override
+    public Neighbor fromBgpPeer(final List<AddressFamilies> addPathCapabilities,
+            final List<BgpTableType> advertisedTables, final Integer holdTimer, final IpAddress ipAddress,
+            final Boolean isActive, final Rfc2385Key password, final PortNumber portNumber, final Integer retryTimer,
+            final AsNumber remoteAs, final PeerRole peerRole, final SimpleRoutingPolicy simpleRoutingPolicy) {
+        final NeighborBuilder neighborBuilder = new NeighborBuilder();
+        neighborBuilder.setNeighborAddress(ipAddress);
+        neighborBuilder.setKey(new NeighborKey(ipAddress));
+        neighborBuilder.setAfiSafis(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder().setAfiSafi(OpenConfigUtil.toAfiSafis(advertisedTables,
+                (afiSafi, tableType) -> OpenConfigUtil.toNeighborAfiSafiAddPath(afiSafi, tableType, addPathCapabilities))).build());
+        neighborBuilder.setTransport(new TransportBuilder().setConfig(
+                new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.ConfigBuilder()
+                .setPassiveMode(!isActive)
+                .build()).build());
+        neighborBuilder.setConfig(
+                new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder()
+                .setAuthPassword(password != null ? password.getValue() : null)
+                .setPeerAs(remoteAs)
+                .setPeerType(toPeerTye(peerRole))
+                .build());
+        neighborBuilder.setTimers(new TimersBuilder().setConfig(
+                new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.timers.ConfigBuilder()
+                .setHoldTime(BigDecimal.valueOf(holdTimer))
+                .setConnectRetry(BigDecimal.valueOf(retryTimer))
+                .build()).build());
+        neighborBuilder.setRouteReflector(new RouteReflectorBuilder().setConfig(
+                new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.route.reflector.ConfigBuilder()
+                .setRouteReflectorClient(peerRole == PeerRole.RrClient).build()).build());
+        return neighborBuilder.build();
+    }
+
+    private static PeerType toPeerTye(final PeerRole peerRole) {
+        switch (peerRole) {
+        case Ibgp:
+        case RrClient:
+            return PeerType.INTERNAL;
+        case Ebgp:
+            return PeerType.EXTERNAL;
+        case Internal:
+            break;
+        default:
+            break;
+        }
+        return null;
+    }
+
 }
index 64f54eddac6958c9fed724bdb8b3374ae66edcf3..0673519604125029c0d41854ad06b4b41e9b8ddc 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.protocol.bgp.openconfig.impl.util;
 import com.google.common.base.Optional;
 import com.google.common.collect.BiMap;
 import com.google.common.collect.ImmutableBiMap;
+import com.google.common.collect.Iterables;
 import com.google.common.primitives.Shorts;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -51,6 +52,7 @@ 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.SendReceive;
 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.rev160614.IPV4FLOW;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.IPV4L3VPNFLOW;
@@ -183,6 +185,35 @@ public final class OpenConfigUtil {
                 addPath).build();
     }
 
+    public static AfiSafi toNeighborAfiSafiAddPath(final AfiSafi afiSafi, final BgpTableType tableType, final List<AddressFamilies> capabilities) {
+        final Optional<AddressFamilies> capability = Iterables.tryFind(capabilities, af -> af.getAfi().equals(tableType.getAfi()) && af.getSafi().equals(tableType.getSafi()));
+        if (!capability.isPresent()) {
+            return afiSafi;
+        }
+        return new AfiSafiBuilder(afiSafi)
+        .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2.class,
+                fromSendReceiveMode(capability.get().getSendReceive())).build();
+    }
+
+    private static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2 fromSendReceiveMode(final SendReceive mode) {
+        final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2Builder builder =
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2Builder();
+        switch (mode) {
+        case Both:
+            builder.setReceive(true).setSendMax((short) 0);
+            break;
+        case Receive:
+            builder.setReceive(true);
+            break;
+        case Send:
+            builder.setReceive(false).setSendMax((short) 0);
+            break;
+        default:
+            break;
+        }
+        return builder.build();
+    }
+
     public static boolean isAppNeighbor(final Neighbor neighbor) {
         final Config1 config1 = neighbor.getConfig().getAugmentation(Config1.class);
         if (config1 != null) {
index 8c6ea298f88787d7e8d671f1ff8d2972a551c223..9de22d9e90b88befd066407bc92af99010dc9e2b 100644 (file)
@@ -15,13 +15,17 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.r
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
 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.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.bgp.rib.rev130925.RibId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.SimpleRoutingPolicy;
 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.BgpId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.rfc2385.cfg.rev160324.Rfc2385Key;
 
 public interface BGPOpenConfigMappingService {
 
@@ -37,4 +41,8 @@ public interface BGPOpenConfigMappingService {
 
     Protocol fromRib(BgpId bgpId, ClusterIdentifier clusterIdentifier, RibId ribId, AsNumber localAs, List<BgpTableType> localTables,
             Map<TablesKey, PathSelectionMode> pathSelectionStrategies);
+
+    Neighbor fromBgpPeer(List<AddressFamilies> addPathCapabilities,
+            List<BgpTableType> advertisedTables, Integer holdTimer, IpAddress ipAddress, Boolean isActive,
+            Rfc2385Key password, PortNumber portNumber, Integer retryTimer, AsNumber remoteAs, PeerRole peerRole, SimpleRoutingPolicy simpleRoutingPolicy);
 }
index 1cd73d8843a00ecb5f2f914fe2d93c5dcb945464..91ceb1864b351d3c3e3a884fdc2335cc19fe3983 100755 (executable)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2013, 2016 Cisco Systems, Inc. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  */
 package org.opendaylight.controller.config.yang.bgp.rib.impl;
 
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.net.InetAddresses;
+import com.google.common.reflect.AbstractInvocationHandler;
+import com.google.common.reflect.Reflection;
 import io.netty.channel.epoll.Epoll;
-import io.netty.util.concurrent.Future;
-import java.net.InetSocketAddress;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.lang.reflect.Method;
 import org.opendaylight.controller.config.api.JmxAttributeValidationException;
-import org.opendaylight.protocol.bgp.openconfig.spi.BGPConfigModuleTracker;
-import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigProvider;
-import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenconfigMapper;
-import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
-import org.opendaylight.protocol.bgp.openconfig.spi.pojo.BGPPeerInstanceConfiguration;
-import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
-import org.opendaylight.protocol.bgp.parser.spi.MultiprotocolCapabilitiesUtil;
-import org.opendaylight.protocol.bgp.rib.impl.BGPPeer;
-import org.opendaylight.protocol.bgp.rib.impl.StrictBGPPeerRegistry;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
+import org.opendaylight.controller.config.api.osgi.WaitingServiceTracker;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BgpDeployer;
+import org.opendaylight.protocol.bgp.rib.impl.spi.InstanceType;
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
-import org.opendaylight.protocol.concepts.KeyMapping;
-import org.opendaylight.protocol.util.Ipv6Util;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
+import org.opendaylight.protocol.util.Ipv4Util;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
+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.rev151009.bgp.top.bgp.Neighbors;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
+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.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.IpAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParametersBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.OptionalCapabilities;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.OptionalCapabilitiesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParametersBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.c.parameters.As4BytesCapabilityBuilder;
-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.CParameters1;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.AddPathCapabilityBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.GracefulRestartCapabilityBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.MultiprotocolCapabilityBuilder;
-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.rev160614.Protocol1;
 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.rfc2385.cfg.rev160324.Rfc2385Key;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.osgi.framework.BundleContext;
 
 /**
  *
  */
+@Deprecated
 public final class BGPPeerModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPPeerModule {
-    private static final Logger LOG = LoggerFactory.getLogger(BGPPeerModule.class);
+
+    private BundleContext bundleContext;
 
     public BGPPeerModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier,
             final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
@@ -95,192 +76,56 @@ public final class BGPPeerModule extends org.opendaylight.controller.config.yang
                     "Internal Peer Role is reserved for Application Peer use.", peerRoleJmxAttribute);
         }
 
-        if (getOptionalPassword(getPassword()).isPresent()) {
+        if (isPasswordPresent(getPassword())) {
             JmxAttributeValidationException.checkCondition(Epoll.isAvailable(),
                     "BGP Peer is configured with password but native transport is not available", passwordJmxAttribute);
         }
 
     }
 
-    private InetSocketAddress createAddress() {
-        final IpAddress ip = getHost();
-        Preconditions.checkArgument(ip.getIpv4Address() != null || ip.getIpv6Address() != null, "Failed to handle host %s", ip);
-        if (ip.getIpv4Address() != null) {
-            return new InetSocketAddress(InetAddresses.forString(ip.getIpv4Address().getValue()), getPort().getValue());
-        }
-        return new InetSocketAddress(InetAddresses.forString(ip.getIpv6Address().getValue()), getPort().getValue());
-    }
-
     @Override
     public java.lang.AutoCloseable createInstance() {
         final RIB r = getRibDependency();
-
-        final List<BgpParameters> tlvs = getTlvs(r);
-        final AsNumber remoteAs = getAsOrDefault(r);
-        final BGPSessionPreferences prefs = new BGPSessionPreferences(r.getLocalAs(), getHoldtimer(), r.getBgpIdentifier(), remoteAs, tlvs,
-                getMD5Password(getPassword()));
-        final BGPPeer bgpClientPeer;
-        final IpAddress host = getNormalizedHost();
-        if (getPeerRole() != null) {
-            bgpClientPeer = new BGPPeer(peerName(host), r, getPeerRole(), getSimpleRoutingPolicy(), getRpcRegistryDependency());
-        } else {
-            bgpClientPeer = new BGPPeer(peerName(host), r, PeerRole.Ibgp, getSimpleRoutingPolicy(), getRpcRegistryDependency());
-        }
-
-        bgpClientPeer.registerRootRuntimeBean(getRootRuntimeBeanRegistratorWrapper());
-
-        getPeerRegistryBackwards().addPeer(host, bgpClientPeer, prefs);
-
-        final BGPPeerModuleTracker moduleTracker = new BGPPeerModuleTracker(r.getOpenConfigProvider());
-        moduleTracker.onInstanceCreate();
-
-        final CloseableNoEx peerCloseable = () -> {
-            bgpClientPeer.close();
-            getPeerRegistryBackwards().removePeer(host);
-            moduleTracker.onInstanceClose();
-        };
-
-        // Initiate connection
-        if(getInitiateConnection()) {
-            final Future<Void> cf = initiateConnection(createAddress(), getOptionalPassword(getPassword()), getPeerRegistryBackwards());
-            return () -> {
-                cf.cancel(true);
-                peerCloseable.close();
-            };
-        } else {
-            return peerCloseable;
-        }
-    }
-
-    private interface CloseableNoEx extends AutoCloseable {
-        @Override
-        void close();
-    }
-
-    private AsNumber getAsOrDefault(final RIB r) {
-        // Remote AS number defaults to our local AS
-        final AsNumber remoteAs;
-        if (getRemoteAs() != null) {
-            remoteAs = new AsNumber(getRemoteAs());
-        } else {
-            remoteAs = r.getLocalAs();
-        }
-        return remoteAs;
-    }
-
-    private List<BgpParameters> getTlvs(final RIB r) {
-        final List<BgpParameters> tlvs = new ArrayList<>();
-        final List<OptionalCapabilities> caps = new ArrayList<>();
-        caps.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().setAs4BytesCapability(
-                new As4BytesCapabilityBuilder().setAsNumber(r.getLocalAs()).build()).build()).build());
-        caps.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation(CParameters1.class,
-                new CParameters1Builder().setGracefulRestartCapability(new GracefulRestartCapabilityBuilder().build()).build()).build()).build());
-
-        if (getRouteRefresh()) {
-            caps.add(new OptionalCapabilitiesBuilder().setCParameters(MultiprotocolCapabilitiesUtil.RR_CAPABILITY).build());
-        }
-
-        if (!getAddPathDependency().isEmpty()) {
-            final List<AddressFamilies> addPathFamilies = filterAddPathDependency(getAddPathDependency());
-            caps.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation(CParameters1.class,
-                    new CParameters1Builder().setAddPathCapability(new AddPathCapabilityBuilder().setAddressFamilies(addPathFamilies).build()).build()).build()).build());
-        }
-
-        for (final BgpTableType t : getAdvertizedTableDependency()) {
-            if (!r.getLocalTables().contains(t)) {
-                LOG.info("RIB instance does not list {} in its local tables. Incoming data will be dropped.", t);
+        final WaitingServiceTracker<BgpDeployer> bgpDeployerTracker =
+                WaitingServiceTracker.create(BgpDeployer.class, this.bundleContext);
+        final BgpDeployer bgpDeployer = bgpDeployerTracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
+        //map configuration to OpenConfig BGP
+        final Neighbor neighbor = bgpDeployer.getMappingService().fromBgpPeer(getAddPathDependency(), getAdvertizedTableDependency(), getHoldtimer(),
+                getHost(), getInitiateConnection(), getPassword(), getPort(), getRetrytimer(), getRemoteAs(), getPeerRole(), getSimpleRoutingPolicy());
+        //write to configuration DS
+        final KeyedInstanceIdentifier<Neighbor, NeighborKey> neighborIId = bgpDeployer.getInstanceIdentifier().child(Protocols.class).child(Protocol.class,
+                new ProtocolKey(BGP.class, r.getInstanceIdentifier().getKey().getId().getValue()))
+                .augmentation(Protocol1.class).child(Bgp.class).child(Neighbors.class).child(Neighbor.class, neighbor.getKey());
+        bgpDeployer.writeConfiguration(neighbor, neighborIId);
+        //get rib instance service, use filter
+        final WaitingServiceTracker<BGPPeerRuntimeMXBean> peerTracker = WaitingServiceTracker.create(BGPPeerRuntimeMXBean.class,
+                this.bundleContext, "(" + InstanceType.PEER.getBeanName() + "=" + Ipv4Util.toStringIP(getHost()) + ")");
+        final BGPPeerRuntimeMXBean peer = peerTracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
+        final BGPPeerRuntimeRegistration runtimeRegistration = getRootRuntimeBeanRegistratorWrapper().register(peer);
+        return Reflection.newProxy(AutoCloseablePeer.class, new AbstractInvocationHandler() {
+            @Override
+            protected Object handleInvocation(final Object proxy, final Method method, final Object[] args) throws Throwable {
+                if (method.getName().equals("close")) {
+                    runtimeRegistration.close();
+                    bgpDeployerTracker.close();
+                    peerTracker.close();
+                    return null;
+                } else {
+                    return method.invoke(peer, args);
+                }
             }
-
-            caps.add(new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder().addAugmentation(CParameters1.class,
-                    new CParameters1Builder().setMultiprotocolCapability(new MultiprotocolCapabilityBuilder(t).build()).build()).build()).build());
-        }
-        tlvs.add(new BgpParametersBuilder().setOptionalCapabilities(caps).build());
-        return tlvs;
+        });
     }
 
-    private List<AddressFamilies> filterAddPathDependency(final List<AddressFamilies> addPathDependency) {
-        final Map<BgpTableType, AddressFamilies> filteredFamilies = new HashMap<BgpTableType, AddressFamilies>();
-        for (final AddressFamilies family : addPathDependency) {
-            final BgpTableType key = new BgpTableTypeImpl(family.getAfi(), family.getSafi());
-            if (!filteredFamilies.containsKey(key)) {
-                filteredFamilies.put(key, family);
-            } else {
-                LOG.info("Ignoring Add-path dependency {}", family);
-            }
-        }
-        return new ArrayList<AddressFamilies>(filteredFamilies.values());
-    }
-
-    public IpAddress getNormalizedHost() {
-        final IpAddress host = getHost();
-        if(host.getIpv6Address() != null){
-            return new IpAddress(Ipv6Util.getFullForm(host.getIpv6Address()));
-        }
-        return host;
-    }
-
-    private io.netty.util.concurrent.Future<Void> initiateConnection(final InetSocketAddress address, final Optional<Rfc2385Key> password, final BGPPeerRegistry registry) {
-        final KeyMapping keys = KeyMapping.getKeyMapping(address.getAddress(), password);
-        final RIB rib = getRibDependency();
-        final Optional<KeyMapping> optionalKey = Optional.fromNullable(keys);
-        return rib.getDispatcher().createReconnectingClient(address, registry, getRetrytimer(), optionalKey);
-    }
-
-    private BGPPeerRegistry getPeerRegistryBackwards() {
-        return getPeerRegistry() == null ? StrictBGPPeerRegistry.GLOBAL : getPeerRegistryDependency();
-    }
-
-    private static String peerName(final IpAddress host) {
-        if (host.getIpv4Address() != null) {
-            return host.getIpv4Address().getValue();
-        }
-        if (host.getIpv6Address() != null) {
-            return host.getIpv6Address().getValue();
-        }
-
-        return null;
-    }
-
-    private final class BGPPeerModuleTracker implements BGPConfigModuleTracker {
-
-        private final BGPOpenconfigMapper<BGPPeerInstanceConfiguration> neighborProvider;
-        private final BGPPeerInstanceConfiguration bgpPeerInstanceConfiguration;
-
-        public BGPPeerModuleTracker(final Optional<BGPOpenConfigProvider> openconfigProvider) {
-            if (openconfigProvider.isPresent()) {
-                this.neighborProvider = openconfigProvider.get().getOpenConfigMapper(BGPPeerInstanceConfiguration.class);
-            } else {
-                this.neighborProvider = null;
-            }
-            final InstanceConfigurationIdentifier identifier = new InstanceConfigurationIdentifier(getIdentifier().getInstanceName());
-            this.bgpPeerInstanceConfiguration = new BGPPeerInstanceConfiguration(identifier, getNormalizedHost(),
-                    getPort(), getHoldtimer(), getPeerRole(), getInitiateConnection(),
-                    getAdvertizedTableDependency(), getAsOrDefault(getRibDependency()),
-                    getOptionalPassword(getPassword()), getAddPathDependency());
-        }
-
-        @Override
-        public void onInstanceCreate() {
-            if (this.neighborProvider != null) {
-                this.neighborProvider.writeConfiguration(this.bgpPeerInstanceConfiguration);
-            }
-        }
-
-        @Override
-        public void onInstanceClose() {
-            if (this.neighborProvider != null) {
-                this.neighborProvider.removeConfiguration(this.bgpPeerInstanceConfiguration);
-            }
-        }
-
+    private static boolean isPasswordPresent(final Rfc2385Key password) {
+        return password != null && ! password.getValue().isEmpty();
     }
 
-    private static Optional<Rfc2385Key> getOptionalPassword(final Rfc2385Key password) {
-        return password != null && ! password.getValue().isEmpty() ? Optional.of(password) : Optional.<Rfc2385Key>absent();
+    public void setBundleContext(final BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
     }
 
-    private static Optional<byte[]> getMD5Password(final Rfc2385Key password) {
-        return getOptionalPassword(password).isPresent() ? Optional.of(password.getValue().getBytes(StandardCharsets.US_ASCII)) : Optional.absent();
+    private static interface AutoCloseablePeer extends RIB, AutoCloseable {
     }
 
 }
index 5c73a4089a164c7bebffbbf66047da414c315668..31db8eb7df1f36d69bc644d71990c85b70f7235d 100644 (file)
  */
 package org.opendaylight.controller.config.yang.bgp.rib.impl;
 
+import org.opendaylight.controller.config.api.DependencyResolver;
+import org.opendaylight.controller.config.api.DynamicMBeanWithInstance;
+import org.opendaylight.controller.config.spi.Module;
+import org.osgi.framework.BundleContext;
+
 /**
-*
-*/
+ *
+ */
+@Deprecated
 public class BGPPeerModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPPeerModuleFactory {
 
+    @Override
+    public Module createModule(final String instanceName, final DependencyResolver dependencyResolver, final BundleContext bundleContext) {
+        final BGPPeerModule module = (BGPPeerModule) super.createModule(instanceName, dependencyResolver, bundleContext);
+        module.setBundleContext(bundleContext);
+        return module;
+    }
+
+    @Override
+    public Module createModule(final String instanceName, final DependencyResolver dependencyResolver,
+            final DynamicMBeanWithInstance old, final BundleContext bundleContext) throws Exception {
+        final BGPPeerModule module = (BGPPeerModule)  super.createModule(instanceName, dependencyResolver, old, bundleContext);
+        module.setBundleContext(bundleContext);
+        return module;
+    }
+
 }
index b509eacd163921190a92be19a40d74b58104241a..1b572990a81056e0729c0fa27213540a4709e400 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.protocol.bgp.rib.impl.config;
 
 import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getNeighborInstanceIdentifier;
+import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getNeighborInstanceName;
 import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getRibInstanceName;
 
 import com.google.common.base.Optional;
@@ -229,7 +230,8 @@ public final class BgpDeployerImpl implements BgpDeployer, DataTreeChangeListene
         final BgpPeer bgpPeer = this.peers.get(getNeighborInstanceIdentifier(rootIdentifier, neighbor.getKey()));
         if (bgpPeer != null) {
             bgpPeer.close();
-            bgpPeer.start(this.ribs.get(rootIdentifier), neighbor, this.mappingService);
+            final InstanceIdentifier<Neighbor> neighborInstanceIdentifier = getNeighborInstanceIdentifier(rootIdentifier, neighbor.getKey());
+            initiatePeerInstance(rootIdentifier, neighborInstanceIdentifier, neighbor, bgpPeer);
         } else {
             //create new instance, if none is present
             onNeighborCreated(rootIdentifier, neighbor);
@@ -241,8 +243,9 @@ public final class BgpDeployerImpl implements BgpDeployer, DataTreeChangeListene
         //create, start and register peer instance
         LOG.debug("Creating Peer instance with configuration: {}", neighbor);
         final BgpPeer bgpPeer = (BgpPeer) this.container.getComponentInstance(InstanceType.PEER.getBeanName());
-        bgpPeer.start(this.ribs.get(rootIdentifier), neighbor, this.mappingService);
-        this.peers.put(getNeighborInstanceIdentifier(rootIdentifier, neighbor.getKey()), bgpPeer);
+        final InstanceIdentifier<Neighbor> neighborInstanceIdentifier = getNeighborInstanceIdentifier(rootIdentifier, neighbor.getKey());
+        initiatePeerInstance(rootIdentifier, neighborInstanceIdentifier, neighbor, bgpPeer);
+        this.peers.put(neighborInstanceIdentifier, bgpPeer);
         LOG.debug("Peer instance created {}", bgpPeer);
     }
 
@@ -256,6 +259,23 @@ public final class BgpDeployerImpl implements BgpDeployer, DataTreeChangeListene
         }
     }
 
+    private void registerPeerInstance(final BgpPeer bgpPeer, final String peerInstanceName) {
+        final Dictionary<String, String> properties = new Hashtable<>();
+        properties.put(InstanceType.PEER.getBeanName(), peerInstanceName);
+        final ServiceRegistration<?> serviceRegistration = this.bundleContext.registerService(InstanceType.PEER.getServices(), bgpPeer, properties);
+        bgpPeer.setServiceRegistration(serviceRegistration);
+    }
+
+    private void initiatePeerInstance(final InstanceIdentifier<Bgp> rootIdentifier, final InstanceIdentifier<Neighbor> neighborIdentifier, final Neighbor neighbor,
+            final BgpPeer bgpPeer) {
+        final String peerInstanceName = getNeighborInstanceName(neighborIdentifier);
+        final RibImpl rib = this.ribs.get(rootIdentifier);
+        if (rib != null) {
+            bgpPeer.start(rib, neighbor, this.mappingService);
+            registerPeerInstance(bgpPeer, peerInstanceName);
+        }
+    }
+
     @Override
     public <T extends DataObject> ListenableFuture<Void> writeConfiguration(final T data,
             final InstanceIdentifier<T> identifier) {
index 6a1230436fe2455cec1e15d8bef3a8da7df25620..4e51e63a2e8c874cce320309518b4be6c18b5667 100644 (file)
@@ -17,6 +17,9 @@ import com.google.common.collect.Iterables;
 import io.netty.util.concurrent.Future;
 import java.util.ArrayList;
 import java.util.List;
+import org.opendaylight.controller.config.yang.bgp.rib.impl.BGPPeerRuntimeMXBean;
+import org.opendaylight.controller.config.yang.bgp.rib.impl.BgpPeerState;
+import org.opendaylight.controller.config.yang.bgp.rib.impl.BgpSessionState;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
 import org.opendaylight.protocol.bgp.parser.BgpExtendedMessageUtil;
@@ -42,11 +45,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.AddPathCapabilityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.MultiprotocolCapabilityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamilies;
+import org.osgi.framework.ServiceRegistration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
-public class BgpPeer implements AutoCloseable {
+public class BgpPeer implements AutoCloseable, BGPPeerRuntimeMXBean {
 
     //FIXME make configurable
     private static final PortNumber PORT = new PortNumber(179);
@@ -61,6 +65,8 @@ public class BgpPeer implements AutoCloseable {
 
     private Future<Void> connection;
 
+    private ServiceRegistration<?> serviceRegistration;
+
     public BgpPeer(final RpcProviderRegistry rpcRegistry, final BGPPeerRegistry peerRegistry) {
         this.rpcRegistry = rpcRegistry;
         this.peerRegistry = peerRegistry;
@@ -95,6 +101,10 @@ public class BgpPeer implements AutoCloseable {
             this.bgpPeer = null;
             this.peerRegistry.removePeer(this.neighborAddress);
             this.neighborAddress = null;
+            if (this.serviceRegistration != null) {
+                this.serviceRegistration.unregister();
+                this.serviceRegistration = null;
+            }
         }
     }
 
@@ -137,4 +147,30 @@ public class BgpPeer implements AutoCloseable {
         return Optional.absent();
     }
 
+    @Override
+    public BgpPeerState getBgpPeerState() {
+        return this.bgpPeer.getBgpPeerState();
+    }
+
+    @Override
+    public BgpSessionState getBgpSessionState() {
+        return this.bgpPeer.getBgpSessionState();
+    }
+
+    @Override
+    public void resetStats() {
+        this.bgpPeer.resetStats();
+
+    }
+
+    @Override
+    public void resetSession() {
+        this.bgpPeer.resetSession();
+
+    }
+
+    public void setServiceRegistration(final ServiceRegistration<?> serviceRegistration) {
+        this.serviceRegistration = serviceRegistration;
+    }
+
 }
index 7cc62eaaab33ae065d8cd911eab82f5dbaf92ea7..8632f3506a7015813f3c7b420508b87d8198479d 100644 (file)
@@ -12,6 +12,7 @@ import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet
 
 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
 import org.opendaylight.protocol.concepts.KeyMapping;
+import org.opendaylight.protocol.util.Ipv4Util;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
@@ -63,4 +64,8 @@ final class OpenConfigMappingUtil {
         return rootIdentifier.child(Neighbors.class).child(Neighbor.class, neighborKey);
     }
 
+    public static String getNeighborInstanceName(final InstanceIdentifier<?> rootIdentifier) {
+        return Ipv4Util.toStringIP(rootIdentifier.firstKeyOf(Neighbor.class).getNeighborAddress());
+    }
+
 }
index 965e86901f2ba9d820a319eb2592bee80e1b7729..21bc763c53098c3ba3e5d07b02969def41a37e8e 100644 (file)
@@ -12,13 +12,14 @@ import com.google.common.collect.Lists;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
+import org.opendaylight.controller.config.yang.bgp.rib.impl.BGPPeerRuntimeMXBean;
 import org.opendaylight.protocol.bgp.rib.RibReference;
 
 public enum InstanceType {
 
     RIB("ribImpl", Lists.newArrayList(RIB.class, RibReference.class)),
 
-    PEER("bgpPeer", Collections.emptyList());
+    PEER("bgpPeer", Collections.singletonList(BGPPeerRuntimeMXBean.class));
 
     private final String beanName;
     private final String[] services;
index 1d797879b68754132296256da7c890775c193d74..21c29eb3bf6f7bee6c2083429a2023a28b2b8f50 100755 (executable)
@@ -98,6 +98,9 @@ import org.opendaylight.protocol.bgp.rib.impl.stats.UnsignedInt32Counter;
 import org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl.BGPRenderStats;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext;
 import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
@@ -105,6 +108,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.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
@@ -136,6 +140,7 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest {
 
     protected static final RibId RIB_ID = new RibId("test");
     protected static final BgpId BGP_ID = new BgpId("192.168.1.1");
+    private static final Neighbor NEIGHBOR = new NeighborBuilder().setKey(new NeighborKey(new IpAddress(BGP_ID))).build();
     protected static final ClusterIdentifier CLUSTER_ID = new ClusterIdentifier("192.168.1.2");
 
     private static final AsNumber AS_NUMBER = new AsNumber(5000L);
@@ -176,6 +181,9 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest {
     @Mock
     private BGPOpenConfigMappingService bgpMappingService;
 
+    @Mock
+    private BGPPeerRuntimeMXBean mockedPeer;
+
     @SuppressWarnings("unchecked")
     @Before
     public void setUp() throws Exception {
@@ -267,6 +275,8 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest {
 
         setupMockService(BgpDeployer.class, this.bgpDeployer);
         doReturn(new ProtocolBuilder().setKey(new ProtocolKey(BGP.class, "bgp")).build()).when(this.bgpMappingService).fromRib(any(), any(), any(), any(), any(), any());
+        doReturn(NEIGHBOR).when(this.bgpMappingService).fromBgpPeer(any(), any(),
+                any(), any(), any(), any(), any(), any(), any(), any(), any());
         doReturn(this.mockedFuture).when(this.bgpDeployer).writeConfiguration(any(), any());
         doReturn(this.mockedFuture).when(this.bgpDeployer).removeConfiguration(any());
         doReturn(this.bgpMappingService).when(this.bgpDeployer).getMappingService();
@@ -306,6 +316,8 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest {
         setupMockService(RIBExtensionProviderContext.class, new SimpleRIBExtensionProviderContext());
 
         setupMockService(BGPPeerRegistry.class, StrictBGPPeerRegistry.GLOBAL);
+
+        setupMockService(BGPPeerRuntimeMXBean.class, this.mockedPeer);
     }
 
     protected void setupMockService(final Class<?> serviceInterface, final Object instance) throws Exception {