BGPCEP-685: Rework deployers
[bgpcep.git] / bgp / topology-provider / src / main / java / org / opendaylight / bgpcep / bgp / topology / provider / config / BgpTopologyDeployerImpl.java
index 2ef5c7c34905988a7d192a37ebef1b31752c9e37..601ea18b27d3a0fea3d5a436295f29892285281b 100644 (file)
@@ -15,7 +15,6 @@ import java.util.Dictionary;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Set;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 import javax.annotation.concurrent.GuardedBy;
 import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
@@ -27,7 +26,6 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 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.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
@@ -35,36 +33,40 @@ import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegist
 import org.opendaylight.protocol.bgp.rib.spi.util.ClusterSingletonServiceRegistrationHelper;
 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.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 import org.opendaylight.yangtools.concepts.AbstractRegistration;
 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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public final class BgpTopologyDeployerImpl implements AutoCloseable, ClusteredDataTreeChangeListener<Topology>, BgpTopologyDeployer {
+public final class BgpTopologyDeployerImpl implements BgpTopologyDeployer, AutoCloseable,
+        ClusteredDataTreeChangeListener<Topology> {
 
     private static final Logger LOG = LoggerFactory.getLogger(BgpTopologyDeployerImpl.class);
-    private static final InstanceIdentifier<Topology> TOPOLOGY_IID = InstanceIdentifier.create(NetworkTopology.class).child(Topology.class);
+    private static final InstanceIdentifier<Topology> TOPOLOGY_IID =
+            InstanceIdentifier.create(NetworkTopology.class).child(Topology.class);
 
     @GuardedBy("this")
     private final Set<BgpTopologyProvider> topologyProviders = new HashSet<>();
     private final DataBroker dataBroker;
-    private final ListenerRegistration<BgpTopologyDeployerImpl> registration;
     private final BundleContext context;
     private final ClusterSingletonServiceProvider singletonProvider;
+    private ListenerRegistration<BgpTopologyDeployerImpl> registration;
     @GuardedBy("this")
     private boolean closed;
 
-    public BgpTopologyDeployerImpl(final BundleContext context, final DataBroker dataBroker, final ClusterSingletonServiceProvider singletonProvider) {
+    public BgpTopologyDeployerImpl(final BundleContext context, final DataBroker dataBroker,
+            final ClusterSingletonServiceProvider singletonProvider) {
         this.context = requireNonNull(context);
         this.dataBroker = requireNonNull(dataBroker);
         this.singletonProvider = requireNonNull(singletonProvider);
-        this.registration =
-            this.dataBroker.registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(NetworkTopology.class).child(Topology.class)), this);
+    }
+
+    public void init() {
+        this.registration = this.dataBroker.registerDataTreeChangeListener(
+                new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, TOPOLOGY_IID), this);
         LOG.info("BGP topology deployer started.");
     }
 
@@ -78,20 +80,25 @@ public final class BgpTopologyDeployerImpl implements AutoCloseable, ClusteredDa
             final DataObjectModification<Topology> rootNode = change.getRootNode();
             final Topology dataBefore = rootNode.getDataBefore();
             final Topology dataAfter = rootNode.getDataAfter();
