Add resolution for new nemo actions. 34/30534/1
authorZhigang Ji <jizhigang@huawei.com>
Thu, 3 Dec 2015 09:23:22 +0000 (17:23 +0800)
committerZhigang Ji <jizhigang@huawei.com>
Thu, 3 Dec 2015 09:29:00 +0000 (17:29 +0800)
Change-Id: I3821dda7f42f75cf6607e8fe9cbf6bde8779fa9d
Signed-off-by: Zhigang Ji <jizhigang@huawei.com>
nemo-impl/src/main/java/org/opendaylight/nemo/intent/IntentResolver.java
nemo-impl/src/main/java/org/opendaylight/nemo/intent/IntentResolverUtils.java
nemo-impl/src/main/java/org/opendaylight/nemo/intent/OperationResolver.java
nemo-impl/src/main/java/org/opendaylight/nemo/intent/action/ActionResolver.java [new file with mode: 0644]
nemo-impl/src/main/java/org/opendaylight/nemo/intent/action/ActionResolverUtils.java [new file with mode: 0644]
nemo-impl/src/main/java/org/opendaylight/nemo/intent/computation/VNMappingUnit.java
nemo-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/nemo/engine/impl/rev151010/NemoEngineModule.java
nemo-impl/src/test/java/org/opendaylight/nemo/intent/IntentResolverUtilsTest.java [deleted file]

index 15aac2a979324ea7ae2904370e0023379b1f929f..7767f37ecdbe3f82c0ccb699235e186682f72ebf 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.nemo.intent.computation.PNComputationUnit;\r
 import org.opendaylight.nemo.intent.computation.VNComputationUnit;\r
 import org.opendaylight.nemo.intent.computation.VNMappingUnit;\r
+import org.opendaylight.nemo.intent.condition.ConditionManager;\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.physical.network.PhysicalPaths;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPath;\r
@@ -91,6 +92,11 @@ public class IntentResolver implements AutoCloseable {
      */\r
     private OperationResolver operationResolver;\r
 \r
+    /**\r
+     * The condition manager to resolve and manage the condition in the user's operation.\r
+     */\r
+    private ConditionManager conditionManager;\r
+\r
     /**\r
      * The physical network computation unit.\r
      */\r
@@ -114,12 +120,14 @@ public class IntentResolver implements AutoCloseable {
         nodeMapper = new NodeMapper(dataBroker);\r
         connectionMapper = new ConnectionMapper(dataBroker, nodeMapper);\r
         flowManager = new FlowManager(dataBroker);\r
-        operationResolver = new OperationResolver(dataBroker);\r
+        conditionManager = new ConditionManager(this);\r
 \r
         pnComputationUnit = new PNComputationUnit(dataBroker);\r
         vnComputationUnits = new HashMap<UserId, VNComputationUnit>();\r
         vnMappingUnit = new VNMappingUnit(dataBroker, pnComputationUnit);\r
 \r
+        operationResolver = new OperationResolver(dataBroker, conditionManager, vnComputationUnits);\r
+\r
         LOG.debug("Initialized the renderer common intent resolver.");\r
 \r
         return;\r
@@ -153,6 +161,8 @@ public class IntentResolver implements AutoCloseable {
                 .build();\r
 \r
         if ( null != vnComputationUnit ) {\r
+            conditionManager.clear(userId);\r
+\r
             vnComputationUnit.close();\r
             vnComputationUnits.remove(userId);\r
 \r
@@ -347,13 +357,28 @@ public class IntentResolver implements AutoCloseable {
                 }\r
             }\r
 \r
+            List<Operation> operationsApplyingToNode = new LinkedList<Operation>();\r
+            List<Operation> operationsApplyingToConnection = new LinkedList<Operation>();\r
+            List<Operation> operationsApplyingToFlow = new LinkedList<Operation>();\r
+\r
             if ( null != user.getOperations() ) {\r
                 List<Operation> operations = user.getOperations().getOperation();\r
 \r
                 if ( null != operations ) {\r
-                    for ( Operation operation : operations ) {\r
-                        operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);\r
-                    }\r
+                    operationResolver.classifyOperations(user, operations, operationsApplyingToNode,\r
+                            operationsApplyingToConnection, operationsApplyingToFlow);\r
+                }\r
+            }\r
+\r
+            if ( !operationsApplyingToNode.isEmpty() ) {\r
+                for ( Operation operation : operationsApplyingToNode ) {\r
+                    operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);\r
+                }\r
+            }\r
+\r
+            if ( !operationsApplyingToConnection.isEmpty() ) {\r
+                for ( Operation operation : operationsApplyingToConnection ) {\r
+                    operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);\r
                 }\r
             }\r
 \r
