1 package org.opendaylight.groupbasedpolicy.resolver;
3 import java.util.ArrayList;
7 import javax.annotation.concurrent.Immutable;
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.ConsumerSelectionRelator;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.ProviderSelectionRelator;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.target.selector.QualityMatcher;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.Contract;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.EndpointGroup;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.contract.Target;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerNamedSelector;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ConsumerTargetSelector;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderNamedSelector;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.endpoint.group.ProviderTargetSelector;
23 import com.google.common.collect.HashBasedTable;
24 import com.google.common.collect.Table;
27 public class ContractResolverUtils {
29 private ContractResolverUtils() {
30 throw new UnsupportedOperationException("Cannot create an instance");
34 * Choose the contracts that are in scope for each pair of endpoint groups,
35 * then perform subject selection for the pair
37 protected static Table<EgKey, EgKey, List<ContractMatch>> selectContracts(Set<IndexedTenant> tenants) {
38 Table<TenantId, ContractId, List<ConsumerContractMatch>> consumerMatches = HashBasedTable.create();
39 Table<EgKey, EgKey, List<ContractMatch>> contractMatches = HashBasedTable.create();
41 for (IndexedTenant tenant : tenants) {
42 selectContracts(consumerMatches, contractMatches, tenant.getTenant());
44 return contractMatches;
47 protected static void selectContracts(Table<TenantId, ContractId, List<ConsumerContractMatch>> consumerMatches,
48 Table<EgKey, EgKey, List<ContractMatch>> contractMatches, Tenant tenant) {
49 // For each endpoint group, match consumer selectors
50 // against contracts to get a set of matching consumer selectors
51 if (tenant.getEndpointGroup() == null)
53 for (EndpointGroup group : tenant.getEndpointGroup()) {
54 List<ConsumerContractMatch> r = matchConsumerContracts(tenant, group);
55 for (ConsumerContractMatch ccm : r) {
56 List<ConsumerContractMatch> cms = consumerMatches.get(tenant.getId(), ccm.contract.getId());
58 cms = new ArrayList<>();
59 consumerMatches.put(tenant.getId(), ccm.contract.getId(), cms);
65 // Match provider selectors, and check each match for a corresponding
66 // consumer selector match.
67 for (EndpointGroup group : tenant.getEndpointGroup()) {
68 List<ContractMatch> matches = matchProviderContracts(tenant, group, consumerMatches);
69 for (ContractMatch cm : matches) {
70 EgKey consumerKey = new EgKey(cm.consumerTenant.getId(), cm.consumer.getId());
71 EgKey providerKey = new EgKey(cm.providerTenant.getId(), cm.provider.getId());
72 List<ContractMatch> egPairMatches = contractMatches.get(consumerKey, providerKey);
73 if (egPairMatches == null) {
74 egPairMatches = new ArrayList<>();
75 contractMatches.put(consumerKey, providerKey, egPairMatches);
78 egPairMatches.add(cm);
83 private static List<ConsumerContractMatch> matchConsumerContracts(Tenant tenant,
84 EndpointGroup consumer) {
85 List<ConsumerContractMatch> matches = new ArrayList<>();
86 if (consumer.getConsumerNamedSelector() != null) {
87 for (ConsumerNamedSelector cns : consumer.getConsumerNamedSelector()) {
88 if (cns.getContract() == null)
90 for (ContractId contractId : cns.getContract()) {
92 TenantUtils.findContract(tenant, contractId);
95 matches.add(new ConsumerContractMatch(tenant, contract,
101 if (consumer.getConsumerTargetSelector() != null) {
102 for (ConsumerTargetSelector cts : consumer.getConsumerTargetSelector()) {
103 if (tenant.getContract() == null)
105 for (Contract contract : tenant.getContract()) {
106 if (contract.getTarget() == null)
108 for (Target t : contract.getTarget()) {
109 boolean match = true;
110 if (cts.getQualityMatcher() != null) {
111 for (QualityMatcher m : cts.getQualityMatcher()) {
112 if (!MatcherUtils.applyQualityMatcher(m, t)) {
119 matches.add(new ConsumerContractMatch(tenant,
129 // TODO match selectors also against contract references
130 // for (ConsumerTargetSelector cts :
131 // consumer.getConsumerTargetSelector()) {
132 // if (tenant.getContractRef() == null) continue;
133 // for (ContractRef c : tenant.getContractRef()) {
140 private static List<ContractMatch> matchProviderContracts(Tenant tenant, EndpointGroup provider,
141 Table<TenantId, ContractId, List<ConsumerContractMatch>> consumerMatches) {
142 List<ContractMatch> matches = new ArrayList<>();
143 if (provider.getProviderNamedSelector() != null) {
144 for (ProviderNamedSelector pns : provider.getProviderNamedSelector()) {
145 if (pns.getContract() == null)
147 for (ContractId contractId : pns.getContract()) {
148 Contract c = TenantUtils.findContract(tenant, contractId);
151 List<ConsumerContractMatch> cMatches = consumerMatches.get(tenant.getId(), c.getId());
152 amendContractMatches(matches, cMatches, tenant, provider, pns);
156 if (provider.getProviderTargetSelector() != null) {
157 for (ProviderTargetSelector pts : provider.getProviderTargetSelector()) {
158 if (tenant.getContract() == null)
160 for (Contract c : tenant.getContract()) {
161 if (c.getTarget() == null)
163 for (Target t : c.getTarget()) {
164 boolean match = true;
165 if (pts.getQualityMatcher() != null) {
166 for (QualityMatcher m : pts.getQualityMatcher()) {
167 if (!MatcherUtils.applyQualityMatcher(m, t)) {
174 List<ConsumerContractMatch> cMatches = consumerMatches.get(tenant.getId(), c.getId());
175 amendContractMatches(matches, cMatches, tenant, provider, pts);
185 private static void amendContractMatches(List<ContractMatch> matches,
186 List<ConsumerContractMatch> cMatches,
187 Tenant tenant, EndpointGroup provider,
188 ProviderSelectionRelator relator) {
189 if (cMatches == null)
191 for (ConsumerContractMatch cMatch : cMatches) {
192 matches.add(new ContractMatch(cMatch, tenant, provider, relator));
197 * Represents a selected contract made by endpoint groups matching it using
198 * selection relators. This is the result of the contract selection phase.
203 protected static class ContractMatch extends ConsumerContractMatch {
206 * The tenant ID of the provider endpoint group
208 final Tenant providerTenant;
211 * The provider endpoint group
213 final EndpointGroup provider;
216 * The provider selection relator that was used to match the contract
218 final ProviderSelectionRelator providerRelator;
220 public ContractMatch(ConsumerContractMatch consumerMatch, Tenant providerTenant, EndpointGroup provider,
221 ProviderSelectionRelator providerRelator) {
222 super(consumerMatch.contractTenant, consumerMatch.contract, consumerMatch.consumerTenant,
223 consumerMatch.consumer, consumerMatch.consumerRelator);
224 this.providerTenant = providerTenant;
225 this.provider = provider;
226 this.providerRelator = providerRelator;
231 protected static class ConsumerContractMatch {
234 * The tenant of the matching contract
236 final Tenant contractTenant;
239 * The matching contract
241 final Contract contract;
244 * The tenant for the endpoint group
246 final Tenant consumerTenant;
249 * The consumer endpoint group
251 final EndpointGroup consumer;
254 * The consumer selection relator that was used to match the contract
256 final ConsumerSelectionRelator consumerRelator;
258 public ConsumerContractMatch(Tenant contractTenant, Contract contract, Tenant consumerTenant,
259 EndpointGroup consumer, ConsumerSelectionRelator consumerRelator) {
261 this.contractTenant = contractTenant;
262 this.contract = contract;
263 this.consumerTenant = consumerTenant;
264 this.consumer = consumer;
265 this.consumerRelator = consumerRelator;