Bug 5685: Integate BGP topology provider with cluster singleton service. 74/44974/3
authorMilos Fabian <milfabia@cisco.com>
Wed, 27 Jul 2016 10:27:14 +0000 (12:27 +0200)
committerMilos Fabian <milfabia@cisco.com>
Thu, 1 Sep 2016 22:38:06 +0000 (22:38 +0000)
The BgpTopologyDeployer service is responsible for a topology builder instances creation.
In clustered environment, this service is running on all three nodes, consuming the same
configuration, create the same topology builder instance and register it to the cluster singleton service
provider on all nodes, but only one instance become active.
This integration allows fail-over scenarios and avoids confilicting datastore modifications for
topology builders with the same topology-id.
Provide backwards compatility for CSS modules, where instance is created and configuration
is written to DS when instance become active.

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

20 files changed:
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/AbstractBgpTopologyProvider.java [moved from bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractBgpTopologyProvider.java with 66% similarity]
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/BackwardsCssTopologyProvider.java [moved from bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/BackwardsCssTopologyProvider.java with 75% similarity]
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/BgpTopologyDeployerImpl.java [moved from bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/BgpTopologyDeployerImpl.java with 72% similarity]
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/Ipv4TopologyProvider.java [moved from bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv4TopologyProvider.java with 55% similarity]
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/Ipv6TopologyProvider.java [moved from bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv6TopologyProvider.java with 55% similarity]
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/LinkstateTopologyProvider.java [moved from bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyProvider.java with 55% similarity]
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/TopologyReferenceSingletonServiceImpl.java [new file with mode: 0644]
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/spi/BgpTopologyDeployer.java
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/spi/BgpTopologyProvider.java
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/spi/TopologyReferenceSingletonService.java [moved from bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/TopologyReferenceAutoCloseable.java with 50% similarity]
bgp/topology-provider/src/main/java/org/opendaylight/controller/config/yang/bgp/reachability/ipv4/Ipv4ReachabilityTopologyBuilderModule.java
bgp/topology-provider/src/main/java/org/opendaylight/controller/config/yang/bgp/reachability/ipv4/Ipv4ReachabilityTopologyBuilderModuleFactory.java
bgp/topology-provider/src/main/java/org/opendaylight/controller/config/yang/bgp/reachability/ipv6/Ipv6ReachabilityTopologyBuilderModule.java
bgp/topology-provider/src/main/java/org/opendaylight/controller/config/yang/bgp/reachability/ipv6/Ipv6ReachabilityTopologyBuilderModuleFactory.java
bgp/topology-provider/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModule.java
bgp/topology-provider/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModuleFactory.java
bgp/topology-provider/src/main/resources/org/opendaylight/blueprint/bgp-topology-provider.xml
bgp/topology-provider/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderModuleTest.java
bgp/topology-provider/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderModuleTest.java
bgp/topology-provider/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModuleTest.java

@@ -6,14 +6,15 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.bgpcep.bgp.topology.provider;
+package org.opendaylight.bgpcep.bgp.topology.provider.config;
 
-import com.google.common.collect.Maps;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Map.Entry;
+import java.util.function.Function;
+import org.opendaylight.bgpcep.bgp.topology.provider.AbstractTopologyBuilder;
 import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
 import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyProvider;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.TopologyReferenceSingletonService;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.protocol.bgp.rib.DefaultRibReference;
 import org.opendaylight.protocol.bgp.rib.RibReference;
@@ -29,11 +30,11 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class AbstractBgpTopologyProvider implements BgpTopologyProvider, AutoCloseable {
+abstract class AbstractBgpTopologyProvider implements BgpTopologyProvider, AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(AbstractBgpTopologyProvider.class);
 
-    private final Map<TopologyId, Entry<TopologyReferenceAutoCloseable, AbstractRegistration>> topologyBuilders = new HashMap<>();
+    private final Map<TopologyId, TopologyReferenceSingletonService> topologyBuilders = new HashMap<>();
     private final AbstractRegistration registration;
     private final DataBroker dataBroker;
     private final BgpTopologyDeployer deployer;
@@ -45,21 +46,22 @@ public abstract class AbstractBgpTopologyProvider implements BgpTopologyProvider
     }
 
     @Override
