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
9 package org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry;
11 import com.google.common.base.Preconditions;
12 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
13 import java.util.HashMap;
15 import javax.annotation.concurrent.GuardedBy;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.RouteEntryBaseAttributes;
18 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condition.BgpConditionsAugmentationPolicy;
19 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condition.BgpConditionsPolicy;
20 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.condition.ConditionsAugPolicy;
21 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryExportParameters;
22 import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRouteEntryImportParameters;
23 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.BgpMatchConditions;
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.routing.policy.rev151009.routing.policy.top.routing.policy.policy.definitions.policy.definition.statements.statement.Conditions;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.Attributes;
27 import org.opendaylight.yangtools.concepts.AbstractRegistration;
28 import org.opendaylight.yangtools.yang.binding.Augmentation;
29 import org.opendaylight.yangtools.yang.binding.ChildOf;
30 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
32 @SuppressFBWarnings("NM_CONFUSING")
33 final class ConditionsRegistryImpl {
35 private final Map<Class<? extends Augmentation<Conditions>>, ConditionsAugPolicy> conditionsRegistry
37 private final GenericConditionPolicyHandler genericConditionHandler;
38 private BgpConditionsRegistry bgpConditionsRegistry = new BgpConditionsRegistry();
40 ConditionsRegistryImpl(final DataBroker databroker) {
41 this.genericConditionHandler = new GenericConditionPolicyHandler(databroker);
44 AbstractRegistration registerConditionPolicy(final Class<? extends Augmentation<Conditions>> conditionPolicyClass,
45 final ConditionsAugPolicy conditionPolicy) {
46 synchronized (this.conditionsRegistry) {
47 final ConditionsAugPolicy prev = this.conditionsRegistry.putIfAbsent(conditionPolicyClass, conditionPolicy);
48 Preconditions.checkState(prev == null, "Condition Policy %s already registered %s",
49 conditionPolicyClass, prev);
50 return new AbstractRegistration() {
52 protected void removeRegistration() {
53 synchronized (ConditionsRegistryImpl.this.conditionsRegistry) {
54 ConditionsRegistryImpl.this.conditionsRegistry.remove(conditionPolicyClass);
61 public AbstractRegistration registerBgpConditionsAugmentationPolicy(
62 final Class<? extends Augmentation<BgpConditions>> conditionPolicyClass,
63 final BgpConditionsAugmentationPolicy conditionPolicy) {
64 return this.bgpConditionsRegistry
65 .registerBgpConditionsAugmentationPolicy(conditionPolicyClass, conditionPolicy);
68 public <T extends ChildOf<BgpMatchConditions>, N> AbstractRegistration registerBgpConditionsPolicy(
69 final Class<T> conditionPolicyClass,
70 final BgpConditionsPolicy<T, N> conditionPolicy) {
71 return this.bgpConditionsRegistry
72 .registerBgpConditionsPolicy(conditionPolicyClass, conditionPolicy);
75 @SuppressWarnings("unchecked")
76 boolean matchExportConditions(
77 final RouteEntryBaseAttributes entryInfo,
78 final BGPRouteEntryExportParameters routeEntryExportParameters,
79 final Attributes attributes,
80 final Conditions conditions) {
81 if (!this.genericConditionHandler
82 .matchExportCondition(routeEntryExportParameters, conditions)) {
86 if (!this.bgpConditionsRegistry
87 .matchExportConditions(entryInfo, routeEntryExportParameters, attributes, conditions)) {
91 final Map<Class<? extends Augmentation<?>>, Augmentation<?>> conditionsAug = BindingReflections
92 .getAugmentations(conditions);
94 if (conditionsAug != null) {
95 for (final Map.Entry<Class<? extends Augmentation<?>>, Augmentation<?>> entry : conditionsAug.entrySet()) {
96 final ConditionsAugPolicy handler = this.conditionsRegistry.get(entry.getKey());
97 if (handler == null) {
100 if (!handler.matchExportCondition(entryInfo, routeEntryExportParameters,
101 handler.getConditionParameter(attributes), entry.getValue())) {
110 @SuppressWarnings("unchecked")
111 boolean matchImportConditions(
112 final RouteEntryBaseAttributes entryInfo,
113 final BGPRouteEntryImportParameters routeEntryImportParameters,
114 final Attributes attributes,
115 final Conditions conditions) {
116 if (!this.genericConditionHandler
117 .matchImportCondition(routeEntryImportParameters, conditions)) {
121 if (!this.bgpConditionsRegistry
122 .matchImportConditions(entryInfo, routeEntryImportParameters, attributes, conditions)) {
126 final Map<Class<? extends Augmentation<?>>, Augmentation<?>> conditionsAug = BindingReflections
127 .getAugmentations(conditions);
129 if (conditionsAug != null && attributes != null) {
130 for (final Map.Entry<Class<? extends Augmentation<?>>, Augmentation<?>> entry : conditionsAug.entrySet()) {
131 final ConditionsAugPolicy handler = this.conditionsRegistry.get(entry.getKey());
132 if (handler != null) {
133 final Augmentation<Conditions> conditionConfig = (Augmentation<Conditions>) entry.getValue();
134 if (!handler.matchImportCondition(entryInfo, routeEntryImportParameters,
135 handler.getConditionParameter(attributes), conditionConfig)) {