Update error handling for mapInfraActiveRequestToRequest
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / OrchestrationRequests.java
index ab51d49..5bf33b4 100644 (file)
@@ -28,6 +28,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 import javax.transaction.Transactional;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
@@ -44,10 +45,11 @@ import javax.ws.rs.core.UriInfo;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang3.EnumUtils;
 import org.apache.http.HttpStatus;
+import org.onap.logging.ref.slf4j.ONAPLogConstants;
+import org.onap.logging.filter.base.ErrorCode;
 import org.onap.so.apihandler.common.ErrorNumbers;
 import org.onap.so.apihandler.common.ResponseBuilder;
 import org.onap.so.apihandlerinfra.exceptions.ApiException;
-import org.onap.so.apihandlerinfra.exceptions.ContactCamundaException;
 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
 import org.onap.so.constants.OrchestrationRequestFormat;
@@ -56,7 +58,6 @@ import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.beans.RequestProcessingData;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.exceptions.ValidationException;
-import org.onap.so.logger.ErrorCode;
 import org.onap.so.logger.MessageEnum;
 import org.onap.so.serviceinstancebeans.CloudRequestData;
 import org.onap.so.serviceinstancebeans.GetOrchestrationListResponse;
@@ -70,7 +71,9 @@ import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
 import org.onap.so.utils.UUIDChecker;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import io.swagger.v3.oas.annotations.OpenAPIDefinition;
