Add initial nemo-tools structure and sandbox implementation.
[nemo.git] / nemo-impl / src / main / java / org / opendaylight / nemo / intent / computation / VNMappingUnit.java
index 4458e5fdfe811384925b362a1ef79004d8a58612..7413a49bb3525c3badb09798a8b132de3183056c 100644 (file)
@@ -8,29 +8,16 @@
 \r
 package org.opendaylight.nemo.intent.computation;\r
 \r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.LinkedList;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-import java.util.UUID;\r
-import java.util.concurrent.ExecutionException;\r
-\r
+import com.google.common.base.Optional;\r
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;\r
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;\r
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNodeAttributeDefinitions;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalPortAttributeDefinitions;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.definition.AttributeMatchPatterns;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.instance.attribute.value.RangeValue;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalLinks;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalNodes;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPath;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPathBuilder;\r
@@ -51,23 +38,17 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.m
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.UserVnPnMapping;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.user.vn.pn.mapping.VnPnMappingResult;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.user.vn.pn.mapping.VnPnMappingResultBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.AttributeName;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalNodeId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalPathId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalPortId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalResourceEntityId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalResourceId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNetworkId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNodeId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualResourceEntityId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualResourceId;\r
-import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
-import org.opendaylight.yangtools.yang.binding.DataObject;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.*;\r
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
-import com.google.common.base.Optional;\r
+import java.util.ArrayList;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+import java.util.UUID;\r
+import java.util.concurrent.ExecutionException;\r
 \r
 /**\r
  * The virtual network mapping unit implements the following functions:\r
@@ -90,44 +71,18 @@ public class VNMappingUnit implements AutoCloseable {
     private PNComputationUnit pnComputationUnit;\r
 \r
     /**\r
-     * The registrations for the physical port change listeners.\r
-     */\r
-    private Map<PhysicalNodeId, Map<PhysicalPortId, ListenerRegistration<DataChangeListener>>> physicalPortChangeListenerRegs;\r
-\r
-    /**\r
-     * The registration for the physical node change listener.\r
-     */\r
-    private ListenerRegistration<DataChangeListener> physicalNodeChangeListenerReg;\r
-\r
-    /**\r
-     * The registration for the physical link change listener.\r
+     * The physical network resource tracker.\r
      */\r
-    private ListenerRegistration<DataChangeListener> physicalLinkChangeListenerReg;\r
+    private PNResourcesTracker pnResourcesTracker;\r
 \r
-    public VNMappingUnit(DataBroker dataBroker, PNComputationUnit pnComputationUnit) {\r
+    public VNMappingUnit(DataBroker dataBroker,\r
+                         PNComputationUnit pnComputationUnit,\r
+                         PNResourcesTracker pnResourcesTracker) {\r
         super();\r
 \r
         this.dataBroker = dataBroker;\r
         this.pnComputationUnit = pnComputationUnit;\r
-\r
-        physicalPortChangeListenerRegs =\r
-                new HashMap<PhysicalNodeId, Map<PhysicalPortId, ListenerRegistration<DataChangeListener>>>();\r
-\r
-        InstanceIdentifier<PhysicalNode> physicalNodeIid = InstanceIdentifier\r
-                .builder(PhysicalNetwork.class)\r
-                .child(PhysicalNodes.class)\r
-                .child(PhysicalNode.class)\r
-                .build();\r
-        InstanceIdentifier<PhysicalLink> physicalLinkIid = InstanceIdentifier\r
-                .builder(PhysicalNetwork.class)\r
-                .child(PhysicalLinks.class)\r
-                .child(PhysicalLink.class)\r
-                .build();\r
-\r
-        physicalNodeChangeListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,\r
-                physicalNodeIid, new PhysicalNodeChangeListener(), DataChangeScope.BASE);\r
-        physicalLinkChangeListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,\r
-                physicalLinkIid, new PhysicalLinkChangeListener(), DataChangeScope.BASE);\r
+        this.pnResourcesTracker = pnResourcesTracker;\r
 \r
         LOG.debug("Initialized the virtual network mapping unit.");\r
 \r
