--- /dev/null
+package org.opendaylight.groupbasedpolicy.resolver;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import javax.annotation.concurrent.Immutable;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.ConsumerSelectionRelator;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.ProviderSelectionRelator;
+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.tenants.Tenant;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.EndpointGroup;
+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.endpoint.group.ConsumerNamedSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderTargetSelector;
+
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.Table;
+
+
+public class ContractResolverUtils {
+
+ private ContractResolverUtils() {
+ throw new UnsupportedOperationException("Cannot create an instance");
+ }
+
+ /**
+ * Choose the contracts that are in scope for each pair of endpoint groups,
+ * then perform subject selection for the pair
+ */
+ protected static Table<EgKey, EgKey, List<ContractMatch>> selectContracts(Set<IndexedTenant> tenants) {
+ Table<TenantId, ContractId, List<ConsumerContractMatch>> consumerMatches = HashBasedTable.create();
+ Table<EgKey, EgKey, List<ContractMatch>> contractMatches = HashBasedTable.create();
+
+ for (IndexedTenant tenant : tenants) {
+ selectContracts(consumerMatches, contractMatches, tenant.getTenant());
+ }
+ return contractMatches;
+ }
+
+ protected static void selectContracts(Table<TenantId, ContractId, List<ConsumerContractMatch>> consumerMatches,
+ Table<EgKey, EgKey, List<ContractMatch>> contractMatches, Tenant tenant) {
+ // For each endpoint group, match consumer selectors
+ // against contracts to get a set of matching consumer selectors
+ if (tenant.getEndpointGroup() == null)
+ return;
+ for (EndpointGroup group : tenant.getEndpointGroup()) {
+ List<ConsumerContractMatch> r = matchConsumerContracts(tenant, group);
+ for (ConsumerContractMatch ccm : r) {
+ List<ConsumerContractMatch> cms = consumerMatches.get(tenant.getId(), ccm.contract.getId());
+ if (cms == null) {
+ cms = new ArrayList<>();
+ consumerMatches.put(tenant.getId(), ccm.contract.getId(), cms);
+ }
+ cms.add(ccm);
+ }
+ }
+
+ // Match provider selectors, and check each match for a corresponding
+ // consumer selector match.
+ for (EndpointGroup group : tenant.getEndpointGroup()) {
+ List<ContractMatch> matches = matchProviderContracts(tenant, group, consumerMatches);
+ for (ContractMatch cm : matches) {
+ EgKey consumerKey = new EgKey(cm.consumerTenant.getId(), cm.consumer.getId());
+ EgKey providerKey = new EgKey(cm.providerTenant.getId(), cm.provider.getId());
+ List<ContractMatch> egPairMatches = contractMatches.get(consumerKey, providerKey);
+ if (egPairMatches == null) {
+ egPairMatches = new ArrayList<>();
+ contractMatches.put(consumerKey, providerKey, egPairMatches);
+ }
+
+ egPairMatches.add(cm);
+ }
+ }
+ }
+
+ private static List<ConsumerContractMatch> matchConsumerContracts(Tenant tenant,
+ EndpointGroup consumer) {
+ List<ConsumerContractMatch> matches = new ArrayList<>();
+ if (consumer.getConsumerNamedSelector() != null) {
+ for (ConsumerNamedSelector cns : consumer.getConsumerNamedSelector()) {
+ if (cns.getContract() == null)
+ continue;
+ for (ContractId contractId : cns.getContract()) {
+ Contract contract =
+ TenantUtils.findContract(tenant, contractId);
+ if (contract == null)
+ continue;
+ matches.add(new ConsumerContractMatch(tenant, contract,
+ tenant, consumer,
+ cns));
+ }
+ }
+ }
+ if (consumer.getConsumerTargetSelector() != null) {
+ for (ConsumerTargetSelector cts : consumer.getConsumerTargetSelector()) {
+ if (tenant.getContract() == null)
+ continue;
+ for (Contract contract : tenant.getContract()) {
+ if (contract.getTarget() == null)
+ continue;
+ for (Target t : contract.getTarget()) {
+ boolean match = true;
+ if (cts.getQualityMatcher() != null) {
+ for (QualityMatcher m : cts.getQualityMatcher()) {
+ if (!MatcherUtils.applyQualityMatcher(m, t)) {
+ match = false;
+ break;
+ }
+ }
+ }
+ if (match) {
+ matches.add(new ConsumerContractMatch(tenant,
+ contract,
+ tenant,
+ consumer,
+ cts));
+ }
+ }
+ }
+ }
+ }
+ // TODO match selectors also against contract references
+ // for (ConsumerTargetSelector cts :
+ // consumer.getConsumerTargetSelector()) {
+ // if (tenant.getContractRef() == null) continue;
+ // for (ContractRef c : tenant.getContractRef()) {
+ //
+ // }
+ // }
+ return matches;
+ }
+
+ private static List<ContractMatch> matchProviderContracts(Tenant tenant, EndpointGroup provider,
+ Table<TenantId, ContractId, List<ConsumerContractMatch>> consumerMatches) {
+ List<ContractMatch> matches = new ArrayList<>();
+ if (provider.getProviderNamedSelector() != null) {
+ for (ProviderNamedSelector pns : provider.getProviderNamedSelector()) {
+ if (pns.getContract() == null)
+ continue;
+ for (ContractId contractId : pns.getContract()) {
+ Contract c = TenantUtils.findContract(tenant, contractId);
+ if (c == null)
+ continue;
+ List<ConsumerContractMatch> cMatches = consumerMatches.get(tenant.getId(), c.getId());
+ amendContractMatches(matches, cMatches, tenant, provider, pns);
+ }
+ }
+ }
+ if (provider.getProviderTargetSelector() != null) {
+ for (ProviderTargetSelector pts : provider.getProviderTargetSelector()) {
+ if (tenant.getContract() == null)
+ continue;
+ for (Contract c : tenant.getContract()) {
+ if (c.getTarget() == null)
+ continue;
+ for (Target t : c.getTarget()) {
+ boolean match = true;
+ if (pts.getQualityMatcher() != null) {
+ for (QualityMatcher m : pts.getQualityMatcher()) {
+ if (!MatcherUtils.applyQualityMatcher(m, t)) {
+ match = false;
+ break;
+ }
+ }
+ }
+ if (match) {
+ List<ConsumerContractMatch> cMatches = consumerMatches.get(tenant.getId(), c.getId());
+ amendContractMatches(matches, cMatches, tenant, provider, pts);
+
+ }
+ }
+ }
+ }
+ }
+ return matches;
+ }
+
+ private static void amendContractMatches(List<ContractMatch> matches,
+ List<ConsumerContractMatch> cMatches,
+ Tenant tenant, EndpointGroup provider,
+ ProviderSelectionRelator relator) {
+ if (cMatches == null)
+ return;
+ for (ConsumerContractMatch cMatch : cMatches) {
+ matches.add(new ContractMatch(cMatch, tenant, provider, relator));
+ }
+ }
+
+ /**
+ * Represents a selected contract made by endpoint groups matching it using
+ * selection relators. This is the result of the contract selection phase.
+ *
+ * @author readams
+ */
+ @Immutable
+ protected static class ContractMatch extends ConsumerContractMatch {
+
+ /**
+ * The tenant ID of the provider endpoint group
+ */
+ final Tenant providerTenant;
+
+ /**
+ * The provider endpoint group
+ */
+ final EndpointGroup provider;
+
+ /**
+ * The provider selection relator that was used to match the contract
+ */
+ final ProviderSelectionRelator providerRelator;
+
+ public ContractMatch(ConsumerContractMatch consumerMatch, Tenant providerTenant, EndpointGroup provider,
+ ProviderSelectionRelator providerRelator) {
+ super(consumerMatch.contractTenant, consumerMatch.contract, consumerMatch.consumerTenant,
+ consumerMatch.consumer, consumerMatch.consumerRelator);
+ this.providerTenant = providerTenant;
+ this.provider = provider;
+ this.providerRelator = providerRelator;
+ }
+ }
+
+ @Immutable
+ protected static class ConsumerContractMatch {
+
+ /**
+ * The tenant of the matching contract
+ */
+ final Tenant contractTenant;
+
+ /**
+ * The matching contract
+ */
+ final Contract contract;
+
+ /**
+ * The tenant for the endpoint group
+ */
+ final Tenant consumerTenant;
+
+ /**
+ * The consumer endpoint group
+ */
+ final EndpointGroup consumer;
+
+ /**
+ * The consumer selection relator that was used to match the contract
+ */
+ final ConsumerSelectionRelator consumerRelator;
+
+ public ConsumerContractMatch(Tenant contractTenant, Contract contract, Tenant consumerTenant,
+ EndpointGroup consumer, ConsumerSelectionRelator consumerRelator) {
+ super();
+ this.contractTenant = contractTenant;
+ this.contract = contract;
+ this.consumerTenant = consumerTenant;
+ this.consumer = consumer;
+ this.consumerRelator = consumerRelator;
+ }
+ }
+
+}
package org.opendaylight.groupbasedpolicy.resolver;
-import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubjectName;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.ConsumerSelectionRelator;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Matcher.MatchType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.ProviderSelectionRelator;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcher;
-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.target.selector.QualityMatcher;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.EndpointGroup;
-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.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.endpoint.group.ConsumerNamedSelector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderTargetSelector;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
import com.google.common.collect.Table;
import com.google.common.collect.Table.Cell;
protected void updatePolicy() {
try {
Map<EgKey, Set<ConditionSet>> egConditions = new HashMap<>();
- Table<EgKey, EgKey, Policy> policyMap =
- resolvePolicy(resolvedTenants.values(),
- egConditions);
- Set<EgKey> updatedGroups =
- updatePolicy(policyMap,
- egConditions,
- policyListenerScopes);
+ Set<IndexedTenant> indexedTenants = getIndexedTenants(resolvedTenants.values());
+ Table<EgKey, EgKey, Policy> policyMap = PolicyResolverUtils.resolvePolicy(indexedTenants, egConditions);
+ Set<EgKey> updatedGroups = updatePolicy(policyMap, egConditions, policyListenerScopes);
notifyListeners(updatedGroups);
} catch (Exception e) {
}
}
- /**
- * Resolve the policy in three phases: (1) select contracts that in scope
- * based on contract selectors. (2) select subjects that are in scope for
- * each contract based on matchers in clauses (3) resolve the set of
- * in-scope contracts into a list of subjects that apply for each pair of
- * endpoint groups and the conditions that can apply for for each endpoint
- * in those groups.
- */
- protected Table<EgKey, EgKey, Policy>
- resolvePolicy(Collection<TenantContext> tenants,
- Map<EgKey, Set<ConditionSet>> egConditions) {
- // select contracts that apply for the given tenant
- Table<EgKey, EgKey, List<ContractMatch>> contractMatches =
- selectContracts(tenants);
-
- // select subjects for the matching contracts and resolve the policy
- // for endpoint group pairs. This does phase (2) and (3) as one step
- return selectSubjects(contractMatches, egConditions);
- }
-
- /**
- * Choose the contracts that are in scope for each pair of endpoint groups,
- * then perform subject selection for the pair
- */
- protected Table<EgKey, EgKey, List<ContractMatch>>
- selectContracts(Collection<TenantContext> tenants) {
- Table<TenantId, ContractId, List<ConsumerContractMatch>> consumerMatches =
- HashBasedTable.create();
- Table<EgKey, EgKey, List<ContractMatch>> contractMatches =
- HashBasedTable.create();
-
- for (TenantContext tenant : tenants) {
+ private Set<IndexedTenant> getIndexedTenants(Collection<TenantContext> tenantCtxs) {
+ Set<IndexedTenant> result = new HashSet<>();
+ for (TenantContext tenant : tenantCtxs) {
IndexedTenant t = tenant.tenant.get();
- if (t == null)
- continue;
- selectContracts(consumerMatches,
- contractMatches,
- t.getTenant());
- }
- return contractMatches;
- }
-
- protected void selectContracts(Table<TenantId,
- ContractId,
- List<ConsumerContractMatch>> consumerMatches,
- Table<EgKey, EgKey,
- List<ContractMatch>> contractMatches,
- Tenant tenant) {
- // For each endpoint group, match consumer selectors
- // against contracts to get a set of matching consumer selectors
- if (tenant.getEndpointGroup() == null)
- return;
- for (EndpointGroup group : tenant.getEndpointGroup()) {
- List<ConsumerContractMatch> r =
- matchConsumerContracts(tenant, group);
- for (ConsumerContractMatch ccm : r) {
- List<ConsumerContractMatch> cms =
- consumerMatches.get(tenant.getId(),
- ccm.contract.getId());
- if (cms == null) {
- cms = new ArrayList<>();
- consumerMatches.put(tenant.getId(),
- ccm.contract.getId(), cms);
- }
- cms.add(ccm);
- }
- }
-
- // Match provider selectors, and check each match for a corresponding
- // consumer selector match.
- for (EndpointGroup group : tenant.getEndpointGroup()) {
- List<ContractMatch> matches =
- matchProviderContracts(tenant, group, consumerMatches);
- for (ContractMatch cm : matches) {
- EgKey consumerKey = new EgKey(cm.consumerTenant.getId(),
- cm.consumer.getId());
- EgKey providerKey = new EgKey(cm.providerTenant.getId(),
- cm.provider.getId());
- List<ContractMatch> egPairMatches =
- contractMatches.get(consumerKey, providerKey);
- if (egPairMatches == null) {
- egPairMatches = new ArrayList<>();
- contractMatches.put(consumerKey, providerKey,
- egPairMatches);
- }
-
- egPairMatches.add(cm);
- }
- }
- }
-
- private boolean clauseMatchesByGroupReqAndCapConstraints(Clause clause, ContractMatch match) {
- if (clause.getConsumerMatchers() != null) {
- 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) {
- 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;
- }
- }
- }
- }
+ if (t != null)
+ result.add(t);
}
- return true;
- }
-
- private ConditionSet buildConditionSet(List<ConditionMatcher> condMatchers) {
- if (condMatchers == null)
- return ConditionSet.EMPTY;
-
- ImmutableSet.Builder<ConditionName> allb = ImmutableSet.builder();
- ImmutableSet.Builder<ConditionName> noneb = ImmutableSet.builder();
- ImmutableSet.Builder<Set<ConditionName>> anyb =
- ImmutableSet.builder();
- for (ConditionMatcher condMatcher : condMatchers) {
- if (condMatcher.getCondition() == null)
- continue;
- MatchType type = condMatcher.getMatchType();
- if (type == null)
- type = MatchType.All;
- if (type.equals(MatchType.Any)) {
- ImmutableSet.Builder<ConditionName> a =
- ImmutableSet.builder();
- for (Condition c : condMatcher.getCondition()) {
- a.add(c.getName());
- }
- anyb.add(a.build());
- } else {
- for (Condition c : condMatcher.getCondition()) {
- switch (type) {
- case Any:
- break;
- case None:
- noneb.add(c.getName());
- break;
- case All:
- default:
- allb.add(c.getName());
- break;
- }
- }
- }
- }
- return new ConditionSet(allb.build(), noneb.build(), anyb.build());
- }
-
- private ConditionSet buildConsConditionSet(Clause clause) {
- if (clause.getConsumerMatchers() != null) {
- List<ConditionMatcher> condMatchers =
- clause.getConsumerMatchers().getConditionMatcher();
- return buildConditionSet(condMatchers);
- }
- return ConditionSet.EMPTY;
- }
-
- private ConditionSet buildProvConditionSet(Clause clause) {
- if (clause.getProviderMatchers() != null) {
- List<ConditionMatcher> condMatchers =
- clause.getProviderMatchers().getConditionMatcher();
- return buildConditionSet(condMatchers);
- }
- return ConditionSet.EMPTY;
- }
-
- private Policy resolvePolicy(Tenant contractTenant,
- Contract contract,
- Policy merge,
- Table<ConditionSet, ConditionSet,
- List<Subject>> subjectMap) {
- Table<ConditionSet, ConditionSet, List<RuleGroup>> ruleMap =
- HashBasedTable.create();
- if (merge != null) {
- ruleMap.putAll(merge.getRuleMap());
- }
- for (Cell<ConditionSet, ConditionSet, List<Subject>> entry : subjectMap.cellSet()) {
- List<RuleGroup> rules = new ArrayList<>();
- ConditionSet consConds = entry.getRowKey();
- ConditionSet provConds = entry.getColumnKey();
- List<RuleGroup> oldrules = ruleMap.get(consConds, provConds);
- if (oldrules != null) {
- rules.addAll(oldrules);
- }
- for (Subject s : entry.getValue()) {
- if (s.getRule() == null)
- continue;
-
- RuleGroup rg = new RuleGroup(s.getRule(), s.getOrder(),
- contractTenant, contract,
- s.getName());
- rules.add(rg);
- }
- Collections.sort(rules);
- ruleMap.put(consConds, provConds, Collections.unmodifiableList(rules));
- }
- return new Policy(ruleMap);
- }
-
- /**
- * Get the "natural" direction for the policy for the given pair of endpoint
- * groups.
- *
- * @param one
- * The first endpoint group
- * @param two
- * The second endpoint group
- * @return true if the order should be reversed in the index
- */
- protected static boolean shouldReverse(EgKey one, EgKey two) {
- if (one.compareTo(two) < 0) {
- return true;
- }
- return false;
- }
-
- private void addConditionSet(EgKey eg, ConditionSet cs,
- Map<EgKey, Set<ConditionSet>> egConditions) {
- if (egConditions == null)
- return;
- Set<ConditionSet> cset = egConditions.get(eg);
- if (cset == null) {
- egConditions.put(eg, cset = new HashSet<>());
- }
- cset.add(cs);
- }
-
- /**
- * Choose the set of subjects that in scope for each possible set of
- * endpoint conditions
- */
- // TODO Li msunal do we really need contractMatches to be a type Table<EgKey, EgKey, List<ContractMatch>>
- // it should be sufficient to be just List<ContractMatch>
- protected Table<EgKey, EgKey, Policy>
- selectSubjects(Table<EgKey, EgKey,
- List<ContractMatch>> contractMatches,
- Map<EgKey, Set<ConditionSet>> egConditions) {
- // TODO: Note that it's possible to further simplify the resulting
- // policy
- // in the case of things like repeated rules, condition sets that
- // cover other condition sets, etc. This would be a good thing to do
- // at some point
- Table<EgKey, EgKey, Policy> policy = HashBasedTable.create();
-
- for (List<ContractMatch> matches : contractMatches.values()) {
- for (ContractMatch match : matches) {
- List<Clause> clauses = match.contract.getClause();
- if (clauses == null)
- continue;
-
- List<Subject> subjectList = match.contract.getSubject();
- if (subjectList == null)
- continue;
-
- EgKey ckey = new EgKey(match.consumerTenant.getId(),
- match.consumer.getId());
- EgKey pkey = new EgKey(match.providerTenant.getId(),
- match.provider.getId());
- Policy existing = policy.get(ckey, pkey);
-
- HashMap<SubjectName, Subject> subjects = new HashMap<>();
- for (Subject s : subjectList) {
- subjects.put(s.getName(), s);
- }
-
- Table<ConditionSet, ConditionSet, List<Subject>> subjectMap =
- HashBasedTable.create();
-
- for (Clause clause : clauses) {
- if (clause.getSubjectRefs() != null &&
- clauseMatchesByGroupReqAndCapConstraints(clause, match)) {
- ConditionSet consCSet = buildConsConditionSet(clause);
- addConditionSet(ckey, consCSet, egConditions);
- ConditionSet provCSet = buildProvConditionSet(clause);
- addConditionSet(pkey, provCSet, egConditions);
- List<Subject> clauseSubjects =
- subjectMap.get(consCSet, provCSet);
- if (clauseSubjects == null) {
- clauseSubjects = new ArrayList<>();
- subjectMap.put(consCSet, provCSet, clauseSubjects);
- }
- for (SubjectName sn : clause.getSubjectRefs()) {
- Subject s = subjects.get(sn);
- if (s != null)
- clauseSubjects.add(s);
- }
- }
- }
-
- policy.put(ckey, pkey,
- resolvePolicy(match.contractTenant,
- match.contract,
- existing,
- subjectMap));
- }
- }
-
- return policy;
- }
-
- private List<ConsumerContractMatch> matchConsumerContracts(Tenant tenant,
- EndpointGroup consumer) {
- List<ConsumerContractMatch> matches = new ArrayList<>();
- if (consumer.getConsumerNamedSelector() != null) {
- for (ConsumerNamedSelector cns : consumer.getConsumerNamedSelector()) {
- if (cns.getContract() == null)
- continue;
- for (ContractId contractId : cns.getContract()) {
- Contract contract =
- TenantUtils.findContract(tenant, contractId);
- if (contract == null)
- continue;
- matches.add(new ConsumerContractMatch(tenant, contract,
- tenant, consumer,
- cns));
- }
- }
- }
- if (consumer.getConsumerTargetSelector() != null) {
- for (ConsumerTargetSelector cts : consumer.getConsumerTargetSelector()) {
- if (tenant.getContract() == null)
- continue;
- for (Contract contract : tenant.getContract()) {
- if (contract.getTarget() == null)
- continue;
- for (Target t : contract.getTarget()) {
- boolean match = true;
- if (cts.getQualityMatcher() != null) {
- for (QualityMatcher m : cts.getQualityMatcher()) {
- if (!MatcherUtils.applyQualityMatcher(m, t)) {
- match = false;
- break;
- }
- }
- }
- if (match) {
- matches.add(new ConsumerContractMatch(tenant,
- contract,
- tenant,
- consumer,
- cts));
- }
- }
- }
- }
- }
- // TODO match selectors also against contract references
- // for (ConsumerTargetSelector cts :
- // consumer.getConsumerTargetSelector()) {
- // if (tenant.getContractRef() == null) continue;
- // for (ContractRef c : tenant.getContractRef()) {
- //
- // }
- // }
- return matches;
- }
-
- private void amendContractMatches(List<ContractMatch> matches,
- List<ConsumerContractMatch> cMatches,
- Tenant tenant, EndpointGroup provider,
- ProviderSelectionRelator relator) {
- if (cMatches == null)
- return;
- for (ConsumerContractMatch cMatch : cMatches) {
- matches.add(new ContractMatch(cMatch, tenant, provider, relator));
- }
- }
-
- private List<ContractMatch>
- matchProviderContracts(Tenant tenant, EndpointGroup provider,
- Table<TenantId,
- ContractId,
- List<ConsumerContractMatch>> consumerMatches) {
- List<ContractMatch> matches = new ArrayList<>();
- if (provider.getProviderNamedSelector() != null) {
- for (ProviderNamedSelector pns : provider.getProviderNamedSelector()) {
- if (pns.getContract() == null)
- continue;
- for (ContractId contractId : pns.getContract()) {
- Contract c = TenantUtils.findContract(tenant, contractId);
- if (c == null)
- continue;
- List<ConsumerContractMatch> cMatches =
- consumerMatches.get(tenant.getId(), c.getId());
- amendContractMatches(matches, cMatches, tenant, provider, pns);
- }
- }
- }
- if (provider.getProviderTargetSelector() != null) {
- for (ProviderTargetSelector pts : provider.getProviderTargetSelector()) {
- if (tenant.getContract() == null)
- continue;
- for (Contract c : tenant.getContract()) {
- if (c.getTarget() == null)
- continue;
- for (Target t : c.getTarget()) {
- boolean match = true;
- if (pts.getQualityMatcher() != null) {
- for (QualityMatcher m : pts.getQualityMatcher()) {
- if (!MatcherUtils.applyQualityMatcher(m, t)) {
- match = false;
- break;
- }
- }
- }
- if (match) {
- List<ConsumerContractMatch> cMatches =
- consumerMatches.get(tenant.getId(),
- c.getId());
- amendContractMatches(matches, cMatches, tenant,
- provider, pts);
-
- }
- }
- }
- }
- }
- return matches;
+ return result;
}
protected static class TenantContext {
}
}
- /**
- * Represents a selected contract made by endpoint groups matching it using
- * selection relators. This is the result of the contract selection phase.
- *
- * @author readams
- *
- */
- @Immutable
- protected static class ContractMatch extends ConsumerContractMatch {
- /**
- * The tenant ID of the provider endpoint group
- */
- final Tenant providerTenant;
-
- /**
- * The provider endpoint group
- */
- final EndpointGroup provider;
-
- /**
- * The provider selection relator that was used to match the contract
- */
- final ProviderSelectionRelator providerRelator;
-
- public ContractMatch(ConsumerContractMatch consumerMatch,
- Tenant providerTenant, EndpointGroup provider,
- ProviderSelectionRelator providerRelator) {
- super(consumerMatch.contractTenant,
- consumerMatch.contract,
- consumerMatch.consumerTenant,
- consumerMatch.consumer,
- consumerMatch.consumerRelator);
- this.providerTenant = providerTenant;
- this.provider = provider;
- this.providerRelator = providerRelator;
- }
- }
-
- @Immutable
- private static class ConsumerContractMatch {
- /**
- * The tenant of the matching contract
- */
- final Tenant contractTenant;
-
- /**
- * The matching contract
- */
- final Contract contract;
-
- /**
- * The tenant for the endpoint group
- */
- final Tenant consumerTenant;
-
- /**
- * The consumer endpoint group
- */
- final EndpointGroup consumer;
-
- /**
- * The consumer selection relator that was used to match the contract
- */
- final ConsumerSelectionRelator consumerRelator;
-
- public ConsumerContractMatch(Tenant contractTenant,
- Contract contract,
- Tenant consumerTenant,
- EndpointGroup consumer,
- ConsumerSelectionRelator consumerRelator) {
- super();
- this.contractTenant = contractTenant;
- this.contract = contract;
- this.consumerTenant = consumerTenant;
- this.consumer = consumer;
- this.consumerRelator = consumerRelator;
- }
- }
-
@Immutable
private class PolicyChangeListener implements DataChangeListener {
final TenantId tenantId;
--- /dev/null
+package org.opendaylight.groupbasedpolicy.resolver;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.opendaylight.groupbasedpolicy.resolver.ContractResolverUtils.ContractMatch;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Table;
+
+public class PolicyResolverUtils {
+
+ private PolicyResolverUtils() {
+ throw new UnsupportedOperationException("Cannot create an instance");
+ }
+
+ /**
+ * Resolve the policy in three phases: <br>
+ * (1) select contracts that in scope based on contract selectors. <br>
+ * (2) select subjects that are in scope for each contract based on matchers in clauses <br>
+ * (3) resolve the set of in-scope contracts into a list of subjects that apply for each pair of
+ * endpoint groups and the conditions that can apply for for each endpoint in those groups.
+ */
+ public static Table<EgKey, EgKey, Policy> resolvePolicy(Set<IndexedTenant> tenants) {
+ return resolvePolicy(tenants, new HashMap<EgKey, Set<ConditionSet>>());
+ }
+
+ /**
+ * Resolve the policy in three phases: <br>
+ * (1) select contracts that in scope based on contract selectors. <br>
+ * (2) select subjects that are in scope for each contract based on matchers in clauses <br>
+ * (3) resolve the set of in-scope contracts into a list of subjects that apply for each pair of
+ * endpoint groups and the conditions that can apply for for each endpoint in those groups.
+ */
+ protected static Table<EgKey, EgKey, Policy> resolvePolicy(Set<IndexedTenant> tenants,
+ Map<EgKey, Set<ConditionSet>> egConditions) {
+ Preconditions.checkNotNull(tenants);
+ Preconditions.checkNotNull(egConditions);
+ // select contracts that apply for the given tenant
+ Table<EgKey, EgKey, List<ContractMatch>> contractMatches = ContractResolverUtils.selectContracts(tenants);
+
+ // select subjects for the matching contracts and resolve the policy
+ // for endpoint group pairs. This does phase (2) and (3) as one step
+ return SubjectResolverUtils.selectSubjects(contractMatches, egConditions);
+ }
+
+}
--- /dev/null
+package org.opendaylight.groupbasedpolicy.resolver;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.opendaylight.groupbasedpolicy.resolver.ContractResolverUtils.ContractMatch;
+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.policy.rev140421.Matcher.MatchType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.condition.matchers.ConditionMatcher;
+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.tenants.Tenant;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;
+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.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 com.google.common.collect.HashBasedTable;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Table;
+import com.google.common.collect.Table.Cell;
+
+
+public class SubjectResolverUtils {
+
+ private SubjectResolverUtils() {
+ throw new UnsupportedOperationException("Cannot create an instance");
+ }
+
+ /**
+ * Choose the set of subjects that in scope for each possible set of
+ * endpoint conditions
+ */
+ // TODO Li msunal do we really need contractMatches to be a type Table<EgKey, EgKey, List<ContractMatch>>
+ // it should be sufficient to be just List<ContractMatch>
+ protected static Table<EgKey, EgKey, Policy> selectSubjects(
+ Table<EgKey, EgKey, List<ContractMatch>> contractMatches, Map<EgKey, Set<ConditionSet>> egConditions) {
+ // TODO: Note that it's possible to further simplify the resulting
+ // policy
+ // in the case of things like repeated rules, condition sets that
+ // cover other condition sets, etc. This would be a good thing to do
+ // at some point
+ Table<EgKey, EgKey, Policy> policy = HashBasedTable.create();
+
+ for (List<ContractMatch> matches : contractMatches.values()) {
+ for (ContractMatch match : matches) {
+ List<Clause> clauses = match.contract.getClause();
+ if (clauses == null)
+ continue;
+
+ List<Subject> subjectList = match.contract.getSubject();
+ if (subjectList == null)
+ continue;
+
+ EgKey ckey = new EgKey(match.consumerTenant.getId(),
+ match.consumer.getId());
+ EgKey pkey = new EgKey(match.providerTenant.getId(),
+ match.provider.getId());
+ Policy existing = policy.get(ckey, pkey);
+
+ HashMap<SubjectName, Subject> subjects = new HashMap<>();
+ for (Subject s : subjectList) {
+ subjects.put(s.getName(), s);
+ }
+
+ Table<ConditionSet, ConditionSet, List<Subject>> subjectMap =
+ HashBasedTable.create();
+
+ for (Clause clause : clauses) {
+ if (clause.getSubjectRefs() != null &&
+ clauseMatchesByGroupReqAndCapConstraints(clause, match)) {
+ ConditionSet consCSet = buildConsConditionSet(clause);
+ addConditionSet(ckey, consCSet, egConditions);
+ ConditionSet provCSet = buildProvConditionSet(clause);
+ addConditionSet(pkey, provCSet, egConditions);
+ List<Subject> clauseSubjects =
+ subjectMap.get(consCSet, provCSet);
+ if (clauseSubjects == null) {
+ clauseSubjects = new ArrayList<>();
+ subjectMap.put(consCSet, provCSet, clauseSubjects);
+ }
+ for (SubjectName sn : clause.getSubjectRefs()) {
+ Subject s = subjects.get(sn);
+ if (s != null)
+ clauseSubjects.add(s);
+ }
+ }
+ }
+
+ policy.put(ckey, pkey,
+ resolvePolicy(match.contractTenant,
+ match.contract,
+ existing,
+ subjectMap));
+ }
+ }
+
+ return policy;
+ }
+
+ private static boolean clauseMatchesByGroupReqAndCapConstraints(Clause clause, ContractMatch match) {
+ if (clause.getConsumerMatchers() != null) {
+ 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) {
+ 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;
+ }
+ }
+ }
+ }
+ }
+ return true;
+ }
+
+ private static void addConditionSet(EgKey eg, ConditionSet cs,
+ Map<EgKey, Set<ConditionSet>> egConditions) {
+ if (egConditions == null)
+ return;
+ Set<ConditionSet> cset = egConditions.get(eg);
+ if (cset == null) {
+ egConditions.put(eg, cset = new HashSet<>());
+ }
+ cset.add(cs);
+ }
+
+ private static ConditionSet buildConsConditionSet(Clause clause) {
+ if (clause.getConsumerMatchers() != null) {
+ List<ConditionMatcher> condMatchers =
+ clause.getConsumerMatchers().getConditionMatcher();
+ return buildConditionSet(condMatchers);
+ }
+ return ConditionSet.EMPTY;
+ }
+
+ private static ConditionSet buildProvConditionSet(Clause clause) {
+ if (clause.getProviderMatchers() != null) {
+ List<ConditionMatcher> condMatchers =
+ clause.getProviderMatchers().getConditionMatcher();
+ return buildConditionSet(condMatchers);
+ }
+ return ConditionSet.EMPTY;
+ }
+
+ private static ConditionSet buildConditionSet(List<ConditionMatcher> condMatchers) {
+ if (condMatchers == null)
+ return ConditionSet.EMPTY;
+
+ ImmutableSet.Builder<ConditionName> allb = ImmutableSet.builder();
+ ImmutableSet.Builder<ConditionName> noneb = ImmutableSet.builder();
+ ImmutableSet.Builder<Set<ConditionName>> anyb =
+ ImmutableSet.builder();
+ for (ConditionMatcher condMatcher : condMatchers) {
+ if (condMatcher.getCondition() == null)
+ continue;
+ MatchType type = condMatcher.getMatchType();
+ if (type == null)
+ type = MatchType.All;
+ if (type.equals(MatchType.Any)) {
+ ImmutableSet.Builder<ConditionName> a =
+ ImmutableSet.builder();
+ for (Condition c : condMatcher.getCondition()) {
+ a.add(c.getName());
+ }
+ anyb.add(a.build());
+ } else {
+ for (Condition c : condMatcher.getCondition()) {
+ switch (type) {
+ case Any:
+ break;
+ case None:
+ noneb.add(c.getName());
+ break;
+ case All:
+ default:
+ allb.add(c.getName());
+ break;
+ }
+ }
+ }
+ }
+ return new ConditionSet(allb.build(), noneb.build(), anyb.build());
+ }
+
+ private static Policy resolvePolicy(Tenant contractTenant,
+ Contract contract,
+ Policy merge,
+ Table<ConditionSet, ConditionSet,
+ List<Subject>> subjectMap) {
+ Table<ConditionSet, ConditionSet, List<RuleGroup>> ruleMap =
+ HashBasedTable.create();
+ if (merge != null) {
+ ruleMap.putAll(merge.getRuleMap());
+ }
+ for (Cell<ConditionSet, ConditionSet, List<Subject>> entry : subjectMap.cellSet()) {
+ List<RuleGroup> rules = new ArrayList<>();
+ ConditionSet consConds = entry.getRowKey();
+ ConditionSet provConds = entry.getColumnKey();
+ List<RuleGroup> oldrules = ruleMap.get(consConds, provConds);
+ if (oldrules != null) {
+ rules.addAll(oldrules);
+ }
+ for (Subject s : entry.getValue()) {
+ if (s.getRule() == null)
+ continue;
+
+ RuleGroup rg = new RuleGroup(s.getRule(), s.getOrder(),
+ contractTenant, contract,
+ s.getName());
+ rules.add(rg);
+ }
+ Collections.sort(rules);
+ ruleMap.put(consConds, provConds, Collections.unmodifiableList(rules));
+ }
+ return new Policy(ruleMap);
+ }
+}
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
-import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver.ContractMatch;
+import org.opendaylight.groupbasedpolicy.resolver.ContractResolverUtils.ContractMatch;
import org.opendaylight.groupbasedpolicy.resolver.PolicyResolver.TenantContext;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityMatcherName;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.CapabilityName;
public void testContractSelection() throws Exception {
// named selectors
TenantContext tc = new TenantContext(null);
- Collection<TenantContext> tCol = Collections.singleton(tc);
tc.tenant.set(new IndexedTenant(tenant1));
Table<EgKey, EgKey, List<ContractMatch>> contractMatches =
- resolver.selectContracts(tCol);
+ ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
assertEquals(1, contractMatches.size());
List<ContractMatch> matches =
contractMatches.get(new EgKey(tenant1.getId(), eg1.getId()),
tc.tenant.set(new IndexedTenant(tenant2));
- contractMatches = resolver.selectContracts(tCol);
+ contractMatches = ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
assertEquals(2, contractMatches.size());
matches = contractMatches.get(new EgKey(tenant2.getId(), eg1.getId()),
new EgKey(tenant2.getId(), eg2.getId()));
// target selectors
tc.tenant.set(new IndexedTenant(tenant3));
- contractMatches = resolver.selectContracts(tCol);
+ contractMatches = ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
assertEquals(1, contractMatches.size());
matches = contractMatches.get(new EgKey(tenant3.getId(), eg4.getId()),
new EgKey(tenant3.getId(), eg5.getId()));
// empty matches
tc.tenant.set(new IndexedTenant(tenant0));
- contractMatches = resolver.selectContracts(tCol);
+ contractMatches = ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
assertEquals(0, contractMatches.size());
tc.tenant.set(new IndexedTenant(tenant00));
- contractMatches = resolver.selectContracts(tCol);
+ contractMatches = ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
assertEquals(0, contractMatches.size());
}
ImmutableSet.of(ImmutableSet.of(cond1.getName(),
cond2.getName())));
TenantContext tc = new TenantContext(null);
- Collection<TenantContext> tCol = Collections.singleton(tc);
tc.tenant.set(new IndexedTenant(tenant1));
Table<EgKey, EgKey, List<ContractMatch>> contractMatches =
- resolver.selectContracts(tCol);
+ ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
Map<EgKey, Set<ConditionSet>> egConditions = new HashMap<>();
Table<EgKey, EgKey, Policy> policy =
- resolver.selectSubjects(contractMatches, egConditions);
+ SubjectResolverUtils.selectSubjects(contractMatches, egConditions);
assertEquals(1, policy.size());
Policy p = policy.get(new EgKey(tenant1.getId(), eg1.getId()), new EgKey(tenant1.getId(), eg2.getId()));
List<RuleGroup> rules = p.getRuleMap().get(cs, ConditionSet.EMPTY);
assertEquals(rule1.getName(), rg.rules.get(0).getName());
tc.tenant.set(new IndexedTenant(tenant2));
- contractMatches = resolver.selectContracts(tCol);
+ contractMatches = ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
egConditions = new HashMap<>();
- policy = resolver.selectSubjects(contractMatches, egConditions);
+ policy = SubjectResolverUtils.selectSubjects(contractMatches, egConditions);
assertEquals(2, policy.size());
p = policy.get(new EgKey(tenant2.getId(), eg3.getId()),
assertEquals(rule1.getName(), rg.rules.get(0).getName());
tc.tenant.set(new IndexedTenant(tenant3));
- contractMatches = resolver.selectContracts(tCol);
+ contractMatches = ContractResolverUtils.selectContracts(ImmutableSet.of(tc.tenant.get()));
egConditions = new HashMap<>();
- policy = resolver.selectSubjects(contractMatches, egConditions);
+ policy = SubjectResolverUtils.selectSubjects(contractMatches, egConditions);
assertEquals(1, policy.size());
p = policy.get(new EgKey(tenant3.getId(), eg4.getId()),