2 * ============LICENSE_START=======================================================
3 * ONAP : ccsdk features
4 * ================================================================================
5 * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.ccsdk.features.sdnr.wt.dataprovider.impl;
24 import com.google.common.util.concurrent.ListenableFuture;
25 import java.io.IOException;
26 import java.io.PrintWriter;
27 import java.io.StringWriter;
28 import java.util.concurrent.TimeUnit;
29 import org.eclipse.jdt.annotation.NonNull;
30 import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
31 import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
32 import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
33 import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.MediatorServerDataProvider;
34 import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.MsServlet;
35 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
36 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance;
37 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig;
38 import org.opendaylight.mdsal.binding.api.RpcProviderService;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceInput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceOutput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerOutput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateNetworkElementConnectionInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateNetworkElementConnectionOutput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DataProviderService;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMaintenanceInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMaintenanceOutput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMediatorServerInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMediatorServerOutput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteNetworkElementConnectionInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteNetworkElementConnectionOutput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadConnectionlogListInput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadConnectionlogListOutput;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadEventlogListInput;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadEventlogListOutput;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultcurrentListInput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultcurrentListOutput;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultlogListInput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultlogListOutput;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadGuiCutThroughEntryInput;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadGuiCutThroughEntryOutput;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadInventoryListInput;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadInventoryListOutput;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMaintenanceListInput;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMaintenanceListOutput;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMediatorServerListInput;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMediatorServerListOutput;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadNetworkElementConnectionListInput;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadNetworkElementConnectionListOutput;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mDeviceListInput;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mDeviceListOutput;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mListInput;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mListOutput;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mLtpListInput;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mLtpListOutput;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hDeviceListInput;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hDeviceListOutput;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hListInput;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hListOutput;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hLtpListInput;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hLtpListOutput;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadStatusInput;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadStatusOutput;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMaintenanceInput;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMaintenanceOutput;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMediatorServerInput;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMediatorServerOutput;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionInput;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionOutput;
90 import org.opendaylight.yangtools.concepts.Builder;
91 import org.opendaylight.yangtools.concepts.ObjectRegistration;
92 import org.opendaylight.yangtools.yang.binding.DataObject;
93 import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
94 import org.opendaylight.yangtools.yang.common.RpcResult;
95 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
96 import org.slf4j.Logger;
97 import org.slf4j.LoggerFactory;
99 public class DataProviderServiceImpl implements DataProviderService, AutoCloseable {
101 private static final Logger LOG = LoggerFactory.getLogger(DataProviderServiceImpl.class);
102 public static final String CONFIGURATIONFILE = "etc/dataprovider.properties";
103 private static final long DATABASE_TIMEOUT_MS = 120 * 1000L;
105 private final ObjectRegistration<@NonNull DataProviderServiceImpl> rpcReg;
106 private final ElasticSearchDataProvider dataProvider;
107 private final ConfigurationFileRepresentation configuration;
108 private final EsConfig esConfig;
109 private final MediatorServerDataProvider mediatorServerDataProvider;
111 DataProviderServiceImpl(final RpcProviderService rpcProviderService, MsServlet mediatorServerServlet)
113 this.configuration = new ConfigurationFileRepresentation(CONFIGURATIONFILE);
114 this.esConfig = new EsConfig(configuration);
115 this.dataProvider = new ElasticSearchDataProvider(esConfig.getHosts(), esConfig.getBasicAuthUsername(),
116 esConfig.getBasicAuthPassword(), esConfig.trustAllCerts());
117 this.dataProvider.waitForYellowDatabaseStatus(DATABASE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
118 this.mediatorServerDataProvider = new MediatorServerDataProvider(esConfig.getHosts(),
119 esConfig.getBasicAuthUsername(), esConfig.getBasicAuthPassword(),esConfig.trustAllCerts());
120 mediatorServerServlet.setDataProvider(this.mediatorServerDataProvider);
121 // Register ourselves as the REST API RPC implementation
122 LOG.info("Register RPC Service " + DataProviderServiceImpl.class.getSimpleName());
123 this.rpcReg = rpcProviderService.registerRpcImplementation(DataProviderService.class, this);
126 private void sendResyncCallbackToApiGateway() {
127 mediatorServerDataProvider.triggerReloadSync();
131 * @return dataProvider
133 public DataProvider getDataProvider() {
134 return dataProvider.getDataProvider();
137 public HtDatabaseClient getRawClient() {
138 return this.dataProvider.getRawClient();
142 * @return data provider for Maintenance()
144 public HtDatabaseMaintenance getHtDatabaseMaintenance() {
145 return dataProvider.getHtDatabaseMaintenance();
149 * @return configuration object
151 public IEsConfig getEsConfig() {
157 public void close() throws Exception {
158 LOG.info("Close RPC Service");
159 if (rpcReg != null) {
165 public ListenableFuture<RpcResult<ReadFaultcurrentListOutput>> readFaultcurrentList(
166 ReadFaultcurrentListInput input) {
167 LOG.debug("RPC Request: readFaultCurrentList with input {}", input);
168 RpcResultBuilder<ReadFaultcurrentListOutput> result =
169 read(() -> DataProviderServiceImpl.this.dataProvider.readFaultCurrentList(input));
170 return result.buildFuture();
174 public ListenableFuture<RpcResult<ReadFaultlogListOutput>> readFaultlogList(ReadFaultlogListInput input) {
175 LOG.debug("RPC Request: readFaultlogList with input {}", input);
176 RpcResultBuilder<ReadFaultlogListOutput> result =
177 read(() -> DataProviderServiceImpl.this.dataProvider.readFaultLogList(input));
178 return result.buildFuture();
182 public ListenableFuture<RpcResult<ReadMaintenanceListOutput>> readMaintenanceList(ReadMaintenanceListInput input) {
183 LOG.debug("RPC Request: readMaintenanceList with input {}", input);
184 RpcResultBuilder<ReadMaintenanceListOutput> result =
185 read(() -> DataProviderServiceImpl.this.dataProvider.readMaintenanceList(input));
186 return result.buildFuture();
190 public ListenableFuture<RpcResult<ReadMediatorServerListOutput>> readMediatorServerList(
191 ReadMediatorServerListInput input) {
192 LOG.debug("RPC Request: readMediatorServerList with input {}", input);
193 RpcResultBuilder<ReadMediatorServerListOutput> result =
194 read(() -> DataProviderServiceImpl.this.dataProvider.readMediatorServerList(input));
195 return result.buildFuture();
199 public ListenableFuture<RpcResult<ReadNetworkElementConnectionListOutput>> readNetworkElementConnectionList(
200 ReadNetworkElementConnectionListInput input) {
201 LOG.debug("RPC Request: readNetworkElementConnectionList with input {}", input);
202 RpcResultBuilder<ReadNetworkElementConnectionListOutput> result =
203 read(() -> DataProviderServiceImpl.this.dataProvider.readNetworkElementConnectionList(input));
204 return result.buildFuture();
209 public ListenableFuture<RpcResult<ReadPmdata15mListOutput>> readPmdata15mList(ReadPmdata15mListInput input) {
210 LOG.debug("RPC Request: readPmdata15mList with input {}", input);
211 RpcResultBuilder<ReadPmdata15mListOutput> result =
212 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata15mList(input));
213 return result.buildFuture();
218 public ListenableFuture<RpcResult<ReadPmdata24hListOutput>> readPmdata24hList(ReadPmdata24hListInput input) {
219 LOG.debug("RPC Request: readPmdata24hList with input {}", input);
220 RpcResultBuilder<ReadPmdata24hListOutput> result =
221 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata24hList(input));
222 return result.buildFuture();
227 public ListenableFuture<RpcResult<ReadStatusOutput>> readStatus(ReadStatusInput input) {
228 LOG.debug("RPC Request: readStatusEntityList with input {}", input);
229 RpcResultBuilder<ReadStatusOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.readStatus());
230 return result.buildFuture();
235 public ListenableFuture<RpcResult<ReadInventoryListOutput>> readInventoryList(ReadInventoryListInput input) {
236 LOG.debug("RPC Request: readInventoryList with input {}", input);
237 RpcResultBuilder<ReadInventoryListOutput> result =
238 read(() -> DataProviderServiceImpl.this.dataProvider.readInventoryList(input));
239 return result.buildFuture();
243 public ListenableFuture<RpcResult<ReadPmdata15mLtpListOutput>> readPmdata15mLtpList(
244 ReadPmdata15mLtpListInput input) {
245 LOG.debug("RPC Request: readPmdata15mLtpList with input {}", input);
246 RpcResultBuilder<ReadPmdata15mLtpListOutput> result =
247 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata15mLtpList(input));
248 return result.buildFuture();
252 public ListenableFuture<RpcResult<ReadPmdata15mDeviceListOutput>> readPmdata15mDeviceList(
253 ReadPmdata15mDeviceListInput input) {
254 LOG.debug("RPC Request: readPmdata15mDeviceList with input {}", input);
255 RpcResultBuilder<ReadPmdata15mDeviceListOutput> result =
256 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata15mDeviceList(input));
257 return result.buildFuture();
261 public ListenableFuture<RpcResult<ReadPmdata24hLtpListOutput>> readPmdata24hLtpList(
262 ReadPmdata24hLtpListInput input) {
263 LOG.debug("RPC Request: readPmdata24hLtpList with input {}", input);
264 RpcResultBuilder<ReadPmdata24hLtpListOutput> result =
265 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata24hLtpList(input));
266 return result.buildFuture();
270 public ListenableFuture<RpcResult<ReadPmdata24hDeviceListOutput>> readPmdata24hDeviceList(
271 ReadPmdata24hDeviceListInput input) {
272 LOG.debug("RPC Request: readPmdata24hDeviceList with input {}", input);
273 RpcResultBuilder<ReadPmdata24hDeviceListOutput> result =
274 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata24hDeviceList(input));
275 return result.buildFuture();
279 public ListenableFuture<RpcResult<ReadConnectionlogListOutput>> readConnectionlogList(
280 ReadConnectionlogListInput input) {
281 LOG.debug("RPC Request: readConnectionlogList with input {}", input);
282 RpcResultBuilder<ReadConnectionlogListOutput> result =
283 read(() -> DataProviderServiceImpl.this.dataProvider.readConnectionlogList(input));
284 return result.buildFuture();
288 public ListenableFuture<RpcResult<CreateNetworkElementConnectionOutput>> createNetworkElementConnection(
289 CreateNetworkElementConnectionInput input) {
290 LOG.debug("RPC Request: createNetworkElementConnection with input {}", input);
291 RpcResultBuilder<CreateNetworkElementConnectionOutput> result =
292 read(() -> DataProviderServiceImpl.this.dataProvider.createNetworkElementConnection(input));
293 return result.buildFuture();
297 public ListenableFuture<RpcResult<UpdateNetworkElementConnectionOutput>> updateNetworkElementConnection(
298 UpdateNetworkElementConnectionInput input) {
299 LOG.debug("RPC Request: updateNetworkElementConnection with input {}", input);
300 RpcResultBuilder<UpdateNetworkElementConnectionOutput> result =
301 read(() -> DataProviderServiceImpl.this.dataProvider.updateNetworkElementConnection(input));
302 return result.buildFuture();
306 public ListenableFuture<RpcResult<DeleteNetworkElementConnectionOutput>> deleteNetworkElementConnection(
307 DeleteNetworkElementConnectionInput input) {
308 LOG.debug("RPC Request: deleteNetworkElementConnection with input {}", input);
309 RpcResultBuilder<DeleteNetworkElementConnectionOutput> result =
310 read(() -> DataProviderServiceImpl.this.dataProvider.deleteNetworkElementConnection(input));
311 return result.buildFuture();
315 public ListenableFuture<RpcResult<DeleteMediatorServerOutput>> deleteMediatorServer(
316 DeleteMediatorServerInput input) {
317 LOG.debug("RPC Request: deleteMediatorServer with input {}", input);
318 RpcResultBuilder<DeleteMediatorServerOutput> result =
319 read(() -> DataProviderServiceImpl.this.dataProvider.deleteMediatorServer(input));
320 this.sendResyncCallbackToApiGateway();
321 return result.buildFuture();
325 public ListenableFuture<RpcResult<CreateMediatorServerOutput>> createMediatorServer(
326 CreateMediatorServerInput input) {
327 LOG.debug("RPC Request: createMediatorServer with input {}", input);
328 RpcResultBuilder<CreateMediatorServerOutput> result =
329 read(() -> DataProviderServiceImpl.this.dataProvider.createMediatorServer(input));
330 this.sendResyncCallbackToApiGateway();
331 return result.buildFuture();
335 public ListenableFuture<RpcResult<CreateMaintenanceOutput>> createMaintenance(CreateMaintenanceInput input) {
336 LOG.debug("RPC Request: createMaintenance with input {}", input);
337 RpcResultBuilder<CreateMaintenanceOutput> result =
338 read(() -> DataProviderServiceImpl.this.dataProvider.createMaintenance(input));
339 return result.buildFuture();
343 public ListenableFuture<RpcResult<DeleteMaintenanceOutput>> deleteMaintenance(DeleteMaintenanceInput input) {
344 LOG.debug("RPC Request: deleteMaintenance with input {}", input);
345 RpcResultBuilder<DeleteMaintenanceOutput> result =
346 read(() -> DataProviderServiceImpl.this.dataProvider.deleteMaintenance(input));
347 return result.buildFuture();
351 public ListenableFuture<RpcResult<UpdateMediatorServerOutput>> updateMediatorServer(
352 UpdateMediatorServerInput input) {
353 LOG.debug("RPC Request: updateMediatorServer with input {}", input);
354 RpcResultBuilder<UpdateMediatorServerOutput> result =
355 read(() -> DataProviderServiceImpl.this.dataProvider.updateMediatorServer(input));
356 this.sendResyncCallbackToApiGateway();
357 return result.buildFuture();
361 public ListenableFuture<RpcResult<UpdateMaintenanceOutput>> updateMaintenance(UpdateMaintenanceInput input) {
362 LOG.debug("RPC Request: updateMaintenance with input {}", input);
363 RpcResultBuilder<UpdateMaintenanceOutput> result =
364 read(() -> DataProviderServiceImpl.this.dataProvider.updateMaintenance(input));
365 return result.buildFuture();
369 public ListenableFuture<RpcResult<ReadEventlogListOutput>> readEventlogList(ReadEventlogListInput input) {
370 LOG.debug("RPC Request: readEventlogList with input {}", input);
371 RpcResultBuilder<ReadEventlogListOutput> result =
372 read(() -> DataProviderServiceImpl.this.dataProvider.readEventlogList(input));
373 return result.buildFuture();
377 public ListenableFuture<RpcResult<ReadGuiCutThroughEntryOutput>> readGuiCutThroughEntry(
378 ReadGuiCutThroughEntryInput input) {
379 LOG.debug("RPC Request: getGuiCutThroughEntry with input {}", input);
380 RpcResultBuilder<ReadGuiCutThroughEntryOutput> result =
381 read(() -> DataProviderServiceImpl.this.dataProvider.readGuiCutThroughEntry(input));
382 return result.buildFuture();
384 // -- private classes and functions
386 private static String assembleExceptionMessage(Exception e) {
387 StringWriter sw = new StringWriter();
388 PrintWriter pw = new PrintWriter(sw);
389 e.printStackTrace(pw);
391 StringBuffer buf = new StringBuffer();
392 buf.append("Exception: ");
393 buf.append(sw.toString());
394 return buf.toString();
397 private interface GetEntityInput<O extends DataObject> {
398 Builder<O> get() throws IOException;
401 private static <O extends DataObject, I extends DataObject> RpcResultBuilder<O> read(
402 GetEntityInput<O> inputgetter) {
403 RpcResultBuilder<O> result;
405 Builder<O> outputBuilder = inputgetter.get();
406 result = RpcResultBuilder.success(outputBuilder);
407 } catch (Exception e) {
408 LOG.info("Exception", e);
409 result = RpcResultBuilder.failed();
410 result.withError(ErrorType.APPLICATION, assembleExceptionMessage(e));