Merge "Modify pom.xml and nemo-impl vnspacemanager test files"
authorXia Yin Ben <xiayinben@huawei.com>
Thu, 3 Dec 2015 12:56:29 +0000 (12:56 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Thu, 3 Dec 2015 12:56:30 +0000 (12:56 +0000)
13 files changed:
nemo-artifacts/pom.xml
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/PNResourcesTracker.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]
nemo-impl/src/test/resources/vpn.py [new file with mode: 0644]
nemo-renderers/openflow-renderer/pom.xml
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/FlowUtils.java

index acf3209d74c5aa9708ea799aa471f75cfe1ca605..fcad3f5e106b75372c2c41cc6b4d2ff0aff94052 100644 (file)
@@ -9,15 +9,14 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
 
-  <groupId>org.opendaylight.nemo</groupId>
-
   <parent>
     <groupId>org.opendaylight.odlparent</groupId>
     <artifactId>odlparent-lite</artifactId>
     <version>1.6.0-SNAPSHOT</version>
-    <relativePath/>
+    <relativePath />
   </parent>
 
+  <groupId>org.opendaylight.nemo</groupId>
   <artifactId>nemo-artifacts</artifactId>
   <version>1.0.0-SNAPSHOT</version>
   <packaging>pom</packaging>
@@ -66,4 +65,4 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
     <url>https://wiki.opendaylight.org/view/NEMO:Main</url>
     <tag>HEAD</tag>
   </scm>
-</project>
+</project>
\ No newline at end of file
index 15aac2a979324ea7ae2904370e0023379b1f929f..1ed17fbab4e82da577182b6920c86948015c2f25 100644 (file)
@@ -13,8 +13,10 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;\r
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
 import org.opendaylight.nemo.intent.computation.PNComputationUnit;\r
+import org.opendaylight.nemo.intent.computation.PNResourcesTracker;\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 +93,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
@@ -101,6 +108,11 @@ public class IntentResolver implements AutoCloseable {
      */\r
     private Map<UserId, VNComputationUnit> vnComputationUnits;\r
 \r
+    /**\r
+     * Track the physical resource, re-resolve intent if related physical resource removed.\r
+     */\r
+    private PNResourcesTracker pnResourcesTracker;\r
+\r
     /**\r
      * The virtual network mapping unit.\r
      */\r
@@ -114,11 +126,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
+        pnResourcesTracker = new PNResourcesTracker(dataBroker, this);\r
+        vnMappingUnit = new VNMappingUnit(dataBroker, pnComputationUnit, pnResourcesTracker);\r
+\r
+        operationResolver = new OperationResolver(dataBroker, conditionManager, vnComputationUnits);\r
 \r
         LOG.debug("Initialized the renderer common intent resolver.");\r
 \r
@@ -153,6 +168,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 +364,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 +393,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
@@ -399,6 +446,10 @@ public class IntentResolver implements AutoCloseable {
             }\r
         }\r
 \r
+        if ( null != pnResourcesTracker ) {\r
+            pnResourcesTracker.close();\r
+        }\r
+\r
         if ( null != vnMappingUnit ) {\r
             vnMappingUnit.close();\r
         }\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
