Revert "Remove OSGi dependency from bgp modules" 97/82197/4
authorLuis Gomez <ecelgp@gmail.com>
Tue, 21 May 2019 16:23:02 +0000 (16:23 +0000)
committerLuis Gomez <ecelgp@gmail.com>
Fri, 24 May 2019 21:57:37 +0000 (21:57 +0000)
Due to bug BGPCEP-873

This reverts commit 39e546e47a692f7e24ed8194237cfe552bf5bc50.

Change-Id: I47b2fc757381e9a58cdf2a17017db25f74914c79
Signed-off-by: Luis Gomez <ecelgp@gmail.com>
18 files changed:
bgp/extensions/evpn/pom.xml
bgp/extensions/linkstate/pom.xml
bgp/parser-spi/pom.xml
bgp/rib-impl/pom.xml
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BGPClusterSingletonService.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/RibImpl.java
bgp/rib-impl/src/main/resources/org/opendaylight/blueprint/bgp-rib.xml
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImplTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java
bgp/rib-spi/pom.xml
bgp/topology-provider/pom.xml
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/BgpTopologyDeployerImpl.java
bgp/topology-provider/src/main/resources/org/opendaylight/blueprint/bgp-topology-provider.xml

index df18d9f8979ee86a5d96cf34ea2b1f23e5de5182..25ebcf9149dc46945b1a867550fb3df5a8d7e392 100644 (file)
             <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
             <artifactId>rfc6991-ietf-yang-types</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
 
         <!-- test scope dependencies -->
         <dependency>
index b39f394bfd084ecdfbc08cdf9543bc79d8ab57a0..ac0ab28ed795130f7a5907ae62fa6c6d3ced03d7 100644 (file)
             <groupId>org.opendaylight.mdsal.model</groupId>
             <artifactId>yang-ext</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
 
         <!-- test scope dependencies -->
         <dependency>
index d5eee74cbac8ebf4cd65d838d7e7aef4832a8a2e..4edbb3c4d2cc7e64dd1feaf87bc9ee4a420b2db1 100644 (file)
             <artifactId>rfc6991-ietf-inet-types</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>io.netty</groupId>
             <artifactId>netty-buffer</artifactId>
