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;
 
  29 import javax.jws.WebService;
 
  30 import javax.transaction.Transactional;
 
  31 import org.onap.so.adapters.requestsdb.exceptions.MsoRequestsDbException;
 
  32 import org.onap.so.db.request.beans.InfraActiveRequests;
 
  33 import org.onap.so.db.request.beans.OperationStatus;
 
  34 import org.onap.so.db.request.beans.ResourceOperationStatus;
 
  35 import org.onap.so.db.request.beans.ResourceOperationStatusId;
 
  36 import org.onap.so.db.request.beans.SiteStatus;
 
  37 import org.onap.so.db.request.data.repository.InfraActiveRequestsRepository;
 
  38 import org.onap.so.db.request.data.repository.OperationStatusRepository;
 
  39 import org.onap.so.db.request.data.repository.ResourceOperationStatusRepository;
 
  40 import org.onap.so.db.request.data.repository.SiteStatusRepository;
 
  41 import org.onap.so.logger.MsoLogger;
 
  42 import org.onap.so.requestsdb.RequestsDbConstant;
 
  43 import org.slf4j.Logger;
 
  44 import org.slf4j.LoggerFactory;
 
  45 import org.springframework.beans.factory.annotation.Autowired;
 
  46 import org.springframework.context.annotation.Primary;
 
  47 import org.springframework.stereotype.Component;
 
  49 @WebService(serviceName = "RequestsDbAdapter", endpointInterface = "org.onap.so.adapters.requestsdb.MsoRequestsDbAdapter", targetNamespace = "http://org.onap.so/requestsdb")
 
  52 public class MsoRequestsDbAdapterImpl implements MsoRequestsDbAdapter { 
 
  54         private static Logger logger = LoggerFactory.getLogger(MsoRequestsDbAdapterImpl.class);
 
  57         private InfraActiveRequestsRepository infraActive;
 
  60         private SiteStatusRepository siteRepo;
 
  63         private OperationStatusRepository operationStatusRepository;
 
  66         private ResourceOperationStatusRepository resourceOperationStatusRepository;
 
  70         public void updateInfraRequest(String requestId, String lastModifiedBy, String statusMessage, String responseBody,
 
  71                         RequestStatusType requestStatus, String progress, String vnfOutputs, String serviceInstanceId,
 
  72                         String networkId, String vnfId, String vfModuleId, String volumeGroupId, String serviceInstanceName,
 
  73                         String configurationId, String configurationName, String vfModuleName) throws MsoRequestsDbException {
 
  75                         InfraActiveRequests request = infraActive.findOneByRequestIdOrClientRequestId(requestId, requestId);
 
  76                         if (request == null) {
 
  77                                 String error = "Entity not found. Unable to retrieve MSO Infra Requests DB for Request ID " + requestId;
 
  78                                 throw new MsoRequestsDbException(error);
 
  80                         if (statusMessage != null) {
 
  81                                 request.setStatusMessage(statusMessage);
 
  83                         if (responseBody != null) {
 
  84                                 request.setResponseBody(responseBody);
 
  86                         if (requestStatus != null) {
 
  87                                 request.setRequestStatus(requestStatus.toString());
 
  89                         if (progress != null) {
 
  90                                 setProgress(progress, request);
 
  92                         if (vnfOutputs != null) {
 
  93                                 request.setVnfOutputs(vnfOutputs);
 
  95                         if (serviceInstanceId != null) {
 
  96                                 request.setServiceInstanceId(serviceInstanceId);
 
  98                         if (networkId != null) {
 
  99                                 request.setNetworkId(networkId);
 
 102                                 request.setVnfId(vnfId);
 
 104                         if (vfModuleId != null) {
 
 105                                 request.setVfModuleId(vfModuleId);
 
 107                         if (volumeGroupId != null) {
 
 108                                 request.setVolumeGroupId(volumeGroupId);
 
 110                         if (serviceInstanceName != null) {
 
 111                                 request.setServiceInstanceName(serviceInstanceName);
 
 113                         if (vfModuleName != null) {
 
 114                                 request.setVfModuleName(vfModuleName);
 
 116                         if (configurationId != null) {
 
 117                                 request.setConfigurationId(configurationId);
 
 119                         if (configurationName != null) {
 
 120                                 request.setConfigurationName(configurationName);
 
 122                         if (requestStatus == RequestStatusType.COMPLETE || requestStatus == RequestStatusType.FAILED) {
 
 123                                 Timestamp nowTimeStamp = new Timestamp(System.currentTimeMillis());
 
 124                                 request.setEndTime(nowTimeStamp);
 
 126                         request.setLastModifiedBy(lastModifiedBy);
 
 127                         infraActive.save(request);
 
 128                 } catch (Exception e) {
 
 129                         String error = "Error retrieving MSO Infra Requests DB for Request ID " + requestId;
 
 130                         logger.error(error, e);
 
 131                         throw new MsoRequestsDbException(error, MsoLogger.ErrorCode.BusinessProcesssError, e);
 
 135         private void setProgress(String progress, InfraActiveRequests request) {
 
 137                         request.setProgress(Long.parseLong(progress));
 
 138                 } catch (NumberFormatException e) {
 
 139                         logger.warn("UpdateInfraRequest", "Invalid value sent for progress");
 
 145         public InfraActiveRequests getInfraRequest(String requestId) throws MsoRequestsDbException {            
 
 146                 logger.debug("Call to MSO Infra RequestsDb adapter get method with request Id: {}", requestId);
 
 147                 InfraActiveRequests request = null;
 
 149                         request = infraActive.findOneByRequestIdOrClientRequestId(requestId, requestId);
 
 150                         if (request == null) {
 
 151                                 String error = "Entity not found. Unable to retrieve MSO Infra Requests DB for Request ID " + requestId;
 
 152                                 throw new MsoRequestsDbException(error);
 
 154                 } catch (Exception e) {
 
 155                         String error = "Error retrieving MSO Infra Requests DB for Request ID " + requestId;
 
 156                         logger.error(error,e);
 
 157                         throw new MsoRequestsDbException(error,MsoLogger.ErrorCode.BusinessProcesssError , e);
 
 163          * Get SiteStatus by SiteName.
 
 166          *            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 + " 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>
 
 261          * @param operationType
 
 263          * @param resourceTemplateUUIDs
 
 264          *            the resources, the UUID is split by ":"
 
 265          * @throws MsoRequestsDbException
 
 266          * @since ONAP Amsterdam Release
 
 270         public void initResourceOperationStatus(String serviceId, String operationId, String operationType,
 
 271                         String resourceTemplateUUIDs) throws MsoRequestsDbException {
 
 272                 String[] resourceLst = resourceTemplateUUIDs.split(":");
 
 273                 for (String resource : resourceLst) {
 
 274                         if ("".equals(resource)) {
 
 277                         ResourceOperationStatus resourceStatus = new ResourceOperationStatus();
 
 278                         resourceStatus.setOperationId(operationId);
 
 279                         resourceStatus.setServiceId(serviceId);
 
 280                         resourceStatus.setResourceTemplateUUID(resource);
 
 281                         resourceStatus.setOperType(operationType);
 
 282                         resourceStatus.setStatus(RequestsDbConstant.Status.PROCESSING);
 
 283                         resourceStatus.setStatusDescription("Waiting for start");
 
 284                         resourceOperationStatusRepository.save(resourceStatus);
 
 290          * get resource operation status <br>
 
 294          * @param resourceTemplateUUID
 
 296          * @throws MsoRequestsDbException
 
 297          * @since ONAP Amsterdam Release
 
 300         public ResourceOperationStatus getResourceOperationStatus(String serviceId, String operationId,
 
 301                         String resourceTemplateUUID) throws MsoRequestsDbException {
 
 303                 return resourceOperationStatusRepository
 
 304                                 .findById(new ResourceOperationStatusId(serviceId, operationId, resourceTemplateUUID)).
 
 305                                 orElseThrow( () -> new MsoRequestsDbException("Operation not found:" + operationId));
 
 310          * update resource operation status <br>
 
 314          * @param resourceTemplateUUID
 
 315          * @param operationType
 
 316          * @param resourceInstanceID
 
 321          * @param statusDescription
 
 322          * @throws MsoRequestsDbException
 
 323          * @since ONAP Amsterdam Release
 
 326         public void updateResourceOperationStatus(String serviceId, String operationId, String resourceTemplateUUID,
 
 327                         String operationType, String resourceInstanceID, String jobId, String status, String progress,
 
 328                         String errorCode, String statusDescription) throws MsoRequestsDbException {
 
 329                 ResourceOperationStatus resStatus = new ResourceOperationStatus();
 
 330                 resStatus.setServiceId(serviceId);
 
 331                 resStatus.setOperationId(operationId);
 
 332                 resStatus.setResourceTemplateUUID(resourceTemplateUUID);
 
 333                 resStatus.setOperType(operationType);
 
 334                 resStatus.setResourceInstanceID(resourceInstanceID);
 
 335                 resStatus.setJobId(jobId);
 
 336                 resStatus.setStatus(status);
 
 337                 resStatus.setProgress(progress);
 
 338                 resStatus.setErrorCode(errorCode);
 
 339                 resStatus.setStatusDescription(statusDescription);
 
 340                 resourceOperationStatusRepository.save(resStatus);
 
 342                 updateOperationStatusBasedOnResourceStatus(resStatus);
 
 346      * update service operation status when a operation resource status updated
 
 349      * @param operStatus the resource operation status
 
 350      * @since ONAP Amsterdam Release
 
 352     private void updateOperationStatusBasedOnResourceStatus(ResourceOperationStatus operStatus) {
 
 353         String serviceId = operStatus.getServiceId();
 
 354         String operationId = operStatus.getOperationId();
 
 356         logger.debug("Request database - update Operation Status Based On Resource Operation Status with service Id: "
 
 357                                         + "{}, operationId: {}", serviceId, operationId);
 
 359         List<ResourceOperationStatus> lstResourceStatus = resourceOperationStatusRepository.findByServiceIdAndOperationId(serviceId, operationId);
 
 360                 if (lstResourceStatus == null) {
 
 361                         logger.error("Unable to retrieve resourceOperStatus Object by ServiceId: {} operationId: {}", serviceId,
 
 366                 // count the total progress
 
 367         int resourceCount = lstResourceStatus.size();
 
 369         boolean isFinished = true;
 
 370         for (ResourceOperationStatus lstResourceStatu : lstResourceStatus) {
 
 371             progress = progress + Integer.valueOf(lstResourceStatu.getProgress()) / resourceCount;
 
 372             if (RequestsDbConstant.Status.PROCESSING.equals(lstResourceStatu.getStatus())) {
 
 377         OperationStatus serviceOperStatus = operationStatusRepository.findOneByServiceIdAndOperationId(serviceId, operationId);
 
 378                 if (serviceOperStatus == null) {
 
 379                         String error = "Entity not found. Unable to retrieve OperationStatus Object ServiceId: " + serviceId + " operationId: "
 
 383                         serviceOperStatus = new OperationStatus();
 
 384                         serviceOperStatus.setOperationId(operationId);
 
 385                         serviceOperStatus.setServiceId(serviceId);
 
 388         progress = progress > 100 ? 100 : progress;
 
 389         serviceOperStatus.setProgress(String.valueOf(progress));
 
 390         serviceOperStatus.setOperationContent(operStatus.getStatusDescription());
 
 391         // if current resource failed. service failed.
 
 392         if(RequestsDbConstant.Status.ERROR.equals(operStatus.getStatus())) {
 
 393             serviceOperStatus.setResult(RequestsDbConstant.Status.ERROR);
 
 394             serviceOperStatus.setReason(operStatus.getStatusDescription());
 
 395         } else if(isFinished) {
 
 397             serviceOperStatus.setResult(RequestsDbConstant.Status.FINISHED);
 
 398             serviceOperStatus.setProgress(RequestsDbConstant.Progress.ONE_HUNDRED);
 
 401         operationStatusRepository.save(serviceOperStatus);