Implemented matching against all the classifiers within a rule.
Signed-off-by: Tomas Cechvala <tcechval@cisco.com>
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;
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) &&
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
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();
.setPriority(Integer.valueOf(priority))
.setInstructions(instructions(applyActionIns(abl)));
flowMap.writeFlow(nodeId, TABLE_ID, flow.build());
-
-
}
}
}
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
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
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
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
.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
\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
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
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
}\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
.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
.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
.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
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
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
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
.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
\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
.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
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
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
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