@@ -361,6 +386,21 @@ public class IntentResolver implements AutoCloseable {
             vnComputationUnit = new VNComputationUnit(dataBroker, virtualNetwork);\r
             vnComputationUnits.put(userId, vnComputationUnit);\r
 \r
+            int currentVirtualLinkNum = virtualLinks.getVirtualLink().size();\r
+\r
+            if ( !operationsApplyingToFlow.isEmpty() ) {\r
+                for ( Operation operation : operationsApplyingToFlow ) {\r
+                    operationResolver.resolveOperation(user, operation, virtualNetwork, userIntentVnMapping);\r
+                }\r
+            }\r
+\r
+            List<VirtualLink> virtualLinkList = virtualLinks.getVirtualLink();\r
+            List<VirtualLink> unmappedVirtualLinkList =\r
+                    virtualLinkList.subList(currentVirtualLinkNum, virtualLinkList.size());\r
+\r
+            vnMappingUnit.virtualNetworkMapping(virtualNetwork,\r
+                    unmappedVirtualLinkList, userVnPnMapping, physicalPaths);\r
+\r
             LOG.debug("{}", virtualNetwork);\r
             LOG.debug("{}", userIntentVnMapping);\r
             LOG.debug("{}", userVnPnMapping);\r
index 5b16ef68cbdfe5ab0dd7a4554ca234c40bc2ea3b..95280cd35a5b032a0f22fd39627a81dceb31b660 100644 (file)
@@ -80,7 +80,7 @@ public class IntentResolverUtils {
      * @param propertyName TODO\r
      * @return TODO\r
      */\r
-    protected static Property getNodeProperty(List<Property> properties, PropertyName propertyName) {\r
+    public static Property getNodeProperty(List<Property> properties, PropertyName propertyName) {\r
         if ( null != properties ) {\r
             for ( Property property : properties ) {\r
                 if ( property.getPropertyName().equals(propertyName) ) {\r
@@ -111,7 +111,7 @@ public class IntentResolverUtils {
      * @param intentId TODO\r
      * @return TODO\r
      */\r
-    protected static IntentVnMappingResult getIntentVnMappingResult(\r
+    public static IntentVnMappingResult getIntentVnMappingResult(\r
             List<IntentVnMappingResult> intentVnMappingResults, IntentId intentId) {\r
         for ( IntentVnMappingResult intentVnMappingResult : intentVnMappingResults ) {\r
             if ( intentVnMappingResult.getIntentId().equals(intentId) ) {\r
@@ -129,8 +129,8 @@ public class IntentResolverUtils {
      * @param virtualNodeId TODO\r
      * @return TODO\r
      */\r
-    protected static VirtualNode getVirtualNode(List<VirtualNode> virtualNodes,\r
-                                                VirtualNodeId virtualNodeId) {\r
+    public static VirtualNode getVirtualNode(List<VirtualNode> virtualNodes,\r
+                                             VirtualNodeId virtualNodeId) {\r
         for ( VirtualNode virtualNode : virtualNodes ) {\r
             if ( virtualNode.getNodeId().equals(virtualNodeId) ) {\r
                 return virtualNode;\r
@@ -147,7 +147,7 @@ public class IntentResolverUtils {
      * @param nodeId TODO\r
      * @return TODO\r
      */\r
-    protected static Node getNode(List<Node> nodes, NodeId nodeId) {\r
+    public static Node getNode(List<Node> nodes, NodeId nodeId) {\r
         for ( Node node : nodes ) {\r
             if ( node.getNodeId().equals(nodeId) ) {\r
                 return node;\r
@@ -164,7 +164,7 @@ public class IntentResolverUtils {
      * @param propertyName TODO\r
      * @return TODO\r
      */\r
-    protected static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property getConnectionProperty(\r
+    public static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property getConnectionProperty(\r
             List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property> properties,\r
             PropertyName propertyName) {\r
         if ( null != properties ) {\r
@@ -207,7 +207,7 @@ public class IntentResolverUtils {
      * @param nodes TODO\r
      * @return TODO\r
      */\r
-    protected static boolean checkAllLayer2OperatingMode(List<SubNode> subNodes, List<Node> nodes) {\r
+    public static boolean checkAllLayer2OperatingMode(List<SubNode> subNodes, List<Node> nodes) {\r
         if ( subNodes.isEmpty() ) {\r
             return false;\r
         }\r
@@ -247,7 +247,7 @@ public class IntentResolverUtils {
      * @param nodes TODO\r
      * @return TODO\r
      */\r
-    protected static boolean checkAllLayer3OperatingMode(List<SubNode> subNodes, List<Node> nodes) {\r
+    public static boolean checkAllLayer3OperatingMode(List<SubNode> subNodes, List<Node> nodes) {\r
         if ( subNodes.isEmpty() ) {\r
             return false;\r
         }\r
@@ -288,9 +288,9 @@ public class IntentResolverUtils {
      * @param destVirtualNodeId TODO\r
      * @return TODO\r
      */\r
-    protected static VirtualLink getVirtualLink(List<VirtualLink> virtualLinks,\r
-                                                VirtualNodeId srcVirtualNodeId,\r
-                                                VirtualNodeId destVirtualNodeId) {\r
+    public static VirtualLink getVirtualLink(List<VirtualLink> virtualLinks,\r
+                                             VirtualNodeId srcVirtualNodeId,\r
+                                             VirtualNodeId destVirtualNodeId) {\r
         for ( VirtualLink virtualLink : virtualLinks ) {\r
             if ( virtualLink.getSrcNodeId().equals(srcVirtualNodeId)\r
                     && virtualLink.getDestNodeId().equals(destVirtualNodeId) ) {\r
@@ -403,96 +403,6 @@ public class IntentResolverUtils {
         return null;\r
     }\r
 \r
-    /**\r
-     * TODO\r
-     *\r
-     * @param actions TODO\r
-     * @param actionName TODO\r
-     * @return TODO\r
-     */\r
-    protected static Action getAction(List<Action> actions, ActionName actionName) {\r
-        for ( Action action : actions ) {\r
-            if ( action.getActionName().equals(actionName) ) {\r
-                return action;\r
-            }\r
-        }\r
-\r
-        return null;\r
-    }\r
-\r
-    /**\r
-     * TODO\r
-     *\r
-     * @param virtualNodes TODO\r
-     * @param flow TODO\r
-     * @param nodes TODO\r
-     * @param intentVnMappingResults TODO\r
-     * @return TODO\r
-     */\r
-    protected static VirtualNode getSourceVirtualRouterOfFlow(List<VirtualNode> virtualNodes,\r
-                                                              Flow flow, List<Node> nodes,\r
-                                                              List<IntentVnMappingResult> intentVnMappingResults) {\r
-        MatchItemName matchItemName = new MatchItemName("src-ip");\r
-        MatchItem matchItem = getMatchItem(flow.getMatchItem(), matchItemName);\r
-\r
-        if ( null == matchItem ) {\r
-            return null;\r
-        }\r
-\r
-        String matchItemValue = matchItem.getMatchItemValue().getStringValue();\r
-        VirtualNode virtualNode = getVirtualRouterWithIpPrefix(virtualNodes,\r
-                matchItemValue, nodes, intentVnMappingResults);\r
-\r
-        return virtualNode;\r
-    }\r
-\r
-    /**\r
-     * TODO\r
-     *\r
-     * @param virtualNodes TODO\r
-     * @param flow TODO\r
-     * @param nodes TODO\r
-     * @param intentVnMappingResults TODO\r
-     * @return TODO\r
-     */\r
-    protected static VirtualNode getDestinationVirtualRouterOfFlow(List<VirtualNode> virtualNodes,\r
-                                                                   Flow flow, List<Node> nodes,\r
-                                                                   List<IntentVnMappingResult> intentVnMappingResults) {\r
-        MatchItemName matchItemName = new MatchItemName("dst-ip");\r
-        MatchItem matchItem = getMatchItem(flow.getMatchItem(), matchItemName);\r
-\r
-        if ( null == matchItem ) {\r
-            return null;\r
-        }\r
-\r
-        String matchItemValue = matchItem.getMatchItemValue().getStringValue();\r
-        VirtualNode virtualNode = getVirtualRouterWithIpPrefix(virtualNodes,\r
-                matchItemValue, nodes, intentVnMappingResults);\r
-\r
-        return virtualNode;\r
-    }\r
-\r
-    /**\r
-     * TODO\r
-     *\r
-     * @param virtualResources TODO\r
-     * @return TODO\r
-     */\r
-    protected static List<VirtualResource> sortVirtualResources(List<VirtualResource> virtualResources) {\r
-        if ( virtualResources.isEmpty() || 1 == virtualResources.size() ) {\r
-            return virtualResources;\r
-        }\r
-\r
-        List<VirtualResource> sortedVirtualResources = new ArrayList<VirtualResource>(virtualResources.size());\r
-        sortedVirtualResources.addAll(virtualResources);\r
-\r
-        for ( VirtualResource virtualResource : virtualResources ) {\r
-            sortedVirtualResources.set(virtualResource.getOrder().intValue(), virtualResource);\r
-        }\r
-\r
-        return sortedVirtualResources;\r
-    }\r
-\r
     /**\r
      * TODO\r
      *\r
@@ -544,109 +454,4 @@ public class IntentResolverUtils {
 \r
         return null;\r
     }\r
-\r
-    /**\r
-     * TODO\r
-     *\r
-     * @param matchItems TODO\r
-     * @param matchItemName TODO\r
-     * @return TODO\r
-     */\r
-    private static MatchItem getMatchItem(List<MatchItem> matchItems, MatchItemName matchItemName) {\r
-        if ( null != matchItems ) {\r
-            for ( MatchItem matchItem : matchItems ) {\r
-                if ( matchItem.getMatchItemName().equals(matchItemName) ) {\r
-                    return matchItem;\r
-                }\r
-            }\r
-        }\r
-\r
-        return null;\r
-    }\r
-\r
-    /**\r
-     * TODO\r
-     *\r
-     * @param virtualNodes TODO\r
-     * @param ipPrefix TODO\r
-     * @param nodes TODO\r
-     * @param intentVnMappingResults TODO\r
-     * @return TODO\r
-     */\r
-    private static VirtualNode getVirtualRouterWithIpPrefix(List<VirtualNode> virtualNodes,\r
-                                                            String ipPrefix, List<Node> nodes,\r
-                                                            List<IntentVnMappingResult> intentVnMappingResults) {\r
-        NodeType layer2GroupNodeType = new NodeType("l2-group");\r
-        NodeType externalGroupNodeType = new NodeType("ext-group");\r
-        PropertyName propertyName = new PropertyName("ip-prefix");\r
-        Property property;\r
-        List<StringValue> propertyValues;\r
-        IntentVnMappingResult intentVnMappingResult;\r
-        VirtualResource virtualResource;\r
-        VirtualNodeId virtualNodeId;\r
-        VirtualNode virtualNode;\r
-\r
-        for ( Node node : nodes ) {\r
-            if ( node.getNodeType().equals(layer2GroupNodeType)\r
-                    || node.getNodeType().equals(externalGroupNodeType) ) {\r
-                property = getNodeProperty(node.getProperty(), propertyName);\r
-\r
-                if ( null != property ) {\r
-                    propertyValues = property.getPropertyValues().getStringValue();\r
-\r
-                    if ( containPropertyValue(propertyValues, ipPrefix) ) {\r
-                        intentVnMappingResult = getIntentVnMappingResult(intentVnMappingResults,\r
-                                new IntentId(node.getNodeId().getValue()));\r
-\r
-                        if ( null == intentVnMappingResult ) {\r
-                            return null;\r
-                        }\r
-\r
-                        virtualResource = intentVnMappingResult.getVirtualResource().get(0);\r
-\r
-                        if ( VirtualResource.VirtualResourceType.Vport\r
-                                == virtualResource.getVirtualResourceType() ) {\r
-                            virtualNodeId = new VirtualNodeId(\r
-                                    virtualResource.getParentVirtualResourceEntityId().getValue());\r
-                        } else if ( VirtualResource.VirtualResourceType.Vnode\r
-                                == virtualResource.getVirtualResourceType() ) {\r
-                            virtualNodeId = new VirtualNodeId(\r
-                                    virtualResource.getVirtualResourceEntityId().getValue());\r
-                        } else {\r
-                            return null;\r
-                        }\r
-\r
-                        virtualNode = getVirtualNode(virtualNodes, virtualNodeId);\r
-\r
-                        if ( null == virtualNode ) {\r
-                            return null;\r
-                        }\r
-\r
-                        if ( VirtualNode.NodeType.Vrouter == virtualNode.getNodeType() ) {\r
-                            return virtualNode;\r
-                        }\r
-                    }\r
-                }\r
-            }\r
-        }\r
-\r
-        return null;\r
-    }\r
-\r
-    /**\r
-     * TODO\r
-     *\r
-     * @param propertyValues TODO\r
-     * @param propertyValue TODO\r
-     * @return TODO\r
-     */\r
-    private static boolean containPropertyValue(List<StringValue> propertyValues, String propertyValue) {\r
-        for ( StringValue stringValue : propertyValues ) {\r
-            if ( stringValue.getValue().equals(propertyValue) ) {\r
-                return true;\r
-            }\r
-        }\r
-\r
-        return false;\r
-    }\r
 }\r
index 1d526899864c83e2816121b33c00712f45502ce3..14fd3135159dd53e06608a7711bce4006f055e4b 100644 (file)
@@ -9,40 +9,27 @@
 package org.opendaylight.nemo.intent;\r
 \r
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.nemo.intent.action.ActionResolver;\r
+import org.opendaylight.nemo.intent.computation.VNComputationUnit;\r
+import org.opendaylight.nemo.intent.condition.ConditionDeterminer;\r
+import org.opendaylight.nemo.intent.condition.ConditionManager;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetwork;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLinkBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.nodes.VirtualNode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.paths.VirtualPath;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.paths.VirtualPathBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.VirtualPort;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.VirtualPortBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMapping;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.IntentVnMappingResult;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.IntentVnMappingResultBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.intent.vn.mapping.result.VirtualResource;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.intent.vn.mapping.result.VirtualResourceBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.ActionName;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.IntentId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeType;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.*;\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.intent.rev151010.user.intent.objects.Connection;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.Operation;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.condition.instance.ConditionSegment;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action;\r
 import org.opendaylight.yangtools.yang.binding.DataObject;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
-import java.util.ArrayList;\r
 import java.util.LinkedList;\r
 import java.util.List;\r
-import java.util.UUID;\r
+import java.util.Map;\r
 \r
 /**\r
  * Resolve the user's operation intent that might act on the node, connection\r
@@ -57,17 +44,24 @@ public class OperationResolver {
 \r
     private final DataBroker dataBroker;\r
 \r
+    /**\r
+     * The condition manager to resolve and manage the condition in the operation.\r
+     */\r
+    private ConditionManager conditionManager;\r
+\r
     /**\r
      * The action resolver to resolve actions in the operation.\r
      */\r
     private ActionResolver actionResolver;\r
 \r
-    public OperationResolver(DataBroker dataBroker) {\r
+    public OperationResolver(DataBroker dataBroker, ConditionManager conditionManager,\r
+                             Map<UserId, VNComputationUnit> vnComputationUnits) {\r
         super();\r
 \r
         this.dataBroker = dataBroker;\r
 \r
-        actionResolver = new ActionResolver();\r
+        this.conditionManager = conditionManager;\r
+        actionResolver = new ActionResolver(dataBroker, vnComputationUnits);\r
 \r
         LOG.debug("Initialized the renderer common operation resolver.");\r
 \r
@@ -125,8 +119,8 @@ public class OperationResolver {
 \r
         List<ConditionSegment> conditionSegments = operation.getConditionSegment();\r
 \r
-        if ( null != conditionSegments && !conditionSegments.isEmpty() ) {\r
-            // TODO\r
+        if ( !ConditionDeterminer.isConditionMet(conditionSegments) ) {\r
+            conditionManager.handleOperation(user.getUserId(), operation);\r
 \r
             return;\r
         }\r
@@ -149,323 +143,39 @@ public class OperationResolver {
         return;\r
     }\r
 \r
-    /**\r
-     * Perform the monitoring for the operation that contains a condition\r
-     * which determines when to execute the operation.\r
-     *\r
-     * @author Zhigang Ji\r
-     */\r
-    private class ConditionMonitor {\r
-        // TODO\r
-    }\r
-\r
-    /**\r
-     * Resolve the actions included in the operation and decide how to\r
-     * implement them on the physical network.\r
-     *\r
-     * @author Zhigang Ji\r
-     */\r
-    private class ActionResolver {\r
-        /**\r
-         * TODO\r
-         *\r
-         * @param user TODO\r
-         * @param operation TODO\r
-         * @param node TODO\r
-         * @param virtualNetwork TODO\r
-         * @param userIntentVnMapping TODO\r
-         */\r
-        protected void resolveActions(User user, Operation operation, Node node,\r
-                                      VirtualNetwork virtualNetwork,\r
-                                      UserIntentVnMapping userIntentVnMapping)\r
-                throws IntentResolutionException {\r
-            // TODO\r
-\r
-            return;\r
-        }\r
-\r
-        /**\r
-         * TODO\r
-         *\r
-         * @param user TODO\r
-         * @param operation TODO\r
-         * @param connection TODO\r
-         * @param virtualNetwork TODO\r
-         * @param userIntentVnMapping TODO\r
-         */\r
-        protected void resolveActions(User user, Operation operation, Connection connection,\r
-                                      VirtualNetwork virtualNetwork,\r
-                                      UserIntentVnMapping userIntentVnMapping)\r
-                throws IntentResolutionException {\r
-            // TODO\r
-\r
-            return;\r
-        }\r
-\r
-        /**\r
-         * TODO\r
-         *\r
-         * @param user TODO\r
-         * @param operation TODO\r
-         * @param flow TODO\r
-         * @param virtualNetwork TODO\r
-         * @param userIntentVnMapping TODO\r
-         */\r
-        protected void resolveActions(User user, Operation operation, Flow flow,\r
-                                      VirtualNetwork virtualNetwork,\r
-                                      UserIntentVnMapping userIntentVnMapping)\r
-                throws IntentResolutionException {\r
-            List<Action> actions = operation.getAction();\r
-\r
-            ActionName actionName = new ActionName("go-through");\r
-            Action goThroughAction = IntentResolverUtils.getAction(actions, actionName);\r
-\r
-            if ( null != goThroughAction ) {\r
-                resolveGoThroughAction(user, operation, flow, goThroughAction,\r
-                        virtualNetwork, userIntentVnMapping);\r
-\r
-                return;\r
-            }\r
-\r
-            throw new IntentResolutionException("Unsupported action combination.");\r
-\r
-//            return;\r
-        }\r
-    }\r
-\r
     /**\r
      * TODO\r
      *\r
      * @param user TODO\r
-     * @param operation TODO\r
-     * @param flow TODO\r
-     * @param goThroughAction TODO\r
-     * @param virtualNetwork TODO\r
-     * @param userIntentVnMapping TODO\r
+     * @param operations TODO\r
+     * @param operationsApplyingToNode TODO\r
+     * @param operationsApplyingToConnection TODO\r
+     * @param operationsApplyingToFlow TODO\r
+     * @throws IntentResolutionException\r
      */\r
-    private void resolveGoThroughAction(User user, Operation operation, Flow flow,\r
-                                        Action goThroughAction,\r
-                                        VirtualNetwork virtualNetwork,\r
-                                        UserIntentVnMapping userIntentVnMapping)\r
+    protected void classifyOperations(User user, List<Operation> operations,\r
+                                      List<Operation> operationsApplyingToNode,\r
+                                      List<Operation> operationsApplyingToConnection,\r
+                                      List<Operation> operationsApplyingToFlow)\r
             throws IntentResolutionException {\r
-        List<StringValue> parameterValues = goThroughAction.getParameterValues().getStringValue();\r
-\r
-        if ( !parameterValues.isEmpty() ) {\r
-            List<Node> nodes = user.getObjects().getNode();\r
-\r
-            if ( null == nodes || nodes.isEmpty() ) {\r
-                throw new IntentResolutionException("The nodes specified by the action parameters " +\r
-                        "of the operation " + operation.getOperationId().getValue() + " does not exist.");\r
-            }\r
+        DataObject dataObject;\r
 \r
-            NodeId nodeId = new NodeId(parameterValues.get(0).getValue());\r
-            Node node = IntentResolverUtils.getNode(nodes, nodeId);\r
+        for ( Operation operation : operations ) {\r
+            dataObject = IntentResolverUtils\r
+                    .getObject(user.getObjects(), operation.getTargetObject());\r
 \r
-            if ( null == node ) {\r
-                throw new IntentResolutionException("The node " + nodeId.getValue() + " specified by the" +\r
-                        " action parameter of the operation " + operation.getOperationId().getValue() +\r
-                        " does not exist.");\r
+            if ( null == dataObject ) {\r
+                throw new IntentResolutionException("The target object of the operation " +\r
+                        operation.getOperationId().getValue() + " does not exist.");\r
             }\r
 \r
-            List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
-            List<VirtualLink> virtualLinks = virtualNetwork.getVirtualLinks().getVirtualLink();\r
-            List<VirtualPath> virtualPaths = virtualNetwork.getVirtualPaths().getVirtualPath();\r
-            List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
-            List<VirtualResource> virtualResources = null;\r
-\r
-            if ( node.getNodeType().equals(new NodeType("chain-group")) ) {\r
-                if ( IntentResolverUtils.checkAllLayer2OperatingMode(node.getSubNode(), nodes) ) {\r
-                    // TODO\r
-                } else if ( IntentResolverUtils.checkAllLayer3OperatingMode(node.getSubNode(), nodes) ) {\r
-                    IntentVnMappingResult intentVnMappingResult = IntentResolverUtils.getIntentVnMappingResult(\r
-                            intentVnMappingResults, new IntentId(node.getNodeId().getValue()));\r
-\r
-                    if ( null == intentVnMappingResult ) {\r
-                        throw new IntentResolutionException("Can not get the intent-vn mapping result " +\r
-                                "for the node " + node.getNodeId().getValue() + ".");\r
-                    }\r
-\r
-                    VirtualNode sourceVirtualNode = IntentResolverUtils.getSourceVirtualRouterOfFlow(\r
-                            virtualNodes, flow, nodes, intentVnMappingResults);\r
-\r
-                    if ( null == sourceVirtualNode ) {\r
-                        throw new IntentResolutionException("Can not get the source virtual node " +\r
-                                "of the flow " + flow.getFlowId().getValue() + ".");\r
-                    }\r
-\r
-                    VirtualNode destinationVirtualNode = IntentResolverUtils.getDestinationVirtualRouterOfFlow(\r
-                            virtualNodes, flow, nodes, intentVnMappingResults);\r
-\r
-                    if ( null == destinationVirtualNode ) {\r
-                        throw new IntentResolutionException("Can not get the destination virtual node " +\r
-                                "of the flow " + flow.getFlowId().getValue() + ".");\r
-                    }\r
-\r
-                    List<VirtualResource> virtualResources1 = IntentResolverUtils\r
-                            .sortVirtualResources(intentVnMappingResult.getVirtualResource());\r
-\r
-                    VirtualNodeId virtualNodeId = new VirtualNodeId(virtualResources1.get(0)\r
-                            .getParentVirtualResourceEntityId().getValue());\r
-                    VirtualNode virtualNode = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);\r
-\r
-                    if ( null == virtualNode ) {\r
-                        throw new IntentResolutionException("Can not get the virtual node" +\r
-                                " created for the first sub-node of the node " +\r
-                                intentVnMappingResult.getIntentId().getValue() + ".");\r
-                    }\r
-\r
-                    virtualNodeId = new VirtualNodeId(virtualResources1.get(virtualResources1.size() - 1)\r
-                            .getParentVirtualResourceEntityId().getValue());\r
-                    VirtualNode virtualNode1 = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);\r
-\r
-                    if ( null == virtualNode1 ) {\r
-                        throw new IntentResolutionException("Can not get the virtual node" +\r
-                                " created for the last sub-node of the node " +\r
-                                intentVnMappingResult.getIntentId().getValue() + ".");\r
-                    }\r
-\r
-                    virtualResources = new ArrayList<VirtualResource>(virtualResources1.size() + 2);\r
-                    VirtualLink virtualLink = IntentResolverUtils.getVirtualLink(virtualLinks,\r
-                            sourceVirtualNode.getNodeId(), virtualNode.getNodeId());\r
-\r
-                    if ( null == virtualLink ) {\r
-                        VirtualPort virtualPort = new VirtualPortBuilder()\r
-                                .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
-                                .setPortType(VirtualPort.PortType.Internal)\r
-                                .build();\r
-                        sourceVirtualNode.getVirtualPort().add(virtualPort);\r
-\r
-                        VirtualPort virtualPort1 = new VirtualPortBuilder()\r
-                                .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
-                                .setPortType(VirtualPort.PortType.Internal)\r
-                                .build();\r
-                        virtualNode.getVirtualPort().add(virtualPort1);\r
-\r
-                        virtualLink = new VirtualLinkBuilder()\r
-                                .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
-                                .setSrcNodeId(virtualNode.getNodeId())\r
-                                .setSrcPortId(virtualPort1.getPortId())\r
-                                .setDestNodeId(sourceVirtualNode.getNodeId())\r
-                                .setDestPortId(virtualPort.getPortId())\r
-                                .setBandwidth(0L)\r
-                                .build();\r
-                        virtualLinks.add(virtualLink);\r
-\r
-                        virtualLink = new VirtualLinkBuilder()\r
-                                .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
-                                .setSrcNodeId(sourceVirtualNode.getNodeId())\r
-                                .setSrcPortId(virtualPort.getPortId())\r
-                                .setDestNodeId(virtualNode.getNodeId())\r
-                                .setDestPortId(virtualPort1.getPortId())\r
-                                .setBandwidth(0L)\r
-                                .build();\r
-                        virtualLinks.add(virtualLink);\r
-                    }\r
-\r
-                    List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink> virtualLinks1 =\r
-                            new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink>(1);\r
-                    org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink virtualLink1 =\r
-                            new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLinkBuilder()\r
-                                    .setLinkId(virtualLink.getLinkId())\r
-                                    .setOrder(0L)\r
-                                    .build();\r
-                    virtualLinks1.add(virtualLink1);\r
-\r
-                    VirtualPath virtualPath = new VirtualPathBuilder()\r
-                            .setPathId(new VirtualPathId(UUID.randomUUID().toString()))\r
-                            .setVirtualLink(virtualLinks1)\r
-                            .setBandwidth(0L)\r
-                            .build();\r
-                    virtualPaths.add(virtualPath);\r
-\r
-                    VirtualResource virtualResource = new VirtualResourceBuilder()\r
-                            .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
-                            .setVirtualResourceType(VirtualResource.VirtualResourceType.Vpath)\r
-                            .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPath.getPathId().getValue()))\r
-                            .setOrder(0L)\r
-                            .build();\r
-                    virtualResources.add(virtualResource);\r
-\r
-                    for ( VirtualResource virtualResource1 : virtualResources1 ) {\r
-                        virtualResource = new VirtualResourceBuilder(virtualResource1)\r
-                                .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
-                                .setOrder((long)virtualResources.size())\r
-                                .build();\r
-                        virtualResources.add(virtualResource);\r
-                    }\r
-\r
-                    virtualLink = IntentResolverUtils.getVirtualLink(virtualLinks,\r
-                            virtualNode1.getNodeId(), destinationVirtualNode.getNodeId());\r
-\r
-                    if ( null == virtualLink ) {\r
-                        VirtualPort virtualPort = new VirtualPortBuilder()\r
-                                .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
-                                .setPortType(VirtualPort.PortType.Internal)\r
-                                .build();\r
-                        virtualNode1.getVirtualPort().add(virtualPort);\r
-\r
-                        VirtualPort virtualPort1 = new VirtualPortBuilder()\r
-                                .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
-                                .setPortType(VirtualPort.PortType.Internal)\r
-                                .build();\r
-                        destinationVirtualNode.getVirtualPort().add(virtualPort1);\r
-\r
-                        virtualLink = new VirtualLinkBuilder()\r
-                                .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
-                                .setSrcNodeId(destinationVirtualNode.getNodeId())\r
-                                .setSrcPortId(virtualPort1.getPortId())\r
-                                .setDestNodeId(virtualNode1.getNodeId())\r
-                                .setDestPortId(virtualPort.getPortId())\r
-                                .setBandwidth(0L)\r
-                                .build();\r
-                        virtualLinks.add(virtualLink);\r
-\r
-                        virtualLink = new VirtualLinkBuilder()\r
-                                .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
-                                .setSrcNodeId(virtualNode1.getNodeId())\r
-                                .setSrcPortId(virtualPort.getPortId())\r
-                                .setDestNodeId(destinationVirtualNode.getNodeId())\r
-                                .setDestPortId(virtualPort1.getPortId())\r
-                                .setBandwidth(0L)\r
-                                .build();\r
-                        virtualLinks.add(virtualLink);\r
-                    }\r
-\r
-                    virtualLinks1 = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink>(1);\r
-                    virtualLink1 = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLinkBuilder()\r
-                                    .setLinkId(virtualLink.getLinkId())\r
-                                    .setOrder(0L)\r
-                                    .build();\r
-                    virtualLinks1.add(virtualLink1);\r
-\r
-                    virtualPath = new VirtualPathBuilder()\r
-                            .setPathId(new VirtualPathId(UUID.randomUUID().toString()))\r
-                            .setVirtualLink(virtualLinks1)\r
-                            .setBandwidth(0L)\r
-                            .build();\r
-                    virtualPaths.add(virtualPath);\r
-\r
-                    virtualResource = new VirtualResourceBuilder()\r
-                            .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
-                            .setVirtualResourceType(VirtualResource.VirtualResourceType.Vpath)\r
-                            .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPath.getPathId().getValue()))\r
-                            .setOrder((long) virtualResources.size())\r
-                            .build();\r
-                    virtualResources.add(virtualResource);\r
-                } else {\r
-                    // TODO\r
-                }\r
+            if ( dataObject instanceof Node ) {\r
+                operationsApplyingToNode.add(operation);\r
+            } else if ( dataObject instanceof Connection ) {\r
+                operationsApplyingToConnection.add(operation);\r
             } else {\r
-                // TODO\r
+                operationsApplyingToFlow.add(operation);\r
             }\r
-\r
-            IntentVnMappingResult intentVnMappingResult = new IntentVnMappingResultBuilder()\r
-                    .setIntentId(new IntentId(operation.getOperationId().getValue()))\r
-                    .setIntentType(IntentVnMappingResult.IntentType.Operation)\r
-                    .setVirtualResource(virtualResources)\r
-                    .build();\r
-\r
-            intentVnMappingResults.add(intentVnMappingResult);\r
         }\r
 \r
         return;\r
diff --git a/nemo-impl/src/main/java/org/opendaylight/nemo/intent/action/ActionResolver.java b/nemo-impl/src/main/java/org/opendaylight/nemo/intent/action/ActionResolver.java
new file mode 100644 (file)
index 0000000..2b01a48
--- /dev/null
@@ -0,0 +1,809 @@
+/*\r
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.nemo.intent.action;\r
+\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.nemo.intent.IntentResolutionException;\r
+import org.opendaylight.nemo.intent.IntentResolverUtils;\r
+import org.opendaylight.nemo.intent.computation.VNComputationUnit;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.VirtualNetwork;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLinkBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.nodes.VirtualNode;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.paths.VirtualPath;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.paths.VirtualPathBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.VirtualPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.node.instance.VirtualPortBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.UserIntentVnMapping;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.IntentVnMappingResult;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.IntentVnMappingResultBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.intent.vn.mapping.result.VirtualResource;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.intent.vn.mapping.result.VirtualResourceBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.*;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.*;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Connection;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.Operation;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.IntValue;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import java.util.*;\r
+\r
+/**\r
+ * Resolve the actions included in the operation and decide how to\r
+ * implement them on the physical network.\r
+ *\r
+ * @author Zhigang Ji\r
+ */\r
+public class ActionResolver {\r
+    private static final Logger LOG = LoggerFactory.getLogger(ActionResolver.class);\r
+\r
+    private final DataBroker dataBroker;\r
+\r
+    /**\r
+     * The virtual network computation unit for all users.\r
+     */\r
+    private Map<UserId, VNComputationUnit> vnComputationUnits;\r
+\r
+    public ActionResolver(DataBroker dataBroker, Map<UserId, VNComputationUnit> vnComputationUnits) {\r
+        super();\r
+\r
+        this.dataBroker = dataBroker;\r
+        this.vnComputationUnits = vnComputationUnits;\r
+\r
+        LOG.debug("Initialized the renderer common action resolver.");\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param node TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @throws IntentResolutionException\r
+     */\r
+    public void resolveActions(User user, Operation operation, Node node,\r
+                               VirtualNetwork virtualNetwork,\r
+                               UserIntentVnMapping userIntentVnMapping)\r
+            throws IntentResolutionException {\r
+        // TODO\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param connection TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @throws IntentResolutionException\r
+     */\r
+    public void resolveActions(User user, Operation operation, Connection connection,\r
+                               VirtualNetwork virtualNetwork,\r
+                               UserIntentVnMapping userIntentVnMapping)\r
+            throws IntentResolutionException {\r
+        List<Action> actions = operation.getAction();\r
+\r
+        ActionName actionName = new ActionName("qos-bandwidth");\r
+        Action qosBandwidthAction = ActionResolverUtils.getAction(actions, actionName);\r
+\r
+        if ( null != qosBandwidthAction ) {\r
+            resolveQosBandwidthAction(user, operation, connection, qosBandwidthAction,\r
+                    virtualNetwork, userIntentVnMapping);\r
+\r
+            return;\r
+        }\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param flow TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @throws IntentResolutionException\r
+     */\r
+    public void resolveActions(User user, Operation operation, Flow flow,\r
+                               VirtualNetwork virtualNetwork,\r
+                               UserIntentVnMapping userIntentVnMapping)\r
+            throws IntentResolutionException {\r
+        List<Action> actions = operation.getAction();\r
+\r
+        ActionName actionName = new ActionName("deny");\r
+        Action denyAction = ActionResolverUtils.getAction(actions, actionName);\r
+\r
+        if ( null != denyAction ) {\r
+            resolveDenyAction(user, operation, flow, denyAction,\r
+                    virtualNetwork, userIntentVnMapping);\r
+\r
+            return;\r
+        }\r
+\r
+        actionName = new ActionName("allow");\r
+        Action allowAction = ActionResolverUtils.getAction(actions, actionName);\r
+\r
+        if ( null != allowAction ) {\r
+            resolveAllowAction(user, operation, flow, allowAction,\r
+                    virtualNetwork, userIntentVnMapping);\r
+\r
+            return;\r
+        }\r
+\r
+        actionName = new ActionName("go-through");\r
+        Action goThroughAction = ActionResolverUtils.getAction(actions, actionName);\r
+\r
+        if ( null != goThroughAction ) {\r
+            resolveGoThroughAction(user, operation, flow, goThroughAction,\r
+                    virtualNetwork, userIntentVnMapping);\r
+\r
+            return;\r
+        }\r
+\r
+        throw new IntentResolutionException("Unsupported action combination.");\r
+\r
+//        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param connection TODO\r
+     * @param qosBandwidthAction TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @throws IntentResolutionException\r
+     */\r
+    private void resolveQosBandwidthAction(User user, Operation operation, Connection connection,\r
+                                           Action qosBandwidthAction,\r
+                                           VirtualNetwork virtualNetwork,\r
+                                           UserIntentVnMapping userIntentVnMapping)\r
+            throws IntentResolutionException {\r
+        List<IntValue> parameterValues = qosBandwidthAction.getParameterValues().getIntValue();\r
+\r
+        if ( parameterValues.isEmpty() ) {\r
+            return;\r
+        }\r
+\r
+        IntValue parameterValue = parameterValues.get(0);\r
+        long requiredBandwidth = parameterValue.getValue();\r
+\r
+        PropertyName propertyName = new PropertyName("bandwidth");\r
+        Property property = IntentResolverUtils\r
+                .getConnectionProperty(connection.getProperty(), propertyName);\r
+        long currentBandwidth;\r
+\r
+        if ( null == property ) {\r
+            currentBandwidth = 0;\r
+        } else {\r
+            currentBandwidth = property.getPropertyValues().getIntValue().get(0).getValue();\r
+        }\r
+\r
+        if ( currentBandwidth == requiredBandwidth ) {\r
+            return;\r
+        }\r
+\r
+        List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+        IntentVnMappingResult intentVnMappingResult = IntentResolverUtils\r
+                .getIntentVnMappingResult(intentVnMappingResults, new IntentId(connection.getConnectionId()));\r
+\r
+        if ( null == intentVnMappingResult ) {\r
+            throw new IntentResolutionException("Can not get the intent-vn mapping result for " +\r
+                    "the connection " + connection.getConnectionId().getValue() + ".");\r
+        }\r
+\r
+        List<VirtualResource> virtualResources = intentVnMappingResult.getVirtualResource();\r
+        List<VirtualLink> virtualLinks = virtualNetwork.getVirtualLinks().getVirtualLink();\r
+        VirtualLinkId virtualLinkId;\r
+\r
+        for ( VirtualResource virtualResource : virtualResources ) {\r
+            virtualLinkId = new VirtualLinkId(virtualResource.getVirtualResourceEntityId().getValue());\r
+\r
+            ActionResolverUtils.modifyVirtualLinkBandwidth(virtualLinks, virtualLinkId, requiredBandwidth);\r
+        }\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param flow TODO\r
+     * @param denyAction TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @throws IntentResolutionException\r
+     */\r
+    private void resolveDenyAction(User user, Operation operation, Flow flow,\r
+                                   Action denyAction,\r
+                                   VirtualNetwork virtualNetwork,\r
+                                   UserIntentVnMapping userIntentVnMapping)\r
+            throws IntentResolutionException {\r
+        List<Node> nodes = user.getObjects().getNode();\r
+        List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
+        List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+\r
+        VirtualNode virtualNode = ActionResolverUtils\r
+                .getSourceVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+        if ( null == virtualNode ) {\r
+            throw new IntentResolutionException("Can not get the source virtual node " +\r
+                    "of the flow " + flow.getFlowId().getValue() + ".");\r
+        }\r
+\r
+        List<VirtualResource> virtualResources = new ArrayList<VirtualResource>(1);\r
+\r
+        VirtualResource virtualResource = new VirtualResourceBuilder()\r
+                .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+                .setVirtualResourceType(VirtualResource.VirtualResourceType.Vnode)\r
+                .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualNode.getNodeId().getValue()))\r
+                .setOrder(0L)\r
+                .build();\r
+        virtualResources.add(virtualResource);\r
+\r
+        IntentVnMappingResult intentVnMappingResult = new IntentVnMappingResultBuilder()\r
+                .setIntentId(new IntentId(operation.getOperationId().getValue()))\r
+                .setIntentType(IntentVnMappingResult.IntentType.Operation)\r
+                .setVirtualResource(virtualResources)\r
+                .build();\r
+        intentVnMappingResults.add(intentVnMappingResult);\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param flow TODO\r
+     * @param allowAction TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @throws IntentResolutionException\r
+     */\r
+    private void resolveAllowAction(User user, Operation operation, Flow flow,\r
+                                    Action allowAction,\r
+                                    VirtualNetwork virtualNetwork,\r
+                                    UserIntentVnMapping userIntentVnMapping)\r
+            throws IntentResolutionException {\r
+        List<Node> nodes = user.getObjects().getNode();\r
+        List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
+        List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+\r
+        VirtualNode sourceVirtualNode = ActionResolverUtils\r
+                .getSourceVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+        if ( null == sourceVirtualNode ) {\r
+            throw new IntentResolutionException("Can not get the source virtual node " +\r
+                    "of the flow " + flow.getFlowId().getValue() + ".");\r
+        }\r
+\r
+        VirtualNode destinationVirtualNode = ActionResolverUtils\r
+                .getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+        if ( null == destinationVirtualNode ) {\r
+            throw new IntentResolutionException("Can not get the destination virtual node " +\r
+                    "of the flow " + flow.getFlowId().getValue() + ".");\r
+        }\r
+\r
+        VNComputationUnit vnComputationUnit = vnComputationUnits.get(user.getUserId());\r
+\r
+        if ( null == vnComputationUnit ) {\r
+            throw new IntentResolutionException("Can not get the virtual network computation " +\r
+                    "unit for the user " + user.getUserId().getValue() + ".");\r
+        }\r
+\r
+        VirtualPath virtualPath = vnComputationUnit\r
+                .computePath(sourceVirtualNode.getNodeId(), destinationVirtualNode.getNodeId());\r
+\r
+        if ( null == virtualPath || virtualPath.getVirtualLink().isEmpty() ) {\r
+            throw new IntentResolutionException("Can not compute an available virtual path in " +\r
+                    "the virtual network for the flow " + flow.getFlowId().getValue() + ".");\r
+        }\r
+\r
+        virtualNetwork.getVirtualPaths().getVirtualPath().add(virtualPath);\r
+\r
+        List<VirtualResource> virtualResources = new ArrayList<VirtualResource>(1);\r
+\r
+        VirtualResource virtualResource = new VirtualResourceBuilder()\r
+                .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+                .setVirtualResourceType(VirtualResource.VirtualResourceType.Vpath)\r
+                .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPath.getPathId().getValue()))\r
+                .setOrder(0L)\r
+                .build();\r
+        virtualResources.add(virtualResource);\r
+\r
+        IntentVnMappingResult intentVnMappingResult = new IntentVnMappingResultBuilder()\r
+                .setIntentId(new IntentId(operation.getOperationId().getValue()))\r
+                .setIntentType(IntentVnMappingResult.IntentType.Operation)\r
+                .setVirtualResource(virtualResources)\r
+                .build();\r
+        intentVnMappingResults.add(intentVnMappingResult);\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param flow TODO\r
+     * @param goThroughAction TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @throws IntentResolutionException\r
+     */\r
+    private void resolveGoThroughAction(User user, Operation operation, Flow flow,\r
+                                        Action goThroughAction,\r
+                                        VirtualNetwork virtualNetwork,\r
+                                        UserIntentVnMapping userIntentVnMapping)\r
+            throws IntentResolutionException {\r
+        List<StringValue> parameterValues = goThroughAction.getParameterValues().getStringValue();\r
+\r
+        if ( !parameterValues.isEmpty() ) {\r
+            List<Node> nodes = user.getObjects().getNode();\r
+\r
+            if ( null == nodes || nodes.isEmpty() ) {\r
+                throw new IntentResolutionException("The nodes specified by the action parameters " +\r
+                        "of the operation " + operation.getOperationId().getValue() + " does not exist.");\r
+            }\r
+\r
+            NodeId nodeId = new NodeId(parameterValues.get(0).getValue());\r
+            Node node = IntentResolverUtils.getNode(nodes, nodeId);\r
+\r
+            if ( null == node ) {\r
+                throw new IntentResolutionException("The node " + nodeId.getValue() + " specified by the" +\r
+                        " action parameter of the operation " + operation.getOperationId().getValue() +\r
+                        " does not exist.");\r
+            }\r
+\r
+            if ( node.getNodeType().equals(new NodeType("chain-group")) ) {\r
+                resolveGoThroughChainGroupAction(user, operation, flow, goThroughAction, node,\r
+                        virtualNetwork, userIntentVnMapping);\r
+            } else {\r
+                resolveGoThroughNormalGroupAction(user, operation, flow, goThroughAction,\r
+                        virtualNetwork, userIntentVnMapping);\r
+            }\r
+        }\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param flow TODO\r
+     * @param goThroughAction TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @throws IntentResolutionException\r
+     */\r
+    private void resolveGoThroughNormalGroupAction(User user, Operation operation, Flow flow,\r
+                                                   Action goThroughAction,\r
+                                                   VirtualNetwork virtualNetwork,\r
+                                                   UserIntentVnMapping userIntentVnMapping)\r
+            throws IntentResolutionException {\r
+        List<Node> nodes = user.getObjects().getNode();\r
+        List<StringValue> parameterValues = goThroughAction.getParameterValues().getStringValue();\r
+        NodeId nodeId;\r
+        Node node;\r
+\r
+        for ( StringValue parameterValue : parameterValues ) {\r
+            nodeId = new NodeId(parameterValue.getValue());\r
+            node = IntentResolverUtils.getNode(nodes, nodeId);\r
+\r
+            if ( null == node ) {\r
+                throw new IntentResolutionException("The node " + nodeId.getValue() + " specified by the" +\r
+                        " action parameter of the operation " + operation.getOperationId().getValue() +\r
+                        " does not exist.");\r
+            }\r
+        }\r
+\r
+        List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
+        List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+        parameterValues = ActionResolverUtils.sortParameterValues(parameterValues);\r
+\r
+        List<VirtualNode> virtualNodes1 = new ArrayList<VirtualNode>(parameterValues.size());\r
+        IntentVnMappingResult intentVnMappingResult;\r
+        List<VirtualResource> virtualResources;\r
+        VirtualResource virtualResource;\r
+        VirtualNodeId virtualNodeId;\r
+        VirtualNode virtualNode;\r
+\r
+        for ( StringValue parameterValue : parameterValues ) {\r
+            intentVnMappingResult = IntentResolverUtils.getIntentVnMappingResult(\r
+                    intentVnMappingResults, new IntentId(parameterValue.getValue()));\r
+\r
+            if ( null == intentVnMappingResult ) {\r
+                throw new IntentResolutionException("Can not get the intent-vn mapping result " +\r
+                        "for the node " + parameterValue.getValue() + ".");\r
+            }\r
+\r
+            virtualResources = intentVnMappingResult.getVirtualResource();\r
+\r
+            if ( 1 != virtualResources.size() ) {\r
+                throw new IntentResolutionException("The type of the node " + parameterValue.getValue() +\r
+                        " specified by the action parameter of the operation " +\r
+                        operation.getOperationId().getValue() + " is not required," +\r
+                        " according to the intent-vn mapping result.");\r
+            }\r
+\r
+            virtualResource = virtualResources.get(0);\r
+\r
+            if ( VirtualResource.VirtualResourceType.Vport\r
+                    == virtualResource.getVirtualResourceType() ) {\r
+                virtualNodeId = new VirtualNodeId(virtualResource.getParentVirtualResourceEntityId().getValue());\r
+            } else if ( VirtualResource.VirtualResourceType.Vnode\r
+                    == virtualResource.getVirtualResourceType() ) {\r
+                virtualNodeId = new VirtualNodeId(virtualResource.getVirtualResourceEntityId().getValue());\r
+            } else {\r
+                throw new IntentResolutionException("The type of the node " + parameterValue.getValue() +\r
+                        " specified by the action parameter of the operation " +\r
+                        operation.getOperationId().getValue() + " is not required," +\r
+                        " according to the intent-vn mapping result.");\r
+            }\r
+\r
+            virtualNode = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);\r
+\r
+            if ( null == virtualNode ) {\r
+                throw new IntentResolutionException("Can not get the virtual node created for" +\r
+                        " the node " + parameterValue.getValue() + ".");\r
+            }\r
+\r
+            if ( VirtualNode.NodeType.Vrouter != virtualNode.getNodeType() ) {\r
+                throw new IntentResolutionException("The type of the node " + parameterValue.getValue() +\r
+                        " specified by the action parameter of the operation " +\r
+                        operation.getOperationId().getValue() + " is not required," +\r
+                        " according to the virtual node created for it.");\r
+            }\r
+\r
+            virtualNodes1.add(virtualNode);\r
+        }\r
+\r
+        VirtualNode sourceVirtualNode = ActionResolverUtils\r
+                .getSourceVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+        if ( null == sourceVirtualNode ) {\r
+            throw new IntentResolutionException("Can not get the source virtual node " +\r
+                    "of the flow " + flow.getFlowId().getValue() + ".");\r
+        }\r
+\r
+        VirtualNode destinationVirtualNode = ActionResolverUtils\r
+                .getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+        if ( null == destinationVirtualNode ) {\r
+            throw new IntentResolutionException("Can not get the destination virtual node " +\r
+                    "of the flow " + flow.getFlowId().getValue() + ".");\r
+        }\r
+\r
+        VNComputationUnit vnComputationUnit = vnComputationUnits.get(user.getUserId());\r
+\r
+        if ( null == vnComputationUnit ) {\r
+            throw new IntentResolutionException("Can not get the virtual network computation " +\r
+                    "unit for the user " + user.getUserId().getValue() + ".");\r
+        }\r
+\r
+        List<VirtualPath> virtualPaths = new ArrayList<VirtualPath>(virtualNodes1.size() + 1);\r
+        Iterator<VirtualNode> iterator = virtualNodes1.iterator();\r
+        VirtualNode firstVirtualNode = iterator.next();\r
+        VirtualNode secondVirtualNode;\r
+        VirtualPath virtualPath;\r
+\r
+        if ( !sourceVirtualNode.getNodeId().equals(firstVirtualNode.getNodeId()) ) {\r
+            virtualPath = vnComputationUnit\r
+                    .computePath(sourceVirtualNode.getNodeId(), firstVirtualNode.getNodeId());\r
+\r
+            if ( null == virtualPath || virtualPath.getVirtualLink().isEmpty() ) {\r
+                throw new IntentResolutionException("Can not compute an available virtual path" +\r
+                        " from the virtual node " + sourceVirtualNode.getNodeId().getValue() +\r
+                        " to " + firstVirtualNode.getNodeId().getValue() + " in the virtual" +\r
+                        " network for the flow " + flow.getFlowId().getValue() + ".");\r
+            }\r
+\r
+            virtualPaths.add(virtualPath);\r
+        }\r
+\r
+        while ( iterator.hasNext() ) {\r
+            secondVirtualNode = iterator.next();\r
+\r
+            if ( !firstVirtualNode.getNodeId().equals(secondVirtualNode.getNodeId()) ) {\r
+                virtualPath = vnComputationUnit\r
+                        .computePath(firstVirtualNode.getNodeId(), secondVirtualNode.getNodeId());\r
+\r
+                if ( null == virtualPath || virtualPath.getVirtualLink().isEmpty() ) {\r
+                    throw new IntentResolutionException("Can not compute an available virtual path" +\r
+                            " from the virtual node " + firstVirtualNode.getNodeId().getValue() +\r
+                            " to " + secondVirtualNode.getNodeId().getValue() + " in the virtual" +\r
+                            " network for the flow " + flow.getFlowId().getValue() + ".");\r
+                }\r
+\r
+                virtualPaths.add(virtualPath);\r
+            }\r
+\r
+            firstVirtualNode = secondVirtualNode;\r
+        }\r
+\r
+        if ( !destinationVirtualNode.getNodeId().equals(firstVirtualNode.getNodeId()) ) {\r
+            virtualPath = vnComputationUnit\r
+                    .computePath(firstVirtualNode.getNodeId(), destinationVirtualNode.getNodeId());\r
+\r
+            if ( null == virtualPath || virtualPath.getVirtualLink().isEmpty() ) {\r
+                throw new IntentResolutionException("Can not compute an available virtual path" +\r
+                        " from the virtual node " + firstVirtualNode.getNodeId().getValue() +\r
+                        " to " + destinationVirtualNode.getNodeId().getValue() + " in the virtual" +\r
+                        " network for the flow " + flow.getFlowId().getValue() + ".");\r
+            }\r
+\r
+            virtualPaths.add(virtualPath);\r
+        }\r
+\r
+        virtualPath = ActionResolverUtils.mergeVirtualPaths(virtualPaths);\r
+        virtualNetwork.getVirtualPaths().getVirtualPath().add(virtualPath);\r
+\r
+        virtualResources = new ArrayList<VirtualResource>(1);\r
+\r
+        virtualResource = new VirtualResourceBuilder()\r
+                .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+                .setVirtualResourceType(VirtualResource.VirtualResourceType.Vpath)\r
+                .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPath.getPathId().getValue()))\r
+                .setOrder(0L)\r
+                .build();\r
+        virtualResources.add(virtualResource);\r
+\r
+        intentVnMappingResult = new IntentVnMappingResultBuilder()\r
+                .setIntentId(new IntentId(operation.getOperationId().getValue()))\r
+                .setIntentType(IntentVnMappingResult.IntentType.Operation)\r
+                .setVirtualResource(virtualResources)\r
+                .build();\r
+        intentVnMappingResults.add(intentVnMappingResult);\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param flow TODO\r
+     * @param goThroughAction TODO\r
+     * @param chainGroup TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @throws IntentResolutionException\r
+     */\r
+    private void resolveGoThroughChainGroupAction(User user, Operation operation, Flow flow,\r
+                                                  Action goThroughAction, Node chainGroup,\r
+                                                  VirtualNetwork virtualNetwork,\r
+                                                  UserIntentVnMapping userIntentVnMapping)\r
+            throws IntentResolutionException {\r
+        List<Node> nodes = user.getObjects().getNode();\r
+        List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
+        List<VirtualLink> virtualLinks = virtualNetwork.getVirtualLinks().getVirtualLink();\r
+        List<VirtualPath> virtualPaths = virtualNetwork.getVirtualPaths().getVirtualPath();\r
+        List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+        List<VirtualResource> virtualResources = null;\r
+\r
+        if ( IntentResolverUtils.checkAllLayer2OperatingMode(chainGroup.getSubNode(), nodes) ) {\r
+            // TODO\r
+        } else if ( IntentResolverUtils.checkAllLayer3OperatingMode(chainGroup.getSubNode(), nodes) ) {\r
+            IntentVnMappingResult intentVnMappingResult = IntentResolverUtils.getIntentVnMappingResult(\r
+                    intentVnMappingResults, new IntentId(chainGroup.getNodeId().getValue()));\r
+\r
+            if ( null == intentVnMappingResult ) {\r
+                throw new IntentResolutionException("Can not get the intent-vn mapping result " +\r
+                        "for the node " + chainGroup.getNodeId().getValue() + ".");\r
+            }\r
+\r
+            VirtualNode sourceVirtualNode = ActionResolverUtils.getSourceVirtualRouterOfFlow(\r
+                    virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+            if ( null == sourceVirtualNode ) {\r
+                throw new IntentResolutionException("Can not get the source virtual node " +\r
+                        "of the flow " + flow.getFlowId().getValue() + ".");\r
+            }\r
+\r
+            VirtualNode destinationVirtualNode = ActionResolverUtils.getDestinationVirtualRouterOfFlow(\r
+                    virtualNodes, flow, nodes, intentVnMappingResults);\r
+\r
+            if ( null == destinationVirtualNode ) {\r
+                throw new IntentResolutionException("Can not get the destination virtual node " +\r
+                        "of the flow " + flow.getFlowId().getValue() + ".");\r
+            }\r
+\r
+            List<VirtualResource> virtualResources1 = ActionResolverUtils\r
+                    .sortVirtualResources(intentVnMappingResult.getVirtualResource());\r
+\r
+            VirtualNodeId virtualNodeId = new VirtualNodeId(virtualResources1.get(0)\r
+                    .getParentVirtualResourceEntityId().getValue());\r
+            VirtualNode virtualNode = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);\r
+\r
+            if ( null == virtualNode ) {\r
+                throw new IntentResolutionException("Can not get the virtual node" +\r
+                        " created for the first sub-node of the node " +\r
+                        intentVnMappingResult.getIntentId().getValue() + ".");\r
+            }\r
+\r
+            virtualNodeId = new VirtualNodeId(virtualResources1.get(virtualResources1.size() - 1)\r
+                    .getParentVirtualResourceEntityId().getValue());\r
+            VirtualNode virtualNode1 = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);\r
+\r
+            if ( null == virtualNode1 ) {\r
+                throw new IntentResolutionException("Can not get the virtual node" +\r
+                        " created for the last sub-node of the node " +\r
+                        intentVnMappingResult.getIntentId().getValue() + ".");\r
+            }\r
+\r
+            virtualResources = new ArrayList<VirtualResource>(virtualResources1.size() + 2);\r
+            VirtualLink virtualLink = IntentResolverUtils.getVirtualLink(virtualLinks,\r
+                    sourceVirtualNode.getNodeId(), virtualNode.getNodeId());\r
+\r
+            if ( null == virtualLink ) {\r
+                VirtualPort virtualPort = new VirtualPortBuilder()\r
+                        .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
+                        .setPortType(VirtualPort.PortType.Internal)\r
+                        .build();\r
+                sourceVirtualNode.getVirtualPort().add(virtualPort);\r
+\r
+                VirtualPort virtualPort1 = new VirtualPortBuilder()\r
+                        .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
+                        .setPortType(VirtualPort.PortType.Internal)\r
+                        .build();\r
+                virtualNode.getVirtualPort().add(virtualPort1);\r
+\r
+                virtualLink = new VirtualLinkBuilder()\r
+                        .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
+                        .setSrcNodeId(virtualNode.getNodeId())\r
+                        .setSrcPortId(virtualPort1.getPortId())\r
+                        .setDestNodeId(sourceVirtualNode.getNodeId())\r
+                        .setDestPortId(virtualPort.getPortId())\r
+                        .setBandwidth(0L)\r
+                        .build();\r
+                virtualLinks.add(virtualLink);\r
+\r
+                virtualLink = new VirtualLinkBuilder()\r
+                        .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
+                        .setSrcNodeId(sourceVirtualNode.getNodeId())\r
+                        .setSrcPortId(virtualPort.getPortId())\r
+                        .setDestNodeId(virtualNode.getNodeId())\r
+                        .setDestPortId(virtualPort1.getPortId())\r
+                        .setBandwidth(0L)\r
+                        .build();\r
+                virtualLinks.add(virtualLink);\r
+            }\r
+\r
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink> virtualLinks1 =\r
+                    new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink>(1);\r
+            org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink virtualLink1 =\r
+                    new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLinkBuilder()\r
+                            .setLinkId(virtualLink.getLinkId())\r
+                            .setOrder(0L)\r
+                            .build();\r
+            virtualLinks1.add(virtualLink1);\r
+\r
+            VirtualPath virtualPath = new VirtualPathBuilder()\r
+                    .setPathId(new VirtualPathId(UUID.randomUUID().toString()))\r
+                    .setVirtualLink(virtualLinks1)\r
+                    .setBandwidth(0L)\r
+                    .build();\r
+            virtualPaths.add(virtualPath);\r
+\r
+            VirtualResource virtualResource = new VirtualResourceBuilder()\r
+                    .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+                    .setVirtualResourceType(VirtualResource.VirtualResourceType.Vpath)\r
+                    .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPath.getPathId().getValue()))\r
+                    .setOrder(0L)\r
+                    .build();\r
+            virtualResources.add(virtualResource);\r
+\r
+            for ( VirtualResource virtualResource1 : virtualResources1 ) {\r
+                virtualResource = new VirtualResourceBuilder(virtualResource1)\r
+                        .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+                        .setOrder((long)virtualResources.size())\r
+                        .build();\r
+                virtualResources.add(virtualResource);\r
+            }\r
+\r
+            virtualLink = IntentResolverUtils.getVirtualLink(virtualLinks,\r
+                    virtualNode1.getNodeId(), destinationVirtualNode.getNodeId());\r
+\r
+            if ( null == virtualLink ) {\r
+                VirtualPort virtualPort = new VirtualPortBuilder()\r
+                        .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
+                        .setPortType(VirtualPort.PortType.Internal)\r
+                        .build();\r
+                virtualNode1.getVirtualPort().add(virtualPort);\r
+\r
+                VirtualPort virtualPort1 = new VirtualPortBuilder()\r
+                        .setPortId(new VirtualPortId(UUID.randomUUID().toString()))\r
+                        .setPortType(VirtualPort.PortType.Internal)\r
+                        .build();\r
+                destinationVirtualNode.getVirtualPort().add(virtualPort1);\r
+\r
+                virtualLink = new VirtualLinkBuilder()\r
+                        .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
+                        .setSrcNodeId(destinationVirtualNode.getNodeId())\r
+                        .setSrcPortId(virtualPort1.getPortId())\r
+                        .setDestNodeId(virtualNode1.getNodeId())\r
+                        .setDestPortId(virtualPort.getPortId())\r
+                        .setBandwidth(0L)\r
+                        .build();\r
+                virtualLinks.add(virtualLink);\r
+\r
+                virtualLink = new VirtualLinkBuilder()\r
+                        .setLinkId(new VirtualLinkId(UUID.randomUUID().toString()))\r
+                        .setSrcNodeId(virtualNode1.getNodeId())\r
+                        .setSrcPortId(virtualPort.getPortId())\r
+                        .setDestNodeId(destinationVirtualNode.getNodeId())\r
+                        .setDestPortId(virtualPort1.getPortId())\r
+                        .setBandwidth(0L)\r
+                        .build();\r
+                virtualLinks.add(virtualLink);\r
+            }\r
+\r
+            virtualLinks1 = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink>(1);\r
+            virtualLink1 = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLinkBuilder()\r
+                    .setLinkId(virtualLink.getLinkId())\r
+                    .setOrder(0L)\r
+                    .build();\r
+            virtualLinks1.add(virtualLink1);\r
+\r
+            virtualPath = new VirtualPathBuilder()\r
+                    .setPathId(new VirtualPathId(UUID.randomUUID().toString()))\r
+                    .setVirtualLink(virtualLinks1)\r
+                    .setBandwidth(0L)\r
+                    .build();\r
+            virtualPaths.add(virtualPath);\r
+\r
+            virtualResource = new VirtualResourceBuilder()\r
+                    .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+                    .setVirtualResourceType(VirtualResource.VirtualResourceType.Vpath)\r
+                    .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualPath.getPathId().getValue()))\r
+                    .setOrder((long) virtualResources.size())\r
+                    .build();\r
+            virtualResources.add(virtualResource);\r
+        } else {\r
+            // TODO\r
+        }\r
+\r
+        IntentVnMappingResult intentVnMappingResult = new IntentVnMappingResultBuilder()\r
+                .setIntentId(new IntentId(operation.getOperationId().getValue()))\r
+                .setIntentType(IntentVnMappingResult.IntentType.Operation)\r
+                .setVirtualResource(virtualResources)\r
+                .build();\r
+\r
+        intentVnMappingResults.add(intentVnMappingResult);\r
+\r
+        return;\r
+    }\r
+}\r
diff --git a/nemo-impl/src/main/java/org/opendaylight/nemo/intent/action/ActionResolverUtils.java b/nemo-impl/src/main/java/org/opendaylight/nemo/intent/action/ActionResolverUtils.java
new file mode 100644 (file)
index 0000000..822ab92
--- /dev/null
@@ -0,0 +1,347 @@
+/*\r
+ * Copyright (c) 2015 Huawei, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.nemo.intent.action;\r
+\r
+import org.opendaylight.nemo.intent.IntentResolverUtils;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.nodes.VirtualNode;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.paths.VirtualPath;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.paths.VirtualPathBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLinkBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.IntentVnMappingResult;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.intent.vn.mapping.result.VirtualResource;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.*;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualLinkId;\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.VirtualPathId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.flow.instance.MatchItem;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.Property;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.property.values.StringValue;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action;\r
+\r
+import java.util.ArrayList;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+import java.util.UUID;\r
+\r
+/**\r
+ * Implement the common utilities frequently used in\r
+ * the action resolution.\r
+ *\r
+ * @author Zhigang Ji\r
+ */\r
+public class ActionResolverUtils {\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param actions TODO\r
+     * @param actionName TODO\r
+     * @return TODO\r
+     */\r
+    protected static Action getAction(List<Action> actions, ActionName actionName) {\r
+        for ( Action action : actions ) {\r
+            if ( action.getActionName().equals(actionName) ) {\r
+                return action;\r
+            }\r
+        }\r
+\r
+        return null;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param virtualLinks TODO\r
+     * @param virtualLinkId TODO\r
+     * @param bandwidth TODO\r
+     */\r
+    protected static void modifyVirtualLinkBandwidth(\r
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink> virtualLinks,\r
+            VirtualLinkId virtualLinkId, long bandwidth) {\r
+        int i = 0;\r
+\r
+        for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink\r
+                virtualLink : virtualLinks ) {\r
+            if ( virtualLink.getLinkId().equals(virtualLinkId) ) {\r
+                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink virtualLink1 =\r
+                        new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLinkBuilder(virtualLink)\r
+                                .setBandwidth(bandwidth)\r
+                                .build();\r
+\r
+                virtualLinks.set(i, virtualLink1);\r
+\r
+                return;\r
+            }\r
+\r
+            i++;\r
+        }\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param virtualResources TODO\r
+     * @return TODO\r
+     */\r
+    protected static List<VirtualResource> sortVirtualResources(List<VirtualResource> virtualResources) {\r
+        if ( virtualResources.isEmpty() || 1 == virtualResources.size() ) {\r
+            return virtualResources;\r
+        }\r
+\r
+        List<VirtualResource> sortedVirtualResources = new ArrayList<VirtualResource>(virtualResources.size());\r
+        sortedVirtualResources.addAll(virtualResources);\r
+\r
+        for ( VirtualResource virtualResource : virtualResources ) {\r
+            sortedVirtualResources.set(virtualResource.getOrder().intValue(), virtualResource);\r
+        }\r
+\r
+        return sortedVirtualResources;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param parameterValues TODO\r
+     * @return TODO\r
+     */\r
+    protected static List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue> sortParameterValues(\r
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue> parameterValues) {\r
+        if ( parameterValues.isEmpty() || 1 == parameterValues.size() ) {\r
+            return parameterValues;\r
+        }\r
+\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue> sortedParameterValues =\r
+                new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue>(parameterValues.size());\r
+        sortedParameterValues.addAll(parameterValues);\r
+\r
+        for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.action.instance.parameter.values.StringValue\r
+                parameterValue : parameterValues ) {\r
+            sortedParameterValues.set(parameterValue.getOrder().intValue(), parameterValue);\r
+        }\r
+\r
+        return sortedParameterValues;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param virtualNodes TODO\r
+     * @param flow TODO\r
+     * @param nodes TODO\r
+     * @param intentVnMappingResults TODO\r
+     * @return TODO\r
+     */\r
+    protected static VirtualNode getSourceVirtualRouterOfFlow(List<VirtualNode> virtualNodes,\r
+                                                              Flow flow, List<Node> nodes,\r
+                                                              List<IntentVnMappingResult> intentVnMappingResults) {\r
+        MatchItemName matchItemName = new MatchItemName("src-ip");\r
+        MatchItem matchItem = getMatchItem(flow.getMatchItem(), matchItemName);\r
+\r
+        if ( null == matchItem ) {\r
+            return null;\r
+        }\r
+\r
+        String matchItemValue = matchItem.getMatchItemValue().getStringValue();\r
+        VirtualNode virtualNode = getVirtualRouterWithIpPrefix(virtualNodes,\r
+                matchItemValue, nodes, intentVnMappingResults);\r
+\r
+        return virtualNode;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param virtualNodes TODO\r
+     * @param flow TODO\r
+     * @param nodes TODO\r
+     * @param intentVnMappingResults TODO\r
+     * @return TODO\r
+     */\r
+    protected static VirtualNode getDestinationVirtualRouterOfFlow(List<VirtualNode> virtualNodes,\r
+                                                                   Flow flow, List<Node> nodes,\r
+                                                                   List<IntentVnMappingResult> intentVnMappingResults) {\r
+        MatchItemName matchItemName = new MatchItemName("dst-ip");\r
+        MatchItem matchItem = getMatchItem(flow.getMatchItem(), matchItemName);\r
+\r
+        if ( null == matchItem ) {\r
+            return null;\r
+        }\r
+\r
+        String matchItemValue = matchItem.getMatchItemValue().getStringValue();\r
+        VirtualNode virtualNode = getVirtualRouterWithIpPrefix(virtualNodes,\r
+                matchItemValue, nodes, intentVnMappingResults);\r
+\r
+        return virtualNode;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param virtualPaths TODO\r
+     * @return TODO\r
+     */\r
+    protected static VirtualPath mergeVirtualPaths(List<VirtualPath> virtualPaths) {\r
+        if ( virtualPaths.isEmpty() ) {\r
+            VirtualPath virtualPath = new VirtualPathBuilder()\r
+                    .setPathId(new VirtualPathId(UUID.randomUUID().toString()))\r
+                    .setVirtualLink(new ArrayList<VirtualLink>(0))\r
+                    .setMetric(0L)\r
+                    .setBandwidth(0L)\r
+                    .setDelay(0L)\r
+                    .build();\r
+\r
+            return virtualPath;\r
+        }\r
+\r
+        if ( 1 == virtualPaths.size() ) {\r
+            return virtualPaths.get(0);\r
+        }\r
+\r
+        List<VirtualLink> virtualLinks = new LinkedList<VirtualLink>();\r
+        VirtualLink virtualLink;\r
+        long metric = 0;\r
+        long bandwidth = Long.MAX_VALUE;\r
+        long delay = 0;\r
+\r
+        for ( VirtualPath virtualPath : virtualPaths ) {\r
+            for ( VirtualLink virtualLink1 : virtualPath.getVirtualLink() ) {\r
+                virtualLink = new VirtualLinkBuilder(virtualLink1)\r
+                        .setOrder((long)virtualLinks.size())\r
+                        .build();\r
+                virtualLinks.add(virtualLink);\r
+            }\r
+\r
+            metric += virtualPath.getMetric();\r
+            delay += virtualPath.getDelay();\r
+\r
+            if ( virtualPath.getBandwidth() < bandwidth ) {\r
+                bandwidth = virtualPath.getBandwidth();\r
+            }\r
+        }\r
+\r
+        VirtualPath virtualPath = new VirtualPathBuilder()\r
+                .setPathId(new VirtualPathId(UUID.randomUUID().toString()))\r
+                .setVirtualLink(virtualLinks)\r
+                .setMetric(metric)\r
+                .setBandwidth(bandwidth)\r
+                .setDelay(delay)\r
+                .build();\r
+\r
+        return virtualPath;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param matchItems TODO\r
+     * @param matchItemName TODO\r
+     * @return TODO\r
+     */\r
+    private static MatchItem getMatchItem(List<MatchItem> matchItems, MatchItemName matchItemName) {\r
+        if ( null != matchItems ) {\r
+            for ( MatchItem matchItem : matchItems ) {\r
+                if ( matchItem.getMatchItemName().equals(matchItemName) ) {\r
+                    return matchItem;\r
+                }\r
+            }\r
+        }\r
+\r
+        return null;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param virtualNodes TODO\r
+     * @param ipPrefix TODO\r
+     * @param nodes TODO\r
+     * @param intentVnMappingResults TODO\r
+     * @return TODO\r
+     */\r
+    private static VirtualNode getVirtualRouterWithIpPrefix(List<VirtualNode> virtualNodes,\r
+                                                            String ipPrefix, List<Node> nodes,\r
+                                                            List<IntentVnMappingResult> intentVnMappingResults) {\r
+        NodeType layer2GroupNodeType = new NodeType("l2-group");\r
+        NodeType externalGroupNodeType = new NodeType("ext-group");\r
+        PropertyName propertyName = new PropertyName("ip-prefix");\r
+        Property property;\r
+        List<StringValue> propertyValues;\r
+        IntentVnMappingResult intentVnMappingResult;\r
+        VirtualResource virtualResource;\r
+        VirtualNodeId virtualNodeId;\r
+        VirtualNode virtualNode;\r
+\r
+        for ( Node node : nodes ) {\r
+            if ( node.getNodeType().equals(layer2GroupNodeType)\r
+                    || node.getNodeType().equals(externalGroupNodeType) ) {\r
+                property = IntentResolverUtils.getNodeProperty(node.getProperty(), propertyName);\r
+\r
+                if ( null != property ) {\r
+                    propertyValues = property.getPropertyValues().getStringValue();\r
+\r
+                    if ( containPropertyValue(propertyValues, ipPrefix) ) {\r
+                        intentVnMappingResult = IntentResolverUtils.getIntentVnMappingResult(\r
+                                intentVnMappingResults, new IntentId(node.getNodeId().getValue()));\r
+\r
+                        if ( null == intentVnMappingResult ) {\r
+                            return null;\r
+                        }\r
+\r
+                        virtualResource = intentVnMappingResult.getVirtualResource().get(0);\r
+\r
+                        if ( VirtualResource.VirtualResourceType.Vport\r
+                                == virtualResource.getVirtualResourceType() ) {\r
+                            virtualNodeId = new VirtualNodeId(\r
+                                    virtualResource.getParentVirtualResourceEntityId().getValue());\r
+                        } else if ( VirtualResource.VirtualResourceType.Vnode\r
+                                == virtualResource.getVirtualResourceType() ) {\r
+                            virtualNodeId = new VirtualNodeId(\r
+                                    virtualResource.getVirtualResourceEntityId().getValue());\r
+                        } else {\r
+                            return null;\r
+                        }\r
+\r
+                        virtualNode = IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);\r
+\r
+                        if ( null == virtualNode ) {\r
+                            return null;\r
+                        }\r
+\r
+                        if ( VirtualNode.NodeType.Vrouter == virtualNode.getNodeType() ) {\r
+                            return virtualNode;\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        return null;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param propertyValues TODO\r
+     * @param propertyValue TODO\r
+     * @return TODO\r
+     */\r
+    private static boolean containPropertyValue(List<StringValue> propertyValues, String propertyValue) {\r
+        for ( StringValue stringValue : propertyValues ) {\r
+            if ( stringValue.getValue().equals(propertyValue) ) {\r
+                return true;\r
+            }\r
+        }\r
+\r
+        return false;\r
+    }\r
+}\r
index 24b28deac914f75330635311ebb7c5788be4c879..4458e5fdfe811384925b362a1ef79004d8a58612 100644 (file)
@@ -259,29 +259,63 @@ public class VNMappingUnit implements AutoCloseable {
         return;\r
     }\r
 \r
-    @Override\r
-    public void close() throws Exception {\r
-        for ( Map<PhysicalPortId, ListenerRegistration<DataChangeListener>>\r
-                physicalPortChangeListenerRegs1 : physicalPortChangeListenerRegs.values() ) {\r
-            for ( ListenerRegistration<DataChangeListener>\r
-                    physicalPortChangeListenerReg : physicalPortChangeListenerRegs1.values() ) {\r
-                if ( null != physicalPortChangeListenerReg ) {\r
-                    physicalPortChangeListenerReg.close();\r
-                }\r
+    /**\r
+     * TODO\r
+     *\r
+     * @param virtualNetwork TODO\r
+     * @param unmappedVirtualLinks TODO\r
+     * @param userVnPnMapping TODO\r
+     * @param physicalPaths TODO\r
+     * @throws VNMappingException\r
+     */\r
+    public void virtualNetworkMapping(VirtualNetwork virtualNetwork, List<VirtualLink> unmappedVirtualLinks,\r
+                                      UserVnPnMapping userVnPnMapping, List<PhysicalPath> physicalPaths)\r
+            throws VNMappingException {\r
+        List<VirtualLink> virtualLinks = virtualNetwork.getVirtualLinks().getVirtualLink();\r
+        List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+        PhysicalPath physicalPath;\r
+        VirtualLink newVirtualLink;\r
+        VnPnMappingResult vnPnMappingResult;\r
+        int i = virtualLinks.size() - unmappedVirtualLinks.size();\r
+\r
+        for ( VirtualLink virtualLink : unmappedVirtualLinks ) {\r
+            physicalPath = virtualLinkMapping(virtualNetwork.getNetworkId(), virtualLink, userVnPnMapping);\r
+\r
+            if ( null == physicalPath ) {\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
 \r
-        if ( null != physicalNodeChangeListenerReg ) {\r
-            physicalNodeChangeListenerReg.close();\r
-        }\r
+            physicalPaths.add(physicalPath);\r
+\r
+            newVirtualLink = new VirtualLinkBuilder(virtualLink)\r
+                    .setMetric(physicalPath.getMetric())\r
+                    .setDelay(physicalPath.getDelay())\r
+                    .build();\r
+\r
+            virtualLinks.set(i++, newVirtualLink);\r
 \r
-        if ( null != physicalLinkChangeListenerReg ) {\r
-            physicalLinkChangeListenerReg.close();\r
+            vnPnMappingResult = new VnPnMappingResultBuilder()\r
+                    .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
+                    .setVirtualResourceType(VirtualResourceInstance.VirtualResourceType.Vlink)\r
+                    .setVirtualResourceEntityId(new VirtualResourceEntityId(virtualLink.getLinkId().getValue()))\r
+                    .setPhysicalResourceId(new PhysicalResourceId(UUID.randomUUID().toString()))\r
+                    .setPhysicalResourceType(PhysicalResourceInstance.PhysicalResourceType.Path)\r
+                    .setPhysicalResourceEntityId(new PhysicalResourceEntityId(physicalPath.getPathId().getValue()))\r
+                    .build();\r
+\r
+            vnPnMappingResults.add(vnPnMappingResult);\r
         }\r
 \r
         return;\r
     }\r
 \r
+    @Override\r
+    public void close() throws Exception {\r
+        return;\r
+    }\r
+\r
     /**\r
      * TODO\r
      *\r
@@ -292,7 +326,7 @@ public class VNMappingUnit implements AutoCloseable {
      * @return TODO\r
      */\r
     private PhysicalPort virtualPortMapping(VirtualNetworkId virtualNetworkId, VirtualNodeId virtualNodeId,\r
-                                    VirtualPort virtualPort, PhysicalNode physicalNode)\r
+                                            VirtualPort virtualPort, PhysicalNode physicalNode)\r
             throws VNMappingException {\r
         if ( VirtualPort.PortType.Internal == virtualPort.getPortType() ) {\r
             return null;\r
index 5e213e08e1835874098c462a7e4ff656f783c0f2..a9789cc1452c6139ce9478d4d05ef2d27e0d4e96 100644 (file)
@@ -39,13 +39,13 @@ public class NemoEngineModule extends org.opendaylight.yang.gen.v1.urn.opendayli
             public NemoEngine() {
                 rpcRegistration = rpcProviderRegistry.addRpcImplementation(NemoIntentService.class, userManager);
             }
-            
+
             @Override
             public void close() throws Exception {
                 if (null != rpcRegistration) {
                     rpcRegistration.close();
                 }
-                
+
                 if ( null != intentResolver ) {
                     intentResolver.close();
                 }
diff --git a/nemo-impl/src/test/java/org/opendaylight/nemo/intent/IntentResolverUtilsTest.java b/nemo-impl/src/test/java/org/opendaylight/nemo/intent/IntentResolverUtilsTest.java
deleted file mode 100644 (file)
index c8e977e..0000000
+++ /dev/null
@@ -1,756 +0,0 @@
-package org.opendaylight.nemo.intent;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.opendaylight.nemo.intent.IntentResolverUtils;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualResourceEntityId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.VirtualResourceInstance.VirtualResourceType;
-import static org.junit.Assert.*;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.hosts.PhysicalHost;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.links.VirtualLink;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.networks.virtual.network.virtual.nodes.VirtualNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.IntentVnMappingResult;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.intent.vn.mapping.results.user.intent.vn.mapping.intent.vn.mapping.result.VirtualResource;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.*;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalHostId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalNodeId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNodeId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.Objects;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Connection;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Node;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.operations.Operation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.flow.instance.MatchItem;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.Property;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.node.instance.SubNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.property.values.StringValue;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.match.item.instance.MatchItemValue;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.property.instance.PropertyValues;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.NodeId;
-//import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import static org.mockito.Mockito.*;
-
-/**
- * Created by zhangmeng on 2015/11/26.
- */
-public class IntentResolverUtilsTest extends IntentResolverUtils {
-
-    @Before
-    public void setUp() throws Exception {
-
-    }
-
-    @Test
-    public void testCheckExternalLayer3Group() throws Exception {
-        Node node = mock(Node.class);
-        List<Property> properties = new LinkedList<Property>();
-        Property property = mock(Property.class);
-        properties.add(property);
-
-        when(node.getProperty()).thenReturn(null);//avoid testing method "getNodeProperty"
-        IntentResolverUtils.checkExternalLayer3Group(node);
-        verify(node).getProperty();
-
-        //test method "getNodeProperty". and method "CheckExternalLayer3Group"`s another branch
-//        when(node.getProperty()).thenReturn(properties);
-//        when(property.getPropertyName()).thenReturn(new PropertyName("ac-info-network"));
-
-        /* anther branch can`t be tested. The reason is that I cannot known the method property.getPropertyValues() returns what object.
-           So I cant`t mock the needed object
-        */
-    }
-
-    @Test
-    public void testGetPhysicalHost() throws Exception {
-        List<PhysicalHost> physicalHosts = new LinkedList<PhysicalHost>();
-        Node node =  mock(Node.class);
-        NodeId nodeId = mock(NodeId.class);
-
-        when(node.getNodeId()).thenReturn(nodeId);
-        when(nodeId.getValue()).thenReturn(new String("00001111-0000-0000-0000-000011112222"));
-
-        // test private method "getPhysicalHost"
-        PhysicalHost physicalHost = mock(PhysicalHost.class);
-        physicalHosts.add(physicalHost);
-        when(physicalHost.getHostId())
-                .thenReturn(new PhysicalHostId("00001111-0000-0000-0000-000011112222"))
-                .thenReturn(new PhysicalHostId("00001111-0000-0000-0000-000011112221"));
-
-        IntentResolverUtils.getPhysicalHost(physicalHosts, node);
-        IntentResolverUtils.getPhysicalHost(physicalHosts,node);
-        verify(node,times(2)).getNodeId();
-        verify(nodeId,times(2)).getValue();
-        verify(physicalHost,times(2)).getHostId();
-    }
-
-    @Test
-    public void testGetNodeProperty() throws Exception {
-        List<Property> properties = new LinkedList<Property>();
-        PropertyName propertyName = new PropertyName("test");
-        Property property = mock(Property.class);
-        properties.add(property);
-
-        when(property.getPropertyName()).thenReturn(propertyName);
-        IntentResolverUtils.getNodeProperty(properties, propertyName);
-        verify(property).getPropertyName();
-
-        IntentResolverUtils.getNodeProperty(null, propertyName);
-    }
-
-    @Test
-    public void testGeneratePhysicalNodeIdFromNodeLocationProperty() throws Exception {
-        //method can`t be tested because of "String propertyValue = property.getPropertyValues().getStringValue().get(0).getValue();"
-
-    }
-
-    @Test
-    public void testGetIntentVnMappingResult() throws Exception {
-        List<IntentVnMappingResult> intentVnMappingResults =  new LinkedList<IntentVnMappingResult>();
-        IntentId intentId = mock(IntentId.class);
-        IntentVnMappingResult intentVnMappingResult = mock(IntentVnMappingResult.class);
-        intentVnMappingResults.add(intentVnMappingResult);
-
-        when(intentVnMappingResult.getIntentId())
-                .thenReturn(intentId)
-                .thenReturn(new IntentId("00001111-0000-0000-0000-000011112222"));
-
-        IntentResolverUtils.getIntentVnMappingResult(intentVnMappingResults, intentId);
-        IntentResolverUtils.getIntentVnMappingResult(intentVnMappingResults, intentId);
-        verify(intentVnMappingResult,times(2)).getIntentId();
-    }
-
-    @Test
-    public void testGetVirtualNode() throws Exception {
-        List<VirtualNode> virtualNodes =  new LinkedList<VirtualNode>();
-        VirtualNodeId virtualNodeId = mock(VirtualNodeId.class);
-        VirtualNode virtualNode = mock(VirtualNode.class);
-        virtualNodes.add(virtualNode);
-
-        when(virtualNode.getNodeId())
-                .thenReturn(virtualNodeId)
-                .thenReturn(new VirtualNodeId("00001111-0000-0000-0000-000011112222"));
-
-        IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);
-        IntentResolverUtils.getVirtualNode(virtualNodes, virtualNodeId);
-        verify(virtualNode,times(2)).getNodeId();
-    }
-
-    @Test
-    public void testGetNode() throws Exception {
-        List<Node> nodes = new LinkedList<Node>();
-        NodeId nodeId = mock(NodeId.class);
-        Node node = mock(Node.class);
-        nodes.add(node);
-
-        when(node.getNodeId())
-                .thenReturn(nodeId)
-                .thenReturn(new NodeId("00001111-0000-0000-0000-000011112222"));
-
-        IntentResolverUtils.getNode(nodes, nodeId);
-        IntentResolverUtils.getNode(nodes, nodeId);
-        verify(node,times(2)).getNodeId();
-    }
-
-    @Test
-    public void testGetConnectionProperty() throws Exception {
-        List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property>
-                properties = new LinkedList<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property>();
-        PropertyName propertyName = mock(PropertyName.class);
-        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property
-                property = mock(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.object.rev151010.connection.instance.Property.class);
-        properties.add(property);
-
-        when(property.getPropertyName()).thenReturn(propertyName);
-
-        IntentResolverUtils.getConnectionProperty(properties, propertyName);
-        verify(property).getPropertyName();
-
-        IntentResolverUtils.getConnectionProperty(null,propertyName);
-    }
-
-    @Test
-    public void testSortSubNodes() throws Exception {
-        List<SubNode> subNodes = new LinkedList<SubNode>();
-        SubNode subNode = mock(SubNode.class);
-        SubNode subNode1 = mock(SubNode.class);
-        long first = 0;
-        long second = 1;
-
-        //test empty
-        Assert.assertTrue(subNodes.size() == 0);
-        IntentResolverUtils.sortSubNodes(subNodes);
-        //test size = 1;
-        subNodes.add(subNode);
-        Assert.assertTrue(subNodes.size() == 1);
-        IntentResolverUtils.sortSubNodes(subNodes);
-        //test size > 1
-        subNodes.add(subNode1);
-        when(subNode.getOrder()).thenReturn(first);
-        when(subNode1.getOrder()).thenReturn(second);
-
-    }
-
-    @Test
-    public void testCheckAllLayer2OperatingMode() throws Exception {
-        List<SubNode> subNodes = new LinkedList<SubNode>();
-        List<Node> nodes = new LinkedList<Node>();
-        List<Property> properties = new LinkedList<Property>();
-        //List<StringValue> stringValues = new LinkedList<StringValue>();
-        List<StringValue> stringValues = mock(List.class);
-        Property property = mock(Property.class);
-        NodeId nodeId = mock(NodeId.class);
-        Node node = mock(Node.class);
-        SubNode subNode = mock(SubNode.class);
-        PropertyName propertyName = mock(PropertyName.class);
-        PropertyValues propertyValues = mock(PropertyValues.class);
-        StringValue stringValue = mock(StringValue.class);
-
-        //test empty
-        Assert.assertTrue(subNodes.size() == 0);
-        Assert.assertFalse(IntentResolverUtils.checkAllLayer2OperatingMode(subNodes, nodes));
-
-        //test not empty
-        subNodes.add(subNode);
-        nodes.add(node);
-        properties.add(property);
-        //stringValues.add(stringValue);
-        when(subNode.getNodeId()).thenReturn(nodeId);
-        when(node.getNodeId())
-                .thenReturn(new NodeId("00001111-0000-0000-0000-000011112222"))
-                .thenReturn(nodeId)
-                .thenReturn(nodeId)
-                .thenReturn(nodeId);
-        Assert.assertFalse(IntentResolverUtils.checkAllLayer2OperatingMode(subNodes, nodes));
-        when(node.getProperty()).thenReturn(properties);
-        when(property.getPropertyName())
-                .thenReturn(propertyName)
-                .thenReturn(new PropertyName("operating-mode"))
-                .thenReturn(new PropertyName("operating-mode"));
-        Assert.assertFalse(IntentResolverUtils.checkAllLayer2OperatingMode(subNodes, nodes));
-        when(property.getPropertyValues()).thenReturn(propertyValues);
-        when(propertyValues.getStringValue()).thenReturn(stringValues);
-        when(stringValues.get(anyInt())).thenReturn(stringValue);
-        when(stringValue.getValue())
-                .thenReturn(new String("layer2"))
-                .thenReturn(new String("test"));
-
-        Assert.assertTrue(IntentResolverUtils.checkAllLayer2OperatingMode(subNodes, nodes));
-        Assert.assertFalse(IntentResolverUtils.checkAllLayer2OperatingMode(subNodes, nodes));
-
-        verify(subNode,times(4)).getNodeId();
-        verify(node,times(4)).getNodeId();
-        verify(node,times(3)).getProperty();
-        verify(property,times(3)).getPropertyName();
-        verify(property, times(2)).getPropertyValues();
-        verify(propertyValues,times(2)).getStringValue();
-        verify(stringValues,times(2)).get(anyInt());
-        verify(stringValue,times(2)).getValue();
-
-    }
-
-    @Test
-    public void testCheckAllLayer3OperatingMode() throws Exception {
-        List<SubNode> subNodes = new LinkedList<SubNode>();
-        List<Node> nodes = new LinkedList<Node>();
-        List<Property> properties = new LinkedList<Property>();
-        //List<StringValue> stringValues = new LinkedList<StringValue>();
-        List<StringValue> stringValues = mock(List.class);
-        Property property = mock(Property.class);
-        NodeId nodeId = mock(NodeId.class);
-        Node node = mock(Node.class);
-        SubNode subNode = mock(SubNode.class);
-        PropertyName propertyName = mock(PropertyName.class);
-        PropertyValues propertyValues = mock(PropertyValues.class);
-        StringValue stringValue = mock(StringValue.class);
-
-        //test empty
-        Assert.assertTrue(subNodes.size() == 0);
-        Assert.assertFalse(IntentResolverUtils.checkAllLayer3OperatingMode(subNodes, nodes));
-
-        //test not empty
-        subNodes.add(subNode);
-        nodes.add(node);
-        properties.add(property);
-        //stringValues.add(stringValue);
-        when(subNode.getNodeId()).thenReturn(nodeId);
-        when(node.getNodeId())
-                .thenReturn(new NodeId("00001111-0000-0000-0000-000011112222"))
-                .thenReturn(nodeId)
-                .thenReturn(nodeId)
-                .thenReturn(nodeId);
-        Assert.assertFalse(IntentResolverUtils.checkAllLayer3OperatingMode(subNodes, nodes));
-        when(node.getProperty()).thenReturn(properties);
-        when(property.getPropertyName())
-                .thenReturn(propertyName)
-                .thenReturn(new PropertyName("operating-mode"))
-                .thenReturn(new PropertyName("operating-mode"));
-        Assert.assertFalse(IntentResolverUtils.checkAllLayer3OperatingMode(subNodes, nodes));
-        when(property.getPropertyValues()).thenReturn(propertyValues);
-        when(propertyValues.getStringValue()).thenReturn(stringValues);
-        when(stringValues.get(anyInt())).thenReturn(stringValue);
-        when(stringValue.getValue())
-                .thenReturn(new String("layer3"))
-                .thenReturn(new String("test"));
-
-        Assert.assertTrue(IntentResolverUtils.checkAllLayer3OperatingMode(subNodes, nodes));
-        Assert.assertFalse(IntentResolverUtils.checkAllLayer3OperatingMode(subNodes, nodes));
-
-        verify(subNode,times(4)).getNodeId();
-        verify(node,times(4)).getNodeId();
-        verify(node,times(3)).getProperty();
-        verify(property,times(3)).getPropertyName();
-        verify(property, times(2)).getPropertyValues();
-        verify(propertyValues,times(2)).getStringValue();
-        verify(stringValues,times(2)).get(anyInt());
-        verify(stringValue,times(2)).getValue();
-    }
-
-    @Test
-    public void testGetVirtualLink() throws Exception {
-        List<VirtualLink> virtualLinks = new LinkedList<VirtualLink>();
-        VirtualNodeId srcVirtualNodeId = mock(VirtualNodeId.class);
-        VirtualNodeId destVirtualNodeId = mock(VirtualNodeId.class);
-        VirtualLink virtualLink = mock(VirtualLink.class);
-        VirtualLink virtualLink_test ;
-        virtualLinks.add(virtualLink);
-        //test not null and null
-        when(virtualLink.getSrcNodeId())
-                .thenReturn(srcVirtualNodeId)
-                .thenReturn(new VirtualNodeId("00001111-0000-0000-0000-000011112222"));
-        when(virtualLink.getDestNodeId())
-                .thenReturn(destVirtualNodeId)
-                .thenReturn(new VirtualNodeId("00001111-0000-0000-0000-000011112222"));
-        virtualLink_test = IntentResolverUtils.getVirtualLink(virtualLinks, srcVirtualNodeId, destVirtualNodeId);
-        Assert.assertTrue(virtualLink_test != null);
-        virtualLink_test = IntentResolverUtils.getVirtualLink(virtualLinks,srcVirtualNodeId,destVirtualNodeId);
-        Assert.assertTrue(virtualLink_test == null);
-        verify(virtualLink,times(2)).getSrcNodeId();
-        verify(virtualLink).getDestNodeId();
-
-    }
-
-    @Test
-    public void testGetObject() throws Exception {
-        DataObject dataObject ;
-        Objects objects = mock(Objects.class);
-        ObjectId objectId = mock(ObjectId.class);
-        Node node = mock(Node.class);
-        Connection connection = mock(Connection.class);
-        Flow flow = mock(Flow.class);
-        List<Node> nodes = new LinkedList<Node>();
-        List<Connection> connections = new LinkedList<Connection>();
-        List<Flow> flows = new LinkedList<Flow>();
-
-        when(objects.getNode()).thenReturn(nodes);
-        when(objects.getConnection()).thenReturn(connections);
-        when(objects.getFlow()).thenReturn(flows);
-        when(objectId.getValue()).thenReturn(new String("00001111-0000-0000-0000-000011112222"));
-        // when nodes and connections and flows are all empty
-        dataObject = IntentResolverUtils.getObject(objects, objectId);
-        Assert.assertTrue(dataObject == null);
-        //test  flow
-        flows.add(flow);
-        when(flow.getFlowId())
-                .thenReturn(new FlowId(new String("00001111-0000-0000-0000-000011112222")))
-                .thenReturn(mock(FlowId.class));
-        //return true
-        dataObject = IntentResolverUtils.getObject(objects, objectId);
-        Assert.assertTrue(dataObject != null);
-        //return null
-        dataObject = IntentResolverUtils.getObject(objects, objectId);
-        Assert.assertTrue(dataObject == null);
-
-        //test connection
-        connections.add(connection);
-        when(connection.getConnectionId())
-                .thenReturn(new ConnectionId(new String("00001111-0000-0000-0000-000011112222")))
-                .thenReturn(mock(ConnectionId.class));
-        //return true
-        dataObject = IntentResolverUtils.getObject(objects, objectId);
-        Assert.assertTrue(dataObject != null);
-        //return null
-        dataObject = IntentResolverUtils.getObject(objects, objectId);
-        Assert.assertTrue(dataObject == null);
-
-        //test node
-        nodes.add(node);
-        when(node.getNodeId())
-                .thenReturn(new NodeId(new String("00001111-0000-0000-0000-000011112222")))
-                .thenReturn(mock(NodeId.class));
-        //return true
-        dataObject = IntentResolverUtils.getObject(objects, objectId);
-        Assert.assertTrue(dataObject != null);
-        //return null
-        dataObject = IntentResolverUtils.getObject(objects, objectId);
-        Assert.assertTrue(dataObject == null);
-
-    }
-
-    @Test
-    public void testGetSameTargetObjectOperations() throws Exception {
-        List<Operation> operations = new LinkedList<Operation>();
-        Operation operation = mock(Operation.class);
-
-        List<Operation> list ;
-        list = IntentResolverUtils.getSameTargetObjectOperations(operations,operation);
-        Assert.assertTrue(list.size() == 0);
-    }
-
-    @Test
-    public void testGetGreaterAndEqualPriorityOperations() throws Exception {
-        List<Operation> operations = new LinkedList<Operation>();
-        Operation operation = mock(Operation.class);
-        List<Operation> greaterPriorityOperations = new LinkedList<Operation>();
-        List<Operation> equalPriorityOperations = new LinkedList<Operation>();
-
-        IntentResolverUtils.getGreaterAndEqualPriorityOperations(operations,operation,greaterPriorityOperations,equalPriorityOperations);
-    }
-
-    @Test
-    public void testGetConflictingOperation() throws Exception {
-        List<Operation> operations = new LinkedList<Operation>();
-        Operation operation = mock(Operation.class);
-
-        Operation operation1 = IntentResolverUtils.getConflictingOperation(operations,operation);
-        Assert.assertTrue(operation1 == null);
-    }
-
-    @Test
-    public void testGetConflictingOperations() throws Exception {
-        List<Operation> operations = new LinkedList<Operation>();
-        Operation operation = mock(Operation.class);
-
-        List<Operation> operations1 = IntentResolverUtils.getConflictingOperations(operations, operation);
-        Assert.assertTrue(operations1 == null);
-    }
-
-    @Test
-    public void testGetAction() throws Exception {
-        List<Action> actions = new LinkedList<Action>();
-        ActionName actionName = mock(ActionName.class);
-        Action action = mock(Action.class);
-        Action action_test ;
-
-        actions.add(action);
-        when(action.getActionName())
-                .thenReturn(actionName)
-                .thenReturn(new ActionName("a"));
-        action_test = IntentResolverUtils.getAction(actions,actionName);
-        Assert.assertTrue(action_test != null);
-        action_test = IntentResolverUtils.getAction(actions,actionName);
-        Assert.assertTrue(action_test == null);
-        verify(action,times(2)).getActionName();
-    }
-
-    @Test
-    public void testGetSourceVirtualRouterOfFlow() throws Exception {
-        VirtualNode virtualNode_test;
-        VirtualNode virtualNode = mock(VirtualNode.class);
-        Flow flow = mock(Flow.class);
-        MatchItemName matchItemName = mock(MatchItemName.class);
-        MatchItem matchItem = mock(MatchItem.class);
-        MatchItemValue matchItemValue = mock(MatchItemValue.class);
-        Node node = mock(Node.class);
-        IntentVnMappingResult intentVnMappingResult = mock(IntentVnMappingResult.class);
-        List<VirtualNode> virtualNodes = new ArrayList<VirtualNode>();
-        List<MatchItem> matchItems = new ArrayList<MatchItem>();
-        List<Node> nodes = new ArrayList<Node>();
-        List<IntentVnMappingResult> intentVnMappingResults = new ArrayList<IntentVnMappingResult>();
-
-        virtualNodes.add(virtualNode);
-        nodes.add(node);
-        intentVnMappingResults.add(intentVnMappingResult);
-        //test private method "getMatchItem"
-        when(flow.getMatchItem())
-                .thenReturn(null) //test null
-                .thenReturn(matchItems) //not null since this time
-                .thenReturn(matchItems);
-
-        virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-        matchItems.add(matchItem);
-        when(matchItem.getMatchItemName())
-                .thenReturn(matchItemName)//not same as matchItemName , the value to be return is null
-                .thenReturn(new MatchItemName("src-ip"));//same as matchItemName, value to be return is not null
-
-        when(matchItem.getMatchItemValue()).thenReturn(matchItemValue);
-        when(matchItemValue.getStringValue()).thenReturn(new String("test"));
-
-        virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-        ///////////////////////////////////////////////////////
-        //test private method "getVirtualRouterWithIpPrefix"
-        //test null
-        nodes.clear();
-        virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-        //test not null
-        NodeType layer2GroupNodeType = new NodeType("l2-group");
-        NodeType externalGroupNodeType = new NodeType("ext-group");
-        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.VirtualNodeInstance.NodeType VrouterNodeType =
-                VirtualNode.NodeType.Vrouter;
-        NodeId nodeId = mock(NodeId.class);
-        IntentId intentId = new IntentId(new String("00001111-0000-0000-0000-000011112222"));
-        List<Property> properties = new ArrayList<Property>();
-        List<StringValue> propertyValues_list = new ArrayList<StringValue>();
-        List<VirtualResource> virtualResources = new ArrayList<VirtualResource>();
-        StringValue stringValue = mock(StringValue.class);
-        Property property = mock(Property.class);
-        PropertyName propertyName = new PropertyName("ip-prefix");
-        PropertyValues propertyValues = mock(PropertyValues.class);
-        VirtualResource virtualResource = mock(VirtualResource.class);
-        VirtualResourceType virtualResourceType_Vport = VirtualResource.VirtualResourceType.Vport;
-        VirtualResourceType virtualResourceType_Vnode = VirtualResource.VirtualResourceType.Vnode;
-        VirtualResourceType virtualResourceType_Other = null;
-        VirtualResourceEntityId virtualResourceEntityId = mock(VirtualResourceEntityId.class);
-
-        virtualResources.add(virtualResource);
-        nodes.add(node);
-        properties.add(property);
-        propertyValues_list.add(stringValue);
-
-        when(node.getNodeType())
-                .thenReturn(mock(NodeType.class))
-                .thenReturn(layer2GroupNodeType)
-                .thenReturn(externalGroupNodeType);
-        virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes, flow, nodes,intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-
-        when(node.getProperty()).thenReturn(properties);
-        when(property.getPropertyName())
-                .thenReturn(mock(PropertyName.class))
-                .thenReturn(propertyName);
-        virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow, nodes, intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-        when(property.getPropertyValues()).thenReturn(propertyValues);
-        when(propertyValues.getStringValue()).thenReturn(propertyValues_list);
-        when(stringValue.getValue())
-                .thenReturn(new String("test1"))
-                .thenReturn(new String("test"));
-        virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-        verify(stringValue).getValue();
-
-        when(node.getNodeId()).thenReturn(nodeId);
-        when(nodeId.getValue()).thenReturn(new String("00001111-0000-0000-0000-000011112222"));
-        when(intentVnMappingResult.getIntentId())
-                .thenReturn(mock(IntentId.class))
-                .thenReturn(intentId);
-
-        virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-        when(intentVnMappingResult.getVirtualResource()).thenReturn(virtualResources);
-        Assert.assertTrue(virtualResources.get(0) == virtualResource);
-        when(virtualResource.getVirtualResourceType())
-                .thenReturn(virtualResourceType_Other)
-                .thenReturn(virtualResourceType_Vport)
-                .thenReturn(virtualResourceType_Vnode);
-        when(virtualResource.getParentVirtualResourceEntityId()).thenReturn(virtualResourceEntityId);
-        when(virtualResource.getVirtualResourceEntityId()).thenReturn(virtualResourceEntityId);
-        when(virtualResourceEntityId.getValue()).thenReturn(new String("00001111-0000-0000-0000-000011112222"));
-
-        virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-        when(virtualNode.getNodeId())
-                .thenReturn(mock(VirtualNodeId.class))
-                .thenReturn(new VirtualNodeId(new String("00001111-0000-0000-0000-000011112222")));
-
-        virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-        verify(virtualNode).getNodeId();
-
-        when(virtualNode.getNodeType())
-                .thenReturn(null)
-                .thenReturn(VrouterNodeType);
-
-        virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-        verify(virtualNode).getNodeType();
-
-        virtualNode_test = IntentResolverUtils.getSourceVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == virtualNode);
-        verify(virtualNode,times(2)).getNodeType();
-
-    }
-
-    @Test
-    public void testGetDestinationVirtualRouterOfFlow() throws Exception {
-        VirtualNode virtualNode_test;
-        VirtualNode virtualNode = mock(VirtualNode.class);
-        Flow flow = mock(Flow.class);
-        MatchItemName matchItemName = mock(MatchItemName.class);
-        MatchItem matchItem = mock(MatchItem.class);
-        MatchItemValue matchItemValue = mock(MatchItemValue.class);
-        Node node = mock(Node.class);
-        IntentVnMappingResult intentVnMappingResult = mock(IntentVnMappingResult.class);
-        List<VirtualNode> virtualNodes = new ArrayList<VirtualNode>();
-        List<MatchItem> matchItems = new ArrayList<MatchItem>();
-        List<Node> nodes = new ArrayList<Node>();
-        List<IntentVnMappingResult> intentVnMappingResults = new ArrayList<IntentVnMappingResult>();
-
-        virtualNodes.add(virtualNode);
-        nodes.add(node);
-        intentVnMappingResults.add(intentVnMappingResult);
-        //test private method "getMatchItem"
-        when(flow.getMatchItem())
-                .thenReturn(null) //test null
-                .thenReturn(matchItems) //not null since this time
-                .thenReturn(matchItems);
-
-        virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-        matchItems.add(matchItem);
-        when(matchItem.getMatchItemName())
-                .thenReturn(matchItemName)//not same as matchItemName , the value to be return is null
-                .thenReturn(new MatchItemName("dst-ip"));//same as matchItemName, value to be return is not null
-
-        when(matchItem.getMatchItemValue()).thenReturn(matchItemValue);
-        when(matchItemValue.getStringValue()).thenReturn(new String("test"));
-
-        virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-        ///////////////////////////////////////////////////////
-        //test private method "getVirtualRouterWithIpPrefix"
-        //test null
-        nodes.clear();
-        virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-        //test not null
-        NodeType layer2GroupNodeType = new NodeType("l2-group");
-        NodeType externalGroupNodeType = new NodeType("ext-group");
-        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.VirtualNodeInstance.NodeType VrouterNodeType =
-                VirtualNode.NodeType.Vrouter;
-        NodeId nodeId = mock(NodeId.class);
-        IntentId intentId = new IntentId(new String("00001111-0000-0000-0000-000011112222"));
-        List<Property> properties = new ArrayList<Property>();
-        List<StringValue> propertyValues_list = new ArrayList<StringValue>();
-        List<VirtualResource> virtualResources = new ArrayList<VirtualResource>();
-        StringValue stringValue = mock(StringValue.class);
-        Property property = mock(Property.class);
-        PropertyName propertyName = new PropertyName("ip-prefix");
-        PropertyValues propertyValues = mock(PropertyValues.class);
-        VirtualResource virtualResource = mock(VirtualResource.class);
-        VirtualResourceType virtualResourceType_Vport = VirtualResource.VirtualResourceType.Vport;
-        VirtualResourceType virtualResourceType_Vnode = VirtualResource.VirtualResourceType.Vnode;
-        VirtualResourceType virtualResourceType_Other = null;
-        VirtualResourceEntityId virtualResourceEntityId = mock(VirtualResourceEntityId.class);
-
-        virtualResources.add(virtualResource);
-        nodes.add(node);
-        properties.add(property);
-        propertyValues_list.add(stringValue);
-
-        when(node.getNodeType())
-                .thenReturn(mock(NodeType.class))
-                .thenReturn(layer2GroupNodeType)
-                .thenReturn(externalGroupNodeType);
-        virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-
-        when(node.getProperty()).thenReturn(properties);
-        when(property.getPropertyName())
-                .thenReturn(mock(PropertyName.class))
-                .thenReturn(propertyName);
-        virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-        when(property.getPropertyValues()).thenReturn(propertyValues);
-        when(propertyValues.getStringValue()).thenReturn(propertyValues_list);
-        when(stringValue.getValue())
-                .thenReturn(new String("test1"))
-                .thenReturn(new String("test"));
-        virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-        verify(stringValue).getValue();
-
-        when(node.getNodeId()).thenReturn(nodeId);
-        when(nodeId.getValue()).thenReturn(new String("00001111-0000-0000-0000-000011112222"));
-        when(intentVnMappingResult.getIntentId())
-                .thenReturn(mock(IntentId.class))
-                .thenReturn(intentId);
-
-        virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-        when(intentVnMappingResult.getVirtualResource()).thenReturn(virtualResources);
-        Assert.assertTrue(virtualResources.get(0) == virtualResource);
-        when(virtualResource.getVirtualResourceType())
-                .thenReturn(virtualResourceType_Other)
-                .thenReturn(virtualResourceType_Vport)
-                .thenReturn(virtualResourceType_Vnode);
-        when(virtualResource.getParentVirtualResourceEntityId()).thenReturn(virtualResourceEntityId);
-        when(virtualResource.getVirtualResourceEntityId()).thenReturn(virtualResourceEntityId);
-        when(virtualResourceEntityId.getValue()).thenReturn(new String("00001111-0000-0000-0000-000011112222"));
-
-        virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-
-        when(virtualNode.getNodeId())
-                .thenReturn(mock(VirtualNodeId.class))
-                .thenReturn(new VirtualNodeId(new String("00001111-0000-0000-0000-000011112222")));
-
-        virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-        verify(virtualNode).getNodeId();
-
-        when(virtualNode.getNodeType())
-                .thenReturn(null)
-                .thenReturn(VrouterNodeType);
-
-        virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes, flow, nodes, intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == null);
-        verify(virtualNode).getNodeType();
-
-        virtualNode_test = IntentResolverUtils.getDestinationVirtualRouterOfFlow(virtualNodes,flow,nodes,intentVnMappingResults);
-        Assert.assertTrue(virtualNode_test == virtualNode);
-        verify(virtualNode,times(2)).getNodeType();
-    }
-
-    @Test
-    public void testSortVirtualResources() throws Exception {
-        List<VirtualResource> virtualResources = new ArrayList<VirtualResource>();
-        VirtualResource virtualResource = mock(VirtualResource.class);
-        VirtualResource virtualResource1 = mock(VirtualResource.class);
-        List<VirtualResource> result ;
-        long first = 0;
-        long second = 1;
-
-        //test empty
-        Assert.assertTrue(virtualResources.size() == 0);
-        result = IntentResolverUtils.sortVirtualResources(virtualResources);
-        Assert.assertTrue(result.size() == 0);
-
-        //test 1
-        virtualResources.add(virtualResource);
-        Assert.assertTrue(virtualResources.size() == 1);
-        result = IntentResolverUtils.sortVirtualResources(virtualResources);
-        Assert.assertNotNull(result);
-
-        //test >1
-        virtualResources.add(virtualResource1);
-        Assert.assertTrue(virtualResources.size() == 2);
-        when(virtualResource.getOrder()).thenReturn(first);
-        when(virtualResource1.getOrder()).thenReturn(second);
-        result = IntentResolverUtils.sortVirtualResources(virtualResources);
-        Assert.assertTrue(result.size() == 2);
-        Assert.assertTrue(result.get(0) == virtualResource);
-
-    }
-}
\ No newline at end of file