2 * Copyright (c) 2018 AT&T Intellectual Property. 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.protocol.bgp.openconfig.routing.policy.spi.registry;
10 import com.google.common.base.Preconditions;
11 import java.util.HashMap;
13 import org.checkerframework.checker.lock.qual.GuardedBy;
14 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.RouteEntryBaseAttributes;
15 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condition.BgpConditionsAugmentationPolicy;
16 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condition.BgpConditionsPolicy;
17 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
18 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
19 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.BgpMatchConditions;
20 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.Conditions1;
21 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.bgp.match.conditions.MatchAsPathSet;
22 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.bgp.match.conditions.MatchCommunitySet;
23 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.bgp.match.conditions.MatchExtCommunitySet;
24 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.policy.definitions.policy.definition.statements.statement.conditions.BgpConditions;
25 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
26 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.policy.definitions.policy.definition.statements.statement.Conditions;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.path.attributes.Attributes;
28 import org.opendaylight.yangtools.concepts.AbstractRegistration;
29 import org.opendaylight.yangtools.yang.binding.Augmentation;
30 import org.opendaylight.yangtools.yang.binding.ChildOf;
32 final class BgpConditionsRegistry {
34 private final Map<Class<? extends Augmentation<BgpConditions>>,
35 BgpConditionsAugmentationPolicy> bgpConditionsAugRegistry = new HashMap<>();
37 private final Map<Class<? extends ChildOf<BgpMatchConditions>>,
38 BgpConditionsPolicy> bgpConditionsRegistry = new HashMap<>();
40 AbstractRegistration registerBgpConditionsAugmentationPolicy(
41 final Class<? extends Augmentation<BgpConditions>> conditionPolicyClass,
42 final BgpConditionsAugmentationPolicy conditionPolicy) {
43 synchronized (bgpConditionsAugRegistry) {
44 final BgpConditionsAugmentationPolicy prev
45 = bgpConditionsAugRegistry.putIfAbsent(conditionPolicyClass, conditionPolicy);
46 Preconditions.checkState(prev == null, "Condition Policy %s already registered %s",
47 conditionPolicyClass, prev);
48 return new AbstractRegistration() {
50 protected void removeRegistration() {
51 synchronized (bgpConditionsAugRegistry) {
52 bgpConditionsAugRegistry.remove(conditionPolicyClass);
59 <T extends ChildOf<BgpMatchConditions>, N> AbstractRegistration registerBgpConditionsPolicy(
60 final Class<T> conditionPolicyClass,
61 final BgpConditionsPolicy<T, N> conditionPolicy) {
62 synchronized (bgpConditionsRegistry) {
63 final BgpConditionsPolicy prev
64 = bgpConditionsRegistry.putIfAbsent(conditionPolicyClass, conditionPolicy);
65 Preconditions.checkState(prev == null, "Condition Policy %s already registered %s",
66 conditionPolicyClass, prev);
67 return new AbstractRegistration() {
69 protected void removeRegistration() {
70 synchronized (bgpConditionsRegistry) {
71 bgpConditionsRegistry.remove(conditionPolicyClass);
78 @SuppressWarnings("unchecked")
79 boolean matchExportConditions(
80 final AfiSafiType afiSafi,
81 final RouteEntryBaseAttributes entryInfo,
82 final BGPRouteEntryExportParameters routeEntryExportParameters,
83 final Attributes attributes,
84 final Conditions conditions) {
85 final Conditions1 bgpConditionsAug = conditions.augmentation(Conditions1.class);
86 if (bgpConditionsAug != null) {
88 final BgpConditions bgpConditions = bgpConditionsAug.getBgpConditions();
89 if (!matchExportCondition(afiSafi, entryInfo, routeEntryExportParameters, attributes,
93 for (final Augmentation<BgpConditions> condition : bgpConditions.augmentations().values()) {
94 final BgpConditionsAugmentationPolicy handler =
95 bgpConditionsAugRegistry.get(condition.implementedInterface());
96 if (handler == null) {
99 if (!handler.matchExportCondition(afiSafi, entryInfo, routeEntryExportParameters,
100 handler.getConditionParameter(attributes), condition)) {
109 boolean matchImportConditions(
110 final AfiSafiType afiSafi,
111 final RouteEntryBaseAttributes entryInfo,
112 final BGPRouteEntryImportParameters routeEntryImportParameters,
113 final Attributes attributes,
114 final Conditions conditions) {
116 final Conditions1 bgpConditionsAug = conditions.augmentation(Conditions1.class);
117 if (bgpConditionsAug != null) {
118 final BgpConditions bgpConditions = bgpConditionsAug.getBgpConditions();
119 synchronized (this) {
120 if (!matchImportCondition(afiSafi, entryInfo, routeEntryImportParameters, attributes,
125 for (final Augmentation<BgpConditions> condition : bgpConditions.augmentations().values()) {
126 final BgpConditionsAugmentationPolicy handler =
127 bgpConditionsAugRegistry.get(condition.implementedInterface());
128 if (handler == null) {
131 if (!handler.matchImportCondition(afiSafi, entryInfo, routeEntryImportParameters,
132 handler.getConditionParameter(attributes), condition)) {
140 @SuppressWarnings("unchecked")
141 private boolean matchImportCondition(
142 final AfiSafiType afiSafi,
143 final RouteEntryBaseAttributes routeEntryInfo,
144 final BGPRouteEntryImportParameters routeEntryImportParameters,
145 final Attributes attributes,
146 final BgpConditions conditions) {
148 if (!BgpAttributeConditionsUtil.matchConditions(afiSafi, attributes, conditions)) {
152 final MatchCommunitySet matchCond = conditions.getMatchCommunitySet();
153 if (matchCond != null) {
154 final BgpConditionsPolicy handler = bgpConditionsRegistry.get(MatchCommunitySet.class);
155 if (!handler.matchImportCondition(afiSafi, routeEntryInfo, routeEntryImportParameters,
156 handler.getConditionParameter(attributes), matchCond)) {
161 final MatchAsPathSet matchAsPathSet = conditions.getMatchAsPathSet();
162 if (matchCond != null) {
163 final BgpConditionsPolicy handler = bgpConditionsRegistry.get(MatchAsPathSet.class);
164 if (!handler.matchImportCondition(afiSafi, routeEntryInfo, routeEntryImportParameters,
165 handler.getConditionParameter(attributes), matchAsPathSet)) {
170 final MatchExtCommunitySet matchExtCommSet = conditions.getMatchExtCommunitySet();
171 if (matchExtCommSet != null) {
172 final BgpConditionsPolicy handler = bgpConditionsRegistry.get(MatchAsPathSet.class);
173 if (!handler.matchImportCondition(afiSafi, routeEntryInfo, routeEntryImportParameters,
174 handler.getConditionParameter(attributes), matchExtCommSet)) {
182 @SuppressWarnings("unchecked")
183 private boolean matchExportCondition(
184 final AfiSafiType afiSafi,
185 final RouteEntryBaseAttributes routeEntryInfo,
186 final BGPRouteEntryExportParameters routeEntryExportParameters,
187 final Attributes attributes,
188 final BgpConditions conditions) {
189 if (!BgpAttributeConditionsUtil.matchConditions(afiSafi, attributes, conditions)) {
193 final MatchCommunitySet matchCond = conditions.getMatchCommunitySet();
194 if (matchCond != null) {
195 final BgpConditionsPolicy handler = bgpConditionsRegistry.get(MatchCommunitySet.class);
196 if (!handler.matchExportCondition(afiSafi, routeEntryInfo, routeEntryExportParameters,
197 handler.getConditionParameter(attributes), matchCond)) {
202 final MatchAsPathSet matchAsPathSet = conditions.getMatchAsPathSet();
203 if (matchAsPathSet != null) {
204 final BgpConditionsPolicy handler = bgpConditionsRegistry.get(MatchAsPathSet.class);
205 if (!handler.matchExportCondition(afiSafi, routeEntryInfo, routeEntryExportParameters,
206 handler.getConditionParameter(attributes), matchAsPathSet)) {
211 final MatchExtCommunitySet matchExtCommSet = conditions.getMatchExtCommunitySet();
212 if (matchExtCommSet != null) {
213 final BgpConditionsPolicy handler = bgpConditionsRegistry.get(MatchExtCommunitySet.class);
214 if (!handler.matchExportCondition(afiSafi, routeEntryInfo, routeEntryExportParameters,
215 handler.getConditionParameter(attributes), matchExtCommSet)) {