Add resolution for new actions in openflow renderer. 44/30544/1
authorxuewei wang <wangxuewei@huawei.com>
Thu, 3 Dec 2015 10:58:36 +0000 (18:58 +0800)
committerxuewei wang <wangxuewei@huawei.com>
Thu, 3 Dec 2015 11:19:18 +0000 (19:19 +0800)
Change-Id: I9f519c388f78e4cfce9df7a119d50e30d3f30c3e
Signed-off-by: xuewei wang <wangxuewei@huawei.com>
nemo-renderers/openflow-renderer/src/main/java/org/opendaylight/nemo/renderer/openflow/FlowUtils.java

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