Bump upstreams to 2022.09
[bgpcep.git] / bgp / openconfig-rp-spi / src / main / java / org / opendaylight / protocol / bgp / openconfig / routing / policy / spi / registry / BgpConditionsRegistry.java
1 /*
2  * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
3  *
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
7  */
8 package org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry;
9
10 import com.google.common.base.Preconditions;
11 import java.util.HashMap;
12 import java.util.Map;
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;
31
32 final class BgpConditionsRegistry {
33     @GuardedBy("this")
34     private final Map<Class<? extends Augmentation<BgpConditions>>,
35             BgpConditionsAugmentationPolicy> bgpConditionsAugRegistry = new HashMap<>();
36     @GuardedBy("this")
37     private final Map<Class<? extends ChildOf<BgpMatchConditions>>,
38             BgpConditionsPolicy> bgpConditionsRegistry = new HashMap<>();
39
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() {
49                 @Override
50                 protected void removeRegistration() {
51                     synchronized (bgpConditionsAugRegistry) {
52                         bgpConditionsAugRegistry.remove(conditionPolicyClass);
53                     }
54                 }
55             };
56         }
57     }
58
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() {
68                 @Override
69                 protected void removeRegistration() {
70                     synchronized (bgpConditionsRegistry) {
71                         bgpConditionsRegistry.remove(conditionPolicyClass);
72                     }
73                 }
74             };
75         }
76     }
77
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) {
87
88             final BgpConditions bgpConditions = bgpConditionsAug.getBgpConditions();
89             if (!matchExportCondition(afiSafi, entryInfo, routeEntryExportParameters, attributes,
90                     bgpConditions)) {
91                 return false;
92             }
93             for (final Augmentation<BgpConditions> condition : bgpConditions.augmentations().values()) {
94                 final BgpConditionsAugmentationPolicy handler =
95                     bgpConditionsAugRegistry.get(condition.implementedInterface());
96                 if (handler == null) {
97                     continue;
98                 }
99                 if (!handler.matchExportCondition(afiSafi, entryInfo, routeEntryExportParameters,
100                         handler.getConditionParameter(attributes), condition)) {
101                     return false;
102                 }
103             }
104         }
105         return true;
106     }
107
108
109     boolean matchImportConditions(
110             final AfiSafiType afiSafi,
111             final RouteEntryBaseAttributes entryInfo,
112             final BGPRouteEntryImportParameters routeEntryImportParameters,
113             final Attributes attributes,
114             final Conditions conditions) {
115
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,
121                         bgpConditions)) {
122                     return false;
123                 }
124             }
125             for (final Augmentation<BgpConditions> condition : bgpConditions.augmentations().values()) {
126                 final BgpConditionsAugmentationPolicy handler =
127                     bgpConditionsAugRegistry.get(condition.implementedInterface());
128                 if (handler == null) {
129                     continue;
130                 }
131                 if (!handler.matchImportCondition(afiSafi, entryInfo, routeEntryImportParameters,
132                         handler.getConditionParameter(attributes), condition)) {
133                     return false;
134                 }
135             }
136         }
137         return true;
138     }
139
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) {
147
148         if (!BgpAttributeConditionsUtil.matchConditions(afiSafi, attributes, conditions)) {
149             return false;
150         }
151
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)) {
157                 return false;
158             }
159         }
160
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)) {
166                 return false;
167             }
168         }
169
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)) {
175                 return false;
176             }
177         }
178
179         return true;
180     }
181
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)) {
190             return false;
191         }
192
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)) {
198                 return false;
199             }
200         }
201
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)) {
207                 return false;
208             }
209         }
210
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)) {
216                 return false;
217             }
218         }
219
220         return true;
221     }
222 }