2 * Copyright (c) 2015 Huawei Technologies and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.groupbasedpolicy.util;
10 import java.util.ArrayList;
11 import java.util.Collection;
12 import java.util.HashSet;
13 import java.util.List;
15 import java.util.concurrent.ConcurrentMap;
17 import com.google.common.annotations.VisibleForTesting;
18 import org.opendaylight.groupbasedpolicy.dto.ConditionSet;
19 import org.opendaylight.groupbasedpolicy.dto.EgKey;
20 import org.opendaylight.groupbasedpolicy.dto.EndpointConstraint;
21 import org.opendaylight.groupbasedpolicy.dto.IndexedTenant;
22 import org.opendaylight.groupbasedpolicy.dto.Policy;
23 import org.opendaylight.groupbasedpolicy.dto.RuleGroup;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ActionName;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierName;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.action.refs.ActionRef;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRef;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRef.ConnectionTracking;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.endpoint.identification.constraints.EndpointIdentificationConstraints;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.endpoint.identification.constraints.EndpointIdentificationConstraintsBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.endpoint.identification.constraints.endpoint.identification.constraints.L3EndpointIdentificationConstraintsBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.endpoint.identification.constraints.endpoint.identification.constraints.l3.endpoint.identification.constraints.PrefixConstraint;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.Rule;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ActionInstance;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstance;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.Action;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.ActionBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.ActionKey;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.Classifier;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.ClassifierBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.ClassifierKey;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.endpoint.conditions.EndpointConditions;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.endpoint.conditions.EndpointConditionsBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.endpoint.conditions.endpoint.conditions.AllCondition;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.endpoint.conditions.endpoint.conditions.AllConditionBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.endpoint.conditions.endpoint.conditions.AnyCondition;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.endpoint.conditions.endpoint.conditions.AnyConditionBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.endpoint.conditions.endpoint.conditions.NoneCondition;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.endpoint.conditions.endpoint.conditions.NoneConditionBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRule;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRuleBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRuleKey;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicy;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicy.ExternalImplicitGroup;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicyBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.PolicyRuleGroupWithEndpointConstraints;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.PolicyRuleGroupWithEndpointConstraintsBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.ConsumerEndpointConstraintsBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroup;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroupBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.ProviderEndpointConstraintsBuilder;
66 import org.slf4j.Logger;
67 import org.slf4j.LoggerFactory;
69 import com.google.common.collect.Table;
70 import com.google.common.collect.Table.Cell;
72 public class PolicyInfoUtils {
73 private static final Logger LOG = LoggerFactory.getLogger(PolicyInfoUtils.class);
74 private PolicyInfoUtils() {
75 throw new UnsupportedOperationException("Cannot create an instance");
78 public static List<ResolvedPolicy> buildResolvedPolicy(Table<EgKey, EgKey, Policy> policyMap,
79 ConcurrentMap<TenantId, IndexedTenant> resolvedTenants) {
80 List<ResolvedPolicy> resolvedPolicies = new ArrayList<>();
81 for (Cell<EgKey, EgKey, Policy> policyCell : policyMap.cellSet()) {
82 ResolvedPolicyBuilder resolvedPolicyBuilder = new ResolvedPolicyBuilder();
83 resolvedPolicyBuilder.setConsumerEpgId(policyCell.getRowKey().getEgId());
84 resolvedPolicyBuilder.setConsumerTenantId(policyCell.getRowKey().getTenantId());
85 resolvedPolicyBuilder.setProviderEpgId(policyCell.getColumnKey().getEgId());
86 resolvedPolicyBuilder.setProviderTenantId(policyCell.getColumnKey().getTenantId());
87 resolvedPolicyBuilder.setPolicyRuleGroupWithEndpointConstraints(
88 buildPolicyRuleGroupWithEndpointConstraints(policyCell.getValue()));
89 Tenant consTenant = resolvedTenants.get(policyCell.getRowKey().getTenantId()).getTenant();
90 Tenant provTenant = resolvedTenants.get(policyCell.getColumnKey().getTenantId()).getTenant();
91 if (isExternalImplicitGroup(consTenant, policyCell.getRowKey().getEgId())) {
92 resolvedPolicyBuilder.setExternalImplicitGroup(ExternalImplicitGroup.ConsumerEpg);
93 } else if (isExternalImplicitGroup(provTenant, policyCell.getColumnKey().getEgId())) {
94 resolvedPolicyBuilder.setExternalImplicitGroup(ExternalImplicitGroup.ProviderEpg);
96 resolvedPolicies.add(resolvedPolicyBuilder.build());
98 return resolvedPolicies;
101 private static boolean isExternalImplicitGroup(Tenant tenant, EndpointGroupId epgId) {
102 if (tenant == null || epgId == null || tenant.getPolicy() == null
103 || tenant.getPolicy().getExternalImplicitGroup() == null) {
106 LOG.trace("Found External EPGs in Tenant {}", tenant.getId().getValue());
107 for (org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.ExternalImplicitGroup eig : tenant.getPolicy()
108 .getExternalImplicitGroup()) {
109 if (eig.getId().equals(epgId)) {
110 LOG.trace("EPG {} is External Implicit Group", epgId.getValue());
114 LOG.trace("EPG {} is NOT External Implicit Group", epgId.getValue());
118 private static List<PolicyRuleGroupWithEndpointConstraints> buildPolicyRuleGroupWithEndpointConstraints(
120 List<PolicyRuleGroupWithEndpointConstraints> policyRuleGroupWithEndpointConstraintsList = new ArrayList<>();
121 for (Cell<EndpointConstraint, EndpointConstraint, List<RuleGroup>> ruleGrpsWECCell : policy.getRuleMap()
123 PolicyRuleGroupWithEndpointConstraintsBuilder policyRuleGroupWithEndpointConstraintsBuilder =
124 new PolicyRuleGroupWithEndpointConstraintsBuilder();
127 EndpointConditions consConditionSet = buildConditionSet(ruleGrpsWECCell.getRowKey().getConditionSet());
128 EndpointIdentificationConstraints consEndpointIdentificationConstraints =
129 buildEndpointIdentificationConstraints(ruleGrpsWECCell.getRowKey());
130 ConsumerEndpointConstraintsBuilder consumerEndpointConstraintsBuilder =
131 new ConsumerEndpointConstraintsBuilder();
133 if (consConditionSet != null) {
134 consumerEndpointConstraintsBuilder.setEndpointConditions(consConditionSet);
136 if (consEndpointIdentificationConstraints != null) {
137 consumerEndpointConstraintsBuilder
138 .setEndpointIdentificationConstraints(consEndpointIdentificationConstraints);
140 if (consConditionSet != null || consEndpointIdentificationConstraints != null) {
141 policyRuleGroupWithEndpointConstraintsBuilder
142 .setConsumerEndpointConstraints(consumerEndpointConstraintsBuilder.build());
146 EndpointConditions provConditionSet = buildConditionSet(ruleGrpsWECCell.getColumnKey().getConditionSet());
147 EndpointIdentificationConstraints provEndpointIdentificationConstraints =
148 buildEndpointIdentificationConstraints(ruleGrpsWECCell.getColumnKey());
149 ProviderEndpointConstraintsBuilder providerEndpointConstraintsBuilder =
150 new ProviderEndpointConstraintsBuilder();
152 if (provConditionSet != null) {
153 providerEndpointConstraintsBuilder.setEndpointConditions(provConditionSet);
155 if (provEndpointIdentificationConstraints != null) {
156 providerEndpointConstraintsBuilder
157 .setEndpointIdentificationConstraints(provEndpointIdentificationConstraints);
159 if (provConditionSet != null || provEndpointIdentificationConstraints != null) {
160 policyRuleGroupWithEndpointConstraintsBuilder
161 .setProviderEndpointConstraints(providerEndpointConstraintsBuilder.build());
165 List<PolicyRuleGroup> policyRuleGroups = new ArrayList<>();
166 for (RuleGroup ruleGrp : ruleGrpsWECCell.getValue()) {
167 PolicyRuleGroupBuilder policyRuleGroupBuilder = new PolicyRuleGroupBuilder();
168 policyRuleGroupBuilder.setContractId(ruleGrp.getRelatedContract().getId());
169 policyRuleGroupBuilder.setSubjectName(ruleGrp.getRelatedSubject());
170 policyRuleGroupBuilder.setTenantId(ruleGrp.getContractTenant().getId());
171 policyRuleGroupBuilder.setOrder(ruleGrp.getOrder());
172 policyRuleGroupBuilder
173 .setResolvedRule(buildResolvedRules(ruleGrp.getRules(), ruleGrp.getContractTenant()));
174 policyRuleGroups.add(policyRuleGroupBuilder.build());
176 policyRuleGroupWithEndpointConstraintsBuilder.setPolicyRuleGroup(policyRuleGroups);
178 // add policy group with EP constraints
179 policyRuleGroupWithEndpointConstraintsList.add(policyRuleGroupWithEndpointConstraintsBuilder.build());
181 return policyRuleGroupWithEndpointConstraintsList;
185 static List<ResolvedRule> buildResolvedRules(List<Rule> rules, Tenant tenant) {
189 List<ResolvedRule> resolvedRules = new ArrayList<>();
190 for (Rule rule : rules) {
191 ResolvedRuleBuilder resolvedRuleBuilder = new ResolvedRuleBuilder();
192 resolvedRuleBuilder.setOrder(rule.getOrder());
193 resolvedRuleBuilder.setName(rule.getName());
194 resolvedRuleBuilder.setKey(new ResolvedRuleKey(rule.getName()));
196 List<Classifier> classifiers = new ArrayList<>();
197 for (ClassifierRef cls : rule.getClassifierRef()) {
198 ClassifierBuilder classifierBuilder = new ClassifierBuilder();
199 classifierBuilder.setConnectionTracking(convertConnectionTracking(cls.getConnectionTracking()));
200 classifierBuilder.setDirection(cls.getDirection());
201 classifierBuilder.setKey(new ClassifierKey(cls.getName()));
202 classifierBuilder.setName(cls.getName());
203 ClassifierInstance classifierInstance = readClassifierInstance(tenant, cls.getInstanceName());
204 if (classifierInstance != null) {
205 classifierBuilder.setClassifierDefinitionId(classifierInstance.getClassifierDefinitionId());
206 classifierBuilder.setParameterValue(classifierInstance.getParameterValue());
208 classifiers.add(classifierBuilder.build());
210 resolvedRuleBuilder.setClassifier(classifiers);
212 List<Action> actions = new ArrayList<>();
213 for (ActionRef act : rule.getActionRef()) {
214 ActionBuilder actionBuilder = new ActionBuilder();
215 actionBuilder.setName(act.getName());
216 actionBuilder.setKey(new ActionKey(act.getName()));
217 actionBuilder.setOrder(act.getOrder());
218 ActionInstance actionInstance = readActionInstance(tenant, act.getName());
219 if (actionInstance != null) {
220 actionBuilder.setActionDefinitionId(actionInstance.getActionDefinitionId());
221 actionBuilder.setParameterValue(actionInstance.getParameterValue());
223 actions.add(actionBuilder.build());
225 resolvedRuleBuilder.setAction(actions);
228 resolvedRules.add(resolvedRuleBuilder.build());
230 return resolvedRules;
233 private static org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.Classifier.ConnectionTracking convertConnectionTracking(
234 ConnectionTracking connectionTracking) {
235 if (connectionTracking == null) {
238 return org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.Classifier.ConnectionTracking
239 .forValue(connectionTracking.getIntValue());
242 private static ClassifierInstance readClassifierInstance(Tenant tenant, ClassifierName instanceName) {
243 if (tenant.getPolicy() == null || tenant.getPolicy().getSubjectFeatureInstances() == null
244 || tenant.getPolicy().getSubjectFeatureInstances().getClassifierInstance() == null) {
247 for (ClassifierInstance instance : tenant.getPolicy().getSubjectFeatureInstances().getClassifierInstance()) {
248 if (instance.getName().equals(instanceName)) {
255 private static ActionInstance readActionInstance(Tenant tenant, ActionName instanceName) {
256 if (tenant.getPolicy() == null || tenant.getPolicy().getSubjectFeatureInstances() == null
257 || tenant.getPolicy().getSubjectFeatureInstances().getActionInstance() == null) {
260 for (ActionInstance instance : tenant.getPolicy().getSubjectFeatureInstances().getActionInstance()) {
261 if (instance.getName().equals(instanceName)) {
268 private static EndpointIdentificationConstraints buildEndpointIdentificationConstraints(
269 EndpointConstraint endpointConstraint) {
270 if (isNullOrEmpty(endpointConstraint.getL3EpPrefixes())) {
273 List<PrefixConstraint> prefixConstraints = new ArrayList<>();
274 prefixConstraints.addAll(endpointConstraint.getL3EpPrefixes());
275 L3EndpointIdentificationConstraintsBuilder l3EndpointIdentificationConstraintsBuilder =
276 new L3EndpointIdentificationConstraintsBuilder();
277 l3EndpointIdentificationConstraintsBuilder.setPrefixConstraint(prefixConstraints);
278 EndpointIdentificationConstraintsBuilder endpointIdentificationConstraintsBuilder =
279 new EndpointIdentificationConstraintsBuilder();
280 endpointIdentificationConstraintsBuilder
281 .setL3EndpointIdentificationConstraints(l3EndpointIdentificationConstraintsBuilder.build());
282 return endpointIdentificationConstraintsBuilder.build();
285 private static EndpointConditions buildConditionSet(ConditionSet conditionSet) {
286 EndpointConditionsBuilder endpointConditionsBuilder = new EndpointConditionsBuilder();
288 if (isNullOrEmpty(conditionSet.getTypeAll()) && isNullOrEmpty(conditionSet.getTypeAny())
289 && isNullOrEmpty(conditionSet.getTypeNone())) {
293 if (!isNullOrEmpty(conditionSet.getTypeAll())) {
294 List<AllCondition> allConditions = new ArrayList<>();
295 for (ConditionName c : conditionSet.getTypeAll()) {
296 AllConditionBuilder allConditionBuilder = new AllConditionBuilder();
297 allConditionBuilder.setName(c);
298 allConditions.add(allConditionBuilder.build());
300 endpointConditionsBuilder.setAllCondition(allConditions);
302 if (!isNullOrEmpty(conditionSet.getTypeNone())) {
303 List<NoneCondition> noneConditions = new ArrayList<>();
304 for (ConditionName c : conditionSet.getTypeNone()) {
305 NoneConditionBuilder noneConditionBuilder = new NoneConditionBuilder();
306 noneConditionBuilder.setName(c);
307 noneConditions.add(noneConditionBuilder.build());
309 endpointConditionsBuilder.setNoneCondition(noneConditions);
311 if (!isNullOrEmpty(conditionSet.getTypeAny())) {
312 Set<ConditionName> typeAnyMergedSet = new HashSet<>();
313 for (Set<ConditionName> cSet : conditionSet.getTypeAny()) {
314 typeAnyMergedSet.addAll(cSet);
316 List<AnyCondition> anyConditions = new ArrayList<>();
317 for (ConditionName c : typeAnyMergedSet) {
318 AnyConditionBuilder anyConditionBuilder = new AnyConditionBuilder();
319 anyConditionBuilder.setName(c);
320 anyConditions.add(anyConditionBuilder.build());
322 endpointConditionsBuilder.setAnyCondition(anyConditions);
325 return endpointConditionsBuilder.build();
328 private static <T> boolean isNullOrEmpty(Collection<T> collection) {
329 return (collection == null || collection.isEmpty());