Bug-4827: BGP Add-Path OpenConfig Support
[bgpcep.git] / bgp / rib-impl / src / main / java / org / opendaylight / controller / config / yang / bgp / rib / impl / RIBImplModule.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  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  * Generated file
10
11  * Generated from: yang module name: bgp-rib-impl  yang module local name: rib-impl
12  * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
13  * Generated at: Wed Nov 06 13:02:32 CET 2013
14  *
15  * Do not modify this file unless it is present under src/main directory
16  */
17 package org.opendaylight.controller.config.yang.bgp.rib.impl;
18
19 import java.util.Collections;
20 import java.util.Hashtable;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.stream.Collectors;
24 import org.opendaylight.controller.config.api.JmxAttributeValidationException;
25 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
26 import org.opendaylight.controller.sal.core.api.model.SchemaService;
27 import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
28 import org.opendaylight.protocol.bgp.openconfig.spi.BGPConfigModuleTracker;
29 import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenconfigMapper;
30 import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
31 import org.opendaylight.protocol.bgp.openconfig.spi.pojo.BGPRibInstanceConfiguration;
32 import org.opendaylight.protocol.bgp.rib.impl.RIBImpl;
33 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPBestPathSelection;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
38 import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
39 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
40 import org.osgi.framework.BundleContext;
41
42 /**
43  *
44  */
45 public final class RIBImplModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractRIBImplModule {
46
47     private static final String IS_NOT_SET = "is not set.";
48     private BundleContext bundleContext;
49
50     public RIBImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name,
51             final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
52         super(name, dependencyResolver);
53     }
54
55     public RIBImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name,
56             final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final RIBImplModule oldModule,
57             final java.lang.AutoCloseable oldInstance) {
58         super(name, dependencyResolver, oldModule, oldInstance);
59     }
60
61     @Override
62     public void customValidation() {
63         JmxAttributeValidationException.checkNotNull(getExtensions(), IS_NOT_SET, extensionsJmxAttribute);
64         JmxAttributeValidationException.checkNotNull(getRibId(), IS_NOT_SET, ribIdJmxAttribute);
65         JmxAttributeValidationException.checkNotNull(getLocalAs(), IS_NOT_SET, localAsJmxAttribute);
66         JmxAttributeValidationException.checkNotNull(getBgpRibId(), IS_NOT_SET, bgpRibIdJmxAttribute);
67         JmxAttributeValidationException.checkNotNull(getLocalTable(), IS_NOT_SET, localTableJmxAttribute);
68     }
69
70     @Override
71     public java.lang.AutoCloseable createInstance() {
72         final AsNumber asNumber = new AsNumber(getLocalAs());
73         final Map<TablesKey, PathSelectionMode> pathSelectionStrategies = mapBestPathSelectionStrategyByFamily(getRibPathSelectionModeDependency());
74         final RIBImpl rib = new RIBImpl(getRibId(), asNumber, getBgpRibId(), getClusterId(), getExtensionsDependency(),
75             getBgpDispatcherDependency(), getCodecTreeFactoryDependency(),
76             getDataProviderDependency(), getDomDataProviderDependency(), getLocalTableDependency(), pathSelectionStrategies, classLoadingStrategy(),
77             new RIBImplModuleTracker(getGlobalWriter()), getOpenconfigProviderDependency());
78         registerSchemaContextListener(rib);
79         return rib;
80     }
81
82     private GeneratedClassLoadingStrategy classLoadingStrategy() {
83         return getExtensionsDependency().getClassLoadingStrategy();
84     }
85
86     private void registerSchemaContextListener(final RIBImpl rib) {
87         final DOMDataBroker domBroker = getDomDataProviderDependency();
88         if(domBroker instanceof SchemaService) {
89             ((SchemaService) domBroker).registerSchemaContextListener(rib);
90         } else {
91             // FIXME:Get bundle context and register global schema service from bundle
92             // context.
93             bundleContext.registerService(SchemaContextListener.class, rib, new Hashtable<String,String>());
94         }
95     }
96
97     private Map<TablesKey, PathSelectionMode> mapBestPathSelectionStrategyByFamily(final List<BGPBestPathSelection> bestPathSelectionDependency) {
98         return Collections.unmodifiableMap(bestPathSelectionDependency.stream().collect(
99             Collectors.toMap(st -> new TablesKey(st.getAfi(), st.getSafi()), st -> st.getStrategy())));
100     }
101
102     public void setBundleContext(final BundleContext bundleContext) {
103         this.bundleContext = bundleContext;
104     }
105
106     private BGPOpenconfigMapper<BGPRibInstanceConfiguration> getGlobalWriter() {
107         if (getOpenconfigProviderDependency() != null) {
108             return getOpenconfigProviderDependency().getOpenConfigMapper(BGPRibInstanceConfiguration.class);
109         }
110         return null;
111     }
112
113     private final class RIBImplModuleTracker implements BGPConfigModuleTracker {
114
115         private final BGPOpenconfigMapper<BGPRibInstanceConfiguration> globalWriter;
116         private final BGPRibInstanceConfiguration bgpRibConfig;
117
118         public RIBImplModuleTracker(final BGPOpenconfigMapper<BGPRibInstanceConfiguration> globalWriter) {
119             this.globalWriter = globalWriter;
120             final InstanceConfigurationIdentifier identifier = new InstanceConfigurationIdentifier(getIdentifier().getInstanceName());
121             final List<BgpTableType> tableDependency = getLocalTableDependency();
122             final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber as = Rev130715Util.getASNumber(getLocalAs());
123             final Ipv4Address bgpRibId = Rev130715Util.getIpv4Address(getBgpRibId());
124             final Ipv4Address clusterId = Rev130715Util.getIpv4Address(getClusterId());
125             this.bgpRibConfig = new BGPRibInstanceConfiguration(identifier, as, bgpRibId, clusterId, tableDependency,
126                     mapBestPathSelectionStrategyByFamily(getRibPathSelectionModeDependency()));
127         }
128
129         @Override
130         public void onInstanceCreate() {
131             if (globalWriter != null) {
132                 globalWriter.writeConfiguration(this.bgpRibConfig);
133             }
134         }
135
136         @Override
137         public void onInstanceClose() {
138             if (globalWriter != null) {
139                 globalWriter.removeConfiguration(this.bgpRibConfig);
140             }
141         }
142
143     }
144
145
146 }