Modified model to support L3Prefix EP, GIC, EIC, ECC and EIG 91/17391/11
authorKeith Burns (alagalah) <alagalah@gmail.com>
Sun, 29 Mar 2015 19:18:54 +0000 (12:18 -0700)
committerKeith Burns (alagalah) <alagalah@gmail.com>
Thu, 2 Apr 2015 15:34:05 +0000 (08:34 -0700)
policy.yang:
Added GroupIdentificationConstraints:
- added role "any" for matcher
- added case GroupNameConstraint
- added case for provider|consumer matcher
Added EndpointIdentificationConstraints
- added l3-prefix ip-prefix type constraint
Added ExternalImplicitGroup

endpoint.yang:
Added L3-prefix list.

Other files refactored.

Change-Id: I572d0208ca88f7182a33e41f4ddedcd46ec3015d
Signed-off-by: Keith Burns (alagalah) <alagalah@gmail.com>
14 files changed:
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/endpoint/EndpointRpcRegistry.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/endpoint/EpRendererAugmentation.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/InheritanceUtils.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/MatcherUtils.java
groupbasedpolicy/src/main/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolver.java
groupbasedpolicy/src/main/yang/model/common.yang
groupbasedpolicy/src/main/yang/model/endpoint.yang
groupbasedpolicy/src/main/yang/model/policy.yang
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/InheritanceUtilsTest.java
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/MatcherUtilsTest.java
groupbasedpolicy/src/test/java/org/opendaylight/groupbasedpolicy/resolver/PolicyResolverTest.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/EndpointManager.java
renderers/ofoverlay/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ofoverlay/OFOverlayRenderer.java
renderers/opflex/src/main/java/org/opendaylight/groupbasedpolicy/renderer/opflex/EndpointManager.java

index d7f81454803129d562cc0cb22cec3a990d6b5f17..7e5097518ab17e32d9e542de536c6cd6ff7b801f 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.Endpoints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterL3PrefixEndpointInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.SetEndpointGroupConditionsInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.UnregisterEndpointInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.UnsetEndpointGroupConditionsInput;
@@ -36,11 +37,15 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Key;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Prefix;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3PrefixBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3PrefixKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.has.endpoint.group.conditions.EndpointGroupCondition;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.has.endpoint.group.conditions.EndpointGroupConditionKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.unregister.endpoint.input.L2;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.unregister.endpoint.input.L3;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.slf4j.Logger;
@@ -220,11 +225,31 @@ public class EndpointRpcRegistry implements EndpointService {
         return eb;
     }
 
+    /**
+     * Construct an L3 endpoint with the appropriate augmentations from the 
+     * endpoint input.  Each concrete implementation can provides its specifics earlier.
+     * @param input the input object
+     */
+    private EndpointL3PrefixBuilder buildL3PrefixEndpoint(RegisterL3PrefixEndpointInput input) {
+        EndpointL3PrefixBuilder eb = new EndpointL3PrefixBuilder(input);
+        for (Entry<String, EpRendererAugmentation> entry : registeredRenderers
+                .entrySet()) {
+            try {
+                entry.getValue().buildL3PrefixEndpointAugmentation(eb, input);
+            } catch (Throwable t) {
+                LOG.warn("L3 endpoint Augmentation error while processing "
+                        + entry.getKey() + ". Reason: ", t);
+            }
+        }
+        return eb;
+    }
+
     @Override
     public Future<RpcResult<Void>>
         registerEndpoint(RegisterEndpointInput input) {
         long timestamp = System.currentTimeMillis();
-        
+
+        //TODO: Replicate RPC feedback implemented in L3Prefix register for unmet requirements.
         WriteTransaction t = dataProvider.newWriteOnlyTransaction();
 
         if (input.getL2Context() != null &&
@@ -261,6 +286,44 @@ public class EndpointRpcRegistry implements EndpointService {
         return Futures.transform(r, futureTrans, executor);
     }
 
+    @Override
+    public Future<RpcResult<Void>> registerL3PrefixEndpoint(RegisterL3PrefixEndpointInput input) {
+
+        if (input.getL3Context() == null) {
+            return Futures.immediateFuture(RpcResultBuilder.<Void> failed()
+                    .withError(ErrorType.RPC, "L3 Prefix Endpoint must have L3Context.").build());
+        }
+        if (input.getIpPrefix() == null) {
+            return Futures.immediateFuture(RpcResultBuilder.<Void> failed()
+                    .withError(ErrorType.RPC, "L3 Prefix Endpoint must have ip-prefix.").build());
+        }
+
+        if (input.getTenant() == null) {
+            return Futures.immediateFuture(RpcResultBuilder.<Void> failed()
+                    .withError(ErrorType.RPC, "L3 Prefix Endpoint must have tenant.").build());
+        }
+
+
+        WriteTransaction t = dataProvider.newWriteOnlyTransaction();
+
+        long timestamp = System.currentTimeMillis();
+
+        //TODO: Convert IPPrefix into it's IPv4/IPv6 canonical form. 
+        // See org.apache.commons.net.util.SubnetUtils.SubnetInfo
+            
+        EndpointL3PrefixKey epL3PrefixKey = new EndpointL3PrefixKey(input.getIpPrefix(),input.getL3Context());
+            
+        EndpointL3Prefix epL3Prefix = buildL3PrefixEndpoint(input).setTimestamp(timestamp).build();
+        InstanceIdentifier<EndpointL3Prefix> iid_l3prefix = 
+                InstanceIdentifier.builder(Endpoints.class)
+                        .child(EndpointL3Prefix.class, epL3PrefixKey)
+                        .build();
+        t.put(LogicalDatastoreType.OPERATIONAL, iid_l3prefix, epL3Prefix);
+
+        ListenableFuture<Void> r = t.submit();
+        return Futures.transform(r, futureTrans, executor);    
+    }
+    
     @Override
     public Future<RpcResult<Void>>
         unregisterEndpoint(UnregisterEndpointInput input) {
@@ -288,6 +351,7 @@ public class EndpointRpcRegistry implements EndpointService {
                 t.delete(LogicalDatastoreType.OPERATIONAL, iid_l3);
             }
         }
+        //TODO: Implement L3Prefix
 
         ListenableFuture<Void> r = t.submit();
         return Futures.transform(r, futureTrans, executor);
@@ -347,4 +411,7 @@ public class EndpointRpcRegistry implements EndpointService {
             return RpcResultBuilder.<Void>success().build();
         }
     };
+
+
+
 }
