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