Bug 2814 - logical OR behavior of classification within a rule. 19/18219/1
authorTomas Cechvala <tcechval@cisco.com>
Fri, 3 Apr 2015 08:01:42 +0000 (01:01 -0700)
committerTomas Cechvala <tcechval@cisco.com>
Mon, 13 Apr 2015 21:21:45 +0000 (14:21 -0700)
Implemented matching against all the classifiers within a rule.

Signed-off-by: Tomas Cechvala <tcechval@cisco.com>
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/PolicyEnforcer.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/DestinationMapperTest.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/GroupTableTest.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/OfTableTest.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/PolicyEnforcerTest.java
renderers/ofoverlay/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/flow/SourceMapperTest.java

index 6125f7a901bffd175f0493b253da2d1c38b3a9e9..8683e0879dab977fd02ed5f337ba9b291cb269e9 100644 (file)
@@ -46,6 +46,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.ta
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
@@ -307,6 +308,8 @@ public class PolicyEnforcer extends FlowTable {
             abl = act.updateAction(abl, new HashMap<String, Object>(), 0);
         }
 
+        Map<String, ParameterValue> paramsFromClassifier = new HashMap<>();
+        Set<ClassifierDefinitionId> classifiers = new HashSet<>();
         for (ClassifierRef cr : rule.getClassifierRef()) {
             if (cr.getDirection() != null &&
                     !cr.getDirection().equals(Direction.Bidirectional) &&
@@ -314,45 +317,10 @@ public class PolicyEnforcer extends FlowTable {
                 continue;
             }
 
-            StringBuilder idb = new StringBuilder();
             // XXX - TODO - implement connection tracking (requires openflow
             // extension and data plane support - in 2.4. Will need to handle
             // case where we are working with mix of nodes.
 
-            MatchBuilder baseMatch = new MatchBuilder();
-
-            if (direction.equals(Direction.In)) {
-                idb.append(cgPair.sepg)
-                        .append("|")
-                        .append(cgPair.scgId)
-                        .append("|")
-                        .append(cgPair.depg)
-                        .append("|")
-                        .append(cgPair.dcgId)
-                        .append("|")
-                        .append(priority);
-                addNxRegMatch(baseMatch,
-                        RegMatch.of(NxmNxReg0.class, Long.valueOf(cgPair.sepg)),
-                        RegMatch.of(NxmNxReg1.class, Long.valueOf(cgPair.scgId)),
-                        RegMatch.of(NxmNxReg2.class, Long.valueOf(cgPair.depg)),
-                        RegMatch.of(NxmNxReg3.class, Long.valueOf(cgPair.dcgId)));
-            } else {
-                idb.append(cgPair.depg)
-                        .append("|")
-                        .append(cgPair.dcgId)
-                        .append("|")
-                        .append(cgPair.sepg)
-                        .append("|")
-                        .append(cgPair.scgId)
-                        .append("|")
-                        .append(priority);
-                addNxRegMatch(baseMatch,
-                        RegMatch.of(NxmNxReg0.class, Long.valueOf(cgPair.depg)),
-                        RegMatch.of(NxmNxReg1.class, Long.valueOf(cgPair.dcgId)),
-                        RegMatch.of(NxmNxReg2.class, Long.valueOf(cgPair.sepg)),
-                        RegMatch.of(NxmNxReg3.class, Long.valueOf(cgPair.scgId)));
-            }
-
             ClassifierInstance ci = contractTenant.getClassifier(cr.getName());
             if (ci == null) {
                 // XXX TODO fail the match and raise an exception
@@ -368,24 +336,67 @@ public class PolicyEnforcer extends FlowTable {
                         ci.getClassifierDefinitionId().getValue());
                 return;
             }
-
-            Map<String,ParameterValue> params = new HashMap<>();
+            classifiers.add(new ClassifierDefinitionId(ci.getClassifierDefinitionId()));
             for (ParameterValue v : ci.getParameterValue()) {
 
                 if (v.getIntValue() != null) {
-                    params.put(v.getName().getValue(), v);
+                    paramsFromClassifier.put(v.getName().getValue(), v);
                 } else if (v.getStringValue() != null) {
-                    params.put(v.getName().getValue(), v);
+                    paramsFromClassifier.put(v.getName().getValue(), v);
                 } else if (v.getRangeValue() != null) {
-                    params.put(v.getName().getValue(), v);
+                    paramsFromClassifier.put(v.getName().getValue(), v);
                 }
             }
-            List<Map<String, ParameterValue>> derivedParams = ParamDerivator.ETHER_TYPE_DERIVATOR.deriveParameter(params);
-            for (Map<String, ParameterValue> flowParams : derivedParams) {
-                List<MatchBuilder> matches = Collections.singletonList(new MatchBuilder(baseMatch.build()));
-                ClassificationResult result = cfier.updateMatch(matches, flowParams);
-                if(!result.isSuccessfull()) {
-                    //TODO consider different handling.
+        }
+        List<Map<String, ParameterValue>> derivedParamsByName = ParamDerivator.ETHER_TYPE_DERIVATOR.deriveParameter(paramsFromClassifier);
+
+        for (Map<String, ParameterValue> params : derivedParamsByName) {
+            for (ClassifierDefinitionId clDefId : classifiers) {
+                Classifier classifier = SubjectFeatures.getClassifier(clDefId);
+                StringBuilder idb = new StringBuilder();
+                // XXX - TODO - implement connection tracking (requires openflow
+                // extension and data plane support - in 2.4. Will need to handle
+                // case where we are working with mix of nodes.
+
+                MatchBuilder baseMatch = new MatchBuilder();
+                if (direction.equals(Direction.In)) {
+                    idb.append(cgPair.sepg)
+                            .append("|")
+                            .append(cgPair.scgId)
+                            .append("|")
+                            .append(cgPair.depg)
+                            .append("|")
+                            .append(cgPair.dcgId)
+                            .append("|")
+                            .append(priority);
+                    addNxRegMatch(baseMatch,
+                            RegMatch.of(NxmNxReg0.class, Long.valueOf(cgPair.sepg)),
+                            RegMatch.of(NxmNxReg1.class, Long.valueOf(cgPair.scgId)),
+                            RegMatch.of(NxmNxReg2.class, Long.valueOf(cgPair.depg)),
+                            RegMatch.of(NxmNxReg3.class, Long.valueOf(cgPair.dcgId)));
+                } else {
+                    idb.append(cgPair.depg)
+                            .append("|")
+                            .append(cgPair.dcgId)
+                            .append("|")
+                            .append(cgPair.sepg)
+                            .append("|")
+                            .append(cgPair.scgId)
+                            .append("|")
+                            .append(priority);
+                    addNxRegMatch(baseMatch,
+                            RegMatch.of(NxmNxReg0.class, Long.valueOf(cgPair.depg)),
+                            RegMatch.of(NxmNxReg1.class, Long.valueOf(cgPair.dcgId)),
+                            RegMatch.of(NxmNxReg2.class, Long.valueOf(cgPair.sepg)),
+                            RegMatch.of(NxmNxReg3.class, Long.valueOf(cgPair.scgId)));
+                }
+
+                List<MatchBuilder> matches = new ArrayList<>();
+                matches.add(baseMatch);
+
+                ClassificationResult result = classifier.updateMatch(matches, params);
+                if (!result.isSuccessfull()) {
+                    // TODO consider different handling.
                     throw new IllegalArgumentException(result.getErrorMessage());
                 }
                 String baseId = idb.toString();
@@ -398,8 +409,6 @@ public class PolicyEnforcer extends FlowTable {
                         .setPriority(Integer.valueOf(priority))
                         .setInstructions(instructions(applyActionIns(abl)));
                 flowMap.writeFlow(nodeId, TABLE_ID, flow.build());
-
-
                 }
             }
         }
index 3532deba6e767710b108de660c135e457f8a8d61..5f1fab8aa8d0aff8cff17790da8b8262b7af1499 100755 (executable)
@@ -29,6 +29,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfigBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;\r
@@ -256,7 +257,8 @@ public class DestinationMapperTest extends FlowTableTest {
         endpointManager.addEndpoint(remoteEp);\r
         addSwitches();\r
 \r
-        policyResolver.addTenant(baseTenant().build());\r
+        policyResolver.addTenant(baseTenant().setContract(\r
+                ImmutableList.<Contract>of(baseContract(null).build())).build());\r
         verifyDMap(remoteEp, localEp);\r
     }\r
 \r
@@ -270,7 +272,8 @@ public class DestinationMapperTest extends FlowTableTest {
         endpointManager.addEndpoint(remoteEp);\r
         addSwitches();\r
 \r
-        policyResolver.addTenant(baseTenant().build());\r
+        policyResolver.addTenant(baseTenant().setContract(\r
+                ImmutableList.<Contract>of(baseContract(null).build())).build());\r
         verifyDMap(remoteEp, localEp);\r
     }\r
 \r
index b804402b5beb05aac81648fc7013658b602c9d31..fc088f002b75f2b639eb07c81c5dac9bd69770cf 100755 (executable)
@@ -23,11 +23,13 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfigBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
 import com.google.common.base.Objects;\r
+import com.google.common.collect.ImmutableList;\r
 \r
 public class GroupTableTest extends OfTableTest {\r
     protected static final Logger LOG =\r
@@ -64,7 +66,8 @@ public class GroupTableTest extends OfTableTest {
                                     .setTunnelIp(new IpAddress(new Ipv4Address("1.2.3.5")))\r
                                     .build());\r
 \r
-        policyResolver.addTenant(baseTenant().build());\r
+        policyResolver.addTenant(baseTenant().setContract(\r
+                ImmutableList.<Contract>of(baseContract(null).build())).build());\r
 \r
         HashMap<GroupId, GroupCtx> groupMap = new HashMap<>();\r
         table.sync(nodeId, ctx.getPolicyResolver().getCurrentPolicy(), groupMap);\r
index cdb57794ce041645080aa8b8e149f47ba809d814..7e19881d1341ce50602337c7450406c2174c2c9e 100755 (executable)
@@ -8,11 +8,16 @@
 \r
 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow;\r
 \r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.MockEndpointManager;\r
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.MockPolicyManager;\r
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.MockSwitchManager;\r
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext;\r
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.AllowAction;\r
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.Classifier;\r
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.sf.L4Classifier;\r
 import org.opendaylight.groupbasedpolicy.resolver.MockPolicyResolver;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;\r
@@ -38,6 +43,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRefBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRef;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRefBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder;\r
@@ -49,7 +55,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubjectFeatureInstancesBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.SubnetBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.ClauseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Subject;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.SubjectBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.Rule;\r
 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.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelectorBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelectorBuilder;\r
@@ -101,10 +109,6 @@ public class OfTableTest {
     }\r
 \r
     protected TenantBuilder baseTenant() {\r
-        return baseTenant(null);\r
-    }\r
-\r
-    protected TenantBuilder baseTenant(Direction direction) {\r
         return new TenantBuilder()\r
             .setId(tid)\r
             .setEndpointGroup(ImmutableList.of(new EndpointGroupBuilder()\r
@@ -154,7 +158,7 @@ public class OfTableTest {
                     .build()))\r
             .setSubjectFeatureInstances(new SubjectFeatureInstancesBuilder()\r
                 .setClassifierInstance(ImmutableList.of(new ClassifierInstanceBuilder()\r
-                     .setName(new ClassifierName("tcp_80"))\r
+                     .setName(new ClassifierName("tcp_dst_80"))\r
                      .setClassifierDefinitionId(L4Classifier.DEFINITION.getId())\r
                      .setParameterValue(ImmutableList.of(new ParameterValueBuilder()\r
                               .setName(new ParameterName("destport"))\r
@@ -164,20 +168,49 @@ public class OfTableTest {
                              .setName(new ParameterName("proto"))\r
                              .setIntValue(Long.valueOf(6))\r
                              .build()))\r
+                     .build(),\r
+                     new ClassifierInstanceBuilder()\r
+                     .setName(new ClassifierName("tcp_src_80"))\r
+                     .setClassifierDefinitionId(Classifier.L4_CL.getId())\r
+                     .setParameterValue(ImmutableList.of(new ParameterValueBuilder()\r
+                              .setName(new ParameterName("sourceport"))\r
+                              .setIntValue(Long.valueOf(80))\r
+                              .build(),\r
+                          new ParameterValueBuilder()\r
+                             .setName(new ParameterName("proto"))\r
+                             .setIntValue(Long.valueOf(6))\r
+                             .build()))\r
+                     .build(),\r
+                     new ClassifierInstanceBuilder()\r
+                     .setName(new ClassifierName("ether_type"))\r
+                     .setClassifierDefinitionId(Classifier.ETHER_TYPE_CL.getId())\r
+                     .setParameterValue(ImmutableList.of(new ParameterValueBuilder()\r
+                              .setName(new ParameterName("ethertype"))\r
+                              .setIntValue(Long.valueOf(FlowUtils.IPv4))\r
+                              .build()))\r
                      .build()))\r
                 .setActionInstance(ImmutableList.of(new ActionInstanceBuilder()\r
                     .setName(new ActionName("allow"))\r
                     .setActionDefinitionId(new AllowAction().getId())\r
                     .build()))\r
-                .build())\r
-            .setContract(ImmutableList.of(new ContractBuilder()\r
-                .setId(cid)\r
-                .setSubject(ImmutableList.of(baseSubject(direction).build()))\r
-                .setClause(ImmutableList.of(new ClauseBuilder()\r
-                     .setName(new ClauseName("test"))\r
-                     .setSubjectRefs(ImmutableList.of(new SubjectName("s1")))\r
-                     .build()))\r
+                .build());\r
+    }\r
+\r
+    protected ContractBuilder baseContract(List<Subject> subjects) {\r
+        ContractBuilder contractBuilder = new ContractBuilder().setId(cid).setSubject(subjects);\r
+        // TODO refactor\r
+        if (subjects == null) {\r
+            return contractBuilder.setClause(ImmutableList.of(new ClauseBuilder().setName(new ClauseName("test"))\r
+                .setSubjectRefs(ImmutableList.<SubjectName>of(new SubjectName("s1")))\r
                 .build()));\r
+        }\r
+        List<SubjectName> subjectNames = new ArrayList<>();\r
+        for (Subject subject : subjects) {\r
+            subjectNames.add(subject.getName());\r
+        }\r
+        return contractBuilder.setClause(ImmutableList.of(new ClauseBuilder().setName(new ClauseName("test"))\r
+            .setSubjectRefs(subjectNames)\r
+            .build()));\r
     }\r
 \r
     protected SubjectBuilder baseSubject(Direction direction) {\r
@@ -188,12 +221,27 @@ public class OfTableTest {
                     .setName(new ActionName("allow"))\r
                     .build()))\r
                 .setClassifierRef(ImmutableList.of(new ClassifierRefBuilder()\r
-                    .setName(new ClassifierName("tcp_80"))\r
+                    .setName(new ClassifierName("tcp_dst_80"))\r
                     .setDirection(direction)\r
                     .build()))\r
                 .build()));\r
     }\r
 \r
+\r
+    protected Subject createSubject(String name, List<Rule> rules){\r
+        return new SubjectBuilder().setName(new SubjectName(name)).setRule(rules).build();\r
+    }\r
+\r
+    protected List<ClassifierRef> createClassifierRefs(Map<String, Direction> refNamesAndDirections) {\r
+        List<ClassifierRef> refs = new ArrayList<>();\r
+        for (String refName : refNamesAndDirections.keySet()) {\r
+            refs.add(new ClassifierRefBuilder().setName(new ClassifierName(refName))\r
+                .setDirection(refNamesAndDirections.get(refName))\r
+                .build());\r
+        }\r
+        return refs;\r
+    }\r
+\r
     protected EndpointBuilder baseEP() {\r
         return new EndpointBuilder()\r
             .setL2Context(bd)\r
index deea207f42846015449dd1408b67de699c9368a3..70e373677f02eb3e3018318e85014ba551f14dca 100755 (executable)
@@ -25,6 +25,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 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.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
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionMatcherName;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;\r
@@ -33,16 +34,22 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfigBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Matcher.MatchType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRefBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcherBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.Condition;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.ConditionBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.ContractBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.ClauseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Subject;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.ConsumerMatchersBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.ProviderMatchersBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.Rule;\r
+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
@@ -53,6 +60,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;\r
 \r
 import com.google.common.collect.ImmutableList;\r
+import com.google.common.collect.ImmutableMap;\r
 \r
 import static org.junit.Assert.*;\r
 import static org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.*;\r
@@ -88,7 +96,8 @@ public class PolicyEnforcerTest extends FlowTableTest {
             .setMacAddress(new MacAddress("00:00:00:00:00:02"))\r
             .build();\r
         endpointManager.addEndpoint(ep2);\r
-        policyResolver.addTenant(baseTenant().build());\r
+        policyResolver.addTenant(baseTenant().setContract(\r
+                ImmutableList.<Contract>of(baseContract(null).build())).build());\r
 \r
         FlowMap fm = dosync(null);\r
         assertNotEquals(0, fm.getTableForNode(nodeId, (short) 3).getFlow().size());\r
@@ -107,13 +116,41 @@ public class PolicyEnforcerTest extends FlowTableTest {
 \r
     @Test\r
     public void testDifferentEg() throws Exception {\r
-        doTestDifferentEg(null);\r
-        doTestDifferentEg(Direction.Bidirectional);\r
-        doTestDifferentEg(Direction.In);\r
-        doTestDifferentEg(Direction.Out);\r
+        assertEquals(7, doTestDifferentEg(ImmutableList.<Subject>of(baseSubject(null).build())));\r
+        assertEquals(7, doTestDifferentEg(ImmutableList.<Subject>of(baseSubject(Direction.Bidirectional).build())));\r
+        assertEquals(5, doTestDifferentEg(ImmutableList.<Subject>of(baseSubject(Direction.In).build())));\r
+        assertEquals(5, doTestDifferentEg(ImmutableList.<Subject>of(baseSubject(Direction.Out).build())));\r
     }\r
 \r
-    public void doTestDifferentEg(Direction direction) throws Exception {\r
+    @Test\r
+    public void doTestRule() throws Exception {\r
+        Rule rule1 = new RuleBuilder().setActionRef(\r
+                ImmutableList.of(new ActionRefBuilder().setName(new ActionName("allow")).build()))\r
+            .setClassifierRef(\r
+                    createClassifierRefs(ImmutableMap.<String, Direction>of("tcp_dst_80", Direction.In, "tcp_src_80",\r
+                            Direction.In)))\r
+            .build();\r
+        Rule rule2 = new RuleBuilder().setActionRef(\r
+                ImmutableList.of(new ActionRefBuilder().setName(new ActionName("allow")).build()))\r
+            .setClassifierRef(\r
+                    createClassifierRefs(ImmutableMap.<String, Direction>of("tcp_dst_80", Direction.In, "tcp_src_80",\r
+                            Direction.Out)))\r
+            .build();\r
+        Rule rule3 = new RuleBuilder().setActionRef(\r
+                ImmutableList.of(new ActionRefBuilder().setName(new ActionName("allow")).build()))\r
+            .setClassifierRef(\r
+                    createClassifierRefs(ImmutableMap.<String, Direction>of("tcp_dst_80", Direction.In, "tcp_src_80",\r
+                            Direction.Out, "ether_type", Direction.In)))\r
+            .build();\r
+        assertEquals(5,\r
+                doTestDifferentEg(ImmutableList.<Subject>of(createSubject("s1", ImmutableList.<Rule>of(rule1)))));\r
+        assertEquals(7,\r
+                doTestDifferentEg(ImmutableList.<Subject>of(createSubject("s2", ImmutableList.<Rule>of(rule2)))));\r
+        assertEquals(6,\r
+                doTestDifferentEg(ImmutableList.<Subject>of(createSubject("s3", ImmutableList.<Rule>of(rule3)))));\r
+    }\r
+\r
+    private int doTestDifferentEg(List<Subject> subjects) throws Exception {\r
         Endpoint ep1 = localEP().build();\r
         endpointManager.addEndpoint(ep1);\r
         Endpoint ep2 = localEP()\r
@@ -121,7 +158,8 @@ public class PolicyEnforcerTest extends FlowTableTest {
             .setEndpointGroup(eg2)\r
             .build();\r
         endpointManager.addEndpoint(ep2);\r
-        policyResolver.addTenant(baseTenant(direction).build());\r
+        policyResolver.addTenant(baseTenant().setContract(\r
+                ImmutableList.<Contract>of(baseContract(subjects).build())).build());\r
 \r
         FlowMap fm = dosync(null);\r
         assertNotEquals(0, fm.getTableForNode(nodeId, (short) 3).getFlow().size());\r
@@ -144,9 +182,16 @@ public class PolicyEnforcerTest extends FlowTableTest {
                        f.getMatch().getIpMatch() != null &&\r
                        Objects.equals(Short.valueOf((short)6),\r
                                       f.getMatch().getIpMatch().getIpProtocol()) &&\r
-                       Objects.equals(Integer.valueOf(80),\r
-                                      ((TcpMatch)f.getMatch().getLayer4Match())\r
-                                          .getTcpDestinationPort().getValue())) {\r
+                       f.getMatch().getLayer4Match() != null &&\r
+                       (\r
+                        Objects.equals(new PortNumber(Integer.valueOf(80)),\r
+                               ((TcpMatch)f.getMatch().getLayer4Match())\r
+                                .getTcpSourcePort())\r
+                                ||\r
+                        Objects.equals(new PortNumber(Integer.valueOf(80)),\r
+                               ((TcpMatch)f.getMatch().getLayer4Match())\r
+                                .getTcpDestinationPort())\r
+                        )) {\r
                 count += 1;\r
             } else if (f.getMatch() != null &&\r
                        f.getMatch().getEthernetMatch() != null &&\r
@@ -156,19 +201,20 @@ public class PolicyEnforcerTest extends FlowTableTest {
                        f.getMatch().getIpMatch() != null &&\r
                        Objects.equals(Short.valueOf((short)6),\r
                                       f.getMatch().getIpMatch().getIpProtocol()) &&\r
-                       Objects.equals(Integer.valueOf(80),\r
-                                      ((TcpMatch)f.getMatch().getLayer4Match())\r
-                                          .getTcpDestinationPort().getValue())) {\r
+                       f.getMatch().getLayer4Match() != null &&\r
+                        (\r
+                        Objects.equals(new PortNumber(Integer.valueOf(80)),\r
+                                ((TcpMatch)f.getMatch().getLayer4Match())\r
+                                .getTcpSourcePort())\r
+                                ||\r
+                        Objects.equals(new PortNumber(Integer.valueOf(80)),\r
+                                ((TcpMatch)f.getMatch().getLayer4Match())\r
+                                .getTcpDestinationPort())\r
+                        )) {\r
                 count += 1;\r
             } \r
         }\r
-        if (direction == null || direction.equals(Direction.Bidirectional))\r
-            assertEquals(7, count);\r
-        else\r
-            assertEquals(5, count);\r
-        int numberOfFlows = fm.getTableForNode(nodeId, (short) 3).getFlow().size();\r
-        fm = dosync(flowMap);\r
-        assertEquals(numberOfFlows, fm.getTableForNode(nodeId, (short) 3).getFlow().size());\r
+        return count;\r
     }\r
 \r
     @Test\r
index a1558aa61897c78970781ca541bafa092f82968c..772071fc976b3469932d4607a9a149e0553c3cd4 100755 (executable)
@@ -34,6 +34,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev14
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
 \r
+import com.google.common.collect.ImmutableList;\r
+\r
 import static org.junit.Assert.*;\r
 \r
 public class SourceMapperTest extends FlowTableTest {\r