2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
 
   6  * ================================================================================
 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
 
   8  * you may not use this file except in compliance with the License.
 
   9  * You may obtain a copy of the License at
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  13  * Unless required by applicable law or agreed to in writing, software
 
  14  * distributed under the License is distributed on an "AS IS" BASIS,
 
  15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  16  * See the License for the specific language governing permissions and
 
  17  * limitations under the License.
 
  18  * ============LICENSE_END=========================================================
 
  20 package org.onap.so.apihandlerinfra;
 
  22 import java.io.IOException;
 
  23 import java.sql.Timestamp;
 
  24 import java.util.HashMap;
 
  25 import javax.transaction.Transactional;
 
  26 import javax.ws.rs.Consumes;
 
  27 import javax.ws.rs.POST;
 
  28 import javax.ws.rs.Path;
 
  29 import javax.ws.rs.PathParam;
 
  30 import javax.ws.rs.Produces;
 
  31 import javax.ws.rs.container.ContainerRequestContext;
 
  32 import javax.ws.rs.core.Context;
 
  33 import javax.ws.rs.core.MediaType;
 
  34 import javax.ws.rs.core.Response;
 
  35 import org.apache.http.HttpStatus;
 
  36 import org.onap.logging.ref.slf4j.ONAPLogConstants;
 
  37 import org.onap.so.apihandler.common.ErrorNumbers;
 
  38 import org.onap.so.apihandler.common.RequestClientParameter;
 
  39 import org.onap.so.apihandlerinfra.exceptions.ApiException;
 
  40 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
 
  41 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
 
  42 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
 
  43 import org.onap.so.constants.Status;
 
  44 import org.onap.so.db.request.beans.InfraActiveRequests;
 
  45 import org.onap.so.db.request.client.RequestsDbClient;
 
  46 import org.onap.so.logger.ErrorCode;
 
  47 import org.onap.so.logger.HttpHeadersConstants;
 
  48 import org.onap.so.logger.LogConstants;
 
  49 import org.onap.so.logger.MdcConstants;
 
  50 import org.onap.so.logger.MessageEnum;
 
  51 import org.onap.so.serviceinstancebeans.ModelInfo;
 
  52 import org.onap.so.serviceinstancebeans.ModelType;
 
  53 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
 
  54 import org.slf4j.Logger;
 
  55 import org.slf4j.LoggerFactory;
 
  57 import org.springframework.beans.factory.annotation.Autowired;
 
  58 import org.springframework.stereotype.Component;
 
  59 import org.springframework.web.client.HttpClientErrorException;
 
  60 import io.swagger.v3.oas.annotations.OpenAPIDefinition;
 
  61 import io.swagger.v3.oas.annotations.Operation;
 
  62 import io.swagger.v3.oas.annotations.info.Info;
 
  63 import io.swagger.v3.oas.annotations.media.ArraySchema;
 
  64 import io.swagger.v3.oas.annotations.media.Content;
 
  65 import io.swagger.v3.oas.annotations.media.Schema;
 
  66 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 
  68 @Path("onap/so/infra/orchestrationRequests")
 
  69 @OpenAPIDefinition(info = @Info(title = "onap/so/infra/orchestrationRequests"))
 
  72 public class ResumeOrchestrationRequest {
 
  73     private static Logger logger = LoggerFactory.getLogger(ResumeOrchestrationRequest.class);
 
  74     private static final String SAVE_TO_DB = "save instance to db";
 
  75     private static String uriPrefix = "/orchestrationRequests/";
 
  78     private RequestHandlerUtils requestHandlerUtils;
 
  81     private ServiceInstances serviceInstances;
 
  84     private RequestsDbClient requestsDbClient;
 
  87     private MsoRequest msoRequest;
 
  90     @Path("/{version:[vV][7]}/{requestId}/resume")
 
  91     @Consumes(MediaType.APPLICATION_JSON)
 
  92     @Produces(MediaType.APPLICATION_JSON)
 
  93     @Operation(description = "Resume request for a given requestId", responses = @ApiResponse(
 
  94             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
 
  96     public Response resumeOrchestrationRequest(@PathParam("requestId") String requestId,
 
  97             @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
 
  99         Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());
 
 100         String currentRequestId = MDC.get(ONAPLogConstants.MDCs.REQUEST_ID);
 
 101         logger.info("Beginning resume operation for new request: {}", currentRequestId);
 
 102         InfraActiveRequests infraActiveRequest = null;
 
 103         String source = MDC.get(MdcConstants.ORIGINAL_PARTNER_NAME);
 
 104         String requestorId = MDC.get(HttpHeadersConstants.REQUESTOR_ID);
 
 105         requestHandlerUtils.getRequestUri(requestContext, uriPrefix);
 
 106         String requestUri = MDC.get(LogConstants.HTTP_URL);
 
 107         version = version.substring(1);
 
 110             infraActiveRequest = requestsDbClient.getInfraActiveRequestbyRequestId(requestId);
 
 111         } catch (HttpClientErrorException e) {
 
 112             logger.error("Error occurred while performing requestDb lookup by requestId: " + requestId, e);
 
 113             ErrorLoggerInfo errorLoggerInfo =
 
 114                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.AvailabilityError).build();
 
 115             throw new ValidateException.Builder("Exception while performing requestDb lookup by requestId",
 
 116                     HttpStatus.SC_NOT_FOUND, ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB).cause(e)
 
 117                             .errorInfo(errorLoggerInfo).build();
 
 120         InfraActiveRequests currentActiveRequest = requestHandlerUtils.createNewRecordCopyFromInfraActiveRequest(
 
 121                 infraActiveRequest, currentRequestId, startTimeStamp, source, requestUri, requestorId, requestId);
 
 123         if (infraActiveRequest == null) {
 
 124             logger.error("No infraActiveRequest record found for requestId: {} in requesteDb lookup", requestId);
 
 125             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND,
 
 126                     ErrorCode.BusinessProcesssError).build();
 
 127             ValidateException validateException = new ValidateException.Builder(
 
 128                     "Null response from requestDB when searching by requestId: " + requestId, HttpStatus.SC_NOT_FOUND,
 
 129                     ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
 
 130             requestHandlerUtils.updateStatus(currentActiveRequest, Status.FAILED, validateException.getMessage());
 
 131             throw validateException;
 
 135         return resumeRequest(infraActiveRequest, currentActiveRequest, version, requestUri);
 
 138     protected Response resumeRequest(InfraActiveRequests infraActiveRequest, InfraActiveRequests currentActiveRequest,
 
 139             String version, String requestUri) throws ApiException {
 
 140         String requestBody = infraActiveRequest.getRequestBody();
 
 141         Action action = Action.valueOf(infraActiveRequest.getRequestAction());
 
 142         String requestId = currentActiveRequest.getRequestId();
 
 143         String requestScope = infraActiveRequest.getRequestScope();
 
 144         String instanceName = getInstanceName(infraActiveRequest, requestScope, currentActiveRequest);
 
 145         HashMap<String, String> instanceIdMap = setInstanceIdMap(infraActiveRequest, requestScope);
 
 147         checkForInProgressRequest(currentActiveRequest, instanceIdMap, requestScope, instanceName, action);
 
 149         ServiceInstancesRequest sir = null;
 
 150         sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestBody, action, requestId, requestUri);
 
 151         Boolean aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
 
 153         String pnfCorrelationId = serviceInstances.getPnfCorrelationId(sir);
 
 154         RecipeLookupResult recipeLookupResult = requestHandlerUtils.getServiceInstanceOrchestrationURI(sir, action,
 
 155                 msoRequest.getAlacarteFlag(sir), currentActiveRequest);
 
 157         requestDbSave(currentActiveRequest);
 
 159         if (aLaCarte == null) {
 
 160             aLaCarte = setALaCarteFlagIfNull(requestScope, action);
 
 163         RequestClientParameter requestClientParameter = setRequestClientParameter(recipeLookupResult, version,
 
 164                 infraActiveRequest, currentActiveRequest, pnfCorrelationId, aLaCarte, sir);
 
 166         return requestHandlerUtils.postBPELRequest(currentActiveRequest, requestClientParameter,
 
 167                 recipeLookupResult.getOrchestrationURI(), requestScope);
 
 170     protected Boolean setALaCarteFlagIfNull(String requestScope, Action action) {
 
 171         Boolean aLaCarteFlag;
 
 172         if (!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance) {
 
 175             aLaCarteFlag = false;
 
 180     protected HashMap<String, String> setInstanceIdMap(InfraActiveRequests infraActiveRequest, String requestScope) {
 
 181         HashMap<String, String> instanceIdMap = new HashMap<>();
 
 184             type = ModelType.valueOf(requestScope);
 
 185             instanceIdMap.put(type.name() + "InstanceId", type.getId(infraActiveRequest));
 
 186         } catch (IllegalArgumentException e) {
 
 187             logger.error("requestScope \"{}\" does not match a ModelType enum.", requestScope);
 
 189         return instanceIdMap;
 
 192     protected String getInstanceName(InfraActiveRequests infraActiveRequest, String requestScope,
 
 193             InfraActiveRequests currentActiveRequest) throws ValidateException, RequestDbFailureException {
 
 195         String instanceName = "";
 
 197             type = ModelType.valueOf(requestScope);
 
 198             instanceName = type.getName(infraActiveRequest);
 
 199         } catch (IllegalArgumentException e) {
 
 200             logger.error("requestScope \"{}\" does not match a ModelType enum.", requestScope);
 
 201             ValidateException validateException = new ValidateException.Builder(
 
 202                     "requestScope: \"" + requestScope + "\" from request: " + infraActiveRequest.getRequestId()
 
 203                             + " does not match a ModelType enum.",
 
 204                     HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e).build();
 
 205             requestHandlerUtils.updateStatus(currentActiveRequest, Status.FAILED, validateException.getMessage());
 
 206             throw validateException;
 
 211     protected void checkForInProgressRequest(InfraActiveRequests currentActiveRequest,
 
 212             HashMap<String, String> instanceIdMap, String requestScope, String instanceName, Action action)
 
 213             throws ApiException {
 
 214         boolean inProgress = false;
 
 215         InfraActiveRequests requestInProgress = requestHandlerUtils.duplicateCheck(action, instanceIdMap, instanceName,
 
 216                 requestScope, currentActiveRequest);
 
 217         if (requestInProgress != null) {
 
 218             inProgress = requestHandlerUtils.camundaHistoryCheck(requestInProgress, currentActiveRequest);
 
 221             requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveRequest, action, instanceIdMap, instanceName,
 
 222                     requestScope, requestInProgress);
 
 226     protected void requestDbSave(InfraActiveRequests currentActiveRequest) throws RequestDbFailureException {
 
 228             requestsDbClient.save(currentActiveRequest);
 
 229         } catch (Exception e) {
 
 230             logger.error("Exception while saving request to requestDb", e);
 
 231             ErrorLoggerInfo errorLoggerInfo =
 
 232                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
 
 233                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
 
 234             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
 
 235                     ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
 
 239     protected RequestClientParameter setRequestClientParameter(RecipeLookupResult recipeLookupResult, String version,
 
 240             InfraActiveRequests infraActiveRequest, InfraActiveRequests currentActiveRequest, String pnfCorrelationId,
 
 241             Boolean aLaCarte, ServiceInstancesRequest sir) throws ApiException {
 
 242         RequestClientParameter requestClientParameter = null;
 
 243         Action action = Action.valueOf(infraActiveRequest.getRequestAction());
 
 244         ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
 
 246         Boolean isBaseVfModule = false;
 
 247         if (requestHandlerUtils.getModelType(action, modelInfo).equals(ModelType.vfModule)) {
 
 248             isBaseVfModule = requestHandlerUtils.getIsBaseVfModule(modelInfo, action, infraActiveRequest.getVnfType(),
 
 249                     msoRequest.getSDCServiceModelVersion(sir), currentActiveRequest);
 
 253             requestClientParameter =
 
 254                     new RequestClientParameter.Builder().setRequestId(currentActiveRequest.getRequestId())
 
 255                             .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
 
 256                             .setRequestAction(infraActiveRequest.getRequestAction())
 
 257                             .setServiceInstanceId(infraActiveRequest.getServiceInstanceId())
 
 258                             .setPnfCorrelationId(pnfCorrelationId).setVnfId(infraActiveRequest.getVnfId())
 
 259                             .setVfModuleId(infraActiveRequest.getVfModuleId())
 
 260                             .setVolumeGroupId(infraActiveRequest.getVolumeGroupId())
 
 261                             .setNetworkId(infraActiveRequest.getNetworkId())
 
 262                             .setServiceType(infraActiveRequest.getServiceType())
 
 263                             .setVnfType(infraActiveRequest.getVnfType())
 
 264                             .setVfModuleType(msoRequest.getVfModuleType(sir, infraActiveRequest.getRequestScope(),
 
 265                                     action, Integer.parseInt(version)))
 
 266                             .setNetworkType(infraActiveRequest.getNetworkType())
 
 267                             .setRequestDetails(requestHandlerUtils
 
 268                                     .mapJSONtoMSOStyle(infraActiveRequest.getRequestBody(), sir, aLaCarte, action))
 
 269                             .setApiVersion(version).setALaCarte(aLaCarte)
 
 270                             .setRequestUri(currentActiveRequest.getRequestUrl())
 
 271                             .setInstanceGroupId(infraActiveRequest.getInstanceGroupId()).build();
 
 272         } catch (IOException e) {
 
 273             logger.error("IOException while generating requestClientParameter to send to BPMN", e);
 
 274             ErrorLoggerInfo errorLoggerInfo =
 
 275                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
 
 276                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
 
 277             throw new ValidateException.Builder(
 
 278                     "IOException while generating requestClientParameter to send to BPMN: " + e.getMessage(),
 
 279                     HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
 
 282         return requestClientParameter;