-            LOG.trace("BGP topology deployer configuration changed: modification type: [{}], data before:[{}], data after: [{}]", rootNode.getModificationType(), dataBefore, dataAfter);
+            LOG.trace("BGP topology deployer configuration changed: modification type: [{}]," +
+                    " data before:[{}], data after: [{}]", rootNode.getModificationType(), dataBefore, dataAfter);
             switch (rootNode.getModificationType()) {
-            case DELETE:
-                filterTopologyBuilders(dataBefore).forEach(provider -> provider.onTopologyBuilderRemoved(dataBefore));
-                break;
-            case SUBTREE_MODIFIED:
-                filterTopologyBuilders(dataBefore).forEach(provider -> provider.onTopologyBuilderRemoved(dataBefore));
-                filterTopologyBuilders(dataAfter).forEach(provider -> provider.onTopologyBuilderCreated(dataAfter, null));
-                break;
-            case WRITE:
-                filterTopologyBuilders(dataAfter).forEach(provider -> provider.onTopologyBuilderCreated(dataAfter, null));
-                break;
-            default:
-                break;
+                case DELETE:
+                    filterTopologyBuilders(dataBefore)
+                            .forEach(provider -> provider.onTopologyBuilderRemoved(dataBefore));
+                    break;
+                case SUBTREE_MODIFIED:
+                    filterTopologyBuilders(dataBefore).forEach(provider
+                            -> provider.onTopologyBuilderRemoved(dataBefore));
+                    filterTopologyBuilders(dataAfter).forEach(provider
+                            -> provider.onTopologyBuilderCreated(dataAfter));
+                    break;
+                case WRITE:
+                    filterTopologyBuilders(dataAfter).forEach(provider
+                            -> provider.onTopologyBuilderCreated(dataAfter));
+                    break;
+                default:
+                    break;
             }
         }
     }
@@ -117,9 +124,13 @@ public final class BgpTopologyDeployerImpl implements AutoCloseable, ClusteredDa
     @Override
     public AbstractRegistration registerService(final TopologyReferenceSingletonService topologyProviderService) {
         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);
+        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() {
             @Override
             protected void removeRegistration() {
@@ -127,53 +138,33 @@ public final class BgpTopologyDeployerImpl implements AutoCloseable, ClusteredDa
                     registerClusterSingletonService.close();
                 } catch (final Exception e) {
                     LOG.warn("Failed to close ClusterSingletonServiceRegistration {} for TopologyBuilder {}",
-                        registerClusterSingletonService, topologyProviderService.getInstanceIdentifier(), e);
+                            registerClusterSingletonService, topologyProviderService.getInstanceIdentifier(), e);
                 }
                 registerService.unregister();
             }
         };
     }
 
-    @Override
-    public void createInstance(final Topology topology) {
-        final Function<Topology, Void> writeFunction = topology1 -> {
-            final WriteTransaction wTx = this.dataBroker.newWriteOnlyTransaction();
-            final KeyedInstanceIdentifier<Topology, TopologyKey> topologyIIdKeyed =
-                InstanceIdentifier.create(NetworkTopology.class).child(Topology.class, topology1.getKey());
-            wTx.put(LogicalDatastoreType.CONFIGURATION, topologyIIdKeyed, topology1, true);
-            wTx.submit();
-            return null;
-        };
-
-        filterTopologyBuilders(topology).forEach(provider -> provider.onTopologyBuilderCreated(topology, writeFunction));
-    }
-
-    @Override
-    public void removeInstance(final Topology topology) {
-        filterTopologyBuilders(topology).forEach(provider -> provider.onTopologyBuilderRemoved(topology));
-    }
-
-    @Override
-    public InstanceIdentifier<Topology> getInstanceIdentifier() {
-        return TOPOLOGY_IID;
-    }
-
     @Override
     public synchronized void close() {
-        this.registration.close();
+        if (this.registration != null) {
+            this.registration.close();
+            this.registration = null;
+        }
+
         LOG.info("BGP topology deployer stopped.");
         this.closed = true;
     }
 
     private Iterable<BgpTopologyProvider> filterTopologyBuilders(final Topology topology) {
         return this.topologyProviders.stream().filter(input -> input.topologyTypeFilter(topology))
-            .collect(Collectors.toList());
+                .collect(Collectors.toList());
     }
 
     private ClusterSingletonServiceRegistration registerSingletonService(
-        final ClusterSingletonService clusterSingletonService) {
+            final ClusterSingletonService clusterSingletonService) {
         return ClusterSingletonServiceRegistrationHelper
-            .registerSingletonService(this.singletonProvider, clusterSingletonService);
+                .registerSingletonService(this.singletonProvider, clusterSingletonService);
     }
 
 }