Convert DataChangeListeners to DataTreeChangeListeners
[groupbasedpolicy.git] / renderers / ofoverlay / src / main / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / OFOverlayRenderer.java
index 53b7c0747f12a083bb7be18862484203b564f482..ae27609a0676b67db86a592f10c42829c18a96a6 100755 (executable)
@@ -8,24 +8,26 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay;
 
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
-
 import javax.annotation.Nonnull;
-
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
+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.NotificationService;
 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.AsyncDataBroker.DataChangeScope;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.groupbasedpolicy.api.EpRendererAugmentationRegistry;
 import org.opendaylight.groupbasedpolicy.api.PolicyValidatorRegistry;
 import org.opendaylight.groupbasedpolicy.api.StatisticsManager;
@@ -39,25 +41,22 @@ import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.ClassifierDefinit
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.SubjectFeatures;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.statistics.SflowClientSettingsListener;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionDefinitionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayConfigBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-
 /**
  * Renderer that uses OpenFlow and OVSDB to implement an overlay network
  * using Open vSwitch.
  */
-public class OFOverlayRenderer implements AutoCloseable, DataChangeListener {
+public class OFOverlayRenderer implements AutoCloseable, DataTreeChangeListener<OfOverlayConfig> {
 
     private static final Logger LOG =
             LoggerFactory.getLogger(OFOverlayRenderer.class);
@@ -69,7 +68,7 @@ public class OFOverlayRenderer implements AutoCloseable, DataChangeListener {
     private final PolicyManager policyManager;
     private final ClassifierDefinitionListener classifierDefinitionListener;
     private final SflowClientSettingsListener sflowClientSettingsListener;
-    private ActionDefinitionListener actionDefinitionListener;
+    private final ActionDefinitionListener actionDefinitionListener;
     private final OfOverlayAug ofOverlayAug;
     private final OfOverlayL3NatAug ofOverlayL3NatAug;
 
@@ -78,10 +77,11 @@ public class OFOverlayRenderer implements AutoCloseable, DataChangeListener {
     private static final InstanceIdentifier<OfOverlayConfig> configIid =
             InstanceIdentifier.builder(OfOverlayConfig.class).build();
 
-    ListenerRegistration<DataChangeListener> configReg;
+    ListenerRegistration<?> configReg;
 
     public OFOverlayRenderer(final DataBroker dataProvider,
-            RpcProviderRegistry rpcRegistry,
+            PacketProcessingService packetProcessingService,
+            SalFlowService flowService,
             NotificationService notificationService,
             EpRendererAugmentationRegistry epRendererAugmentationRegistry,
             PolicyValidatorRegistry policyValidatorRegistry,
@@ -94,7 +94,7 @@ public class OFOverlayRenderer implements AutoCloseable, DataChangeListener {
         executor = Executors.newScheduledThreadPool(numCPU * 2);
 
         switchManager = new SwitchManager(dataProvider);
-        endpointManager = new EndpointManager(dataProvider, rpcRegistry, notificationService,
+        endpointManager = new EndpointManager(dataProvider, packetProcessingService, flowService, notificationService,
                 executor, switchManager);
 
         classifierDefinitionListener = new ClassifierDefinitionListener(dataBroker);
@@ -137,37 +137,53 @@ public class OFOverlayRenderer implements AutoCloseable, DataChangeListener {
     @Override
     public void close() throws Exception {
         executor.shutdownNow();
-        if (configReg != null) configReg.close();
-        if (switchManager != null) switchManager.close();
-        if (endpointManager != null) endpointManager.close();
-        if (classifierDefinitionListener != null) classifierDefinitionListener.close();
-        if (actionDefinitionListener != null) actionDefinitionListener.close();
-        if (ofOverlayAug != null) ofOverlayAug.close();
-        if (ofOverlayL3NatAug != null) ofOverlayL3NatAug.close();
-        if (policyManager != null) policyManager.close();
-        if (sflowClientSettingsListener != null) sflowClientSettingsListener.close();
+        if (configReg != null) {
+            configReg.close();
+        }
+        if (switchManager != null) {
+            switchManager.close();
+        }
+        if (endpointManager != null) {
+            endpointManager.close();
+        }
+        if (classifierDefinitionListener != null) {
+            classifierDefinitionListener.close();
+        }
+        if (actionDefinitionListener != null) {
+            actionDefinitionListener.close();
+        }
+        if (ofOverlayAug != null) {
+            ofOverlayAug.close();
+        }
+        if (ofOverlayL3NatAug != null) {
+            ofOverlayL3NatAug.close();
+        }
+        if (policyManager != null) {
+            policyManager.close();
+        }
+        if (sflowClientSettingsListener != null) {
+            sflowClientSettingsListener.close();
+        }
     }
 
     // ******************
-    // DataChangeListener
+    // DataTreeChangeListener
     // ******************
 
     @Override
-    public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        OfOverlayConfig config;
+    public void onDataTreeChanged(Collection<DataTreeModification<OfOverlayConfig>> changes) {
         try {
-            for (Entry<InstanceIdentifier<?>, DataObject> entry : change.getCreatedData().entrySet()) {
-                if (entry.getValue() instanceof OfOverlayConfig) {
-                    config = (OfOverlayConfig) entry.getValue();
-                    applyConfig(config).get();
-                    LOG.info("OF-Overlay config created: {}", config);
-                }
-            }
-            for (Entry<InstanceIdentifier<?>, DataObject> entry : change.getUpdatedData().entrySet()) {
-                if (entry.getValue() instanceof OfOverlayConfig) {
-                    config = (OfOverlayConfig) entry.getValue();
-                    applyConfig(config).get();
-                    LOG.info("OF-Overlay config updated: {}", config);
+            for (DataTreeModification<OfOverlayConfig> change: changes) {
+                DataObjectModification<OfOverlayConfig> rootNode = change.getRootNode();
+                switch (rootNode.getModificationType()) {
+                    case SUBTREE_MODIFIED:
+                    case WRITE:
+                        final OfOverlayConfig config = rootNode.getDataAfter();
+                        LOG.info("OF-Overlay config updated: {}", config);
+                        applyConfig(config).get();
+                        break;
+                    default:
+                        break;
                 }
             }
         } catch (InterruptedException | ExecutionException e) {
@@ -180,11 +196,8 @@ public class OFOverlayRenderer implements AutoCloseable, DataChangeListener {
     // **************
 
     private void registerConfigListener(DataBroker dataProvider) {
-        configReg =
-                dataProvider.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
-                        configIid,
-                        this,
-                        DataChangeScope.SUBTREE);
+        configReg = dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier<>(
+                LogicalDatastoreType.CONFIGURATION, configIid), this);
     }
 
     private Optional<OfOverlayConfig> readConfig() {