Merge "[SO] Service Level Workflow Execution API"
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / RequestHandlerUtils.java
index e2cee43..a68309f 100644 (file)
@@ -38,22 +38,19 @@ import javax.ws.rs.container.ContainerRequestContext;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
-import org.camunda.bpm.engine.history.HistoricProcessInstance;
 import org.camunda.bpm.engine.impl.persistence.entity.HistoricProcessInstanceEntity;
+import org.onap.logging.filter.base.ErrorCode;
 import org.onap.logging.ref.slf4j.ONAPLogConstants;
 import org.onap.so.apihandler.camundabeans.CamundaResponse;
+import org.onap.so.apihandler.common.CamundaClient;
 import org.onap.so.apihandler.common.CommonConstants;
 import org.onap.so.apihandler.common.ErrorNumbers;
-import org.onap.so.apihandler.common.RequestClient;
-import org.onap.so.apihandler.common.RequestClientFactory;
 import org.onap.so.apihandler.common.RequestClientParameter;
 import org.onap.so.apihandler.common.ResponseBuilder;
 import org.onap.so.apihandler.common.ResponseHandler;
 import org.onap.so.apihandlerinfra.exceptions.ApiException;
 import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException;
-import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException;
 import org.onap.so.apihandlerinfra.exceptions.ContactCamundaException;
 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
@@ -74,9 +71,7 @@ import org.onap.so.db.catalog.beans.VnfResource;
 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
 import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.onap.so.db.request.beans.InfraActiveRequests;
-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.LogConstants;
 import org.onap.so.logger.MessageEnum;
 import org.onap.so.serviceinstancebeans.CloudConfiguration;