index e4adb961fad95f48156ca8ca477c5922d231ca54..547f21b261b0fb9a79af9f0c8c4c7e59b7779420 100644 (file)
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
index aa0c5c32a395aed6087c29d4a2926f26dacdc61b..1245f90d1381eae63798ebddef8b5f5b79d2b4fd 100644 (file)
@@ -32,6 +32,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.osgi.framework.ServiceRegistration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -43,6 +44,8 @@ public final class AppPeer implements PeerBean, BGPPeerStateConsumer {
     private Neighbor currentConfiguration;
     @GuardedBy("this")
     private BgpAppPeerSingletonService bgpAppPeerSingletonService;
+    @GuardedBy("this")
+    private ServiceRegistration<?> serviceRegistration;
 
     private static ApplicationRibId createAppRibId(final Neighbor neighbor) {
         final Config config = neighbor.getConfig();
@@ -74,6 +77,10 @@ public final class AppPeer implements PeerBean, BGPPeerStateConsumer {
         if (this.bgpAppPeerSingletonService != null) {
             this.bgpAppPeerSingletonService = null;
         }
+        if (this.serviceRegistration != null) {
+            this.serviceRegistration.unregister();
+            this.serviceRegistration = null;
+        }
     }
 
     @Override
@@ -103,6 +110,10 @@ public final class AppPeer implements PeerBean, BGPPeerStateConsumer {
         return this.bgpAppPeerSingletonService.getPeerState();
     }
 
+    synchronized void setServiceRegistration(final ServiceRegistration<?> serviceRegistration) {
+        this.serviceRegistration = serviceRegistration;
+    }
+
     private static final class BgpAppPeerSingletonService implements BGPPeerStateConsumer {
         private final ApplicationPeer applicationPeer;
         private final DOMDataTreeChangeService dataTreeChangeService;
index 05ef26498e5e0ebf27b80725ad383a1587f3beae..52e60cf48562ed33689036194741d40f1b1ecfcb 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.protocol.bgp.rib.impl.config;
 import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.APPLICATION_PEER_GROUP_NAME;
 import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.APPLICATION_PEER_GROUP_NAME_OPT;
 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.util.concurrent.FutureCallback;
@@ -19,7 +20,9 @@ import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import com.google.common.util.concurrent.SettableFuture;
 import java.util.ArrayList;
+import java.util.Dictionary;
 import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -29,20 +32,13 @@ import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
 import javax.annotation.concurrent.GuardedBy;
 import org.apache.commons.lang3.StringUtils;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
-import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
 import org.opendaylight.mdsal.common.api.CommitInfo;
-import org.opendaylight.mdsal.dom.api.DOMSchemaService;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
 import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
-import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.BGPRibRoutingPolicyFactory;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
-import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
+import org.opendaylight.protocol.bgp.rib.impl.spi.InstanceType;
 import org.opendaylight.protocol.bgp.rib.spi.util.ClusterSingletonServiceRegistrationHelper;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Config;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
@@ -52,6 +48,9 @@ import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.t
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborPeerGroupConfig;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.blueprint.container.BlueprintContainer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -66,43 +65,25 @@ public final class BGPClusterSingletonService implements ClusterSingletonService
     @GuardedBy("this")
     private final Map<String, List<PeerBean>> peersGroups = new HashMap<>();
     private final BGPTableTypeRegistryConsumer tableTypeRegistry;
+    private final BlueprintContainer container;
+    private final BundleContext bundleContext;
     private final ServiceGroupIdentifier serviceGroupIdentifier;
     private final AtomicBoolean instantiated = new AtomicBoolean(false);
     private final PeerGroupConfigLoader peerGroupLoader;
     private RibImpl ribImpl;
-    private final RIBExtensionConsumerContext ribExtensionContext;
-    private final BGPDispatcher dispatcher;
-    private final BGPRibRoutingPolicyFactory policyFactory;
-    private final BindingCodecTreeFactory codecFactory;
-    private final DOMDataBroker domBroker;
-    private final DataBroker dataBroker;
-    private final DOMSchemaService schemaService;
-    private final RpcProviderRegistry rpcRegistry;
 
     BGPClusterSingletonService(
             @Nonnull final PeerGroupConfigLoader peerGroupLoader,
             @Nonnull final ClusterSingletonServiceProvider provider,
             @Nonnull final BGPTableTypeRegistryConsumer tableTypeRegistry,
-            @Nonnull final InstanceIdentifier<Bgp> bgpIid,
-            @Nonnull final RIBExtensionConsumerContext ribExtensionContext,
-            @Nonnull final BGPDispatcher dispatcher,
-            @Nonnull final BGPRibRoutingPolicyFactory policyFactory,
-            @Nonnull final BindingCodecTreeFactory codecFactory,
-            @Nonnull final DOMDataBroker domBroker,
-            @Nonnull final DataBroker dataBroker,
-            @Nonnull final DOMSchemaService schemaService,
-            @Nonnull final RpcProviderRegistry rpcRegistry) {
+            @Nonnull final BlueprintContainer container,
+            @Nonnull final BundleContext bundleContext,
+            @Nonnull final InstanceIdentifier<Bgp> bgpIid) {
         this.peerGroupLoader = peerGroupLoader;
         this.tableTypeRegistry = tableTypeRegistry;
+        this.container = container;
+        this.bundleContext = bundleContext;
         this.bgpIid = bgpIid;
-        this.ribExtensionContext = ribExtensionContext;
-        this.dispatcher = dispatcher;
-        this.policyFactory = policyFactory;
-        this.codecFactory = codecFactory;
-        this.domBroker = domBroker;
-        this.dataBroker = dataBroker;
-        this.schemaService = schemaService;
-        this.rpcRegistry = rpcRegistry;
         final String ribInstanceName = getRibInstanceName(bgpIid);
         this.serviceGroupIdentifier = ServiceGroupIdentifier.create(ribInstanceName + "-service-group");
         LOG.info("BGPClusterSingletonService {} registered", this.serviceGroupIdentifier.getValue());
@@ -178,8 +159,7 @@ public final class BGPClusterSingletonService implements ClusterSingletonService
 
     private synchronized void onGlobalCreated(final Global global) {
         LOG.debug("Creating RIB instance with configuration: {}", global);
-        this.ribImpl = new RibImpl(ribExtensionContext, dispatcher, policyFactory, codecFactory, domBroker, dataBroker,
-                schemaService);
+        this.ribImpl = (RibImpl) this.container.getComponentInstance(InstanceType.RIB.getBeanName());
         initiateRibInstance(global, this.ribImpl);
         LOG.debug("RIB instance created: {}", this.ribImpl);
     }
@@ -210,6 +190,7 @@ public final class BGPClusterSingletonService implements ClusterSingletonService
     private synchronized void initiateRibInstance(final Global global, final RibImpl ribImpl) {
         final String ribInstanceName = getRibInstanceName(this.bgpIid);
         ribImpl.start(global, ribInstanceName, this.tableTypeRegistry);
+        registerRibInstance(ribImpl, ribInstanceName);
         if (this.instantiated.get()) {
             this.ribImpl.instantiateServiceInstance();
         }
@@ -229,6 +210,14 @@ public final class BGPClusterSingletonService implements ClusterSingletonService
         return filtered;
     }
 
+    private synchronized void registerRibInstance(final RibImpl ribImpl, final String ribInstanceName) {
+        final Dictionary<String, String> properties = new Hashtable<>();
+        properties.put(InstanceType.RIB.getBeanName(), ribInstanceName);
+        final ServiceRegistration<?> serviceRegistration = this.bundleContext.registerService(
+                InstanceType.RIB.getServices(), ribImpl, properties);
+        ribImpl.setServiceRegistration(serviceRegistration);
+    }
+
     @Override
     public void close() {
         LOG.info("BGPClusterSingletonService {} close", this.serviceGroupIdentifier.getValue());
@@ -269,9 +258,9 @@ public final class BGPClusterSingletonService implements ClusterSingletonService
         LOG.debug("Creating Peer instance with configuration: {}", neighbor);
         final PeerBean bgpPeer;
         if (OpenConfigMappingUtil.isApplicationPeer(neighbor)) {
-            bgpPeer = new AppPeer();
+            bgpPeer = (PeerBean) this.container.getComponentInstance(InstanceType.APP_PEER.getBeanName());
         } else {
-            bgpPeer = new BgpPeer(this.rpcRegistry);
+            bgpPeer = (PeerBean) this.container.getComponentInstance(InstanceType.PEER.getBeanName());
         }
         final InstanceIdentifier<Neighbor> neighborInstanceIdentifier =
                 getNeighborInstanceIdentifier(this.bgpIid, neighbor.key());
@@ -332,10 +321,32 @@ public final class BGPClusterSingletonService implements ClusterSingletonService
         closePeer(bgpPeer);
     }
 
+    private synchronized 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 synchronized void registerAppPeerInstance(final AppPeer appPeer, final String peerInstanceName) {
+        final Dictionary<String, String> properties = new Hashtable<>();
+        properties.put(InstanceType.PEER.getBeanName(), peerInstanceName);
+        final ServiceRegistration<?> serviceRegistration = this.bundleContext
+                .registerService(InstanceType.APP_PEER.getServices(), appPeer, properties);
+        appPeer.setServiceRegistration(serviceRegistration);
+    }
+
     private synchronized void initiatePeerInstance(final InstanceIdentifier<Neighbor> neighborIdentifier,
             final Neighbor neighbor, final PeerBean bgpPeer) {
+        final String peerInstanceName = getNeighborInstanceName(neighborIdentifier);
         if (this.ribImpl != null) {
             bgpPeer.start(this.ribImpl, neighbor, this.bgpIid, this.peerGroupLoader, this.tableTypeRegistry);
+            if (bgpPeer instanceof BgpPeer) {
+                registerPeerInstance((BgpPeer) bgpPeer, peerInstanceName);
+            } else if (bgpPeer instanceof AppPeer) {
+                registerAppPeerInstance((AppPeer) bgpPeer, peerInstanceName);
+            }
         }
         if (this.instantiated.get()) {
             bgpPeer.instantiateServiceInstance();
index 9e23d684b1520a84eefff494745027b67a2ca4e2..9817ce0f3bd03fb6c3c342a2cbce83d98ed0c316 100644 (file)
@@ -33,16 +33,9 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 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.dom.api.DOMDataBroker;
-import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
 import org.opendaylight.mdsal.common.api.CommitInfo;
-import org.opendaylight.mdsal.dom.api.DOMSchemaService;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
-import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.BGPRibRoutingPolicyFactory;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
-import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
 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.PeerGroupKey;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
@@ -60,6 +53,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.open
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.blueprint.container.BlueprintContainer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -67,6 +62,8 @@ public final class BgpDeployerImpl implements ClusteredDataTreeChangeListener<Bg
         AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(BgpDeployerImpl.class);
     private final InstanceIdentifier<NetworkInstance> networkInstanceIId;
+    private final BlueprintContainer container;
+    private final BundleContext bundleContext;
     private final BGPTableTypeRegistryConsumer tableTypeRegistry;
     private final ClusterSingletonServiceProvider provider;
     @GuardedBy("this")
@@ -85,36 +82,17 @@ public final class BgpDeployerImpl implements ClusteredDataTreeChangeListener<Bg
     private ListenerRegistration<BgpDeployerImpl> registration;
     @GuardedBy("this")
     private boolean closed;
-    private final RIBExtensionConsumerContext ribExtensionContext;
-    private final BGPDispatcher dispatcher;
-    private final BGPRibRoutingPolicyFactory policyFactory;
-    private final BindingCodecTreeFactory codecFactory;
-    private final DOMDataBroker domBroker;
-    private final DOMSchemaService schemaService;
-    private final RpcProviderRegistry rpcRegistry;
 
-    public BgpDeployerImpl(final String networkInstanceName,
-                           final ClusterSingletonServiceProvider provider,
-                           final DataBroker dataBroker,
-                           final BGPTableTypeRegistryConsumer mappingService,
-                           final RIBExtensionConsumerContext ribExtensionContext,
-                           final BGPDispatcher dispatcher,
-                           final BGPRibRoutingPolicyFactory policyFactory,
-                           final BindingCodecTreeFactory codecFactory,
-                           final DOMDataBroker domBroker,
-                           final DOMSchemaService schemaService,
-                           final RpcProviderRegistry rpcRegistry) {
+    public BgpDeployerImpl(final String networkInstanceName, final ClusterSingletonServiceProvider provider,
+            final BlueprintContainer container,
+            final BundleContext bundleContext, final DataBroker dataBroker,
+            final BGPTableTypeRegistryConsumer mappingService) {
         this.dataBroker = requireNonNull(dataBroker);
         this.provider = requireNonNull(provider);
         this.networkInstanceName = requireNonNull(networkInstanceName);
+        this.container = requireNonNull(container);
+        this.bundleContext = requireNonNull(bundleContext);
         this.tableTypeRegistry = requireNonNull(mappingService);
-        this.ribExtensionContext = requireNonNull(ribExtensionContext);
-        this.dispatcher = requireNonNull(dispatcher);
-        this.policyFactory = requireNonNull(policyFactory);
-        this.codecFactory = requireNonNull(codecFactory);
-        this.domBroker = requireNonNull(domBroker);
-        this.schemaService = requireNonNull(schemaService);
-        this.rpcRegistry = rpcRegistry;
         this.networkInstanceIId = InstanceIdentifier.create(NetworkInstances.class)
                 .child(NetworkInstance.class, new NetworkInstanceKey(networkInstanceName));
         initializeNetworkInstance(dataBroker, this.networkInstanceIId).addCallback(new FutureCallback<CommitInfo>() {
@@ -266,8 +244,7 @@ public final class BgpDeployerImpl implements ClusteredDataTreeChangeListener<Bg
         BGPClusterSingletonService old = this.bgpCss.get(bgpInstanceIdentifier);
         if (old == null) {
             old = new BGPClusterSingletonService(this, this.provider, this.tableTypeRegistry,
-                    bgpInstanceIdentifier, this.ribExtensionContext, this.dispatcher, this.policyFactory,
-                    this.codecFactory, this.domBroker, this.dataBroker, this.schemaService, this.rpcRegistry);
+                    this.container, this.bundleContext, bgpInstanceIdentifier);
             this.bgpCss.put(bgpInstanceIdentifier, old);
         }
         old.onGlobalChanged(dataObjectModification);
@@ -279,8 +256,7 @@ public final class BgpDeployerImpl implements ClusteredDataTreeChangeListener<Bg
         BGPClusterSingletonService old = this.bgpCss.get(bgpInstanceIdentifier);
         if (old == null) {
             old = new BGPClusterSingletonService(this, this.provider, this.tableTypeRegistry,
-                    bgpInstanceIdentifier, this.ribExtensionContext, this.dispatcher, this.policyFactory,
-                    this.codecFactory, this.domBroker, this.dataBroker, this.schemaService, this.rpcRegistry);
+                    this.container, this.bundleContext, bgpInstanceIdentifier);
             this.bgpCss.put(bgpInstanceIdentifier, old);
         }
         old.onNeighborsChanged(dataObjectModification);
index 4f80e26efe9d051c0f23638bd5a561be6ef31e60..925a4c79518dcc06d8918d283032fdff3a4521f9 100644 (file)
@@ -67,6 +67,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.ClusterIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.framework.ServiceRegistration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -76,6 +77,8 @@ public class BgpPeer implements PeerBean, BGPPeerStateConsumer {
 
     private final RpcProviderRegistry rpcRegistry;
     @GuardedBy("this")
+    private ServiceRegistration<?> serviceRegistration;
+    @GuardedBy("this")
     private Neighbor currentConfiguration;
     @GuardedBy("this")
     private BgpPeerSingletonService bgpPeerSingletonService;
@@ -147,8 +150,11 @@ public class BgpPeer implements PeerBean, BGPPeerStateConsumer {
     }
 
     @Override
-    public void close() {
-        // No-op
+    public synchronized void close() {
+        if (this.serviceRegistration != null) {
+            this.serviceRegistration.unregister();
+            this.serviceRegistration = null;
+        }
     }
 
     @Override
@@ -201,6 +207,10 @@ public class BgpPeer implements PeerBean, BGPPeerStateConsumer {
         return this.bgpPeerSingletonService.getPeerState();
     }
 
+    synchronized void setServiceRegistration(final ServiceRegistration<?> serviceRegistration) {
+        this.serviceRegistration = serviceRegistration;
+    }
+
     synchronized void removePeer(final BGPPeerRegistry bgpPeerRegistry) {
         if (BgpPeer.this.currentConfiguration != null) {
             bgpPeerRegistry.removePeer(BgpPeer.this.currentConfiguration.getNeighborAddress());
index 2d0ededb2c1de6f12409e45157da5ed13c028b88..adecec086744628c272d67c24a2f3147b547ec84 100644 (file)
@@ -58,6 +58,7 @@ import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
+import org.osgi.framework.ServiceRegistration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -72,6 +73,7 @@ public final class RibImpl implements RIB, BGPRibStateConsumer, AutoCloseable {
     private final DOMSchemaService domSchemaService;
     private final BGPRibRoutingPolicyFactory policyProvider;
     private RIBImpl ribImpl;
+    private ServiceRegistration<?> serviceRegistration;
     private ListenerRegistration<SchemaContextListener> schemaContextRegistration;
     private List<AfiSafi> afiSafi;
     private AsNumber asNumber;
@@ -203,6 +205,18 @@ public final class RibImpl implements RIB, BGPRibStateConsumer, AutoCloseable {
             this.schemaContextRegistration.close();
             this.schemaContextRegistration = null;
         }
+        if (this.serviceRegistration != null) {
+            try {
+                this.serviceRegistration.unregister();
+            } catch (final IllegalStateException e) {
+                LOG.warn("Failed to unregister {} service instance", this, e);
+            }
+            this.serviceRegistration = null;
+        }
+    }
+
+    void setServiceRegistration(final ServiceRegistration<?> serviceRegistration) {
+        this.serviceRegistration = serviceRegistration;
     }
 
     @Override
index bd9d1866dee85d4695a9d625e30f284975d37b3f..a74d4b41f22d7ce1ecf6efa67c38e5aef9ad41f8 100644 (file)
         destroy-method="close">
     <argument value="global-bgp"/>
     <argument ref="clusterSingletonServiceProvider"/>
+    <argument ref="blueprintContainer"/>
+    <argument ref="blueprintBundleContext"/>
     <argument ref="dataBroker"/>
     <argument ref="bgpTableTypeRegistry"/>
+  </bean>
+
+  <reference id="policiesProvider" interface="org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.BGPRibRoutingPolicyFactory"/>
+  <bean id="ribImpl" class="org.opendaylight.protocol.bgp.rib.impl.config.RibImpl" scope="prototype">
     <argument ref="globalBgpExtensions"/>
     <argument ref="BGPDispatcher"/>
     <argument ref="policiesProvider"/>
     <argument ref="codecTreeFactory"/>
     <argument ref="domDataBroker"/>
+    <argument ref="dataBroker"/>
     <argument ref="domSchemaService"/>
+  </bean>
+
+  <bean id="bgpPeer" class="org.opendaylight.protocol.bgp.rib.impl.config.BgpPeer" scope="prototype">
     <argument ref="rpcRegistry"/>
   </bean>
 
-  <reference id="policiesProvider" interface="org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.BGPRibRoutingPolicyFactory"/>
+  <bean id="appPeer" class="org.opendaylight.protocol.bgp.rib.impl.config.AppPeer" scope="prototype"/>
 
   <bean id="bgpStateCollector" class="org.opendaylight.protocol.bgp.rib.impl.state.BGPStateCollectorImpl"/>
   <service ref="bgpStateCollector" interface="org.opendaylight.protocol.bgp.rib.spi.state.BGPStateConsumer"/>
index 4b54027661a5e2203840325417bca3700bbbece2..39bd7989d0543a74154c20b0973af80972de4d72 100644 (file)
@@ -57,6 +57,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.osgi.framework.ServiceRegistration;
 
 class AbstractConfig extends DefaultRibPoliciesMockTest {
     protected static final AsNumber AS = new AsNumber(72L);
@@ -72,6 +73,8 @@ class AbstractConfig extends DefaultRibPoliciesMockTest {
     @Mock
     protected BGPDispatcher dispatcher;
     @Mock
+    protected ServiceRegistration<?> serviceRegistration;
+    @Mock
     protected BGPPeerRegistry bgpPeerRegistry;
     @Mock
     protected ListenerRegistration<?> listener;
index 5bdfa9c8f6f71d601c9f27c4d2f8a6d31566d9da..88cac35e27e05d1d1e277adeed2d1477915d2db6 100644 (file)
@@ -5,15 +5,16 @@
  * 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.protocol.bgp.rib.impl.config;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doAnswer;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.opendaylight.protocol.bgp.rib.impl.config.AbstractConfig.TABLES_KEY;
 import static org.opendaylight.protocol.bgp.rib.impl.config.RIBTestsUtil.createGlobalIpv4;
@@ -22,34 +23,27 @@ import static org.opendaylight.protocol.bgp.rib.impl.config.RIBTestsUtil.createN
 import static org.opendaylight.protocol.bgp.rib.impl.config.RIBTestsUtil.createNeighborsNoRR;
 import static org.opendaylight.protocol.util.CheckUtil.checkPresentConfiguration;
 
-import io.netty.util.concurrent.Future;
+import java.util.Dictionary;
 import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 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.dom.api.DOMDataBroker;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
-import org.opendaylight.protocol.bgp.openconfig.routing.policy.impl.BGPRibRoutingPolicyFactoryImpl;
-import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.StatementRegistry;
 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
 import org.opendaylight.protocol.bgp.rib.impl.DefaultRibPoliciesMockTest;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry;
+import org.opendaylight.protocol.bgp.rib.impl.spi.InstanceType;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
-import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext;
 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.Global;
 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
@@ -67,6 +61,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.blueprint.container.BlueprintContainer;
 
 public class BgpDeployerImplTest extends DefaultRibPoliciesMockTest {
     private static final BgpTableType TABLE_TYPE = new BgpTableTypeImpl(Ipv4AddressFamily.class,
@@ -83,6 +80,10 @@ public class BgpDeployerImplTest extends DefaultRibPoliciesMockTest {
     private static final InstanceIdentifier<Neighbors> NEIGHBORS_II = BGP_II.child(Neighbors.class);
     private static final int VERIFY_TIMEOUT_MILIS = 5000;
 
+    @Mock
+    private BlueprintContainer blueprintContainer;
+    @Mock
+    private BundleContext bundleContext;
     @Mock
     private BGPTableTypeRegistryConsumer tableTypeRegistry;
     @Mock
@@ -90,17 +91,9 @@ public class BgpDeployerImplTest extends DefaultRibPoliciesMockTest {
     @Mock
     private ListenerRegistration<?> dataTreeRegistration;
     @Mock
-    private ClusterSingletonServiceProvider singletonServiceProvider;
-    @Mock
-    private BGPDispatcher dispatcher;
-    @Mock
-    private BindingCodecTreeFactory codecFactory;
-    @Mock
-    private DOMSchemaService schemaService;
-    @Mock
-    private RpcProviderRegistry rpcRegistry;
+    private ServiceRegistration<?> registration;
     @Mock
-    private BGPPeerRegistry peerRegistry;
+    private ClusterSingletonServiceProvider singletonServiceProvider;
     private BgpDeployerImpl deployer;
 
     @Override
@@ -111,6 +104,11 @@ public class BgpDeployerImplTest extends DefaultRibPoliciesMockTest {
         doReturn("mapping").when(this.tableTypeRegistry).toString();
         doReturn(Optional.of(TABLE_TYPE)).when(this.tableTypeRegistry).getTableType(any());
         doReturn(Optional.of(TABLES_KEY)).when(this.tableTypeRegistry).getTableKey(any());
+        doNothing().when(this.registration).unregister();
+        doReturn(this.registration).when(this.bundleContext).registerService(eq(InstanceType.RIB.getServices()),
+                any(), any(Dictionary.class));
+        doReturn(this.registration).when(this.bundleContext).registerService(eq(InstanceType.PEER.getServices()),
+                any(), any(Dictionary.class));
 
         doNothing().when(this.dataTreeRegistration).close();
         doReturn("bgpPeer").when(this.modification).toString();
@@ -118,32 +116,23 @@ public class BgpDeployerImplTest extends DefaultRibPoliciesMockTest {
         doReturn(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy()).when(extension).getClassLoadingStrategy();
 
         final ClusterSingletonServiceRegistration serviceRegistration = mock(ClusterSingletonServiceRegistration.class);
-        doAnswer(invocationOnMock -> {
-            final ClusterSingletonService service = invocationOnMock.getArgument(0);
-            service.instantiateServiceInstance();
-            return serviceRegistration;
-        }).when(this.singletonServiceProvider).registerClusterSingletonService(any(ClusterSingletonService.class));
+        doReturn(serviceRegistration).when(this.singletonServiceProvider).registerClusterSingletonService(any());
         doNothing().when(serviceRegistration).close();
 
-        schemaService = mock(DOMSchemaService.class);
+        final DOMSchemaService schemaService = mock(DOMSchemaService.class);
         doNothing().when(this.dataTreeRegistration).close();
 
         doReturn(this.dataTreeRegistration).when(schemaService).registerSchemaContextListener(any());
 
-        final DataBroker dataBroker = getDataBroker();
-        final DOMDataBroker domBroker = getDomBroker();
-        final SimpleRIBExtensionProviderContext ribExtensionContext = new SimpleRIBExtensionProviderContext();
-        final BGPRibRoutingPolicyFactoryImpl policyFactory = new BGPRibRoutingPolicyFactoryImpl(dataBroker,
-            new StatementRegistry());
-        doReturn(this.peerRegistry).when(this.dispatcher).getBGPPeerRegistry();
-        final Future future = Mockito.mock(Future.class);
-        doReturn(true).when(future).cancel(true);
-        doReturn(future).when(this.dispatcher).createReconnectingClient(any(), any(), anyInt(), any());
-        doNothing().when(this.peerRegistry).addPeer(any(), any(), any());
-        doNothing().when(this.peerRegistry).removePeer(any());
-        this.deployer = new BgpDeployerImpl(NETWORK_INSTANCE_NAME, this.singletonServiceProvider, dataBroker,
-                this.tableTypeRegistry, ribExtensionContext, dispatcher, policyFactory, codecFactory, domBroker,
-                schemaService, rpcRegistry);
+        final RibImpl ribImpl = new RibImpl(extension, mock(BGPDispatcher.class), this.policyProvider,
+                mock(BindingCodecTreeFactory.class), getDomBroker(), getDataBroker(), schemaService);
+        doReturn(ribImpl).when(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+
+        doReturn(new BgpPeer(mock(RpcProviderRegistry.class)))
+                .when(this.blueprintContainer).getComponentInstance(eq("bgpPeer"));
+
+        this.deployer = new BgpDeployerImpl(NETWORK_INSTANCE_NAME, this.singletonServiceProvider,
+                this.blueprintContainer, this.bundleContext, getDataBroker(), this.tableTypeRegistry);
     }
 
     @Test
@@ -151,20 +140,33 @@ public class BgpDeployerImplTest extends DefaultRibPoliciesMockTest {
         deployer.init();
         checkPresentConfiguration(getDataBroker(), NETWORK_II);
         createRib(createGlobalIpv4());
-        verify(this.schemaService, timeout(VERIFY_TIMEOUT_MILIS)).registerSchemaContextListener(any());
 
+        verify(this.blueprintContainer, timeout(VERIFY_TIMEOUT_MILIS)).getComponentInstance(eq("ribImpl"));
+        verify(this.bundleContext, timeout(VERIFY_TIMEOUT_MILIS)).registerService(eq(InstanceType.RIB.getServices()),
+            any(), any(Dictionary.class));
 
         //change with same rib already existing
         createRib(createGlobalIpv4());
-        verify(this.schemaService, timeout(VERIFY_TIMEOUT_MILIS)).registerSchemaContextListener(any());
+        verify(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+        verify(this.bundleContext).registerService(eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class));
 
         //Update for existing rib
         createRib(createGlobalIpv6());
-        verify(this.dataTreeRegistration, timeout(VERIFY_TIMEOUT_MILIS)).close();
+
+        verify(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+        verify(this.bundleContext, timeout(VERIFY_TIMEOUT_MILIS).times(2)).registerService(
+            eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class));
+        verify(this.dataTreeRegistration).close();
+        verify(this.registration).unregister();
 
         //Delete for existing rib
         deleteRib();
+
+        verify(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+        verify(this.bundleContext, timeout(VERIFY_TIMEOUT_MILIS).times(2))
+                .registerService(eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class));
         verify(this.dataTreeRegistration, timeout(VERIFY_TIMEOUT_MILIS).times(2)).close();
+        verify(this.registration, timeout(VERIFY_TIMEOUT_MILIS).times(2)).unregister();
 
         deployer.close();
     }
@@ -176,18 +178,29 @@ public class BgpDeployerImplTest extends DefaultRibPoliciesMockTest {
 
         createRib(createGlobalIpv4());
         createNeighbor(createNeighbors());
-        verify(this.peerRegistry, timeout(VERIFY_TIMEOUT_MILIS).times(1)).addPeer(any(), any(), any());
+        verify(this.blueprintContainer, timeout(VERIFY_TIMEOUT_MILIS)).getComponentInstance(eq("bgpPeer"));
+        verify(this.bundleContext, timeout(VERIFY_TIMEOUT_MILIS)).registerService(eq(InstanceType.PEER.getServices()),
+                any(BgpPeer.class), any(Dictionary.class));
 
         //change with same peer already existing
         createNeighbor(createNeighbors());
-        verify(this.peerRegistry, timeout(VERIFY_TIMEOUT_MILIS).times(1)).addPeer(any(), any(), any());
+        verify(this.blueprintContainer).getComponentInstance(eq("bgpPeer"));
+        verify(this.bundleContext).registerService(eq(InstanceType.PEER.getServices()),
+                any(BgpPeer.class), any(Dictionary.class));
+
         //Update for peer
         createNeighbor(createNeighborsNoRR());
-        verify(this.peerRegistry, timeout(VERIFY_TIMEOUT_MILIS).times(2)).addPeer(any(), any(), any());
-        verify(this.peerRegistry, timeout(VERIFY_TIMEOUT_MILIS).times(1)).removePeer(any());
+
+        verify(this.blueprintContainer).getComponentInstance(eq("bgpPeer"));
+        verify(this.bundleContext, timeout(VERIFY_TIMEOUT_MILIS).times(2))
+                .registerService(eq(InstanceType.PEER.getServices()), any(BgpPeer.class), any(Dictionary.class));
+        verify(this.registration).unregister();
 
         deleteNeighbors();
-        verify(this.peerRegistry, timeout(VERIFY_TIMEOUT_MILIS).times(2)).removePeer(any());
+        //Delete existing Peer
+        verify(this.bundleContext, times(2))
+                .registerService(eq(InstanceType.PEER.getServices()), any(BgpPeer.class), any(Dictionary.class));
+        verify(this.registration, timeout(VERIFY_TIMEOUT_MILIS).times(2)).unregister();
 
         deployer.close();
     }
index 0739185af40f50743ebfb2bc4387178e510ab1ee..1802a0079c93d203a91a8a9b1ebb7f9b500ee8b8 100644 (file)
@@ -125,6 +125,7 @@ public class BgpPeerTest extends AbstractConfig {
     public void setUp() throws Exception {
         super.setUp();
         this.bgpPeer = new BgpPeer(Mockito.mock(RpcProviderRegistry.class));
+        Mockito.doNothing().when(this.serviceRegistration).unregister();
     }
 
     @Test
@@ -149,6 +150,7 @@ public class BgpPeerTest extends AbstractConfig {
         } catch (final IllegalStateException expected) {
             assertEquals("Previous peer instance was not closed.", expected.getMessage());
         }
+        this.bgpPeer.setServiceRegistration(this.serviceRegistration);
         this.bgpPeer.closeServiceInstance();
         this.bgpPeer.close();
         verify(this.future).cancel(true);
@@ -167,6 +169,7 @@ public class BgpPeerTest extends AbstractConfig {
 
         this.bgpPeer.closeServiceInstance();
         this.bgpPeer.close();
+        verify(this.serviceRegistration).unregister();
         verify(this.future, times(2)).cancel(true);
 
         final Neighbor neighborDiffConfig = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
index b3cb17301bf939e5e6cba755baa4a74d648b0d52..305b8f8655f83f9543a0745f09ba004ed7f76963 100644 (file)
@@ -54,6 +54,7 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.osgi.framework.ServiceRegistration;
 
 public class RibImplTest extends AbstractConfig {
     private static final List<AfiSafi> AFISAFIS = new ArrayList<>();
@@ -80,6 +81,8 @@ public class RibImplTest extends AbstractConfig {
     private ListenerRegistration<?> dataTreeRegistration;
     @Mock
     private RIBSupport<?, ?, ?, ?> ribSupport;
+    @Mock
+    private ServiceRegistration<?> serviceRegistration;
 
     @Override
     @Before
@@ -105,6 +108,7 @@ public class RibImplTest extends AbstractConfig {
         doNothing().when(this.dataTreeRegistration).close();
         doReturn(mock(ListenerRegistration.class)).when(dOMDataTreeChangeService)
                 .registerDataTreeChangeListener(any(), any());
+        doNothing().when(this.serviceRegistration).unregister();
     }
 
     @Test
@@ -117,6 +121,7 @@ public class RibImplTest extends AbstractConfig {
                 this.domDataBroker,
                 getDataBroker(),
                 this.domSchemaService);
+        ribImpl.setServiceRegistration(this.serviceRegistration);
         ribImpl.start(createGlobal(), "rib-test", this.tableTypeRegistry);
         verify(this.extension).getClassLoadingStrategy();
         verify(this.domDataBroker).getSupportedExtensions();
@@ -141,6 +146,7 @@ public class RibImplTest extends AbstractConfig {
         ribImpl.close();
         verify(this.dataTreeRegistration).close();
         verify(this.dataTreeRegistration).close();
+        verify(this.serviceRegistration).unregister();
     }
 
     private static Global createGlobal() {
index fad8c31c7dcc75e5176faca8ae0180a30a74c8be..da7a3b27e1c935c07365ed85ba60789b1bb45087 100644 (file)
             <groupId>io.netty</groupId>
             <artifactId>netty-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-singleton-common-api</artifactId>
index 0e2c8b04459a144f4258b511c31069692f1f0c21..34821b311fbf5bff7023cef3eaffe64bcc4a3ce8 100644 (file)
             <groupId>io.netty</groupId>
             <artifactId>netty-buffer</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
 
         <!-- Test dependencies -->
         <dependency>
index fd3a7b60cd88c1626d0b9ff398d858666f23317c..9267ecf388d35b2b1ff2052defe4dde5757b7138 100644 (file)
@@ -20,6 +20,7 @@ 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;
 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
@@ -35,6 +36,8 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yangtools.concepts.AbstractRegistration;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -50,13 +53,15 @@ public final class BgpTopologyDeployerImpl implements BgpTopologyDeployer, AutoC
     @GuardedBy("this")
     private final Set<Topology> topologies = new HashSet<>();
     private final DataBroker dataBroker;
+    private final BundleContext context;
     private final ClusterSingletonServiceProvider singletonProvider;
     private ListenerRegistration<BgpTopologyDeployerImpl> registration;
     @GuardedBy("this")
     private boolean closed;
 
-    public BgpTopologyDeployerImpl(final DataBroker dataBroker,
+    public BgpTopologyDeployerImpl(final BundleContext context, final DataBroker dataBroker,
             final ClusterSingletonServiceProvider singletonProvider) {
+        this.context = requireNonNull(context);
         this.dataBroker = requireNonNull(dataBroker);
         this.singletonProvider = requireNonNull(singletonProvider);
     }
@@ -131,6 +136,9 @@ public final class BgpTopologyDeployerImpl implements BgpTopologyDeployer, AutoC
         final Dictionary<String, String> properties = new Hashtable<>();
         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 =
                 registerSingletonService(topologyProviderService);
         return new AbstractRegistration() {
@@ -141,6 +149,8 @@ public final class BgpTopologyDeployerImpl implements BgpTopologyDeployer, AutoC
                 } catch (final Exception e) {
                     LOG.warn("Failed to close ClusterSingletonServiceRegistration {} for TopologyBuilder {}",
                             registerClusterSingletonService, topologyProviderService.getInstanceIdentifier(), e);
+                } finally {
+                    registerService.unregister();
                 }
             }
         };
index 83236c4eb4ea88e710820894ad9cdecc9acfa1c3..2a3e792e9a6f1802efd26aa497251b5f8a52fd67 100644 (file)
@@ -15,6 +15,7 @@
   <bean id="bgpTopologyDeployer" class="org.opendaylight.bgpcep.bgp.topology.provider.config.BgpTopologyDeployerImpl"
         init-method="init"
         destroy-method="close">
+    <argument ref="blueprintBundleContext"/>
     <argument ref="dataBroker"/>
     <argument ref="clusterSingletonServiceProvider"/>
   </bean>