-    public final void onTopologyBuilderCreated(final Topology topology) {
+    public final void onTopologyBuilderCreated(final Topology topology, final Function<Topology, Void> writeFunction) {
         LOG.debug("Cretaing topology builder instance {}", topology);
-        final TopologyReferenceAutoCloseable topologyBuilder = createInstance(topology);
-        final AbstractRegistration serviceRegistration = this.deployer.registerTopologyReference(topologyBuilder);
-        this.topologyBuilders.put(getTopologyId(topologyBuilder), Maps.immutableEntry(topologyBuilder, serviceRegistration));
-        LOG.debug("Topology builder instance created {}", topologyBuilder);
+        final TopologyReferenceSingletonService currentInstance = this.topologyBuilders.get(topology.getTopologyId());
+        if (currentInstance == null || !currentInstance.getConfiguration().equals(topology)) {
+            final TopologyReferenceSingletonService topologyBuilder = createInstance(topology, writeFunction);
+            this.topologyBuilders.put(topology.getTopologyId(), topologyBuilder);
+            LOG.debug("Topology builder instance created {}", topologyBuilder);
+        }
     }
 
     @Override
     public final void onTopologyBuilderRemoved(final Topology topology) {
         LOG.debug("Removing topology builder instance {}", topology);
-        final Entry<TopologyReferenceAutoCloseable, AbstractRegistration> topologyBuilder = this.topologyBuilders.remove(topology.getTopologyId());
+        final TopologyReferenceSingletonService topologyBuilder = this.topologyBuilders.remove(topology.getTopologyId());
         if (topologyBuilder != null) {
-            topologyBuilder.getValue().close();
-            topologyBuilder.getKey().close();
+            topologyBuilder.close();
             LOG.debug("Topology builder instance removed {}", topologyBuilder);
         }
     }
@@ -78,18 +80,15 @@ public abstract class AbstractBgpTopologyProvider implements BgpTopologyProvider
         return topologyTypeFilter(topologyTypes);
     }
 
-    TopologyReferenceAutoCloseable createInstance(final Topology topology) {
+    private TopologyReferenceSingletonService createInstance(final Topology topology, final Function<Topology, Void> writeFunction) {
         final RibReference ribReference = new DefaultRibReference(InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(topology.getAugmentation(Topology1.class).getRibId())));
-        return initiate(this.dataBroker, ribReference, topology.getTopologyId());
+        final AbstractTopologyBuilder<?> topologyBuilder = createTopologyBuilder(this.dataBroker, ribReference, topology.getTopologyId());
+        return new TopologyReferenceSingletonServiceImpl(topologyBuilder, this.deployer, topology, writeFunction);
     }
 
-    abstract TopologyReferenceAutoCloseable initiate(final DataBroker dataProvider, final RibReference locRibReference,
+    abstract AbstractTopologyBuilder<?> createTopologyBuilder(final DataBroker dataProvider, final RibReference locRibReference,
             final TopologyId topologyId);
 
     abstract boolean topologyTypeFilter(TopologyTypes1 topology);
 
-    private static TopologyId getTopologyId(final TopologyReferenceAutoCloseable topologyBuilder) {
-        return topologyBuilder.getInstanceIdentifier().firstKeyOf(Topology.class).getTopologyId();
-    }
-
 }
@@ -6,17 +6,19 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.bgpcep.bgp.topology.provider;
+package org.opendaylight.bgpcep.bgp.topology.provider.config;
 
 import com.google.common.reflect.AbstractInvocationHandler;
 import com.google.common.reflect.Reflection;
 import java.lang.reflect.Method;
+import java.util.function.Function;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.TopologyReferenceSingletonService;
 import org.opendaylight.bgpcep.topology.TopologyReference;
 import org.opendaylight.controller.config.api.osgi.WaitingServiceTracker;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 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;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
