Bug 3540: Implementation of FlowIds based on match data
[groupbasedpolicy.git] / renderers / ofoverlay / src / test / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / flow / PolicyEnforcerTest.java
index b4e98079a1a6b569c222abe829e52ca4e01f145f..fb6548cd87dc1e8a64521479b547d1087bca2d9c 100755 (executable)
@@ -8,11 +8,8 @@
 \r
 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow;\r
 \r
-import java.util.Collections;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Objects;\r
-\r
+import com.google.common.collect.ImmutableList;\r
+import com.google.common.collect.ImmutableMap;\r
 import org.junit.Before;\r
 import org.junit.Test;\r
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.PolicyManager.FlowMap;\r
@@ -22,8 +19,10 @@ import org.opendaylight.groupbasedpolicy.resolver.EgKey;
 import org.opendaylight.groupbasedpolicy.resolver.PolicyInfo;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionName;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClauseName;\r
@@ -51,22 +50,32 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.RuleBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg1;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg2;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg3;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg7;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlow;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNodesNodeTableFlow;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg0Key;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg2Key;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlan;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
-import com.google.common.collect.ImmutableList;\r
-import com.google.common.collect.ImmutableMap;\r
+import java.util.Collections;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Objects;\r
 \r
-import static org.junit.Assert.*;\r
-import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.*;\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNotEquals;\r
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.applyActionIns;\r
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.instructions;\r
+import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.nxOutputRegAction;\r
 \r
 public class PolicyEnforcerTest extends FlowTableTest {\r
     protected static final Logger LOG =\r
@@ -113,8 +122,9 @@ public class PolicyEnforcerTest extends FlowTableTest {
         HashMap<String, Flow> flowMap = new HashMap<>();\r
         for (Flow f : fm.getTableForNode(nodeId, ctx.getPolicyManager().getTABLEID_POLICY_ENFORCER()).getFlow()) {\r
             flowMap.put(f.getId().getValue(), f);\r
-            if (f.getId().getValue().indexOf("intraallow") == 0)\r
+            if (isAllowSameEpg(f)) {\r
                 count += 1;\r
+            }\r
         }\r
         assertEquals(1, count);\r
         assertEquals(3, fm.getTableForNode(nodeId, ctx.getPolicyManager().getTABLEID_POLICY_ENFORCER()).getFlow().size());\r
@@ -185,7 +195,7 @@ public class PolicyEnforcerTest extends FlowTableTest {
         HashMap<String, Flow> flowMap = new HashMap<>();\r
         for (Flow f : fm.getTableForNode(nodeId, ctx.getPolicyManager().getTABLEID_POLICY_ENFORCER()).getFlow()) {\r
             flowMap.put(f.getId().getValue(), f);\r
-            if (f.getId().getValue().indexOf("intraallow") == 0) {\r
+            if (isAllowSameEpg(f)) {\r
                 count += 1;\r
             } else if (f.getMatch() != null &&\r
                        Objects.equals(tunnelId, f.getMatch().getInPort())) {\r
@@ -332,4 +342,40 @@ public class PolicyEnforcerTest extends FlowTableTest {
         fm = dosync(flowMap);\r
         assertEquals(numberOfFlows, fm.getTableForNode(nodeId, ctx.getPolicyManager().getTABLEID_POLICY_ENFORCER()).getFlow().size());\r
     }\r
+\r
+    private boolean isAllowSameEpg(Flow flow) {\r
+        // flow has to have exactly 2 registers set, namely NxmNxReg0 and NxmNxReg2\r
+        // (these register values don't have to be equal)\r
+        boolean res = false;\r
+        if (flow != null && flow.getMatch() != null) {\r
+            GeneralAugMatchNodesNodeTableFlow genAug =\r
+                    flow.getMatch().getAugmentation(GeneralAugMatchNodesNodeTableFlow.class);\r
+            if (genAug != null) {\r
+                List<ExtensionList> extensions = genAug.getExtensionList();\r
+                if (extensions != null && extensions.size() == 2) {\r
+                    Long reg0 = null;\r
+                    Long reg2 = null;\r
+                    for (ExtensionList extensionList : extensions) {\r
+                        Class<? extends ExtensionKey> extensionKey = extensionList.getExtensionKey();\r
+                        Extension extension = extensionList.getExtension();\r
+                        if (extensionKey != null && extension != null) {\r
+                            NxAugMatchNodesNodeTableFlow nxAugMatch =\r
+                                    extension.getAugmentation(NxAugMatchNodesNodeTableFlow.class);\r
+                            if (nxAugMatch != null && nxAugMatch.getNxmNxReg() != null) {\r
+                                if (extensionKey.equals(NxmNxReg0Key.class)) {\r
+                                    reg0 = nxAugMatch.getNxmNxReg().getValue();\r
+                                } else if (extensionKey.equals(NxmNxReg2Key.class)) {\r
+                                    reg2 = nxAugMatch.getNxmNxReg().getValue();\r
+                                }\r
+                            }\r
+                        }\r
+                    }\r
+                    if (reg0 != null && reg2 != null) {\r
+                        res = true;\r
+                    }\r
+                }\r
+            }\r
+        }\r
+        return res;\r
+    }\r
 }\r