Bug 5212 - Neutron-mapper has dependency on Ofoverlay renderer
[groupbasedpolicy.git] / neutron-ovsdb / src / main / java / org / opendaylight / groupbasedpolicy / neutron / ovsdb / TerminationPointDataChangeListener.java
index a078e2c6ab52113a10b8b6660186a44d47fa2143..5339e9e1b4604de35d982ba9a34f23edac59a652 100755 (executable)
@@ -9,8 +9,6 @@
 package org.opendaylight.groupbasedpolicy.neutron.ovsdb;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.NodeDataChangeListener.getProviderMapping;
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.NodeDataChangeListener.processNodeNotification;
 import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.EndpointHelper.lookupEndpoint;
 import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.EndpointHelper.updateEndpointRemoveLocation;
 import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.EndpointHelper.updateEndpointWithLocation;
@@ -28,7 +26,9 @@ import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs;
 
 import java.util.ArrayList;
 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;
@@ -40,10 +40,11 @@ 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.rev100924.IpAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Uuid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.UniqueId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
 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.EndpointKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
@@ -78,8 +79,8 @@ 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.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, iid, this, DataChangeScope.ONE);
         requiredTunnelTypes = createSupportedTunnelsList();
     }
 
@@ -95,6 +96,13 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
         registration.close();
     }
 
+    /*
+     * When vSwitch is deleted, we loose data in operational DS to determine Iid of
+     * corresponding NodeId.
+     */
+    private static final Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, NodeId> nodeIdByTerminPoint =
+            new HashMap<>();
+
     @Override
     public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
 
@@ -105,8 +113,12 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
         for (Entry<InstanceIdentifier<?>, DataObject> entry : change.getCreatedData().entrySet()) {
             if (entry.getValue() instanceof OvsdbTerminationPointAugmentation) {
                 OvsdbTerminationPointAugmentation ovsdbTp = (OvsdbTerminationPointAugmentation) entry.getValue();
-                InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid = (InstanceIdentifier<OvsdbTerminationPointAugmentation>) entry.getKey();
+                @SuppressWarnings("unchecked")
+                InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid =
+                        (InstanceIdentifier<OvsdbTerminationPointAugmentation>) entry.getKey();
                 OvsdbBridgeAugmentation ovsdbBridge = getOvsdbBridgeFromTerminationPoint(ovsdbTpIid, dataBroker);
+                nodeIdByTerminPoint.put(ovsdbTpIid,
+                        new NodeId(getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker)));
                 processOvsdbBridge(ovsdbBridge, ovsdbTp, ovsdbTpIid);
             }
         }
@@ -117,7 +129,9 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
         for (Entry<InstanceIdentifier<?>, DataObject> entry : change.getUpdatedData().entrySet()) {
             if (entry.getValue() instanceof OvsdbTerminationPointAugmentation) {
                 OvsdbTerminationPointAugmentation ovsdbTp = (OvsdbTerminationPointAugmentation) entry.getValue();
-                InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid = (InstanceIdentifier<OvsdbTerminationPointAugmentation>) entry.getKey();
+                @SuppressWarnings("unchecked")
+                InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid =
+                        (InstanceIdentifier<OvsdbTerminationPointAugmentation>) entry.getKey();
                 OvsdbBridgeAugmentation ovsdbBridge = getOvsdbBridgeFromTerminationPoint(ovsdbTpIid, dataBroker);
                 processOvsdbBridge(ovsdbBridge, ovsdbTp, ovsdbTpIid);
             }
@@ -131,11 +145,9 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
             if (old instanceof OvsdbTerminationPointAugmentation) {
                 OvsdbTerminationPointAugmentation ovsdbTp = (OvsdbTerminationPointAugmentation) old;
                 @SuppressWarnings("unchecked")
-                InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid = (InstanceIdentifier<OvsdbTerminationPointAugmentation>) iid;
-                OvsdbBridgeAugmentation ovsdbBridge = getOvsdbBridgeFromTerminationPoint(ovsdbTpIid, dataBroker);
-                if (ovsdbBridge != null) {
-                    processRemovedTp(ovsdbBridge, ovsdbTp, ovsdbTpIid);
-                }
+                InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid =
+                        (InstanceIdentifier<OvsdbTerminationPointAugmentation>) iid;
+                processRemovedTp(nodeIdByTerminPoint.get(ovsdbTpIid), ovsdbTp, ovsdbTpIid);
             }
         }
     }
