Convert yangtools binding APIs to mdsal bindings
[bgpcep.git] / bgp / rib-impl / src / main / java / org / opendaylight / protocol / bgp / rib / impl / config / RibImpl.java
1 /*
2  * Copyright (c) 2016 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 package org.opendaylight.protocol.bgp.rib.impl.config;
10
11 import com.google.common.base.Optional;
12 import com.google.common.base.Preconditions;
13 import java.util.Map;
14 import java.util.Set;
15 import java.util.stream.Collectors;
16 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
17 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
18 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
19 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
20 import org.opendaylight.controller.sal.core.api.model.SchemaService;
21 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
22 import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
23 import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
24 import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigProvider;
25 import org.opendaylight.protocol.bgp.rib.impl.RIBImpl;
26 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
27 import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry;
28 import org.opendaylight.protocol.bgp.rib.impl.spi.ImportPolicyPeerTracker;
29 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
30 import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
31 import org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl.BGPRenderStats;
32 import org.opendaylight.protocol.bgp.rib.spi.CacheDisconnectedPeers;
33 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
34 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
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.RibId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
43 import org.opendaylight.yangtools.concepts.ListenerRegistration;
44 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
45 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
46 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
47 import org.osgi.framework.ServiceRegistration;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50
51 public final class RibImpl implements RIB, AutoCloseable {
52
53     private static final Logger LOG = LoggerFactory.getLogger(RibImpl.class);
54
55     private final RIBExtensionConsumerContext extensions;
56     private final BGPDispatcher dispatcher;
57     private final BindingCodecTreeFactory codecTreeFactory;
58     private final DOMDataBroker domBroker;
59     private final SchemaService schemaService;
60     private RIBImpl ribImpl;
61     private ServiceRegistration<?> serviceRegistration;
62     private ListenerRegistration<SchemaContextListener> schemaContextRegistration;
63
64     @SuppressWarnings("deprecation")
65     public RibImpl(final RIBExtensionConsumerContext contextProvider, final BGPDispatcher dispatcher,
66             final BindingCodecTreeFactory codecTreeFactory, final DOMDataBroker domBroker, final SchemaService schemaService) {
67         this.extensions = contextProvider;
68         this.dispatcher = dispatcher;
69         this.codecTreeFactory = codecTreeFactory;
70         this.domBroker = domBroker;
71         this.schemaService = schemaService;
72     }
73
74     void start(final Global global, final String instanceName, final BGPOpenConfigMappingService mappingService) {
75         Preconditions.checkState(this.ribImpl == null, "Previous instance %s was not closed.", this);
76         this.ribImpl = createRib(global, instanceName, mappingService);
77         this.schemaContextRegistration = this.schemaService.registerSchemaContextListener(this.ribImpl);
78     }
79
80     @Override
81     public KeyedInstanceIdentifier<Rib, RibKey> getInstanceIdentifier() {
82         return this.ribImpl.getInstanceIdentifier();
83     }
84
85     @Override
86     public AsNumber getLocalAs() {
87         return this.ribImpl.getLocalAs();
88     }
89
90     @Override
91     public BgpId getBgpIdentifier() {
92         return this.ribImpl.getBgpIdentifier();
93     }
94
95     @Override
96     public Set<? extends BgpTableType> getLocalTables() {
97         return this.ribImpl.getLocalTables();
98     }
99
100     @Override
101     public BGPDispatcher getDispatcher() {
102         return this.ribImpl.getDispatcher();
103     }
104
105     @Override
106     public DOMTransactionChain createPeerChain(final TransactionChainListener listener) {
107         return this.ribImpl.createPeerChain(listener);
108     }
109
110     @Override
111     public RIBExtensionConsumerContext getRibExtensions() {
112         return this.ribImpl.getRibExtensions();
113     }
114
115     @Override
116     public RIBSupportContextRegistry getRibSupportContext() {
117         return this.ribImpl.getRibSupportContext();
118     }
119
120     @Override
121     public YangInstanceIdentifier getYangRibId() {
122         return this.ribImpl.getYangRibId();
123     }
124
125     @Override
126     public CodecsRegistry getCodecsRegistry() {
127         return this.ribImpl.getCodecsRegistry();
128     }
129
130     @Override
131     public Optional<BGPOpenConfigProvider> getOpenConfigProvider() {
132         return this.ribImpl.getOpenConfigProvider();
133     }
134
135     @Override
136     public CacheDisconnectedPeers getCacheDisconnectedPeers() {
137         return this.ribImpl.getCacheDisconnectedPeers();
138     }
139
140     @Override
141     public DOMDataTreeChangeService getService() {
142         return this.ribImpl.getService();
143     }
144
145     @Override
146     public void close() {
147         if (this.ribImpl != null) {
148             this.ribImpl.close();
149             this.ribImpl = null;
150         }
151         if (this.schemaContextRegistration != null) {
152             this.schemaContextRegistration.close();
153             this.schemaContextRegistration = null;
154         }
155         if (this.serviceRegistration != null) {
156             try {
157                 this.serviceRegistration.unregister();
158             } catch(final IllegalStateException e) {
159                 LOG.warn("Failed to unregister {} service instance", this, e);
160             }
161             this.serviceRegistration = null;
162         }
163     }
164
165     public void setServiceRegistration(final ServiceRegistration<?> serviceRegistration) {
166         this.serviceRegistration = serviceRegistration;
167     }
168
169     @Override
170     public BGPRenderStats getRenderStats() {
171         return this.ribImpl.getRenderStats();
172     }
173
174     @Override
175     public ImportPolicyPeerTracker getImportPolicyPeerTracker() {
176         return this.ribImpl.getImportPolicyPeerTracker();
177     }
178
179     @Override
180     public Set<TablesKey> getLocalTablesKeys() {
181         return this.ribImpl.getLocalTablesKeys();
182     }
183
184     @Override
185     public String toString() {
186         return this.ribImpl.toString();
187     }
188
189     private RIBImpl createRib(final Global global, final String bgpInstanceName, final BGPOpenConfigMappingService mappingService) {
190         final Map<TablesKey, PathSelectionMode> pathSelectionModes = mappingService.toPathSelectionMode(global.getAfiSafis().getAfiSafi()).entrySet()
191                 .stream().collect(Collectors.toMap(entry -> new TablesKey(entry.getKey().getAfi(), entry.getKey().getSafi()), entry -> entry.getValue()));
192         return new RIBImpl(new RibId(bgpInstanceName), new AsNumber(global.getConfig().getAs().getValue()),
193                 new BgpId(global.getConfig().getRouterId().getValue()), new ClusterIdentifier(global.getConfig().getRouterId().getValue()),
194                 this.extensions, this.dispatcher, this.codecTreeFactory, this.domBroker,
195                 mappingService.toTableTypes(global.getAfiSafis().getAfiSafi()), pathSelectionModes,
196                 this.extensions.getClassLoadingStrategy());
197     }
198
199 }