2  * ============LICENSE_START=======================================================
 
   3  * ONAP : ccsdk features
 
   4  * ================================================================================
 
   5  * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property.
 
   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
 
  14  *     http://www.apache.org/licenses/LICENSE-2.0
 
  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=========================================================
 
  24 package org.onap.ccsdk.features.sdnr.wt.dataprovider.impl;
 
  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;
 
  34 import java.util.Optional;
 
  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;
 
 129 public class DataProviderServiceImpl implements DataProviderService, AutoCloseable {
 
 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;
 
 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;
 
 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());
 
 158                 this.dataProvider = new SqlDBDataProvider(this.dbConfig.getMariadbConfig());
 
 162             this.dataProvider = new NoDbDatabaseDataProvider();
 
 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);
 
 173     private void sendResyncCallbackToApiGateway() {
 
 174         this.mediatorServerServlet.triggerReloadSync();
 
 178      * @return dataProvider
 
 180     public DataProvider getDataProvider() {
 
 181         return dataProvider.getDataProvider();
 
 184     public HtDatabaseClient getRawClient() {
 
 185         return this.dataProvider.getRawClient();
 
 189      * @return data provider for Maintenance()
 
 191     public HtDatabaseMaintenance getHtDatabaseMaintenance() {
 
 192         return dataProvider.getHtDatabaseMaintenance();
 
 196      * @return configuration object
 
 198     public IEsConfig getEsConfig() {
 
 199         return dbConfig.getEsConfig();
 
 204     public void close() throws Exception {
 
 205         LOG.info("Close RPC Service");
 
 206         if (rpcReg != null) {
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 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();
 
 448     // -- private classes and functions
 
 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();
 
 455             result = transaction.read(LogicalDatastoreType.CONFIGURATION, KEYSTORE_IIF).get();
 
 456         } catch (ExecutionException e) {
 
 457             LOG.warn("problem reading netconf-keystore: ", e);
 
 459         } catch (InterruptedException e) {
 
 460             LOG.warn("Interrupted!", e);
 
 461             // Restore interrupted state...
 
 462             Thread.currentThread().interrupt();
 
 464         ReadTlsKeyEntryOutputBuilder output = new ReadTlsKeyEntryOutputBuilder();
 
 465         if (result.isEmpty()) {
 
 466             return output.setData(Set.of()).setPagination(EMPTY_PAGINATION);
 
 468         Map<KeyCredentialKey, KeyCredential> keyCredential = result.get().getKeyCredential();
 
 469         if (keyCredential == null) {
 
 470             return output.setData(Set.of()).setPagination(EMPTY_PAGINATION);
 
 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()))
 
 487     private static String assembleExceptionMessage(Exception e) {
 
 488         StringWriter sw = new StringWriter();
 
 489         PrintWriter pw = new PrintWriter(sw);
 
 490         e.printStackTrace(pw);
 
 492         StringBuffer buf = new StringBuffer();
 
 493         buf.append("Exception: ");
 
 494         buf.append(sw.toString());
 
 495         return buf.toString();
 
 498     private interface GetEntityInput<O extends DataObject,B> {
 
 499         B get() throws IOException;
 
 502     private static <O extends DataObject, B> RpcResultBuilder<O> read(
 
 503             GetEntityInput<O,B> inputgetter) {
 
 504         RpcResultBuilder<O> result;
 
 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));
 
 517     public HtUserdataManager getHtDatabaseUserManager() {
 
 518         return this.dbUserManager;