@@ -116,9 +111,6 @@ public class RequestHandlerUtils extends AbstractRestHandler {
     @Autowired
     private Environment env;
 
-    @Autowired
-    private RequestClientFactory reqClientFactory;
-
     @Autowired
     private ResponseBuilder builder;
 
@@ -131,121 +123,62 @@ public class RequestHandlerUtils extends AbstractRestHandler {
     @Autowired
     private CatalogDbClient catalogDbClient;
 
-    public Response postBPELRequest(InfraActiveRequests currentActiveReq, RequestClientParameter requestClientParameter,
-            String orchestrationUri, String requestScope) throws ApiException {
-        HttpResponse response = null;
-        RequestClient requestClient = null;
-
-        try {
-            requestClient = reqClientFactory.getRequestClient(orchestrationUri);
-            response = requestClient.post(requestClientParameter);
-        } catch (Exception e) {
-            logger.error("Error posting request to BPMN", e);
-            ErrorLoggerInfo errorLoggerInfo =
-                    new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, ErrorCode.AvailabilityError)
-                            .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-            String url = requestClient != null ? requestClient.getUrl() : "";
-            ClientConnectionException clientException =
-                    new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY,
-                            ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
-            updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
-            throw clientException;
-        }
-
-        if (response == null) {
+    @Autowired
+    private CamundaClient camundaClient;
 
-            ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR,
-                    ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-            ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(),
-                    HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
-            updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
-            throw clientException;
-        }
+    @Autowired
+    private ResponseHandler responseHandler;
 
-        ResponseHandler respHandler = null;
-        int bpelStatus = 500;
+    protected ResponseEntity<String> postRequest(InfraActiveRequests currentActiveReq,
+            RequestClientParameter requestClientParameter, String orchestrationUri) throws ApiException {
         try {
-            respHandler = new ResponseHandler(response, requestClient.getType());
-            bpelStatus = respHandler.getStatus();
+            return camundaClient.post(requestClientParameter, orchestrationUri);
         } catch (ApiException e) {
-            logger.error("Exception occurred", e);
-            ErrorLoggerInfo errorLoggerInfo =
-                    new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
-                            .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-            ValidateException validateException =
-                    new ValidateException.Builder("Exception caught mapping Camunda JSON response to object",
-                            HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
-                                    .errorInfo(errorLoggerInfo).build();
-            updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
-            throw validateException;
+            updateStatus(currentActiveReq, Status.FAILED, e.getMessage());
+            throw e;
         }
+    }
 
-        // BPEL accepted the request, the request is in progress
-        if (bpelStatus == HttpStatus.SC_ACCEPTED) {
-            ServiceInstancesResponse jsonResponse;
-            CamundaResponse camundaResp = respHandler.getResponse();
-
-            if ("Success".equalsIgnoreCase(camundaResp.getMessage())) {
-                try {
-                    ObjectMapper mapper = new ObjectMapper();
-                    jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
-                    jsonResponse.getRequestReferences().setRequestId(requestClientParameter.getRequestId());
-                    Optional<URL> selfLinkUrl =
-                            buildSelfLinkUrl(currentActiveReq.getRequestUrl(), requestClientParameter.getRequestId());
-                    if (selfLinkUrl.isPresent()) {
-                        jsonResponse.getRequestReferences().setRequestSelfLink(selfLinkUrl.get());
-                    } else {
-                        jsonResponse.getRequestReferences().setRequestSelfLink(null);
-                    }
-                } catch (IOException e) {
-                    logger.error("Exception occurred", e);
-                    ErrorLoggerInfo errorLoggerInfo =
-                            new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
-                                    .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-                    ValidateException validateException =
-                            new ValidateException.Builder("Exception caught mapping Camunda JSON response to object",
-                                    HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
-                                            .errorInfo(errorLoggerInfo).build();
-                    updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
-                    throw validateException;
+    public Response postBPELRequest(InfraActiveRequests currentActiveReq, RequestClientParameter requestClientParameter,
+            String orchestrationUri, String requestScope) throws ApiException {
+        ObjectMapper mapper = new ObjectMapper();
+        ResponseEntity<String> response = postRequest(currentActiveReq, requestClientParameter, orchestrationUri);
+        ServiceInstancesResponse jsonResponse = null;
+        int bpelStatus = responseHandler.setStatus(response.getStatusCodeValue());
+        try {
+            responseHandler.acceptedResponse(response);
+            CamundaResponse camundaResponse = responseHandler.getCamundaResponse(response);
+            String responseBody = camundaResponse.getResponse();
+            if ("Success".equalsIgnoreCase(camundaResponse.getMessage())) {
+                jsonResponse = mapper.readValue(responseBody, ServiceInstancesResponse.class);
+                jsonResponse.getRequestReferences().setRequestId(requestClientParameter.getRequestId());
+                Optional<URL> selfLinkUrl =
+                        buildSelfLinkUrl(currentActiveReq.getRequestUrl(), requestClientParameter.getRequestId());
+                if (selfLinkUrl.isPresent()) {
+                    jsonResponse.getRequestReferences().setRequestSelfLink(selfLinkUrl.get());
+                } else {
+                    jsonResponse.getRequestReferences().setRequestSelfLink(null);
                 }
-                return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestClientParameter.getRequestId(),
-                        jsonResponse, requestClientParameter.getApiVersion());
+            } else {
+                BPMNFailureException bpmnException =
+                        new BPMNFailureException.Builder(String.valueOf(bpelStatus) + responseBody, bpelStatus,
+                                ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).build();
+                updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
+                throw bpmnException;
             }
+        } catch (ApiException e) {
+            updateStatus(currentActiveReq, Status.FAILED, e.getMessage());
+            throw e;
+        } catch (IOException e) {
+            logger.error("Exception caught mapping Camunda JSON response to object: ", e);
+            updateStatus(currentActiveReq, Status.FAILED, e.getMessage());
+            throw new ValidateException.Builder("Exception caught mapping Camunda JSON response to object",
+                    HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e).build();
         }
-
-        List<String> variables = new ArrayList<>();
-        variables.add(bpelStatus + "");
-        String camundaJSONResponseBody = respHandler.getResponseBody();
-        if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty()) {
-
-            ErrorLoggerInfo errorLoggerInfo =
-                    new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.BusinessProcesssError)
-                            .errorSource(requestClient.getUrl()).build();
-            BPMNFailureException bpmnException =
-                    new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus,
-                            ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
-
-            updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
-
-            throw bpmnException;
-        } else {
-
-            ErrorLoggerInfo errorLoggerInfo =
-                    new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.BusinessProcesssError)
-                            .errorSource(requestClient.getUrl()).build();
-
-
-            BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus),
-                    bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
-            updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
-
-            throw servException;
-        }
+        return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestClientParameter.getRequestId(), jsonResponse,
+                requestClientParameter.getApiVersion());
     }
 
-
-
     @Override
     public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage)
             throws RequestDbFailureException {
@@ -274,12 +207,18 @@ public class RequestHandlerUtils extends AbstractRestHandler {
         } else if (action == Action.addMembers || action == Action.removeMembers) {
             return (ModelType.instanceGroup.toString());
         } else {
-            String requestScope;
+            String requestScope = requestScopeFromUri(requestUri);;
+
+            if (sir.getRequestDetails() == null) {
+                return requestScope;
+            }
+            if (sir.getRequestDetails().getModelInfo() == null) {
+                return requestScope;
+            }
             if (sir.getRequestDetails().getModelInfo().getModelType() == null) {
-                requestScope = requestScopeFromUri(requestUri);
-            } else {
-                requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
+                return requestScope;
             }
+            requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
             return requestScope;
         }
     }