@@ -178,7 +190,7 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
          */
 
         if (externalId != null) {
-            EndpointKey epKey = getEpKeyFromNeutronMapper(new Uuid(externalId), dataBroker);
+            EndpointKey epKey = getEpKeyFromNeutronMapper(new UniqueId(externalId), dataBroker);
             if (epKey == null) {
                 LOG.debug("TerminationPoint {} with external ID {} is not in Neutron Map", ovsdbTp, externalId);
                 return;
@@ -211,22 +223,6 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
 
         }
 
-        /*
-         * Check if Neutron External port was announed in Node before TerminationPoint it refers to
-         * was actually instantiated. This may or may not have external information in the future,
-         * hence
-         * not process as IF/ELSE externalID.
-         */
-        ReadOnlyTransaction transaction = dataBroker.newReadOnlyTransaction();
-        Optional<Node> node = readFromDs(LogicalDatastoreType.OPERATIONAL, nodeIid, transaction);
-        if (node.isPresent() && node.get().getAugmentation(OvsdbNodeAugmentation.class) != null) {
-            OvsdbNodeAugmentation ovsdbNodeAug = node.get().getAugmentation(OvsdbNodeAugmentation.class);
-            if (getProviderMapping(ovsdbNodeAug) != null) {
-                processNodeNotification(ovsdbNodeAug);
-
-            }
-        } else {
-        }
         /*
          * This may be a notification for a tunnel we just created.
          * In that case, we need to update the Inventory Node's OfOverlay
@@ -247,28 +243,14 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
      * removes attached tunnels (namely Vxlan-type) from OVSDB bridge;
      * else removes location info from TP
      *
-     * @param ovsdbBridge {@link OvsdbBridgeAugmentation}
+     * @param nodeId {@link NodeId}
      * @param ovsdbTp {@link OvsdbTerminationPointAugmentation}
      * @param ovsdbTpIid termination point's IID {@link InstanceIdentifier}
      */
-    private void processRemovedTp(OvsdbBridgeAugmentation ovsdbBridge, OvsdbTerminationPointAugmentation ovsdbTp,
+    private void processRemovedTp(NodeId nodeId, OvsdbTerminationPointAugmentation ovsdbTp,
             InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid) {
-
-        checkNotNull(ovsdbBridge);
-        if (ovsdbBridge.getBridgeName().getValue().equals(ovsdbTp.getName())) {
-            LOG.debug("Termination Point {} same as Bridge {}. Not processing.", ovsdbTp.getName(),
-                    ovsdbBridge.getBridgeName().getValue());
-            return;
-        }
-
-        String nodeIdString = getInventoryNodeIdString(ovsdbBridge, ovsdbTpIid, dataBroker);
-        if (nodeIdString == null) {
-            LOG.debug("nodeIdString for TerminationPoint {} was null.", ovsdbTp);
-            return;
-        }
-
         if (isTunnelPort(ovsdbTp, requiredTunnelTypes)) {
-            removeTunnelsOfOverlayConfig(nodeIdString, requiredTunnelTypes, dataBroker);
+            removeTunnelsOfOverlayConfig(nodeId.getValue(), requiredTunnelTypes, dataBroker);
         } else {
             deleteLocationForTp(ovsdbTp);
         }
@@ -282,7 +264,7 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
     private void deleteLocationForTp(OvsdbTerminationPointAugmentation ovsdbTp) {
         String externalId = getNeutronPortUuid(ovsdbTp);
         if (externalId != null) {
-            EndpointKey epKey = getEpKeyFromNeutronMapper(new Uuid(externalId), dataBroker);
+            EndpointKey epKey = getEpKeyFromNeutronMapper(new UniqueId(externalId), dataBroker);
             if (epKey == null) {
                 LOG.debug("TerminationPoint {} with external ID {} is not in Neutron Map.", ovsdbTp, externalId);
                 return;
@@ -331,7 +313,8 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
      *
      * @return true if it's a required tunnel port, false if it isn't
      */
-    private boolean isTunnelPort(OvsdbTerminationPointAugmentation ovsdbTp, List<AbstractTunnelType> requiredTunnelTypes) {
+    private boolean isTunnelPort(OvsdbTerminationPointAugmentation ovsdbTp,
+            List<AbstractTunnelType> requiredTunnelTypes) {
         if (ovsdbTp.getInterfaceType() != null) {
             for (AbstractTunnelType tunnelType : requiredTunnelTypes) {
                 if (tunnelType.isValidTunnelPort(ovsdbTp)) {
@@ -346,7 +329,7 @@ public class TerminationPointDataChangeListener implements DataChangeListener, A
      * Get the Neutron Port UUID from an {@link OvsdbTerminationPointAugmentation}.
      * The Neutron Port UUID is stored as an "external-id" in the termination point.
      *
-     * @param ovsdbTp The OVSDB Termination Point augmentation
+     * @param ovsdbTp The {@link OvsdbTerminationPointAugmentation}
      * @return The String representation of the Neutron Port UUID, null if not present
      */
     private String getNeutronPortUuid(OvsdbTerminationPointAugmentation ovsdbTp) {