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