Convert DataChangeListeners to DataTreeChangeListeners 22/62522/2
authorTom Pantelis <tompantelis@gmail.com>
Thu, 31 Aug 2017 23:19:39 +0000 (19:19 -0400)
committerTom Pantelis <tompantelis@gmail.com>
Fri, 1 Sep 2017 06:30:41 +0000 (02:30 -0400)
The DataChangeListener API has been deprecated for a couple releases
with possible removal in Oxygen.

Change-Id: I28c804d85d21229f235e1451a51211493299c778
Signed-off-by: Tom Pantelis <tompantelis@gmail.com>
37 files changed:
neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListener.java
neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListenerTest.java
renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListener.java
renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListener.java
renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManager.java
renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListener.java
renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasTenantManagerListener.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListenerCovrgTest.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListenerTest.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListenerCovrgTest.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListenerTest.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManagerCovrgTest.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManagerTest.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasRendererCovrgTest.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListenerCovrgTest.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListenerTest.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasTenantManagerListenerCovrgTest.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasContractManagerListener.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasEndpointManagerListener.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasPolicyManager.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasSubnetManagerListener.java
renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/test/DataChangeListenerTester.java [deleted file]
renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/endpoint/EndpointListenerTest.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRenderer.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SfcManager.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerListener.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeConnectorListener.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeListener.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/OfOverlayNodeListener.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRendererTest.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SfcManagerTest.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerListenerTest.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerTest.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeConnectorListenerTest.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeListenerTest.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/OfOverlayNodeListenerTest.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/test/DataChangeListenerTester.java [deleted file]

index 7fd0cc20b24cc3e10b6136da01f6b2a8e67710f9..cb287fc2ce1c3fb16274a9901fd0613d9cad9e87 100755 (executable)
@@ -22,21 +22,20 @@ import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.c
 import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getManagerNode;
 import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbBridgeFromTerminationPoint;
 import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getTopologyNode;
-import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
-
 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.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-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.ovsdb.southbound.SouthboundConstants;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
@@ -55,17 +54,15 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
 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;
