MVPN RFC6514 Extendend communities
[bgpcep.git] / bgp / openconfig-rp-spi / src / main / java / org / opendaylight / protocol / bgp / openconfig / routing / policy / spi / registry / StatementRegistry.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
9 package org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry;
10
11 import static org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.registry.RouteAttributeContainer.routeAttributeContainerTrue;
12
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.RouteEntryBaseAttributes;
15 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.action.ActionsAugPolicy;
16 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.action.BgpActionAugPolicy;
17 import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.policy.action.BgpActionPolicy;
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.actions.BgpActions;
25 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.policy.definitions.policy.definition.statements.statement.conditions.BgpConditions;
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;
27 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.routing.policy.rev151009.routing.policy.top.routing.policy.policy.definitions.policy.definition.statements.statement.Actions;
28 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;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.Attributes;
30 import org.opendaylight.yangtools.concepts.AbstractRegistration;
31 import org.opendaylight.yangtools.yang.binding.Augmentation;
32 import org.opendaylight.yangtools.yang.binding.ChildOf;
33
34 public final class StatementRegistry implements StatementRegistryConsumer, StatementRegistryProvider {
35     private final ConditionsRegistryImpl conditionsRegistry;
36     private final ActionsRegistryImpl actionsRegistry;
37
38     public StatementRegistry(final DataBroker databroker) {
39         this.conditionsRegistry = new ConditionsRegistryImpl(databroker);
40         this.actionsRegistry = new ActionsRegistryImpl();
41     }
42
43     @Override
44     public RouteAttributeContainer applyExportStatement(
45             final RouteEntryBaseAttributes routeEntryInfo,
46             final BGPRouteEntryExportParameters routeEntryExportParameters,
47             final RouteAttributeContainer attributes,
48             final Statement statement) {
49         final Attributes att = attributes.getAttributes();
50         if (att == null || !this.conditionsRegistry.matchExportConditions(
51                 routeEntryInfo,
52                 routeEntryExportParameters,
53                 att,
54                 statement.getConditions())) {
55             return attributes;
56         }
57         return routeAttributeContainerTrue(this.actionsRegistry.applyExportAction(
58                 routeEntryInfo,
59                 routeEntryExportParameters,
60                 attributes.getAttributes(),
61                 statement.getActions()));
62     }
63
64     @Override
65     public RouteAttributeContainer applyImportStatement(
66             final RouteEntryBaseAttributes routeEntryInfo,
67             final BGPRouteEntryImportParameters routeEntryImportParameters,
68             final RouteAttributeContainer attributes,
69             final Statement statement) {
70         final Attributes att = attributes.getAttributes();
71         if (att == null || !this.conditionsRegistry.matchImportConditions(
72                 routeEntryInfo,
73                 routeEntryImportParameters,
74                 attributes.getAttributes(),
75                 statement.getConditions())) {
76             return attributes;
77         }
78         return routeAttributeContainerTrue(this.actionsRegistry.applyImportAction(
79                 routeEntryInfo,
80                 routeEntryImportParameters,
81                 att,
82                 statement.getActions()));
83     }
84
85     @Override
86     public AbstractRegistration registerConditionPolicy(
87             final Class<? extends Augmentation<Conditions>> conditionPolicyClass,
88             final ConditionsAugPolicy conditionPolicy) {
89         return this.conditionsRegistry.registerConditionPolicy(conditionPolicyClass, conditionPolicy);
90     }
91
92     @Override
93     public <T extends ChildOf<BgpMatchConditions>, N> AbstractRegistration registerBgpConditionsPolicy(
94             final Class<T> conditionPolicyClass,
95             final BgpConditionsPolicy<T, N> conditionPolicy) {
96         return this.conditionsRegistry.registerBgpConditionsPolicy(conditionPolicyClass, conditionPolicy);
97     }
98
99     @Override
100     public AbstractRegistration registerActionPolicy(
101             final Class<? extends Augmentation<Actions>> actionPolicyClass,
102             final ActionsAugPolicy actionPolicy) {
103         return this.actionsRegistry.registerActionPolicy(actionPolicyClass, actionPolicy);
104     }
105
106     @Override
107     public <T extends Augmentation<BgpConditions>, N> AbstractRegistration registerBgpConditionsAugmentationPolicy(
108             final Class<T> conditionPolicyClass,
109             final BgpConditionsAugmentationPolicy<T, N> conditionPolicy) {
110         return this.conditionsRegistry.registerBgpConditionsAugmentationPolicy(conditionPolicyClass, conditionPolicy);
111     }
112
113     @Override
114     public <T extends Augmentation<BgpActions>> AbstractRegistration registerBgpActionAugmentationPolicy(
115             final Class<T> bgpActionPolicyClass,
116             final BgpActionAugPolicy<T> bgpActionPolicy) {
117         return this.actionsRegistry.registerBgpActionAugmentationPolicy(bgpActionPolicyClass, bgpActionPolicy);
118     }
119
120     @Override
121     public <T extends ChildOf<BgpActions>> AbstractRegistration registerBgpActionPolicy(
122             final Class<T> bgpActionPolicyClass,
123             final BgpActionPolicy<T> bgpActionPolicy) {
124         return this.actionsRegistry.registerBgpActionPolicy(bgpActionPolicyClass, bgpActionPolicy);
125     }
126 }