/******************************************************************************* * ============LICENSE_START======================================================================== * ONAP : ccsdk feature sdnr wt * ================================================================================================= * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved. * ================================================================================================= * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. * ============LICENSE_END========================================================================== ******************************************************************************/ package org.onap.ccsdk.features.sdnr.wt.dataprovider.impl; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.concurrent.TimeUnit; import org.eclipse.jdt.annotation.NonNull; import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation; import org.onap.ccsdk.features.sdnr.wt.database.config.EsConfig; import org.onap.ccsdk.features.sdnr.wt.dataprovider.data.ElasticSearchDataProvider; import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.DataProvider; import org.opendaylight.mdsal.binding.api.RpcProviderService; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMaintenanceInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMaintenanceOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMediatorServerInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateMediatorServerOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateNetworkElementConnectionInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.CreateNetworkElementConnectionOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DataProviderService; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMaintenanceInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMaintenanceOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMediatorServerInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteMediatorServerOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteNetworkElementConnectionInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.DeleteNetworkElementConnectionOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadConnectionlogListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadConnectionlogListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadEventlogListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadEventlogListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultcurrentListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultcurrentListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultlogListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadFaultlogListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadInventoryListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadInventoryListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMaintenanceListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMaintenanceListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMediatorServerListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadMediatorServerListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadNetworkElementConnectionListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadNetworkElementConnectionListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mDeviceListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mDeviceListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mLtpListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata15mLtpListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hDeviceListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hDeviceListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hLtpListInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadPmdata24hLtpListOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadStatusInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.ReadStatusOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMaintenanceInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMaintenanceOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMediatorServerInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateMediatorServerOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateNetworkElementConnectionInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev190801.UpdateNetworkElementConnectionOutput; import org.opendaylight.yangtools.concepts.Builder; import org.opendaylight.yangtools.concepts.ObjectRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.util.concurrent.ListenableFuture; public class DataProviderServiceImpl implements DataProviderService, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(DataProviderServiceImpl.class); public static final String CONFIGURATIONFILE = "etc/dataprovider.properties"; private static final long DATABASE_TIMEOUT_MS = 120*1000L; private final ObjectRegistration<@NonNull DataProviderServiceImpl> rpcReg; private final ElasticSearchDataProvider dataProvider; private final ConfigurationFileRepresentation configuration; DataProviderServiceImpl(final RpcProviderService rpcProviderService) throws Exception { this.configuration = new ConfigurationFileRepresentation(CONFIGURATIONFILE); EsConfig esConfig = new EsConfig(configuration); this.dataProvider = new ElasticSearchDataProvider(esConfig.getHosts()); this.dataProvider.waitForYellowDatabaseStatus(DATABASE_TIMEOUT_MS,TimeUnit.MILLISECONDS); // Register ourselves as the REST API RPC implementation LOG.info("Register RPC Service " + DataProviderServiceImpl.class.getSimpleName()); this.rpcReg = rpcProviderService.registerRpcImplementation(DataProviderService.class, this); } /** * @return the dataProvider */ public DataProvider getDataProvider() { return dataProvider.getDataProvider(); } @Override public void close() throws Exception { LOG.info("Close RPC Service"); if (rpcReg != null) { rpcReg.close(); } } @Override public ListenableFuture> readFaultcurrentList(ReadFaultcurrentListInput input) { LOG.debug("RPC Request: getFaultCurrentEntityList with input {}", input); RpcResultBuilder result = read(()-> DataProviderServiceImpl.this.dataProvider.readFaultCurrentList(input)); return result.buildFuture(); } @Override public ListenableFuture> readFaultlogList(ReadFaultlogListInput input) { LOG.debug("RPC Request: getFaultCurrentEntityList with input {}", input); RpcResultBuilder result = read(()-> DataProviderServiceImpl.this.dataProvider.readFaultLogList(input)); return result.buildFuture(); } @Override public ListenableFuture> readMaintenanceList(ReadMaintenanceListInput input) { LOG.debug("RPC Request: getMaintenanceEntityList with input {}", input); RpcResultBuilder result = read(()-> DataProviderServiceImpl.this.dataProvider.readMaintenanceList(input)); return result.buildFuture(); } @Override public ListenableFuture> readMediatorServerList( ReadMediatorServerListInput input) { LOG.debug("RPC Request: getMediatorServerEntityList with input {}", input); RpcResultBuilder result = read(()-> DataProviderServiceImpl.this.dataProvider.readMediatorServerList(input)); return result.buildFuture(); } @Override public ListenableFuture> readNetworkElementConnectionList( ReadNetworkElementConnectionListInput input) { LOG.debug("RPC Request: getNetworkElementConnectionEntityList with input {}", input); RpcResultBuilder result = read(()-> DataProviderServiceImpl.this.dataProvider.readNetworkElementConnectionList(input)); return result.buildFuture(); } @Override public ListenableFuture> readPmdata15mList(ReadPmdata15mListInput input) { LOG.debug("RPC Request: getNetworkElementConnectionEntityList with input {}", input); RpcResultBuilder result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata15mList(input)); return result.buildFuture(); } @Override public ListenableFuture> readPmdata24hList(ReadPmdata24hListInput input) { LOG.debug("RPC Request: getNetworkElementConnectionEntityList with input {}", input); RpcResultBuilder result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata24hList(input)); return result.buildFuture(); } @Override public ListenableFuture> readStatus(ReadStatusInput input) { LOG.debug("RPC Request: getStatusEntityList with input {}", input); RpcResultBuilder result = read(()-> DataProviderServiceImpl.this.dataProvider.readStatus()); return result.buildFuture(); } @Override public ListenableFuture> readInventoryList(ReadInventoryListInput input) { LOG.debug("RPC Request: getInventoryEntityList with input {}", input); RpcResultBuilder result = read(()-> DataProviderServiceImpl.this.dataProvider.readInventoryList(input)); return result.buildFuture(); } @Override public ListenableFuture> readPmdata15mLtpList(ReadPmdata15mLtpListInput input) { LOG.debug("RPC Request: readPmdataLtpList with input {}", input); RpcResultBuilder result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata15mLtpList(input)); return result.buildFuture(); } @Override public ListenableFuture> readPmdata15mDeviceList(ReadPmdata15mDeviceListInput input) { LOG.debug("RPC Request: readPmdataDeviceList with input {}", input); RpcResultBuilder result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata15mDeviceList(input)); return result.buildFuture(); } @Override public ListenableFuture> readPmdata24hLtpList(ReadPmdata24hLtpListInput input) { LOG.debug("RPC Request: readPmdataLtpList with input {}", input); RpcResultBuilder result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata24hLtpList(input)); return result.buildFuture(); } @Override public ListenableFuture> readPmdata24hDeviceList(ReadPmdata24hDeviceListInput input) { LOG.debug("RPC Request: readPmdataDeviceList with input {}", input); RpcResultBuilder result = read(()-> DataProviderServiceImpl.this.dataProvider.readPmdata24hDeviceList(input)); return result.buildFuture(); } @Override public ListenableFuture> readConnectionlogList( ReadConnectionlogListInput input) { LOG.debug("RPC Request: readConnectionlogList with input {}", input); RpcResultBuilder result = read(() -> DataProviderServiceImpl.this.dataProvider.readConnectionlogList(input)); return result.buildFuture(); } @Override public ListenableFuture> createNetworkElementConnection( CreateNetworkElementConnectionInput input) { LOG.debug("RPC Request: createNetworkElementConnection with input {}", input); RpcResultBuilder result = read(() -> DataProviderServiceImpl.this.dataProvider.createNetworkElementConnection(input)); return result.buildFuture(); } @Override public ListenableFuture> updateNetworkElementConnection( UpdateNetworkElementConnectionInput input) { LOG.debug("RPC Request: updateNetworkElementConnection with input {}", input); RpcResultBuilder result = read(() -> DataProviderServiceImpl.this.dataProvider.updateNetworkElementConnection(input)); return result.buildFuture(); } @Override public ListenableFuture> deleteNetworkElementConnection( DeleteNetworkElementConnectionInput input) { RpcResultBuilder result = read(() -> DataProviderServiceImpl.this.dataProvider.deleteNetworkElementConnection(input)); return result.buildFuture(); } @Override public ListenableFuture> deleteMediatorServer( DeleteMediatorServerInput input) { LOG.debug("RPC Request: deleteMediatorServer with input {}", input); RpcResultBuilder result = read(() -> DataProviderServiceImpl.this.dataProvider.deleteMediatorServer(input)); return result.buildFuture(); } @Override public ListenableFuture> createMediatorServer( CreateMediatorServerInput input) { LOG.debug("RPC Request: createMediatorServer with input {}", input); RpcResultBuilder result = read(() -> DataProviderServiceImpl.this.dataProvider.createMediatorServer(input)); return result.buildFuture(); } @Override public ListenableFuture> createMaintenance(CreateMaintenanceInput input) { LOG.debug("RPC Request: createMaintenance with input {}", input); RpcResultBuilder result = read(() -> DataProviderServiceImpl.this.dataProvider.createMaintenance(input)); return result.buildFuture(); } @Override public ListenableFuture> deleteMaintenance(DeleteMaintenanceInput input) { LOG.debug("RPC Request: deleteMaintenance with input {}", input); RpcResultBuilder result = read(() -> DataProviderServiceImpl.this.dataProvider.deleteMaintenance(input)); return result.buildFuture(); } @Override public ListenableFuture> updateMediatorServer( UpdateMediatorServerInput input) { LOG.debug("RPC Request: updateMediatorServer with input {}", input); RpcResultBuilder result = read(() -> DataProviderServiceImpl.this.dataProvider.updateMediatorServer(input)); return result.buildFuture(); } @Override public ListenableFuture> updateMaintenance(UpdateMaintenanceInput input) { LOG.debug("RPC Request: updateMaintenance with input {}", input); RpcResultBuilder result = read(() -> DataProviderServiceImpl.this.dataProvider.updateMaintenance(input)); return result.buildFuture(); } @Override public ListenableFuture> readEventlogList(ReadEventlogListInput input) { LOG.debug("RPC Request: readEventlogList with input {}", input); RpcResultBuilder result = read(() -> DataProviderServiceImpl.this.dataProvider.readEventlogList(input)); return result.buildFuture(); } // -- private classes and functions private static String assembleExceptionMessage(Exception e) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); StringBuffer buf = new StringBuffer(); buf.append("Exception: "); buf.append(sw.toString()); return buf.toString(); } private interface GetEntityInput { Builder get() throws IOException; } private static RpcResultBuilder read(GetEntityInput inputgetter ) { RpcResultBuilder result; try { Builder outputBuilder = inputgetter.get(); result = RpcResultBuilder.success(outputBuilder); } catch (Exception e) { LOG.info("Exception", e); result = RpcResultBuilder.failed(); result.withError(ErrorType.APPLICATION, assembleExceptionMessage(e)); } return result; } }