@@ -154,13 +109,16 @@ public class VNMappingUnit implements AutoCloseable {
 \r
         try {\r
             result = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, physicalNodesIid).get();\r
-        } catch ( InterruptedException | ExecutionException exception ) {\r
+        } catch ( InterruptedException exception ) {\r
+            throw new VNMappingException("Can not read the physical nodes.");\r
+        } catch ( ExecutionException exception ) {\r
             throw new VNMappingException("Can not read the physical nodes.");\r
         }\r
 \r
         PhysicalNodes physicalNodes = result.get();\r
         List<PhysicalNode> physicalNodeList = physicalNodes.getPhysicalNode();\r
 \r
+        UserId userId = virtualNetwork.getUserId();\r
         List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
         List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
         List<VirtualPort> virtualPorts;\r
@@ -172,11 +130,17 @@ public class VNMappingUnit implements AutoCloseable {
             physicalNode = virtualNodeMapping(virtualNetwork.getNetworkId(), virtualNode, physicalNodeList);\r
 \r
             if ( null == physicalNode ) {\r
+                // If mapping failed, reset the user physical resources.\r
+                pnResourcesTracker.resetResource(userId);\r
+\r
                 throw new VNMappingException("Failed mapping for the virtual node " +\r
                         virtualNode.getNodeId().getValue() + " in the virtual network " +\r
                         virtualNetwork.getNetworkId().getValue());\r
             }\r
 \r
+            // Keep physical resource.\r
+            pnResourcesTracker.addPhysicalNode(userId, physicalNode);\r
+\r
             virtualPorts = virtualNode.getVirtualPort();\r
 \r
             for ( VirtualPort virtualPort : virtualPorts ) {\r
@@ -185,12 +149,18 @@ public class VNMappingUnit implements AutoCloseable {
                             virtualNode.getNodeId(), virtualPort, physicalNode);\r
 \r
                     if ( null == physicalPort ) {\r
+                        // If mapping failed, reset the user physical resources.\r
+                        pnResourcesTracker.resetResource(userId);\r
+\r
                         throw new VNMappingException("Failed mapping for the virtual port " +\r
                                 virtualPort.getPortId().getValue() + " of the virtual node " +\r
                                 virtualNode.getNodeId().getValue() + " in the virtual network " +\r
                                 virtualNetwork.getNetworkId().getValue());\r
                     }\r
 \r
+                    // Keep physical resource.\r
+                    pnResourcesTracker.addPhysicalPort(userId, physicalPort);\r
+\r
                     vnPnMappingResult = new VnPnMappingResultBuilder()\r
                             .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
                             .setVirtualResourceType(VirtualResourceInstance.VirtualResourceType.Vport)\r
@@ -227,11 +197,17 @@ public class VNMappingUnit implements AutoCloseable {
             physicalPath = virtualLinkMapping(virtualNetwork.getNetworkId(), virtualLink, userVnPnMapping);\r
 \r
             if ( null == physicalPath ) {\r
+                // If mapping failed, reset the user physical resources.\r
+                pnResourcesTracker.resetResource(userId);\r
+\r
                 throw new VNMappingException("Failed mapping for the virtual link " +\r
                         virtualLink.getLinkId().getValue() + " in the virtual network " +\r
                         virtualNetwork.getNetworkId().getValue());\r
             }\r
 \r
+            // Keep physical resource.\r
+            pnResourcesTracker.addPhysicalPath(userId, physicalPath);\r
+\r
             physicalPaths.add(physicalPath);\r
 \r
             newVirtualLink = new VirtualLinkBuilder(virtualLink)\r
@@ -587,7 +563,10 @@ public class VNMappingUnit implements AutoCloseable {
         try {\r
             result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION,\r
                     physicalPortAttributeDefinitionIid).get();\r
-        } catch ( InterruptedException | ExecutionException exception ) {\r
+        } catch ( InterruptedException exception ) {\r
+            throw new VNMappingException("Can not read the physical port attribute definition " +\r
+                    "with attribute name " + attribute.getAttributeName().getValue() + ".");\r
+        } catch ( ExecutionException exception ) {\r
             throw new VNMappingException("Can not read the physical port attribute definition " +\r
                     "with attribute name " + attribute.getAttributeName().getValue() + ".");\r
         }\r
@@ -654,7 +633,10 @@ public class VNMappingUnit implements AutoCloseable {
         try {\r
             result = readOnlyTransaction.read(LogicalDatastoreType.CONFIGURATION,\r
                     physicalNodeAttributeDefinitionIid).get();\r
-        } catch ( InterruptedException | ExecutionException exception ) {\r
+        } catch ( InterruptedException exception ) {\r
+            throw new VNMappingException("Can not read the physical node attribute definition " +\r
+                    "with attribute name " + attribute.getAttributeName().getValue() + ".");\r
+        } catch ( ExecutionException exception ) {\r
             throw new VNMappingException("Can not read the physical node attribute definition " +\r
                     "with attribute name " + attribute.getAttributeName().getValue() + ".");\r
         }\r
@@ -1073,125 +1055,4 @@ public class VNMappingUnit implements AutoCloseable {
 //            }\r
 //        }\r
 //    }\r
-\r
-    /**\r
-     * A listener to change events related to physical ports being\r
-     * added, removed or updated.\r
-     *\r
-     * @author Zhigang Ji\r
-     */\r
-    private class PhysicalPortChangeListener implements DataChangeListener {\r
-        /**\r
-         * The physical node that the physical port belongs to.\r
-         */\r
-        private PhysicalNodeId physicalNodeId;\r
-\r
-        public PhysicalPortChangeListener(PhysicalNodeId physicalNodeId) {\r
-            super();\r
-\r
-            this.physicalNodeId = physicalNodeId;\r
-\r
-            return;\r
-        }\r
-\r
-        @Override\r
-        public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
-            if ( null == change ) {\r
-                return;\r
-            }\r
-\r
-            Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
-            Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
-\r
-            if ( null != updatedData && !updatedData.isEmpty() ) {\r
-                for ( DataObject dataObject : updatedData.values() ) {\r
-                    // TODO\r
-                }\r
-            }\r
-\r
-            Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
-\r
-            if ( null != removedPaths && !removedPaths.isEmpty() ) {\r
-                DataObject dataObject;\r
-\r
-                for ( InstanceIdentifier<?> instanceId : removedPaths ) {\r
-                    dataObject = originalData.get(instanceId);\r
-\r
-                    // TODO\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    /**\r
-     * A listener to change events related to physical nodes being\r
-     * added, removed or updated.\r
-     *\r
-     * @author Zhigang Ji\r
-     */\r
-    private class PhysicalNodeChangeListener implements DataChangeListener {\r
-        @Override\r
-        public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
-            if ( null == change ) {\r
-                return;\r
-            }\r
-\r
-            Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
-            Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
-\r
-            if ( null != updatedData && !updatedData.isEmpty() ) {\r
-                for ( DataObject dataObject : updatedData.values() ) {\r
-                    // TODO\r
-                }\r
-            }\r
-\r
-            Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
-\r
-            if ( null != removedPaths && !removedPaths.isEmpty() ) {\r
-                DataObject dataObject;\r
-\r
-                for ( InstanceIdentifier<?> instanceId : removedPaths ) {\r
-                    dataObject = originalData.get(instanceId);\r
-\r
-                    // TODO\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    /**\r
-     * A listener to change events related to physical links being\r
-     * added, removed or updated.\r
-     *\r
-     * @author Zhigang Ji\r
-     */\r
-    private class PhysicalLinkChangeListener implements DataChangeListener {\r
-        @Override\r
-        public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
-            if ( null == change ) {\r
-                return;\r
-            }\r
-\r
-            Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
-            Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
-\r
-            if ( null != updatedData && !updatedData.isEmpty() ) {\r
-                for ( DataObject dataObject : updatedData.values() ) {\r
-                    // TODO\r
-                }\r
-            }\r
-\r
-            Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
-\r
-            if ( null != removedPaths && !removedPaths.isEmpty() ) {\r
-                DataObject dataObject;\r
-\r
-                for ( InstanceIdentifier<?> instanceId : removedPaths ) {\r
-                    dataObject = originalData.get(instanceId);\r
-\r
-                    // TODO\r
-                }\r
-            }\r
-        }\r
-    }\r
 }\r