@@ -34,22 +36,30 @@ import org.osgi.framework.BundleContext;
 
 public final class BackwardsCssTopologyProvider {
 
-    public static TopologyReferenceAutoCloseable createBackwardsCssInstance(final TopologyTypes topologyTypes, final TopologyId topologyId, final DataBroker dataBroker, final BundleContext bundleContext,
+    public static TopologyReferenceSingletonService createBackwardsCssInstance(final TopologyTypes topologyTypes, final TopologyId topologyId, final DataBroker dataBroker, final BundleContext bundleContext,
             final KeyedInstanceIdentifier<Rib, RibKey> ribIId) {
         //map configuration to topology
         final Topology topology = createConfiguration(topologyTypes, topologyId, ribIId.getKey().getId());
-        //write to configuration DS
-        final KeyedInstanceIdentifier<Topology, TopologyKey> topologyIId = InstanceIdentifier.create(NetworkTopology.class).child(Topology.class, topology.getKey());
-        writeConfiguration(dataBroker, topologyIId, topology);
+        //create instance
+        final WaitingServiceTracker<BgpTopologyDeployer> deployerTracker = WaitingServiceTracker.create(BgpTopologyDeployer.class, bundleContext);
+        final BgpTopologyDeployer topologyDeployer = deployerTracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
+        topologyDeployer.createInstance(topology, new Function<Topology, Void>() {
+            @Override
+            public Void apply(final Topology topology) {
+                writeConfiguration(dataBroker, topology);
+                return null;
+            }
+        });
         //get topology service, use filter
         final WaitingServiceTracker<TopologyReference> topologyTracker = WaitingServiceTracker.create(TopologyReference.class,
                 bundleContext, "(" + "topology-id" + "=" + topology.getTopologyId().getValue() + ")");
         final TopologyReference topologyService = topologyTracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
-        return Reflection.newProxy(TopologyReferenceAutoCloseable.class, new AbstractInvocationHandler() {
+        return Reflection.newProxy(TopologyReferenceSingletonService.class, new AbstractInvocationHandler() {
             @Override
             protected Object handleInvocation(final Object proxy, final Method method, final Object[] args) throws Throwable {
                 if (method.getName().equals("close")) {
-                    removeConfiguration(dataBroker, topologyIId);
+                    topologyDeployer.removeInstance(topology);
+                    deployerTracker.close();
                     topologyTracker.close();
                     return null;
                 } else {
@@ -59,6 +69,14 @@ public final class BackwardsCssTopologyProvider {
         });
     }
 
+    private static void writeConfiguration(final DataBroker dataBroker, final Topology topology) {
+        final KeyedInstanceIdentifier<Topology, TopologyKey> topologyIId = InstanceIdentifier.create(NetworkTopology.class).child(Topology.class,
+                topology.getKey());
+        final WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
+        wTx.put(LogicalDatastoreType.CONFIGURATION, topologyIId, topology, true);
+        wTx.submit();
+    }
+
     private static Topology createConfiguration(final TopologyTypes topologyTypes, final TopologyId topologyId, final RibId ribId) {
         final TopologyBuilder topologyBuilder = new TopologyBuilder();
         topologyBuilder.setTopologyId(topologyId);
@@ -68,16 +86,4 @@ public final class BackwardsCssTopologyProvider {
         return topologyBuilder.build();
     }
 
-    private static void writeConfiguration(final DataBroker dataBroker, final KeyedInstanceIdentifier<Topology, TopologyKey> topologyIId, final Topology topology) {
-        final WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
-        wTx.put(LogicalDatastoreType.CONFIGURATION, topologyIId, topology, true);
-        wTx.submit();
-    }
-
-    private static void removeConfiguration(final DataBroker dataBroker, final KeyedInstanceIdentifier<Topology, TopologyKey> topologyIId) throws TransactionCommitFailedException {
-        final WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();
-        wTx.delete(LogicalDatastoreType.CONFIGURATION, topologyIId);
-        wTx.submit().checkedGet();
-    }
-
 }
\ No newline at end of file
@@ -6,7 +6,7 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.bgpcep.bgp.topology.provider;
+package org.opendaylight.bgpcep.bgp.topology.provider.config;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
@@ -15,9 +15,11 @@ import java.util.Dictionary;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Set;
+import java.util.function.Function;
 import javax.annotation.concurrent.GuardedBy;
 import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
 import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyProvider;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.TopologyReferenceSingletonService;
 import org.opendaylight.bgpcep.topology.TopologyReference;
 import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
@@ -25,6 +27,8 @@ import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
 import org.opendaylight.yangtools.concepts.AbstractRegistration;
@@ -44,12 +48,14 @@ public final class BgpTopologyDeployerImpl implements AutoCloseable, ClusteredDa
     private final DataBroker dataBroker;
     private final ListenerRegistration<BgpTopologyDeployerImpl> registration;
     private final BundleContext context;
+    private final ClusterSingletonServiceProvider singletonProvider;
     @GuardedBy("this")
     private boolean closed;
 
-    public BgpTopologyDeployerImpl(final BundleContext context, final DataBroker dataBroker) {
+    public BgpTopologyDeployerImpl(final BundleContext context, final DataBroker dataBroker, final ClusterSingletonServiceProvider singletonProvider) {
         this.context = Preconditions.checkNotNull(context);
         this.dataBroker = Preconditions.checkNotNull(dataBroker);
+        this.singletonProvider = Preconditions.checkNotNull(singletonProvider);
         this.registration =
                 this.dataBroker.registerDataTreeChangeListener(new DataTreeIdentifier<Topology>(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(NetworkTopology.class).child(Topology.class)), this);
         LOG.info("BGP topology deployer started.");
@@ -72,10 +78,10 @@ public final class BgpTopologyDeployerImpl implements AutoCloseable, ClusteredDa
                 break;
             case SUBTREE_MODIFIED:
                 filterTopologyBuilders(dataBefore).forEach(provider -> provider.onTopologyBuilderRemoved(dataBefore));
-                filterTopologyBuilders(dataAfter).forEach(provider -> provider.onTopologyBuilderCreated(dataAfter));
+                filterTopologyBuilders(dataAfter).forEach(provider -> provider.onTopologyBuilderCreated(dataAfter, null));
                 break;
             case WRITE:
-                filterTopologyBuilders(dataAfter).forEach(provider -> provider.onTopologyBuilderCreated(dataAfter));
+                filterTopologyBuilders(dataAfter).forEach(provider -> provider.onTopologyBuilderCreated(dataAfter, null));
                 break;
             default:
                 break;
@@ -108,21 +114,38 @@ public final class BgpTopologyDeployerImpl implements AutoCloseable, ClusteredDa
         return this.dataBroker;
     }
 
-    private synchronized Iterable<BgpTopologyProvider> filterTopologyBuilders(final Topology topology) {
+    private Iterable<BgpTopologyProvider> filterTopologyBuilders(final Topology topology) {
         return Iterables.filter(this.topologyProviders, input -> input.topologyTypeFilter(topology));
     }
 
     @Override
-    public AbstractRegistration registerTopologyReference(final TopologyReference topologyReference) {
+    public AbstractRegistration registerService(final TopologyReferenceSingletonService topologyProviderService) {
         final Dictionary<String, String> properties = new Hashtable<>();
-        properties.put("topology-id", topologyReference.getInstanceIdentifier().firstKeyOf(Topology.class).getTopologyId().getValue());
-        final ServiceRegistration<?> registerService = this.context.registerService(new String[] {TopologyReference.class.getName()}, topologyReference, properties);
+        properties.put("topology-id", topologyProviderService.getInstanceIdentifier().firstKeyOf(Topology.class).getTopologyId().getValue());
+        final ServiceRegistration<?> registerService = this.context.registerService(new String[] {TopologyReference.class.getName()}, topologyProviderService, properties);
+        final ClusterSingletonServiceRegistration registerClusterSingletonService = this.singletonProvider.registerClusterSingletonService(topologyProviderService);
         return new AbstractRegistration() {
             @Override
             protected void removeRegistration() {
+                try {
+                    registerClusterSingletonService.close();
+                } catch (final Exception e) {
+                    LOG.warn("Failed to close ClusterSingletonServiceRegistration {} for TopologyBuilder {}",
+                            registerClusterSingletonService, topologyProviderService.getInstanceIdentifier(), e);
+                }
                 registerService.unregister();
             }
         };
     }
 
+    @Override
+    public void createInstance(final Topology topology, final Function<Topology, Void> writeFunction) {
+        filterTopologyBuilders(topology).forEach(provider -> provider.onTopologyBuilderCreated(topology, writeFunction));
+    }
+
+    @Override
+    public void removeInstance(final Topology topology) {
+        filterTopologyBuilders(topology).forEach(provider -> provider.onTopologyBuilderRemoved(topology));
+    }
+
 }
similarity index 55%
rename from bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv4TopologyProvider.java
rename to bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/Ipv4TopologyProvider.java
index 0cdec395fec59bdc216455ed53e906713effa3f6..a7085bd16d8799ae155a9a3894fd553317ffd541 100644 (file)
@@ -6,15 +6,15 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.bgpcep.bgp.topology.provider;
+package org.opendaylight.bgpcep.bgp.topology.provider.config;
 
+import org.opendaylight.bgpcep.bgp.topology.provider.AbstractTopologyBuilder;
+import org.opendaylight.bgpcep.bgp.topology.provider.Ipv4ReachabilityTopologyBuilder;
 import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.protocol.bgp.rib.RibReference;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp.topology.types.rev160524.TopologyTypes1;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 
 public final class Ipv4TopologyProvider extends AbstractBgpTopologyProvider {
@@ -24,26 +24,13 @@ public final class Ipv4TopologyProvider extends AbstractBgpTopologyProvider {
     }
 
     @Override
-    TopologyReferenceAutoCloseable initiate(final DataBroker dataProvider, final RibReference locRibReference,
-            final TopologyId topologyId) {
-        final Ipv4ReachabilityTopologyBuilder builder = new Ipv4ReachabilityTopologyBuilder(dataProvider, locRibReference, topologyId);
-        builder.start();
-        return new TopologyReferenceAutoCloseable() {
-            @Override
-            public void close() {
-                builder.close();
-            }
-
-            @Override
-            public InstanceIdentifier<Topology> getInstanceIdentifier() {
-                return builder.getInstanceIdentifier();
-            }
-        };
+    boolean topologyTypeFilter(final TopologyTypes1 topology) {
+        return topology.getBgpIpv4ReachabilityTopology() != null;
     }
 
     @Override
-    boolean topologyTypeFilter(final TopologyTypes1 topology) {
-        return topology.getBgpIpv4ReachabilityTopology() != null;
+    AbstractTopologyBuilder<?> createTopologyBuilder(final DataBroker dataProvider, final RibReference locRibReference, final TopologyId topologyId) {
+        return new Ipv4ReachabilityTopologyBuilder(dataProvider, locRibReference, topologyId);
     }
 
 }
similarity index 55%
rename from bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv6TopologyProvider.java
rename to bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/Ipv6TopologyProvider.java
index 804ec74f85388db526206d1576b8c2119272166c..72a79b59a6bcc27ad7c74a0f4231a6f5bb66a79d 100644 (file)
@@ -6,15 +6,15 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.bgpcep.bgp.topology.provider;
+package org.opendaylight.bgpcep.bgp.topology.provider.config;
 
+import org.opendaylight.bgpcep.bgp.topology.provider.AbstractTopologyBuilder;
+import org.opendaylight.bgpcep.bgp.topology.provider.Ipv6ReachabilityTopologyBuilder;
 import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.protocol.bgp.rib.RibReference;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp.topology.types.rev160524.TopologyTypes1;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public final class Ipv6TopologyProvider extends AbstractBgpTopologyProvider {
 
@@ -23,21 +23,8 @@ public final class Ipv6TopologyProvider extends AbstractBgpTopologyProvider {
     }
 
     @Override
-    TopologyReferenceAutoCloseable initiate(final DataBroker dataProvider, final RibReference locRibReference,
-            final TopologyId topologyId) {
-        final Ipv6ReachabilityTopologyBuilder builder = new Ipv6ReachabilityTopologyBuilder(dataProvider, locRibReference, topologyId);
-        builder.start();
-        return new TopologyReferenceAutoCloseable() {
-            @Override
-            public void close() {
-                builder.close();
-            }
-
-            @Override
-            public InstanceIdentifier<Topology> getInstanceIdentifier() {
-                return builder.getInstanceIdentifier();
-            }
-        };
+    AbstractTopologyBuilder<?> createTopologyBuilder(final DataBroker dataProvider, final RibReference locRibReference, final TopologyId topologyId) {
+        return new Ipv6ReachabilityTopologyBuilder(dataProvider, locRibReference, topologyId);
     }
 
     @Override
@@ -6,15 +6,15 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.bgpcep.bgp.topology.provider;
+package org.opendaylight.bgpcep.bgp.topology.provider.config;
 
+import org.opendaylight.bgpcep.bgp.topology.provider.AbstractTopologyBuilder;
+import org.opendaylight.bgpcep.bgp.topology.provider.LinkstateTopologyBuilder;
 import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.protocol.bgp.rib.RibReference;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.odl.bgp.topology.types.rev160524.TopologyTypes1;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public final class LinkstateTopologyProvider extends AbstractBgpTopologyProvider {
 
@@ -23,21 +23,8 @@ public final class LinkstateTopologyProvider extends AbstractBgpTopologyProvider
     }
 
     @Override
-    TopologyReferenceAutoCloseable initiate(final DataBroker dataProvider, final RibReference locRibReference,
-            final TopologyId topologyId) {
-        final LinkstateTopologyBuilder builder = new LinkstateTopologyBuilder(dataProvider, locRibReference, topologyId);
-        builder.start();
-        return new TopologyReferenceAutoCloseable() {
-            @Override
-            public void close() {
-                builder.close();
-            }
-
-            @Override
-            public InstanceIdentifier<Topology> getInstanceIdentifier() {
-                return builder.getInstanceIdentifier();
-            }
-        };
+    AbstractTopologyBuilder<?> createTopologyBuilder(final DataBroker dataProvider, final RibReference locRibReference, final TopologyId topologyId) {
+        return new LinkstateTopologyBuilder(dataProvider, locRibReference, topologyId);
     }
 
     @Override
diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/TopologyReferenceSingletonServiceImpl.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/TopologyReferenceSingletonServiceImpl.java
new file mode 100644 (file)
index 0000000..8f4fe00
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 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,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.bgpcep.bgp.topology.provider.config;
+
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.function.Function;
+import org.opendaylight.bgpcep.bgp.topology.provider.AbstractTopologyBuilder;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.TopologyReferenceSingletonService;
+import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yangtools.concepts.AbstractRegistration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public final class TopologyReferenceSingletonServiceImpl implements TopologyReferenceSingletonService {
+
+    private final AbstractTopologyBuilder<?> topologyBuilder;
+    private final AbstractRegistration serviceRegistration;
+    private final Topology configuration;
+    private final Function<Topology, Void> writeFunction;
+
+    TopologyReferenceSingletonServiceImpl(final AbstractTopologyBuilder<?> topologyBuilder, final BgpTopologyDeployer deployer,
+            final Topology configuration, final Function<Topology, Void> writeFunction) {
+        this.writeFunction = writeFunction;
+        this.configuration = Preconditions.checkNotNull(configuration);
+        this.topologyBuilder = Preconditions.checkNotNull(topologyBuilder);
+        this.serviceRegistration = deployer.registerService(this);
+    }
+
+    @Override
+    public InstanceIdentifier<Topology> getInstanceIdentifier() {
+        return this.topologyBuilder.getInstanceIdentifier();
+    }
+
+    @Override
+    public void close() {
+        this.serviceRegistration.close();
+    }
+
+    @Override
+    public void instantiateServiceInstance() {
+        this.topologyBuilder.start();
+        if (this.writeFunction != null) {
+            this.writeFunction.apply(this.configuration);
+        }
+    }
+
+    @Override
+    public ListenableFuture<Void> closeServiceInstance() {
+        this.topologyBuilder.close();
+        return Futures.immediateFuture(null);
+    }
+
+    @Override
+    public ServiceGroupIdentifier getIdentifier() {
+        return ServiceGroupIdentifier.create(getInstanceIdentifier().firstKeyOf(Topology.class).getTopologyId().getValue());
+    }
+
+    @Override
+    public Topology getConfiguration() {
+        return this.configuration;
+    }
+
+}
index 120105c483f4e8341a51af2c98880b7abfb16f97..3233f5d649b4cd206a44cff325d9248e8922aaca 100644 (file)
@@ -8,8 +8,9 @@
 
 package org.opendaylight.bgpcep.bgp.topology.provider.spi;
 
-import org.opendaylight.bgpcep.topology.TopologyReference;
+import java.util.function.Function;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
 import org.opendaylight.yangtools.concepts.AbstractRegistration;
 
 public interface BgpTopologyDeployer {
@@ -18,6 +19,10 @@ public interface BgpTopologyDeployer {
 
     DataBroker getDataBroker();
 
-    AbstractRegistration registerTopologyReference(TopologyReference topologyReference);
+    AbstractRegistration registerService(TopologyReferenceSingletonService topologyProviderService);
+
+    void createInstance(Topology topology, Function<Topology, Void> writeFunction);
+
+    void removeInstance(Topology topology);
 
 }
index 529298356861952adcf4e8d6595550f34a9c4988..b7ed01a5f636892770b93312f79c28496d552c28 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.bgpcep.bgp.topology.provider.spi;
 
+import java.util.function.Function;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
 
 
@@ -17,6 +18,6 @@ public interface BgpTopologyProvider {
 
     void onTopologyBuilderRemoved(Topology topology);
 
-    void onTopologyBuilderCreated(Topology topology);
+    void onTopologyBuilderCreated(Topology topology, Function<Topology, Void> writeFunction);
 
 }
@@ -6,13 +6,17 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.bgpcep.bgp.topology.provider;
+package org.opendaylight.bgpcep.bgp.topology.provider.spi;
 
 import org.opendaylight.bgpcep.topology.TopologyReference;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
 
-public interface TopologyReferenceAutoCloseable extends AutoCloseable, TopologyReference {
+public interface TopologyReferenceSingletonService extends TopologyReference, AutoCloseable, ClusterSingletonService  {
 
     @Override
     public void close();
 
+    Topology getConfiguration();
+
 }
index ad1dadffb2aac02491b2903e1fbeca061b6d0ca2..fda69bb1cd9e694b9caeab48fd072af86a6650ed 100644 (file)
@@ -16,8 +16,8 @@
  */
 package org.opendaylight.controller.config.yang.bgp.reachability.ipv4;
 
-import org.opendaylight.bgpcep.bgp.topology.provider.BackwardsCssTopologyProvider;
 import org.opendaylight.bgpcep.bgp.topology.provider.Ipv4ReachabilityTopologyBuilder;
+import org.opendaylight.bgpcep.bgp.topology.provider.config.BackwardsCssTopologyProvider;
 import org.opendaylight.controller.config.api.DependencyResolver;
 import org.opendaylight.controller.config.api.JmxAttributeValidationException;
 import org.opendaylight.controller.config.api.ModuleIdentifier;
@@ -26,6 +26,7 @@ import org.osgi.framework.BundleContext;
 /**
  *
  */
+@Deprecated
 public final class Ipv4ReachabilityTopologyBuilderModule extends AbstractIpv4ReachabilityTopologyBuilderModule {
 
     private BundleContext bundleContext;
index ede078dc38bfac57e53ee036bbc50519d13fa781..7f3098b5a6c8994d7ff58531a6b12a729d8192c4 100644 (file)
  */
 package org.opendaylight.controller.config.yang.bgp.reachability.ipv6;
 
-import org.opendaylight.bgpcep.bgp.topology.provider.BackwardsCssTopologyProvider;
 import org.opendaylight.bgpcep.bgp.topology.provider.Ipv6ReachabilityTopologyBuilder;
+import org.opendaylight.bgpcep.bgp.topology.provider.config.BackwardsCssTopologyProvider;
 import org.opendaylight.controller.config.api.DependencyResolver;
 import org.opendaylight.controller.config.api.JmxAttributeValidationException;
 import org.opendaylight.controller.config.api.ModuleIdentifier;
 import org.osgi.framework.BundleContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  *
  */
+@Deprecated
 public final class Ipv6ReachabilityTopologyBuilderModule extends AbstractIpv6ReachabilityTopologyBuilderModule {
-    private static final Logger LOG = LoggerFactory.getLogger(Ipv6ReachabilityTopologyBuilderModule.class);
 
     private BundleContext bundleContext;
 
index 4ea8cd2e8026f6ec9a4036eab12eaa9bef48f8fd..4f1adbb504ff01afec2af2b7264975d198a6fe8a 100644 (file)
@@ -16,8 +16,8 @@
  */
 package org.opendaylight.controller.config.yang.bgp.topology.provider;
 
-import org.opendaylight.bgpcep.bgp.topology.provider.BackwardsCssTopologyProvider;
 import org.opendaylight.bgpcep.bgp.topology.provider.LinkstateTopologyBuilder;
+import org.opendaylight.bgpcep.bgp.topology.provider.config.BackwardsCssTopologyProvider;
 import org.opendaylight.controller.config.api.DependencyResolver;
 import org.opendaylight.controller.config.api.JmxAttributeValidationException;
 import org.opendaylight.controller.config.api.ModuleIdentifier;
@@ -26,6 +26,7 @@ import org.osgi.framework.BundleContext;
 /**
  *
  */
+@Deprecated
 public final class LinkstateTopologyBuilderModule extends AbstractLinkstateTopologyBuilderModule {
 
     private BundleContext bundleContext;
index 8857b56b31cb402f0c311eff7a52b1b27bdb5ed2..713e6b5cd9cb883aa7630d59b261ce1579e40624 100644 (file)
@@ -3,23 +3,25 @@
            xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
 
   <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker" odl:type="pingpong"/>
+  <reference id="clusterSingletonServiceProvider" interface="org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider"/>
 
-  <bean id="bgpTopologyDeployer" class="org.opendaylight.bgpcep.bgp.topology.provider.BgpTopologyDeployerImpl" destroy-method="close">
+  <bean id="bgpTopologyDeployer" class="org.opendaylight.bgpcep.bgp.topology.provider.config.BgpTopologyDeployerImpl" destroy-method="close">
     <argument ref="blueprintBundleContext"/>
     <argument ref="dataBroker"/>
+    <argument ref="clusterSingletonServiceProvider"/>
   </bean>
 
   <service ref="bgpTopologyDeployer" interface="org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer"/>
 
-  <bean id="ipv4TopologyProvider" class="org.opendaylight.bgpcep.bgp.topology.provider.Ipv4TopologyProvider" destroy-method="close">
+  <bean id="ipv4TopologyProvider" class="org.opendaylight.bgpcep.bgp.topology.provider.config.Ipv4TopologyProvider" destroy-method="close">
     <argument ref="bgpTopologyDeployer"/>
   </bean>
 
-  <bean id="ipv6TopologyProvider" class="org.opendaylight.bgpcep.bgp.topology.provider.Ipv6TopologyProvider" destroy-method="close">
+  <bean id="ipv6TopologyProvider" class="org.opendaylight.bgpcep.bgp.topology.provider.config.Ipv6TopologyProvider" destroy-method="close">
     <argument ref="bgpTopologyDeployer"/>
   </bean>
 
-  <bean id="linkstateTopologyProvider" class="org.opendaylight.bgpcep.bgp.topology.provider.LinkstateTopologyProvider" destroy-method="close">
+  <bean id="linkstateTopologyProvider" class="org.opendaylight.bgpcep.bgp.topology.provider.config.LinkstateTopologyProvider" destroy-method="close">
     <argument ref="bgpTopologyDeployer"/>
   </bean>
 
index 2d7740f2fba046516a97a7cfc76ec1b2968acb58..5bf7a6b5ac5601d13fa0a568b24412d215d8f15b 100644 (file)
@@ -11,8 +11,12 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.util.List;
+import java.util.function.Function;
 import javax.management.ObjectName;
 import org.junit.Test;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyProvider;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.TopologyReferenceSingletonService;
 import org.opendaylight.bgpcep.topology.TopologyReference;
 import org.opendaylight.controller.config.api.ValidationException;
 import org.opendaylight.controller.config.api.jmx.CommitStatus;
@@ -21,8 +25,10 @@ import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
 import org.opendaylight.controller.config.yang.bgp.reachability.ipv4.Ipv4ReachabilityTopologyBuilderModuleFactory;
 import org.opendaylight.controller.config.yang.bgp.reachability.ipv4.Ipv4ReachabilityTopologyBuilderModuleMXBean;
 import org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractRIBImplModuleTest;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yangtools.concepts.AbstractRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class Ipv4ReachabilityTopologyBuilderModuleTest extends AbstractRIBImplModuleTest {
@@ -39,6 +45,29 @@ public class Ipv4ReachabilityTopologyBuilderModuleTest extends AbstractRIBImplMo
                 return null;
             }
         });
+        setupMockService(BgpTopologyDeployer.class, new BgpTopologyDeployer() {
+            @Override
+            public AbstractRegistration registerTopologyProvider(final BgpTopologyProvider topologyBuilder) {
+                return null;
+            }
+            @Override
+            public DataBroker getDataBroker() {
+                return null;
+            }
+            @Override
+            public AbstractRegistration registerService(final TopologyReferenceSingletonService topologyProviderService) {
+                return null;
+            }
+            @Override
+            public void createInstance(final Topology topology, final Function<Topology, Void> writeFunction) {
+                return;
+            }
+
+            @Override
+            public void removeInstance(final Topology topology) {
+                return;
+            }
+        });
     }
 
     @Override
index 25661fb739b10be58c08e95a819f03eea798438b..b4ab507ece4d82d7e268ce14a3ad940e5d13d398 100644 (file)
@@ -11,8 +11,12 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.util.List;
+import java.util.function.Function;
 import javax.management.ObjectName;
 import org.junit.Test;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyProvider;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.TopologyReferenceSingletonService;
 import org.opendaylight.bgpcep.topology.TopologyReference;
 import org.opendaylight.controller.config.api.ValidationException;
 import org.opendaylight.controller.config.api.jmx.CommitStatus;
@@ -21,8 +25,10 @@ import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
 import org.opendaylight.controller.config.yang.bgp.reachability.ipv6.Ipv6ReachabilityTopologyBuilderModuleFactory;
 import org.opendaylight.controller.config.yang.bgp.reachability.ipv6.Ipv6ReachabilityTopologyBuilderModuleMXBean;
 import org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractRIBImplModuleTest;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yangtools.concepts.AbstractRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class Ipv6ReachabilityTopologyBuilderModuleTest extends AbstractRIBImplModuleTest {
@@ -39,6 +45,29 @@ public class Ipv6ReachabilityTopologyBuilderModuleTest extends AbstractRIBImplMo
                 return null;
             }
         });
+        setupMockService(BgpTopologyDeployer.class, new BgpTopologyDeployer() {
+            @Override
+            public AbstractRegistration registerTopologyProvider(final BgpTopologyProvider topologyBuilder) {
+                return null;
+            }
+            @Override
+            public DataBroker getDataBroker() {
+                return null;
+            }
+            @Override
+            public AbstractRegistration registerService(final TopologyReferenceSingletonService topologyProviderService) {
+                return null;
+            }
+            @Override
+            public void createInstance(final Topology topology, final Function<Topology, Void> writeFunction) {
+                return;
+            }
+
+            @Override
+            public void removeInstance(final Topology topology) {
+                return;
+            }
+        });
     }
 
     @Override
index a5d48648e01de8e3572fbb488131fc491b472e95..3fa6433372a2f28dda9ebe5858e18f0c61552648 100644 (file)
@@ -11,16 +11,22 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.util.List;
+import java.util.function.Function;
 import javax.management.ObjectName;
 import org.junit.Test;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyProvider;
+import org.opendaylight.bgpcep.bgp.topology.provider.spi.TopologyReferenceSingletonService;
 import org.opendaylight.bgpcep.topology.TopologyReference;
 import org.opendaylight.controller.config.api.ValidationException;
 import org.opendaylight.controller.config.api.jmx.CommitStatus;
 import org.opendaylight.controller.config.spi.ModuleFactory;
 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
 import org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractRIBImplModuleTest;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yangtools.concepts.AbstractRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class LinkstateTopologyBuilderModuleTest extends AbstractRIBImplModuleTest {
@@ -37,6 +43,29 @@ public class LinkstateTopologyBuilderModuleTest extends AbstractRIBImplModuleTes
                 return null;
             }
         });
+        setupMockService(BgpTopologyDeployer.class, new BgpTopologyDeployer() {
+            @Override
+            public AbstractRegistration registerTopologyProvider(final BgpTopologyProvider topologyBuilder) {
+                return null;
+            }
+            @Override
+            public DataBroker getDataBroker() {
+                return null;
+            }
+            @Override
+            public AbstractRegistration registerService(final TopologyReferenceSingletonService topologyProviderService) {
+                return null;
+            }
+            @Override
+            public void createInstance(final Topology topology, final Function<Topology, Void> writeFunction) {
+                return;
+            }
+
+            @Override
+            public void removeInstance(final Topology topology) {
+                return;
+            }
+        });
     }
 
     @Override