From ffdf4f5c7018a0bc5b0c343e353e1a4af1923a34 Mon Sep 17 00:00:00 2001 From: Tom Pantelis Date: Thu, 31 Aug 2017 19:19:39 -0400 Subject: [PATCH] Convert DataChangeListeners to DataTreeChangeListeners The DataChangeListener API has been deprecated for a couple releases with possible removal in Oxygen. Change-Id: I28c804d85d21229f235e1451a51211493299c778 Signed-off-by: Tom Pantelis --- .../TerminationPointDataChangeListener.java | 94 +++++------ ...erminationPointDataChangeListenerTest.java | 70 +++++---- .../faas/FaasContractManagerListener.java | 103 +++++------- .../faas/FaasEndpointManagerListener.java | 140 +++++++---------- .../renderer/faas/FaasPolicyManager.java | 146 ++++++++---------- .../faas/FaasSubnetManagerListener.java | 101 +++++------- .../faas/FaasTenantManagerListener.java | 56 +++---- .../FaasContractManagerListenerCovrgTest.java | 38 ++--- .../faas/FaasContractManagerListenerTest.java | 64 +++----- .../FaasEndpointManagerListenerCovrgTest.java | 120 ++++++-------- .../faas/FaasEndpointManagerListenerTest.java | 74 +++++---- .../faas/FaasPolicyManagerCovrgTest.java | 55 +++---- .../renderer/faas/FaasPolicyManagerTest.java | 79 +++------- .../renderer/faas/FaasRendererCovrgTest.java | 7 + .../FaasSubnetManagerListenerCovrgTest.java | 39 ++--- .../faas/FaasSubnetManagerListenerTest.java | 65 +++----- .../FaasTenantManagerListenerCovrgTest.java | 62 +++----- .../faas/MockFaasContractManagerListener.java | 10 +- .../faas/MockFaasEndpointManagerListener.java | 10 +- .../renderer/faas/MockFaasPolicyManager.java | 24 ++- .../faas/MockFaasSubnetManagerListener.java | 10 +- .../faas/test/DataChangeListenerTester.java | 73 --------- .../endpoint/EndpointListenerTest.java | 5 - .../renderer/ofoverlay/OFOverlayRenderer.java | 95 +++++++----- .../renderer/ofoverlay/SfcManager.java | 133 ++++++++-------- .../endpoint/EndpointManagerListener.java | 102 ++++++------ .../FlowCapableNodeConnectorListener.java | 141 ++++++++--------- .../node/FlowCapableNodeListener.java | 58 ++++--- .../ofoverlay/node/OfOverlayNodeListener.java | 62 ++++---- .../ofoverlay/OFOverlayRendererTest.java | 17 +- .../renderer/ofoverlay/SfcManagerTest.java | 63 ++++---- .../endpoint/EndpointManagerListenerTest.java | 142 +++++++++++++---- .../endpoint/EndpointManagerTest.java | 25 +-- .../FlowCapableNodeConnectorListenerTest.java | 66 ++++---- .../node/FlowCapableNodeListenerTest.java | 60 +++---- .../node/OfOverlayNodeListenerTest.java | 55 +++---- .../test/DataChangeListenerTester.java | 70 --------- 37 files changed, 1123 insertions(+), 1411 deletions(-) delete mode 100644 renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/test/DataChangeListenerTester.java delete mode 100755 renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/test/DataChangeListenerTester.java diff --git a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListener.java b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListener.java index 7fd0cc20b..cb287fc2c 100755 --- a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListener.java +++ b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListener.java @@ -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, + AutoCloseable { private static final String NEUTRON_EXTERNAL_ID_KEY = "iface-id"; - private final ListenerRegistration 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 createSupportedTunnelsList() { - List required = new ArrayList(); + List 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, DataObject> change) { - - /* - * TerminationPoint notifications with OVSDB augmentations - * vSwitch ports. Iterate through the list of new ports. - */ - for (Entry, DataObject> entry : change.getCreatedData().entrySet()) { - if (entry.getValue() instanceof OvsdbTerminationPointAugmentation) { - OvsdbTerminationPointAugmentation ovsdbTp = (OvsdbTerminationPointAugmentation) entry.getValue(); - @SuppressWarnings("unchecked") - InstanceIdentifier ovsdbTpIid = - (InstanceIdentifier) entry.getKey(); - OvsdbBridgeAugmentation ovsdbBridge = getOvsdbBridgeFromTerminationPoint(ovsdbTpIid, dataBroker); - nodeIdByTerminPoint.put(ovsdbTpIid, - new NodeId(getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker))); - processOvsdbBridge(ovsdbBridge, ovsdbTp, ovsdbTpIid); - } - } - - /* - * Updates - */ - for (Entry, DataObject> entry : change.getUpdatedData().entrySet()) { - if (entry.getValue() instanceof OvsdbTerminationPointAugmentation) { - OvsdbTerminationPointAugmentation ovsdbTp = (OvsdbTerminationPointAugmentation) entry.getValue(); - @SuppressWarnings("unchecked") - InstanceIdentifier ovsdbTpIid = - (InstanceIdentifier) 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 ovsdbTpIid = - (InstanceIdentifier) iid; - processRemovedTp(nodeIdByTerminPoint.get(ovsdbTpIid), ovsdbTp, ovsdbTpIid); + public void onDataTreeChanged(Collection> changes) { + for (DataTreeModification change: changes) { + DataObjectModification rootNode = change.getRootNode(); + InstanceIdentifier 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(); diff --git a/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListenerTest.java b/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListenerTest.java index 5d6ffa792..e6bb32572 100644 --- a/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListenerTest.java +++ b/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListenerTest.java @@ -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 registration; - private AsyncDataChangeEvent, DataObject> change; + private ListenerRegistration registration; - private Map, DataObject> dataMap; - private Set> dataSet; + private DataObjectModification mockModification; + private Collection> changeEvent; private Node node; private CheckedFuture, 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 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>(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 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(); } } diff --git a/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListener.java b/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListener.java index f8f12fc98..7b7386046 100644 --- a/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListener.java +++ b/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListener.java @@ -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 { private static final Logger LOG = LoggerFactory.getLogger(FaasContractManagerListener.class); - private ConcurrentHashMap mappedContracts = new ConcurrentHashMap<>(); - private final ScheduledExecutorService executor; + private final ConcurrentHashMap 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, DataObject> change) { - executor.execute(new Runnable() { - - public void run() { - executeEvent(change); - } - }); + public void onDataTreeChanged(Collection> changes) { + executor.execute(() -> executeEvent(changes)); } - @VisibleForTesting - void executeEvent(final AsyncDataChangeEvent, 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, DataObject> dao = change.getUpdatedData(); - for (Map.Entry, 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 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> changes) { + for (DataTreeModification change: changes) { + DataObjectModification 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 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() diff --git a/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListener.java b/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListener.java index 06116c802..0c08e9c65 100644 --- a/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListener.java +++ b/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListener.java @@ -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 registerListener; + private final List> 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, DataObject> change) { - executor.execute(new Runnable() { - - public void run() { - executeEvent(change); + private void onEndpointChanged(Collection> changes) { + for (DataTreeModification change: changes) { + DataObjectModification 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, 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, DataObject> dao = change.getUpdatedData(); - for (Map.Entry, 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> changes) { + for (DataTreeModification change: changes) { + DataObjectModification 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; } } } diff --git a/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManager.java b/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManager.java index 2dc43f4ac..9ac9d8a86 100644 --- a/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManager.java +++ b/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManager.java @@ -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, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(FaasPolicyManager.class); private static final RendererName rendererName = new RendererName("faas"); - private final ListenerRegistration registerListener; - private final ScheduledExecutorService executor; + private final ListenerRegistration registerListener; + private final Executor executor; private final DataBroker dataProvider; final Map, List> epgSubnetsMap = new HashMap<>(); private final ConcurrentHashMap mappedTenants = new ConcurrentHashMap<>(); - final ConcurrentHashMap>> registeredTenants = + final ConcurrentHashMap>> 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> list : registeredTenants.values()) { + for (ArrayList> 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, DataObject> change) { - executor.execute(new Runnable() { - - public void run() { - executeEvent(change); - } - }); + public void onDataTreeChanged(Collection> changes) { + executor.execute(() -> executeEvent(changes)); } - private void executeEvent(final AsyncDataChangeEvent, 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, DataObject> d = change.getUpdatedData(); - for (Map.Entry, 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> changes) { + for (DataTreeModification change: changes) { + DataObjectModification 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> list = new ArrayList<>(); - ListenerRegistration reg; + ArrayList> 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> list = registeredTenants.remove(tenantId); + ArrayList> list = registeredTenants.remove(tenantId); if (list != null) { - for (ListenerRegistration 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; diff --git a/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListener.java b/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListener.java index c2afcc945..0d97b3bb4 100644 --- a/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListener.java +++ b/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListener.java @@ -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 { private static final Logger LOG = LoggerFactory.getLogger(FaasSubnetManagerListener.class); - private ConcurrentHashMap mappedSubnets = new ConcurrentHashMap<>(); - private final ScheduledExecutorService executor; + private final ConcurrentHashMap 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, DataObject> change) { - executor.execute(new Runnable() { - - public void run() { - executeEvent(change); - } - }); + public void onDataTreeChanged(Collection> changes) { + executor.execute(() -> executeEvent(changes)); } - @VisibleForTesting - void executeEvent(final AsyncDataChangeEvent, 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, DataObject> dao = change.getUpdatedData(); - for (Map.Entry, 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 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> changes) { + for (DataTreeModification change: changes) { + DataObjectModification 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 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; } - } diff --git a/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasTenantManagerListener.java b/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasTenantManagerListener.java index bb6f7408c..f2b3bb7d4 100644 --- a/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasTenantManagerListener.java +++ b/renderers/faas/src/main/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasTenantManagerListener.java @@ -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 { 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, DataObject> change) { - executor.execute(new Runnable() { - - public void run() { - executeEvent(change); - } - }); + public void onDataTreeChanged(final Collection> changes) { + executor.execute(() -> executeEvent(changes)); } - @VisibleForTesting - void executeEvent(final AsyncDataChangeEvent, 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> changes) { + for (DataTreeModification change: changes) { + DataObjectModification 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; } } } diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListenerCovrgTest.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListenerCovrgTest.java index 2d4e94460..887b71081 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListenerCovrgTest.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListenerCovrgTest.java @@ -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 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 mockDataTreeModification = mock(DataTreeModification.class); + DataObjectModification 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 diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListenerTest.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListenerTest.java index ea345afa1..3049fabc8 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListenerTest.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasContractManagerListenerTest.java @@ -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 contractId; - private AsyncDataChangeEvent, 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 checkedFuture = mock(CheckedFuture.class); when(writeTransaction.submit()).thenReturn(checkedFuture); - contractManagerListener = new MockFaasContractManagerListener(dataProvider, gbpTenantId, faasTenantId, executor); - - Set> 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, 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 mockDataTreeModification = mock(DataTreeModification.class); + DataObjectModification 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(); diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListenerCovrgTest.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListenerCovrgTest.java index 517766802..55baa50eb 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListenerCovrgTest.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListenerCovrgTest.java @@ -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 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 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, ReadFailedException> futureMappedEndpoint = mock(CheckedFuture.class); - Optional 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 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 Collection> newMockDataTreeModification(T dataBefore, + T dataAfter, DataObjectModification.ModificationType type) { + DataTreeModification mockDataTreeModification = mock(DataTreeModification.class); + DataObjectModification 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); } - } diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListenerTest.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListenerTest.java index 1010f6c4c..c3edecce9 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListenerTest.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasEndpointManagerListenerTest.java @@ -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 endpointId; - private AsyncDataChangeEvent, 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 checkedFuture = mock(CheckedFuture.class); when(writeTransaction.submit()).thenReturn(checkedFuture); - policyManager = new MockFaasPolicyManager(dataProvider, executor); - endpointManagerListener = new MockFaasEndpointManagerListener(policyManager, dataProvider, executor); - Set> 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, 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 dtclCaptor = ArgumentCaptor.forClass(DataTreeChangeListener.class); + verify(dataProvider).registerDataTreeChangeListener(eq(new DataTreeIdentifier<>( + LogicalDatastoreType.OPERATIONAL, IidFactory.endpointsIidWildcard().child(Endpoint.class))), + dtclCaptor.capture()); + + DataTreeModification mockDataTreeModification = mock(DataTreeModification.class); + DataObjectModification 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 l3Addrs = new ArrayList(); + List l3Addrs = new ArrayList<>(); L3AddressBuilder addb = new L3AddressBuilder(); addb.setIpAddress(new IpAddress(new String("10.0.0.2").toCharArray())); addb.setL3Context(new L3ContextId("L3Context")); diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManagerCovrgTest.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManagerCovrgTest.java index 4254dfcc9..b5179f45f 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManagerCovrgTest.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManagerCovrgTest.java @@ -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 policyId; - private AsyncDataChangeEvent, 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 futureVoid = mock(CheckedFuture.class); when(writeTransaction.submit()).thenReturn(futureVoid); - - Set> 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(); } diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManagerTest.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManagerTest.java index 77f086924..506753544 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManagerTest.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasPolicyManagerTest.java @@ -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 policyId; - private AsyncDataChangeEvent, 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 checkedFuture = mock(CheckedFuture.class); when(writeTransaction.submit()).thenReturn(checkedFuture); - - Set> 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, 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 mockDataTreeModification = mock(DataTreeModification.class); + DataObjectModification 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, 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 mockDataTreeModification = mock(DataTreeModification.class); + DataObjectModification 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)); diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasRendererCovrgTest.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasRendererCovrgTest.java index 0f3f05269..23e78bd70 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasRendererCovrgTest.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasRendererCovrgTest.java @@ -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); diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListenerCovrgTest.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListenerCovrgTest.java index 755b10d6f..ca9e9cb61 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListenerCovrgTest.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListenerCovrgTest.java @@ -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 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 mockDataTreeModification = mock(DataTreeModification.class); + DataObjectModification 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 diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListenerTest.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListenerTest.java index cd82d2ad6..25c17cda0 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListenerTest.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasSubnetManagerListenerTest.java @@ -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 subnetId; - private AsyncDataChangeEvent, 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 checkedFuture = mock(CheckedFuture.class); when(writeTransaction.submit()).thenReturn(checkedFuture); - subnetManagerListener = new MockFaasSubnetManagerListener(dataProvider, gbpTenantId, faasTenantId, executor); - - Set> 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 captor = ArgumentCaptor.forClass(Subnet.class); + ArgumentCaptor 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, DataObject> testData = new HashMap<>(); - testData.put(subnetId, testSubnet); - when(change.getCreatedData()).thenReturn(testData); - when(change.getOriginalData()).thenReturn(testData); - when(change.getUpdatedData()).thenReturn(testData); + + DataTreeModification mockDataTreeModification = mock(DataTreeModification.class); + DataObjectModification 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(); diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasTenantManagerListenerCovrgTest.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasTenantManagerListenerCovrgTest.java index 020c700b8..2219c7e4d 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasTenantManagerListenerCovrgTest.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/FaasTenantManagerListenerCovrgTest.java @@ -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 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 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 mockDataTreeModification = mock(DataTreeModification.class); + DataObjectModification 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); } } diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasContractManagerListener.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasContractManagerListener.java index 66dbe7dbf..ebae29300 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasContractManagerListener.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasContractManagerListener.java @@ -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; diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasEndpointManagerListener.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasEndpointManagerListener.java index 5025628c4..7abd24f88 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasEndpointManagerListener.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasEndpointManagerListener.java @@ -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)); + } } // ******************************************************* diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasPolicyManager.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasPolicyManager.java index 5c8138f85..628d31f5e 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasPolicyManager.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasPolicyManager.java @@ -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 testEndpointGroups = new HashMap<>(); - private Map testSubnets = new HashMap<>(); - private Map testL2FloodDomains = new HashMap<>(); - private Map testL2BridgeDomains = new HashMap<>(); - private Map testL3Contextes = new HashMap<>(); - private Map testSecIdPerContract = new HashMap<>(); - private Map testFaasTenantId = new HashMap<>(); + private final Map testEndpointGroups = new HashMap<>(); + private final Map testSubnets = new HashMap<>(); + private final Map testL2FloodDomains = new HashMap<>(); + private final Map testL2BridgeDomains = new HashMap<>(); + private final Map testL3Contextes = new HashMap<>(); + private final Map testSecIdPerContract = new HashMap<>(); + private final Map 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>()); + registeredTenants.putIfAbsent(tenantId, new ArrayList>()); } @Override diff --git a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasSubnetManagerListener.java b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasSubnetManagerListener.java index 7a4831329..ab0abcbad 100644 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasSubnetManagerListener.java +++ b/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/MockFaasSubnetManagerListener.java @@ -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 index 5961d134e..000000000 --- a/renderers/faas/src/test/java/org/opendaylight/groupbasedpolicy/renderer/faas/test/DataChangeListenerTester.java +++ /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, DataObject> changeMock; - private DataChangeListener listener; - - private Map, DataObject> testData; - private Set> 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, DataObject> getChangeMock() { - return changeMock; - } - - public DataChangeListenerTester setDataObject(InstanceIdentifier iid, DataObject dataObject){ - testData.clear(); - return addDataObject(iid, dataObject); - } - - public DataChangeListenerTester addDataObject(InstanceIdentifier iid, DataObject dataObject){ - testData.put(iid, dataObject); - return this; - } - - public DataChangeListenerTester setRemovedPath(InstanceIdentifier iid){ - removedPaths.clear(); - return addRemovedPath(iid); - } - - public DataChangeListenerTester addRemovedPath(InstanceIdentifier iid){ - removedPaths.add(iid); - return this; - } - - public void callOnDataChanged(){ - listener.onDataChanged(changeMock); - } - -} diff --git a/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/endpoint/EndpointListenerTest.java b/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/endpoint/EndpointListenerTest.java index 77285714c..6e59280a5 100644 --- a/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/endpoint/EndpointListenerTest.java +++ b/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/endpoint/EndpointListenerTest.java @@ -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 registerListener; @Mock Collection> changes; diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRenderer.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRenderer.java index 859d9b00d..ae27609a0 100755 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRenderer.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRenderer.java @@ -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 { 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 configIid = InstanceIdentifier.builder(OfOverlayConfig.class).build(); - ListenerRegistration 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, DataObject> change) { - OfOverlayConfig config; + public void onDataTreeChanged(Collection> changes) { try { - for (Entry, 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, 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 change: changes) { + DataObjectModification 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 readConfig() { diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SfcManager.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SfcManager.java index 83a7dac5a..9da882ef3 100644 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SfcManager.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SfcManager.java @@ -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 { private static final Logger LOG = LoggerFactory.getLogger(SfcManager.class); private final DataBroker dataBroker; private final ExecutorService executor; private final InstanceIdentifier allActionInstancesIid; - private final ListenerRegistration 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(); + 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 getSfcSourceIps() { - if (rspMap.isEmpty()) return null; + if (rspMap.isEmpty()) { + return null; + } - Set ipAddresses = new HashSet(); + Set 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, 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, 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> changes) { + for (DataTreeModification change: changes) { + DataObjectModification 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 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 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(); + } } } diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerListener.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerListener.java index 0eae16cd1..e1b839d18 100644 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerListener.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerListener.java @@ -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 registerListener; + private final List> 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, 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, DataObject> dao = change.getUpdatedData(); - for (Map.Entry, 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> changes) { + for (DataTreeModification change: changes) { + DataObjectModification 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> changes) { + for (DataTreeModification change: changes) { + DataObjectModification 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(); + } } } diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeConnectorListener.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeConnectorListener.java index 0f021ded0..5e538ab5b 100644 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeConnectorListener.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeConnectorListener.java @@ -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, + 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 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, DataObject> change) { + public void onDataTreeChanged(Collection> changes) { ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction(); //endpoint and endpoint L3 maps @@ -80,70 +80,60 @@ public class FlowCapableNodeConnectorListener implements DataChangeListener, Aut Map l3EpWithOfOverlayAugByPortName = readL3EpsWithOfOverlayAugByPortName(rwTx); boolean isDataPutToTx = false; - for (Entry, DataObject> fcncEntry : change.getCreatedData().entrySet()) { - if (FlowCapableNodeConnector.class.equals(fcncEntry.getKey().getTargetType())) { - InstanceIdentifier 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, DataObject> fcncEntry : change.getUpdatedData().entrySet()) { - if (FlowCapableNodeConnector.class.equals(fcncEntry.getKey().getTargetType())) { - InstanceIdentifier 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 change: changes) { + DataObjectModification rootNode = change.getRootNode(); + InstanceIdentifier 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 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(); } } - } diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeListener.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeListener.java index 1114e319d..a5aef57b0 100644 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeListener.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeListener.java @@ -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, 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 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, DataObject> change) { - for (Entry, 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, 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> changes) { + for (DataTreeModification change: changes) { + DataObjectModification 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; } } } diff --git a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/OfOverlayNodeListener.java b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/OfOverlayNodeListener.java index 0013904c1..29fc7f90f 100644 --- a/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/OfOverlayNodeListener.java +++ b/renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/OfOverlayNodeListener.java @@ -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, 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 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, DataObject> change) { - for (Entry, 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, 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> changes) { + for (DataTreeModification change: changes) { + DataObjectModification 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(); } } - } diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRendererTest.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRendererTest.java index e77b64fd9..fdb65dbee 100755 --- a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRendererTest.java +++ b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRendererTest.java @@ -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, ReadFailedException> future; - private ListenerRegistration 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 diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SfcManagerTest.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SfcManagerTest.java index 3a17c3187..689561b39 100644 --- a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SfcManagerTest.java +++ b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/SfcManagerTest.java @@ -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 actionListener; + private ListenerRegistration actionListener; - private AsyncDataChangeEvent, DataObject> actionInstanceNotification; - private InstanceIdentifier pathIdentifier; + private DataObjectModification mockModification; + private Collection> changeEvent; private ActionInstance dataObject; - private HashMap, DataObject> dataMap; - private Set> 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, DataObject>(); - dataMap.put(pathIdentifier, dataObject); - dataSet = new HashSet>(Arrays.asList(pathIdentifier)); + doReturn(actionListener).when(dataBroker).registerDataTreeChangeListener( + any(DataTreeIdentifier.class), any(DataTreeChangeListener.class)); manager = new SfcManager(dataBroker, rpcRegistry, executor); + + DataTreeModification 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)); } } diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerListenerTest.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerListenerTest.java index db2ecf178..345c60878 100755 --- a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerListenerTest.java +++ b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerListenerTest.java @@ -8,72 +8,158 @@ 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 endpointId; - private AsyncDataChangeEvent, 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 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 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 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 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 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 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 Collection> newMockDataTreeModification(T dataBefore, + T dataAfter, DataObjectModification.ModificationType type) { + DataTreeModification mockDataTreeModification = mock(DataTreeModification.class); + DataObjectModification 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); + } } diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerTest.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerTest.java index 22e434f35..6669d4f5b 100644 --- a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerTest.java +++ b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/endpoint/EndpointManagerTest.java @@ -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 listenerReg; private EndpointListener endpointListener; private Endpoint endpoint1; private Endpoint endpoint2; @@ -118,11 +110,8 @@ public class EndpointManagerTest { when(writeTransaction.submit()).thenReturn(checkedFutureWrite); BindingAwareBroker.RpcRegistration 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, DataObject> change = mock(AsyncDataChangeEvent.class); - InstanceIdentifier endpointId = mock(InstanceIdentifier.class); - Set> 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(); } // ************** diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeConnectorListenerTest.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeConnectorListenerTest.java index e88d03b3b..febc4d209 100644 --- a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeConnectorListenerTest.java +++ b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeConnectorListenerTest.java @@ -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 listenerRegistration; - private AsyncDataChangeEvent, 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 mockModification; + private Collection> 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 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, DataObject> entrySet = new HashMap, 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, DataObject> entrySet = new HashMap, 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> removedPaths = new HashSet>(); - removedPaths.add(entryKey); - when(asyncDataChangeEvent.getRemovedPaths()).thenReturn(removedPaths); - - Map, DataObject> entrySet = new HashMap, 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(); } } diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeListenerTest.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeListenerTest.java index c5f702177..74c91e96a 100644 --- a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeListenerTest.java +++ b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/FlowCapableNodeListenerTest.java @@ -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 listenerRegistration; + private ListenerRegistration listenerRegistration; + private DataTreeModification mockDataTreeModification; + private DataObjectModification mockModification; + private Collection> 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, 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, DataObject> entrySet = new HashMap, 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, 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, DataObject> entrySet = new HashMap, 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, DataObject> change = mock(AsyncDataChangeEvent.class); NodeId childNodeId = mock(NodeId.class); InstanceIdentifier entryKey = InstanceIdentifier.builder(Nodes.class) @@ -112,11 +116,11 @@ public class FlowCapableNodeListenerTest { .augmentation(FlowCapableNode.class) .build(); - Set> removedPaths = new HashSet>(); - 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); } diff --git a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/OfOverlayNodeListenerTest.java b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/OfOverlayNodeListenerTest.java index 20481a6e2..ee2ee1512 100644 --- a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/OfOverlayNodeListenerTest.java +++ b/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/node/OfOverlayNodeListenerTest.java @@ -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 listenerRegistration; + private ListenerRegistration listenerRegistration; - private AsyncDataChangeEvent, DataObject> change; private OfOverlayNodeConfig entryValue; private NodeId childNodeId; private InstanceIdentifier entryKey; + private DataObjectModification mockModification; + private Collection> 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 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, DataObject> entrySet = new HashMap, 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, DataObject> entrySet = new HashMap, 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> removedPaths = new HashSet>(); - 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 index 66216408f..000000000 --- a/renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/test/DataChangeListenerTester.java +++ /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, DataObject> changeMock; - private DataChangeListener listener; - - private Map, DataObject> testData; - private Set> 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 iid, DataObject dataObject){ - testData.clear(); - return addDataObject(iid, dataObject); - } - - public DataChangeListenerTester addDataObject(InstanceIdentifier iid, DataObject dataObject){ - testData.put(iid, dataObject); - return this; - } - - public DataChangeListenerTester setRemovedPath(InstanceIdentifier iid){ - removedPaths.clear(); - return addRemovedPath(iid); - } - - public DataChangeListenerTester addRemovedPath(InstanceIdentifier iid){ - removedPaths.add(iid); - return this; - } - - public void callOnDataChanged(){ - listener.onDataChanged(changeMock); - } -} -- 2.36.6