Add some unit tests for conditions
[groupbasedpolicy.git] / groupbasedpolicy / src / test / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / flow / PolicyEnforcerTest.java
index cb4e264346864ec3c9431e3edb4d2af57bce434b..d85ecc76a7d0116b0637dec20d410d54dd48a759 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow;
 
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Objects;
 
 import org.junit.Before;
@@ -19,20 +20,45 @@ import org.mockito.Matchers;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowTable.FlowCtx;
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.FlowUtils.RegMatch;
+import org.opendaylight.groupbasedpolicy.resolver.ConditionGroup;
+import org.opendaylight.groupbasedpolicy.resolver.EgKey;
+import org.opendaylight.groupbasedpolicy.resolver.PolicyInfo;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClauseName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionMatcherName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfigBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.HasDirection.Direction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Matcher.MatchType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.Condition;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.conditions.ConditionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.TenantBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.ContractBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.ClauseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.ConsumerMatchersBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.ProviderMatchersBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg2;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg3;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg7;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlow;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableList;
+
 import static org.junit.Assert.*;
 
 import static org.mockito.Matchers.*;
@@ -57,7 +83,6 @@ public class PolicyEnforcerTest extends FlowTableTest {
                                     .setTunnelIp(new IpAddress(new Ipv4Address("1.2.3.4")))
                                     .build());
     }
-    
 
     @Test
     public void testNoEps() throws Exception {
@@ -170,6 +195,108 @@ public class PolicyEnforcerTest extends FlowTableTest {
 
     @Test
     public void testConditions() throws Exception {
-        // XXX TODO
+        Condition cond1 = new ConditionBuilder()
+            .setName(new ConditionName("cond1"))
+            .build();
+        Condition cond2 = new ConditionBuilder()
+            .setName(new ConditionName("cond2"))
+            .build();
+
+        Endpoint ep1 = localEP()
+            .setCondition(ImmutableList.of(cond1.getName()))
+            .build();
+        endpointManager.addEndpoint(ep1);
+        Endpoint ep2 = localEP()
+            .setMacAddress(new MacAddress("00:00:00:00:00:02"))
+            .setCondition(ImmutableList.of(cond1.getName(), cond2.getName()))
+            .setEndpointGroup(eg2)
+            .build();
+        endpointManager.addEndpoint(ep2);        
+        
+        TenantBuilder tb = baseTenant()
+            .setContract(ImmutableList.of(new ContractBuilder()
+                .setId(cid)
+                .setSubject(ImmutableList.of(baseSubject(Direction.Out).build()))
+                .setClause(ImmutableList.of(new ClauseBuilder()
+                    .setName(new ClauseName("test"))
+                    .setSubjectRefs(ImmutableList.of(new SubjectName("s1")))
+                    .setConsumerMatchers(new ConsumerMatchersBuilder()
+                        .setConditionMatcher(ImmutableList.of(new ConditionMatcherBuilder()
+                            .setName(new ConditionMatcherName("m1"))
+                            .setCondition(ImmutableList.of(cond1, cond2))
+                            .setMatchType(MatchType.Any)
+                            .build()))
+                        .build())
+                    .setProviderMatchers(new ProviderMatchersBuilder()
+                        .setConditionMatcher(ImmutableList.of(new ConditionMatcherBuilder()
+                            .setName(new ConditionMatcherName("m2"))
+                            .setCondition(ImmutableList.of(cond1, cond2))
+                            .setMatchType(MatchType.All)
+                            .build()))
+                        .build())
+                    .build()))
+                .build()));
+        policyResolver.addTenant(tb.build());
+
+        PolicyInfo policy = policyResolver.getCurrentPolicy();
+        List<ConditionName> ep1c = endpointManager.getCondsForEndpoint(ep1);
+        ConditionGroup cg1 = 
+                policy.getEgCondGroup(new EgKey(tb.getId(), 
+                                                ep1.getEndpointGroup()),
+                                      ep1c);
+        List<ConditionName> ep2c = endpointManager.getCondsForEndpoint(ep2);
+        ConditionGroup cg2 = 
+                policy.getEgCondGroup(new EgKey(tb.getId(), 
+                                                ep2.getEndpointGroup()),
+                                      ep2c);
+        int cg1Id = policyManager.getCondGroupOrdinal(cg1);
+        int cg2Id = policyManager.getCondGroupOrdinal(cg2);
+        int eg1Id = policyManager.getContextOrdinal(ep1.getTenant(),
+                                                    ep1.getEndpointGroup());
+        int eg2Id = policyManager.getContextOrdinal(ep1.getTenant(),
+                                                    ep2.getEndpointGroup());
+
+        assertNotEquals(cg1Id, cg2Id);
+
+        MatchBuilder mb = new MatchBuilder();
+        FlowUtils.addNxRegMatch(mb, 
+                                RegMatch.of(NxmNxReg0.class, Long.valueOf(eg1Id)),
+                                RegMatch.of(NxmNxReg1.class, Long.valueOf(cg1Id)),
+                                RegMatch.of(NxmNxReg2.class, Long.valueOf(eg2Id)),
+                                RegMatch.of(NxmNxReg3.class, Long.valueOf(cg2Id)));
+        GeneralAugMatchNodesNodeTableFlow m1 =
+                mb.getAugmentation(GeneralAugMatchNodesNodeTableFlow.class);
+        FlowUtils.addNxRegMatch(mb, 
+                                RegMatch.of(NxmNxReg0.class, Long.valueOf(eg2Id)),
+                                RegMatch.of(NxmNxReg1.class, Long.valueOf(cg2Id)),
+                                RegMatch.of(NxmNxReg2.class, Long.valueOf(eg1Id)),
+                                RegMatch.of(NxmNxReg3.class, Long.valueOf(cg1Id)));
+        GeneralAugMatchNodesNodeTableFlow m2 =
+                mb.getAugmentation(GeneralAugMatchNodesNodeTableFlow.class);
+
+        ReadWriteTransaction t = dosync(null);
+        ArgumentCaptor<Flow> ac = ArgumentCaptor.forClass(Flow.class);
+        verify(t, atLeastOnce()).put(eq(LogicalDatastoreType.CONFIGURATION), 
+                                     Matchers.<InstanceIdentifier<Flow>>any(),
+                                     ac.capture(), anyBoolean());
+        int count = 0;
+        HashMap<String, FlowCtx> flowMap = new HashMap<>();
+        for (Flow f : ac.getAllValues()) {
+            flowMap.put(f.getId().getValue(), new FlowCtx(f));
+            if (f.getMatch() != null &&
+                f.getMatch().getEthernetMatch() != null) {
+                GeneralAugMatchNodesNodeTableFlow fm =
+                        f.getMatch().getAugmentation(GeneralAugMatchNodesNodeTableFlow.class);
+                assertTrue(Objects.equals(fm, m1) ||
+                           Objects.equals(fm, m2));
+                count += 1;
+            }
+        }
+        assertEquals(2, count);
+
+        t = dosync(flowMap);
+        verify(t, never()).put(any(LogicalDatastoreType.class), 
+                               Matchers.<InstanceIdentifier<Flow>>any(), 
+                               any(Flow.class), anyBoolean());
     }
 }