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