diff --git a/nemo-impl/src/main/java/org/opendaylight/nemo/intent/computation/PNResourcesTracker.java b/nemo-impl/src/main/java/org/opendaylight/nemo/intent/computation/PNResourcesTracker.java
new file mode 100644 (file)
index 0000000..3308797
--- /dev/null
@@ -0,0 +1,245 @@
+/*\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.computation;\r
+\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;\r
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;\r
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
+import org.opendaylight.nemo.intent.IntentResolver;\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.PhysicalLinks;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalNodes;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPath;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.node.instance.PhysicalPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
+import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import java.util.*;\r
+import java.util.concurrent.ConcurrentHashMap;\r
+import java.util.concurrent.CopyOnWriteArraySet;\r
+\r
+/**\r
+ * The virtual network mapping unit implements the following functions:\r
+ * (1) Automatically perform the virtual network mapping when the user's\r
+ * virtual network changed, which is subscribed from the data store.\r
+ * (2) Automatically perform the remapping for the virtual networks that\r
+ * are influenced by the changes of the underlying physical network\r
+ * which are also subscribed from the data store.\r
+ *\r
+ * @author Zhigang Ji\r
+ */\r
+public class PNResourcesTracker {\r
+    private static final Logger log = LoggerFactory.getLogger(PNResourcesTracker.class);\r
+\r
+    private final ConcurrentHashMap<UserId, CopyOnWriteArraySet<String>/*physical resources*/> physicalResourceMap;\r
+\r
+    private final DataBroker dataBroker;\r
+    private final IntentResolver intentResolver;\r
+\r
+    /**\r
+     * The registration for the physical node change listener.\r
+     */\r
+    private ListenerRegistration<DataChangeListener> physicalNodeChangeListenerReg;\r
+\r
+    /**\r
+     * The registration for the physical link change listener.\r
+     */\r
+    private ListenerRegistration<DataChangeListener> physicalLinkChangeListenerReg;\r
+\r
+    public PNResourcesTracker(DataBroker dataBroker, IntentResolver intentResolver) {\r
+        super();\r
+\r
+        this.dataBroker = dataBroker;\r
+        this.intentResolver = intentResolver;\r
+        physicalResourceMap = new ConcurrentHashMap<UserId, CopyOnWriteArraySet<String>>();\r
+\r
+        InstanceIdentifier<PhysicalNode> nodeInstanceIdentifier = InstanceIdentifier\r
+                .builder(PhysicalNetwork.class)\r
+                .child(PhysicalNodes.class)\r
+                .child(PhysicalNode.class)\r
+                .build();\r
+        InstanceIdentifier<PhysicalLink> linkInstanceIdentifier = InstanceIdentifier\r
+                .builder(PhysicalNetwork.class)\r
+                .child(PhysicalLinks.class)\r
+                .child(PhysicalLink.class)\r
+                .build();\r
+\r
+        physicalNodeChangeListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,\r
+                nodeInstanceIdentifier, new PhysicalNodeChangeListener(), DataChangeScope.BASE);\r
+        physicalLinkChangeListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,\r
+                linkInstanceIdentifier, new PhysicalLinkChangeListener(), DataChangeScope.BASE);\r
+\r
+        return;\r
+    }\r
+    public void close(){\r
+        if(physicalLinkChangeListenerReg!=null){\r
+            physicalLinkChangeListenerReg.close();\r
+        }\r
+        if(physicalNodeChangeListenerReg!=null){\r
+            physicalNodeChangeListenerReg.close();\r
+        }\r
+        physicalResourceMap.clear();\r
+    }\r
+    protected synchronized void resetResource(UserId userId) {\r
+        physicalResourceMap.remove(userId);\r
+    }\r
+\r
+    protected void addPhysicalNode(UserId userId, PhysicalNode physicalNode) {\r
+        addPhysicalResource(userId, physicalNode.getKey().toString());\r
+    }\r
+\r
+    protected void addPhysicalPort(UserId userId, PhysicalPort physicalPort) {\r
+        addPhysicalResource(userId, physicalPort.getKey().toString());\r
+    }\r
+\r
+    protected void addPhysicalPath(UserId userId, PhysicalPath physicalPath) {\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink>\r
+                physicalLinkList = physicalPath.getPhysicalLink();\r
+        for (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.path.instance.PhysicalLink physicalLink :\r
+                physicalLinkList) {\r
+            addPhysicalResource(userId, physicalLink.getKey().toString());\r
+        }\r
+    }\r
+\r
+    private synchronized void addPhysicalResource(UserId userId, String resourceId) {\r
+        if (!physicalResourceMap.containsKey(userId)) {\r
+            physicalResourceMap.put(userId, new CopyOnWriteArraySet<String>());\r
+        }\r
+        physicalResourceMap.get(userId).add(resourceId);\r
+    }\r
+\r
+    private synchronized void physicalResourceDown(String resourceId) {\r
+        Map<UserId, CopyOnWriteArraySet<String>> tmpMap = new HashMap<UserId, CopyOnWriteArraySet<String>>(physicalResourceMap);\r
+        for (UserId userId : tmpMap.keySet()) {\r
+            Set<String> physicalResources = tmpMap.get(userId);\r
+            if (physicalResources.contains(resourceId)) {\r
+                physicalResourceMap.remove(userId);\r
+                try {\r
+                    intentResolver.resolveIntent(userId);\r
+                } catch (Exception e) {\r
+                    e.printStackTrace();\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * A listener to ch ange events related to physical nodes being\r
+     * added, removed or updated.\r
+     *\r
+     * @author Zhigang Ji\r
+     */\r
+    private class PhysicalNodeChangeListener implements DataChangeListener {\r
+        @Override\r
+        public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
+            if (null == change) {\r
+                return;\r
+            }\r
+\r
+            Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
+            Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
+\r
+            if (null != updatedData && !updatedData.isEmpty()) {\r
+                for (InstanceIdentifier<?> identifier : updatedData.keySet()) {\r
+                    DataObject originData = originalData.get(identifier);\r
+                    DataObject currentData = updatedData.get(identifier);\r
+                    if (originData != null && originData instanceof PhysicalNode) {\r
+                        handleNodeUpdate((PhysicalNode) originData, (PhysicalNode) currentData);\r
+                    }\r
+                }\r
+            }\r
+\r
+            Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
+\r
+            if (null != removedPaths && !removedPaths.isEmpty()) {\r
+                DataObject dataObject;\r
+                for (InstanceIdentifier<?> instanceId : removedPaths) {\r
+                    dataObject = originalData.get(instanceId);\r
+                    if (dataObject != null && dataObject instanceof PhysicalNode) {\r
+                        String resourceId = ((PhysicalNode) dataObject).getKey().toString();\r
+                        log.debug("Physical node {} removed.", resourceId);\r
+                        physicalResourceDown(resourceId);\r
+                    }\r
+\r
+                }\r
+            }\r
+        }\r
+\r
+        private void handleNodeUpdate(PhysicalNode originNode, PhysicalNode currentNode) {\r
+            log.debug("Handle node {} update.", originNode.getNodeId().getValue());\r
+            List<PhysicalPort> originPorts = originNode.getPhysicalPort();\r
+            List<PhysicalPort> currentPorts = currentNode.getPhysicalPort() == null ? new ArrayList<PhysicalPort>() : currentNode.getPhysicalPort();\r
+            if (originPorts != null)\r
+                for (PhysicalPort physicalPort : originPorts) {\r
+                    if (!currentPorts.contains(physicalPort)) {\r
+                        log.debug("Physical port {} removed.", physicalPort.getPortId().getValue());\r
+                        physicalResourceDown(physicalPort.getKey().toString());\r
+                    }\r
+                }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * A listener to change events related to physical links being\r
+     * added, removed or updated.\r
+     *\r
+     * @author Zhigang Ji\r
+     */\r
+    private class PhysicalLinkChangeListener implements DataChangeListener {\r
+        @Override\r
+        public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
+            if (null == change) {\r
+                return;\r
+            }\r
+\r
+            Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
+            Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
+\r
+            if (null != updatedData && !updatedData.isEmpty()) {\r
+                for (InstanceIdentifier<?> identifier : updatedData.keySet()) {\r
+                    DataObject originData = originalData.get(identifier);\r
+                    DataObject currentDate = updatedData.get(identifier);\r
+                    if (originData != null && originData instanceof PhysicalLink) {\r
+                        handleLinkUpdate((PhysicalLink) originalData, (PhysicalLink) currentDate);\r
+                    }\r
+                }\r
+            }\r
+\r
+            Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
+\r
+            if (null != removedPaths && !removedPaths.isEmpty()) {\r
+                DataObject dataObject;\r
+\r
+                for (InstanceIdentifier<?> instanceId : removedPaths) {\r
+                    dataObject = originalData.get(instanceId);\r
+                    if (dataObject != null && dataObject instanceof PhysicalLink) {\r
+                        String resourceId = ((PhysicalLink) dataObject).getKey().toString();\r
+                        log.debug("Physical link {} removed.", resourceId);\r
+                        physicalResourceDown(resourceId);\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        private void handleLinkUpdate(PhysicalLink originLink, PhysicalLink currentLink) {\r
+            log.debug("Handle physical link {} update.", originLink.getLinkId().getValue());\r
+            //TODO\r
+        }\r
+    }\r
+\r
+\r
+}\r
index 24b28deac914f75330635311ebb7c5788be4c879..95a9efd01471dcb63913e5632bc9e4dfdcca094e 100644 (file)
@@ -8,29 +8,16 @@
 \r
 package org.opendaylight.nemo.intent.computation;\r
 \r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.LinkedList;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-import java.util.UUID;\r
-import java.util.concurrent.ExecutionException;\r
-\r
+import com.google.common.base.Optional;\r
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;\r
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;\r
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNetwork;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalNodeAttributeDefinitions;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.PhysicalPortAttributeDefinitions;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.definition.AttributeMatchPatterns;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.attribute.instance.attribute.value.RangeValue;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalLinks;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.PhysicalNodes;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.links.PhysicalLink;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.nodes.PhysicalNode;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPath;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.physical.network.rev151010.physical.network.physical.paths.PhysicalPathBuilder;\r
@@ -51,23 +38,17 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.m
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.UserVnPnMapping;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.user.vn.pn.mapping.VnPnMappingResult;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.user.vn.pn.mapping.VnPnMappingResultBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.AttributeName;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalNodeId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalPathId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalPortId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalResourceEntityId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.PhysicalResourceId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNetworkId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualNodeId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualResourceEntityId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.VirtualResourceId;\r
-import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
-import org.opendaylight.yangtools.yang.binding.DataObject;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.UserId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.engine.common.rev151010.*;\r
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
-import com.google.common.base.Optional;\r
+import java.util.ArrayList;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+import java.util.UUID;\r
+import java.util.concurrent.ExecutionException;\r
 \r
 /**\r
  * The virtual network mapping unit implements the following functions:\r
@@ -90,44 +71,18 @@ public class VNMappingUnit implements AutoCloseable {
     private PNComputationUnit pnComputationUnit;\r
 \r
     /**\r
-     * The registrations for the physical port change listeners.\r
-     */\r
-    private Map<PhysicalNodeId, Map<PhysicalPortId, ListenerRegistration<DataChangeListener>>> physicalPortChangeListenerRegs;\r
-\r
-    /**\r
-     * The registration for the physical node change listener.\r
-     */\r
-    private ListenerRegistration<DataChangeListener> physicalNodeChangeListenerReg;\r
-\r
-    /**\r
-     * The registration for the physical link change listener.\r
+     * The physical network resource tracker.\r
      */\r
-    private ListenerRegistration<DataChangeListener> physicalLinkChangeListenerReg;\r
+    private PNResourcesTracker pnResourcesTracker;\r
 \r
-    public VNMappingUnit(DataBroker dataBroker, PNComputationUnit pnComputationUnit) {\r
+    public VNMappingUnit(DataBroker dataBroker,\r
+                         PNComputationUnit pnComputationUnit,\r
+                         PNResourcesTracker pnResourcesTracker) {\r
         super();\r
 \r
         this.dataBroker = dataBroker;\r
         this.pnComputationUnit = pnComputationUnit;\r
-\r
-        physicalPortChangeListenerRegs =\r
-                new HashMap<PhysicalNodeId, Map<PhysicalPortId, ListenerRegistration<DataChangeListener>>>();\r
-\r
-        InstanceIdentifier<PhysicalNode> physicalNodeIid = InstanceIdentifier\r
-                .builder(PhysicalNetwork.class)\r
-                .child(PhysicalNodes.class)\r
-                .child(PhysicalNode.class)\r
-                .build();\r
-        InstanceIdentifier<PhysicalLink> physicalLinkIid = InstanceIdentifier\r
-                .builder(PhysicalNetwork.class)\r
-                .child(PhysicalLinks.class)\r
-                .child(PhysicalLink.class)\r
-                .build();\r
-\r
-        physicalNodeChangeListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,\r
-                physicalNodeIid, new PhysicalNodeChangeListener(), DataChangeScope.BASE);\r
-        physicalLinkChangeListenerReg = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,\r
-                physicalLinkIid, new PhysicalLinkChangeListener(), DataChangeScope.BASE);\r
+        this.pnResourcesTracker = pnResourcesTracker;\r
 \r
         LOG.debug("Initialized the virtual network mapping unit.");\r
 \r
@@ -161,6 +116,7 @@ public class VNMappingUnit implements AutoCloseable {
         PhysicalNodes physicalNodes = result.get();\r
         List<PhysicalNode> physicalNodeList = physicalNodes.getPhysicalNode();\r
 \r
+        UserId userId = virtualNetwork.getUserId();\r
         List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
         List<VirtualNode> virtualNodes = virtualNetwork.getVirtualNodes().getVirtualNode();\r
         List<VirtualPort> virtualPorts;\r
@@ -172,11 +128,17 @@ public class VNMappingUnit implements AutoCloseable {
             physicalNode = virtualNodeMapping(virtualNetwork.getNetworkId(), virtualNode, physicalNodeList);\r
 \r
             if ( null == physicalNode ) {\r
+                // If mapping failed, reset the user physical resources.\r
+                pnResourcesTracker.resetResource(userId);\r
+\r
                 throw new VNMappingException("Failed mapping for the virtual node " +\r
                         virtualNode.getNodeId().getValue() + " in the virtual network " +\r
                         virtualNetwork.getNetworkId().getValue());\r
             }\r
 \r
+            // Keep physical resource.\r
+            pnResourcesTracker.addPhysicalNode(userId, physicalNode);\r
+\r
             virtualPorts = virtualNode.getVirtualPort();\r
 \r
             for ( VirtualPort virtualPort : virtualPorts ) {\r
@@ -185,12 +147,18 @@ public class VNMappingUnit implements AutoCloseable {
                             virtualNode.getNodeId(), virtualPort, physicalNode);\r
 \r
                     if ( null == physicalPort ) {\r
+                        // If mapping failed, reset the user physical resources.\r
+                        pnResourcesTracker.resetResource(userId);\r
+\r
                         throw new VNMappingException("Failed mapping for the virtual port " +\r
                                 virtualPort.getPortId().getValue() + " of the virtual node " +\r
                                 virtualNode.getNodeId().getValue() + " in the virtual network " +\r
                                 virtualNetwork.getNetworkId().getValue());\r
                     }\r
 \r
+                    // Keep physical resource.\r
+                    pnResourcesTracker.addPhysicalPort(userId, physicalPort);\r
+\r
                     vnPnMappingResult = new VnPnMappingResultBuilder()\r
                             .setVirtualResourceId(new VirtualResourceId(UUID.randomUUID().toString()))\r
                             .setVirtualResourceType(VirtualResourceInstance.VirtualResourceType.Vport)\r
@@ -227,11 +195,17 @@ public class VNMappingUnit implements AutoCloseable {
             physicalPath = virtualLinkMapping(virtualNetwork.getNetworkId(), virtualLink, userVnPnMapping);\r
 \r
             if ( null == physicalPath ) {\r
+                // If mapping failed, reset the user physical resources.\r
+                pnResourcesTracker.resetResource(userId);\r
+\r
                 throw new VNMappingException("Failed mapping for the virtual link " +\r
                         virtualLink.getLinkId().getValue() + " in the virtual network " +\r
                         virtualNetwork.getNetworkId().getValue());\r
             }\r
 \r
+            // Keep physical resource.\r
+            pnResourcesTracker.addPhysicalPath(userId, physicalPath);\r
+\r
             physicalPaths.add(physicalPath);\r
 \r
             newVirtualLink = new VirtualLinkBuilder(virtualLink)\r
@@ -259,29 +233,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
+            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
-        if ( null != physicalLinkChangeListenerReg ) {\r
-            physicalLinkChangeListenerReg.close();\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 +300,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
@@ -1039,125 +1047,4 @@ public class VNMappingUnit implements AutoCloseable {
 //            }\r
 //        }\r
 //    }\r
-\r
-    /**\r
-     * A listener to change events related to physical ports being\r
-     * added, removed or updated.\r
-     *\r
-     * @author Zhigang Ji\r
-     */\r
-    private class PhysicalPortChangeListener implements DataChangeListener {\r
-        /**\r
-         * The physical node that the physical port belongs to.\r
-         */\r
-        private PhysicalNodeId physicalNodeId;\r
-\r
-        public PhysicalPortChangeListener(PhysicalNodeId physicalNodeId) {\r
-            super();\r
-\r
-            this.physicalNodeId = physicalNodeId;\r
-\r
-            return;\r
-        }\r
-\r
-        @Override\r
-        public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
-            if ( null == change ) {\r
-                return;\r
-            }\r
-\r
-            Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
-            Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
-\r
-            if ( null != updatedData && !updatedData.isEmpty() ) {\r
-                for ( DataObject dataObject : updatedData.values() ) {\r
-                    // TODO\r
-                }\r
-            }\r
-\r
-            Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
-\r
-            if ( null != removedPaths && !removedPaths.isEmpty() ) {\r
-                DataObject dataObject;\r
-\r
-                for ( InstanceIdentifier<?> instanceId : removedPaths ) {\r
-                    dataObject = originalData.get(instanceId);\r
-\r
-                    // TODO\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    /**\r
-     * A listener to change events related to physical nodes being\r
-     * added, removed or updated.\r
-     *\r
-     * @author Zhigang Ji\r
-     */\r
-    private class PhysicalNodeChangeListener implements DataChangeListener {\r
-        @Override\r
-        public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
-            if ( null == change ) {\r
-                return;\r
-            }\r
-\r
-            Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
-            Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
-\r
-            if ( null != updatedData && !updatedData.isEmpty() ) {\r
-                for ( DataObject dataObject : updatedData.values() ) {\r
-                    // TODO\r
-                }\r
-            }\r
-\r
-            Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
-\r
-            if ( null != removedPaths && !removedPaths.isEmpty() ) {\r
-                DataObject dataObject;\r
-\r
-                for ( InstanceIdentifier<?> instanceId : removedPaths ) {\r
-                    dataObject = originalData.get(instanceId);\r
-\r
-                    // TODO\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    /**\r
-     * A listener to change events related to physical links being\r
-     * added, removed or updated.\r
-     *\r
-     * @author Zhigang Ji\r
-     */\r
-    private class PhysicalLinkChangeListener implements DataChangeListener {\r
-        @Override\r
-        public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {\r
-            if ( null == change ) {\r
-                return;\r
-            }\r
-\r
-            Map<InstanceIdentifier<?>, DataObject> originalData = change.getOriginalData();\r
-            Map<InstanceIdentifier<?>, DataObject> updatedData = change.getUpdatedData();\r
-\r
-            if ( null != updatedData && !updatedData.isEmpty() ) {\r
-                for ( DataObject dataObject : updatedData.values() ) {\r
-                    // TODO\r
-                }\r
-            }\r
-\r
-            Set<InstanceIdentifier<?>> removedPaths = change.getRemovedPaths();\r
-\r
-            if ( null != removedPaths && !removedPaths.isEmpty() ) {\r
-                DataObject dataObject;\r
-\r
-                for ( InstanceIdentifier<?> instanceId : removedPaths ) {\r
-                    dataObject = originalData.get(instanceId);\r
-\r
-                    // TODO\r
-                }\r
-            }\r
-        }\r
-    }\r
 }\r
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
diff --git a/nemo-impl/src/test/resources/vpn.py b/nemo-impl/src/test/resources/vpn.py
new file mode 100644 (file)
index 0000000..3c28d93
--- /dev/null
@@ -0,0 +1,372 @@
+#!/usr/bin/python\r
+#Filename:vpn.py\r
+import requests,json\r
+import argparse, sys\r
+from requests.auth import HTTPBasicAuth\r
+\r
+USERNAME='admin'\r
+PASSWORD='admin'\r
+\r
+TRANSACTION_BEGIN="http://%s:8181/restconf/operations/nemo-intent:begin-transaction"\r
+TRANSACTION_END="http://%s:8181/restconf/operations/nemo-intent:end-transaction"\r
+REGISTER_USER="http://%s:8181/restconf/operations/nemo-intent:register-user"\r
+STRUCTURE_UPDATE_USERS="http://%s:8181/restconf/operations/nemo-intent:structure-style-nemo-update"\r
+\r
+def register_user(contHost):\r
+       data={\r
+                       "input":{\r
+                                       "user-id":"14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+                                       "user-name":"user2",\r
+                                       "user-password":"abc",\r
+                                       "user-role":"tenant"\r
+                                       }\r
+               }\r
+       post(REGISTER_USER % contHost, data)\r
+\r
+\r
+def transaction_begin(contHost):\r
+       data={\r
+                       "input":{\r
+                                       "user-id":"14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+                                       "user-name":"user2",\r
+                                       "user-password":"abc",\r
+                                       "user-role":"tenant"\r
+                                       }\r
+               }\r
+       post(TRANSACTION_BEGIN % contHost, data)\r
+\r
+       \r
+def transaction_end(contHost):\r
+       data={\r
+                       "input":{\r
+                                       "user-id":"14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+                                       "user-name":"user2",\r
+                                       "user-password":"abc",\r
+                                       "user-role":"tenant"\r
+                                       }\r
+               }\r
+       post(TRANSACTION_END % contHost, data)\r
+\r
+       \r
+def add_branch1_node(contHost):\r
+       data={\r
+                 "input":{\r
+                         "user-name": "user2",\r
+                         "user-role": "tenant",\r
+                         "user-password": "abc",\r
+                         "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+                         "objects":{\r
+                         "node":[\r
+                                         {\r
+                                                       "node-name": "bank-branch1",\r
+                                                       "node-type": "ext-group",\r
+                                                       "property": [\r
+                                                                                 {\r
+                                                                                       "property-name": "location",\r
+                                                                                       "property-values": {\r
+                                                                                                         "string-value": [\r
+                                                                                                                       {\r
+                                                                                                                         "order": "0",\r
+                                                                                                                         "value": "HW:NE40E:CE1:GE1/0/0"\r
+                                                                                                                       }\r
+                                                                                                               ]\r
+                                                                                                       }\r
+                                                                                 },\r
+                                                                                 {\r
+                                                                                       "property-name": "ac-info-network",\r
+                                                                                       "property-values": {\r
+                                                                                                         "string-value": [\r
+                                                                                                                       {\r
+                                                                                                                         "order": "0",\r
+                                                                                                                         "value": "layer3"\r
+                                                                                                                       }\r
+                                                                                                               ]\r
+                                                                                                       }\r
+                                                                                 },\r
+                                                                                 {\r
+                                                                                       "property-name": "ac-info-protocol",\r
+                                                                                       "property-values": {\r
+                                                                                                         "string-value": [\r
+                                                                                                                       {\r
+                                                                                                                         "order": "0",\r
+                                                                                                                         "value": "static"\r
+                                                                                                                       }\r
+                                                                                                               ]\r
+                                                                                                       }\r
+                                                                                 },\r
+                                                                                 {\r
+                                                                                       "property-name": "ip-prefix",\r
+                                                                                       "property-values": {\r
+                                                                                                         "string-value": [\r
+                                                                                                                       {\r
+                                                                                                                         "order": "0",\r
+                                                                                                                         "value": "160.1.1.0/24"\r
+                                                                                                                       }\r
+                                                                                                               ]\r
+                                                                                                       }\r
+                                                                                 }\r
+                                                                               ],\r
+                                                       "node-id": "94a6fb90-b425-4ffd-9515-c0684aa4c37f"\r
+                                                 }\r
+                                       ]\r
+                         }\r
+                 }\r
+               }\r
+       post(STRUCTURE_UPDATE_USERS % contHost, data)\r
+       \r
+\r
+def add_branch2_node(contHost):\r
+       data={\r
+                 "input":{\r
+                         "user-name": "user2",\r
+                         "user-role": "tenant",\r
+                         "user-password": "abc",\r
+                         "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+                         "objects":{\r
+                         "node":[\r
+                                         {\r
+                                                       "node-name": "bank-branch2",\r
+                                                       "node-type": "ext-group",\r
+                                                       "property": [\r
+                                                                                 {\r
+                                                                                       "property-name": "location",\r
+                                                                                       "property-values": {\r
+                                                                                                         "string-value": [\r
+                                                                                                                       {\r
+                                                                                                                         "order": "0",\r
+                                                                                                                         "value": "HW:NE40E:CE2:GE3/0/2"\r
+                                                                                                                       }\r
+                                                                                                               ]\r
+                                                                                                       }\r
+                                                                                 },\r
+                                                                                 {\r
+                                                                                       "property-name": "ac-info-network",\r
+                                                                                       "property-values": {\r
+                                                                                                         "string-value": [\r
+                                                                                                                       {\r
+                                                                                                                         "order": "0",\r
+                                                                                                                         "value": "layer3"\r
+                                                                                                                       }\r
+                                                                                                               ]\r
+                                                                                                       }\r
+                                                                                 },\r
+                                                                                 {\r
+                                                                                       "property-name": "ac-info-protocol",\r
+                                                                                       "property-values": {\r
+                                                                                                         "string-value": [\r
+                                                                                                                       {\r
+                                                                                                                         "order": "0",\r
+                                                                                                                         "value": "static"\r
+                                                                                                                       }\r
+                                                                                                               ]\r
+                                                                                                       }\r
+                                                                                 },\r
+                                                                                 {\r
+                                                                                       "property-name": "ip-prefix",\r
+                                                                                       "property-values": {\r
+                                                                                                         "string-value": [\r
+                                                                                                                       {\r
+                                                                                                                         "order": "0",\r
+                                                                                                                         "value": "169.1.1.0/24"\r
+                                                                                                                       }\r
+                                                                                                               ]\r
+                                                                                                       }\r
+                                                                                 }\r
+                                                                               ],\r
+                                                       "node-id": "d463232f-363f-491c-a6f5-097ed0a794d3"\r
+                                                 }\r
+                                       ]\r
+                         }\r
+                 }\r
+               }\r
+       post(STRUCTURE_UPDATE_USERS % contHost, data)\r
+       \r
+def add_DC_node(contHost):\r
+       data={\r
+                 "input":{\r
+                         "user-name": "user2",\r
+                         "user-role": "tenant",\r
+                         "user-password": "abc",\r
+                         "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+                         "objects":{\r
+                         "node":[\r
+                                         {\r
+                                                       "node-name": "bank-DC",\r
+                                                       "node-type": "ext-group",\r
+                                                       "property": [\r
+                                                                                 {\r
+                                                                                       "property-name": "location",\r
+                                                                                       "property-values": {\r
+                                                                                                         "string-value": [\r
+                                                                                                                       {\r
+                                                                                                                         "order": "0",\r
+                                                                                                                         "value": "HW:NE40E:CE3:GE1/0/0"\r
+                                                                                                                       }\r
+                                                                                                               ]\r
+                                                                                                       }\r
+                                                                                 },\r
+                                                                                 {\r
+                                                                                       "property-name": "ac-info-network",\r
+                                                                                       "property-values": {\r
+                                                                                                         "string-value": [\r
+                                                                                                                       {\r
+                                                                                                                         "order": "0",\r
+                                                                                                                         "value": "layer3"\r
+                                                                                                                       }\r
+                                                                                                               ]\r
+                                                                                                       }\r
+                                                                                 },\r
+                                                                                 {\r
+                                                                                       "property-name": "ac-info-protocol",\r
+                                                                                       "property-values": {\r
+                                                                                                         "string-value": [\r
+                                                                                                                       {\r
+                                                                                                                         "order": "0",\r
+                                                                                                                         "value": "static"\r
+                                                                                                                       }\r
+                                                                                                               ]\r
+                                                                                                       }\r
+                                                                                 },\r
+                                                                                 {\r
+                                                                                       "property-name": "ip-prefix",\r
+                                                                                       "property-values": {\r
+                                                                                                         "string-value": [\r
+                                                                                                                       {\r
+                                                                                                                         "order": "0",\r
+                                                                                                                         "value": "164.1.1.0/24"\r
+                                                                                                                       }\r
+                                                                                                               ]\r
+                                                                                                       }\r
+                                                                                 }\r
+                                                                               ],\r
+                                                       "node-id": "b46cfa7f-93a3-43f4-ac20-09307c75feca"\r
+                                                 }\r
+                                       ]\r
+                         }\r
+                 }\r
+               }\r
+       post(STRUCTURE_UPDATE_USERS % contHost, data)\r
+       \r
+       \r
+       \r
+def add_branch1_branch2_connection(contHost):\r
+       data={\r
+                "input": {\r
+                         "user-name": "user2",\r
+                         "user-role": "tenant",\r
+                         "user-password": "abc",\r
+                         "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+                         "objects":{\r
+                                 "connection": [\r
+                                                 {\r
+                                                       "connection-name": "c1",\r
+                                                       "connection-id": "30da6667-608e-4d2f-bb50-79e5cabcc523",\r
+                                                       "end-node": [\r
+                                                         {\r
+                                                               "order": "0",\r
+                                                               "node-id": "94a6fb90-b425-4ffd-9515-c0684aa4c37f"\r
+                                                         },\r
+                                                         {\r
+                                                               "order": "0",\r
+                                                               "node-id": "d463232f-363f-491c-a6f5-097ed0a794d3"\r
+                                                         }\r
+                                                       ],\r
+                                                       "connection-type": "p2p",\r
+                                               }\r
+                                       ]\r
+                               }\r
+                 }\r
+       }\r
+       post(STRUCTURE_UPDATE_USERS % contHost, data)\r
+\r
+def add_branch1_DC_connection(contHost):\r
+       data={\r
+                "input": {\r
+                         "user-name": "user2",\r
+                         "user-role": "tenant",\r
+                         "user-password": "abc",\r
+                         "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+                         "objects":{\r
+                                 "connection": [\r
+                                                 {\r
+                                                       "connection-name": "c2",\r
+                                                       "connection-id": "b49e3960-c08d-4fff-b9fc-08b65ebcde2c",\r
+                                                       "end-node": [\r
+                                                         {\r
+                                                               "order": "0",\r
+                                                               "node-id": "94a6fb90-b425-4ffd-9515-c0684aa4c37f"\r
+                                                         },\r
+                                                         {\r
+                                                               "order": "0",\r
+                                                               "node-id": "b46cfa7f-93a3-43f4-ac20-09307c75feca"\r
+                                                         }\r
+                                                       ],\r
+                                                       "connection-type": "p2p",\r
+                                               }\r
+                                       ]\r
+                               }\r
+                 }\r
+       }\r
+       post(STRUCTURE_UPDATE_USERS % contHost, data)\r
+       \r
+\r
+def add_branch2_DC_connection(contHost):\r
+       data={\r
+                "input": {\r
+                         "user-name": "user2",\r
+                         "user-role": "tenant",\r
+                         "user-password": "abc",\r
+                         "user-id": "14ce424a-3e50-4a2a-ad5c-b29845158c8b",\r
+                         "objects":{\r
+                                 "connection": [\r
+                                                 {\r
+                                                       "connection-name": "c3",\r
+                                                       "connection-id": "e0d56fee-7235-4748-a2a1-eb5e3733d866",\r
+                                                       "end-node": [\r
+                                                         {\r
+                                                               "order": "0",\r
+                                                               "node-id": "d463232f-363f-491c-a6f5-097ed0a794d3"\r
+                                                         },\r
+                                                         {\r
+                                                               "order": "0",\r
+                                                               "node-id": "b46cfa7f-93a3-43f4-ac20-09307c75feca"\r
+                                                         }\r
+                                                       ],\r
+                                                       "connection-type": "p2p",\r
+                                               }\r
+                                       ]\r
+                               }\r
+                 }\r
+       }\r
+       post(STRUCTURE_UPDATE_USERS % contHost, data)\r
+       \r
+\r
+def post(url, data):\r
+    headers = {'Content-type': 'application/yang.data+json',\r
+               'Accept': 'application/yang.data+json'}\r
+    print "POST %s" % url\r
+    print json.dumps(data, indent=4, sort_keys=True)\r
+    r = requests.post(url, data=json.dumps(data), headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD))\r
+    print r.text\r
+    r.raise_for_status()\r
+       \r
+if __name__ == '__main__':\r
+\r
+       parser = argparse.ArgumentParser()\r
+       parser.add_argument('--controller', default='127.0.0.1', help='controller IP')\r
+       args=parser.parse_args()\r
+\r
+       # CREATE User;\r
+       register_user(args.controller)\r
+\r
+       transaction_begin(args.controller)\r
+       \r
+       add_branch1_node(args.controller)\r
+       add_branch2_node(args.controller)\r
+       add_DC_node(args.controller)\r
+       \r
+       add_branch1_branch2_connection(args.controller)\r
+       add_branch1_DC_connection(args.controller)\r
+       add_branch2_DC_connection(args.controller)\r
+       \r
+       transaction_end(args.controller)
\ No newline at end of file
index 0c9915d59816f8ff60ab210c9e5358ef8ff05e26..51c04821442981c4d04f71108015d8af32fd63f1 100644 (file)
@@ -111,9 +111,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
         <artifactId>maven-bundle-plugin</artifactId>
         <configuration>
           <instructions>
-            <Export-Package>org.codehaus.jackson,
+            <Export-Package>
+              org.codehaus.jackson,
               org.codehaus.jackson.*,
-              org.joda.time.*,
+              org.joda.time.*
             </Export-Package>
             <Import-Package>*</Import-Package>
           </instructions>
index 275a0e142cff1f8a7feb13408aed76dd1b202390..bc5763a81110542a087ab05b06d09aabce14a662 100644 (file)
@@ -62,6 +62,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instru
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.*;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;\r
@@ -108,10 +109,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.m
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.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.vn.pn.mapping.results.UserVnPnMapping;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.intent.mapping.result.rev151010.vn.pn.mapping.results.user.vn.pn.mapping.VnPnMappingResult;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.IntentId;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.MatchItemName;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.PropertyName;\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.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.operations.Operation;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.users.User;\r
@@ -290,6 +288,7 @@ public class FlowUtils implements AutoCloseable {
                updateMplsTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
                updateIpTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
                updateArpTable(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+        updateFlowTableForOperations(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
 \r
         return;\r
     }\r
@@ -1243,8 +1242,10 @@ public class FlowUtils implements AutoCloseable {
                         for ( MacAddress macAddress : macAddresses ) {\r
                             virtualArp = virtualNetworkHelper.getVirtualArp(macAddress);\r
 \r
-                            configArpTableEntry(user.getUserId(), virtualArp, physicalPath);\r
-                            configMacTableEntry(user.getUserId(), macAddress, physicalNodeId1, physicalPortId);\r
+                            if ( null != virtualArp ) {\r
+                                configArpTableEntry(user.getUserId(), virtualArp, physicalPath);\r
+                                configMacTableEntry(user.getUserId(), macAddress, physicalNodeId1, physicalPortId);\r
+                            }\r
                         }\r
                     }\r
                 }\r
@@ -1268,13 +1269,32 @@ public class FlowUtils implements AutoCloseable {
             layer2ExternalVirtualPort = virtualNetworkHelper.getLayer2ExternalVirtualPort(virtualNodeId);\r
 \r
             if ( null != layer2ExternalVirtualPort ) {\r
-                // TODO: config ip and arp tables.\r
+                vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+                        new VirtualResourceEntityId(layer2ExternalVirtualPort.getPortId().getValue()));\r
+                physicalPortId = new PhysicalPortId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+                physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
+\r
+                ipPrefixes = layer2ExternalVirtualPort.getExternalIpPrefixes().getExternalIpPrefix();\r
+\r
+                if ( !ipPrefixes.isEmpty() ) {\r
+                    ipPrefix = ipPrefixes.get(0);\r
+\r
+                    configIpTableEntry(user.getUserId(), ipPrefix, physicalNodeId, physicalPort, true);\r
+                }\r
+\r
+                macAddresses = layer2ExternalVirtualPort.getExternalMacAddresses().getExternalMacAddress();\r
+\r
+                for ( MacAddress macAddress : macAddresses ) {\r
+                    virtualArp = virtualNetworkHelper.getVirtualArp(macAddress);\r
+\r
+                    if ( null != virtualArp ) {\r
+                        configArpTableEntry(user.getUserId(), virtualArp, physicalNodeId, physicalPortId);\r
+                    }\r
+                }\r
             }\r
         }\r
 \r
-        updateIpTableForOperations(user, virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
-\r
-        // log format: vnode(nodetype) --> vnode(nodetype): vlink; ppath; plinks; mplslabels; meterid;\r
+        // Log format: vnode(nodetype) --> vnode(nodetype): vlink; ppath; plinks; mplslabels; meterid;\r
         StringBuilder stringBuilder = new StringBuilder();\r
         Set<VirtualLinkId> printedVirtualLinks = new HashSet<VirtualLinkId>();\r
         VirtualNode srcVirtualNode;\r
@@ -1409,11 +1429,11 @@ public class FlowUtils implements AutoCloseable {
      * @param userVnPnMapping TODO\r
      * @param physicalNetwork TODO\r
      */\r
-    private void updateIpTableForOperations(User user,\r
-                                            VirtualNetwork virtualNetwork,\r
-                                            UserIntentVnMapping userIntentVnMapping,\r
-                                            UserVnPnMapping userVnPnMapping,\r
-                                            PhysicalNetwork physicalNetwork) {\r
+    private void updateFlowTableForOperations(User user,\r
+                                              VirtualNetwork virtualNetwork,\r
+                                              UserIntentVnMapping userIntentVnMapping,\r
+                                              UserVnPnMapping userVnPnMapping,\r
+                                              PhysicalNetwork physicalNetwork) {\r
         if ( null == user.getOperations() ) {\r
             return;\r
         }\r
@@ -1424,8 +1444,276 @@ public class FlowUtils implements AutoCloseable {
             return;\r
         }\r
 \r
-        Operation operation = operations.get(0);\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action> actions;\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action action;\r
+        ActionName denyActionName = new ActionName("deny");\r
+        ActionName allowActionName = new ActionName("allow");\r
+        ActionName goThroughActionName = new ActionName("go-through");\r
+\r
+        for ( Operation operation : operations ) {\r
+            actions = operation.getAction();\r
+\r
+            action = getAction(actions, denyActionName);\r
+\r
+            if ( null != action ) {\r
+                updateFlowTableForOperationWithDenyAction(user, operation,\r
+                        virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+\r
+                break;\r
+            }\r
+\r
+            action = getAction(actions, allowActionName);\r
+\r
+            if ( null != action ) {\r
+                updateFlowTableForOperationWithAllowAction(user, operation,\r
+                        virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+\r
+                break;\r
+            }\r
+\r
+            action = getAction(actions, goThroughActionName);\r
+\r
+            if ( null != action ) {\r
+                updateFlowTableForOperationWithGoThroughAction(user, operation,\r
+                        virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+\r
+//                break;\r
+            }\r
+        }\r
+\r
+        return;\r
+    }\r
 \r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @param userVnPnMapping TODO\r
+     * @param physicalNetwork TODO\r
+     */\r
+    private void updateFlowTableForOperationWithDenyAction(User user,\r
+                                                           Operation operation,\r
+                                                           VirtualNetwork virtualNetwork,\r
+                                                           UserIntentVnMapping userIntentVnMapping,\r
+                                                           UserVnPnMapping userVnPnMapping,\r
+                                                           PhysicalNetwork physicalNetwork) {\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow> nemoFlows =\r
+                user.getObjects().getFlow();\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.FlowId nemoFlowId =\r
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.FlowId(operation.getTargetObject().getValue());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow nemoFlow =\r
+                getFlow(nemoFlows, nemoFlowId);\r
+\r
+        long priority;\r
+\r
+        if ( null == operation.getPriority() ) {\r
+            priority = 1;\r
+        } else {\r
+            priority = 1 + operation.getPriority();\r
+        }\r
+\r
+        List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+        IntentId intentId = new IntentId(operation.getOperationId().getValue());\r
+        IntentVnMappingResult intentVnMappingResult = getIntentVnMappingResult(intentVnMappingResults, intentId);\r
+        List<VirtualResource> virtualResources = intentVnMappingResult.getVirtualResource();\r
+        VirtualResource virtualResource = virtualResources.get(0);\r
+        VirtualNodeId virtualNodeId = new VirtualNodeId(virtualResource.getVirtualResourceEntityId().getValue());\r
+\r
+        List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+        VnPnMappingResult vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+                new VirtualResourceEntityId(virtualNodeId.getValue()));\r
+        PhysicalNodeId physicalNodeId =\r
+                new PhysicalNodeId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+\r
+        configFlowTableEntryForOperation(user.getUserId(), nemoFlow, physicalNodeId, (short)priority, true);\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @param userVnPnMapping TODO\r
+     * @param physicalNetwork TODO\r
+     */\r
+    private void updateFlowTableForOperationWithAllowAction(User user,\r
+                                                            Operation operation,\r
+                                                            VirtualNetwork virtualNetwork,\r
+                                                            UserIntentVnMapping userIntentVnMapping,\r
+                                                            UserVnPnMapping userVnPnMapping,\r
+                                                            PhysicalNetwork physicalNetwork) {\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow> nemoFlows =\r
+                user.getObjects().getFlow();\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.FlowId nemoFlowId =\r
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.FlowId(operation.getTargetObject().getValue());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow nemoFlow =\r
+                getFlow(nemoFlows, nemoFlowId);\r
+\r
+        long priority;\r
+\r
+        if ( null == operation.getPriority() ) {\r
+            priority = 1;\r
+        } else {\r
+            priority = 1 + operation.getPriority();\r
+        }\r
+\r
+        VirtualNetworkHelper virtualNetworkHelper = virtualNetworkHelpers.get(virtualNetwork.getNetworkId());\r
+\r
+        List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+        IntentId intentId = new IntentId(operation.getOperationId().getValue());\r
+        IntentVnMappingResult intentVnMappingResult = getIntentVnMappingResult(intentVnMappingResults, intentId);\r
+        List<VirtualResource> virtualResources = intentVnMappingResult.getVirtualResource();\r
+        VirtualResource virtualResource = virtualResources.get(0);\r
+        VirtualPathId virtualPathId = new VirtualPathId(virtualResource.getVirtualResourceEntityId().getValue());\r
+        VirtualPath virtualPath = virtualNetworkHelper.getVirtualPath(virtualPathId);\r
+\r
+        if ( null == virtualPath || virtualPath.getVirtualLink().isEmpty() ) {\r
+            return;\r
+        }\r
+\r
+        List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+        VnPnMappingResult vnPnMappingResult;\r
+        PhysicalPathId physicalPathId;\r
+        PhysicalPath physicalPath;\r
+\r
+        for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink\r
+                virtualLink : virtualPath.getVirtualLink() ) {\r
+            vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+                    new VirtualResourceEntityId(virtualLink.getLinkId().getValue()));\r
+            physicalPathId = new PhysicalPathId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+            physicalPath = physicalNetworkHelper.getPhysicalPath(physicalPathId);\r
+\r
+            configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+                    null, physicalPath, (short)priority, true);\r
+        }\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @param userVnPnMapping TODO\r
+     * @param physicalNetwork TODO\r
+     */\r
+    private void updateFlowTableForOperationWithGoThroughAction(User user,\r
+                                                                Operation operation,\r
+                                                                VirtualNetwork virtualNetwork,\r
+                                                                UserIntentVnMapping userIntentVnMapping,\r
+                                                                UserVnPnMapping userVnPnMapping,\r
+                                                                PhysicalNetwork physicalNetwork) {\r
+        List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+        IntentId intentId = new IntentId(operation.getOperationId().getValue());\r
+        IntentVnMappingResult intentVnMappingResult = getIntentVnMappingResult(intentVnMappingResults, intentId);\r
+        List<VirtualResource> virtualResources = intentVnMappingResult.getVirtualResource();\r
+\r
+        if ( 1 == virtualResources.size() ) {\r
+            updateFlowTableForOperationWithGoThroughNormalGroupAction(user, operation,\r
+                    virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+        } else {\r
+            updateFlowTableForOperationWithGoThroughChainGroupAction(user, operation,\r
+                    virtualNetwork, userIntentVnMapping, userVnPnMapping, physicalNetwork);\r
+        }\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @param userVnPnMapping TODO\r
+     * @param physicalNetwork TODO\r
+     */\r
+    private void updateFlowTableForOperationWithGoThroughNormalGroupAction(User user,\r
+                                                                           Operation operation,\r
+                                                                           VirtualNetwork virtualNetwork,\r
+                                                                           UserIntentVnMapping userIntentVnMapping,\r
+                                                                           UserVnPnMapping userVnPnMapping,\r
+                                                                           PhysicalNetwork physicalNetwork) {\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow> nemoFlows =\r
+                user.getObjects().getFlow();\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.FlowId nemoFlowId =\r
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.FlowId(operation.getTargetObject().getValue());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow nemoFlow =\r
+                getFlow(nemoFlows, nemoFlowId);\r
+\r
+        long priority;\r
+\r
+        if ( null == operation.getPriority() ) {\r
+            priority = 1;\r
+        } else {\r
+            priority = 1 + operation.getPriority();\r
+        }\r
+\r
+        VirtualNetworkHelper virtualNetworkHelper = virtualNetworkHelpers.get(virtualNetwork.getNetworkId());\r
+\r
+        List<IntentVnMappingResult> intentVnMappingResults = userIntentVnMapping.getIntentVnMappingResult();\r
+        IntentId intentId = new IntentId(operation.getOperationId().getValue());\r
+        IntentVnMappingResult intentVnMappingResult = getIntentVnMappingResult(intentVnMappingResults, intentId);\r
+        List<VirtualResource> virtualResources = intentVnMappingResult.getVirtualResource();\r
+        VirtualResource virtualResource = virtualResources.get(0);\r
+        VirtualPathId virtualPathId = new VirtualPathId(virtualResource.getVirtualResourceEntityId().getValue());\r
+        VirtualPath virtualPath = virtualNetworkHelper.getVirtualPath(virtualPathId);\r
+\r
+        if ( null == virtualPath || virtualPath.getVirtualLink().isEmpty() ) {\r
+            return;\r
+        }\r
+\r
+        List<VnPnMappingResult> vnPnMappingResults = userVnPnMapping.getVnPnMappingResult();\r
+        VnPnMappingResult vnPnMappingResult;\r
+        PhysicalPathId physicalPathId;\r
+        PhysicalPath physicalPath;\r
+\r
+        for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.generic.virtual.network.rev151010.virtual.path.instance.VirtualLink\r
+                virtualLink : virtualPath.getVirtualLink() ) {\r
+            vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
+                    new VirtualResourceEntityId(virtualLink.getLinkId().getValue()));\r
+            physicalPathId = new PhysicalPathId(vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
+            physicalPath = physicalNetworkHelper.getPhysicalPath(physicalPathId);\r
+\r
+            configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+                    null, physicalPath, (short)priority, true);\r
+        }\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param user TODO\r
+     * @param operation TODO\r
+     * @param virtualNetwork TODO\r
+     * @param userIntentVnMapping TODO\r
+     * @param userVnPnMapping TODO\r
+     * @param physicalNetwork TODO\r
+     */\r
+    private void updateFlowTableForOperationWithGoThroughChainGroupAction(User user,\r
+                                                                          Operation operation,\r
+                                                                          VirtualNetwork virtualNetwork,\r
+                                                                          UserIntentVnMapping userIntentVnMapping,\r
+                                                                          UserVnPnMapping userVnPnMapping,\r
+                                                                          PhysicalNetwork physicalNetwork) {\r
         List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow> nemoFlows =\r
                 user.getObjects().getFlow();\r
         org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.common.rev151010.FlowId nemoFlowId =\r
@@ -1506,8 +1794,8 @@ public class FlowUtils implements AutoCloseable {
                                 physicalPort = physicalNetworkHelper\r
                                         .getPhysicalPort(physicalLink.getSrcNodeId(), physicalLink.getSrcPortId());\r
 \r
-                                configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
-                                        physicalPort, physicalPath, (short)priority, true);\r
+                                configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+                                        physicalPort, physicalPath, (short) priority, true);\r
                             }\r
                         }\r
 \r
@@ -1523,8 +1811,8 @@ public class FlowUtils implements AutoCloseable {
                                     vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
                             physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
 \r
-                            configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
-                                    physicalPort, physicalPath, (short)priority, true);\r
+                            configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+                                    physicalPort, physicalPath, (short) priority, true);\r
                         }\r
 \r
                         layer2ExternalVirtualPort = virtualNetworkHelper\r
@@ -1539,8 +1827,8 @@ public class FlowUtils implements AutoCloseable {
                                     vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
                             physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
 \r
-                            configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
-                                    physicalPort, physicalPath, (short)priority, true);\r
+                            configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+                                    physicalPort, physicalPath, (short) priority, true);\r
                         }\r
                     }\r
                 } else if ( VirtualResource.VirtualResourceType.Vport\r
@@ -1567,8 +1855,8 @@ public class FlowUtils implements AutoCloseable {
                             physicalPort1 = physicalNetworkHelper\r
                                     .getPhysicalPort(physicalLink.getSrcNodeId(), physicalLink.getSrcPortId());\r
 \r
-                            configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
-                                    physicalNodeId, physicalPort1, physicalPort, (short)priority, true);\r
+                            configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+                                    physicalNodeId, physicalPort1, physicalPort, (short) priority, true);\r
                         }\r
                     }\r
 \r
@@ -1583,8 +1871,8 @@ public class FlowUtils implements AutoCloseable {
                                 vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
                         physicalPort1 = physicalNetworkHelper.getPhysicalPort(physicalNodeId1, physicalPortId1);\r
 \r
-                        configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
-                                physicalNodeId1, physicalPort1, physicalPort, (short)priority, true);\r
+                        configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+                                physicalNodeId1, physicalPort1, physicalPort, (short) priority, true);\r
                     }\r
 \r
                     layer2ExternalVirtualPort = virtualNetworkHelper.getLayer2ExternalVirtualPort(virtualNodeId);\r
@@ -1598,8 +1886,8 @@ public class FlowUtils implements AutoCloseable {
                                 vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
                         physicalPort1 = physicalNetworkHelper.getPhysicalPort(physicalNodeId1, physicalPortId1);\r
 \r
-                        configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
-                                physicalNodeId1, physicalPort1, physicalPort, (short)priority, true);\r
+                        configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+                                physicalNodeId1, physicalPort1, physicalPort, (short) priority, true);\r
                     }\r
                 }\r
             } else {\r
@@ -1624,8 +1912,8 @@ public class FlowUtils implements AutoCloseable {
                                 vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
                         physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
 \r
-                        configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
-                                physicalPort, physicalPath, (short)priority, true);\r
+                        configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+                                physicalPort, physicalPath, (short) priority, true);\r
                     }\r
                 } else if ( VirtualResource.VirtualResourceType.Vpath == virtualResource1.getVirtualResourceType()\r
                         && VirtualResource.VirtualResourceType.Vport == virtualResource.getVirtualResourceType() ) {\r
@@ -1648,8 +1936,8 @@ public class FlowUtils implements AutoCloseable {
                             vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
                     physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
 \r
-                    configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
-                            physicalNodeId, physicalPort1, physicalPort, (short)priority, true);\r
+                    configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+                            physicalNodeId, physicalPort1, physicalPort, (short) priority, true);\r
                 } else if ( VirtualResource.VirtualResourceType.Vport == virtualResource1.getVirtualResourceType()\r
                         && VirtualResource.VirtualResourceType.Vport == virtualResource.getVirtualResourceType() ) {\r
                     vnPnMappingResult = getVnPnMappingResult(vnPnMappingResults,\r
@@ -1668,8 +1956,8 @@ public class FlowUtils implements AutoCloseable {
                             vnPnMappingResult.getPhysicalResourceEntityId().getValue());\r
                     physicalPort = physicalNetworkHelper.getPhysicalPort(physicalNodeId, physicalPortId);\r
 \r
-                    configIpTableEntryForOperation(user.getUserId(), nemoFlow,\r
-                            physicalNodeId1, physicalPort1, physicalPort, (short)priority, true);\r
+                    configFlowTableEntryForOperation(user.getUserId(), nemoFlow,\r
+                            physicalNodeId1, physicalPort1, physicalPort, (short) priority, true);\r
                 }\r
             }\r
 \r
