c20263c067f98298b86f243abc149baa995adbd6
[ccsdk/features.git] /
1 /*******************************************************************************
2  * ============LICENSE_START========================================================================
3  * ONAP : ccsdk feature sdnr wt
4  * =================================================================================================
5  * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
6  * =================================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software distributed under the License
13  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14  * or implied. See the License for the specific language governing permissions and limitations under
15  * the License.
16  * ============LICENSE_END==========================================================================
17  ******************************************************************************/
18 package org.onap.ccsdk.features.sdnr.wt.dataprovider.impl;
19
20 import java.io.IOException;
21 import java.io.PrintWriter;
22 import java.io.StringWriter;
23 import java.util.concurrent.TimeUnit;
24
25 import org.eclipse.jdt.annotation.NonNull;
26 import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
27 import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider;
28 import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.MediatorServerDataProvider;
29 import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.MsServlet;
30 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
31 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance;
32 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig;
33 import org.opendaylight.mdsal.binding.api.RpcProviderService;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMaintenanceInput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMaintenanceOutput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMediatorServerInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMediatorServerOutput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateNetworkElementConnectionInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateNetworkElementConnectionOutput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DataProviderService;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMaintenanceInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMaintenanceOutput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMediatorServerInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMediatorServerOutput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteNetworkElementConnectionInput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteNetworkElementConnectionOutput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadConnectionlogListInput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadConnectionlogListOutput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadEventlogListInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadEventlogListOutput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultcurrentListInput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultcurrentListOutput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultlogListInput;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultlogListOutput;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadInventoryListInput;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadInventoryListOutput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMaintenanceListInput;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMaintenanceListOutput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMediatorServerListInput;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMediatorServerListOutput;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadNetworkElementConnectionListInput;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadNetworkElementConnectionListOutput;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mDeviceListInput;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mDeviceListOutput;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mListInput;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mListOutput;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mLtpListInput;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mLtpListOutput;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hDeviceListInput;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hDeviceListOutput;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hListInput;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hListOutput;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hLtpListInput;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hLtpListOutput;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadStatusInput;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadStatusOutput;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMaintenanceInput;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMaintenanceOutput;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMediatorServerInput;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMediatorServerOutput;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateNetworkElementConnectionInput;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateNetworkElementConnectionOutput;
83 import org.opendaylight.yangtools.concepts.Builder;
84 import org.opendaylight.yangtools.concepts.ObjectRegistration;
85 import org.opendaylight.yangtools.yang.binding.DataObject;
86 import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
87 import org.opendaylight.yangtools.yang.common.RpcResult;
88 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
89 import org.slf4j.Logger;
90 import org.slf4j.LoggerFactory;
91
92 import com.google.common.util.concurrent.ListenableFuture;
93
94 public class DataProviderServiceImpl implements DataProviderService, AutoCloseable {
95
96     private static final Logger LOG = LoggerFactory.getLogger(DataProviderServiceImpl.class);
97     public static final String CONFIGURATIONFILE = "etc/dataprovider.properties";
98     private static final long DATABASE_TIMEOUT_MS = 120*1000L;
99
100     private final ObjectRegistration<@NonNull DataProviderServiceImpl> rpcReg;
101     private final ElasticSearchDataProvider dataProvider;
102     private final ConfigurationFileRepresentation configuration;
103     private final EsConfig esConfig;
104         private final MediatorServerDataProvider mediatorServerDataProvider;
105
106     DataProviderServiceImpl(final RpcProviderService rpcProviderService,MsServlet mediatorServerServlet) throws Exception {
107         this.configuration = new ConfigurationFileRepresentation(CONFIGURATIONFILE);
108         this.esConfig = new EsConfig(configuration);
109         this.dataProvider = new ElasticSearchDataProvider(esConfig.getHosts(),esConfig.getBasicAuthUsername(),esConfig.getBasicAuthPassword());
110         this.dataProvider.waitForYellowDatabaseStatus(DATABASE_TIMEOUT_MS,TimeUnit.MILLISECONDS);
111         this.mediatorServerDataProvider = new MediatorServerDataProvider(esConfig.getHosts(),esConfig.getBasicAuthUsername(),esConfig.getBasicAuthPassword());
112         mediatorServerServlet.setDataProvider(this.mediatorServerDataProvider);
113         // Register ourselves as the REST API RPC implementation
114         LOG.info("Register RPC Service " + DataProviderServiceImpl.class.getSimpleName());
115         this.rpcReg = rpcProviderService.registerRpcImplementation(DataProviderService.class, this);
116     }
117     private void sendResyncCallbackToApiGateway() {
118         mediatorServerDataProvider.triggerReloadSync();
119     }
120     /**
121      * @return dataProvider
122      */
123     public DataProvider getDataProvider() {
124         return dataProvider.getDataProvider();
125     }
126
127     /**
128      * @return data provider for Maintenance()
129      */
130     public HtDatabaseMaintenance getHtDatabaseMaintenance() {
131         return dataProvider.getHtDatabaseMaintenance();
132     }
133
134     /**
135      * @return configuration object
136      */
137     public IEsConfig getEsConfig() {
138         return esConfig;
139     }
140
141
142     @Override
143     public void close() throws Exception {
144         LOG.info("Close RPC Service");
145         if (rpcReg != null) {
146             rpcReg.close();
147         }
148     }
149
150     @Override
151     public ListenableFuture<RpcResult<ReadFaultcurrentListOutput>> readFaultcurrentList(ReadFaultcurrentListInput input) {
152         LOG.debug("RPC Request: getFaultCurrentEntityList with input {}", input);
153         RpcResultBuilder<ReadFaultcurrentListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readFaultCurrentList(input));
154         return result.buildFuture();
155     }
156     @Override
157     public ListenableFuture<RpcResult<ReadFaultlogListOutput>> readFaultlogList(ReadFaultlogListInput input) {
158         LOG.debug("RPC Request: getFaultCurrentEntityList with input {}", input);
159         RpcResultBuilder<ReadFaultlogListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readFaultLogList(input));
160         return result.buildFuture();
161     }
162
163     @Override
164     public ListenableFuture<RpcResult<ReadMaintenanceListOutput>> readMaintenanceList(ReadMaintenanceListInput input) {
165         LOG.debug("RPC Request: getMaintenanceEntityList with input {}", input);
166         RpcResultBuilder<ReadMaintenanceListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readMaintenanceList(input));
167         return result.buildFuture();
168     }
169
170     @Override
171     public ListenableFuture<RpcResult<ReadMediatorServerListOutput>> readMediatorServerList(
172             ReadMediatorServerListInput input) {
173         LOG.debug("RPC Request: getMediatorServerEntityList with input {}", input);
174         RpcResultBuilder<ReadMediatorServerListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readMediatorServerList(input));
175         return result.buildFuture();
176     }
177
178     @Override
179     public ListenableFuture<RpcResult<ReadNetworkElementConnectionListOutput>> readNetworkElementConnectionList(
180             ReadNetworkElementConnectionListInput input) {
181         LOG.debug("RPC Request: getNetworkElementConnectionEntityList with input {}", input);
182         RpcResultBuilder<ReadNetworkElementConnectionListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readNetworkElementConnectionList(input));
183         return result.buildFuture();
184
185     }
186
187     @Override
188     public ListenableFuture<RpcResult<ReadPmdata15mListOutput>> readPmdata15mList(ReadPmdata15mListInput input) {
189         LOG.debug("RPC Request: getNetworkElementConnectionEntityList with input {}", input);
190         RpcResultBuilder<ReadPmdata15mListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata15mList(input));
191         return result.buildFuture();
192
193     }
194     @Override
195     public ListenableFuture<RpcResult<ReadPmdata24hListOutput>> readPmdata24hList(ReadPmdata24hListInput input) {
196         LOG.debug("RPC Request: getNetworkElementConnectionEntityList with input {}", input);
197         RpcResultBuilder<ReadPmdata24hListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata24hList(input));
198         return result.buildFuture();
199
200     }
201     @Override
202     public ListenableFuture<RpcResult<ReadStatusOutput>> readStatus(ReadStatusInput input) {
203         LOG.debug("RPC Request: getStatusEntityList with input {}", input);
204         RpcResultBuilder<ReadStatusOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readStatus());
205         return result.buildFuture();
206
207     }
208
209     @Override
210     public ListenableFuture<RpcResult<ReadInventoryListOutput>> readInventoryList(ReadInventoryListInput input) {
211         LOG.debug("RPC Request: getInventoryEntityList with input {}", input);
212         RpcResultBuilder<ReadInventoryListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readInventoryList(input));
213         return result.buildFuture();
214     }
215
216     @Override
217     public ListenableFuture<RpcResult<ReadPmdata15mLtpListOutput>> readPmdata15mLtpList(ReadPmdata15mLtpListInput input) {
218         LOG.debug("RPC Request: readPmdataLtpList with input {}", input);
219         RpcResultBuilder<ReadPmdata15mLtpListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata15mLtpList(input));
220         return result.buildFuture();
221     }
222
223     @Override
224     public ListenableFuture<RpcResult<ReadPmdata15mDeviceListOutput>> readPmdata15mDeviceList(ReadPmdata15mDeviceListInput input) {
225             LOG.debug("RPC Request: readPmdataDeviceList with input {}", input);
226             RpcResultBuilder<ReadPmdata15mDeviceListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata15mDeviceList(input));
227             return result.buildFuture();
228     }
229
230     @Override
231     public ListenableFuture<RpcResult<ReadPmdata24hLtpListOutput>> readPmdata24hLtpList(ReadPmdata24hLtpListInput input) {
232         LOG.debug("RPC Request: readPmdataLtpList with input {}", input);
233         RpcResultBuilder<ReadPmdata24hLtpListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata24hLtpList(input));
234         return result.buildFuture();
235     }
236
237     @Override
238     public ListenableFuture<RpcResult<ReadPmdata24hDeviceListOutput>> readPmdata24hDeviceList(ReadPmdata24hDeviceListInput input) {
239             LOG.debug("RPC Request: readPmdataDeviceList with input {}", input);
240             RpcResultBuilder<ReadPmdata24hDeviceListOutput> result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata24hDeviceList(input));
241             return result.buildFuture();
242     }
243
244     @Override
245     public ListenableFuture<RpcResult<ReadConnectionlogListOutput>> readConnectionlogList(
246             ReadConnectionlogListInput input) {
247         LOG.debug("RPC Request: readConnectionlogList with input {}", input);
248         RpcResultBuilder<ReadConnectionlogListOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.readConnectionlogList(input));
249         return result.buildFuture();
250     }
251
252     @Override
253     public ListenableFuture<RpcResult<CreateNetworkElementConnectionOutput>> createNetworkElementConnection(
254             CreateNetworkElementConnectionInput input) {
255         LOG.debug("RPC Request: createNetworkElementConnection with input {}", input);
256         RpcResultBuilder<CreateNetworkElementConnectionOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.createNetworkElementConnection(input));
257         return result.buildFuture();
258     }
259
260     @Override
261     public ListenableFuture<RpcResult<UpdateNetworkElementConnectionOutput>> updateNetworkElementConnection(
262             UpdateNetworkElementConnectionInput input) {
263         LOG.debug("RPC Request: updateNetworkElementConnection with input {}", input);
264         RpcResultBuilder<UpdateNetworkElementConnectionOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.updateNetworkElementConnection(input));
265         return result.buildFuture();
266     }
267
268     @Override
269     public ListenableFuture<RpcResult<DeleteNetworkElementConnectionOutput>> deleteNetworkElementConnection(
270             DeleteNetworkElementConnectionInput input) {
271         RpcResultBuilder<DeleteNetworkElementConnectionOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.deleteNetworkElementConnection(input));
272         return result.buildFuture();
273     }
274
275     @Override
276     public ListenableFuture<RpcResult<DeleteMediatorServerOutput>> deleteMediatorServer(
277             DeleteMediatorServerInput input) {
278         LOG.debug("RPC Request: deleteMediatorServer with input {}", input);
279         RpcResultBuilder<DeleteMediatorServerOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.deleteMediatorServer(input));
280         this.sendResyncCallbackToApiGateway();
281         return result.buildFuture();
282     }
283
284     @Override
285     public ListenableFuture<RpcResult<CreateMediatorServerOutput>> createMediatorServer(
286             CreateMediatorServerInput input) {
287         LOG.debug("RPC Request: createMediatorServer with input {}", input);
288         RpcResultBuilder<CreateMediatorServerOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.createMediatorServer(input));
289         this.sendResyncCallbackToApiGateway();
290         return result.buildFuture();
291     }
292
293     @Override
294     public ListenableFuture<RpcResult<CreateMaintenanceOutput>> createMaintenance(CreateMaintenanceInput input) {
295         LOG.debug("RPC Request: createMaintenance with input {}", input);
296         RpcResultBuilder<CreateMaintenanceOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.createMaintenance(input));
297         return result.buildFuture();
298     }
299
300     @Override
301     public ListenableFuture<RpcResult<DeleteMaintenanceOutput>> deleteMaintenance(DeleteMaintenanceInput input) {
302         LOG.debug("RPC Request: deleteMaintenance with input {}", input);
303         RpcResultBuilder<DeleteMaintenanceOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.deleteMaintenance(input));
304         return result.buildFuture();
305     }
306
307     @Override
308     public ListenableFuture<RpcResult<UpdateMediatorServerOutput>> updateMediatorServer(
309             UpdateMediatorServerInput input) {
310         LOG.debug("RPC Request: updateMediatorServer with input {}", input);
311         RpcResultBuilder<UpdateMediatorServerOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.updateMediatorServer(input));
312         this.sendResyncCallbackToApiGateway();
313         return result.buildFuture();
314     }
315
316     @Override
317     public ListenableFuture<RpcResult<UpdateMaintenanceOutput>> updateMaintenance(UpdateMaintenanceInput input) {
318         LOG.debug("RPC Request: updateMaintenance with input {}", input);
319         RpcResultBuilder<UpdateMaintenanceOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.updateMaintenance(input));
320         return result.buildFuture();
321     }
322
323     @Override
324     public ListenableFuture<RpcResult<ReadEventlogListOutput>> readEventlogList(ReadEventlogListInput input) {
325         LOG.debug("RPC Request: readEventlogList with input {}", input);
326         RpcResultBuilder<ReadEventlogListOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.readEventlogList(input));
327         return result.buildFuture();
328     }
329
330     // -- private classes and functions
331
332     private static String assembleExceptionMessage(Exception e) {
333         StringWriter sw = new StringWriter();
334         PrintWriter pw = new PrintWriter(sw);
335         e.printStackTrace(pw);
336
337         StringBuffer buf = new StringBuffer();
338         buf.append("Exception: ");
339         buf.append(sw.toString());
340         return buf.toString();
341     }
342
343     private interface GetEntityInput<O extends DataObject> {
344         Builder<O> get() throws IOException;
345     }
346
347     private static <O extends DataObject,I extends DataObject> RpcResultBuilder<O> read(GetEntityInput<O> inputgetter ) {
348         RpcResultBuilder<O> result;
349         try {
350             Builder<O> outputBuilder = inputgetter.get();
351             result = RpcResultBuilder.success(outputBuilder);
352         } catch (Exception e) {
353             LOG.info("Exception", e);
354             result = RpcResultBuilder.failed();
355             result.withError(ErrorType.APPLICATION, assembleExceptionMessage(e));
356         }
357         return result;
358     }
359
360 }