@@ -306,8 +245,24 @@ public class RequestHandlerUtils extends AbstractRestHandler {
         return requestUri;
     }
 
-    public InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap,
-            String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
+    public void checkForDuplicateRequests(Actions action, HashMap<String, String> instanceIdMap, String requestScope,
+            InfraActiveRequests currentActiveReq, String instanceName) throws ApiException {
+        InfraActiveRequests dup = null;
+        boolean inProgress = false;
+
+        dup = duplicateCheck(action, instanceIdMap, instanceName, requestScope, currentActiveReq);
+
+        if (dup != null) {
+            inProgress = camundaHistoryCheck(dup, currentActiveReq);
+        }
+
+        if (dup != null && inProgress) {
+            buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, instanceName, requestScope, dup);
+        }
+    }
+
+    public InfraActiveRequests duplicateCheck(Actions action, Map<String, String> instanceIdMap, String instanceName,
+            String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
         InfraActiveRequests dup = null;
         try {
             if (!(instanceName == null && "service".equals(requestScope) && (action == Action.createInstance
@@ -333,7 +288,7 @@ public class RequestHandlerUtils extends AbstractRestHandler {
         String requestId = duplicateRecord.getRequestId();
         ResponseEntity<List<HistoricProcessInstanceEntity>> response = null;
         try {
-            response = camundaRequestHandler.getCamundaProcessInstanceHistory(requestId, true);
+            response = camundaRequestHandler.getCamundaProcessInstanceHistory(requestId, true, true, false);
         } catch (RestClientException e) {
             logger.error("Error querying Camunda for process-instance history for requestId: {}, exception: {}",
                     requestId, e.getMessage());
@@ -347,13 +302,8 @@ public class RequestHandlerUtils extends AbstractRestHandler {
 
         if (response.getBody().isEmpty()) {
             updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
-        }
-        for (HistoricProcessInstance instance : response.getBody()) {
-            if (("ACTIVE").equals(instance.getState())) {
-                return true;
-            } else {
-                updateStatus(duplicateRecord, Status.COMPLETE, "Request Completed");
-            }
+        } else {
+            return true;
         }
         return false;
     }
@@ -382,7 +332,7 @@ public class RequestHandlerUtils extends AbstractRestHandler {
         }
     }
 
-    public void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action,
+    public void parseRequest(ServiceInstancesRequest sir, Map<String, String> instanceIdMap, Actions action,
             String version, String requestJSON, Boolean aLaCarte, String requestId,
             InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
         int reqVersion = Integer.parseInt(version.substring(1));
@@ -404,7 +354,7 @@ public class RequestHandlerUtils extends AbstractRestHandler {
     }
 
     public void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action,
-            HashMap<String, String> instanceIdMap, String instanceName, String requestScope, InfraActiveRequests dup)
+            Map<String, String> instanceIdMap, String instanceName, String requestScope, InfraActiveRequests dup)
             throws ApiException {
 
         String instance = null;
@@ -488,6 +438,9 @@ public class RequestHandlerUtils extends AbstractRestHandler {
             if (instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID) != null) {
                 currentActiveReq.setInstanceGroupId(instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID));
             }
+            if (instanceIdMap.get("pnfName") != null) {
+                currentActiveReq.setPnfName(instanceIdMap.get("pnfName"));
+            }
         }
     }
 
@@ -593,6 +546,8 @@ public class RequestHandlerUtils extends AbstractRestHandler {
             requestScope = ModelType.configuration.name();
         } else if (requestUri.contains(ModelType.vnf.name())) {
             requestScope = ModelType.vnf.name();
+        } else if (requestUri.contains(ModelType.pnf.name())) {
+            requestScope = ModelType.pnf.name();
         } else {
             requestScope = ModelType.service.name();
         }
@@ -615,7 +570,7 @@ public class RequestHandlerUtils extends AbstractRestHandler {
         if (infraActiveRequest != null) {
             request.setTenantId(infraActiveRequest.getTenantId());
             request.setRequestBody(updateRequestorIdInRequestBody(infraActiveRequest, requestorId));
-            request.setAicCloudRegion(infraActiveRequest.getAicCloudRegion());
+            request.setCloudRegion(infraActiveRequest.getCloudRegion());
             request.setRequestScope(infraActiveRequest.getRequestScope());
             request.setRequestAction(infraActiveRequest.getRequestAction());
             setInstanceIdAndName(infraActiveRequest, request);