@@ -1966,6 +2254,27 @@ public class FlowUtils implements AutoCloseable {
         return null;\r
     }\r
 \r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param actions TODO\r
+     * @param actionName TODO\r
+     * @return TODO\r
+     */\r
+    private static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action getAction(\r
+            List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action> actions,\r
+            ActionName actionName) {\r
+        for ( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.operation.rev151010.operation.instance.Action\r
+                action : actions ) {\r
+            if ( action.getActionName().equals(actionName) ) {\r
+                return action;\r
+            }\r
+        }\r
+\r
+        return null;\r
+    }\r
+\r
     /**\r
      * TODO\r
      *\r
@@ -2347,7 +2656,7 @@ public class FlowUtils implements AutoCloseable {
         List<Instruction> instructionList = new LinkedList<Instruction>();\r
         List<Action> actionList = new LinkedList<Action>();\r
 \r
-        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long)ETH_TYPE_IP)).build());\r
+        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder().setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long) ETH_TYPE_IP)).build());\r
         EthernetMatch ethernetMatch = ethernetMatchBuilder.build();\r
 \r
         MetadataBuilder metadataBuilder = new MetadataBuilder().setMetadata(BigInteger.valueOf(metadatas.get(userId)));\r
@@ -2531,6 +2840,39 @@ public class FlowUtils implements AutoCloseable {
         return;\r
     }\r
 \r
+    /**\r
+     * TODO\r
+     *\r
+     * @author Zhigang Ji\r
+     * @param userId TODO\r
+     * @param nemoFlow TODO\r
+     * @param physicalNodeId TODO\r
+     * @param operationPriority TODO\r
+     * @param layer3Forwarding TODO\r
+     */\r
+    private void configFlowTableEntryForOperation(UserId userId,\r
+                                                  org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow nemoFlow,\r
+                                                  PhysicalNodeId physicalNodeId,\r
+                                                  short operationPriority,\r
+                                                  boolean layer3Forwarding) {\r
+        WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
+\r
+        Match match = createMatch(userId, nemoFlow, null);\r
+        Instructions instructions = new InstructionsBuilder().setInstruction(new ArrayList<Instruction>(0)).build();\r
+\r
+        FlowId flowId = new FlowId(UUID.randomUUID().toString());\r
+        FlowBuilder flowBuilder = baseFlowBuilder().setId(flowId).setTableId(layer3Forwarding ? IP_TABLE_ID : MAC_TABLE_ID);\r
+        Flow flow = flowBuilder.setPriority(DEFAULT_FLOW_PRIORITY + operationPriority).setMatch(match).setInstructions(instructions).build();\r
+\r
+        NodeId nodeId = createNodeId(physicalNodeId);\r
+        InstanceIdentifier<Flow> flowInsId = generateFlowInsId(userId, nodeId, flow.getTableId(), flow.getId());\r
+\r
+        writeTransaction.put(LogicalDatastoreType.CONFIGURATION, flowInsId, flow, true);\r
+        writeTransaction.submit();\r
+\r
+        return;\r
+    }\r
+\r
     /**\r
      * TODO\r
      *\r
@@ -2540,16 +2882,16 @@ public class FlowUtils implements AutoCloseable {
      * @param physicalNodeId TODO\r
      * @param inPhysicalPort TODO\r
      * @param outPhysicalPort TODO\r
-     * @param policyPriority TODO\r
+     * @param operationPriority TODO\r
      * @param layer3Forwarding TODO\r
      */\r
