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.rev190801.CreateMaintenanceInput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMaintenanceOutput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMediatorServerInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMediatorServerOutput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateNetworkElementConnectionInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateNetworkElementConnectionOutput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DataProviderService;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMaintenanceInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMaintenanceOutput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMediatorServerInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMediatorServerOutput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteNetworkElementConnectionInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteNetworkElementConnectionOutput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadConnectionlogListInput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadConnectionlogListOutput;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadEventlogListInput;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadEventlogListOutput;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultcurrentListInput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultcurrentListOutput;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultlogListInput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultlogListOutput;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadInventoryListInput;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadInventoryListOutput;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMaintenanceListInput;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMaintenanceListOutput;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMediatorServerListInput;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMediatorServerListOutput;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadNetworkElementConnectionListInput;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadNetworkElementConnectionListOutput;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mDeviceListInput;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mDeviceListOutput;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mListInput;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mListOutput;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mLtpListInput;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mLtpListOutput;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hDeviceListInput;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hDeviceListOutput;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hListInput;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hListOutput;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hLtpListInput;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hLtpListOutput;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadStatusInput;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadStatusOutput;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMaintenanceInput;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMaintenanceOutput;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMediatorServerInput;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMediatorServerOutput;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateNetworkElementConnectionInput;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateNetworkElementConnectionOutput;
88 import org.opendaylight.yangtools.concepts.Builder;
89 import org.opendaylight.yangtools.concepts.ObjectRegistration;
90 import org.opendaylight.yangtools.yang.binding.DataObject;
91 import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
92 import org.opendaylight.yangtools.yang.common.RpcResult;
93 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
94 import org.slf4j.Logger;
95 import org.slf4j.LoggerFactory;
97 public class DataProviderServiceImpl implements DataProviderService, AutoCloseable {
99 private static final Logger LOG = LoggerFactory.getLogger(DataProviderServiceImpl.class);
100 public static final String CONFIGURATIONFILE = "etc/dataprovider.properties";
101 private static final long DATABASE_TIMEOUT_MS = 120 * 1000L;
103 private final ObjectRegistration<@NonNull DataProviderServiceImpl> rpcReg;
104 private final ElasticSearchDataProvider dataProvider;
105 private final ConfigurationFileRepresentation configuration;
106 private final EsConfig esConfig;
107 private final MediatorServerDataProvider mediatorServerDataProvider;
109 DataProviderServiceImpl(final RpcProviderService rpcProviderService, MsServlet mediatorServerServlet)
111 this.configuration = new ConfigurationFileRepresentation(CONFIGURATIONFILE);
112 this.esConfig = new EsConfig(configuration);
113 this.dataProvider = new ElasticSearchDataProvider(esConfig.getHosts(), esConfig.getBasicAuthUsername(),
114 esConfig.getBasicAuthPassword(), esConfig.trustAllCerts());
115 this.dataProvider.waitForYellowDatabaseStatus(DATABASE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
116 this.mediatorServerDataProvider = new MediatorServerDataProvider(esConfig.getHosts(),
117 esConfig.getBasicAuthUsername(), esConfig.getBasicAuthPassword(),esConfig.trustAllCerts());
118 mediatorServerServlet.setDataProvider(this.mediatorServerDataProvider);
119 // Register ourselves as the REST API RPC implementation
120 LOG.info("Register RPC Service " + DataProviderServiceImpl.class.getSimpleName());
121 this.rpcReg = rpcProviderService.registerRpcImplementation(DataProviderService.class, this);
124 private void sendResyncCallbackToApiGateway() {
125 mediatorServerDataProvider.triggerReloadSync();
129 * @return dataProvider
131 public DataProvider getDataProvider() {
132 return dataProvider.getDataProvider();
135 public HtDatabaseClient getRawClient() {
136 return this.dataProvider.getRawClient();
140 * @return data provider for Maintenance()
142 public HtDatabaseMaintenance getHtDatabaseMaintenance() {
143 return dataProvider.getHtDatabaseMaintenance();
147 * @return configuration object
149 public IEsConfig getEsConfig() {
155 public void close() throws Exception {
156 LOG.info("Close RPC Service");
157 if (rpcReg != null) {
163 public ListenableFuture<RpcResult<ReadFaultcurrentListOutput>> readFaultcurrentList(
164 ReadFaultcurrentListInput input) {
165 LOG.debug("RPC Request: getFaultCurrentEntityList with input {}", input);
166 RpcResultBuilder<ReadFaultcurrentListOutput> result =
167 read(() -> DataProviderServiceImpl.this.dataProvider.readFaultCurrentList(input));
168 return result.buildFuture();
172 public ListenableFuture<RpcResult<ReadFaultlogListOutput>> readFaultlogList(ReadFaultlogListInput input) {
173 LOG.debug("RPC Request: getFaultCurrentEntityList with input {}", input);
174 RpcResultBuilder<ReadFaultlogListOutput> result =
175 read(() -> DataProviderServiceImpl.this.dataProvider.readFaultLogList(input));
176 return result.buildFuture();
180 public ListenableFuture<RpcResult<ReadMaintenanceListOutput>> readMaintenanceList(ReadMaintenanceListInput input) {
181 LOG.debug("RPC Request: getMaintenanceEntityList with input {}", input);
182 RpcResultBuilder<ReadMaintenanceListOutput> result =
183 read(() -> DataProviderServiceImpl.this.dataProvider.readMaintenanceList(input));
184 return result.buildFuture();
188 public ListenableFuture<RpcResult<ReadMediatorServerListOutput>> readMediatorServerList(
189 ReadMediatorServerListInput input) {
190 LOG.debug("RPC Request: getMediatorServerEntityList with input {}", input);
191 RpcResultBuilder<ReadMediatorServerListOutput> result =
192 read(() -> DataProviderServiceImpl.this.dataProvider.readMediatorServerList(input));
193 return result.buildFuture();
197 public ListenableFuture<RpcResult<ReadNetworkElementConnectionListOutput>> readNetworkElementConnectionList(
198 ReadNetworkElementConnectionListInput input) {
199 LOG.debug("RPC Request: getNetworkElementConnectionEntityList with input {}", input);
200 RpcResultBuilder<ReadNetworkElementConnectionListOutput> result =
201 read(() -> DataProviderServiceImpl.this.dataProvider.readNetworkElementConnectionList(input));
202 return result.buildFuture();
207 public ListenableFuture<RpcResult<ReadPmdata15mListOutput>> readPmdata15mList(ReadPmdata15mListInput input) {
208 LOG.debug("RPC Request: getNetworkElementConnectionEntityList with input {}", input);
209 RpcResultBuilder<ReadPmdata15mListOutput> result =
210 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata15mList(input));
211 return result.buildFuture();
216 public ListenableFuture<RpcResult<ReadPmdata24hListOutput>> readPmdata24hList(ReadPmdata24hListInput input) {
217 LOG.debug("RPC Request: getNetworkElementConnectionEntityList with input {}", input);
218 RpcResultBuilder<ReadPmdata24hListOutput> result =
219 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata24hList(input));
220 return result.buildFuture();
225 public ListenableFuture<RpcResult<ReadStatusOutput>> readStatus(ReadStatusInput input) {
226 LOG.debug("RPC Request: getStatusEntityList with input {}", input);
227 RpcResultBuilder<ReadStatusOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.readStatus());
228 return result.buildFuture();
233 public ListenableFuture<RpcResult<ReadInventoryListOutput>> readInventoryList(ReadInventoryListInput input) {
234 LOG.debug("RPC Request: getInventoryEntityList with input {}", input);
235 RpcResultBuilder<ReadInventoryListOutput> result =
236 read(() -> DataProviderServiceImpl.this.dataProvider.readInventoryList(input));
237 return result.buildFuture();
241 public ListenableFuture<RpcResult<ReadPmdata15mLtpListOutput>> readPmdata15mLtpList(
242 ReadPmdata15mLtpListInput input) {
243 LOG.debug("RPC Request: readPmdataLtpList with input {}", input);
244 RpcResultBuilder<ReadPmdata15mLtpListOutput> result =
245 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata15mLtpList(input));
246 return result.buildFuture();
250 public ListenableFuture<RpcResult<ReadPmdata15mDeviceListOutput>> readPmdata15mDeviceList(
251 ReadPmdata15mDeviceListInput input) {
252 LOG.debug("RPC Request: readPmdataDeviceList with input {}", input);
253 RpcResultBuilder<ReadPmdata15mDeviceListOutput> result =
254 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata15mDeviceList(input));
255 return result.buildFuture();
259 public ListenableFuture<RpcResult<ReadPmdata24hLtpListOutput>> readPmdata24hLtpList(
260 ReadPmdata24hLtpListInput input) {
261 LOG.debug("RPC Request: readPmdataLtpList with input {}", input);
262 RpcResultBuilder<ReadPmdata24hLtpListOutput> result =
263 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata24hLtpList(input));
264 return result.buildFuture();
268 public ListenableFuture<RpcResult<ReadPmdata24hDeviceListOutput>> readPmdata24hDeviceList(
269 ReadPmdata24hDeviceListInput input) {
270 LOG.debug("RPC Request: readPmdataDeviceList with input {}", input);
271 RpcResultBuilder<ReadPmdata24hDeviceListOutput> result =
272 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata24hDeviceList(input));
273 return result.buildFuture();
277 public ListenableFuture<RpcResult<ReadConnectionlogListOutput>> readConnectionlogList(
278 ReadConnectionlogListInput input) {
279 LOG.debug("RPC Request: readConnectionlogList with input {}", input);
280 RpcResultBuilder<ReadConnectionlogListOutput> result =
281 read(() -> DataProviderServiceImpl.this.dataProvider.readConnectionlogList(input));
282 return result.buildFuture();
286 public ListenableFuture<RpcResult<CreateNetworkElementConnectionOutput>> createNetworkElementConnection(
287 CreateNetworkElementConnectionInput input) {
288 LOG.debug("RPC Request: createNetworkElementConnection with input {}", input);
289 RpcResultBuilder<CreateNetworkElementConnectionOutput> result =
290 read(() -> DataProviderServiceImpl.this.dataProvider.createNetworkElementConnection(input));
291 return result.buildFuture();
295 public ListenableFuture<RpcResult<UpdateNetworkElementConnectionOutput>> updateNetworkElementConnection(
296 UpdateNetworkElementConnectionInput input) {
297 LOG.debug("RPC Request: updateNetworkElementConnection with input {}", input);
298 RpcResultBuilder<UpdateNetworkElementConnectionOutput> result =
299 read(() -> DataProviderServiceImpl.this.dataProvider.updateNetworkElementConnection(input));
300 return result.buildFuture();
304 public ListenableFuture<RpcResult<DeleteNetworkElementConnectionOutput>> deleteNetworkElementConnection(
305 DeleteNetworkElementConnectionInput input) {
306 RpcResultBuilder<DeleteNetworkElementConnectionOutput> result =
307 read(() -> DataProviderServiceImpl.this.dataProvider.deleteNetworkElementConnection(input));
308 return result.buildFuture();
312 public ListenableFuture<RpcResult<DeleteMediatorServerOutput>> deleteMediatorServer(
313 DeleteMediatorServerInput input) {
314 LOG.debug("RPC Request: deleteMediatorServer with input {}", input);
315 RpcResultBuilder<DeleteMediatorServerOutput> result =
316 read(() -> DataProviderServiceImpl.this.dataProvider.deleteMediatorServer(input));
317 this.sendResyncCallbackToApiGateway();
318 return result.buildFuture();
322 public ListenableFuture<RpcResult<CreateMediatorServerOutput>> createMediatorServer(
323 CreateMediatorServerInput input) {
324 LOG.debug("RPC Request: createMediatorServer with input {}", input);
325 RpcResultBuilder<CreateMediatorServerOutput> result =
326 read(() -> DataProviderServiceImpl.this.dataProvider.createMediatorServer(input));
327 this.sendResyncCallbackToApiGateway();
328 return result.buildFuture();
332 public ListenableFuture<RpcResult<CreateMaintenanceOutput>> createMaintenance(CreateMaintenanceInput input) {
333 LOG.debug("RPC Request: createMaintenance with input {}", input);
334 RpcResultBuilder<CreateMaintenanceOutput> result =
335 read(() -> DataProviderServiceImpl.this.dataProvider.createMaintenance(input));
336 return result.buildFuture();
340 public ListenableFuture<RpcResult<DeleteMaintenanceOutput>> deleteMaintenance(DeleteMaintenanceInput input) {
341 LOG.debug("RPC Request: deleteMaintenance with input {}", input);
342 RpcResultBuilder<DeleteMaintenanceOutput> result =
343 read(() -> DataProviderServiceImpl.this.dataProvider.deleteMaintenance(input));
344 return result.buildFuture();
348 public ListenableFuture<RpcResult<UpdateMediatorServerOutput>> updateMediatorServer(
349 UpdateMediatorServerInput input) {
350 LOG.debug("RPC Request: updateMediatorServer with input {}", input);
351 RpcResultBuilder<UpdateMediatorServerOutput> result =
352 read(() -> DataProviderServiceImpl.this.dataProvider.updateMediatorServer(input));
353 this.sendResyncCallbackToApiGateway();
354 return result.buildFuture();
358 public ListenableFuture<RpcResult<UpdateMaintenanceOutput>> updateMaintenance(UpdateMaintenanceInput input) {
359 LOG.debug("RPC Request: updateMaintenance with input {}", input);
360 RpcResultBuilder<UpdateMaintenanceOutput> result =
361 read(() -> DataProviderServiceImpl.this.dataProvider.updateMaintenance(input));
362 return result.buildFuture();
366 public ListenableFuture<RpcResult<ReadEventlogListOutput>> readEventlogList(ReadEventlogListInput input) {
367 LOG.debug("RPC Request: readEventlogList with input {}", input);
368 RpcResultBuilder<ReadEventlogListOutput> result =
369 read(() -> DataProviderServiceImpl.this.dataProvider.readEventlogList(input));
370 return result.buildFuture();
373 // -- private classes and functions
375 private static String assembleExceptionMessage(Exception e) {
376 StringWriter sw = new StringWriter();
377 PrintWriter pw = new PrintWriter(sw);
378 e.printStackTrace(pw);
380 StringBuffer buf = new StringBuffer();
381 buf.append("Exception: ");
382 buf.append(sw.toString());
383 return buf.toString();
386 private interface GetEntityInput<O extends DataObject> {
387 Builder<O> get() throws IOException;
390 private static <O extends DataObject, I extends DataObject> RpcResultBuilder<O> read(
391 GetEntityInput<O> inputgetter) {
392 RpcResultBuilder<O> result;
394 Builder<O> outputBuilder = inputgetter.get();
395 result = RpcResultBuilder.success(outputBuilder);
396 } catch (Exception e) {
397 LOG.info("Exception", e);
398 result = RpcResultBuilder.failed();
399 result.withError(ErrorType.APPLICATION, assembleExceptionMessage(e));