41fee76ad0c0aeb31d5a498fda01d7ac58ecff61
[ccsdk/features.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP : ccsdk features
4  * ================================================================================
5  * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
6  * All rights reserved.
7  * ================================================================================
8  * Update Copyright (C) 2021 Samsung Electronics Intellectual Property. All rights reserved.
9  * =================================================================================================
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  *
14  *     http://www.apache.org/licenses/LICENSE-2.0
15  *
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  * ============LICENSE_END=========================================================
22  *
23  */
24 package org.onap.ccsdk.features.sdnr.wt.dataprovider.impl;
25
26 import com.google.common.util.concurrent.ListenableFuture;
27 import java.io.IOException;
28 import java.io.PrintWriter;
29 import java.io.StringWriter;
30 import java.util.Arrays;
31 import java.util.Map;
32 import java.util.Optional;
33 import java.util.concurrent.ExecutionException;
34 import java.util.concurrent.TimeUnit;
35 import java.util.stream.Collectors;
36 import org.eclipse.jdt.annotation.NonNull;
37 import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
38 import org.onap.ccsdk.features.sdnr.wt.common.database.HtDatabaseClient;
39 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.DatabaseDataProvider;
40 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.ElasticSearchDataProvider;
41 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.elasticsearch.impl.HtUserdataManagerImpl;
42 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.nodb.NoDbDatabaseDataProvider;
43 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.SqlDBDataProvider;
44 import org.onap.ccsdk.features.sdnr.wt.dataprovider.http.MsServlet;
45 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider;
46 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtDatabaseMaintenance;
47 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.HtUserdataManager;
48 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.IEsConfig;
49 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.SdnrDbType;
50 import org.opendaylight.mdsal.binding.api.DataBroker;
51 import org.opendaylight.mdsal.binding.api.ReadTransaction;
52 import org.opendaylight.mdsal.binding.api.RpcProviderService;
53 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.Keystore;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.keystore.entry.KeyCredential;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.keystore.rev171017.keystore.entry.KeyCredentialKey;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceInput;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMaintenanceOutput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerInput;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateMediatorServerOutput;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateNetworkElementConnectionInput;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.CreateNetworkElementConnectionOutput;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DataProviderService;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMaintenanceInput;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMaintenanceOutput;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMediatorServerInput;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteMediatorServerOutput;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteNetworkElementConnectionInput;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.DeleteNetworkElementConnectionOutput;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadCmlogListInput;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadCmlogListOutput;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadConnectionlogListInput;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadConnectionlogListOutput;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadEventlogListInput;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadEventlogListOutput;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultcurrentListInput;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultcurrentListOutput;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultlogListInput;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadFaultlogListOutput;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadGuiCutThroughEntryInput;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadGuiCutThroughEntryOutput;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadInventoryListInput;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadInventoryListOutput;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMaintenanceListInput;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMaintenanceListOutput;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMediatorServerListInput;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadMediatorServerListOutput;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadNetworkElementConnectionListInput;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadNetworkElementConnectionListOutput;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mDeviceListInput;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mDeviceListOutput;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mListInput;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mListOutput;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mLtpListInput;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata15mLtpListOutput;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hDeviceListInput;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hDeviceListOutput;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hListInput;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hListOutput;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hLtpListInput;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadPmdata24hLtpListOutput;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadStatusInput;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadStatusOutput;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadTlsKeyEntryInput;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadTlsKeyEntryOutput;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ReadTlsKeyEntryOutputBuilder;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMaintenanceInput;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMaintenanceOutput;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMediatorServerInput;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateMediatorServerOutput;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionInput;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.UpdateNetworkElementConnectionOutput;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.tls.key.entry.output.Pagination;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.read.tls.key.entry.output.PaginationBuilder;
115 import org.opendaylight.yangtools.concepts.Builder;
116 import org.opendaylight.yangtools.concepts.ObjectRegistration;
117 import org.opendaylight.yangtools.yang.binding.DataObject;
118 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
119 import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
120 import org.opendaylight.yangtools.yang.common.RpcResult;
121 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
122 import org.opendaylight.yangtools.yang.common.Uint32;
123 import org.opendaylight.yangtools.yang.common.Uint64;
124 import org.slf4j.Logger;
125 import org.slf4j.LoggerFactory;
126
127 public class DataProviderServiceImpl implements DataProviderService, AutoCloseable {
128
129     private static final Logger LOG = LoggerFactory.getLogger(DataProviderServiceImpl.class);
130     public static final String CONFIGURATIONFILE = "etc/dataprovider.properties";
131     private static final long DATABASE_TIMEOUT_MS = 120 * 1000L;
132     private static final @NonNull InstanceIdentifier<Keystore> KEYSTORE_IIF = InstanceIdentifier.create(Keystore.class);
133     private static final Pagination EMPTY_PAGINATION = new PaginationBuilder().setSize(Uint32.valueOf(20))
134             .setTotal(Uint64.valueOf(0)).setPage(Uint64.valueOf(1)).build();
135     private static final long DEFAULT_PAGESIZE = 20;
136     private static final long DEFAULT_PAGE = 1;
137
138     private final ObjectRegistration<@NonNull DataProviderServiceImpl> rpcReg;
139     private final DatabaseDataProvider dataProvider;
140     private final ConfigurationFileRepresentation configuration;
141     private final DataProviderConfig dbConfig;
142     private final HtUserdataManager dbUserManager;
143     private final DataBroker dataBroker;
144     private final MsServlet mediatorServerServlet;
145
146     public DataProviderServiceImpl(final RpcProviderService rpcProviderService, MsServlet mediatorServerServlet,
147             DataBroker dataBroker) throws Exception {
148         this.configuration = new ConfigurationFileRepresentation(CONFIGURATIONFILE);
149         this.dbConfig = new DataProviderConfig(configuration);
150         this.dataBroker = dataBroker;
151         this.mediatorServerServlet = mediatorServerServlet;
152         if(this.dbConfig.isEnabled()) {
153             if (this.dbConfig.getDbType() == SdnrDbType.ELASTICSEARCH) {
154                 this.dataProvider = new ElasticSearchDataProvider(this.dbConfig.getEsConfig());
155              } else {
156                 this.dataProvider = new SqlDBDataProvider(this.dbConfig.getMariadbConfig());
157             }
158         }
159         else {
160             this.dataProvider = new NoDbDatabaseDataProvider();
161         }
162         this.dbUserManager = this.dataProvider.getUserManager();
163         this.dataProvider.waitForYellowDatabaseStatus(DATABASE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
164         mediatorServerServlet.setDataProvider(this.dataProvider.getHtDatabaseMediatorServer());
165         // Register ourselves as the REST API RPC implementation
166         LOG.info("Register RPC Service {}", DataProviderServiceImpl.class.getSimpleName());
167         this.rpcReg = rpcProviderService.registerRpcImplementation(DataProviderService.class, this);
168         
169     }
170
171     private void sendResyncCallbackToApiGateway() {
172         this.mediatorServerServlet.triggerReloadSync();
173     }
174
175     /**
176      * @return dataProvider
177      */
178     public DataProvider getDataProvider() {
179         return dataProvider.getDataProvider();
180     }
181
182     public HtDatabaseClient getRawClient() {
183         return this.dataProvider.getRawClient();
184     }
185
186     /**
187      * @return data provider for Maintenance()
188      */
189     public HtDatabaseMaintenance getHtDatabaseMaintenance() {
190         return dataProvider.getHtDatabaseMaintenance();
191     }
192
193     /**
194      * @return configuration object
195      */
196     public IEsConfig getEsConfig() {
197         return dbConfig.getEsConfig();
198     }
199
200
201     @Override
202     public void close() throws Exception {
203         LOG.info("Close RPC Service");
204         if (rpcReg != null) {
205             rpcReg.close();
206         }
207     }
208
209     @Override
210     public ListenableFuture<RpcResult<ReadFaultcurrentListOutput>> readFaultcurrentList(
211             ReadFaultcurrentListInput input) {
212         LOG.debug("RPC Request: readFaultCurrentList with input {}", input);
213         RpcResultBuilder<ReadFaultcurrentListOutput> result =
214                 read(() -> DataProviderServiceImpl.this.dataProvider.readFaultCurrentList(input));
215         return result.buildFuture();
216     }
217
218     @Override
219     public ListenableFuture<RpcResult<ReadFaultlogListOutput>> readFaultlogList(ReadFaultlogListInput input) {
220         LOG.debug("RPC Request: readFaultlogList with input {}", input);
221         RpcResultBuilder<ReadFaultlogListOutput> result =
222                 read(() -> DataProviderServiceImpl.this.dataProvider.readFaultLogList(input));
223         return result.buildFuture();
224     }
225
226     @Override
227     public ListenableFuture<RpcResult<ReadCmlogListOutput>> readCmlogList(ReadCmlogListInput input) {
228         LOG.debug("RPC Request: readCMlogList with input {}", input);
229         RpcResultBuilder<ReadCmlogListOutput> result =
230                 read(() -> DataProviderServiceImpl.this.dataProvider.readCMLogList(input));
231         return result.buildFuture();
232     }
233
234     @Override
235     public ListenableFuture<RpcResult<ReadMaintenanceListOutput>> readMaintenanceList(ReadMaintenanceListInput input) {
236         LOG.debug("RPC Request: readMaintenanceList with input {}", input);
237         RpcResultBuilder<ReadMaintenanceListOutput> result =
238                 read(() -> DataProviderServiceImpl.this.dataProvider.readMaintenanceList(input));
239         return result.buildFuture();
240     }
241
242     @Override
243     public ListenableFuture<RpcResult<ReadMediatorServerListOutput>> readMediatorServerList(
244             ReadMediatorServerListInput input) {
245         LOG.debug("RPC Request: readMediatorServerList with input {}", input);
246         RpcResultBuilder<ReadMediatorServerListOutput> result =
247                 read(() -> DataProviderServiceImpl.this.dataProvider.readMediatorServerList(input));
248         return result.buildFuture();
249     }
250
251     @Override
252     public ListenableFuture<RpcResult<ReadNetworkElementConnectionListOutput>> readNetworkElementConnectionList(
253             ReadNetworkElementConnectionListInput input) {
254         LOG.debug("RPC Request: readNetworkElementConnectionList with input {}", input);
255         RpcResultBuilder<ReadNetworkElementConnectionListOutput> result =
256                 read(() -> DataProviderServiceImpl.this.dataProvider.readNetworkElementConnectionList(input));
257         return result.buildFuture();
258
259     }
260
261     @Override
262     public ListenableFuture<RpcResult<ReadPmdata15mListOutput>> readPmdata15mList(ReadPmdata15mListInput input) {
263         LOG.debug("RPC Request: readPmdata15mList with input {}", input);
264         RpcResultBuilder<ReadPmdata15mListOutput> result =
265                 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata15mList(input));
266         return result.buildFuture();
267
268     }
269
270     @Override
271     public ListenableFuture<RpcResult<ReadPmdata24hListOutput>> readPmdata24hList(ReadPmdata24hListInput input) {
272         LOG.debug("RPC Request: readPmdata24hList with input {}", input);
273         RpcResultBuilder<ReadPmdata24hListOutput> result =
274                 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata24hList(input));
275         return result.buildFuture();
276
277     }
278
279     @Override
280     public ListenableFuture<RpcResult<ReadStatusOutput>> readStatus(ReadStatusInput input) {
281         LOG.debug("RPC Request: readStatusEntityList with input {}", input);
282         RpcResultBuilder<ReadStatusOutput> result = read(() -> DataProviderServiceImpl.this.dataProvider.readStatus());
283         return result.buildFuture();
284
285     }
286
287     @Override
288     public ListenableFuture<RpcResult<ReadInventoryListOutput>> readInventoryList(ReadInventoryListInput input) {
289         LOG.debug("RPC Request: readInventoryList with input {}", input);
290         RpcResultBuilder<ReadInventoryListOutput> result =
291                 read(() -> DataProviderServiceImpl.this.dataProvider.readInventoryList(input));
292         return result.buildFuture();
293     }
294
295     @Override
296     public ListenableFuture<RpcResult<ReadPmdata15mLtpListOutput>> readPmdata15mLtpList(
297             ReadPmdata15mLtpListInput input) {
298         LOG.debug("RPC Request: readPmdata15mLtpList with input {}", input);
299         RpcResultBuilder<ReadPmdata15mLtpListOutput> result =
300                 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata15mLtpList(input));
301         return result.buildFuture();
302     }
303
304     @Override
305     public ListenableFuture<RpcResult<ReadPmdata15mDeviceListOutput>> readPmdata15mDeviceList(
306             ReadPmdata15mDeviceListInput input) {
307         LOG.debug("RPC Request: readPmdata15mDeviceList with input {}", input);
308         RpcResultBuilder<ReadPmdata15mDeviceListOutput> result =
309                 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata15mDeviceList(input));
310         return result.buildFuture();
311     }
312
313     @Override
314     public ListenableFuture<RpcResult<ReadPmdata24hLtpListOutput>> readPmdata24hLtpList(
315             ReadPmdata24hLtpListInput input) {
316         LOG.debug("RPC Request: readPmdata24hLtpList with input {}", input);
317         RpcResultBuilder<ReadPmdata24hLtpListOutput> result =
318                 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata24hLtpList(input));
319         return result.buildFuture();
320     }
321
322     @Override
323     public ListenableFuture<RpcResult<ReadPmdata24hDeviceListOutput>> readPmdata24hDeviceList(
324             ReadPmdata24hDeviceListInput input) {
325         LOG.debug("RPC Request: readPmdata24hDeviceList with input {}", input);
326         RpcResultBuilder<ReadPmdata24hDeviceListOutput> result =
327                 read(() -> DataProviderServiceImpl.this.dataProvider.readPmdata24hDeviceList(input));
328         return result.buildFuture();
329     }
330
331     @Override
332     public ListenableFuture<RpcResult<ReadConnectionlogListOutput>> readConnectionlogList(
333             ReadConnectionlogListInput input) {
334         LOG.debug("RPC Request: readConnectionlogList with input {}", input);
335         RpcResultBuilder<ReadConnectionlogListOutput> result =
336                 read(() -> DataProviderServiceImpl.this.dataProvider.readConnectionlogList(input));
337         return result.buildFuture();
338     }
339
340     @Override
341     public ListenableFuture<RpcResult<CreateNetworkElementConnectionOutput>> createNetworkElementConnection(
342             CreateNetworkElementConnectionInput input) {
343         LOG.debug("RPC Request: createNetworkElementConnection with input {}", input);
344         RpcResultBuilder<CreateNetworkElementConnectionOutput> result =
345                 read(() -> DataProviderServiceImpl.this.dataProvider.createNetworkElementConnection(input));
346         return result.buildFuture();
347     }
348
349     @Override
350     public ListenableFuture<RpcResult<UpdateNetworkElementConnectionOutput>> updateNetworkElementConnection(
351             UpdateNetworkElementConnectionInput input) {
352         LOG.debug("RPC Request: updateNetworkElementConnection with input {}", input);
353         RpcResultBuilder<UpdateNetworkElementConnectionOutput> result =
354                 read(() -> DataProviderServiceImpl.this.dataProvider.updateNetworkElementConnection(input));
355         return result.buildFuture();
356     }
357
358     @Override
359     public ListenableFuture<RpcResult<DeleteNetworkElementConnectionOutput>> deleteNetworkElementConnection(
360             DeleteNetworkElementConnectionInput input) {
361         LOG.debug("RPC Request: deleteNetworkElementConnection with input {}", input);
362         RpcResultBuilder<DeleteNetworkElementConnectionOutput> result =
363                 read(() -> DataProviderServiceImpl.this.dataProvider.deleteNetworkElementConnection(input));
364         return result.buildFuture();
365     }
366
367     @Override
368     public ListenableFuture<RpcResult<DeleteMediatorServerOutput>> deleteMediatorServer(
369             DeleteMediatorServerInput input) {
370         LOG.debug("RPC Request: deleteMediatorServer with input {}", input);
371         RpcResultBuilder<DeleteMediatorServerOutput> result =
372                 read(() -> DataProviderServiceImpl.this.dataProvider.deleteMediatorServer(input));
373         this.sendResyncCallbackToApiGateway();
374         return result.buildFuture();
375     }
376
377     @Override
378     public ListenableFuture<RpcResult<CreateMediatorServerOutput>> createMediatorServer(
379             CreateMediatorServerInput input) {
380         LOG.debug("RPC Request: createMediatorServer with input {}", input);
381         RpcResultBuilder<CreateMediatorServerOutput> result =
382                 read(() -> DataProviderServiceImpl.this.dataProvider.createMediatorServer(input));
383         this.sendResyncCallbackToApiGateway();
384         return result.buildFuture();
385     }
386
387     @Override
388     public ListenableFuture<RpcResult<CreateMaintenanceOutput>> createMaintenance(CreateMaintenanceInput input) {
389         LOG.debug("RPC Request: createMaintenance with input {}", input);
390         RpcResultBuilder<CreateMaintenanceOutput> result =
391                 read(() -> DataProviderServiceImpl.this.dataProvider.createMaintenance(input));
392         return result.buildFuture();
393     }
394
395     @Override
396     public ListenableFuture<RpcResult<DeleteMaintenanceOutput>> deleteMaintenance(DeleteMaintenanceInput input) {
397         LOG.debug("RPC Request: deleteMaintenance with input {}", input);
398         RpcResultBuilder<DeleteMaintenanceOutput> result =
399                 read(() -> DataProviderServiceImpl.this.dataProvider.deleteMaintenance(input));
400         return result.buildFuture();
401     }
402
403     @Override
404     public ListenableFuture<RpcResult<UpdateMediatorServerOutput>> updateMediatorServer(
405             UpdateMediatorServerInput input) {
406         LOG.debug("RPC Request: updateMediatorServer with input {}", input);
407         RpcResultBuilder<UpdateMediatorServerOutput> result =
408                 read(() -> DataProviderServiceImpl.this.dataProvider.updateMediatorServer(input));
409         this.sendResyncCallbackToApiGateway();
410         return result.buildFuture();
411     }
412
413     @Override
414     public ListenableFuture<RpcResult<UpdateMaintenanceOutput>> updateMaintenance(UpdateMaintenanceInput input) {
415         LOG.debug("RPC Request: updateMaintenance with input {}", input);
416         RpcResultBuilder<UpdateMaintenanceOutput> result =
417                 read(() -> DataProviderServiceImpl.this.dataProvider.updateMaintenance(input));
418         return result.buildFuture();
419     }
420
421     @Override
422     public ListenableFuture<RpcResult<ReadEventlogListOutput>> readEventlogList(ReadEventlogListInput input) {
423         LOG.debug("RPC Request: readEventlogList with input {}", input);
424         RpcResultBuilder<ReadEventlogListOutput> result =
425                 read(() -> DataProviderServiceImpl.this.dataProvider.readEventlogList(input));
426         return result.buildFuture();
427     }
428
429     @Override
430     public ListenableFuture<RpcResult<ReadGuiCutThroughEntryOutput>> readGuiCutThroughEntry(
431             ReadGuiCutThroughEntryInput input) {
432         LOG.debug("RPC Request: getGuiCutThroughEntry with input {}", input);
433         RpcResultBuilder<ReadGuiCutThroughEntryOutput> result =
434                 read(() -> DataProviderServiceImpl.this.dataProvider.readGuiCutThroughEntry(input));
435         return result.buildFuture();
436     }
437
438     @Override
439     public ListenableFuture<RpcResult<ReadTlsKeyEntryOutput>> readTlsKeyEntry(ReadTlsKeyEntryInput input) {
440         LOG.debug("RPC Request: readTlsKeyEntry with input {}", input);
441         RpcResultBuilder<ReadTlsKeyEntryOutput> result = read(() -> DataProviderServiceImpl.this.readTlsKeys(input));
442         return result.buildFuture();
443     }
444
445     // -- private classes and functions
446
447     private ReadTlsKeyEntryOutputBuilder readTlsKeys(ReadTlsKeyEntryInput input) {
448         Optional<Keystore> result = Optional.empty();
449         // The implicite close is not handled correctly by underlaying opendaylight netconf service
450         ReadTransaction transaction = this.dataBroker.newReadOnlyTransaction();
451         try {
452             result = transaction.read(LogicalDatastoreType.CONFIGURATION, KEYSTORE_IIF).get();
453         } catch (ExecutionException e) {
454             LOG.warn("problem reading netconf-keystore: ", e);
455
456         } catch (InterruptedException e) {
457             LOG.warn("Interrupted!", e);
458             // Restore interrupted state...
459             Thread.currentThread().interrupt();
460         }
461         ReadTlsKeyEntryOutputBuilder output = new ReadTlsKeyEntryOutputBuilder();
462         if (result.isEmpty()) {
463             return output.setData(Arrays.asList()).setPagination(EMPTY_PAGINATION);
464         }
465         Map<KeyCredentialKey, KeyCredential> keyCredential = result.get().getKeyCredential();
466         if (keyCredential == null) {
467             return output.setData(Arrays.asList()).setPagination(EMPTY_PAGINATION);
468         }
469         org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.entity.input.Pagination pagination =
470                 input.getPagination();
471         long pageNum = pagination == null ? DEFAULT_PAGE
472                 : pagination.getPage() == null ? DEFAULT_PAGE : pagination.getPage().longValue();
473         long size = pagination == null ? DEFAULT_PAGESIZE
474                 : pagination.getSize() == null ? DEFAULT_PAGESIZE : pagination.getSize().longValue();
475         long from = pageNum > 0 ? (pageNum - 1) * size : 0;
476         output.setData(keyCredential.keySet().stream().skip(from).limit(size).map(e -> e.getKeyId())
477                 .collect(Collectors.toList()));
478         output.setPagination(new PaginationBuilder().setPage(Uint64.valueOf(pageNum))
479                 .setSize(Uint32.valueOf(output.getData().size())).setTotal(Uint64.valueOf(keyCredential.size()))
480                 .build());
481         return output;
482     }
483
484     private static String assembleExceptionMessage(Exception e) {
485         StringWriter sw = new StringWriter();
486         PrintWriter pw = new PrintWriter(sw);
487         e.printStackTrace(pw);
488
489         StringBuffer buf = new StringBuffer();
490         buf.append("Exception: ");
491         buf.append(sw.toString());
492         return buf.toString();
493     }
494
495     private interface GetEntityInput<O extends DataObject> {
496         Builder<O> get() throws IOException;
497     }
498
499     private static <O extends DataObject, I extends DataObject> RpcResultBuilder<O> read(
500             GetEntityInput<O> inputgetter) {
501         RpcResultBuilder<O> result;
502         try {
503             Builder<O> outputBuilder = inputgetter.get();
504             result = RpcResultBuilder.success(outputBuilder);
505         } catch (Exception e) {
506             LOG.info("Exception", e);
507             result = RpcResultBuilder.failed();
508             result.withError(ErrorType.APPLICATION, assembleExceptionMessage(e));
509         }
510         return result;
511     }
512
513     public HtUserdataManager getHtDatabaseUserManager() {
514         return this.dbUserManager;
515     }
516
517
518
519 }