-    private void configIpTableEntryForOperation(UserId userId,\r
-                                                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow nemoFlow,\r
-                                                PhysicalNodeId physicalNodeId,\r
-                                                PhysicalPort inPhysicalPort,\r
-                                                PhysicalPort outPhysicalPort,\r
-                                                short policyPriority,\r
-                                                boolean layer3Forwarding) {\r
+    private void configFlowTableEntryForOperation(UserId userId,\r
+                                                  org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow nemoFlow,\r
+                                                  PhysicalNodeId physicalNodeId,\r
+                                                  PhysicalPort inPhysicalPort,\r
+                                                  PhysicalPort outPhysicalPort,\r
+                                                  short operationPriority,\r
+                                                  boolean layer3Forwarding) {\r
         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
         List<Instruction> instructionList = new LinkedList<Instruction>();\r
         List<Action> actionList = new LinkedList<Action>();\r
@@ -2594,7 +2936,7 @@ public class FlowUtils implements AutoCloseable {
 \r
         FlowId flowId = new FlowId(UUID.randomUUID().toString());\r
         FlowBuilder flowBuilder = baseFlowBuilder().setId(flowId).setTableId(layer3Forwarding ? IP_TABLE_ID : MAC_TABLE_ID);\r
-        Flow flow = flowBuilder.setPriority(DEFAULT_FLOW_PRIORITY + policyPriority).setMatch(match).setInstructions(instructions).build();\r
+        Flow flow = flowBuilder.setPriority(DEFAULT_FLOW_PRIORITY + operationPriority).setMatch(match).setInstructions(instructions).build();\r
 \r
         NodeId nodeId = createNodeId(physicalNodeId);\r
         InstanceIdentifier<Flow> flowInsId = generateFlowInsId(userId, nodeId, flow.getTableId(), flow.getId());\r
@@ -2613,15 +2955,15 @@ public class FlowUtils implements AutoCloseable {
      * @param nemoFlow TODO\r
      * @param inPhysicalPort TODO\r
      * @param outPhysicalPath TODO\r
-     * @param policyPriority TODO\r
+     * @param operationPriority TODO\r
      * @param layer3Forwarding TODO\r
      */\r
-    private void configIpTableEntryForOperation(UserId userId,\r
-                                                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow nemoFlow,\r
-                                                PhysicalPort inPhysicalPort,\r
-                                                PhysicalPath outPhysicalPath,\r
-                                                short policyPriority,\r
-                                                boolean layer3Forwarding) {\r
+    private void configFlowTableEntryForOperation(UserId userId,\r
+                                                  org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nemo.intent.rev151010.user.intent.objects.Flow nemoFlow,\r
+                                                  PhysicalPort inPhysicalPort,\r
+                                                  PhysicalPath outPhysicalPath,\r
+                                                  short operationPriority,\r
+                                                  boolean layer3Forwarding) {\r
         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();\r
         PhysicalLink physicalLink = physicalNetworkHelper.getFirstPhysicalLinkOfPhysicalPath(outPhysicalPath);\r
         List<Instruction> instructionList = new LinkedList<Instruction>();\r
@@ -2661,7 +3003,7 @@ public class FlowUtils implements AutoCloseable {
 \r
         FlowId flowId = new FlowId(UUID.randomUUID().toString());\r
         FlowBuilder flowBuilder = baseFlowBuilder().setId(flowId).setTableId(layer3Forwarding ? IP_TABLE_ID : MAC_TABLE_ID);\r
-        Flow flow = flowBuilder.setPriority(DEFAULT_FLOW_PRIORITY + policyPriority).setMatch(match).setInstructions(instructions).build();\r
+        Flow flow = flowBuilder.setPriority(DEFAULT_FLOW_PRIORITY + operationPriority).setMatch(match).setInstructions(instructions).build();\r
 \r
         NodeId nodeId = createNodeId(physicalLink.getSrcNodeId());\r
         InstanceIdentifier<Flow> flowInsId = generateFlowInsId(userId, nodeId, flow.getTableId(), flow.getId());\r