Clustering support for existing design (FRM,IM,SM) - add retry mechanisms to avoid...
[openflowplugin.git] / applications / topology-manager / src / main / java / org / opendaylight / openflowplugin / applications / topology / manager / FlowCapableTopologyProvider.java
index 0f6251355518182410a1361cd2086366ffe637ca..66168949ff76176ea6b4720a82905c4efd1f1328 100644 (file)
@@ -9,9 +9,12 @@ package org.opendaylight.openflowplugin.applications.topology.manager;
 
 import java.util.concurrent.ExecutionException;
 
+import com.google.common.base.Optional;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
@@ -23,7 +26,6 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.NotificationListener;
-import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -56,12 +58,14 @@ public class FlowCapableTopologyProvider implements BindingAwareProvider, AutoCl
         this.terminationPointChangeListener = new TerminationPointChangeListenerImpl(dataBroker, processor);
         nodeChangeListener = new NodeChangeListenerImpl(dataBroker, processor);
 
-        final ReadWriteTransaction tx = dataBroker.newReadWriteTransaction();
-        tx.put(LogicalDatastoreType.OPERATIONAL, path, new TopologyBuilder().setKey(key).build(), true);
-        try {
-            tx.submit().get();
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.warn("Initial topology export failed, continuing anyway", e);
+        if(!isFlowTopologyExist(dataBroker, path)){
+            final ReadWriteTransaction tx = dataBroker.newReadWriteTransaction();
+            tx.put(LogicalDatastoreType.OPERATIONAL, path, new TopologyBuilder().setKey(key).build(), true);
+            try {
+                tx.submit().get();
+            } catch (InterruptedException | ExecutionException e) {
+                LOG.warn("Initial topology export failed, continuing anyway", e);
+            }
         }
 
         thread = new Thread(processor);
@@ -101,4 +105,19 @@ public class FlowCapableTopologyProvider implements BindingAwareProvider, AutoCl
             }
         }
     }
+
+    private boolean isFlowTopologyExist(final DataBroker dataBroker,
+                                        final InstanceIdentifier<Topology> path) {
+        final ReadTransaction tx = dataBroker.newReadOnlyTransaction();
+        try {
+            Optional<Topology> ofTopology = tx.read(LogicalDatastoreType.OPERATIONAL, path).checkedGet();
+            LOG.debug("OpenFlow topology exist in the operational data store at {}",path);
+            if(ofTopology.isPresent()){
+                return true;
+            }
+        } catch (ReadFailedException e) {
+            LOG.warn("OpenFlow topology read operation failed!", e);
+        }
+        return false;
+    }
 }