index 05127354c384c4c421c8738f7602b745dbea8479..13faebb42199438e53f179a540c473b1a897afcc 100644 (file)
@@ -8,8 +8,10 @@
 package org.opendaylight.groupbasedpolicy.endpoint;
 
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterL3PrefixEndpointInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3PrefixBuilder;
 
 /**
  *
@@ -24,4 +26,7 @@ public interface EpRendererAugmentation {
     void buildEndpointL3Augmentation(EndpointL3Builder eb,
             RegisterEndpointInput input);
 
+    void buildL3PrefixEndpointAugmentation(EndpointL3PrefixBuilder eb,
+            RegisterL3PrefixEndpointInput input);
+
 }
index 2992edae7080592293590fa076ad181fbf24631e..281fb8cc65c3020e0a4193a9fae41a8a10fe9d44 100644 (file)
@@ -58,12 +58,17 @@ 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.clause.ConsumerMatchersBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.ProviderMatchers;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.ProviderMatchersBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcherBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.requirement.matcher.MatcherRequirement;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcherBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.capability.matcher.MatcherCapability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.GroupIdentificationConstraints;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.GroupRequirementConstraintCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.GroupRequirementConstraintCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.requirement.matcher.MatcherRequirement;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.GroupCapabilityConstraintCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.GroupCapabilityConstraintCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.capability.matcher.MatcherCapability;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.Rule;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.RuleBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelector;
@@ -662,20 +667,26 @@ public class InheritanceUtils {
         HashSet<SubjectName> subjectRefs = new HashSet<>();
         HashSet<ContractId> visited = new HashSet<>();
 
+        //TODO: Add GIC choices GroupNameConstraint and GroupAny
+       //TODO: Add EIC (ie L3Prefix) constraint.
+
         resolveClauseAttr(unresolvedTenant, unresolvedContract, 
                           unresolvedClause.getName(), subjectRefs, 
                           capMatchers, provCondMatchers,
                           reqMatchers, consCondMatchers, visited);
         
+
         Clause resolved = new ClauseBuilder()
             .setName(unresolvedClause.getName())
             .setSubjectRefs(ImmutableList.copyOf(subjectRefs))
             .setProviderMatchers(new ProviderMatchersBuilder()
-                .setCapabilityMatcher(ImmutableList.copyOf(capMatchers.values()))
+                .setGroupIdentificationConstraints(new GroupCapabilityConstraintCaseBuilder()
+                .setCapabilityMatcher(ImmutableList.copyOf(capMatchers.values())).build())
                 .setConditionMatcher(ImmutableList.copyOf(provCondMatchers.values()))
                 .build())
             .setConsumerMatchers(new ConsumerMatchersBuilder()
-                .setRequirementMatcher(ImmutableList.copyOf(reqMatchers.values()))
+                .setGroupIdentificationConstraints(new GroupRequirementConstraintCaseBuilder()
+                .setRequirementMatcher(ImmutableList.copyOf(reqMatchers.values())).build())               
                 .setConditionMatcher(ImmutableList.copyOf(consCondMatchers.values()))
                 .build())
             .build();
@@ -716,13 +727,21 @@ public class InheritanceUtils {
         
         if (unresolvedClause.getProviderMatchers() != null) {
             ProviderMatchers pms = unresolvedClause.getProviderMatchers();
-            resolveCapabilityMatcher(pms.getCapabilityMatcher(), capMatchers);
+            org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.GroupIdentificationConstraints groupIdentificationConstraintsProvider = pms.getGroupIdentificationConstraints();
+            if (groupIdentificationConstraintsProvider instanceof GroupCapabilityConstraintCase) {
+                resolveCapabilityMatcher(((GroupCapabilityConstraintCase)groupIdentificationConstraintsProvider).getCapabilityMatcher(), capMatchers);
+            }
             resolveConditionMatcher(pms.getConditionMatcher(), provCondMatchers);
         }
+
         if (unresolvedClause.getConsumerMatchers() != null) {
             ConsumerMatchers cms = unresolvedClause.getConsumerMatchers();
-            resolveRequirementMatcher(cms.getRequirementMatcher(), reqMatchers);
+            GroupIdentificationConstraints groupIdentificiationConstrainsConsumer = cms.getGroupIdentificationConstraints();
+            if (groupIdentificiationConstrainsConsumer instanceof GroupRequirementConstraintCase) {
+                resolveRequirementMatcher(((GroupRequirementConstraintCase) groupIdentificiationConstrainsConsumer).getRequirementMatcher(), reqMatchers);
+            }
             resolveConditionMatcher(cms.getConditionMatcher(), consCondMatchers);
+
         }
         if (unresolvedClause.getSubjectRefs() != null)
             subjectRefs.addAll(unresolvedClause.getSubjectRefs());
index 4a8a0b8a1279a93e8df8701425f46c9bbf76c914..64c50f1372caee516d10072436c6487589d2f0c9 100644 (file)
@@ -36,10 +36,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcher;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.quality.matcher.MatcherQuality;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Target;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.requirement.matcher.MatcherRequirement;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.capability.matcher.MatcherCapability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.requirement.matcher.MatcherRequirement;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.capability.matcher.MatcherCapability;
 
 /**
  * Utilities related to matchers and labels
index 2426fcf7e054d0004d76697e2ef5d05abf8d7d50..4b2e0f7110143e2ead890c2e98cb56b2872c70ed 100644 (file)
@@ -50,8 +50,11 @@ 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.Clause;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Subject;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Target;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.GroupIdentificationConstraints;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.GroupRequirementConstraintCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.GroupCapabilityConstraintCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcher;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.Rule;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.RuleBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelector;
@@ -440,25 +443,34 @@ public class PolicyResolver implements AutoCloseable {
 
     private boolean clauseMatches(Clause clause, ContractMatch match) {
         if (clause.getConsumerMatchers() != null) {
-            List<RequirementMatcher> reqMatchers =
-                    clause.getConsumerMatchers().getRequirementMatcher();
-            if (reqMatchers != null) {
-                for (RequirementMatcher reqMatcher : reqMatchers) {
-                    if (!MatcherUtils.applyReqMatcher(reqMatcher,
-                                                      match.consumerRelator)) {
-                        return false;
+            GroupIdentificationConstraints groupIdentificationConstraintsConsumer = clause.getConsumerMatchers()
+                    .getGroupIdentificationConstraints();
+            if (groupIdentificationConstraintsConsumer instanceof GroupRequirementConstraintCase) {
+                List<RequirementMatcher> reqMatchers = ((GroupRequirementConstraintCase) groupIdentificationConstraintsConsumer)
+                        .getRequirementMatcher();
+                if (reqMatchers != null) {
+                    for (RequirementMatcher reqMatcher : reqMatchers) {
+                        if (!MatcherUtils.applyReqMatcher(reqMatcher,
+                                match.consumerRelator)) {
+                            return false;
+                        }
                     }
                 }
             }
         }
         if (clause.getProviderMatchers() != null) {
-            List<CapabilityMatcher> capMatchers =
-                    clause.getProviderMatchers().getCapabilityMatcher();
-            if (capMatchers != null) {
-                for (CapabilityMatcher capMatcher : capMatchers) {
-                    if (!MatcherUtils.applyCapMatcher(capMatcher,
-                                                      match.providerRelator)) {
-                        return false;
+            org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.GroupIdentificationConstraints groupIdentificationConstraintsProvider = clause
+                    .getProviderMatchers().getGroupIdentificationConstraints();
+            if (groupIdentificationConstraintsProvider instanceof GroupCapabilityConstraintCase) {
+                List<CapabilityMatcher> capMatchers = ((GroupCapabilityConstraintCase) groupIdentificationConstraintsProvider)
+                        .getCapabilityMatcher();
+
+                if (capMatchers != null) {
+                    for (CapabilityMatcher capMatcher : capMatchers) {
+                        if (!MatcherUtils.applyCapMatcher(capMatcher,
+                                match.providerRelator)) {
+                            return false;
+                        }
                     }
                 }
             }
index f7cfb2fd7e2d5f4d140e1af445cdc0f84ca95ca9..474ee33013e615b904049a3e6f16d98749bbed5a 100644 (file)
@@ -251,4 +251,4 @@ module gbp-common {
         type name;
         description "A name for a parameter.";
     }
-}
\ No newline at end of file
+}
index 28a643e34482d6cc6d5aeb7a868fd4bcadea5a4d..e4bae7280864c3b6286f3361aa427882b2d07c1c 100644 (file)
@@ -56,6 +56,23 @@ module endpoint {
         }
     }
 
+    grouping l3-prefix-key {
+        description 
+            "The fields that identify an endpoint by a layer 3 prefix";
+        leaf l3-context {
+            type gbp-common:l3-context-id;
+            mandatory true;
+            description 
+                "The context for this layer 3 prefix";
+        }
+        leaf ip-prefix {
+            type inet:ip-prefix;
+            mandatory true;
+            description 
+                "The IP prefix for the endpoint";
+        }
+    }
+
     // A base type for an end point
     grouping endpoint-fields {
         description "An endpoint and its associated metadata";
@@ -67,7 +84,13 @@ module endpoint {
         }
 
         uses l2-key;
-
+        
+        leaf network-containment {
+            description 
+                "The network domain associated with this endpoint's fowarding 
+                context.";
+            type gbp-common:network-domain-id;
+        }
         list l3-address {
             description
                 "All the layer 3 addresses associated with this endpoint";
@@ -79,15 +102,64 @@ module endpoint {
             description 
                 "The group associated with this endpoint";
         }
+        leaf-list endpoint-groups {
+            type gbp-common:endpoint-group-id;
+            description 
+                "The groups associated with this endpoint";
+            ordered-by user;
+        }
         leaf-list condition {
             type gbp-common:condition-name;
             description 
                 "The conditions associated with this endpoint";
         }
+        // This was a mistake and now it's an abomination.
         leaf port-name {
             type gbp-common:name;
             description 
                 "Port name";
+        } // end the abomination.
+        leaf timestamp {
+            type int64;
+            description
+                "The last timestamp associated with this endpoint record.  
+                 This will be used for aging data in the registry.";
+        }
+    }
+    
+    //  L3 Prefix EndPointFields
+    grouping endpoint-l3-prefix-fields {
+        description "An l3 prefix endpoint and its associated metadata";
+        uses l3-prefix-key;
+        leaf tenant {
+            type gbp-common:tenant-id;
+            mandatory true;
+            description 
+                "The tenant with which this endpoint is associated";
+        }
+        leaf endpoint-group {
+            type gbp-common:endpoint-group-id;
+            description 
+                "The group associated with this endpoint";
+        }
+        leaf-list endpoint-groups {
+            type gbp-common:endpoint-group-id;
+            description 
+                "The groups associated with this endpoint";
+            ordered-by user;
+        }
+        leaf-list condition {
+            type gbp-common:condition-name;
+            description 
+                "The conditions associated with this endpoint";
+        }
+        list endpoint-l2-gateways {
+            key "l2-context mac-address";
+            uses l2-key;
+        }
+        list endpoint-l3-gateways {
+            key "l3-context ip-address";
+            uses l3-key;
         }
         leaf timestamp {
             type int64;
@@ -138,13 +210,16 @@ module endpoint {
                 "Endpoints indexed by layer 3 addreses.  When modifying 
                  data here, you must also modify data in the endpoints
                  list as well.";
-
             key "l3-context ip-address";
             uses l3-key;
-
             uses endpoint-fields;
         }
 
+        list endpoint-l3-prefix {
+            key "l3-context ip-prefix";
+            uses endpoint-l3-prefix-fields;
+        }
+        
         list condition-mapping {
             description 
                 "A list mapping conditions to entire endpoint groups.
@@ -167,6 +242,17 @@ module endpoint {
         }
     }
 
+    rpc register-l3-prefix-endpoint {
+        description
+            "Register an L3 Prefix Endpoint to the endpoint registery. If there
+            is already an existing endpoint with the same keys, they
+            will be overwritten with the new information.";
+
+        input {
+            uses endpoint-l3-prefix-fields;
+        }
+    }
+
     rpc unregister-endpoint {
         description "Unregister an endpoint or endpoints from the registry.";
 
@@ -179,6 +265,10 @@ module endpoint {
                 key "l3-context ip-address";
                 uses l3-key;
             }
+            list l3-prefix {
+                key "l3-context ip-prefix";
+                uses l3-prefix-key;
+            }
         }
     }
 
index 5f3e864654b5519b06140cd8935f6bee36ea03d7..db093b65327b1da7d21e7037704cb45abca13fe3 100755 (executable)
@@ -992,6 +992,19 @@ module policy {
                 }
             }
 
+            list external-implicit-group {
+                description
+                    ".";
+
+                key "id";
+            
+                leaf id {
+                    mandatory true;
+                    type gbp-common:endpoint-group-id;
+                }
+                // Fields to be determined and completed before Code Freeze                
+
+            }
             // *************************
             // Subject feature instances
             // *************************
@@ -1161,14 +1174,12 @@ module policy {
                          requirements on the consumer endpoint group,
                          capabilities on the provider endpoint group, and
                          conditions on the individual endpoints in the
-                         endpoint group.";
-                
+                         endpoint group.";             
                     key "name";
                     leaf name {
                         type gbp-common:clause-name;
                         mandatory true;
-                    }
-                
+                    }               
                     // ********
                     // Matchers
                     // ********
@@ -1177,108 +1188,196 @@ module policy {
                         description 
                             "Matchers that apply to the consumer endpoint 
                              group.";
-                        list requirement-matcher {
-                            description 
-                                "Match against requirements in the consumer 
-                                 endpoint group.";
-                
-                            key "name";
-                            leaf name {
-                                description 
-                                    "A name for the requirement matcher";
-                                type gbp-common:requirement-matcher-name;
-                                mandatory true;
+                        
+                        // GIC mutually OR'd within role
+                        choice group-identification-constraints {
+                            description "Returns Groups which match, MUTALLY OR within role. Must be Either/Or";
+
+                            case group-name-constraint-case {                                
+                                list group-name-constraint {
+                                    key endpoint-group-name;
+                                    leaf endpoint-group-name {
+                                        type gbp-common:name;
+                                    }
+                                } 
                             }
-                
-                            uses matcher;
-                            list matcher-requirement {
-                                description 
-                                    "A matcher requirement is a 
-                                     requirement with a selector name
-                                     field used in requirement
-                                     matchers.  The name of the
-                                     matcher requirement matches
-                                     against requirements in endpoint
-                                     groups.";
-
-                                key name;
-                                uses requirement-base;
-
-                                leaf selector-namespace {
+                            case group-requirement-constraint-case {
+                                list requirement-matcher {
                                     description 
-                                        "The name of the selector to  
-                                         match.  This allows us to
-                                         specify that we want to match
-                                         only requirements scoped to a
-                                         particular selector name.
-
-                                         This parameter is optional;
-                                         if not specified, use an
-                                         inherited selector namespace
-                                         if it exists, or match
-                                         against any selector name.";
-                
-                                    type gbp-common:selector-name;
+                                        "Match against requirements in the consumer 
+                                         endpoint group.";
+                        
+                                    key "name";
+                                    leaf name {
+                                        description 
+                                            "A name for the requirement matcher";
+                                        type gbp-common:requirement-matcher-name;
+                                        mandatory true;
+                                    }
+                        
+                                    uses matcher;
+                                    list matcher-requirement {
+                                        description 
+                                            "A matcher requirement is a 
+                                             requirement with a selector name
+                                             field used in requirement
+                                             matchers.  The name of the
+                                             matcher requirement matches
+                                             against requirements in endpoint
+                                             groups.";
+
+                                        key name;
+                                        uses requirement-base;
+
+                                        leaf selector-namespace {
+                                            description 
+                                                "The name of the selector to  
+                                                 match.  This allows us to
+                                                 specify that we want to match
+                                                 only requirements scoped to a
+                                                 particular selector name.
+
+                                                 This parameter is optional;
+                                                 if not specified, use an
+                                                 inherited selector namespace
+                                                 if it exists, or match
+                                                 against any selector name.";
+                        
+                                            type gbp-common:selector-name;
+                                        }
+                                    }
+                                }
+                            }
+                            
+                            case group-any-case {
+                                container group-any {
+
+                                    description 
+                                        "A presence container stating that, if this exists,
+                                        the role matcher will match on any group.";
+                                    presence "This matches any group";
                                 }
                             }
                         }
+                        
+
+                        
                         uses has-condition-matchers;
+
+                        container endpoint-identification-constraints {
+                            description
+                                "Identify endpoints via other attributes other than conditions.
+                                These can be things such as ip-prefix, vlan, mpls label etc. These
+                                things are intended to be explicity stated, and should not contain 
+                                references to other objects like endpointsIDs.";
+                            container l3-endpoint-identification-constraints {
+                                list prefix-constraint {
+                                    key ip-prefix;
+                                    leaf ip-prefix {
+                                        type inet:ip-prefix;
+                                    }
+                                }
+                            }
+                        }
                     }
-                
+
                     container provider-matchers {
-                        description 
-                            "Matchers that apply to the provider endpoint 
+                        description
+                            "Matchers that apply to the provider endpoint
                              group";
-                
-                        list capability-matcher {
-                            description 
-                                "Match against capabilities in the provider  
-                                 endpoint group.";
-                
-                            key "name";
-                            leaf name {
-                                description 
-                                    "A name for the capability matcher";
-                                type gbp-common:capability-matcher-name;
-                                mandatory true;
+                                      
+                        // GIC mutually OR'd within role
+                        choice group-identification-constraints {
+                            description "Returns Groups which match, MUTALLY OR within role. Must be Either/Or";
+
+                            case group-name-constraint-case {
+                                list group-name-constraint {
+                                    key endpoint-group-name;
+                                    leaf endpoint-group-name {
+                                        type gbp-common:name;
+                                    }
+                                }
                             }
-                
-                            uses matcher;
-
-                            list matcher-capability {
-                                description 
-                                    "A matcher capability is a 
-                                     capability with a selector
-                                     name field used in capability
-                                     mat  chers.  The name of the
-                                     matcher capability matches
-                                     against capabilities in
-                                     endpoint groups.";
-
-                                key name;
-                                uses capability-base;
-
-                                leaf selector-namespace {
+                            case group-capability-constraint-case {
+                                list capability-matcher {
                                     description 
-                                        "The name of the selector to
-                                         match.  This allows us to
-                                         specify that we want to match
-                                         only capabilities scoped to a
-                                         particular selector name.
-
-                                         This parameter is optional;
-                                         if not specified, use an
-                                         inherited selector namespace
-                                         if it exists, or match
-                                         against any selector name.";
-                
-                                    type gbp-common:selector-name;
+                                        "Match against capabilities in the provider
+                                         endpoint group.";
+
+                                    key "name";
+                                    leaf name {
+                                        description 
+                                            "A name for the capability matcher";
+                                        type gbp-common:capability-matcher-name;
+                                        mandatory true;
+                                    }
+
+                                    uses matcher;
+
+                                    list matcher-capability {
+                                        description
+                                            "A matcher capability is a
+                                             capability with a selector
+                                             name field used in capability
+                                             mat  chers.  The name of the
+                                             matcher capability matches
+                                             against capabilities in
+                                             endpoint groups.";
+
+                                        key name;
+                                        uses capability-base;
+
+                                        leaf selector-namespace {
+                                            description
+                                                "The name of the selector to
+                                                 match.  This allows us to
+                                                 specify that we want to match
+                                                 only capabilities scoped to a
+                                                 particular selector name.
+
+                                                 This parameter is optional;
+                                                 if not specified, use an
+                                                 inherited selector namespace
+                                                 if it exists, or match
+                                                 against any selector name.";
+
+                                            type gbp-common:selector-name;
+                                        }
+                                    }
+                                }
+                            }
+                            case group-any-case {
+                                container group-any {
+                                    presence "any";
                                 }
                             }
                         }
+         
                         uses has-condition-matchers;
+                        
+                        container endpoint-identification-constraints {
+                            description
+                                "Identify endpoints via other attributes other than conditions.
+                                These can be things such as ip-prefix, vlan, mpls label etc. These
+                                things are intended to be explicity stated, and should not contain 
+                                references to other objects like endpointsIDs.";
+                            container l3-endpoint-identification-constraints {
+                                list prefix-constraint {
+                                    key ip-prefix;
+                                    leaf ip-prefix {
+                                        type inet:ip-prefix;
+                                    }
+                                }
+                            }
+                        }
                     }
                 
+                    container any-matchers {
+                        description
+                            "Matchers that apply to either provider endpoint group or consumer endpoint group.";
+                        // TODO fill this out, may need additional groupings so as to not confuse capability or requirement.
+                   }
+
                     // ******************
                     // Subject References
                     // ******************
index 21a95d3acb36ac320a7f657024488c521bb8b10a..073903e13528ae3742c4e47757a70312307bf57a 100644 (file)
@@ -8,6 +8,13 @@
 
 package org.opendaylight.groupbasedpolicy.resolver;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 import java.util.HashSet;
 import java.util.List;
 
@@ -67,12 +74,16 @@ 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.TargetBuilder;
 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.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcherBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.requirement.matcher.MatcherRequirementBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcherBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.capability.matcher.MatcherCapabilityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.GroupRequirementConstraintCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.GroupRequirementConstraintCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.requirement.matcher.MatcherRequirementBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.GroupCapabilityConstraintCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.GroupCapabilityConstraintCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.capability.matcher.MatcherCapabilityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.Rule;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.RuleBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelector;
@@ -87,8 +98,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
-import static org.junit.Assert.*;
-
 public class InheritanceUtilsTest {
     // ******
     // Labels
@@ -221,11 +230,13 @@ public class InheritanceUtilsTest {
         .setName(clauseName1)
         .setSubjectRefs(ImmutableList.of(subject1))
         .setProviderMatchers(new ProviderMatchersBuilder()
-            .setCapabilityMatcher(ImmutableList.of(capm_c1))
+        .setGroupIdentificationConstraints(new GroupCapabilityConstraintCaseBuilder()
+            .setCapabilityMatcher(ImmutableList.of(capm_c1)).build())
             .setConditionMatcher(ImmutableList.of(cm_c1))
             .build())
         .setConsumerMatchers(new ConsumerMatchersBuilder()
-            .setRequirementMatcher(ImmutableList.of(rm_r1))
+        .setGroupIdentificationConstraints(new GroupRequirementConstraintCaseBuilder()
+            .setRequirementMatcher(ImmutableList.of(rm_r1)).build())
             .setConditionMatcher(ImmutableList.of(cm_c2))
             .build())
         .build();
@@ -234,7 +245,8 @@ public class InheritanceUtilsTest {
         .setName(clauseName1)
         .setSubjectRefs(ImmutableList.of(subject2))
         .setConsumerMatchers(new ConsumerMatchersBuilder()
-            .setRequirementMatcher(ImmutableList.of(rm_r1_plus))
+        .setGroupIdentificationConstraints(new GroupRequirementConstraintCaseBuilder()
+            .setRequirementMatcher(ImmutableList.of(rm_r1_plus)).build())
             .setConditionMatcher(ImmutableList.of(cm_c2_plus))
             .build())
         .build();
@@ -243,7 +255,8 @@ public class InheritanceUtilsTest {
     .setName(clauseName1)
     .setSubjectRefs(ImmutableList.of(subject3))
     .setProviderMatchers(new ProviderMatchersBuilder()
-        .setCapabilityMatcher(ImmutableList.of(capm_c1))
+    .setGroupIdentificationConstraints(new GroupCapabilityConstraintCaseBuilder()
+        .setCapabilityMatcher(ImmutableList.of(capm_c1)).build())
         .setConditionMatcher(ImmutableList.of(cm_c2_plus))
         .build())
     .build();
@@ -1003,8 +1016,9 @@ public class InheritanceUtilsTest {
         assertEquals(1, cm.get(0).getCondition().size());
         assertTrue(containsCondition(cm.get(0).getCondition(), cond1));
 
+        
         List<CapabilityMatcher> capm = 
-                result.getProviderMatchers().getCapabilityMatcher();
+                ((GroupCapabilityConstraintCase)result.getProviderMatchers().getGroupIdentificationConstraints()).getCapabilityMatcher();
         assertEquals(1, capm.size());
         assertEquals(1, capm.get(0).getMatcherCapability().size());
         assertTrue(containsCapability(capm.get(0).getMatcherCapability(), c1));
@@ -1016,7 +1030,7 @@ public class InheritanceUtilsTest {
         assertTrue(containsCondition(cm.get(0).getCondition(), cond2));
 
         List<RequirementMatcher> pm = 
-                result.getConsumerMatchers().getRequirementMatcher();
+                ((GroupRequirementConstraintCase)result.getConsumerMatchers().getGroupIdentificationConstraints()).getRequirementMatcher();
         assertEquals(1, pm.size());
         assertEquals(1, pm.get(0).getMatcherRequirement().size());
         assertTrue(containsRequirement(pm.get(0).getMatcherRequirement(), r1));
@@ -1044,7 +1058,7 @@ public class InheritanceUtilsTest {
         assertTrue(containsCondition(cm.get(0).getCondition(), cond1));
 
         List<CapabilityMatcher> capm = 
-                result.getProviderMatchers().getCapabilityMatcher();
+                ((GroupCapabilityConstraintCase)result.getProviderMatchers().getGroupIdentificationConstraints()).getCapabilityMatcher();
         assertEquals(1, capm.size());
         assertEquals(1, capm.get(0).getMatcherCapability().size());
         assertTrue(containsCapability(capm.get(0).getMatcherCapability(), c1));
@@ -1057,7 +1071,7 @@ public class InheritanceUtilsTest {
         assertEquals(0, cm.get(0).getCondition().size());
 
         List<RequirementMatcher> pm = 
-                result.getConsumerMatchers().getRequirementMatcher();
+                ((GroupRequirementConstraintCase)result.getConsumerMatchers().getGroupIdentificationConstraints()).getRequirementMatcher();
         assertEquals(1, pm.size());
         assertEquals(2, pm.get(0).getMatcherRequirement().size());
         assertTrue(containsRequirement(pm.get(0).getMatcherRequirement(), r1));
@@ -1112,9 +1126,9 @@ public class InheritanceUtilsTest {
         assertEquals(1, c.getClause().size());
         Clause clause = c.getClause().get(0);
         assertEquals(1, clause.getConsumerMatchers().getConditionMatcher().size());
-        assertEquals(1, clause.getConsumerMatchers().getRequirementMatcher().size());
+        assertEquals(1, ((GroupRequirementConstraintCase)clause.getConsumerMatchers().getGroupIdentificationConstraints()).getRequirementMatcher().size());
         assertEquals(1, clause.getProviderMatchers().getConditionMatcher().size());
-        assertEquals(1, clause.getProviderMatchers().getCapabilityMatcher().size());
+        assertEquals(1, ((GroupCapabilityConstraintCase)clause.getProviderMatchers().getGroupIdentificationConstraints()).getCapabilityMatcher().size());
         assertEquals(2, c.getSubject().size());
 
         EndpointGroup eg = TenantUtils.findEndpointGroup(tenant, egloop2Id);
index d5953620cd5cfe5399e12d75dd591dfaff7f5021..d1ac844ee806537c4162196293b1c4c3645251ed 100644 (file)
@@ -8,8 +8,10 @@
 
 package org.opendaylight.groupbasedpolicy.resolver;
 
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import org.junit.Test;
-import org.opendaylight.groupbasedpolicy.resolver.MatcherUtils;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.QualityName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.RequirementName;
@@ -28,14 +30,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.quality.matcher.MatcherQualityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Target;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.TargetBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcherBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.requirement.matcher.MatcherRequirement;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.requirement.matcher.MatcherRequirementBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcherBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.capability.matcher.MatcherCapability;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.capability.matcher.MatcherCapabilityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.requirement.matcher.MatcherRequirement;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.requirement.matcher.MatcherRequirementBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.capability.matcher.MatcherCapability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.capability.matcher.MatcherCapabilityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelector;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelectorBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelector;
@@ -47,8 +49,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev
 
 import com.google.common.collect.ImmutableList;
 
-import static org.junit.Assert.*;
-
 public class MatcherUtilsTest {
     
     @Test
index 18385c6c2fcd46ef88710ab8efba6f8e696e89b1..cf87c52dbd483049bbe5834baeb7b8d9390a9c4e 100644 (file)
@@ -8,6 +8,10 @@
 
 package org.opendaylight.groupbasedpolicy.resolver;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -18,8 +22,6 @@ import java.util.Set;
 
 import org.junit.Before;
 import org.junit.Test;
-import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver;
-import org.opendaylight.groupbasedpolicy.resolver.ConditionSet;
 import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver.ContractMatch;
 import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver.TenantContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityMatcherName;
@@ -66,12 +68,14 @@ 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.TargetBuilder;
 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.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.RequirementMatcherBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.requirement.matcher.MatcherRequirementBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.CapabilityMatcherBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.capability.matcher.MatcherCapabilityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.GroupRequirementConstraintCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.RequirementMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.consumer.matchers.group.identification.constraints.group.requirement.constraint._case.requirement.matcher.MatcherRequirementBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.GroupCapabilityConstraintCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.CapabilityMatcherBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.clause.provider.matchers.group.identification.constraints.group.capability.constraint._case.capability.matcher.MatcherCapabilityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.Rule;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.subject.RuleBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelector;
@@ -87,8 +91,6 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Table;
 
-import static org.junit.Assert.*;
-
 public class PolicyResolverTest {
     Quality q1 = new QualityBuilder()
         .setName(new QualityName("q1"))
@@ -188,11 +190,13 @@ public class PolicyResolverTest {
     Clause clause1 = new ClauseBuilder()
         .setName(new ClauseName("clause1"))
         .setConsumerMatchers(new ConsumerMatchersBuilder()
-            .setRequirementMatcher(ImmutableList.of(rm1))
+            .setGroupIdentificationConstraints(new GroupRequirementConstraintCaseBuilder()
+            .setRequirementMatcher(ImmutableList.of(rm1)).build())
             .setConditionMatcher(ImmutableList.of(condm1, condm2, condm3))
             .build())
         .setProviderMatchers(new ProviderMatchersBuilder()
-            .setCapabilityMatcher(ImmutableList.of(capm1))
+            .setGroupIdentificationConstraints(new GroupCapabilityConstraintCaseBuilder()
+            .setCapabilityMatcher(ImmutableList.of(capm1)).build())
             .build())
         .setSubjectRefs(ImmutableList.of(s1.getName()))
         .build();
index 0d8660381a1e7cd6bf6c6c7e2006890dba8f23c5..80038b6fca3481239bbeae25572964fef290902d 100644 (file)
@@ -38,11 +38,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.Fl
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.Endpoints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterL3PrefixEndpointInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3Address;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3AddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3PrefixBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayConfig.LearningMode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder;
@@ -253,6 +255,12 @@ public class EndpointManager implements AutoCloseable, DataChangeListener
         public void buildEndpointL3Augmentation(EndpointL3Builder eb,
                 RegisterEndpointInput input) {
         }
+
+        @Override
+        public void buildL3PrefixEndpointAugmentation(EndpointL3PrefixBuilder eb, RegisterL3PrefixEndpointInput input) {
+            // TODO Auto-generated method stub
+            
+        }
     }
 
     // *************
index 067fcfb26ee1296b4a28bf26ce37195ccce4365d..76df9828805a406ad33a03bb1a1d8e2979d6b276 100644 (file)
@@ -18,6 +18,7 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver;
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.SfcManager;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayConfig;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -60,6 +61,7 @@ public class OFOverlayRenderer implements AutoCloseable, DataChangeListener {
         this.dataBroker = dataProvider;
 
         int numCPU = Runtime.getRuntime().availableProcessors();
+        //TODO: Consider moving to groupbasedpolicy-ofoverlay-config so as to be user configurable in distribution.
         executor = Executors.newScheduledThreadPool(numCPU * 2);
 
         switchManager = new SwitchManager(dataProvider, executor);
index 83aacf1af7de13439292ec5e9dd36f03253a96cb..aecd35c130b3cd374695a39b6ca0f4f967da192d 100644 (file)
@@ -51,10 +51,12 @@ import org.opendaylight.groupbasedpolicy.renderer.opflex.mit.PolicyUri;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.Endpoints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterL3PrefixEndpointInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3PrefixBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.opflex.rev140528.OpflexOverlayContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.opflex.rev140528.OpflexOverlayContextBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.opflex.rev140528.OpflexOverlayContextInput;
@@ -192,6 +194,12 @@ public class EndpointManager
             eb.addAugmentation(OpflexOverlayContextL3.class,
                     new OpflexOverlayContextL3Builder(ictx).build());
         }
+
+        @Override
+        public void buildL3PrefixEndpointAugmentation(EndpointL3PrefixBuilder eb, RegisterL3PrefixEndpointInput input) {
+            // TODO These methods will be replaced by getAugmentation and augmentation applied at caller.
+            
+        }
     }
 
     // *************