2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 
   6  * ================================================================================
 
   7  * Modifications Copyright (C) 2018 IBM.
 
   8  * Modifications Copyright (c) 2019 Samsung
 
   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.so.adapters.requestsdb;
 
  26 import java.sql.Timestamp;
 
  27 import java.util.List;
 
  28 import javax.jws.WebService;
 
  29 import javax.transaction.Transactional;
 
  30 import org.onap.so.adapters.requestsdb.exceptions.MsoRequestsDbException;
 
  31 import org.onap.so.db.request.beans.InfraActiveRequests;
 
  32 import org.onap.so.db.request.beans.OperationStatus;
 
  33 import org.onap.so.db.request.beans.ResourceOperationStatus;
 
  34 import org.onap.so.db.request.beans.ResourceOperationStatusId;
 
  35 import org.onap.so.db.request.beans.SiteStatus;
 
  36 import org.onap.so.db.request.data.repository.InfraActiveRequestsRepository;
 
  37 import org.onap.so.db.request.data.repository.OperationStatusRepository;
 
  38 import org.onap.so.db.request.data.repository.ResourceOperationStatusRepository;
 
  39 import org.onap.so.db.request.data.repository.SiteStatusRepository;
 
  40 import org.onap.so.logger.ErrorCode;
 
  41 import org.onap.so.requestsdb.RequestsDbConstant;
 
  42 import org.slf4j.Logger;
 
  43 import org.slf4j.LoggerFactory;
 
  44 import org.springframework.beans.factory.annotation.Autowired;
 
  45 import org.springframework.context.annotation.Primary;
 
  46 import org.springframework.stereotype.Component;
 
  48 @WebService(serviceName = "RequestsDbAdapter",
 
  49         endpointInterface = "org.onap.so.adapters.requestsdb.MsoRequestsDbAdapter",
 
  50         targetNamespace = "http://org.onap.so/requestsdb")
 
  53 public class MsoRequestsDbAdapterImpl implements MsoRequestsDbAdapter {
 
  55     private static Logger logger = LoggerFactory.getLogger(MsoRequestsDbAdapterImpl.class);
 
  58     private InfraActiveRequestsRepository infraActive;
 
  61     private SiteStatusRepository siteRepo;
 
  64     private OperationStatusRepository operationStatusRepository;
 
  67     private ResourceOperationStatusRepository resourceOperationStatusRepository;
 
  71     public void updateInfraRequest(String requestId, String lastModifiedBy, String statusMessage, String responseBody,
 
  72             RequestStatusType requestStatus, String progress, String vnfOutputs, String serviceInstanceId,
 
  73             String networkId, String vnfId, String vfModuleId, String volumeGroupId, String serviceInstanceName,
 
  74             String configurationId, String configurationName, String vfModuleName) throws MsoRequestsDbException {
 
  76             InfraActiveRequests request = infraActive.findOneByRequestId(requestId);
 
  77             if (request == null) {
 
  78                 String error = "Entity not found. Unable to retrieve MSO Infra Requests DB for Request ID " + requestId;
 
  79                 throw new MsoRequestsDbException(error);
 
  81             if (statusMessage != null) {
 
  82                 request.setStatusMessage(statusMessage);
 
  84             if (responseBody != null) {
 
  85                 request.setResponseBody(responseBody);
 
  87             if (requestStatus != null) {
 
  88                 request.setRequestStatus(requestStatus.toString());
 
  90             if (progress != null) {
 
  91                 setProgress(progress, request);
 
  93             if (vnfOutputs != null) {
 
  94                 request.setVnfOutputs(vnfOutputs);
 
  96             if (serviceInstanceId != null) {
 
  97                 request.setServiceInstanceId(serviceInstanceId);
 
  99             if (networkId != null) {
 
 100                 request.setNetworkId(networkId);
 
 103                 request.setVnfId(vnfId);
 
 105             if (vfModuleId != null) {
 
 106                 request.setVfModuleId(vfModuleId);
 
 108             if (volumeGroupId != null) {
 
 109                 request.setVolumeGroupId(volumeGroupId);
 
 111             if (serviceInstanceName != null) {
 
 112                 request.setServiceInstanceName(serviceInstanceName);
 
 114             if (vfModuleName != null) {
 
 115                 request.setVfModuleName(vfModuleName);
 
 117             if (configurationId != null) {
 
 118                 request.setConfigurationId(configurationId);
 
 120             if (configurationName != null) {
 
 121                 request.setConfigurationName(configurationName);
 
 123             if (requestStatus == RequestStatusType.COMPLETE || requestStatus == RequestStatusType.FAILED) {
 
 124                 Timestamp nowTimeStamp = new Timestamp(System.currentTimeMillis());
 
 125                 request.setEndTime(nowTimeStamp);
 
 127             request.setLastModifiedBy(lastModifiedBy);
 
 128             infraActive.save(request);
 
 129         } catch (Exception e) {
 
 130             String error = "Error retrieving MSO Infra Requests DB for Request ID " + requestId;
 
 131             logger.error(error, e);
 
 132             throw new MsoRequestsDbException(error, ErrorCode.BusinessProcesssError, e);
 
 136     private void setProgress(String progress, InfraActiveRequests request) {
 
 138             request.setProgress(Long.parseLong(progress));
 
 139         } catch (NumberFormatException e) {
 
 140             logger.warn("UpdateInfraRequest", "Invalid value sent for progress");
 
 146     public InfraActiveRequests getInfraRequest(String requestId) throws MsoRequestsDbException {
 
 147         logger.debug("Call to MSO Infra RequestsDb adapter get method with request Id: {}", requestId);
 
 148         InfraActiveRequests request = null;
 
 150             request = infraActive.findOneByRequestId(requestId);
 
 151             if (request == null) {
 
 152                 String error = "Entity not found. Unable to retrieve MSO Infra Requests DB for Request ID " + requestId;
 
 153                 throw new MsoRequestsDbException(error);
 
 155         } catch (Exception e) {
 
 156             String error = "Error retrieving MSO Infra Requests DB for Request ID " + requestId;
 
 157             logger.error(error, e);
 
 158             throw new MsoRequestsDbException(error, ErrorCode.BusinessProcesssError, e);
 
 164      * Get SiteStatus by SiteName.
 
 166      * @param siteName The unique name of the site
 
 167      * @return Status of that site
 
 171     public boolean getSiteStatus(String siteName) {
 
 172         SiteStatus siteStatus;
 
 173         logger.debug("Request database - get Site Status with Site name: {}", siteName);
 
 174         siteStatus = siteRepo.findOneBySiteName(siteName);
 
 175         if (siteStatus == null) {
 
 176             // if not exist in DB, it means the site is not disabled, thus
 
 180             return siteStatus.getStatus();
 
 185      * update operation status <br>
 
 189      * @param operationType
 
 192      * @param operationContent
 
 195      * @throws MsoRequestsDbException
 
 196      * @since ONAP Amsterdam Release
 
 200     public void updateServiceOperationStatus(String serviceId, String operationId, String operationType, String userId,
 
 201             String result, String operationContent, String progress, String reason) throws MsoRequestsDbException {
 
 202         OperationStatus operStatus = operationStatusRepository.findOneByServiceIdAndOperationId(serviceId, operationId);
 
 203         if (operStatus == null) {
 
 204             String error = "Entity not found. Unable to retrieve OperationStatus Object ServiceId: " + serviceId
 
 205                     + " operationId: " + operationId;
 
 207             operStatus = new OperationStatus();
 
 208             operStatus.setOperationId(operationId);
 
 209             operStatus.setServiceId(serviceId);
 
 212         operStatus.setUserId(userId);
 
 213         operStatus.setOperation(operationType);
 
 214         operStatus.setReason(reason);
 
 215         operStatus.setProgress(progress);
 
 216         operStatus.setResult(result);
 
 217         operStatus.setOperationContent(operationContent);
 
 218         operStatus.setResult(result);
 
 219         operationStatusRepository.save(operStatus);
 
 223      * Init operation status <br>
 
 227      * @param operationType
 
 230      * @param operationContent
 
 233      * @throws MsoRequestsDbException
 
 234      * @since ONAP Casablanca Release
 
 238     public void initServiceOperationStatus(String serviceId, String operationId, String operationType, String userId,
 
 239             String result, String operationContent, String progress, String reason) throws MsoRequestsDbException {
 
 240         OperationStatus operStatus = new OperationStatus();
 
 242         operStatus.setOperationId(operationId);
 
 243         operStatus.setServiceId(serviceId);
 
 244         operStatus.setUserId(userId);
 
 245         operStatus.setOperation(operationType);
 
 246         operStatus.setReason(reason);
 
 247         operStatus.setProgress(progress);
 
 248         operStatus.setResult(result);
 
 249         operStatus.setOperationContent(operationContent);
 
 250         operStatus.setResult(result);
 
 251         operationStatusRepository.save(operStatus);
 
 255      * init the operation status of all the resources <br>
 
 257      * @param serviceId the service Id
 
 258      * @param operationId the operation Id
 
 259      * @param operationType the operationType
 
 260      * @param resourceTemplateUUIDs the resources, the UUID is split by ":"
 
 261      * @throws MsoRequestsDbException
 
 262      * @since ONAP Amsterdam Release
 
 266     public void initResourceOperationStatus(String serviceId, String operationId, String operationType,
 
 267             String resourceTemplateUUIDs) throws MsoRequestsDbException {
 
 268         String[] resourceLst = resourceTemplateUUIDs.split(":");
 
 269         for (String resource : resourceLst) {
 
 270             if ("".equals(resource)) {
 
 273             ResourceOperationStatus resourceStatus = new ResourceOperationStatus();
 
 274             resourceStatus.setOperationId(operationId);
 
 275             resourceStatus.setServiceId(serviceId);
 
 276             resourceStatus.setResourceTemplateUUID(resource);
 
 277             resourceStatus.setOperType(operationType);
 
 278             resourceStatus.setStatus(RequestsDbConstant.Status.PROCESSING);
 
 279             resourceStatus.setStatusDescription("Waiting for start");
 
 280             resourceOperationStatusRepository.save(resourceStatus);
 
 286      * get resource operation status <br>
 
 290      * @param resourceTemplateUUID
 
 292      * @throws MsoRequestsDbException
 
 293      * @since ONAP Amsterdam Release
 
 296     public ResourceOperationStatus getResourceOperationStatus(String serviceId, String operationId,
 
 297             String resourceTemplateUUID) throws MsoRequestsDbException {
 
 299         return resourceOperationStatusRepository
 
 300                 .findById(new ResourceOperationStatusId(serviceId, operationId, resourceTemplateUUID))
 
 301                 .orElseThrow(() -> new MsoRequestsDbException("Operation not found:" + operationId));
 
 306      * update resource operation status <br>
 
 310      * @param resourceTemplateUUID
 
 311      * @param operationType
 
 312      * @param resourceInstanceID
 
 317      * @param statusDescription
 
 318      * @throws MsoRequestsDbException
 
 319      * @since ONAP Amsterdam Release
 
 322     public void updateResourceOperationStatus(String serviceId, String operationId, String resourceTemplateUUID,
 
 323             String operationType, String resourceInstanceID, String jobId, String status, String progress,
 
 324             String errorCode, String statusDescription) throws MsoRequestsDbException {
 
 325         ResourceOperationStatus resStatus = new ResourceOperationStatus();
 
 326         resStatus.setServiceId(serviceId);
 
 327         resStatus.setOperationId(operationId);
 
 328         resStatus.setResourceTemplateUUID(resourceTemplateUUID);
 
 329         resStatus.setOperType(operationType);
 
 330         resStatus.setResourceInstanceID(resourceInstanceID);
 
 331         resStatus.setJobId(jobId);
 
 332         resStatus.setStatus(status);
 
 333         resStatus.setProgress(progress);
 
 334         resStatus.setErrorCode(errorCode);
 
 335         resStatus.setStatusDescription(statusDescription);
 
 336         resourceOperationStatusRepository.save(resStatus);
 
 338         updateOperationStatusBasedOnResourceStatus(resStatus);
 
 342      * update service operation status when a operation resource status updated <br>
 
 344      * @param operStatus the resource operation status
 
 345      * @since ONAP Amsterdam Release
 
 347     private void updateOperationStatusBasedOnResourceStatus(ResourceOperationStatus operStatus) {
 
 348         String serviceId = operStatus.getServiceId();
 
 349         String operationId = operStatus.getOperationId();
 
 351         logger.debug("Request database - update Operation Status Based On Resource Operation Status with service Id: "
 
 352                 + "{}, operationId: {}", serviceId, operationId);
 
 354         List<ResourceOperationStatus> lstResourceStatus =
 
 355                 resourceOperationStatusRepository.findByServiceIdAndOperationId(serviceId, operationId);
 
 356         if (lstResourceStatus == null) {
 
 357             logger.error("Unable to retrieve resourceOperStatus Object by ServiceId: {} operationId: {}", serviceId,
 
 362         // count the total progress
 
 363         int resourceCount = lstResourceStatus.size();
 
 365         boolean isFinished = true;
 
 366         for (ResourceOperationStatus lstResourceStatu : lstResourceStatus) {
 
 367             progress = progress + Integer.valueOf(lstResourceStatu.getProgress()) / resourceCount;
 
 368             if (RequestsDbConstant.Status.PROCESSING.equals(lstResourceStatu.getStatus())) {
 
 373         OperationStatus serviceOperStatus =
 
 374                 operationStatusRepository.findOneByServiceIdAndOperationId(serviceId, operationId);
 
 375         if (serviceOperStatus == null) {
 
 376             String error = "Entity not found. Unable to retrieve OperationStatus Object ServiceId: " + serviceId
 
 377                     + " operationId: " + operationId;
 
 380             serviceOperStatus = new OperationStatus();
 
 381             serviceOperStatus.setOperationId(operationId);
 
 382             serviceOperStatus.setServiceId(serviceId);
 
 385         progress = progress > 100 ? 100 : progress;
 
 386         serviceOperStatus.setProgress(String.valueOf(progress));
 
 387         serviceOperStatus.setOperationContent(operStatus.getStatusDescription());
 
 388         // if current resource failed. service failed.
 
 389         if (RequestsDbConstant.Status.ERROR.equals(operStatus.getStatus())) {
 
 390             serviceOperStatus.setResult(RequestsDbConstant.Status.ERROR);
 
 391             serviceOperStatus.setReason(operStatus.getStatusDescription());
 
 392         } else if (isFinished) {
 
 394             serviceOperStatus.setResult(RequestsDbConstant.Status.FINISHED);
 
 395             serviceOperStatus.setProgress(RequestsDbConstant.Progress.ONE_HUNDRED);
 
 398         operationStatusRepository.save(serviceOperStatus);