\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
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
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
\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
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
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
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
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
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
// }\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