-
-public class TerminationPointDataChangeListener implements DataChangeListener, AutoCloseable {
+public class TerminationPointDataChangeListener implements DataTreeChangeListener<OvsdbTerminationPointAugmentation>,
+        AutoCloseable {
 
     private static final String NEUTRON_EXTERNAL_ID_KEY = "iface-id";
-    private final ListenerRegistration<DataChangeListener> registration;
+    private final ListenerRegistration<?> registration;
     private final DataBroker dataBroker;
     private final EndpointService epService;
     private static final Logger LOG = LoggerFactory.getLogger(TerminationPointDataChangeListener.class);
@@ -79,13 +76,13 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
             .child(Node.class)
             .child(TerminationPoint.class)
             .augmentation(OvsdbTerminationPointAugmentation.class);
-        registration =
-                dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, iid, this, DataChangeScope.ONE);
+        registration = dataBroker.registerDataTreeChangeListener(new DataTreeIdentifier<>(
+                LogicalDatastoreType.OPERATIONAL, iid), this);
         requiredTunnelTypes = createSupportedTunnelsList();
     }
 
     private List<AbstractTunnelType> createSupportedTunnelsList() {
-        List<AbstractTunnelType> required = new ArrayList<AbstractTunnelType>();
+        List<AbstractTunnelType> required = new ArrayList<>();
         required.add(new VxlanTunnelType());
         required.add(new VxlanGpeTunnelType());
         return Collections.unmodifiableList(required);
@@ -104,50 +101,28 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
             new HashMap<>();
 
     @Override
-    public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-
-        /*
-         * TerminationPoint notifications with OVSDB augmentations
-         * vSwitch ports. Iterate through the list of new ports.
-         */
-        for (Entry<InstanceIdentifier<?>, DataObject> entry : change.getCreatedData().entrySet()) {
-            if (entry.getValue() instanceof OvsdbTerminationPointAugmentation) {
-                OvsdbTerminationPointAugmentation ovsdbTp = (OvsdbTerminationPointAugmentation) entry.getValue();
-                @SuppressWarnings("unchecked")
-                InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid =
-                        (InstanceIdentifier<OvsdbTerminationPointAugmentation>) entry.getKey();
-                OvsdbBridgeAugmentation ovsdbBridge = getOvsdbBridgeFromTerminationPoint(ovsdbTpIid, dataBroker);
-                nodeIdByTerminPoint.put(ovsdbTpIid,
-                        new NodeId(getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker)));
-                processOvsdbBridge(ovsdbBridge, ovsdbTp, ovsdbTpIid);
-            }
-        }
-
-        /*
-         * Updates
-         */
-        for (Entry<InstanceIdentifier<?>, DataObject> entry : change.getUpdatedData().entrySet()) {
-            if (entry.getValue() instanceof OvsdbTerminationPointAugmentation) {
-                OvsdbTerminationPointAugmentation ovsdbTp = (OvsdbTerminationPointAugmentation) entry.getValue();
-                @SuppressWarnings("unchecked")
-                InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid =
-                        (InstanceIdentifier<OvsdbTerminationPointAugmentation>) entry.getKey();
-                OvsdbBridgeAugmentation ovsdbBridge = getOvsdbBridgeFromTerminationPoint(ovsdbTpIid, dataBroker);
-                processOvsdbBridge(ovsdbBridge, ovsdbTp, ovsdbTpIid);
-            }
-        }
-
-        /*
-         * Deletions
-         */
-        for (InstanceIdentifier<?> iid : change.getRemovedPaths()) {
-            DataObject old = change.getOriginalData().get(iid);
-            if (old instanceof OvsdbTerminationPointAugmentation) {
-                OvsdbTerminationPointAugmentation ovsdbTp = (OvsdbTerminationPointAugmentation) old;
-                @SuppressWarnings("unchecked")
-                InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid =
-                        (InstanceIdentifier<OvsdbTerminationPointAugmentation>) iid;
-                processRemovedTp(nodeIdByTerminPoint.get(ovsdbTpIid), ovsdbTp, ovsdbTpIid);
+    public void onDataTreeChanged(Collection<DataTreeModification<OvsdbTerminationPointAugmentation>> changes) {
+        for (DataTreeModification<OvsdbTerminationPointAugmentation> change: changes) {
+            DataObjectModification<OvsdbTerminationPointAugmentation> rootNode = change.getRootNode();
+            InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid = change.getRootPath().getRootIdentifier();
+            OvsdbTerminationPointAugmentation origOvsdbTp = rootNode.getDataBefore();
+            switch (rootNode.getModificationType()) {
+                case SUBTREE_MODIFIED:
+                case WRITE:
+                    OvsdbTerminationPointAugmentation updatedOvsdbTp = rootNode.getDataAfter();
+                    OvsdbBridgeAugmentation ovsdbBridge = getOvsdbBridgeFromTerminationPoint(ovsdbTpIid, dataBroker);
+                    if (origOvsdbTp == null) {
+                        nodeIdByTerminPoint.put(ovsdbTpIid,
+                                new NodeId(getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker)));
+                    }
+
+                    processOvsdbBridge(ovsdbBridge, updatedOvsdbTp, ovsdbTpIid);
+                    break;
+                case DELETE:
+                    processRemovedTp(nodeIdByTerminPoint.get(ovsdbTpIid), origOvsdbTp, ovsdbTpIid);
+                    break;
+                default:
+                    break;
             }
         }
     }
@@ -399,8 +374,9 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
          */
         OvsdbNodeAugmentation managerNode = getManagerNode(ovsdbBridge, dataBroker);
 
-        if (managerNode == null)
+        if (managerNode == null) {
             return null;
+        }
 
         if (managerNode.getConnectionInfo() != null) {
             return managerNode.getConnectionInfo().getRemoteIp();
index 5d6ffa7922fd67bfd63768a0e0556d3da5fda879..e6bb325724a29da5ef87face9e1ec3f7c6e82239 100644 (file)
@@ -9,28 +9,26 @@
 package org.opendaylight.groupbasedpolicy.neutron.ovsdb;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-
 import com.google.common.base.Optional;
 import com.google.common.util.concurrent.CheckedFuture;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.UUID;
 import org.junit.Before;
 import org.junit.Test;
 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.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-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.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
@@ -56,7 +54,6 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class TerminationPointDataChangeListenerTest {
@@ -65,11 +62,10 @@ public class TerminationPointDataChangeListenerTest {
 
     private DataBroker dataBroker;
     private EndpointService epService;
-    private ListenerRegistration<DataChangeListener> registration;
-    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
+    private ListenerRegistration<?> registration;
 
-    private Map<InstanceIdentifier<?>, DataObject> dataMap;
-    private Set<InstanceIdentifier<?>> dataSet;
+    private DataObjectModification<OvsdbTerminationPointAugmentation> mockModification;
+    private Collection<DataTreeModification<OvsdbTerminationPointAugmentation>> changeEvent;
     private Node node;
 
     private CheckedFuture<Optional<OvsdbBridgeAugmentation>, ReadFailedException> ovsdbBridgeFuture;
@@ -88,10 +84,8 @@ public class TerminationPointDataChangeListenerTest {
         dataBroker = mock(DataBroker.class);
         epService = mock(EndpointService.class);
         registration = mock(ListenerRegistration.class);
-        when(
-                dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
-                        any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(registration);
-        change = mock(AsyncDataChangeEvent.class);
+        when(dataBroker.registerDataTreeChangeListener(any(DataTreeIdentifier.class),
+                        any(DataTreeChangeListener.class))).thenReturn(registration);
 
         InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid = InstanceIdentifier.create(
                 NetworkTopology.class)
@@ -106,10 +100,6 @@ public class TerminationPointDataChangeListenerTest {
         when(externalId.getExternalIdKey()).thenReturn("iface-id");
         when(externalId.getExternalIdValue()).thenReturn(UUID.randomUUID().toString());
 
-        dataMap = new HashMap<>();
-        dataMap.put(ovsdbTpIid, ovsdbTp);
-        dataSet = new HashSet<InstanceIdentifier<?>>(Collections.singletonList(ovsdbTpIid));
-
         readTransaction = mock(ReadOnlyTransaction.class);
         when(dataBroker.newReadOnlyTransaction()).thenReturn(readTransaction);
         readWriteTransaction = mock(ReadWriteTransaction.class);
@@ -177,6 +167,14 @@ public class TerminationPointDataChangeListenerTest {
         when(ofOverlayNodeConfigOptional.get()).thenReturn(ofOverlayNodeConfig);
 
         listener = new TerminationPointDataChangeListener(dataBroker, epService);
+
+        DataTreeModification<OvsdbTerminationPointAugmentation> mockDataTreeModification =
+                mock(DataTreeModification.class);
+        mockModification = mock(DataObjectModification.class);
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+        doReturn(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, ovsdbTpIid))
+                .when(mockDataTreeModification).getRootPath();
+        changeEvent = Collections.singletonList(mockDataTreeModification);
     }
 
     @Test
@@ -188,7 +186,9 @@ public class TerminationPointDataChangeListenerTest {
     @SuppressWarnings("unchecked")
     @Test
     public void testOnDataChanged_Creation() {
-        when(change.getCreatedData()).thenReturn(dataMap);
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(ovsdbTp).when(mockModification).getDataAfter();
+
         when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
                 ovsdbBridgeFuture)
             .thenReturn(endpointFuture)
@@ -197,26 +197,31 @@ public class TerminationPointDataChangeListenerTest {
         when(readWriteTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
                 endpointByPortFuture).thenReturn(ofOverlayNodeConfigFuture);
 
-        listener.onDataChanged(change);
+        listener.onDataTreeChanged(changeEvent);
         verify(readWriteTransaction).submit();
     }
 
     @SuppressWarnings("unchecked")
     @Test
     public void testOnDataChanged_CreationExternalIdNull() {
-        when(change.getCreatedData()).thenReturn(dataMap);
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(ovsdbTp).when(mockModification).getDataAfter();
+
         when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
                 ovsdbBridgeFuture).thenReturn(nodeFuture);
         when(ovsdbTp.getInterfaceExternalIds()).thenReturn(null);
 
-        listener.onDataChanged(change);
+        listener.onDataTreeChanged(changeEvent);
         verify(readWriteTransaction, never()).submit();
     }
 
     @SuppressWarnings("unchecked")
     @Test
     public void testOnDataChanged_Update() {
-        when(change.getUpdatedData()).thenReturn(dataMap);
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(ovsdbTp).when(mockModification).getDataBefore();
+        doReturn(ovsdbTp).when(mockModification).getDataAfter();
+
         when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
                 ovsdbBridgeFuture)
             .thenReturn(endpointFuture)
@@ -224,21 +229,22 @@ public class TerminationPointDataChangeListenerTest {
         when(readWriteTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
                 endpointByPortFuture).thenReturn(ofOverlayNodeConfigFuture);
 
-        listener.onDataChanged(change);
+        listener.onDataTreeChanged(changeEvent);
         verify(readWriteTransaction).submit();
     }
 
     @SuppressWarnings("unchecked")
     @Test
     public void testOnDataChanged_Removal() {
-        when(change.getRemovedPaths()).thenReturn(dataSet);
-        when(change.getOriginalData()).thenReturn(dataMap);
+        doReturn(DataObjectModification.ModificationType.DELETE).when(mockModification).getModificationType();
+        doReturn(ovsdbTp).when(mockModification).getDataBefore();
+
         when(readWriteTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
                 endpointByPortFuture);
         when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
                 endpointFuture);
 
-        listener.onDataChanged(change);
+        listener.onDataTreeChanged(changeEvent);
         verify(readWriteTransaction).submit();
     }
 }
index f8f12fc98f541d2f078d5b91dfece42595b41601..7b73860460f2f7fb7af37abfac4cd3651c2038fc 100644 (file)
@@ -8,21 +8,21 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.faas;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ScheduledExecutorService;
-
-import com.google.common.annotations.VisibleForTesting;
+import java.util.concurrent.Executor;
 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.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.faas.uln.datastore.api.UlnDatastoreApi;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
@@ -64,24 +64,21 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ActionInstanceKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstanceKey;
-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;
-
-public class FaasContractManagerListener implements DataChangeListener {
+public class FaasContractManagerListener implements DataTreeChangeListener<Contract> {
 
     private static final Logger LOG = LoggerFactory.getLogger(FaasContractManagerListener.class);
-    private ConcurrentHashMap<ContractId, Uuid> mappedContracts = new ConcurrentHashMap<>();
-    private final ScheduledExecutorService executor;
+    private final ConcurrentHashMap<ContractId, Uuid> mappedContracts = new ConcurrentHashMap<>();
+    private final Executor executor;
     private final DataBroker dataProvider;
     private final TenantId gbpTenantId;
     private final Uuid faasTenantId;
 
     public FaasContractManagerListener(DataBroker dataProvider, TenantId gbpTenantId, Uuid faasTenantId,
-            ScheduledExecutorService executor) {
+            Executor executor) {
         this.executor = executor;
         this.gbpTenantId = gbpTenantId;
         this.faasTenantId = faasTenantId;
@@ -89,53 +86,36 @@ public class FaasContractManagerListener implements DataChangeListener {
     }
 
     @Override
-    public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        executor.execute(new Runnable() {
-
-            public void run() {
-                executeEvent(change);
-            }
-        });
+    public void onDataTreeChanged(Collection<DataTreeModification<Contract>> changes) {
+        executor.execute(() -> executeEvent(changes));
     }
 
-    @VisibleForTesting
-    void executeEvent(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        // Create
-        for (DataObject dao : change.getCreatedData().values()) {
-            if (dao instanceof Contract) {
-                Contract contract = (Contract) dao;
-                LOG.debug("Contract {} is Created.", contract.getId().getValue());
-                UlnDatastoreApi.submitSecurityGroupsToDs(initSecurityGroupBuilder(contract).build());
-            }
-        }
-        // Update
-        Map<InstanceIdentifier<?>, DataObject> dao = change.getUpdatedData();
-        for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : dao.entrySet()) {
-            if (entry.getValue() instanceof Contract) {
-                Contract contract = (Contract) entry.getValue();
-                LOG.debug("Contract {} is Updated.", contract.getId().getValue());
-                UlnDatastoreApi.submitSecurityGroupsToDs(initSecurityGroupBuilder(contract).build());
-            }
-        }
-        // Remove
-        for (InstanceIdentifier<?> iid : change.getRemovedPaths()) {
-            DataObject old = change.getOriginalData().get(iid);
-            if (old == null) {
-                continue;
-            }
-            if (old instanceof Contract) {
-                Contract contract = (Contract) old;
-                LOG.debug("Contract {} is removed.", contract.getId().getValue());
-                ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
-                Optional<MappedContract> op = DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
-                        FaasIidFactory.mappedContractIid(gbpTenantId, contract.getId()), rwTx);
-                if (op.isPresent()) {
-                    DataStoreHelper.submitToDs(rwTx);
-                }
-                Uuid val = mappedContracts.remove(contract.getId());
-                if (val != null) {
-                    UlnDatastoreApi.removeSecurityGroupsFromDsIfExists(faasTenantId, val);
-                }
+    private void executeEvent(final Collection<DataTreeModification<Contract>> changes) {
+        for (DataTreeModification<Contract> change: changes) {
+            DataObjectModification<Contract> rootNode = change.getRootNode();
+            switch (rootNode.getModificationType()) {
+                case SUBTREE_MODIFIED:
+                case WRITE:
+                    Contract updatedContract = rootNode.getDataAfter();
+                    LOG.debug("Contract {} is Updated.", updatedContract.getId().getValue());
+                    UlnDatastoreApi.submitSecurityGroupsToDs(initSecurityGroupBuilder(updatedContract).build());
+                    break;
+                case DELETE:
+                    Contract deletedContract = rootNode.getDataBefore();
+                    LOG.debug("Contract {} is removed.", deletedContract.getId().getValue());
+                    ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
+                    Optional<MappedContract> op = DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
+                            FaasIidFactory.mappedContractIid(gbpTenantId, deletedContract.getId()), rwTx);
+                    if (op.isPresent()) {
+                        DataStoreHelper.submitToDs(rwTx);
+                    }
+                    Uuid val = mappedContracts.remove(deletedContract.getId());
+                    if (val != null) {
+                        UlnDatastoreApi.removeSecurityGroupsFromDsIfExists(faasTenantId, val);
+                    }
+                    break;
+                default:
+                    break;
             }
         }
     }
@@ -159,10 +139,11 @@ public class FaasContractManagerListener implements DataChangeListener {
         SecurityRuleGroupsBuilder builder = new SecurityRuleGroupsBuilder();
         builder.setUuid(getFaasSecurityRulesId(contract.getId()));
         builder.setName(new Text(contract.getId().getValue()));
-        if (contract.getDescription() != null)
+        if (contract.getDescription() != null) {
             builder.setDescription(new Text("gbp-contract: " + contract.getDescription().getValue()));
-        else
+        } else {
             builder.setDescription(new Text("gbp-contract"));
+        }
         builder.setTenantId(faasTenantId);
         builder.setSecurityRuleGroup(buildSecurityRuleGroup(contract));
         LOG.trace("Contract {} is mapped to Faas Security Rules {} ", contract.getId().getValue(), builder.getUuid()
index 06116c80257743ea4b951c94489169e24aca0f31..0c08e9c65b598d2627bc5d2796920b3124ac7d21 100644 (file)
@@ -10,18 +10,19 @@ package org.opendaylight.groupbasedpolicy.renderer.faas;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 import java.util.UUID;
-import java.util.concurrent.ScheduledExecutorService;
-
+import java.util.concurrent.Executor;
 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.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.faas.uln.datastore.api.UlnDatastoreApi;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
@@ -40,105 +41,84 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3Address;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Prefix;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.faas.rev151009.mapped.tenants.entities.mapped.entity.MappedEndpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.faas.rev151009.mapped.tenants.entities.mapped.entity.MappedEndpointBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.faas.rev151009.mapped.tenants.entities.mapped.entity.MappedEndpointKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.faas.rev151009.mapped.tenants.entities.mapped.entity.MappedSubnet;
 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.annotations.VisibleForTesting;
-import com.google.common.base.Optional;
-
-public class FaasEndpointManagerListener implements DataChangeListener, AutoCloseable {
+public class FaasEndpointManagerListener implements AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(FaasEndpointManagerListener.class);
-    private final ScheduledExecutorService executor;
-    private final ListenerRegistration<DataChangeListener> registerListener;
+    private final List<ListenerRegistration<?>> listenerRegistrations = new ArrayList<>();
     private final FaasPolicyManager policyManager;
     private final DataBroker dataProvider;
 
     public FaasEndpointManagerListener(FaasPolicyManager policyManager, DataBroker dataProvider,
-            ScheduledExecutorService executor) {
-        this.executor = executor;
+            Executor executor) {
         this.policyManager = policyManager;
         this.dataProvider = dataProvider;
-        this.registerListener = checkNotNull(dataProvider).registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
-                IidFactory.endpointsIidWildcard(), this, AsyncDataBroker.DataChangeScope.SUBTREE);
+
+        checkNotNull(dataProvider);
+        listenerRegistrations.add(dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier<>(
+            LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(Endpoint.class)),
+            changes -> executor.execute(() -> onEndpointChanged(changes))));
+
+        listenerRegistrations.add(dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier<>(
+            LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(EndpointL3.class)),
+            changes -> executor.execute(() -> onEndpointL3Changed(changes))));
     }
 
     @Override
     public void close() throws Exception {
-        if (registerListener != null)
-            registerListener.close();
+        for (ListenerRegistration<?> reg: listenerRegistrations) {
+            reg.close();
+        }
     }
 
-    @Override
-    public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        executor.execute(new Runnable() {
-
-            public void run() {
-                executeEvent(change);
+    private void onEndpointChanged(Collection<DataTreeModification<Endpoint>> changes) {
+        for (DataTreeModification<Endpoint> change: changes) {
+            DataObjectModification<Endpoint> rootNode = change.getRootNode();
+            switch (rootNode.getModificationType()) {
+                case SUBTREE_MODIFIED:
+                case WRITE:
+                    Endpoint updatedEndpoint = rootNode.getDataAfter();
+                    LOG.debug("Updated Endpoint {}", updatedEndpoint);
+                    if (validate(updatedEndpoint)) {
+                        policyManager.registerTenant(updatedEndpoint.getTenant(), updatedEndpoint.getEndpointGroup());
+                        processEndpoint(updatedEndpoint);
+                    }
+                    break;
+                case DELETE:
+                    Endpoint deletedEndpoint = rootNode.getDataBefore();
+                    LOG.debug("Removed Endpoint {}", deletedEndpoint);
+                    removeFaasEndpointLocationIfExist(deletedEndpoint.getTenant(), deletedEndpoint.getL2Context(),
+                            deletedEndpoint.getMacAddress());
+                    break;
+                default:
+                    break;
             }
-        });
+        }
     }
 
-    @VisibleForTesting
-    void executeEvent(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-
-        // Create
-        for (DataObject dao : change.getCreatedData().values()) {
-            if (dao instanceof Endpoint) {
-                Endpoint endpoint = (Endpoint) dao;
-                LOG.debug("Created Endpoint {}", endpoint);
-                if (validate(endpoint)) {
-                    policyManager.registerTenant(endpoint.getTenant(), endpoint.getEndpointGroup());
-                    processEndpoint(endpoint);
-                }
-            } else if (dao instanceof EndpointL3) {
-                LOG.debug("Created EndpointL3 {}", dao);
-            } else if (dao instanceof EndpointL3Prefix) {
-                LOG.warn("Not Handled Event Yet by Faas Renderer. Created EndpointL3Prefix {}", dao);
-            }
-        }
-        // Update
-        Map<InstanceIdentifier<?>, DataObject> dao = change.getUpdatedData();
-        for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : dao.entrySet()) {
-            if (entry.getValue() instanceof Endpoint) {
-                Endpoint endpoint = (Endpoint) entry.getValue();
-                LOG.debug("Updated Endpoint {}", endpoint);
-                if (validate(endpoint)) {
-                    policyManager.registerTenant(endpoint.getTenant(), endpoint.getEndpointGroup());
-                    processEndpoint(endpoint);
-                }
-            } else if (entry.getValue() instanceof EndpointL3) {
-                LOG.debug("Updated EndpointL3 {}", entry.getValue());
-            } else if (entry.getValue() instanceof EndpointL3Prefix) {
-                LOG.warn("Not Handled Event Yet by Faas Renderer. Updated EndpointL3Prefix {}", entry.getValue());
-            }
-        }
-        // Remove
-        for (InstanceIdentifier<?> iid : change.getRemovedPaths()) {
-            DataObject old = change.getOriginalData().get(iid);
-            if (old == null) {
-                continue;
-            }
-            if (old instanceof Endpoint) {
-                Endpoint endpoint = (Endpoint) old;
-                LOG.debug("Removed Endpoint {}", endpoint);
-                removeFaasEndpointLocationIfExist(endpoint.getTenant(), endpoint.getL2Context(),
-                        endpoint.getMacAddress());
-            } else if (old instanceof EndpointL3) {
-                EndpointL3 endpoint = (EndpointL3) old;
-                LOG.debug("Removed EndpointL3 {}", endpoint);
-                removeFaasEndpointLocationIfExist(endpoint.getTenant(), endpoint.getL2Context(),
-                        endpoint.getMacAddress());
-            } else if (old instanceof EndpointL3Prefix) {
-                LOG.warn("Not Handled Event Yet by Faas Renderer. Removed EndpointL3Prefix {}", old);
+    private void onEndpointL3Changed(Collection<DataTreeModification<EndpointL3>> changes) {
+        for (DataTreeModification<EndpointL3> change: changes) {
+            DataObjectModification<EndpointL3> rootNode = change.getRootNode();
+            switch (rootNode.getModificationType()) {
+                case SUBTREE_MODIFIED:
+                case WRITE:
+                    LOG.debug("Updated EndpointL3 {}", rootNode.getDataAfter());
+                    break;
+                case DELETE:
+                    EndpointL3 endpoint = rootNode.getDataBefore();
+                    LOG.debug("Removed EndpointL3 {}", endpoint);
+                    removeFaasEndpointLocationIfExist(endpoint.getTenant(), endpoint.getL2Context(),
+                            endpoint.getMacAddress());
+                    break;
+                default:
+                    break;
             }
         }
     }
index 2dc43f4accc798d60763870bd7f1a7aa1bc3c857..9ac9d8a86a46057f3915193cafdb3edf1acaf759 100644 (file)
@@ -9,7 +9,10 @@ package org.opendaylight.groupbasedpolicy.renderer.faas;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -17,18 +20,15 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ScheduledExecutorService;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Optional;
+import java.util.concurrent.Executor;
 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.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
-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.faas.uln.datastore.api.Pair;
 import org.opendaylight.faas.uln.datastore.api.UlnDatastoreApi;
@@ -79,29 +79,28 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.p
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.PolicyRuleGroupWithEndpointConstraints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroup;
 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;
 
-public class FaasPolicyManager implements DataChangeListener, AutoCloseable {
+public class FaasPolicyManager implements DataTreeChangeListener<ResolvedPolicy>, AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(FaasPolicyManager.class);
     private static final RendererName rendererName = new RendererName("faas");
-    private final ListenerRegistration<DataChangeListener> registerListener;
-    private final ScheduledExecutorService executor;
+    private final ListenerRegistration<?> registerListener;
+    private final Executor executor;
     private final DataBroker dataProvider;
     final Map<Pair<EndpointGroupId, TenantId>, List<SubnetId>> epgSubnetsMap = new HashMap<>();
     private final ConcurrentHashMap<TenantId, Uuid> mappedTenants = new ConcurrentHashMap<>();
-    final ConcurrentHashMap<TenantId, ArrayList<ListenerRegistration<DataChangeListener>>> registeredTenants =
+    final ConcurrentHashMap<TenantId, ArrayList<ListenerRegistration<?>>> registeredTenants =
             new ConcurrentHashMap<>();
 
-    public FaasPolicyManager(DataBroker dataBroker, ScheduledExecutorService executor) {
+    public FaasPolicyManager(DataBroker dataBroker, Executor executor) {
         this.dataProvider = dataBroker;
         this.executor = executor;
-        this.registerListener = checkNotNull(dataProvider).registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
-                InstanceIdentifier.builder(ResolvedPolicies.class).child(ResolvedPolicy.class).build(), this,
-                AsyncDataBroker.DataChangeScope.SUBTREE);
+        this.registerListener = checkNotNull(dataProvider).registerDataTreeChangeListener(new DataTreeIdentifier<>(
+                LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.builder(ResolvedPolicies.class)
+                    .child(ResolvedPolicy.class).build()), this);
 
         RendererBuilder rendBuilder = new RendererBuilder();
         rendBuilder.setName(rendererName);
@@ -117,64 +116,48 @@ public class FaasPolicyManager implements DataChangeListener, AutoCloseable {
     @Override
     public void close() throws Exception {
         synchronized (registeredTenants) {
-            for (ArrayList<ListenerRegistration<DataChangeListener>> list : registeredTenants.values()) {
+            for (ArrayList<ListenerRegistration<?>> list : registeredTenants.values()) {
                 list.forEach(ListenerRegistration::close);
             }
             registeredTenants.clear();
 
             LOG.debug("Closed All Tenant Registerations");
         }
-        if (registerListener != null)
+        if (registerListener != null) {
             registerListener.close();
+        }
     }
 
     @Override
-    public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        executor.execute(new Runnable() {
-
-            public void run() {
-                executeEvent(change);
-            }
-        });
+    public void onDataTreeChanged(Collection<DataTreeModification<ResolvedPolicy>> changes) {
+        executor.execute(() -> executeEvent(changes));
     }
 
-    private void executeEvent(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        // Create
-        for (DataObject dao : change.getCreatedData().values()) {
-            if (dao instanceof ResolvedPolicy) {
-                ResolvedPolicy newPolicy = (ResolvedPolicy) dao;
-                if (handledPolicy(newPolicy)) {
-                    LOG.debug("Created Policy: Consumer EPG {}, Provider EPG {}", newPolicy.getConsumerEpgId(),
-                            newPolicy.getProviderEpgId());
-                    updateLogicalNetwork(newPolicy);
-                }
-            }
-        }
-        // Update
-        Map<InstanceIdentifier<?>, DataObject> d = change.getUpdatedData();
-        for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : d.entrySet()) {
-            if (entry.getValue() instanceof ResolvedPolicy) {
-                ResolvedPolicy newPolicy = (ResolvedPolicy) entry.getValue();
-                ResolvedPolicy oldPolicy = (ResolvedPolicy) change.getOriginalData().get(entry.getKey());
-                if (!isEqualService(newPolicy, oldPolicy)) {
-                    removeLogicalNetwork(oldPolicy);
-                }
-                if (handledPolicy(newPolicy)) {
-                    LOG.debug("Updated Policy: Consumer EPG {}, Provider EPG {}", newPolicy.getConsumerEpgId(),
-                            newPolicy.getProviderEpgId());
-                    updateLogicalNetwork(newPolicy);
-                }
-            }
-        }
+    private void executeEvent(final Collection<DataTreeModification<ResolvedPolicy>> changes) {
+        for (DataTreeModification<ResolvedPolicy> change: changes) {
+            DataObjectModification<ResolvedPolicy> rootNode = change.getRootNode();
+            ResolvedPolicy oldPolicy = rootNode.getDataBefore();
+            switch (rootNode.getModificationType()) {
+                case SUBTREE_MODIFIED:
+                case WRITE:
+                    ResolvedPolicy newPolicy = rootNode.getDataAfter();
+                    if (!isEqualService(newPolicy, oldPolicy)) {
+                        removeLogicalNetwork(oldPolicy);
+                    }
 
-        // Remove
-        for (InstanceIdentifier<?> iid : change.getRemovedPaths()) {
-            DataObject old = change.getOriginalData().get(iid);
-            if (old != null && old instanceof ResolvedPolicy) {
-                ResolvedPolicy oldPolicy = (ResolvedPolicy) old;
-                LOG.debug("Removed Policy: Consumer EPG {}, Provider EPG {}", oldPolicy.getConsumerEpgId(),
-                        oldPolicy.getProviderEpgId());
-                removeLogicalNetwork(oldPolicy);
+                    if (handledPolicy(newPolicy)) {
+                        LOG.debug("Updated Policy: Consumer EPG {}, Provider EPG {}", newPolicy.getConsumerEpgId(),
+                                newPolicy.getProviderEpgId());
+                        updateLogicalNetwork(newPolicy);
+                    }
+                    break;
+                case DELETE:
+                    LOG.debug("Removed Policy: Consumer EPG {}, Provider EPG {}", oldPolicy.getConsumerEpgId(),
+                            oldPolicy.getProviderEpgId());
+                    removeLogicalNetwork(oldPolicy);
+                    break;
+                default:
+                    break;
             }
         }
     }
@@ -249,21 +232,23 @@ public class FaasPolicyManager implements DataChangeListener, AutoCloseable {
             /*
              * tenant registrations
              */
-            ArrayList<ListenerRegistration<DataChangeListener>> list = new ArrayList<>();
-            ListenerRegistration<DataChangeListener> reg;
+            ArrayList<ListenerRegistration<?>> list = new ArrayList<>();
+            ListenerRegistration<?> reg;
             // contracts
-            reg = dataProvider.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
-                    IidFactory.contractWildcardIid(gbpTenantId), faasContractManagerListener, DataChangeScope.SUBTREE);
+            reg = dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier<>(
+                    LogicalDatastoreType.CONFIGURATION, IidFactory.contractWildcardIid(gbpTenantId)),
+                    faasContractManagerListener);
             list.add(reg);
             // subnets
-            reg = dataProvider.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
-                    IidFactory.subnetWildcardIid(gbpTenantId), faasSubnetManagerListener, DataChangeScope.SUBTREE);
+            reg = dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier<>(
+                    LogicalDatastoreType.CONFIGURATION, IidFactory.subnetWildcardIid(gbpTenantId)),
+                    faasSubnetManagerListener);
             list.add(reg);
 
             // tenant
-            reg = dataProvider.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
-                    IidFactory.tenantIid(gbpTenantId), new FaasTenantManagerListener(this, gbpTenantId, faasTenantId,
-                            executor), DataChangeScope.BASE);
+            reg = dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier<>(
+                    LogicalDatastoreType.CONFIGURATION, IidFactory.tenantIid(gbpTenantId)),
+                    new FaasTenantManagerListener(this, gbpTenantId, faasTenantId, executor));
             list.add(reg);
 
             // Map previously resolved policy for this tenant
@@ -363,16 +348,17 @@ public class FaasPolicyManager implements DataChangeListener, AutoCloseable {
     }
 
     public static boolean isUUid(String value) {
-        return (value != null && value.matches("[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}"));
+        return value != null && value.matches("[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}");
     }
 
     public void unregisterTenant(TenantId tenantId) {
 
-        ArrayList<ListenerRegistration<DataChangeListener>> list = registeredTenants.remove(tenantId);
+        ArrayList<ListenerRegistration<?>> list = registeredTenants.remove(tenantId);
         if (list != null) {
-            for (ListenerRegistration<DataChangeListener> reg : list) {
-                if (reg != null)
+            for (ListenerRegistration<?> reg : list) {
+                if (reg != null) {
                     reg.close();
+                }
             }
             LOG.debug("Unregistered tenant {}", tenantId);
         }
@@ -788,10 +774,11 @@ public class FaasPolicyManager implements DataChangeListener, AutoCloseable {
         LogicalRouterBuilder builder = new LogicalRouterBuilder();
         builder.setAdminStateUp(true);
         builder.setName(new Text(epg.getId().getValue()));
-        if (epg.getDescription() != null)
+        if (epg.getDescription() != null) {
             builder.setDescription(new Text("gbp-epg: " + epg.getDescription().getValue()));
-        else
+        } else {
             builder.setDescription(new Text("gbp-epg"));
+        }
         builder.setPublic(isPublic);
         builder.setTenantId(tenantId);
         builder.setUuid(new Uuid(UUID.randomUUID().toString()));
@@ -802,10 +789,11 @@ public class FaasPolicyManager implements DataChangeListener, AutoCloseable {
         LogicalSwitchBuilder builder = new LogicalSwitchBuilder();
         builder.setAdminStateUp(true);
         builder.setName(new Text(epg.getId().getValue()));
-        if (epg.getDescription() != null)
+        if (epg.getDescription() != null) {
             builder.setDescription(new Text("gbp-epg: " + epg.getDescription().getValue()));
-        else
+        } else {
             builder.setDescription(new Text("gbp-epg"));
+        }
         builder.setTenantId(tenantId);
         builder.setUuid(new Uuid(UUID.randomUUID().toString()));
         return builder;
index c2afcc9459e2ddf18f626691c1ca77322bb3baf5..0d97b3bb4c884ef40faaf47e56eff2a81086b6e8 100644 (file)
@@ -7,18 +7,19 @@
  */
 package org.opendaylight.groupbasedpolicy.renderer.faas;
 
+import com.google.common.base.Optional;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ScheduledExecutorService;
-
+import java.util.concurrent.Executor;
 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.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.faas.uln.datastore.api.UlnDatastoreApi;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
@@ -35,25 +36,20 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.faas.rev15
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.Subnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.subnet.Gateways;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.subnet.gateways.Prefixes;
-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.annotations.VisibleForTesting;
-import com.google.common.base.Optional;
-
-public class FaasSubnetManagerListener implements DataChangeListener {
+public class FaasSubnetManagerListener implements DataTreeChangeListener<Subnet> {
 
     private static final Logger LOG = LoggerFactory.getLogger(FaasSubnetManagerListener.class);
-    private ConcurrentHashMap<SubnetId, Uuid> mappedSubnets = new ConcurrentHashMap<>();
-    private final ScheduledExecutorService executor;
+    private final ConcurrentHashMap<SubnetId, Uuid> mappedSubnets = new ConcurrentHashMap<>();
+    private final Executor executor;
     private final DataBroker dataProvider;
     private final TenantId gbpTenantId;
     private final Uuid faasTenantId;
 
     public FaasSubnetManagerListener(DataBroker dataProvider, TenantId gbpTenantId, Uuid faasTenantId,
-            ScheduledExecutorService executor) {
+            Executor executor) {
         this.executor = executor;
         this.faasTenantId = faasTenantId;
         this.gbpTenantId = gbpTenantId;
@@ -61,52 +57,35 @@ public class FaasSubnetManagerListener implements DataChangeListener {
     }
 
     @Override
-    public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        executor.execute(new Runnable() {
-
-            public void run() {
-                executeEvent(change);
-            }
-        });
+    public void onDataTreeChanged(Collection<DataTreeModification<Subnet>> changes) {
+        executor.execute(() -> executeEvent(changes));
     }
 
-    @VisibleForTesting
-    void executeEvent(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        // Create
-        for (DataObject dao : change.getCreatedData().values()) {
-            if (dao instanceof Subnet) {
-                Subnet subnet = (Subnet) dao;
-                LOG.debug("Subnet {} is Created.", subnet.getId().getValue());
-                UlnDatastoreApi.submitSubnetToDs(initSubnetBuilder(subnet).build());
-            }
-        }
-        // Update
-        Map<InstanceIdentifier<?>, DataObject> dao = change.getUpdatedData();
-        for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : dao.entrySet()) {
-            if (entry.getValue() instanceof Subnet) {
-                Subnet subnet = (Subnet) entry.getValue();
-                LOG.debug("Subnet {} is Updated.", subnet.getId().getValue());
-                UlnDatastoreApi.submitSubnetToDs(initSubnetBuilder(subnet).build());
-            }
-        }
-        // Remove
-        for (InstanceIdentifier<?> iid : change.getRemovedPaths()) {
-            DataObject old = change.getOriginalData().get(iid);
-            if (old == null) {
-                continue;
-            }
-            if (old instanceof Subnet) {
-                Subnet subnet = (Subnet) old;
-                ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
-                Optional<MappedSubnet> op = DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
-                        FaasIidFactory.mappedSubnetIid(gbpTenantId, subnet.getId()), rwTx);
-                if (op.isPresent()) {
-                    DataStoreHelper.submitToDs(rwTx);
-                }
-                Uuid faasSubnetId = mappedSubnets.remove(subnet.getId());
-                if (faasSubnetId != null) {
-                    UlnDatastoreApi.removeSubnetFromDsIfExists(faasTenantId, faasSubnetId);
-                }
+    private void executeEvent(final Collection<DataTreeModification<Subnet>> changes) {
+        for (DataTreeModification<Subnet> change: changes) {
+            DataObjectModification<Subnet> rootNode = change.getRootNode();
+            switch (rootNode.getModificationType()) {
+                case SUBTREE_MODIFIED:
+                case WRITE:
+                    Subnet updatedSubnet = rootNode.getDataAfter();
+                    LOG.debug("Subnet {} is Updated.", updatedSubnet.getId().getValue());
+                    UlnDatastoreApi.submitSubnetToDs(initSubnetBuilder(updatedSubnet).build());
+                    break;
+                case DELETE:
+                    Subnet deletedSubnet = rootNode.getDataBefore();
+                    ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
+                    Optional<MappedSubnet> op = DataStoreHelper.removeIfExists(LogicalDatastoreType.OPERATIONAL,
+                            FaasIidFactory.mappedSubnetIid(gbpTenantId, deletedSubnet.getId()), rwTx);
+                    if (op.isPresent()) {
+                        DataStoreHelper.submitToDs(rwTx);
+                    }
+                    Uuid faasSubnetId = mappedSubnets.remove(deletedSubnet.getId());
+                    if (faasSubnetId != null) {
+                        UlnDatastoreApi.removeSubnetFromDsIfExists(faasTenantId, faasSubnetId);
+                    }
+                    break;
+                default:
+                    break;
             }
         }
     }
@@ -147,10 +126,11 @@ public class FaasSubnetManagerListener implements DataChangeListener {
         builder.setIpPrefix(IetfModelCodec.ipPrefix2013(gbpSubnet.getIpPrefix()));
         builder.setUuid(getFaasSubnetId(gbpSubnet.getId()));
         builder.setName(new Text(gbpSubnet.getId().getValue()));
-        if (gbpSubnet.getDescription() != null)
+        if (gbpSubnet.getDescription() != null) {
             builder.setDescription(new Text("gbp-subnet: " + gbpSubnet.getDescription().getValue()));
-        else
+        } else {
             builder.setDescription(new Text("gbp-subnet"));
+        }
         builder.setTenantId(faasTenantId);
         builder.setVirtualRouterIp(IetfModelCodec.ipAddress2013(gbpSubnet.getVirtualRouterIp()));
         // TODO DNS servers
@@ -187,5 +167,4 @@ public class FaasSubnetManagerListener implements DataChangeListener {
         }
         return val;
     }
-
 }
index bb6f7408c9cbe10fa44efa25a8276da430bf9794..f2b3bb7d4ed89c8db5b7cfe72f175daeffc96e22 100644 (file)
@@ -7,29 +7,27 @@
  */
 package org.opendaylight.groupbasedpolicy.renderer.faas;
 
-import java.util.concurrent.ScheduledExecutorService;
-
-import com.google.common.annotations.VisibleForTesting;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import java.util.Collection;
+import java.util.concurrent.Executor;
+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.DataTreeModification;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.common.rev151013.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class FaasTenantManagerListener implements DataChangeListener {
+public class FaasTenantManagerListener implements DataTreeChangeListener<Tenant> {
 
     private static final Logger LOG = LoggerFactory.getLogger(FaasTenantManagerListener.class);
-    private final ScheduledExecutorService executor;
+    private final Executor executor;
     private final TenantId gbpTenantId;
     private final Uuid faasTenantId;
     private final FaasPolicyManager policyManager;
 
     public FaasTenantManagerListener(FaasPolicyManager policyManager, TenantId gbpTenantId, Uuid faasTenantId,
-            ScheduledExecutorService executor) {
+            Executor executor) {
         this.executor = executor;
         this.faasTenantId = faasTenantId;
         this.gbpTenantId = gbpTenantId;
@@ -37,30 +35,24 @@ public class FaasTenantManagerListener implements DataChangeListener {
     }
 
     @Override
-    public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        executor.execute(new Runnable() {
-
-            public void run() {
-                executeEvent(change);
-            }
-        });
+    public void onDataTreeChanged(final Collection<DataTreeModification<Tenant>> changes) {
+        executor.execute(() -> executeEvent(changes));
     }
 
-    @VisibleForTesting
-    void executeEvent(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        // Remove
-        for (InstanceIdentifier<?> iid : change.getRemovedPaths()) {
-            DataObject old = change.getOriginalData().get(iid);
-            if (old == null) {
-                continue;
-            }
-            if (old instanceof Tenant) {
-                Tenant tenant = (Tenant) old;
-                if (tenant.getId().equals(gbpTenantId)) {
-                    LOG.info("Removed gbp Tenant {}  -- faas Tenant {}", gbpTenantId.getValue(),
-                            faasTenantId.getValue());
-                    this.policyManager.removeTenantLogicalNetwork(gbpTenantId, faasTenantId);
-                }
+    private void executeEvent(final Collection<DataTreeModification<Tenant>> changes) {
+        for (DataTreeModification<Tenant> change: changes) {
+            DataObjectModification<Tenant> rootNode = change.getRootNode();
+            switch (rootNode.getModificationType()) {
+                case DELETE:
+                    final Tenant tenant = rootNode.getDataBefore();
+                    if (tenant.getId().equals(gbpTenantId)) {
+                        LOG.info("Removed gbp Tenant {}  -- faas Tenant {}", gbpTenantId.getValue(),
+                                faasTenantId.getValue());
+                        this.policyManager.removeTenantLogicalNetwork(gbpTenantId, faasTenantId);
+                    }
+                    break;
+                default:
+                    break;
             }
         }
     }
index 2d4e94460048a4e4bc4eac32fae1119332b2fc33..887b71081f4b47a6e1b997f23a912fd458637fbe 100644 (file)
@@ -14,22 +14,24 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mockito;
 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.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
@@ -37,7 +39,6 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.faas.uln.datastore.api.UlnDatastoreApi;
-import org.opendaylight.groupbasedpolicy.renderer.faas.test.DataChangeListenerTester;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.common.rev151013.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.security.rules.rev151013.security.rule.groups.attributes.security.rule.groups.container.SecurityRuleGroups;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.security.rules.rev151013.security.rule.groups.attributes.security.rule.groups.container.security.rule.groups.SecurityRuleGroup;
@@ -59,8 +60,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.Rule;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.RuleBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstance;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstanceBuilder;
-import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.powermock.api.mockito.PowerMockito;
 import org.powermock.core.classloader.annotations.PrepareForTest;
@@ -73,12 +72,10 @@ public class FaasContractManagerListenerCovrgTest {
     private static final ClauseName CLAUSE_NAME = new ClauseName("clause-1");
     public static final SubjectName SUBJECT_NAME = new SubjectName("subject-name");
     private InstanceIdentifier<Contract> contractIid;
-    private ContractId contractId = new ContractId("contractId");
+    private final ContractId contractId = new ContractId("contractId");
     private FaasContractManagerListener listener;
-    private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
-    private TenantId gbpTenantId = new TenantId("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
-    private Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
-    private DataChangeListenerTester tester;
+    private final TenantId gbpTenantId = new TenantId("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
+    private final Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
     private DataBroker dataProvider;
 
     @SuppressWarnings("unchecked")
@@ -87,9 +84,8 @@ public class FaasContractManagerListenerCovrgTest {
         contractIid = mock(InstanceIdentifier.class);
         dataProvider = mock(DataBroker.class);
 
-        listener = new FaasContractManagerListener(dataProvider, gbpTenantId, faasTenantId, executor);
-        tester = new DataChangeListenerTester(listener);
-        tester.setRemovedPath(contractIid);
+        listener = new FaasContractManagerListener(dataProvider, gbpTenantId, faasTenantId,
+                MoreExecutors.directExecutor());
     }
 
     @SuppressWarnings("unchecked")
@@ -115,8 +111,14 @@ public class FaasContractManagerListenerCovrgTest {
         when(futureMappedContract.checkedGet()).thenReturn(optMappedContract);
 
         Contract contract = new ContractBuilder().setId(contractId).build();
-        tester.setDataObject(contractIid, contract);
-        listener.executeEvent(tester.getChangeMock());
+
+        DataTreeModification<Contract> mockDataTreeModification = mock(DataTreeModification.class);
+        DataObjectModification<Contract> mockModification = mock(DataObjectModification.class);
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(contract).when(mockModification).getDataAfter();
+
+        listener.onDataTreeChanged(Collections.singletonList(mockDataTreeModification));
     }
 
     @Test
index ea345afa18cba1584cb0eb0b46bed4d5766aec26..3049fabc8540c2ac2920a9047bcb1d7d20e22b7c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016 Huawei Technologies 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
@@ -9,24 +9,21 @@ package org.opendaylight.groupbasedpolicy.renderer.faas;
 
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.Collections;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 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.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.faas.uln.datastore.api.UlnDatastoreApi;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.common.rev151013.Uuid;
@@ -41,25 +38,19 @@ import org.powermock.api.mockito.PowerMockito;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
-import com.google.common.util.concurrent.CheckedFuture;
-
 @PrepareForTest(UlnDatastoreApi.class)
 @RunWith(PowerMockRunner.class)
 public class FaasContractManagerListenerTest {
 
     private InstanceIdentifier<DataObject> contractId;
-    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
     private MockFaasContractManagerListener contractManagerListener;
-    private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(Runtime.getRuntime()
-        .availableProcessors());
-    private TenantId gbpTenantId = new TenantId("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
-    private Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
+    private final TenantId gbpTenantId = new TenantId("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
+    private final Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
 
     @SuppressWarnings("unchecked")
     @Before
     public void init() {
         contractId = mock(InstanceIdentifier.class);
-        change = mock(AsyncDataChangeEvent.class);
         contractId = mock(InstanceIdentifier.class);
         DataBroker dataProvider = mock(DataBroker.class);
         PowerMockito.mockStatic(UlnDatastoreApi.class);
@@ -67,13 +58,11 @@ public class FaasContractManagerListenerTest {
         when(dataProvider.newWriteOnlyTransaction()).thenReturn(writeTransaction);
         CheckedFuture<Void, TransactionCommitFailedException> checkedFuture = mock(CheckedFuture.class);
         when(writeTransaction.submit()).thenReturn(checkedFuture);
-        contractManagerListener = new MockFaasContractManagerListener(dataProvider, gbpTenantId, faasTenantId, executor);
-
-        Set<InstanceIdentifier<?>> removedPaths = new HashSet<>();
-        removedPaths.add(contractId);
-        when(change.getRemovedPaths()).thenReturn(removedPaths);
+        contractManagerListener = new MockFaasContractManagerListener(dataProvider, gbpTenantId, faasTenantId,
+                MoreExecutors.directExecutor());
     }
 
+    @SuppressWarnings("unchecked")
     @Test
     public void testOnDataChangeContract() {
         // prepare input test data
@@ -83,30 +72,27 @@ public class FaasContractManagerListenerTest {
         } catch (Exception e) {
             fail("testOnDataChangeContract: Exception = " + e.toString());
         }
+
         Uuid expectedFaasSecId = new Uuid("c4511aac-ae43-11e5-bf7f-feff819cdc9f");
         contractManagerListener.setExpectedFaasSecId(expectedFaasSecId);
-        DataObject testContract = makeTestContract();
-        contractManagerListener.setExpectedContract((Contract) testContract);
-        Map<InstanceIdentifier<?>, DataObject> testData = new HashMap<>();
-        testData.put(contractId, testContract);
-        when(change.getCreatedData()).thenReturn(testData);
-        when(change.getOriginalData()).thenReturn(testData);
-        when(change.getUpdatedData()).thenReturn(testData);
+        Contract testContract = makeTestContract();
+        contractManagerListener.setExpectedContract(testContract);
+
+        DataTreeModification<Contract> mockDataTreeModification = mock(DataTreeModification.class);
+        DataObjectModification<Contract> mockModification = mock(DataObjectModification.class);
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(testContract).when(mockModification).getDataAfter();
+
         // invoke event -- expected data is verified in mocked classes
-        contractManagerListener.onDataChanged(change);
-        // make sure internal threads have completed
-        try {
-            executor.shutdown();
-            executor.awaitTermination(10, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            fail("testOnDataChangeSubnet: Exception = " + e.toString());
-        }
+        contractManagerListener.onDataTreeChanged(Collections.singletonList(mockDataTreeModification));
+
         // Verify passed in values to fabric mapping engine
         assertTrue("testOnDataChangeContract: Actual Faas Security Id is NOT as expected",
                 expectedFaasSecId.equals(captor.getValue().getUuid()));
     }
 
-    private DataObject makeTestContract() {
+    private Contract makeTestContract() {
         ContractBuilder builder = new ContractBuilder();
         builder.setId(new ContractId("b4511aac-ae43-11e5-bf7f-feff819cdc9f"));
         return builder.build();
index 5177668021327337665768137d9682705dc4d88e..55baa50eb1d1fe3517633b265b223d9a080311be 100644 (file)
@@ -11,27 +11,32 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.Collection;
+import java.util.Collections;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
 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.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.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-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.ReadFailedException;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-import org.opendaylight.groupbasedpolicy.renderer.faas.test.DataChangeListenerTester;
+import org.opendaylight.groupbasedpolicy.util.IidFactory;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.faas.endpoint.rev151009.FaasEndpointContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.faas.endpoint.rev151009.FaasEndpointContextBuilder;
@@ -44,14 +49,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3AddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Prefix;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3PrefixBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.faas.rev151009.mapped.tenants.entities.mapped.entity.MappedEndpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.faas.rev151009.mapped.tenants.entities.mapped.entity.MappedEndpointKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.faas.rev151009.mapped.tenants.entities.mapped.entity.MappedSubnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.ResolvedPolicies;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
@@ -60,58 +60,45 @@ public class FaasEndpointManagerListenerCovrgTest {
     private static final L2BridgeDomainId L_2_BRIDGE_DOMAIN_ID = new L2BridgeDomainId("L2BridgeDomainId");
     private static final MacAddress MAC_ADDRESS = new MacAddress("00:00:00:00:35:02");
 
-    private InstanceIdentifier<Endpoint> epIid;
     private FaasEndpointManagerListener listener;
-    private TenantId gbpTenantId = new TenantId("gbpTenantId");
-    private Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
-    private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
-    private DataChangeListenerTester tester;
-    private DataBroker dataProvider;
-    private FaasPolicyManager faasPolicyManager;
+    private final TenantId gbpTenantId = new TenantId("gbpTenantId");
+    private final Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
+    private final DataBroker dataProvider = mock(DataBroker.class);
+    private final FaasPolicyManager faasPolicyManager = mock(FaasPolicyManager.class);
 
     @SuppressWarnings("unchecked")
     @Before
-    public void init() throws ReadFailedException {
-        MappedEndpointKey mappedEndpointKey = new MappedEndpointKey(L_2_BRIDGE_DOMAIN_ID, MAC_ADDRESS);
-
-        dataProvider = mock(DataBroker.class);
-
-        WriteTransaction woTx = mock(WriteTransaction.class);
-        ReadWriteTransaction rwTx = mock(ReadWriteTransaction.class);
-
-        CheckedFuture<Void, TransactionCommitFailedException> futureVoid = mock(CheckedFuture.class);
-        when(woTx.submit()).thenReturn(futureVoid);
-        when(rwTx.submit()).thenReturn(futureVoid);
-        doNothing().when(woTx).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
-                any(DataObject.class));
-
-        CheckedFuture<Optional<MappedEndpoint>, ReadFailedException> futureMappedEndpoint = mock(CheckedFuture.class);
-        Optional<MappedEndpoint> optMappedEndpoint = mock(Optional.class);
-        when(optMappedEndpoint.isPresent()).thenReturn(false);
-        when(futureMappedEndpoint.checkedGet()).thenReturn(optMappedEndpoint);
-        when(rwTx.read(LogicalDatastoreType.OPERATIONAL,
-                FaasIidFactory.mappedEndpointIid(gbpTenantId, mappedEndpointKey))).thenReturn(futureMappedEndpoint);
+    public void init() {
+        doNothing().when(faasPolicyManager).removeTenantLogicalNetwork(gbpTenantId, faasTenantId);
+        doNothing().when(faasPolicyManager).registerTenant(any(TenantId.class), any(EndpointGroupId.class));
 
-        when(dataProvider.newWriteOnlyTransaction()).thenReturn(woTx);
-        when(dataProvider.newReadWriteTransaction()).thenReturn(rwTx);
+        listener = new FaasEndpointManagerListener(faasPolicyManager, dataProvider, MoreExecutors.directExecutor());
 
-        epIid = mock(InstanceIdentifier.class);
-        faasPolicyManager = spy(new FaasPolicyManager(dataProvider, executor));
-        doNothing().when(faasPolicyManager).removeTenantLogicalNetwork(gbpTenantId, faasTenantId);
-        listener = new FaasEndpointManagerListener(faasPolicyManager, dataProvider, executor);
-        tester = new DataChangeListenerTester(listener);
-        tester.setRemovedPath(epIid);
+        doReturn(mock(ListenerRegistration.class)).when(dataProvider).registerDataTreeChangeListener(
+                any(DataTreeIdentifier.class), any(DataTreeChangeListener.class));
     }
 
+    @SuppressWarnings({ "rawtypes", "unchecked" })
     @Test
     public void testOnDataChanged_Endpoint() {
-        Endpoint ep = new EndpointBuilder().setTenant(gbpTenantId)
+        ArgumentCaptor<DataTreeChangeListener> dtclCaptor = ArgumentCaptor.forClass(DataTreeChangeListener.class);
+        verify(dataProvider).registerDataTreeChangeListener(eq(new DataTreeIdentifier<>(
+                LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(Endpoint.class))),
+                dtclCaptor.capture());
+
+        Endpoint endpoint = new EndpointBuilder().setTenant(gbpTenantId)
             .setL2Context(L_2_BRIDGE_DOMAIN_ID)
             .setMacAddress(MAC_ADDRESS)
+            .setL3Address(Collections.emptyList())
+            .setEndpointGroup(new EndpointGroupId("test"))
+            .addAugmentation(FaasEndpointContext.class, new FaasEndpointContextBuilder().setFaasPortRefId(
+                    new Uuid("12345678-ae43-11e5-bf7f-feff819cdc9f")).build())
             .build();
-        tester.setDataObject(epIid, ep);
-        tester.callOnDataChanged();
-        listener.executeEvent(tester.getChangeMock());
+
+        dtclCaptor.getValue().onDataTreeChanged(newMockDataTreeModification(null, endpoint,
+                DataObjectModification.ModificationType.WRITE));
+
+        verify(faasPolicyManager).registerTenant(endpoint.getTenant(), endpoint.getEndpointGroup());
     }
 
     @Test
@@ -250,23 +237,16 @@ public class FaasEndpointManagerListenerCovrgTest {
         assertNull(listener.getFaasSubnetId(ep));
     }
 
-    @Test
-    public void testOnDataChanged_EndpointL3() {
-        EndpointL3 ep = new EndpointL3Builder().setTenant(gbpTenantId)
-            .setL2Context(L_2_BRIDGE_DOMAIN_ID)
-            .setMacAddress(MAC_ADDRESS)
-            .build();
-        tester.setDataObject(epIid, ep);
-        tester.callOnDataChanged();
-        listener.executeEvent(tester.getChangeMock());
-    }
-
-    @Test
-    public void testOnDataChanged_EndpointL3Prefix() {
-        EndpointL3Prefix ep = new EndpointL3PrefixBuilder().setTenant(gbpTenantId).build();
-        tester.setDataObject(epIid, ep);
-        tester.callOnDataChanged();
-        listener.executeEvent(tester.getChangeMock());
+    @SuppressWarnings("unchecked")
+    private static <T extends DataObject> Collection<DataTreeModification<T>> newMockDataTreeModification(T dataBefore,
+            T dataAfter, DataObjectModification.ModificationType type) {
+        DataTreeModification<T> mockDataTreeModification = mock(DataTreeModification.class);
+        DataObjectModification<T> mockModification = mock(DataObjectModification.class);
+        doReturn(type).when(mockModification).getModificationType();
+        doReturn(dataBefore).when(mockModification).getDataBefore();
+        doReturn(dataAfter).when(mockModification).getDataAfter();
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+
+        return Collections.singletonList(mockDataTreeModification);
     }
-
 }
index 1010f6c4c237a8bd7bd8b6653ad780de2d7fa81d..c3edecce90bcc3e7429e91e5920f6e805d245374 100644 (file)
@@ -1,30 +1,37 @@
 /*
  * Copyright (c) 2016 Huawei Technologies 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.groupbasedpolicy.renderer.faas;
 
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.MoreExecutors;
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
+import java.util.Collections;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
-
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
 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.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.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.groupbasedpolicy.util.IidFactory;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.faas.endpoint.rev151009.FaasEndpointContext;
@@ -39,57 +46,64 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3AddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroupBuilder;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-import com.google.common.util.concurrent.CheckedFuture;
-
 public class FaasEndpointManagerListenerTest {
 
     private InstanceIdentifier<DataObject> endpointId;
-    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
     private MockFaasEndpointManagerListener endpointManagerListener;
     private MockFaasPolicyManager policyManager;
-    private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(Runtime.getRuntime()
-        .availableProcessors());
+    private final DataBroker dataProvider = mock(DataBroker.class);
 
     @SuppressWarnings("unchecked")
     @Before
     public void init() {
         endpointId = mock(InstanceIdentifier.class);
-        change = mock(AsyncDataChangeEvent.class);
         endpointId = mock(InstanceIdentifier.class);
-        DataBroker dataProvider = mock(DataBroker.class);
 
         WriteTransaction writeTransaction = mock(WriteTransaction.class);
         when(dataProvider.newWriteOnlyTransaction()).thenReturn(writeTransaction);
         CheckedFuture<Void, TransactionCommitFailedException> checkedFuture = mock(CheckedFuture.class);
         when(writeTransaction.submit()).thenReturn(checkedFuture);
-        policyManager = new MockFaasPolicyManager(dataProvider, executor);
-        endpointManagerListener = new MockFaasEndpointManagerListener(policyManager, dataProvider, executor);
-        Set<InstanceIdentifier<?>> removedPaths = new HashSet<>();
-        removedPaths.add(endpointId);
-        when(change.getRemovedPaths()).thenReturn(removedPaths);
+        policyManager = new MockFaasPolicyManager(dataProvider, mock(ScheduledExecutorService.class));
+        endpointManagerListener = new MockFaasEndpointManagerListener(policyManager, dataProvider,
+                MoreExecutors.directExecutor());
+
+        doReturn(mock(ListenerRegistration.class)).when(dataProvider).registerDataTreeChangeListener(
+                any(DataTreeIdentifier.class), any(DataTreeChangeListener.class));
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Test
     public void testOnDataChangeEndpoint() {
         // prepare input test data
-        DataObject testEndpoint = makeTestEndpoint();
-        endpointManagerListener.setExpectedEndpoint((Endpoint) testEndpoint);
-        Map<InstanceIdentifier<?>, DataObject> testData = new HashMap<>();
-        testData.put(endpointId, testEndpoint);
-        when(change.getCreatedData()).thenReturn(testData);
-        when(change.getOriginalData()).thenReturn(testData);
-        when(change.getUpdatedData()).thenReturn(testData);
+        Endpoint testEndpoint = makeTestEndpoint();
+        policyManager.storeTestEpg(new EndpointGroupBuilder().setId(testEndpoint.getEndpointGroup()).build());
+        endpointManagerListener.setExpectedEndpoint(testEndpoint);
+
+        ArgumentCaptor<DataTreeChangeListener> dtclCaptor = ArgumentCaptor.forClass(DataTreeChangeListener.class);
+        verify(dataProvider).registerDataTreeChangeListener(eq(new DataTreeIdentifier<>(
+                LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(Endpoint.class))),
+                dtclCaptor.capture());
+
+        DataTreeModification<Endpoint> mockDataTreeModification = mock(DataTreeModification.class);
+        DataObjectModification<Endpoint> mockModification = mock(DataObjectModification.class);
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(testEndpoint).when(mockModification).getDataAfter();
+
         // invoke event -- expected data is verified in mocked classes
-        endpointManagerListener.onDataChanged(change);
+
+        dtclCaptor.getValue().onDataTreeChanged(Collections.singletonList(mockDataTreeModification));
     }
 
-    private DataObject makeTestEndpoint() {
+    private Endpoint makeTestEndpoint() {
         EndpointBuilder builder = new EndpointBuilder();
         builder.setL2Context(new L2BridgeDomainId("L2Context"));
-        List<L3Address> l3Addrs = new ArrayList<L3Address>();
+        List<L3Address> l3Addrs = new ArrayList<>();
         L3AddressBuilder addb = new L3AddressBuilder();
         addb.setIpAddress(new IpAddress(new String("10.0.0.2").toCharArray()));
         addb.setL3Context(new L3ContextId("L3Context"));
index 4254dfcc93fb8ca5e0d1efe2e2fc0fd9c62a3e9e..b5179f45fc11a44cbf93f75ddb0b72e6a4241638 100644 (file)
@@ -17,24 +17,20 @@ import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-
 import com.google.common.base.Optional;
 import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Executor;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
@@ -87,29 +83,26 @@ import org.powermock.modules.junit4.PowerMockRunner;
 public class FaasPolicyManagerCovrgTest {
 
     private InstanceIdentifier<DataObject> policyId;
-    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
     DataBroker dataProvider;
-    private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(Runtime.getRuntime()
-            .availableProcessors());
-    private EndpointGroupId consumerEpgId = new EndpointGroupId("consumerEpgId");
-    private SubnetId consumerSubnet = new SubnetId("consumerSubnet");
-    private SubnetId providerSubnet = new SubnetId("providerSubnet");
-    private EndpointGroupId providerEpgId = new EndpointGroupId("providerEpgId");
-    private ContractId contractId = new ContractId("contractId");
-    private TenantId tenantId = new TenantId("tenantId");
-    private Uuid faasTenantId = new Uuid("0eb98cf5-086c-4a81-8a4e-0c3b4566108b");
-    private Uuid faasSecRulesId = new Uuid("1eb98cf5-086c-4a81-8a4e-0c3b4566108b");
-    private L3ContextId l3Context = new L3ContextId("l3ContextId");
-    private EndpointGroupId epgId = new EndpointGroupId("epgId");
-    private SubnetId subnetId = new SubnetId("subnetId");
-    private Uuid dummyUuid1 = new Uuid("2eb98cf5-086c-4a81-8a4e-0c3b4566108b");
-    private Uuid dummyUuid2 = new Uuid("3eb98cf5-086c-4a81-8a4e-0c3b4566108b");
+    private final Executor executor = MoreExecutors.directExecutor();
+    private final EndpointGroupId consumerEpgId = new EndpointGroupId("consumerEpgId");
+    private final SubnetId consumerSubnet = new SubnetId("consumerSubnet");
+    private final SubnetId providerSubnet = new SubnetId("providerSubnet");
+    private final EndpointGroupId providerEpgId = new EndpointGroupId("providerEpgId");
+    private final ContractId contractId = new ContractId("contractId");
+    private final TenantId tenantId = new TenantId("tenantId");
+    private final Uuid faasTenantId = new Uuid("0eb98cf5-086c-4a81-8a4e-0c3b4566108b");
+    private final Uuid faasSecRulesId = new Uuid("1eb98cf5-086c-4a81-8a4e-0c3b4566108b");
+    private final L3ContextId l3Context = new L3ContextId("l3ContextId");
+    private final EndpointGroupId epgId = new EndpointGroupId("epgId");
+    private final SubnetId subnetId = new SubnetId("subnetId");
+    private final Uuid dummyUuid1 = new Uuid("2eb98cf5-086c-4a81-8a4e-0c3b4566108b");
+    private final Uuid dummyUuid2 = new Uuid("3eb98cf5-086c-4a81-8a4e-0c3b4566108b");
 
     @SuppressWarnings("unchecked")
     @Before
     public void init() throws Exception {
         policyId = mock(InstanceIdentifier.class);
-        change = mock(AsyncDataChangeEvent.class);
         policyId = mock(InstanceIdentifier.class);
         dataProvider = mock(DataBroker.class);
 
@@ -118,20 +111,14 @@ public class FaasPolicyManagerCovrgTest {
         CheckedFuture<Void, TransactionCommitFailedException> futureVoid =
                 mock(CheckedFuture.class);
         when(writeTransaction.submit()).thenReturn(futureVoid);
-
-        Set<InstanceIdentifier<?>> removedPaths = new HashSet<>();
-        removedPaths.add(policyId);
-        when(change.getRemovedPaths()).thenReturn(removedPaths);
     }
 
     @Test
     public void testConstructor() throws Exception {
         FaasPolicyManager other = new MockFaasPolicyManager(dataProvider, executor);
 
-        verify(dataProvider).registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
-                InstanceIdentifier.builder(ResolvedPolicies.class)
-                        .child(ResolvedPolicy.class)
-                        .build(), other, AsyncDataBroker.DataChangeScope.SUBTREE);
+        verify(dataProvider).registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.builder(ResolvedPolicies.class).child(ResolvedPolicy.class).build()), other);
         other.close();
     }
 
index 77f0869240605e66c50fb88aecaa192f2f835dae..5067535447dc5450e86e84c2c4c82e40afb8ae81 100644 (file)
@@ -8,28 +8,22 @@
 package org.opendaylight.groupbasedpolicy.renderer.faas;
 
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.MoreExecutors;
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
+import java.util.Collections;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
 import org.junit.Before;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 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.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-import org.opendaylight.faas.uln.datastore.api.UlnDatastoreApi;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.common.rev151013.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
@@ -58,19 +52,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.p
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroupBuilder;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-
-import com.google.common.util.concurrent.CheckedFuture;
 
 public class FaasPolicyManagerTest {
 
     private InstanceIdentifier<DataObject> policyId;
-    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
     DataBroker dataProvider;
-    private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(Runtime.getRuntime()
-        .availableProcessors());
     EndpointGroupId consumerEpgId = new EndpointGroupId("consumerEpgId");
     SubnetId consumerSubnet = new SubnetId("consumerSubnet");
     SubnetId providerSubnet = new SubnetId("providerSubnet");
@@ -85,24 +71,19 @@ public class FaasPolicyManagerTest {
     @Before
     public void init() {
         policyId = mock(InstanceIdentifier.class);
-        change = mock(AsyncDataChangeEvent.class);
         policyId = mock(InstanceIdentifier.class);
         dataProvider = mock(DataBroker.class);
         WriteTransaction writeTransaction = mock(WriteTransaction.class);
         when(dataProvider.newWriteOnlyTransaction()).thenReturn(writeTransaction);
         CheckedFuture<Void, TransactionCommitFailedException> checkedFuture = mock(CheckedFuture.class);
         when(writeTransaction.submit()).thenReturn(checkedFuture);
-
-        Set<InstanceIdentifier<?>> removedPaths = new HashSet<>();
-        removedPaths.add(policyId);
-        when(change.getRemovedPaths()).thenReturn(removedPaths);
     }
 
     @SuppressWarnings("resource")
     @Test
     public void testLayer2ResolvedPolicyWithImpExternalEpg() {
         // prepare input test data
-        MockFaasPolicyManager policyManager = new MockFaasPolicyManager(dataProvider, executor);
+        MockFaasPolicyManager policyManager = new MockFaasPolicyManager(dataProvider, MoreExecutors.directExecutor());
 
         // mock input test policy
         policyManager.storeTestEpg(makeTestEndpointGroup(consumerEpgId));
@@ -127,21 +108,15 @@ public class FaasPolicyManagerTest {
 
         // input test resolved policy
         DataObject testPolicy = makeTestResolvedPolicyWithImpExternalEpg();
-        Map<InstanceIdentifier<?>, DataObject> testData = new HashMap<>();
-        testData.put(policyId, testPolicy);
-        when(change.getCreatedData()).thenReturn(testData);
-        when(change.getOriginalData()).thenReturn(testData);
-        when(change.getUpdatedData()).thenReturn(testData);
-        // invoke event -- expected data is verified in mocked classes
-        policyManager.onDataChanged(change);
 
-        // make sure internal threads have completed
-        try {
-            executor.shutdown();
-            executor.awaitTermination(10, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            fail("FaasPolicyManagerTest: Exception = " + e.toString());
-        }
+        DataTreeModification<ResolvedPolicy> mockDataTreeModification = mock(DataTreeModification.class);
+        DataObjectModification<ResolvedPolicy> mockModification = mock(DataObjectModification.class);
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(testPolicy).when(mockModification).getDataAfter();
+
+        // invoke event -- expected data is verified in mocked classes
+        policyManager.onDataTreeChanged(Collections.singletonList(mockDataTreeModification));
 
         // verify
         assertTrue("FaasPolicyManagerTest", policyManager.getComLayer().equals(ServiceCommunicationLayer.Layer2));
@@ -152,7 +127,7 @@ public class FaasPolicyManagerTest {
     @Test
     public void testLayer3ResolvedPolicy() {
         // prepare input test data
-        MockFaasPolicyManager policyManager = new MockFaasPolicyManager(dataProvider, executor);
+        MockFaasPolicyManager policyManager = new MockFaasPolicyManager(dataProvider, MoreExecutors.directExecutor());
 
         // mock input test policy
         policyManager.storeTestL3Contextes(makeTestL3Context());
@@ -180,21 +155,15 @@ public class FaasPolicyManagerTest {
 
         // input test resolved policy
         DataObject testPolicy = makeTestResolvedPolicy();
-        Map<InstanceIdentifier<?>, DataObject> testData = new HashMap<>();
-        testData.put(policyId, testPolicy);
-        when(change.getCreatedData()).thenReturn(testData);
-        when(change.getOriginalData()).thenReturn(testData);
-        when(change.getUpdatedData()).thenReturn(testData);
-        // invoke event -- expected data is verified in mocked classes
-        policyManager.onDataChanged(change);
 
-        // make sure internal threads have completed
-        try {
-            executor.shutdown();
-            executor.awaitTermination(10, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            fail("FaasPolicyManagerTest: Exception = " + e.toString());
-        }
+        DataTreeModification<ResolvedPolicy> mockDataTreeModification = mock(DataTreeModification.class);
+        DataObjectModification<ResolvedPolicy> mockModification = mock(DataObjectModification.class);
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(testPolicy).when(mockModification).getDataAfter();
+
+        // invoke event -- expected data is verified in mocked classes
+        policyManager.onDataTreeChanged(Collections.singletonList(mockDataTreeModification));
 
         // verify
         assertTrue("FaasPolicyManagerTest", policyManager.getComLayer().equals(ServiceCommunicationLayer.Layer3));
index 0f3f05269264932590ee0923f3cc20c1213d913b..23e78bd70a0b80dec3179f9b5f5d18dc7c217722 100644 (file)
@@ -9,16 +9,20 @@ package org.opendaylight.groupbasedpolicy.renderer.faas;
 
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import com.google.common.util.concurrent.CheckedFuture;
 import org.junit.Test;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+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.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.groupbasedpolicy.api.EpRendererAugmentationRegistry;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
@@ -28,6 +32,9 @@ public class FaasRendererCovrgTest {
     @Test
     public void testConstructor() throws Exception {
         DataBroker dataProvider = mock(DataBroker.class);
+        doReturn(mock(ListenerRegistration.class)).when(dataProvider).registerDataTreeChangeListener(
+                any(DataTreeIdentifier.class), any(DataTreeChangeListener.class));
+
         EpRendererAugmentationRegistry epRendererAugmentationRegistry = mock(EpRendererAugmentationRegistry.class);
 
         WriteTransaction wTx = mock(WriteTransaction.class);
index 755b10d6f93a14ad30b985011adaf0d9306384ec..ca9e9cb6159ef8a4d58029e91c7e1e8ee67dc94d 100644 (file)
@@ -10,27 +10,28 @@ package org.opendaylight.groupbasedpolicy.renderer.faas;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-
 import com.google.common.base.Optional;
 import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 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.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 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.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.faas.uln.datastore.api.UlnDatastoreApi;
-import org.opendaylight.groupbasedpolicy.renderer.faas.test.DataChangeListenerTester;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
@@ -58,12 +59,10 @@ public class FaasSubnetManagerListenerCovrgTest {
 
     private InstanceIdentifier<Subnet> subnetIid;
     private FaasSubnetManagerListener listener;
-    private TenantId gbpTenantId = new TenantId("gbpTenantId");
-    private SubnetId subnetId = new SubnetId("subnetId");
-    private Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
-    private Uuid faasSubnetId = new Uuid("c4511aac-ae43-11e5-bf7f-feff819cdc9f");
-    private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
-    private DataChangeListenerTester tester;
+    private final TenantId gbpTenantId = new TenantId("gbpTenantId");
+    private final SubnetId subnetId = new SubnetId("subnetId");
+    private final Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
+    private final Uuid faasSubnetId = new Uuid("c4511aac-ae43-11e5-bf7f-feff819cdc9f");
     private DataBroker dataProvider;
 
     @SuppressWarnings("unchecked")
@@ -71,9 +70,8 @@ public class FaasSubnetManagerListenerCovrgTest {
     public void init() {
         dataProvider = mock(DataBroker.class);
         subnetIid = mock(InstanceIdentifier.class);
-        listener = new FaasSubnetManagerListener(dataProvider, gbpTenantId, faasTenantId, executor);
-        tester = new DataChangeListenerTester(listener);
-        tester.setRemovedPath(subnetIid);
+        listener = new FaasSubnetManagerListener(dataProvider, gbpTenantId, faasTenantId,
+                MoreExecutors.directExecutor());
     }
 
     @SuppressWarnings("unchecked")
@@ -105,9 +103,14 @@ public class FaasSubnetManagerListenerCovrgTest {
         when(dataProvider.newWriteOnlyTransaction()).thenReturn(woTx);
 
         Subnet subnet = new SubnetBuilder().setId(subnetId).build();
-        tester.setDataObject(subnetIid, subnet);
-        tester.callOnDataChanged();
-        listener.executeEvent(tester.getChangeMock());
+
+        DataTreeModification<Subnet> mockDataTreeModification = mock(DataTreeModification.class);
+        DataObjectModification<Subnet> mockModification = mock(DataObjectModification.class);
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(subnet).when(mockModification).getDataAfter();
+
+        listener.onDataTreeChanged(Collections.singletonList(mockDataTreeModification));
     }
 
     @Test
index cd82d2ad6896de03d91c75a321b0bd155b0d0ecf..25c17cda085c536f46ee1e26664e47ae28f3aa4d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016 Huawei Technologies 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
@@ -9,30 +9,27 @@ package org.opendaylight.groupbasedpolicy.renderer.faas;
 
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.Collections;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 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.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.faas.uln.datastore.api.UlnDatastoreApi;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.common.rev151013.Uuid;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.subnets.rev151013.subnets.container.subnets.Subnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubnetId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.Subnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.SubnetBuilder;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -40,25 +37,19 @@ import org.powermock.api.mockito.PowerMockito;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
-import com.google.common.util.concurrent.CheckedFuture;
-
 @PrepareForTest(UlnDatastoreApi.class)
 @RunWith(PowerMockRunner.class)
 public class FaasSubnetManagerListenerTest {
 
     private InstanceIdentifier<DataObject> subnetId;
-    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
     private MockFaasSubnetManagerListener subnetManagerListener;
-    private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(Runtime.getRuntime()
-        .availableProcessors());
-    private TenantId gbpTenantId = new TenantId("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
-    private Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
+    private final TenantId gbpTenantId = new TenantId("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
+    private final Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
 
     @SuppressWarnings("unchecked")
     @Before
     public void init() {
         subnetId = mock(InstanceIdentifier.class);
-        change = mock(AsyncDataChangeEvent.class);
         subnetId = mock(InstanceIdentifier.class);
         DataBroker dataProvider = mock(DataBroker.class);
         PowerMockito.mockStatic(UlnDatastoreApi.class);
@@ -66,17 +57,16 @@ public class FaasSubnetManagerListenerTest {
         when(dataProvider.newWriteOnlyTransaction()).thenReturn(writeTransaction);
         CheckedFuture<Void, TransactionCommitFailedException> checkedFuture = mock(CheckedFuture.class);
         when(writeTransaction.submit()).thenReturn(checkedFuture);
-        subnetManagerListener = new MockFaasSubnetManagerListener(dataProvider, gbpTenantId, faasTenantId, executor);
-
-        Set<InstanceIdentifier<?>> removedPaths = new HashSet<>();
-        removedPaths.add(subnetId);
-        when(change.getRemovedPaths()).thenReturn(removedPaths);
+        subnetManagerListener = new MockFaasSubnetManagerListener(dataProvider, gbpTenantId, faasTenantId,
+                MoreExecutors.directExecutor());
     }
 
+    @SuppressWarnings("unchecked")
     @Test
     public void testOnDataChangeSubnet() {
         // prepare input test data
-        ArgumentCaptor<Subnet> captor = ArgumentCaptor.forClass(Subnet.class);
+        ArgumentCaptor<org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.subnets.rev151013.subnets.container.subnets.Subnet> captor = ArgumentCaptor.forClass(
+                org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.subnets.rev151013.subnets.container.subnets.Subnet.class);
         try {
             PowerMockito.doNothing().when(UlnDatastoreApi.class, "submitSubnetToDs", captor.capture());
         } catch (Exception e) {
@@ -84,29 +74,24 @@ public class FaasSubnetManagerListenerTest {
         }
         Uuid expectedFaasSubnetId = new Uuid("c4511aac-ae43-11e5-bf7f-feff819cdc9f");
         subnetManagerListener.setExpectedFaasSubnetId(expectedFaasSubnetId);
-        DataObject testSubnet = makeTestSubnet();
+        Subnet testSubnet = makeTestSubnet();
         subnetManagerListener.setExpectedGbpSubnet(testSubnet);
-        Map<InstanceIdentifier<?>, DataObject> testData = new HashMap<>();
-        testData.put(subnetId, testSubnet);
-        when(change.getCreatedData()).thenReturn(testData);
-        when(change.getOriginalData()).thenReturn(testData);
-        when(change.getUpdatedData()).thenReturn(testData);
+
+        DataTreeModification<Subnet> mockDataTreeModification = mock(DataTreeModification.class);
+        DataObjectModification<Subnet> mockModification = mock(DataObjectModification.class);
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(testSubnet).when(mockModification).getDataAfter();
+
         // invoke event -- expected data is verified in mocked classes
-        subnetManagerListener.onDataChanged(change);
+        subnetManagerListener.onDataTreeChanged(Collections.singletonList(mockDataTreeModification));
 
-        // make sure internal threads have completed
-        try {
-            executor.shutdown();
-            executor.awaitTermination(10, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            fail("testOnDataChangeSubnet: Exception = " + e.toString());
-        }
         // Verify passed in values to fabric mapping engine
         assertTrue("testOnDataChangeSubnet: Actual Faas SubnetId is NOT as expected",
                 expectedFaasSubnetId.equals(captor.getValue().getUuid()));
     }
 
-    private DataObject makeTestSubnet() {
+    private Subnet makeTestSubnet() {
         SubnetBuilder builder = new SubnetBuilder();
         builder.setId(new SubnetId("b4511aac-ae43-11e5-bf7f-feff819cdc9f"));
         return builder.build();
index 020c700b8426f14b351e80fd334c5dc8eaefc026..2219c7e4d6ec7247d3cb4cc0cd670249f5761803 100644 (file)
@@ -7,67 +7,51 @@
  */
 package org.opendaylight.groupbasedpolicy.renderer.faas;
 
-import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.verify;
 
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-
-import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.Collections;
 import org.junit.Before;
 import org.junit.Test;
-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.groupbasedpolicy.renderer.faas.test.DataChangeListenerTester;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.common.rev151013.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class FaasTenantManagerListenerCovrgTest {
 
-    private InstanceIdentifier<Tenant> tenantIid;
-    private FaasPolicyManager faasPolicyManager;
+    private final FaasPolicyManager faasPolicyManager = mock(FaasPolicyManager.class);
     private FaasTenantManagerListener listener;
-    private TenantId gbpTenantId = new TenantId("gbpTenantId");
-    private Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
-    private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
-    private DataChangeListenerTester tester;
-    private DataBroker dataProvider;
+    private final TenantId gbpTenantId = new TenantId("gbpTenantId");
+    private final Uuid faasTenantId = new Uuid("b4511aac-ae43-11e5-bf7f-feff819cdc9f");
 
-    @SuppressWarnings("unchecked")
     @Before
     public void init() {
-        dataProvider = mock(DataBroker.class);
-        WriteTransaction wTx = mock(WriteTransaction.class);
-        CheckedFuture<Void, TransactionCommitFailedException> futureVoid = mock(CheckedFuture.class);
-        when(wTx.submit()).thenReturn(futureVoid);
-        doNothing().when(wTx).put(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
-                any(DataObject.class));
-        when(dataProvider.newWriteOnlyTransaction()).thenReturn(wTx);
-
-        tenantIid = mock(InstanceIdentifier.class);
-        faasPolicyManager = spy(new FaasPolicyManager(dataProvider, executor));
         doNothing().when(faasPolicyManager).removeTenantLogicalNetwork(gbpTenantId, faasTenantId);
-        listener = new FaasTenantManagerListener(faasPolicyManager, gbpTenantId, faasTenantId, executor);
-        tester = new DataChangeListenerTester(listener);
-        tester.setRemovedPath(tenantIid);
+        listener = new FaasTenantManagerListener(faasPolicyManager, gbpTenantId, faasTenantId,
+                MoreExecutors.directExecutor());
 
     }
 
+    @SuppressWarnings("unchecked")
     @Test
-    public void testOnDataChanged() {
+    public void testOnDataTreeChanged() {
         Tenant tenant = new TenantBuilder().setId(gbpTenantId).build();
-        tester.setDataObject(tenantIid, tenant);
-        tester.callOnDataChanged();
-        listener.executeEvent(tester.getChangeMock());
+
+        DataTreeModification<Tenant> mockDataTreeModification = mock(DataTreeModification.class);
+        DataObjectModification<Tenant> mockModification = mock(DataObjectModification.class);
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+        doReturn(DataObjectModification.ModificationType.DELETE).when(mockModification).getModificationType();
+        doReturn(tenant).when(mockModification).getDataBefore();
+
+        listener.onDataTreeChanged(Collections.singletonList(mockDataTreeModification));
+
+        verify(faasPolicyManager).removeTenantLogicalNetwork(gbpTenantId, faasTenantId);
     }
 
 }
index 66dbe7dbf367e0aed1caa249d572ce7f74cceb4c..ebae293008b764e3d263740f3921896655131f61 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016 Huawei Technologies 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
@@ -9,8 +9,7 @@ package org.opendaylight.groupbasedpolicy.renderer.faas;
 
 import static org.junit.Assert.assertTrue;
 
-import java.util.concurrent.ScheduledExecutorService;
-
+import java.util.concurrent.Executor;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.common.rev151013.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.security.rules.rev151013.security.rule.groups.attributes.security.rule.groups.container.SecurityRuleGroupsBuilder;
@@ -23,7 +22,7 @@ public class MockFaasContractManagerListener extends FaasContractManagerListener
     private Uuid expectedFaasSecId;
 
     public MockFaasContractManagerListener(DataBroker dataProvider, TenantId gbpTenantId, Uuid faasTenantId,
-            ScheduledExecutorService executor) {
+            Executor executor) {
         super(dataProvider, gbpTenantId, faasTenantId, executor);
     }
 
@@ -32,8 +31,9 @@ public class MockFaasContractManagerListener extends FaasContractManagerListener
     // *******************************************************
     @Override
     protected SecurityRuleGroupsBuilder initSecurityGroupBuilder(Contract contract) {
-        if (expectedContract != null)
+        if (expectedContract != null) {
             assertTrue("FaasContractManagerListener.initSecurityGroupBuilder", expectedContract.equals(contract));
+        }
         SecurityRuleGroupsBuilder sec = new SecurityRuleGroupsBuilder();
         sec.setUuid(expectedFaasSecId);
         return sec;
index 5025628c4367345d9b69caac6271cb7292f62158..7abd24f88638a272fa2155f8c8eef813fd1217fc 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016 Huawei Technologies 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
@@ -9,8 +9,7 @@ package org.opendaylight.groupbasedpolicy.renderer.faas;
 
 import static org.junit.Assert.assertTrue;
 
-import java.util.concurrent.ScheduledExecutorService;
-
+import java.util.concurrent.Executor;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
 
@@ -19,7 +18,7 @@ public class MockFaasEndpointManagerListener extends FaasEndpointManagerListener
     private Endpoint expectedEndpoint;
 
     public MockFaasEndpointManagerListener(FaasPolicyManager policyManager, DataBroker dataProvider,
-            ScheduledExecutorService executor) {
+            Executor executor) {
         super(policyManager, dataProvider, executor);
     }
 
@@ -28,8 +27,9 @@ public class MockFaasEndpointManagerListener extends FaasEndpointManagerListener
     // *******************************************************
     @Override
     protected void processEndpoint(Endpoint endpoint) {
-        if (expectedEndpoint != null)
+        if (expectedEndpoint != null) {
             assertTrue("FaasEndpointManagerListener.processEndpoint", expectedEndpoint.equals(endpoint));
+        }
     }
 
     // *******************************************************
index 5c8138f85fbd12a5b74c46ab993b03d6860ab3cb..628d31f5e39a926f92f48ab388635c580ccc1691 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016 Huawei Technologies 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
@@ -13,10 +13,8 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ScheduledExecutorService;
-
+import java.util.concurrent.Executor;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.faas.uln.datastore.api.Pair;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.common.rev151013.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
@@ -37,17 +35,17 @@ import org.opendaylight.yangtools.concepts.ListenerRegistration;
 
 public class MockFaasPolicyManager extends FaasPolicyManager {
 
-    private Map<EndpointGroupId, EndpointGroup> testEndpointGroups = new HashMap<>();
-    private Map<SubnetId, Subnet> testSubnets = new HashMap<>();
-    private Map<L2FloodDomainId, L2FloodDomain> testL2FloodDomains = new HashMap<>();
-    private Map<L2BridgeDomainId, L2BridgeDomain> testL2BridgeDomains = new HashMap<>();
-    private Map<L3ContextId, L3Context> testL3Contextes = new HashMap<>();
-    private Map<ContractId, Uuid> testSecIdPerContract = new HashMap<>();
-    private Map<TenantId, Uuid> testFaasTenantId = new HashMap<>();
+    private final Map<EndpointGroupId, EndpointGroup> testEndpointGroups = new HashMap<>();
+    private final Map<SubnetId, Subnet> testSubnets = new HashMap<>();
+    private final Map<L2FloodDomainId, L2FloodDomain> testL2FloodDomains = new HashMap<>();
+    private final Map<L2BridgeDomainId, L2BridgeDomain> testL2BridgeDomains = new HashMap<>();
+    private final Map<L3ContextId, L3Context> testL3Contextes = new HashMap<>();
+    private final Map<ContractId, Uuid> testSecIdPerContract = new HashMap<>();
+    private final Map<TenantId, Uuid> testFaasTenantId = new HashMap<>();
     private ServiceCommunicationLayer comLayer;
     private ExternalImplicitGroup externalImplicitGroup;
 
-    public MockFaasPolicyManager(DataBroker dataBroker, ScheduledExecutorService executor) {
+    public MockFaasPolicyManager(DataBroker dataBroker, Executor executor) {
         super(dataBroker, executor);
     }
 
@@ -62,7 +60,7 @@ public class MockFaasPolicyManager extends FaasPolicyManager {
         assertTrue("FaasPolicyManager.registerTenant: testEndpointGroups.containsKey(epgId)",
                 testEndpointGroups.containsKey(epgId));
 
-        registeredTenants.putIfAbsent(tenantId, new ArrayList<ListenerRegistration<DataChangeListener>>());
+        registeredTenants.putIfAbsent(tenantId, new ArrayList<ListenerRegistration<?>>());
     }
 
     @Override
index 7a4831329a2dc09ae753537691a1391521bcc440..ab0abcbad70dcf212c5a8e59183114312eff3fd0 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016 Huawei Technologies 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
@@ -9,8 +9,7 @@ package org.opendaylight.groupbasedpolicy.renderer.faas;
 
 import static org.junit.Assert.assertTrue;
 
-import java.util.concurrent.ScheduledExecutorService;
-
+import java.util.concurrent.Executor;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.common.rev151013.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.subnets.rev151013.subnets.container.subnets.SubnetBuilder;
@@ -24,7 +23,7 @@ public class MockFaasSubnetManagerListener extends FaasSubnetManagerListener {
     private Uuid expectedFaasSubnetId;
 
     public MockFaasSubnetManagerListener(DataBroker dataProvider, TenantId gbpTenantId, Uuid faasTenantId,
-            ScheduledExecutorService executor) {
+            Executor executor) {
         super(dataProvider, gbpTenantId, faasTenantId, executor);
     }
 
@@ -33,8 +32,9 @@ public class MockFaasSubnetManagerListener extends FaasSubnetManagerListener {
     // *******************************************************
     @Override
     protected SubnetBuilder initSubnetBuilder(Subnet subnet) {
-        if (expectedGbpSubnet != null)
+        if (expectedGbpSubnet != null) {
             assertTrue("FaasSubnetManagerListener.initSubnetBuilder", expectedGbpSubnet.equals(subnet));
+        }
         SubnetBuilder builder = new SubnetBuilder();
         builder.setUuid(expectedFaasSubnetId);
         return builder;
diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/test/DataChangeListenerTester.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/test/DataChangeListenerTester.java
deleted file mode 100644 (file)
index 5961d13..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.groupbasedpolicy.renderer.faas.test;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-public class DataChangeListenerTester {
-
-    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changeMock;
-    private DataChangeListener listener;
-
-    private Map<InstanceIdentifier<?>, DataObject> testData;
-    private Set<InstanceIdentifier<?>> removedPaths;
-
-    @SuppressWarnings("unchecked")
-    public DataChangeListenerTester(DataChangeListener listener) {
-        changeMock = mock(AsyncDataChangeEvent.class);
-        testData = new HashMap<>();
-        removedPaths = new HashSet<>();
-
-        this.listener = listener;
-
-        when(changeMock.getCreatedData()).thenReturn(testData);
-        when(changeMock.getOriginalData()).thenReturn(testData);
-        when(changeMock.getUpdatedData()).thenReturn(testData);
-        when(changeMock.getRemovedPaths()).thenReturn(removedPaths);
-    }
-
-    public AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> getChangeMock() {
-        return changeMock;
-    }
-
-    public DataChangeListenerTester setDataObject(InstanceIdentifier<? extends DataObject> iid, DataObject dataObject){
-        testData.clear();
-        return addDataObject(iid, dataObject);
-    }
-
-    public DataChangeListenerTester addDataObject(InstanceIdentifier<? extends DataObject> iid, DataObject dataObject){
-        testData.put(iid, dataObject);
-        return this;
-    }
-
-    public DataChangeListenerTester setRemovedPath(InstanceIdentifier<? extends DataObject> iid){
-        removedPaths.clear();
-        return addRemovedPath(iid);
-    }
-
-    public DataChangeListenerTester addRemovedPath(InstanceIdentifier<? extends DataObject> iid){
-        removedPaths.add(iid);
-        return this;
-    }
-
-    public void callOnDataChanged(){
-        listener.onDataChanged(changeMock);
-    }
-
-}
index 77285714c93e03f5887becf84582d664157cc65d..6e59280a5a95233c15c4909081c317fa2d73b717 100644 (file)
@@ -9,18 +9,15 @@
 package org.opendaylight.groupbasedpolicy.renderer.iovisor.endpoint;
 
 import java.util.Collection;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 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.DataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.groupbasedpolicy.renderer.iovisor.utils.IovisorModuleUtils;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.powermock.api.mockito.PowerMockito;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
@@ -33,8 +30,6 @@ public class EndpointListenerTest {
     EndpointListener endpointListner;
     @Mock
     DataBroker dataBroker;
-    @Mock
-    ListenerRegistration<DataChangeListener> registerListener;
 
     @Mock
     Collection<DataTreeModification<Endpoint>> changes;
index 859d9b00d4e0bf3ac1706a0b1d65be6529a69816..ae27609a0676b67db86a592f10c42829c18a96a6 100755 (executable)
@@ -8,22 +8,25 @@
 
 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.groupbasedpolicy.api.EpRendererAugmentationRegistry;
 import org.opendaylight.groupbasedpolicy.api.PolicyValidatorRegistry;
@@ -45,20 +48,15 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.
 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);
@@ -70,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;
 
@@ -79,7 +77,7 @@ 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,
             PacketProcessingService packetProcessingService,
@@ -139,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) {
@@ -182,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() {
index 83a7dac5a6a2010a087a19ccb0aad58ead09f15c..9da882ef38064a97407ac656034c3dc02a97989d 100644 (file)
@@ -8,20 +8,24 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay;
 
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
-
 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.ReadOnlyTransaction;
-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.sf.ChainActionDefinition;
@@ -48,17 +52,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.SubjectFeatureInstances;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ActionInstance;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-
 /**
  * Manage the state exchanged with SFC
  *
@@ -67,14 +65,14 @@ import com.google.common.util.concurrent.ListenableFuture;
  * are retrieved from SFC.
  *
  */
-public class SfcManager implements AutoCloseable, DataChangeListener {
+public class SfcManager implements AutoCloseable, DataTreeChangeListener<ActionInstance> {
     private static final Logger LOG =
             LoggerFactory.getLogger(SfcManager.class);
 
     private final DataBroker dataBroker;
     private final ExecutorService executor;
     private final InstanceIdentifier<ActionInstance> allActionInstancesIid;
-    private final ListenerRegistration<DataChangeListener> actionListener;
+    private final ListenerRegistration<?> actionListener;
 
     /*
      * local cache of the RSP first hops that we've requested from SFC,
@@ -117,7 +115,7 @@ public class SfcManager implements AutoCloseable, DataChangeListener {
         /*
          * Use thread-safe type only because we use an executor
          */
-        this.rspMap = new ConcurrentHashMap<String, RenderedServicePathFirstHop>();
+        this.rspMap = new ConcurrentHashMap<>();
 
         /*
          * For now, listen to all changes in rules
@@ -129,66 +127,57 @@ public class SfcManager implements AutoCloseable, DataChangeListener {
                     .child(SubjectFeatureInstances.class)
                     .child(ActionInstance.class)
                     .build();
-        actionListener = dataBroker.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
-                allActionInstancesIid, this, DataChangeScope.ONE);
+        actionListener = dataBroker.registerDataTreeChangeListener(new DataTreeIdentifier<>(
+                LogicalDatastoreType.CONFIGURATION, allActionInstancesIid), this);
         LOG.debug("SfcManager: Started");
     }
 
     public Set<IpAddress> getSfcSourceIps() {
-        if (rspMap.isEmpty()) return null;
+        if (rspMap.isEmpty()) {
+            return null;
+        }
 
-        Set<IpAddress> ipAddresses = new HashSet<IpAddress>();
+        Set<IpAddress> ipAddresses = new HashSet<>();
         for (RenderedServicePathFirstHop rsp: rspMap.values()) {
             if (rsp.getIp() != null) {
                 ipAddresses.add(IetfModelCodec.ipAddress2010(rsp.getIp()));
             }
         }
-        if (ipAddresses.isEmpty()) return null;
+        if (ipAddresses.isEmpty()) {
+            return null;
+        }
         return ipAddresses;
     }
 
     @Override
-    public void onDataChanged(
-            AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> actionInstanceNotification) {
-
-        for (DataObject dao : actionInstanceNotification.getCreatedData().values()) {
-            if (dao instanceof ActionInstance) {
-                ActionInstance ai = (ActionInstance)dao;
-                LOG.debug("New ActionInstance created");
-                executor.execute(new MatchActionDefTask(ai, null,
-                        ActionState.ADD));
-            }
-        }
-
-        for (InstanceIdentifier<?> iid : actionInstanceNotification.getRemovedPaths()) {
-            DataObject old = actionInstanceNotification.getOriginalData().get(iid);
-            if (old instanceof ActionInstance) {
-                ActionInstance ai = (ActionInstance)old;
-                executor.execute(new MatchActionDefTask(null, ai,
-                        ActionState.DELETE));
-            }
-        }
-
-        for (Entry<InstanceIdentifier<?>, DataObject> entry:
-            actionInstanceNotification.getUpdatedData().entrySet()) {
-            DataObject dao = entry.getValue();
-            if (dao instanceof ActionInstance) {
-                ActionInstance nai = (ActionInstance)dao;
-                ActionInstance oai = null;
-                InstanceIdentifier<?> iid = entry.getKey();
-                DataObject orig = actionInstanceNotification.getOriginalData().get(iid);
-                if (orig != null) {
-                    oai = (ActionInstance)orig;
-                    /*
-                     * We may have some cleanup here.  If the reference to
-                     * the Action Definition changed, or if the Action Instance's
-                     * chain parameter  then we're no longer
-                     * an action, and we may need to remove the RSP.
-                     */
-                }
-
-                executor.execute(new MatchActionDefTask(nai, oai,
-                        ActionState.CHANGE));
+    public void onDataTreeChanged(Collection<DataTreeModification<ActionInstance>> changes) {
+        for (DataTreeModification<ActionInstance> change: changes) {
+            DataObjectModification<ActionInstance> rootNode = change.getRootNode();
+            final ActionInstance dataBefore = rootNode.getDataBefore();
+            final ActionInstance dataAfter = rootNode.getDataAfter();
+            switch (rootNode.getModificationType()) {
+                case SUBTREE_MODIFIED:
+                case WRITE:
+                    if (dataBefore == null) {
+                        LOG.debug("New ActionInstance created");
+                        executor.execute(new MatchActionDefTask(dataAfter, null, ActionState.ADD));
+                    } else {
+                        /*
+                         We may have some cleanup here.  If the reference to
+                         the Action Definition changed, or if the Action Instance's
+                         chain parameter  then we're no longer
+                         an action, and we may need to remove the RSP.
+                        */
+                        LOG.debug("ActionInstance updated");
+                        executor.execute(new MatchActionDefTask(dataAfter, dataBefore, ActionState.CHANGE));
+                    }
+                    break;
+                case DELETE:
+                    LOG.debug("ActionInstance deleted");
+                    executor.execute(new MatchActionDefTask(null, dataBefore, ActionState.DELETE));
+                    break;
+                default:
+                    break;
             }
         }
     }
@@ -258,7 +247,9 @@ public class SfcManager implements AutoCloseable, DataChangeListener {
         @Override
         public void onSuccess(Optional<ActionDefinition> dao) {
             LOG.debug("Found ActionDefinition {}", id.getValue());
-            if (!dao.isPresent()) return;
+            if (!dao.isPresent()) {
+                return;
+            }
 
             ActionDefinition ad = dao.get();
             if (ad.getId().getValue().equals(ChainActionDefinition.ID.getValue())) {
@@ -294,7 +285,9 @@ public class SfcManager implements AutoCloseable, DataChangeListener {
         }
 
         private ParameterValue getChainNameParameter(List<ParameterValue> pvl) {
-            if (pvl == null) return null;
+            if (pvl == null) {
+                return null;
+            }
             for (ParameterValue pv: actionInstance.getParameterValue()) {
                 if (pv.getName().getValue().equals(SFC_CHAIN_NAME)) {
                     return pv;
@@ -326,7 +319,9 @@ public class SfcManager implements AutoCloseable, DataChangeListener {
         private void deleteSfcRsp() {
             ParameterValue pv =
                     getChainNameParameter(originalInstance.getParameterValue());
-            if (pv == null) return;
+            if (pv == null) {
+                return;
+            }
             rspMap.remove(pv.getStringValue());
         }
 
@@ -340,7 +335,9 @@ public class SfcManager implements AutoCloseable, DataChangeListener {
         private void addSfcRsp() {
             ParameterValue pv =
                     getChainNameParameter(actionInstance.getParameterValue());
-            if (pv == null) return;
+            if (pv == null) {
+                return;
+            }
 
             LOG.trace("Invoking RPC for chain {}", pv.getStringValue());
             ReadRenderedServicePathFirstHopInputBuilder builder =
@@ -375,7 +372,9 @@ public class SfcManager implements AutoCloseable, DataChangeListener {
         private void getSfcChain() {
             ParameterValue pv =
                     getChainNameParameter(actionInstance.getParameterValue());
-            if (pv == null) return;
+            if (pv == null) {
+                return;
+            }
 
             LOG.trace("Invoking RPC for chain {}", pv.getStringValue());
             SfcName chainName=new SfcName(pv.getStringValue());
@@ -401,7 +400,9 @@ public class SfcManager implements AutoCloseable, DataChangeListener {
 
     @Override
     public void close() throws Exception {
-        if (actionListener != null) actionListener.close();
+        if (actionListener != null) {
+            actionListener.close();
+        }
 
     }
 }
index 0eae16cd1837397d8cb529b303360cb132b01ebf..e1b839d1834f02ab97adee369684af65e112b3ee 100644 (file)
@@ -10,79 +10,75 @@ package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.Map;
-
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+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.groupbasedpolicy.util.IidFactory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Prefix;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-public class EndpointManagerListener implements DataChangeListener, AutoCloseable {
+public class EndpointManagerListener implements AutoCloseable {
 
-    private final ListenerRegistration<DataChangeListener> registerListener;
+    private final List<ListenerRegistration<?>> listenerRegistrations = new ArrayList<>();
     private final EndpointManager endpointManager;
 
     public EndpointManagerListener(DataBroker dataProvider, EndpointManager endpointManager) {
         this.endpointManager = checkNotNull(endpointManager);
-        this.registerListener = checkNotNull(dataProvider).registerDataChangeListener(
-                LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard(), this, AsyncDataBroker.DataChangeScope.SUBTREE);
+        checkNotNull(dataProvider);
+
+        listenerRegistrations.add(dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier<>(
+            LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(Endpoint.class)),
+            changes -> onEndpointChanged(changes)));
+
+        listenerRegistrations.add(dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier<>(
+            LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(EndpointL3.class)),
+            changes -> onEndpointL3Changed(changes)));
     }
 
-    @Override
-    public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        //Create
-        for (DataObject dao : change.getCreatedData().values()) {
-            if (dao instanceof Endpoint) {
-                endpointManager.processEndpoint(null, (Endpoint) dao);
-            } else if (dao instanceof EndpointL3) {
-                endpointManager.processL3Endpoint(null, (EndpointL3) dao);
-            } else if (dao instanceof EndpointL3Prefix) {
-                //noinspection UnnecessaryContinue
-                continue;
-            }
-        }
-        //Update
-        Map<InstanceIdentifier<?>, DataObject> dao = change.getUpdatedData();
-        for (Map.Entry<InstanceIdentifier<?>, DataObject> entry : dao.entrySet()) {
-            if (entry.getValue() instanceof Endpoint) {
-                Endpoint oldEp = (Endpoint) change.getOriginalData().get(entry.getKey());
-                endpointManager.processEndpoint(oldEp, (Endpoint) entry.getValue());
-            } else if (entry.getValue() instanceof EndpointL3) {
-                EndpointL3 oldEp3 = (EndpointL3) change.getOriginalData().get(entry.getKey());
-                endpointManager.processL3Endpoint(oldEp3, (EndpointL3) entry.getValue());
-            } else if (entry.getValue() instanceof EndpointL3Prefix) {
-                //noinspection UnnecessaryContinue
-                continue;
+    private void onEndpointChanged(Collection<DataTreeModification<Endpoint>> changes) {
+        for (DataTreeModification<Endpoint> change: changes) {
+            DataObjectModification<Endpoint> rootNode = change.getRootNode();
+            switch (rootNode.getModificationType()) {
+                case SUBTREE_MODIFIED:
+                case WRITE:
+                    endpointManager.processEndpoint(rootNode.getDataBefore(), rootNode.getDataAfter());
+                    break;
+                case DELETE:
+                    endpointManager.processEndpoint(rootNode.getDataBefore(), null);
+                    break;
+                default:
+                    break;
             }
         }
-        //Remove
-        for (InstanceIdentifier<?> iid : change.getRemovedPaths()) {
-            DataObject old = change.getOriginalData().get(iid);
-            if (old == null) {
-                continue;
-            }
-            if (old instanceof Endpoint) {
-                endpointManager.processEndpoint((Endpoint) old, null);
-            } else if (old instanceof EndpointL3) {
-                endpointManager.processL3Endpoint((EndpointL3) old, null);
-            } else if (old instanceof EndpointL3Prefix) {
-                //noinspection UnnecessaryContinue
-                continue;
+    }
+
+    private void onEndpointL3Changed(Collection<DataTreeModification<EndpointL3>> changes) {
+        for (DataTreeModification<EndpointL3> change: changes) {
+            DataObjectModification<EndpointL3> rootNode = change.getRootNode();
+            switch (rootNode.getModificationType()) {
+                case SUBTREE_MODIFIED:
+                case WRITE:
+                    endpointManager.processL3Endpoint(rootNode.getDataBefore(), rootNode.getDataAfter());
+                    break;
+                case DELETE:
+                    endpointManager.processL3Endpoint(rootNode.getDataBefore(), null);
+                    break;
+                default:
+                    break;
             }
         }
     }
 
     @Override
-    public void close() throws Exception {
-        if (registerListener != null)
-            registerListener.close();
+    public void close() {
+        for (ListenerRegistration<?> reg: listenerRegistrations) {
+            reg.close();
+        }
     }
 }
index 0f021ded0a808aef908512ef710bb22da0df1e7e..5e538ab5bff0aba9394ef64475e071889d3aff79 100644 (file)
@@ -8,16 +8,23 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import com.google.common.base.Objects;
 import com.google.common.base.Optional;
 import com.google.common.util.concurrent.Futures;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
 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.ReadTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 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.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
@@ -36,19 +43,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.No
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
 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 java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-public class FlowCapableNodeConnectorListener implements DataChangeListener, AutoCloseable {
+public class FlowCapableNodeConnectorListener implements DataTreeChangeListener<FlowCapableNodeConnector>,
+        AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(FlowCapableNodeConnectorListener.class);
 
@@ -62,17 +62,17 @@ public class FlowCapableNodeConnectorListener implements DataChangeListener, Aut
         .build();
     private final DataBroker dataProvider;
     private final SwitchManager switchManager;
-    private final ListenerRegistration<DataChangeListener> listenerRegistration;
+    private final ListenerRegistration<?> listenerRegistration;
 
     public FlowCapableNodeConnectorListener(DataBroker dataProvider, SwitchManager switchManager) {
         this.dataProvider = checkNotNull(dataProvider);
         this.switchManager = checkNotNull(switchManager);
-        listenerRegistration = dataProvider.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
-                fcNodeConnectorIid, this, DataChangeScope.BASE);
+        listenerRegistration = dataProvider.registerDataTreeChangeListener(new DataTreeIdentifier<>(
+                LogicalDatastoreType.OPERATIONAL, fcNodeConnectorIid), this);
     }
 
     @Override
-    public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
+    public void onDataTreeChanged(Collection<DataTreeModification<FlowCapableNodeConnector>> changes) {
         ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
 
         //endpoint and endpoint L3 maps
@@ -80,70 +80,60 @@ public class FlowCapableNodeConnectorListener implements DataChangeListener, Aut
         Map<Name, EndpointL3> l3EpWithOfOverlayAugByPortName = readL3EpsWithOfOverlayAugByPortName(rwTx);
 
         boolean isDataPutToTx = false;
-        for (Entry<InstanceIdentifier<?>, DataObject> fcncEntry : change.getCreatedData().entrySet()) {
-            if (FlowCapableNodeConnector.class.equals(fcncEntry.getKey().getTargetType())) {
-                InstanceIdentifier<NodeConnector> ncIid = fcncEntry.getKey().firstIdentifierOf(NodeConnector.class);
-                FlowCapableNodeConnector fcnc = (FlowCapableNodeConnector) fcncEntry.getValue();
-                LOG.trace(
-                        "FlowCapableNodeConnector created: NodeId: {} NodeConnectorId: {} FlowCapableNodeConnector: {}",
-                        ncIid.firstKeyOf(Node.class, NodeKey.class).getId().getValue(),
-                        ncIid.firstKeyOf(NodeConnector.class, NodeConnectorKey.class).getId().getValue(), fcnc);
-                switchManager.updateSwitchNodeConnectorConfig(ncIid, fcnc);
-                Name portName = getPortName(fcnc);
-                boolean updated = updateEpWithNodeConnectorInfo(epWithOfOverlayAugByPortName.get(portName), ncIid, rwTx);
-                boolean l3Updated = updateL3EpWithNodeConnectorInfo(l3EpWithOfOverlayAugByPortName.get(portName), ncIid, rwTx);
-                if (updated || l3Updated) {
-                    isDataPutToTx = true;
-                }
-            }
-        }
-        for (Entry<InstanceIdentifier<?>, DataObject> fcncEntry : change.getUpdatedData().entrySet()) {
-            if (FlowCapableNodeConnector.class.equals(fcncEntry.getKey().getTargetType())) {
-                InstanceIdentifier<NodeConnector> ncIid = fcncEntry.getKey().firstIdentifierOf(NodeConnector.class);
-                FlowCapableNodeConnector fcnc = (FlowCapableNodeConnector) fcncEntry.getValue();
-                LOG.trace(
-                        "FlowCapableNodeConnector updated: NodeId: {} NodeConnectorId: {} FlowCapableNodeConnector: {}",
-                        ncIid.firstKeyOf(Node.class, NodeKey.class).getId().getValue(),
-                        ncIid.firstKeyOf(NodeConnector.class, NodeConnectorKey.class).getId().getValue(), fcnc);
-                switchManager.updateSwitchNodeConnectorConfig(ncIid, fcnc);
-                Name portName = getPortName(fcnc);
-                boolean updated = updateEpWithNodeConnectorInfo(epWithOfOverlayAugByPortName.get(portName), ncIid, rwTx);
-                boolean l3Updated = updateL3EpWithNodeConnectorInfo(l3EpWithOfOverlayAugByPortName.get(portName), ncIid, rwTx);
-                if (updated || l3Updated) {
-                    isDataPutToTx = true;
-                }
-                FlowCapableNodeConnector originalFcnc = (FlowCapableNodeConnector) change.getOriginalData().get(
-                        fcncEntry.getKey());
-                Name portNameFromOriginalFcnc = getPortName(originalFcnc);
-                // port name already existed and then was changed
-                if (portNameFromOriginalFcnc != null && !Objects.equal(portNameFromOriginalFcnc, portName)) {
-                    updated = updateEpWithNodeConnectorInfo(epWithOfOverlayAugByPortName
-                            .get(portNameFromOriginalFcnc), null, rwTx);
-                    l3Updated = updateL3EpWithNodeConnectorInfo(l3EpWithOfOverlayAugByPortName
-                            .get(portNameFromOriginalFcnc), null, rwTx);
+        for (DataTreeModification<FlowCapableNodeConnector> change: changes) {
+            DataObjectModification<FlowCapableNodeConnector> rootNode = change.getRootNode();
+            InstanceIdentifier<NodeConnector> ncIid = change.getRootPath().getRootIdentifier()
+                    .firstIdentifierOf(NodeConnector.class);
+            final FlowCapableNodeConnector originalFcnc = rootNode.getDataBefore();
+            boolean updated;
+            boolean l3Updated;
+            switch (rootNode.getModificationType()) {
+                case SUBTREE_MODIFIED:
+                case WRITE:
+                    FlowCapableNodeConnector fcnc = rootNode.getDataAfter();
+                    LOG.trace(
+                            "FlowCapableNodeConnector updated: NodeId: {} NodeConnectorId: {} FlowCapableNodeConnector: {}",
+                            ncIid.firstKeyOf(Node.class, NodeKey.class).getId().getValue(),
+                            ncIid.firstKeyOf(NodeConnector.class, NodeConnectorKey.class).getId().getValue(), fcnc);
+                    switchManager.updateSwitchNodeConnectorConfig(ncIid, fcnc);
+                    Name portName = getPortName(fcnc);
+                    updated = updateEpWithNodeConnectorInfo(epWithOfOverlayAugByPortName.get(portName), ncIid, rwTx);
+                    l3Updated = updateL3EpWithNodeConnectorInfo(l3EpWithOfOverlayAugByPortName.get(portName), ncIid, rwTx);
                     if (updated || l3Updated) {
                         isDataPutToTx = true;
                     }
-                }
-            }
-        }
-        for (InstanceIdentifier<?> fcncIid : change.getRemovedPaths()) {
-            if (FlowCapableNodeConnector.class.equals(fcncIid.getTargetType())) {
-                InstanceIdentifier<NodeConnector> ncIid = fcncIid.firstIdentifierOf(NodeConnector.class);
-                FlowCapableNodeConnector originalFcnc = (FlowCapableNodeConnector) change.getOriginalData()
-                    .get(fcncIid);
-                LOG.trace("FlowCapableNodeConnector removed: NodeId: {} NodeConnectorId: {}",
-                        ncIid.firstKeyOf(Node.class, NodeKey.class).getId().getValue(),
-                        ncIid.firstKeyOf(NodeConnector.class, NodeConnectorKey.class).getId().getValue());
-                switchManager.updateSwitchNodeConnectorConfig(ncIid, null);
-                Name portNameFromOriginalFcnc = getPortName(originalFcnc);
-                boolean updated = updateEpWithNodeConnectorInfo(epWithOfOverlayAugByPortName.get(portNameFromOriginalFcnc), null, rwTx);
-                boolean l3Updated = updateL3EpWithNodeConnectorInfo(l3EpWithOfOverlayAugByPortName.get(portNameFromOriginalFcnc), null, rwTx);
-                if (updated || l3Updated) {
-                    isDataPutToTx = true;
-                }
+
+                    if (originalFcnc != null) {
+                        Name portNameFromOriginalFcnc = getPortName(originalFcnc);
+                        // port name already existed and then was changed
+                        if (portNameFromOriginalFcnc != null && !Objects.equal(portNameFromOriginalFcnc, portName)) {
+                            updated = updateEpWithNodeConnectorInfo(epWithOfOverlayAugByPortName
+                                    .get(portNameFromOriginalFcnc), null, rwTx);
+                            l3Updated = updateL3EpWithNodeConnectorInfo(l3EpWithOfOverlayAugByPortName
+                                    .get(portNameFromOriginalFcnc), null, rwTx);
+                            if (updated || l3Updated) {
+                                isDataPutToTx = true;
+                            }
+                        }
+                    }
+                    break;
+                case DELETE:
+                    LOG.trace("FlowCapableNodeConnector removed: NodeId: {} NodeConnectorId: {}",
+                            ncIid.firstKeyOf(Node.class, NodeKey.class).getId().getValue(),
+                            ncIid.firstKeyOf(NodeConnector.class, NodeConnectorKey.class).getId().getValue());
+                    switchManager.updateSwitchNodeConnectorConfig(ncIid, null);
+                    Name portNameFromOriginalFcnc = getPortName(originalFcnc);
+                    updated = updateEpWithNodeConnectorInfo(epWithOfOverlayAugByPortName.get(portNameFromOriginalFcnc), null, rwTx);
+                    l3Updated = updateL3EpWithNodeConnectorInfo(l3EpWithOfOverlayAugByPortName.get(portNameFromOriginalFcnc), null, rwTx);
+                    if (updated || l3Updated) {
+                        isDataPutToTx = true;
+                    }
+                    break;
+                default:
+                    break;
             }
         }
+
         if (isDataPutToTx) {
             rwTx.submit();
         } else {
@@ -264,5 +254,4 @@ public class FlowCapableNodeConnectorListener implements DataChangeListener, Aut
             listenerRegistration.close();
         }
     }
-
 }
index 1114e319d4d48004ba7c31fe0ae1f8d0104e6aeb..a5aef57b0d1d75a713f542908a9d00ec63bf3370 100644 (file)
@@ -10,12 +10,12 @@ package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.Map.Entry;
-
+import java.util.Collection;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-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.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.common.api.data.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
@@ -23,12 +23,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
 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;
 
-public class FlowCapableNodeListener implements DataChangeListener, AutoCloseable {
+public class FlowCapableNodeListener implements DataTreeChangeListener<FlowCapableNode>, AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(FlowCapableNodeListener.class);
 
@@ -37,37 +36,32 @@ public class FlowCapableNodeListener implements DataChangeListener, AutoCloseabl
         .augmentation(FlowCapableNode.class)
         .build();
     private final SwitchManager switchManager;
-    private final ListenerRegistration<DataChangeListener> listenerRegistration;
+    private final ListenerRegistration<?> listenerRegistration;
 
     public FlowCapableNodeListener(DataBroker dataProvider, SwitchManager switchManager) {
         this.switchManager = checkNotNull(switchManager);
-        listenerRegistration = checkNotNull(dataProvider).registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
-                fcNodeIid, this, DataChangeScope.BASE);
+        listenerRegistration = checkNotNull(dataProvider).registerDataTreeChangeListener(new DataTreeIdentifier<>(
+                LogicalDatastoreType.OPERATIONAL, fcNodeIid), this);
     }
 
     @Override
-    public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        for (Entry<InstanceIdentifier<?>, DataObject> fcNodeEntry : change.getCreatedData().entrySet()) {
-            if (FlowCapableNode.class.equals(fcNodeEntry.getKey().getTargetType())) {
-                NodeId nodeId = fcNodeEntry.getKey().firstKeyOf(Node.class, NodeKey.class).getId();
-                FlowCapableNode fcNode = (FlowCapableNode) fcNodeEntry.getValue();
-                LOG.trace("FlowCapableNode created. NodeId: {} FlowCapableNode: {}", nodeId.getValue(), fcNode);
-                switchManager.updateSwitch(nodeId, fcNode);
-            }
-        }
-        for (Entry<InstanceIdentifier<?>, DataObject> fcNodeEntry : change.getUpdatedData().entrySet()) {
-            if (FlowCapableNode.class.equals(fcNodeEntry.getKey().getTargetType())) {
-                NodeId nodeId = fcNodeEntry.getKey().firstKeyOf(Node.class, NodeKey.class).getId();
-                FlowCapableNode fcNode = (FlowCapableNode) fcNodeEntry.getValue();
-                LOG.trace("FlowCapableNode updated. NodeId: {} FlowCapableNode: {}", nodeId.getValue(), fcNode);
-                switchManager.updateSwitch(nodeId, fcNode);
-            }
-        }
-        for (InstanceIdentifier<?> removedFcNodeIid : change.getRemovedPaths()) {
-            if (FlowCapableNode.class.equals(removedFcNodeIid.getTargetType())) {
-                NodeId nodeId = removedFcNodeIid.firstKeyOf(Node.class, NodeKey.class).getId();
-                LOG.trace("FlowCapableNode removed. NodeId: {}", nodeId.getValue());
-                switchManager.updateSwitch(nodeId, null);
+    public void onDataTreeChanged(Collection<DataTreeModification<FlowCapableNode>> changes) {
+        for (DataTreeModification<FlowCapableNode> change: changes) {
+            DataObjectModification<FlowCapableNode> rootNode = change.getRootNode();
+            NodeId nodeId = change.getRootPath().getRootIdentifier().firstKeyOf(Node.class, NodeKey.class).getId();
+            switch (rootNode.getModificationType()) {
+                case SUBTREE_MODIFIED:
+                case WRITE:
+                    FlowCapableNode fcNode = rootNode.getDataAfter();
+                    LOG.trace("FlowCapableNode updated. NodeId: {} FlowCapableNode: {}", nodeId.getValue(), fcNode);
+                    switchManager.updateSwitch(nodeId, fcNode);
+                    break;
+                case DELETE:
+                    LOG.trace("FlowCapableNode removed. NodeId: {}", nodeId.getValue());
+                    switchManager.updateSwitch(nodeId, null);
+                    break;
+                default:
+                    break;
             }
         }
     }
index 0013904c101f193aa770f4903263d011ec96ceac..29fc7f90f26375eebceef25f7064137fb13f45c9 100644 (file)
@@ -10,12 +10,12 @@ package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.Map.Entry;
-
+import java.util.Collection;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-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.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.common.api.data.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
@@ -23,12 +23,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
 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;
 
-public class OfOverlayNodeListener implements DataChangeListener, AutoCloseable {
+public class OfOverlayNodeListener implements DataTreeChangeListener<OfOverlayNodeConfig>, AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(OfOverlayNodeListener.class);
 
@@ -38,39 +37,33 @@ public class OfOverlayNodeListener implements DataChangeListener, AutoCloseable
         .augmentation(OfOverlayNodeConfig.class)
         .build();
     private final SwitchManager switchManager;
-    private final ListenerRegistration<DataChangeListener> listenerRegistration;
+    private final ListenerRegistration<?> listenerRegistration;
 
     public OfOverlayNodeListener(DataBroker dataProvider, SwitchManager switchManager) {
         this.switchManager = checkNotNull(switchManager);
-        listenerRegistration = checkNotNull(dataProvider).registerDataChangeListener(
-                LogicalDatastoreType.CONFIGURATION, ofOverlayNodeIid, this, DataChangeScope.ONE);
+        listenerRegistration = checkNotNull(dataProvider).registerDataTreeChangeListener(new DataTreeIdentifier<>(
+                LogicalDatastoreType.CONFIGURATION, ofOverlayNodeIid), this);
     }
 
     @Override
-    public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
-        for (Entry<InstanceIdentifier<?>, DataObject> nodeConfigEntry : change.getCreatedData().entrySet()) {
-            if (OfOverlayNodeConfig.class.equals(nodeConfigEntry.getKey().getTargetType())) {
-                NodeId nodeId = nodeConfigEntry.getKey().firstKeyOf(Node.class, NodeKey.class).getId();
-                OfOverlayNodeConfig nodeConfig = (OfOverlayNodeConfig) nodeConfigEntry.getValue();
-                LOG.trace("OfOverlayNodeConfig created. NodeId: {} OfOverlayNodeConfig: {}", nodeId.getValue(),
-                        nodeConfig);
-                switchManager.updateSwitchConfig(nodeId, nodeConfig);
-            }
-        }
-        for (Entry<InstanceIdentifier<?>, DataObject> nodeConfigEntry : change.getUpdatedData().entrySet()) {
-            if (OfOverlayNodeConfig.class.equals(nodeConfigEntry.getKey().getTargetType())) {
-                NodeId nodeId = nodeConfigEntry.getKey().firstKeyOf(Node.class, NodeKey.class).getId();
-                OfOverlayNodeConfig nodeConfig = (OfOverlayNodeConfig) nodeConfigEntry.getValue();
-                LOG.trace("OfOverlayNodeConfig updated. NodeId: {} OfOverlayNodeConfig: {}", nodeId.getValue(),
-                        nodeConfig);
-                switchManager.updateSwitchConfig(nodeId, nodeConfig);
-            }
-        }
-        for (InstanceIdentifier<?> removedNodeConfigIid : change.getRemovedPaths()) {
-            if (OfOverlayNodeConfig.class.equals(removedNodeConfigIid.getTargetType())) {
-                NodeId nodeId = removedNodeConfigIid.firstKeyOf(Node.class, NodeKey.class).getId();
-                LOG.trace("OfOverlayNodeConfig removed. NodeId: {}", nodeId.getValue());
-                switchManager.updateSwitchConfig(nodeId, null);
+    public void onDataTreeChanged(Collection<DataTreeModification<OfOverlayNodeConfig>> changes) {
+        for (DataTreeModification<OfOverlayNodeConfig> change: changes) {
+            DataObjectModification<OfOverlayNodeConfig> rootNode = change.getRootNode();
+            NodeId nodeId = change.getRootPath().getRootIdentifier().firstKeyOf(Node.class, NodeKey.class).getId();
+            switch (rootNode.getModificationType()) {
+                case SUBTREE_MODIFIED:
+                case WRITE:
+                    OfOverlayNodeConfig nodeConfig = rootNode.getDataAfter();
+                    LOG.trace("OfOverlayNodeConfig updated. NodeId: {} OfOverlayNodeConfig: {}", nodeId.getValue(),
+                            nodeConfig);
+                    switchManager.updateSwitchConfig(nodeId, nodeConfig);
+                    break;
+                case DELETE:
+                    LOG.trace("OfOverlayNodeConfig removed. NodeId: {}", nodeId.getValue());
+                    switchManager.updateSwitchConfig(nodeId, null);
+                    break;
+                default:
+                    break;
             }
         }
     }
@@ -81,5 +74,4 @@ public class OfOverlayNodeListener implements DataChangeListener, AutoCloseable
             listenerRegistration.close();
         }
     }
-
 }
index e77b64fd97367966c3a202c9e8d6b740efecbd94..fdb65dbee6fdb75f51edfef133df1a6ff520e965 100755 (executable)
@@ -9,23 +9,24 @@
 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.Futures;
 import java.lang.reflect.Method;
-
 import org.junit.Before;
 import org.junit.Test;
 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.DataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 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.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
@@ -38,10 +39,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.Pa
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.CheckedFuture;
-import com.google.common.util.concurrent.Futures;
-
 public class OFOverlayRendererTest {
 
     private OFOverlayRenderer renderer;
@@ -55,7 +52,7 @@ public class OFOverlayRendererTest {
     private StatisticsManager statisticsManager;
     private short tableOffset;
     private CheckedFuture<Optional<OfOverlayConfig>, ReadFailedException> future;
-    private ListenerRegistration<DataChangeListener> configReg;
+    private ListenerRegistration<?> configReg;
     private ReadOnlyTransaction readTransaction;
 
     @SuppressWarnings("unchecked")
@@ -70,8 +67,6 @@ public class OFOverlayRendererTest {
         statisticsManager = mock(StatisticsManager.class);
         tableOffset = 5;
         configReg = mock(ListenerRegistration.class);
-        when(dataProvider.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
-                any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(configReg);
         when(dataProvider.registerDataTreeChangeListener(any(DataTreeIdentifier.class),
                 any(ClusteredDataTreeChangeListener.class))).thenReturn(configReg);
 
@@ -91,7 +86,7 @@ public class OFOverlayRendererTest {
     @Test
     public void constructorTest() throws Exception {
         renderer.close();
-        verify(configReg, times(11)).close();
+        verify(configReg, atLeastOnce()).close();
     }
 
     @Test
index 3a17c318775936ac9e59c3e993f287cad41f3044..689561b39ce4593bbb2860074ff46b66d8feda65 100644 (file)
@@ -9,28 +9,23 @@
 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.concurrent.ExecutorService;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-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.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.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ActionInstance;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class SfcManagerTest {
 
@@ -39,13 +34,11 @@ public class SfcManagerTest {
     private DataBroker dataBroker;
     private RpcProviderRegistry rpcRegistry;
     private ExecutorService executor;
-    private ListenerRegistration<DataChangeListener> actionListener;
+    private ListenerRegistration<?> actionListener;
 
-    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> actionInstanceNotification;
-    private InstanceIdentifier<DataObject> pathIdentifier;
+    private DataObjectModification<ActionInstance> mockModification;
+    private Collection<DataTreeModification<ActionInstance>> changeEvent;
     private ActionInstance dataObject;
-    private HashMap<InstanceIdentifier<?>, DataObject> dataMap;
-    private Set<InstanceIdentifier<?>> dataSet;
 
     @SuppressWarnings("unchecked")
     @Before
@@ -54,18 +47,17 @@ public class SfcManagerTest {
         rpcRegistry = mock(RpcProviderRegistry.class);
         executor = mock(ExecutorService.class);
         actionListener = mock(ListenerRegistration.class);
-        actionInstanceNotification = mock(AsyncDataChangeEvent.class);
-        pathIdentifier = mock(InstanceIdentifier.class);
         dataObject = mock(ActionInstance.class);
 
-        when(
-                dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
-                        any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(actionListener);
-        dataMap = new HashMap<InstanceIdentifier<?>, DataObject>();
-        dataMap.put(pathIdentifier, dataObject);
-        dataSet = new HashSet<InstanceIdentifier<?>>(Arrays.asList(pathIdentifier));
+        doReturn(actionListener).when(dataBroker).registerDataTreeChangeListener(
+                any(DataTreeIdentifier.class), any(DataTreeChangeListener.class));
 
         manager = new SfcManager(dataBroker, rpcRegistry, executor);
+
+        DataTreeModification<ActionInstance> mockDataTreeModification = mock(DataTreeModification.class);
+        mockModification = mock(DataObjectModification.class);
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+        changeEvent = Collections.singletonList(mockDataTreeModification);
     }
 
     @Test
@@ -76,24 +68,29 @@ public class SfcManagerTest {
 
     @Test
     public void onDataChangedTestAdd() {
-        when(actionInstanceNotification.getCreatedData()).thenReturn(dataMap);
-        manager.onDataChanged(actionInstanceNotification);
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(dataObject).when(mockModification).getDataAfter();
+
+        manager.onDataTreeChanged(changeEvent);
         verify(executor).execute(any(Runnable.class));
     }
 
     @Test
     public void onDataChangedTestDelete() {
-        when(actionInstanceNotification.getRemovedPaths()).thenReturn(dataSet);
-        when(actionInstanceNotification.getOriginalData()).thenReturn(dataMap);
-        manager.onDataChanged(actionInstanceNotification);
+        doReturn(DataObjectModification.ModificationType.DELETE).when(mockModification).getModificationType();
+        doReturn(dataObject).when(mockModification).getDataBefore();
+
+        manager.onDataTreeChanged(changeEvent);
         verify(executor).execute(any(Runnable.class));
     }
 
     @Test
     public void onDataChangedTestChange() {
-        when(actionInstanceNotification.getOriginalData()).thenReturn(dataMap);
-        when(actionInstanceNotification.getUpdatedData()).thenReturn(dataMap);
-        manager.onDataChanged(actionInstanceNotification);
+        doReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED).when(mockModification).getModificationType();
+        doReturn(dataObject).when(mockModification).getDataBefore();
+        doReturn(dataObject).when(mockModification).getDataAfter();
+
+        manager.onDataTreeChanged(changeEvent);
         verify(executor).execute(any(Runnable.class));
     }
 }
index db2ecf1782bf436feb83aa27694bc169baea0fdc..345c608787a765f6230d7e48b22d4b135c4bf81b 100755 (executable)
 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
+import java.util.Collection;
+import java.util.Collections;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
-import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.test.DataChangeListenerTester;
+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.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.util.IidFactory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Prefix;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class EndpointManagerListenerTest {
 
-    private InstanceIdentifier<DataObject> endpointId;
-    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
+    private EndpointManagerListener endpointManagerListener;
     private EndpointManager endpointManager;
-    private DataChangeListenerTester tester;
+    private DataBroker mockBroker;
 
     @SuppressWarnings("unchecked")
     @Before
     public void init() {
-        endpointId = mock(InstanceIdentifier.class);
         endpointManager = mock(EndpointManager.class);
-        DataBroker dataProvider = mock(DataBroker.class);
+        mockBroker = mock(DataBroker.class);
+        endpointManagerListener = new EndpointManagerListener(mockBroker, endpointManager);
 
-        EndpointManagerListener endpointManagerListener = new EndpointManagerListener(dataProvider, endpointManager);
-        tester = new DataChangeListenerTester(endpointManagerListener);
-        tester.setRemovedPath(endpointId);
+        doReturn(mock(ListenerRegistration.class)).when(mockBroker).registerDataTreeChangeListener(
+                any(DataTreeIdentifier.class), any(DataTreeChangeListener.class));
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Test
-    public void testOnDataChangeEndpoint() {
-        DataObject endpoint = mock(Endpoint.class);
-        tester.setDataObject(endpointId, endpoint);
+    public void testEndpointCreated() {
+        ArgumentCaptor<DataTreeChangeListener> dtclCaptor = ArgumentCaptor.forClass(DataTreeChangeListener.class);
+        verify(mockBroker).registerDataTreeChangeListener(eq(new DataTreeIdentifier<>(
+                LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(Endpoint.class))),
+                dtclCaptor.capture());
 
-        tester.callOnDataChanged();
+        Endpoint endpoint = mock(Endpoint.class);
 
-        verify(endpointManager, times(3)).processEndpoint(any(Endpoint.class), any(Endpoint.class));
+        dtclCaptor.getValue().onDataTreeChanged(newMockDataTreeModification(null, endpoint,
+                DataObjectModification.ModificationType.WRITE));
+
+        verify(endpointManager).processEndpoint(null, endpoint);
+        verify(endpointManager, never()).processL3Endpoint(any(EndpointL3.class), any(EndpointL3.class));
+    }
+
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    @Test
+    public void testEndpointUpdated() {
+        ArgumentCaptor<DataTreeChangeListener> dtclCaptor = ArgumentCaptor.forClass(DataTreeChangeListener.class);
+        verify(mockBroker).registerDataTreeChangeListener(eq(new DataTreeIdentifier<>(
+                LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(Endpoint.class))),
+                dtclCaptor.capture());
+
+        Endpoint endpoint = mock(Endpoint.class);
+
+        dtclCaptor.getValue().onDataTreeChanged(newMockDataTreeModification(endpoint, endpoint,
+                DataObjectModification.ModificationType.WRITE));
+
+        verify(endpointManager).processEndpoint(endpoint, endpoint);
         verify(endpointManager, never()).processL3Endpoint(any(EndpointL3.class), any(EndpointL3.class));
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Test
-    public void testOnDataChangeEndpointL3() {
-        DataObject endpoint = mock(EndpointL3.class);
-        tester.setDataObject(endpointId, endpoint);
+    public void testEndpointDeleted() {
+        ArgumentCaptor<DataTreeChangeListener> dtclCaptor = ArgumentCaptor.forClass(DataTreeChangeListener.class);
+        verify(mockBroker).registerDataTreeChangeListener(eq(new DataTreeIdentifier<>(
+                LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(Endpoint.class))),
+                dtclCaptor.capture());
+
+        Endpoint endpoint = mock(Endpoint.class);
 
-        tester.callOnDataChanged();
+        dtclCaptor.getValue().onDataTreeChanged(newMockDataTreeModification(endpoint, null,
+                DataObjectModification.ModificationType.DELETE));
+
+        verify(endpointManager).processEndpoint(endpoint, null);
+        verify(endpointManager, never()).processL3Endpoint(any(EndpointL3.class), any(EndpointL3.class));
+    }
+
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    @Test
+    public void testEndpointL3Created() {
+        ArgumentCaptor<DataTreeChangeListener> dtclCaptor = ArgumentCaptor.forClass(DataTreeChangeListener.class);
+        verify(mockBroker).registerDataTreeChangeListener(eq(new DataTreeIdentifier<>(
+                LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(EndpointL3.class))),
+                dtclCaptor.capture());
 
+        EndpointL3 endpoint = mock(EndpointL3.class);
+
+        dtclCaptor.getValue().onDataTreeChanged(newMockDataTreeModification(null, endpoint,
+                DataObjectModification.ModificationType.WRITE));
+
+        verify(endpointManager).processL3Endpoint(null, endpoint);
         verify(endpointManager, never()).processEndpoint(any(Endpoint.class), any(Endpoint.class));
-        verify(endpointManager, times(3)).processL3Endpoint(any(EndpointL3.class), any(EndpointL3.class));
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Test
-    public void testOnDataChangeEndpointL3Prefix() {
-        DataObject endpoint = mock(EndpointL3Prefix.class);
-        tester.setDataObject(endpointId, endpoint);
+    public void testEndpointL3Updated() {
+        ArgumentCaptor<DataTreeChangeListener> dtclCaptor = ArgumentCaptor.forClass(DataTreeChangeListener.class);
+        verify(mockBroker).registerDataTreeChangeListener(eq(new DataTreeIdentifier<>(
+                LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(EndpointL3.class))),
+                dtclCaptor.capture());
 
-        tester.callOnDataChanged();
+        EndpointL3 endpoint = mock(EndpointL3.class);
 
+        dtclCaptor.getValue().onDataTreeChanged(newMockDataTreeModification(endpoint, endpoint,
+                DataObjectModification.ModificationType.WRITE));
+
+        verify(endpointManager).processL3Endpoint(endpoint, endpoint);
         verify(endpointManager, never()).processEndpoint(any(Endpoint.class), any(Endpoint.class));
-        verify(endpointManager, never()).processL3Endpoint(any(EndpointL3.class), any(EndpointL3.class));
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    @Test
+    public void testEndpointL3Deleted() {
+        ArgumentCaptor<DataTreeChangeListener> dtclCaptor = ArgumentCaptor.forClass(DataTreeChangeListener.class);
+        verify(mockBroker).registerDataTreeChangeListener(eq(new DataTreeIdentifier<>(
+                LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(EndpointL3.class))),
+                dtclCaptor.capture());
+
+        EndpointL3 endpoint = mock(EndpointL3.class);
+
+        dtclCaptor.getValue().onDataTreeChanged(newMockDataTreeModification(endpoint, null,
+                DataObjectModification.ModificationType.DELETE));
+
+        verify(endpointManager).processL3Endpoint(endpoint, null);
+        verify(endpointManager, never()).processEndpoint(any(Endpoint.class), any(Endpoint.class));
+    }
+
+    @SuppressWarnings("unchecked")
+    private static <T extends DataObject> Collection<DataTreeModification<T>> newMockDataTreeModification(T dataBefore,
+            T dataAfter, DataObjectModification.ModificationType type) {
+        DataTreeModification<T> mockDataTreeModification = mock(DataTreeModification.class);
+        DataObjectModification<T> mockModification = mock(DataObjectModification.class);
+        doReturn(type).when(mockModification).getModificationType();
+        doReturn(dataBefore).when(mockModification).getDataBefore();
+        doReturn(dataAfter).when(mockModification).getDataAfter();
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+
+        return Collections.singletonList(mockDataTreeModification);
+    }
 }
index 22e434f35974c6c069571caa73e17d7ed0383d46..6669d4f5b2ebd2d08124e6389c588169b6aaf03c 100644 (file)
@@ -21,25 +21,22 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ScheduledExecutorService;
-
 import org.junit.Before;
 import org.junit.Test;
 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.DataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 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.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
@@ -71,12 +68,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 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 com.google.common.base.Optional;
-import com.google.common.util.concurrent.CheckedFuture;
-
 public class EndpointManagerTest {
 
     private EndpointManager manager;
@@ -86,7 +79,6 @@ public class EndpointManagerTest {
     private NotificationService notificationService;
     private ScheduledExecutorService executor;
     private SwitchManager switchManager;
-    private ListenerRegistration<DataChangeListener> listenerReg;
     private EndpointListener endpointListener;
     private Endpoint endpoint1;
     private Endpoint endpoint2;
@@ -118,11 +110,8 @@ public class EndpointManagerTest {
         when(writeTransaction.submit()).thenReturn(checkedFutureWrite);
         BindingAwareBroker.RpcRegistration<EndpointService> rpcRegistration =
                 mock(BindingAwareBroker.RpcRegistration.class);
-        listenerReg = mock(ListenerRegistration.class);
-        when(dataProvider.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
-                any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(listenerReg);
         when(dataProvider.registerDataTreeChangeListener(any(DataTreeIdentifier.class),
-                any(ClusteredDataTreeChangeListener.class))).thenReturn(listenerReg);
+                any(ClusteredDataTreeChangeListener.class))).thenReturn(mock(ListenerRegistration.class));
 
         manager = spy(new EndpointManager(dataProvider, packetService, flowService, notificationService, executor, switchManager));
         endpointListener = mock(EndpointListener.class);
@@ -153,13 +142,6 @@ public class EndpointManagerTest {
         when(nodeId1.getValue()).thenReturn("nodeValue1");
         when(nodeId2.getValue()).thenReturn("nodeValue2");
 
-        // onDataChanged
-        AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change = mock(AsyncDataChangeEvent.class);
-        InstanceIdentifier<DataObject> endpointId = mock(InstanceIdentifier.class);
-        Set<InstanceIdentifier<?>> removedPaths = new HashSet<>();
-        removedPaths.add(endpointId);
-        when(change.getRemovedPaths()).thenReturn(removedPaths);
-
         // updateEndpointL3
         oldL3Ep = mock(EndpointL3.class);
         newL3Ep = mock(EndpointL3.class);
@@ -622,7 +604,6 @@ public class EndpointManagerTest {
     @Test
     public void closeTest() throws Exception {
         manager.close();
-        verify(listenerReg, times(3)).close();
     }
 
     // **************
index e88d03b3b1d08e6f0bbb5efc68a3785159152455..febc4d20900033ee60d061f2b56836829f5d0a25 100644 (file)
@@ -9,24 +9,25 @@
 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
 import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 import org.junit.Before;
 import org.junit.Test;
 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.ReadWriteTransaction;
-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.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
@@ -43,20 +44,15 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.No
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.CheckedFuture;
-
 public class FlowCapableNodeConnectorListenerTest {
 
     private FlowCapableNodeConnectorListener listener;
 
     private DataBroker dataProvider;
     private SwitchManager switchManager;
-    private ListenerRegistration<DataChangeListener> listenerRegistration;
-    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> asyncDataChangeEvent;
+    private ListenerRegistration<?> listenerRegistration;
     private FlowCapableNodeConnector entryValue;
     private String portName;
     private NodeId childNodeId;
@@ -68,6 +64,8 @@ public class FlowCapableNodeConnectorListenerTest {
     private OfOverlayContext ofOverlayEp;
     private EndpointKey endpointKey;
     private Name name;
+    private DataObjectModification<FlowCapableNodeConnector> mockModification;
+    private Collection<DataTreeModification<FlowCapableNodeConnector>> changeEvent;
 
     @SuppressWarnings("unchecked")
     @Before
@@ -75,10 +73,8 @@ public class FlowCapableNodeConnectorListenerTest {
         dataProvider = mock(DataBroker.class);
         switchManager = mock(SwitchManager.class);
         listenerRegistration = mock(ListenerRegistration.class);
-        when(
-                dataProvider.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
-                        any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(listenerRegistration);
-        asyncDataChangeEvent = mock(AsyncDataChangeEvent.class);
+        when(dataProvider.registerDataTreeChangeListener(any(DataTreeIdentifier.class),
+                any(DataTreeChangeListener.class))).thenReturn(listenerRegistration);
         entryValue = mock(FlowCapableNodeConnector.class);
         portName = "portName";
         when(entryValue.getName()).thenReturn(portName);
@@ -111,6 +107,13 @@ public class FlowCapableNodeConnectorListenerTest {
         when(ofOverlayEp.getPortName()).thenReturn(name);
 
         listener = new FlowCapableNodeConnectorListener(dataProvider, switchManager);
+
+        DataTreeModification<FlowCapableNodeConnector> mockDataTreeModification = mock(DataTreeModification.class);
+        mockModification = mock(DataObjectModification.class);
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+        doReturn(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, entryKey)).when(mockDataTreeModification)
+            .getRootPath();
+        changeEvent = Collections.singletonList(mockDataTreeModification);
     }
 
     @Test
@@ -121,37 +124,30 @@ public class FlowCapableNodeConnectorListenerTest {
 
     @Test
     public void onDataChangeTestCreatedDataSubmit() {
-        Map<InstanceIdentifier<?>, DataObject> entrySet = new HashMap<InstanceIdentifier<?>, DataObject>();
-        entrySet.put(entryKey, entryValue);
-        when(asyncDataChangeEvent.getCreatedData()).thenReturn(entrySet);
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(entryValue).when(mockModification).getDataAfter();
 
-        listener.onDataChanged(asyncDataChangeEvent);
+        listener.onDataTreeChanged(changeEvent);
         verify(rwTx).submit();
     }
 
     @Test
     public void onDataChangeTestUpdatedDataSubmit() {
-        Map<InstanceIdentifier<?>, DataObject> entrySet = new HashMap<InstanceIdentifier<?>, DataObject>();
-        entrySet.put(entryKey, entryValue);
-        when(asyncDataChangeEvent.getUpdatedData()).thenReturn(entrySet);
-        when(asyncDataChangeEvent.getOriginalData()).thenReturn(entrySet);
+        doReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED).when(mockModification).getModificationType();
+        doReturn(entryValue).when(mockModification).getDataBefore();
+        doReturn(entryValue).when(mockModification).getDataAfter();
 
-        listener.onDataChanged(asyncDataChangeEvent);
+        listener.onDataTreeChanged(changeEvent);
         verify(rwTx).submit();
     }
 
     @Test
     public void onDataChangeTestRemovedPaths() {
-        Set<InstanceIdentifier<?>> removedPaths = new HashSet<InstanceIdentifier<?>>();
-        removedPaths.add(entryKey);
-        when(asyncDataChangeEvent.getRemovedPaths()).thenReturn(removedPaths);
-
-        Map<InstanceIdentifier<?>, DataObject> entrySet = new HashMap<InstanceIdentifier<?>, DataObject>();
-        entrySet.put(entryKey, entryValue);
-        when(asyncDataChangeEvent.getOriginalData()).thenReturn(entrySet);
+        doReturn(DataObjectModification.ModificationType.DELETE).when(mockModification).getModificationType();
+        doReturn(entryValue).when(mockModification).getDataBefore();
         when(ofOverlayEp.getNodeConnectorId()).thenReturn(childNodeConnectorId);
 
-        listener.onDataChanged(asyncDataChangeEvent);
+        listener.onDataTreeChanged(changeEvent);
         verify(rwTx).submit();
     }
 }
index c5f70217784b701171f853f0919c4c968f84dbaf..74c91e96a96d25b9ed9347f38b94b8f4a0378b74 100644 (file)
@@ -9,21 +9,20 @@
 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
+import java.util.Collection;
+import java.util.Collections;
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-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.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.common.api.data.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
@@ -31,7 +30,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class FlowCapableNodeListenerTest {
@@ -40,7 +38,10 @@ public class FlowCapableNodeListenerTest {
 
     private DataBroker dataProvider;
     private SwitchManager switchManager;
-    private ListenerRegistration<DataChangeListener> listenerRegistration;
+    private ListenerRegistration<?> listenerRegistration;
+    private DataTreeModification<FlowCapableNode> mockDataTreeModification;
+    private DataObjectModification<FlowCapableNode> mockModification;
+    private Collection<DataTreeModification<FlowCapableNode>> changeEvent;
 
     @SuppressWarnings("unchecked")
     @Before
@@ -48,11 +49,15 @@ public class FlowCapableNodeListenerTest {
         dataProvider = mock(DataBroker.class);
         switchManager = mock(SwitchManager.class);
         listenerRegistration = mock(ListenerRegistration.class);
-        when(
-                dataProvider.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
-                        any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(listenerRegistration);
+        when(dataProvider.registerDataTreeChangeListener(any(DataTreeIdentifier.class),
+                any(DataTreeChangeListener.class))).thenReturn(listenerRegistration);
 
         listener = new FlowCapableNodeListener(dataProvider, switchManager);
+
+        mockDataTreeModification = mock(DataTreeModification.class);
+        mockModification = mock(DataObjectModification.class);
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+        changeEvent = Collections.singletonList(mockDataTreeModification);
     }
 
     @Test
@@ -64,7 +69,6 @@ public class FlowCapableNodeListenerTest {
     @SuppressWarnings("unchecked")
     @Test
     public void onDataChangeTestCreatedData() {
-        AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change = mock(AsyncDataChangeEvent.class);
         FlowCapableNode entryValue = mock(FlowCapableNode.class);
         NodeId childNodeId = mock(NodeId.class);
 
@@ -73,18 +77,18 @@ public class FlowCapableNodeListenerTest {
             .augmentation(FlowCapableNode.class)
             .build();
 
-        Map<InstanceIdentifier<?>, DataObject> entrySet = new HashMap<InstanceIdentifier<?>, DataObject>();
-        entrySet.put(entryKey, entryValue);
-        when(change.getCreatedData()).thenReturn(entrySet);
+        doReturn(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, entryKey)).when(mockDataTreeModification)
+                .getRootPath();
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(entryValue).when(mockModification).getDataAfter();
 
-        listener.onDataChanged(change);
+        listener.onDataTreeChanged(changeEvent);
         verify(switchManager).updateSwitch(childNodeId, entryValue);
     }
 
     @SuppressWarnings("unchecked")
     @Test
     public void onDataChangeTestUpdatedData() {
-        AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change = mock(AsyncDataChangeEvent.class);
         FlowCapableNode entryValue = mock(FlowCapableNode.class);
         NodeId childNodeId = mock(NodeId.class);
 
@@ -93,18 +97,18 @@ public class FlowCapableNodeListenerTest {
             .augmentation(FlowCapableNode.class)
             .build();
 
-        Map<InstanceIdentifier<?>, DataObject> entrySet = new HashMap<InstanceIdentifier<?>, DataObject>();
-        entrySet.put(entryKey, entryValue);
-        when(change.getUpdatedData()).thenReturn(entrySet);
+        doReturn(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, entryKey)).when(mockDataTreeModification)
+                .getRootPath();
+        doReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED).when(mockModification).getModificationType();
+        doReturn(entryValue).when(mockModification).getDataAfter();
 
-        listener.onDataChanged(change);
+        listener.onDataTreeChanged(changeEvent);
         verify(switchManager).updateSwitch(childNodeId, entryValue);
     }
 
     @SuppressWarnings("unchecked")
     @Test
     public void onDataChangeTestRemovedPaths() {
-        AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change = mock(AsyncDataChangeEvent.class);
         NodeId childNodeId = mock(NodeId.class);
 
         InstanceIdentifier<FlowCapableNode> entryKey = InstanceIdentifier.builder(Nodes.class)
@@ -112,11 +116,11 @@ public class FlowCapableNodeListenerTest {
             .augmentation(FlowCapableNode.class)
             .build();
 
-        Set<InstanceIdentifier<?>> removedPaths = new HashSet<InstanceIdentifier<?>>();
-        removedPaths.add(entryKey);
-        when(change.getRemovedPaths()).thenReturn(removedPaths);
+        doReturn(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, entryKey)).when(mockDataTreeModification)
+                .getRootPath();
+        doReturn(DataObjectModification.ModificationType.DELETE).when(mockModification).getModificationType();
 
-        listener.onDataChanged(change);
+        listener.onDataTreeChanged(changeEvent);
         verify(switchManager).updateSwitch(childNodeId, null);
     }
 
index 20481a6e2a283ac32a0534e4ece66fba396981e9..ee2ee1512e6d038be0b809b71b6e9aa8d0c4b96d 100644 (file)
@@ -9,21 +9,20 @@
 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
+import java.util.Collection;
+import java.util.Collections;
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-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.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.common.api.data.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
@@ -31,7 +30,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class OfOverlayNodeListenerTest {
@@ -40,12 +38,13 @@ public class OfOverlayNodeListenerTest {
 
     private DataBroker dataProvider;
     private SwitchManager switchManager;
-    private ListenerRegistration<DataChangeListener> listenerRegistration;
+    private ListenerRegistration<?> listenerRegistration;
 
-    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
     private OfOverlayNodeConfig entryValue;
     private NodeId childNodeId;
     private InstanceIdentifier<OfOverlayNodeConfig> entryKey;
+    private DataObjectModification<OfOverlayNodeConfig> mockModification;
+    private Collection<DataTreeModification<OfOverlayNodeConfig>> changeEvent;
 
     @SuppressWarnings("unchecked")
     @Before
@@ -53,11 +52,9 @@ public class OfOverlayNodeListenerTest {
         dataProvider = mock(DataBroker.class);
         switchManager = mock(SwitchManager.class);
         listenerRegistration = mock(ListenerRegistration.class);
-        when(
-                dataProvider.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
-                        any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(listenerRegistration);
+        when(dataProvider.registerDataTreeChangeListener(any(DataTreeIdentifier.class),
+                any(DataTreeChangeListener.class))).thenReturn(listenerRegistration);
 
-        change = mock(AsyncDataChangeEvent.class);
         entryValue = mock(OfOverlayNodeConfig.class);
         childNodeId = mock(NodeId.class);
         entryKey = InstanceIdentifier.builder(Nodes.class)
@@ -66,6 +63,13 @@ public class OfOverlayNodeListenerTest {
             .build();
 
         listener = new OfOverlayNodeListener(dataProvider, switchManager);
+
+        DataTreeModification<OfOverlayNodeConfig> mockDataTreeModification = mock(DataTreeModification.class);
+        mockModification = mock(DataObjectModification.class);
+        doReturn(mockModification).when(mockDataTreeModification).getRootNode();
+        doReturn(new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, entryKey))
+            .when(mockDataTreeModification).getRootPath();
+        changeEvent = Collections.singletonList(mockDataTreeModification);
     }
 
     @Test
@@ -76,31 +80,28 @@ public class OfOverlayNodeListenerTest {
 
     @Test
     public void onDataChangedTestCreatedData() {
-        Map<InstanceIdentifier<?>, DataObject> entrySet = new HashMap<InstanceIdentifier<?>, DataObject>();
-        entrySet.put(entryKey, entryValue);
-        when(change.getCreatedData()).thenReturn(entrySet);
+        doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
+        doReturn(entryValue).when(mockModification).getDataAfter();
 
-        listener.onDataChanged(change);
+        listener.onDataTreeChanged(changeEvent);
         verify(switchManager).updateSwitchConfig(childNodeId, entryValue);
     }
 
     @Test
     public void onDataChangedTestUpdatedData() {
-        Map<InstanceIdentifier<?>, DataObject> entrySet = new HashMap<InstanceIdentifier<?>, DataObject>();
-        entrySet.put(entryKey, entryValue);
-        when(change.getUpdatedData()).thenReturn(entrySet);
+        doReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED).when(mockModification).getModificationType();
+        doReturn(entryValue).when(mockModification).getDataAfter();
 
-        listener.onDataChanged(change);
+        listener.onDataTreeChanged(changeEvent);
         verify(switchManager).updateSwitchConfig(childNodeId, entryValue);
     }
 
     @Test
     public void onDataChangedTestRemovedPaths() {
-        Set<InstanceIdentifier<?>> removedPaths = new HashSet<InstanceIdentifier<?>>();
-        removedPaths.add(entryKey);
-        when(change.getRemovedPaths()).thenReturn(removedPaths);
+        doReturn(DataObjectModification.ModificationType.DELETE).when(mockModification).getModificationType();
+        doReturn(entryValue).when(mockModification).getDataBefore();
 
-        listener.onDataChanged(change);
+        listener.onDataTreeChanged(changeEvent);
         verify(switchManager).updateSwitchConfig(childNodeId, null);
     }
 }
diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/test/DataChangeListenerTester.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/test/DataChangeListenerTester.java
deleted file mode 100755 (executable)
index 6621640..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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.groupbasedpolicy.renderer.ofoverlay.test;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
-import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.EndpointManager;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-public class DataChangeListenerTester {
-
-    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changeMock;
-    private DataChangeListener listener;
-
-    private Map<InstanceIdentifier<?>, DataObject> testData;
-    private Set<InstanceIdentifier<?>> removedPaths;
-
-    @SuppressWarnings("unchecked")
-    public DataChangeListenerTester(DataChangeListener listener) {
-        changeMock = mock(AsyncDataChangeEvent.class);
-        testData = new HashMap<>();
-        removedPaths = new HashSet<>();
-
-        this.listener = listener;
-
-        when(changeMock.getCreatedData()).thenReturn(testData);
-        when(changeMock.getOriginalData()).thenReturn(testData);
-        when(changeMock.getUpdatedData()).thenReturn(testData);
-        when(changeMock.getRemovedPaths()).thenReturn(removedPaths);
-    }
-
-    public DataChangeListenerTester setDataObject(InstanceIdentifier<DataObject> iid, DataObject dataObject){
-        testData.clear();
-        return addDataObject(iid, dataObject);
-    }
-
-    public DataChangeListenerTester addDataObject(InstanceIdentifier<DataObject> iid, DataObject dataObject){
-        testData.put(iid, dataObject);
-        return this;
-    }
-
-    public DataChangeListenerTester setRemovedPath(InstanceIdentifier<DataObject> iid){
-        removedPaths.clear();
-        return addRemovedPath(iid);
-    }
-
-    public DataChangeListenerTester addRemovedPath(InstanceIdentifier<DataObject> iid){
-        removedPaths.add(iid);
-        return this;
-    }
-
-    public void callOnDataChanged(){
-        listener.onDataChanged(changeMock);
-    }
-}