@@ -103,8 +106,11 @@ public class OrchestrationRequests {
     @Autowired
     private CamundaRequestHandler camundaRequestHandler;
 
+    @Autowired
+    private Environment env;
+
     @GET
-    @Path("/{version:[vV][4-7]}/{requestId}")
+    @Path("/{version:[vV][4-8]}/{requestId}")
     @Operation(description = "Find Orchestrated Requests for a given requestId", responses = @ApiResponse(
             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Produces(MediaType.APPLICATION_JSON)
@@ -113,7 +119,6 @@ public class OrchestrationRequests {
             @PathParam("version") String version, @QueryParam("includeCloudRequest") boolean includeCloudRequest,
             @QueryParam(value = "format") String format) throws ApiException {
 
-        String apiVersion = version.substring(1);
         GetOrchestrationResponse orchestrationResponse = new GetOrchestrationResponse();
 
         InfraActiveRequests infraActiveRequest = null;
@@ -150,7 +155,7 @@ public class OrchestrationRequests {
             }
         }
 
-        Request request = mapInfraActiveRequestToRequest(infraActiveRequest, includeCloudRequest, format);
+        Request request = mapInfraActiveRequestToRequest(infraActiveRequest, includeCloudRequest, format, version);
 
         if (null != requestProcessingData && !requestProcessingData.isEmpty()) {
             request.setRequestProcessingData(mapRequestProcessingData(requestProcessingData));
@@ -158,11 +163,12 @@ public class OrchestrationRequests {
         request.setRequestId(requestId);
         orchestrationResponse.setRequest(request);
 
-        return builder.buildResponse(HttpStatus.SC_OK, requestId, orchestrationResponse, apiVersion);
+        return builder.buildResponse(HttpStatus.SC_OK, MDC.get(ONAPLogConstants.MDCs.REQUEST_ID), orchestrationResponse,
+                version);
     }
 
     @GET
-    @Path("/{version:[vV][4-7]}")
+    @Path("/{version:[vV][4-8]}")
     @Operation(description = "Find Orchestrated Requests for a URI Information", responses = @ApiResponse(
             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Produces(MediaType.APPLICATION_JSON)
@@ -203,11 +209,11 @@ public class OrchestrationRequests {
 
         for (InfraActiveRequests infraActive : activeRequests) {
             RequestList requestList = new RequestList();
-            Request request = mapInfraActiveRequestToRequest(infraActive, includeCloudRequest, format);
+            Request request = mapInfraActiveRequestToRequest(infraActive, includeCloudRequest, format, version);
 
             if (isRequestProcessingDataRequired(format)) {
                 List<RequestProcessingData> requestProcessingData =
-                        requestsDbClient.getRequestProcessingDataBySoRequestId(infraActive.getRequestId());
+                        requestsDbClient.getExternalRequestProcessingDataBySoRequestId(infraActive.getRequestId());
                 if (null != requestProcessingData && !requestProcessingData.isEmpty()) {
                     request.setRequestProcessingData(mapRequestProcessingData(requestProcessingData));
                 }
@@ -218,7 +224,8 @@ public class OrchestrationRequests {
         }
 
         orchestrationList.setRequestList(requestLists);
-        return builder.buildResponse(HttpStatus.SC_OK, null, orchestrationList, apiVersion);
+        return builder.buildResponse(HttpStatus.SC_OK, MDC.get(ONAPLogConstants.MDCs.REQUEST_ID), orchestrationList,
+                apiVersion);
     }
 
     @POST
@@ -288,7 +295,7 @@ public class OrchestrationRequests {
     }
 
     protected Request mapInfraActiveRequestToRequest(InfraActiveRequests iar, boolean includeCloudRequest,
-            String format) throws ApiException {
+            String format, String version) throws ApiException {
         String requestBody = iar.getRequestBody();
         Request request = new Request();
 
@@ -303,6 +310,19 @@ public class OrchestrationRequests {
             request.setOriginalRequestId(originalRequestId);
         }
 
+        if (!version.matches("v[1-7]")) {
+            String workflowName = iar.getWorkflowName();
+            if (workflowName == null) {
+                workflowName = iar.getRequestAction();
+            }
+            request.setWorkflowName(workflowName);
+
+            String operationName = iar.getOperationName();
+            if (operationName != null) {
+                request.setOperationName(operationName);
+            }
+        }
+
         InstanceReferences ir = new InstanceReferences();
         if (iar.getNetworkId() != null)
             ir.setNetworkInstanceId(iar.getNetworkId());
@@ -324,8 +344,6 @@ public class OrchestrationRequests {
             ir.setVolumeGroupInstanceId(iar.getVolumeGroupId());
         if (iar.getVolumeGroupName() != null)
             ir.setVolumeGroupInstanceName(iar.getVolumeGroupName());
-        if (iar.getRequestorId() != null)
-            ir.setRequestorId(iar.getRequestorId());
         if (iar.getInstanceGroupId() != null)
             ir.setInstanceGroupId(iar.getInstanceGroupId());
         if (iar.getInstanceGroupName() != null)
@@ -343,17 +361,15 @@ public class OrchestrationRequests {
                 } else {
                     requestDetails = mapper.readValue(requestBody, RequestDetails.class);
                 }
-            } catch (IOException e) {
-                logger.error("Exception occurred", e);
-                ErrorLoggerInfo errorLoggerInfo =
-                        new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
-                                .build();
-                ValidateException validateException =
-                        new ValidateException.Builder("Mapping of request to JSON object failed : ",
-                                HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
-                                        .errorInfo(errorLoggerInfo).build();
+                if (requestDetails.getRequestInfo() != null && iar.getProductFamilyName() != null) {
+                    requestDetails.getRequestInfo().setProductFamilyName(iar.getProductFamilyName());
+                }
+                if (requestDetails.getCloudConfiguration() != null && iar.getTenantName() != null) {
+                    requestDetails.getCloudConfiguration().setTenantName(iar.getTenantName());
+                }
 
-                throw validateException;
+            } catch (IOException e) {
+                logger.error(String.format("Failed to parse request (id: %s) : ", request.getRequestId()), e);
             }
         }
         request.setRequestDetails(requestDetails);
@@ -393,7 +409,7 @@ public class OrchestrationRequests {
             });
         }
 
-        mapRequestStatusAndExtSysErrSrcToRequest(iar, status, format);
+        mapRequestStatusAndExtSysErrSrcToRequest(iar, status, format, version);
 
         request.setRequestStatus(status);
         return request;
@@ -422,17 +438,21 @@ public class OrchestrationRequests {
     }
 
     protected void mapRequestStatusAndExtSysErrSrcToRequest(InfraActiveRequests iar, RequestStatus status,
-            String format) {
+            String format, String version) {
         String rollbackStatusMessage = iar.getRollbackStatusMessage();
         String flowStatusMessage = iar.getFlowStatus();
         String retryStatusMessage = iar.getRetryStatusMessage();
         String taskName = null;
 
-        if (flowStatusMessage != null && !flowStatusMessage.equals("Successfully completed all Building Blocks")
-                && !flowStatusMessage.equals("All Rollback flows have completed successfully")) {
-            taskName = camundaRequestHandler.getTaskName(iar.getRequestId());
-            if (taskName != null) {
-                flowStatusMessage = flowStatusMessage + " TASK INFORMATION: " + taskName;
+        if (daysSinceRequest(iar) <= camundaCleanupInterval()) {
+            if (format == null || !format.equalsIgnoreCase(OrchestrationRequestFormat.SIMPLENOTASKINFO.toString())) {
+                if (flowStatusMessage != null && !flowStatusMessage.equals("Successfully completed all Building Blocks")
+                        && !flowStatusMessage.equals("All Rollback flows have completed successfully")) {
+                    taskName = camundaRequestHandler.getTaskName(iar.getRequestId());
+                    if (taskName != null) {
+                        flowStatusMessage = flowStatusMessage + " TASK INFORMATION: " + taskName;
+                    }
+                }
             }
         }
 
@@ -456,6 +476,12 @@ public class OrchestrationRequests {
             if (rollbackStatusMessage != null) {
                 status.setRollbackStatusMessage(rollbackStatusMessage);
             }
+            if (version.matches("v[8-9]|v[1-9][0-9]")) {
+                if (iar.getResourceStatusMessage() != null) {
+                    status.setResourceStatusMessage(iar.getResourceStatusMessage());
+                }
+            }
+
             status.setExtSystemErrorSource(iar.getExtSystemErrorSource());
             status.setRollbackExtSystemErrorSource(iar.getRollbackExtSystemErrorSource());
         } else {
@@ -481,6 +507,13 @@ public class OrchestrationRequests {
                     statusMessages = "ROLLBACK STATUS: " + rollbackStatusMessage;
                 }
             }
+            if (iar.getResourceStatusMessage() != null) {
+                if (statusMessages != null) {
+                    statusMessages = statusMessages + " " + "RESOURCE STATUS: " + iar.getResourceStatusMessage();
+                } else {
+                    statusMessages = "RESOURCE STATUS: " + iar.getResourceStatusMessage();
+                }
+            }
         }
 
         if (statusMessages != null) {
@@ -533,7 +566,8 @@ public class OrchestrationRequests {
     }
 
     protected boolean isRequestProcessingDataRequired(String format) {
-        if (StringUtils.isNotEmpty(format) && format.equalsIgnoreCase(OrchestrationRequestFormat.SIMPLE.name())) {
+        if (StringUtils.isNotEmpty(format) && (format.equalsIgnoreCase(OrchestrationRequestFormat.SIMPLE.name())
+                || format.equalsIgnoreCase(OrchestrationRequestFormat.SIMPLENOTASKINFO.toString()))) {
             return false;
         } else {
             return true;
@@ -570,4 +604,20 @@ public class OrchestrationRequests {
         }
         return infraActiveRequest;
     }
+
+    protected long daysSinceRequest(InfraActiveRequests request) {
+        long startTime = request.getStartTime().getTime();
+        long now = System.currentTimeMillis();
+
+        return TimeUnit.MILLISECONDS.toDays(now - startTime);
+    }
+
+    protected int camundaCleanupInterval() {
+        String cleanupInterval = env.getProperty("mso.camundaCleanupInterval");
+        int days = 30;
+        if (cleanupInterval != null) {
+            days = Integer.parseInt(cleanupInterval);
+        }
+        return days;
+    }
 }