Select recipe for create service
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / openecomp / mso / apihandlerinfra / E2EServiceInstances.java
index 0c0c3cb..403e940 100644 (file)
@@ -21,6 +21,7 @@
 package org.openecomp.mso.apihandlerinfra;
 
 import java.io.IOException;
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -39,89 +40,183 @@ import javax.ws.rs.core.Response;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
 import org.codehaus.jackson.map.ObjectMapper;
+import org.hibernate.Session;
+import org.json.JSONObject;
 import org.openecomp.mso.apihandler.common.ErrorNumbers;
 import org.openecomp.mso.apihandler.common.RequestClient;
 import org.openecomp.mso.apihandler.common.RequestClientFactory;
 import org.openecomp.mso.apihandler.common.ResponseHandler;
+import org.openecomp.mso.apihandlerinfra.Messages;
+import org.openecomp.mso.apihandlerinfra.MsoException;
+import org.openecomp.mso.apihandlerinfra.MsoRequest;
+import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.DelE2ESvcResp;
+import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.E2EServiceInstanceDeleteRequest;
 import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.E2EServiceInstanceRequest;
 import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.E2EUserParam;
+import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.GetE2EServiceInstanceResponse;
 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ModelInfo;
 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestDetails;
 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestInfo;
 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestParameters;
 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesRequest;
 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.SubscriberInfo;
+import org.openecomp.mso.db.AbstractSessionFactoryManager;
 import org.openecomp.mso.db.catalog.CatalogDatabase;
 import org.openecomp.mso.db.catalog.beans.Service;
 import org.openecomp.mso.db.catalog.beans.ServiceRecipe;
 import org.openecomp.mso.logger.MessageEnum;
 import org.openecomp.mso.logger.MsoAlarmLogger;
 import org.openecomp.mso.logger.MsoLogger;
-import org.openecomp.mso.requestsdb.InfraActiveRequests;
+import org.openecomp.mso.properties.MsoDatabaseException;
+import org.openecomp.mso.requestsdb.OperationStatus;
 import org.openecomp.mso.requestsdb.RequestsDatabase;
+import org.openecomp.mso.requestsdb.RequestsDbSessionFactoryManager;
 import org.openecomp.mso.utils.UUIDChecker;
 
 import com.wordnik.swagger.annotations.Api;
 import com.wordnik.swagger.annotations.ApiOperation;
 
 @Path("/e2eServiceInstances")
-@Api(value="/e2eServiceInstances",description="API Requests for E2E Service Instances")
+@Api(value = "/e2eServiceInstances", description = "API Requests for E2E Service Instances")
 public class E2EServiceInstances {
 
-       private HashMap<String, String> instanceIdMap = new HashMap<String,String>();
-       private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
-       private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
-       public final static String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
+       private HashMap<String, String> instanceIdMap = new HashMap<>();
+       private static MsoLogger msoLogger = MsoLogger
+                       .getMsoLogger(MsoLogger.Catalog.APIH);
+       private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger();
+       public static final String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
+       private ServiceInstancesRequest sir = null;
+
+       public static final String END_OF_THE_TRANSACTION = "End of the transaction, the final response is: ";
+       public static final String EXCEPTION_CREATING_DB_RECORD = "Exception while creating record in DB";
+       public static final String EXCEPTION_COMMUNICATE_BPMN_ENGINE = "Exception while communicate with BPMN engine";
 
-       public E2EServiceInstances() {
-       }
-       
        /**
-     *POST Requests for E2E Service create Instance on a version provided
-     */
+        * POST Requests for E2E Service create Instance on a version provided
+        */
 
        @POST
        @Path("/{version:[vV][3-5]}")
        @Consumes(MediaType.APPLICATION_JSON)
        @Produces(MediaType.APPLICATION_JSON)
-       @ApiOperation(value="Create a E2E Service Instance on a version provided",response=Response.class)
-       public Response createE2EServiceInstance(String request, @PathParam("version") String version) {
-
-               Response response = E2EserviceInstances(request, Action.createInstance, null, version);
+       @ApiOperation(value = "Create a E2E Service Instance on a version provided", response = Response.class)
+       public Response createE2EServiceInstance(String request,
+                       @PathParam("version") String version) {
 
-               return response;
+               return processE2EserviceInstances(request, Action.createInstance, null,
+                               version);
        }
 
        /**
-     *DELETE Requests for E2E Service delete Instance on a specified version and serviceId
-     */
-       
+        * DELETE Requests for E2E Service delete Instance on a specified version
+        * and serviceId
+        */
+
        @DELETE
        @Path("/{version:[vV][3-5]}/{serviceId}")
        @Consumes(MediaType.APPLICATION_JSON)
        @Produces(MediaType.APPLICATION_JSON)
-       @ApiOperation(value="Delete E2E Service Instance on a specified version and serviceId",response=Response.class)
-       public Response deleteE2EServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceId") String serviceId) {
+       @ApiOperation(value = "Delete E2E Service Instance on a specified version and serviceId", response = Response.class)
+       public Response deleteE2EServiceInstance(String request,
+                       @PathParam("version") String version,
+                       @PathParam("serviceId") String serviceId) {
 
                instanceIdMap.put("serviceId", serviceId);
-               Response response = E2EserviceInstances(request, Action.deleteInstance, null, version);
 
-               return response;
+               return deleteE2EserviceInstances(request, Action.deleteInstance,
+                               instanceIdMap, version);
        }
-       
-       private Response E2EserviceInstances(String requestJSON, Action action,
-                       HashMap<String, String> instanceIdMap, String version) {
 
-               String requestId = UUIDChecker.generateUUID(msoLogger);
+       @GET
+       @Path("/{version:[vV][3-5]}/{serviceId}/operations/{operationId}")
+       @ApiOperation(value = "Find e2eServiceInstances Requests for a given serviceId and operationId", response = Response.class)
+       @Produces(MediaType.APPLICATION_JSON)
+       public Response getE2EServiceInstances(
+                       @PathParam("serviceId") String serviceId,
+                       @PathParam("version") String version,
+                       @PathParam("operationId") String operationId) {
+               return getE2EServiceInstances(serviceId, operationId);
+       }
+
+       private Response getE2EServiceInstances(String serviceId, String operationId) {
+               RequestsDatabase requestsDB = RequestsDatabase.getInstance();
+
+               GetE2EServiceInstanceResponse e2eServiceResponse = new GetE2EServiceInstanceResponse();
+
+               MsoRequest msoRequest = new MsoRequest(serviceId);
+
+               long startTime = System.currentTimeMillis();
+
+               OperationStatus operationStatus = null;
+
+               try {
+                       operationStatus = requestsDB.getOperationStatus(serviceId,
+                                       operationId);
+
+               } catch (Exception e) {
+                       msoLogger
+                                       .error(MessageEnum.APIH_DB_ACCESS_EXC,
+                                                       MSO_PROP_APIHANDLER_INFRA,
+                                                       "",
+                                                       "",
+                                                       MsoLogger.ErrorCode.AvailabilityError,
+                                                       "Exception while communciate with Request DB - Infra Request Lookup",
+                                                       e);
+                       msoRequest
+                                       .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
+                       Response response = msoRequest.buildServiceErrorResponse(
+                                       HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,
+                                       e.getMessage(),
+                                       ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB, null);
+                       alarmLogger.sendAlarm("MsoDatabaseAccessError",
+                                       MsoAlarmLogger.CRITICAL, Messages.errors
+                                                       .get(ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB));
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
+                                       MsoLogger.ResponseCode.DBAccessError,
+                                       "Exception while communciate with Request DB");
+                       msoLogger.debug("End of the transaction, the final response is: "
+                                       + (String) response.getEntity());
+                       return response;
+
+               }
+
+               if (operationStatus == null) {
+                       Response resp = msoRequest.buildServiceErrorResponse(
+                                       HttpStatus.SC_NO_CONTENT, MsoException.ServiceException,
+                                       "E2E serviceId " + serviceId + " is not found in DB",
+                                       ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);
+                       msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR,
+                                       MSO_PROP_APIHANDLER_INFRA, "", "",
+                                       MsoLogger.ErrorCode.BusinessProcesssError,
+                                       "Null response from RequestDB when searching by serviceId");
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
+                                       MsoLogger.ResponseCode.DataNotFound,
+                                       "Null response from RequestDB when searching by serviceId");
+                       msoLogger.debug("End of the transaction, the final response is: "
+                                       + (String) resp.getEntity());
+                       return resp;
+
+               }
+
+               e2eServiceResponse.setOperationStatus(operationStatus);
+
+               return Response.status(200).entity(e2eServiceResponse).build();
+       }
+
+       private Response deleteE2EserviceInstances(String requestJSON,
+                       Action action, HashMap<String, String> instanceIdMap, String version) {
+               // TODO should be a new one or the same service instance Id
+               String requestId = instanceIdMap.get("serviceId");
                long startTime = System.currentTimeMillis();
                msoLogger.debug("requestId is: " + requestId);
-               E2EServiceInstanceRequest sir = null;
+               E2EServiceInstanceDeleteRequest e2eDelReq = null;
 
                MsoRequest msoRequest = new MsoRequest(requestId);
+
                ObjectMapper mapper = new ObjectMapper();
                try {
-                       sir = mapper
-                                       .readValue(requestJSON, E2EServiceInstanceRequest.class);
+                       e2eDelReq = mapper.readValue(requestJSON,
+                                       E2EServiceInstanceDeleteRequest.class);
 
                } catch (Exception e) {
 
@@ -131,7 +226,7 @@ public class E2EServiceInstances {
                                        MsoException.ServiceException,
                                        "Mapping of request to JSON object failed.  "
                                                        + e.getMessage(), ErrorNumbers.SVC_BAD_PARAMETER,
-                                                       null);
+                                       null);
                        msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR,
                                        MSO_PROP_APIHANDLER_INFRA, "", "",
                                        MsoLogger.ErrorCode.SchemaError, requestJSON, e);
@@ -140,144 +235,86 @@ public class E2EServiceInstances {
                                        "Mapping of request to JSON object failed");
                        msoLogger.debug("End of the transaction, the final response is: "
                                        + (String) response.getEntity());
-                       return response;
-               }
-
-               InfraActiveRequests dup = null;
-               String instanceName = sir.getService().getName();
-               String requestScope = sir.getService().getParameters().getNodeType();
-
-               try {
-                       if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance))){
-                               dup = (RequestsDatabase.getInstance()).checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
-                       }
-               } catch (Exception e) {
-                       msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
-
-                       Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
-                                       e.getMessage(),
-                                       ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
-                                       null) ;
-
-
-                       msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check");
-                       msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
-                       return response;
-               }
-
-               if (dup != null) {
-                       // Found the duplicate record. Return the appropriate error.
-                       String instance = null;
-                       if(instanceName != null){
-                               instance = instanceName;
-                       }else{
-                               instance = instanceIdMap.get(requestScope + "InstanceId");
-                       }
-                       String dupMessage = "Error: Locked instance - This " + requestScope + " (" + instance + ") " + "already has a request being worked with a status of " + dup.getRequestStatus() + " (RequestId - " + dup.getRequestId() + "). The existing request must finish or be cleaned up before proceeding.";
-
-                       Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException,
-                                       dupMessage,
-                                       ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
-                                       null) ;
-
-
-                       msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, "Duplicate request - Subscriber already has a request for this service");
-                       msoRequest.createRequestRecord (Status.FAILED, action);
-                       msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage);
-                       msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
+                       createOperationStatusRecordForError(action, requestId);
                        return response;
                }
 
                CatalogDatabase db = null;
-               try {
-                       db = CatalogDatabase.getInstance();
-               } catch (Exception e) {
-                       msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
-                       msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
-                       Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
-                                       MsoException.ServiceException,
-                                       "No communication to catalog DB " + e.getMessage (),
-                                       ErrorNumbers.SVC_NO_SERVER_RESOURCES,
-                                       null);
-                       alarmLogger.sendAlarm ("MsoDatabaseAccessError",
-                                       MsoAlarmLogger.CRITICAL,
-                                       Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
-                       msoRequest.createRequestRecord (Status.FAILED,action);
-                       msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
-                       msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
-                       return response;
-               }
-
-
                RecipeLookupResult recipeLookupResult = null;
-
                try {
-                       recipeLookupResult = getServiceInstanceOrchestrationURI(db, sir, action);
+                       db = CatalogDatabase.getInstance();
+                       //TODO  Get the service template model version uuid from AAI.
+                       recipeLookupResult = getServiceInstanceOrchestrationURI(db, null, action);
                } catch (Exception e) {
-                       msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Exception while querying Catalog DB", e);
-                       msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
-                       Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
-                                       MsoException.ServiceException,
-                                       "Recipe could not be retrieved from catalog DB " + e.getMessage (),
-                                       ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
-                                       null);
-                       alarmLogger.sendAlarm ("MsoDatabaseAccessError",
-                                       MsoAlarmLogger.CRITICAL,
-                                       Messages.errors.get (ErrorNumbers.ERROR_FROM_CATALOG_DB));
-                       msoRequest.createRequestRecord (Status.FAILED,action);
-                       msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while querying Catalog DB");
-                       msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
-                       db.close();
+                       msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC,
+                                       MSO_PROP_APIHANDLER_INFRA, "", "",
+                                       MsoLogger.ErrorCode.AvailabilityError,
+                                       "Exception while communciate with Catalog DB", e);
+                       msoRequest
+                                       .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
+                       Response response = msoRequest.buildServiceErrorResponse(
+                                       HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,
+                                       "No communication to catalog DB " + e.getMessage(),
+                                       ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
+                       alarmLogger.sendAlarm("MsoDatabaseAccessError",
+                                       MsoAlarmLogger.CRITICAL, Messages.errors
+                                                       .get(ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
+                       msoRequest.createRequestRecord(Status.FAILED, action);
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
+                                       MsoLogger.ResponseCode.DBAccessError,
+                                       "Exception while communciate with DB");
+                       msoLogger.debug(END_OF_THE_TRANSACTION
+                                       + (String) response.getEntity());
                        return response;
+               } finally {
+                       closeCatalogDB(db);
                }
-               finally{
-                       if(null != db)
-                       {
-                               db.close();
-                       }
-
-               }
-
                if (recipeLookupResult == null) {
-                       msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
-                       msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
-                       Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
-                                       MsoException.ServiceException,
+                       msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND,
+                                       MSO_PROP_APIHANDLER_INFRA, "", "",
+                                       MsoLogger.ErrorCode.DataError, "No recipe found in DB");
+                       msoRequest
+                                       .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
+                       Response response = msoRequest.buildServiceErrorResponse(
+                                       HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,
                                        "Recipe does not exist in catalog DB",
-                                       ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
-                                       null);
-                       msoRequest.createRequestRecord (Status.FAILED, action);
-                       msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
-                       msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
-
+                                       ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);
+                       msoRequest.createRequestRecord(Status.FAILED, action);
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
+                                       MsoLogger.ResponseCode.DataNotFound,
+                                       "No recipe found in DB");
+                       msoLogger.debug(END_OF_THE_TRANSACTION
+                                       + (String) response.getEntity());
+                       createOperationStatusRecordForError(action, requestId);
                        return response;
                }
 
-
-               String modelInfo = sir.getService().getParameters().getNodeTemplateName();
-               String[] arrayOfInfo = modelInfo.split(":");
-               String serviceInstanceType = arrayOfInfo[0];
-
-
-
-               String serviceId = "";
-
                RequestClient requestClient = null;
                HttpResponse response = null;
 
                long subStartTime = System.currentTimeMillis();
-               String sirRequestJson = mappingObtainedRequestJSONToServiceInstanceRequest(sir);
+               // String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);
 
                try {
-                       requestClient = RequestClientFactory.getRequestClient (recipeLookupResult.getOrchestrationURI (), MsoPropertiesUtils.loadMsoProperties ());
+                       requestClient = RequestClientFactory.getRequestClient(
+                                       recipeLookupResult.getOrchestrationURI(),
+                                       MsoPropertiesUtils.loadMsoProperties());
 
-                       // Capture audit event
-                       msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
+                       JSONObject jjo = new JSONObject(requestJSON);
+                       jjo.put("operationId", UUIDChecker.generateUUID(msoLogger));
 
+                       String bpmnRequest = jjo.toString();
+
+                       // Capture audit event
+                       msoLogger
+                                       .debug("MSO API Handler Posting call to BPEL engine for url: "
+                                                       + requestClient.getUrl());
+                       String serviceId = instanceIdMap.get("serviceId");
+                       String serviceInstanceType = e2eDelReq.getServiceType();
                        response = requestClient.post(requestId, false,
-                                       recipeLookupResult.getRecipeTimeout(),
-                                       action.name(), serviceId, null, null, null, null, serviceInstanceType,
-                                       null, null, null, sirRequestJson);
+                                       recipeLookupResult.getRecipeTimeout(), action.name(),
+                                       serviceId, null, null, null, null, serviceInstanceType,
+                                       null, null, null, bpmnRequest);
 
                        msoLogger.recordMetricEvent(subStartTime,
                                        MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
@@ -305,6 +342,7 @@ public class E2EServiceInstances {
                                        "Exception while communicate with BPMN engine");
                        msoLogger.debug("End of the transaction, the final response is: "
                                        + (String) resp.getEntity());
+                       createOperationStatusRecordForError(action, requestId);
                        return resp;
                }
 
@@ -320,8 +358,8 @@ public class E2EServiceInstances {
                        msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
                                        MsoLogger.ResponseCode.InternalError,
                                        "Null response from BPMN");
-                       msoLogger.debug("End of the transaction, the final response is: "
-                                       + (String) resp.getEntity());
+                       msoLogger.debug(END_OF_THE_TRANSACTION + (String) resp.getEntity());
+                       createOperationStatusRecordForError(action, requestId);
                        return resp;
                }
 
@@ -329,25 +367,262 @@ public class E2EServiceInstances {
                                requestClient.getType());
                int bpelStatus = respHandler.getStatus();
 
-               // BPEL accepted the request, the request is in progress
+               return beplStatusUpdate(requestId, startTime, msoRequest,
+                               requestClient, respHandler, bpelStatus, action, instanceIdMap);
+       }
+
+       private Response processE2EserviceInstances(String requestJSON, Action action,
+                       HashMap<String, String> instanceIdMap, String version) {
+
+               String requestId = UUIDChecker.generateUUID(msoLogger);
+               long startTime = System.currentTimeMillis();
+               msoLogger.debug("requestId is: " + requestId);
+               E2EServiceInstanceRequest e2eSir = null;
+
+               MsoRequest msoRequest = new MsoRequest(requestId);
+               ObjectMapper mapper = new ObjectMapper();
+               try {
+                       e2eSir = mapper.readValue(requestJSON, E2EServiceInstanceRequest.class);
+
+               } catch (Exception e) {
+          //TODO update the service name
+          this.createOperationStatusRecordForError(action, requestId);
+                 
+                       msoLogger.debug("Mapping of request to JSON object failed : ", e);
+                       Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,
+                                       MsoException.ServiceException, "Mapping of request to JSON object failed.  " + e.getMessage(),
+                                       ErrorNumbers.SVC_BAD_PARAMETER, null);
+                       msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
+                                       MsoLogger.ErrorCode.SchemaError, requestJSON, e);
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,
+                                       "Mapping of request to JSON object failed");
+                       msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
+                       return response;
+               }
+
+               mapReqJsonToSvcInstReq(e2eSir, requestJSON);
+               sir.getRequestDetails().getRequestParameters().setaLaCarte(true);
+               try {
+                       msoRequest.parse(sir, instanceIdMap, action, version);
+               } catch (Exception e) {
+                       msoLogger.debug("Validation failed: ", e);
+                       Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,
+                                       MsoException.ServiceException, "Error parsing request.  " + e.getMessage(),
+                                       ErrorNumbers.SVC_BAD_PARAMETER, null);
+                       if (msoRequest.getRequestId() != null) {
+                               msoLogger.debug("Logging failed message to the database");
+                               //TODO update the service name
+                         this.createOperationStatusRecordForError(action, requestId);
+                       }
+                       msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
+                                       MsoLogger.ErrorCode.SchemaError, requestJSON, e);
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,
+                                       "Validation of the input request failed");
+                       msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
+                       return response;
+               }
+               
+               OperationStatus dup = null;
+               String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
+               String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
+               try {
+                       if (!(instanceName == null && "service".equals(requestScope)
+                                       && (action == Action.createInstance || action == Action.activateInstance))) {
+                         //TODO : Need to check for the duplicate record from the operation status,
+                         //TODO : commenting this check for unblocking current testing for now...  induces dead code...
+                               dup = chkDuplicateServiceNameInOperStatus( instanceName);
+                       }
+               } catch (Exception e) {
+                       msoLogger.error(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",
+                                       MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
+
+                       Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
+                                       MsoException.ServiceException, e.getMessage(), ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);
+
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,
+                                       "Error during duplicate check");
+                       msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
+                       return response;
+               }
+
+               if (dup != null) {
+                       // Found the duplicate record. Return the appropriate error.
+                       String instance = null;
+                       if (instanceName != null) {
+                               instance = instanceName;
+                       } else {
+                               instance = instanceIdMap.get(requestScope + "InstanceId");
+                       }
+                       String dupMessage = "Error: Locked instance - This " + requestScope + " (" + instance + ") "
+                                       + "already has a request being worked with a status of " + dup.getProgress() + " (ServiceId - "
+                                       + dup.getServiceId() + "). The existing request must finish or be cleaned up before proceeding.";
+
+                       Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT,
+                                       MsoException.ServiceException, dupMessage, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);
+
+                       msoLogger.warn(MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError,
+                                       "Duplicate request - Subscriber already has a request for this service");
+                       
+                       
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict,
+                                       dupMessage);
+                       msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
+                       createOperationStatusRecordForError(action, requestId);
+                       return response;
+               }
+               
+               CatalogDatabase db = null;
+               RecipeLookupResult recipeLookupResult = null;
+               try {
+                       db = CatalogDatabase.getInstance();
+                       recipeLookupResult = getServiceInstanceOrchestrationURI(db, e2eSir.getService().getTemplateId(), action);
+               } catch (Exception e) {
+                       msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",
+                                       MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
+                       msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
+                       Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,
+                                       MsoException.ServiceException, "No communication to catalog DB " + e.getMessage(),
+                                       ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
+                       alarmLogger.sendAlarm("MsoDatabaseAccessError", MsoAlarmLogger.CRITICAL,
+                                       Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
+                       
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,
+                                       "Exception while communciate with DB");
+                       msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());
+                       createOperationStatusRecordForError(action, requestId);
+                       return response;
+               } finally {
+                       closeCatalogDB(db);
+               }
+
+               if (recipeLookupResult == null) {
+                       msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "",
+                                       MsoLogger.ErrorCode.DataError, "No recipe found in DB");
+                       msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
+                       Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,
+                                       MsoException.ServiceException, "Recipe does not exist in catalog DB",
+                                       ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);
+               
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound,
+                                       "No recipe found in DB");
+                       msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());
+                       createOperationStatusRecordForError(action, requestId);
+                       return response;
+               }
+//             try {
+//                     msoRequest.createRequestRecord(Status.PENDING, action);
+//                     //createOperationStatusRecord(action, requestId);
+//             } catch (Exception e) {
+//                     msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "",
+//                                     MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
+//                     msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
+//                     Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
+//                                     MsoException.ServiceException, "Exception while creating record in DB " + e.getMessage(),
+//                                     ErrorNumbers.SVC_BAD_PARAMETER, null);
+//                     msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,
+//                                     "Exception while creating record in DB");
+//                     msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
+//                     return response;
+//             }
+
+               String serviceInstanceType = e2eSir.getService().getParameters().getServiceType();
+
+               String serviceId = "";
+               RequestClient requestClient = null;
+               HttpResponse response = null;
+
+               long subStartTime = System.currentTimeMillis();
+               String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);
+
+               try {
+                       requestClient = RequestClientFactory.getRequestClient(recipeLookupResult.getOrchestrationURI(),
+                                       MsoPropertiesUtils.loadMsoProperties());
+
+                       // Capture audit event
+                       msoLogger.debug("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl());
+
+                       response = requestClient.post(requestId, false, recipeLookupResult.getRecipeTimeout(), action.name(),
+                                       serviceId, null, null, null, null, serviceInstanceType, null, null, null, sirRequestJson);
+
+                       msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
+                                       "Successfully received response from BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI(),
+                                       null);
+               } catch (Exception e) {
+                       msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR,
+                                       MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN",
+                                       recipeLookupResult.getOrchestrationURI(), null);
+                       Response resp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,
+                                       MsoException.ServiceException, "Failed calling bpmn " + e.getMessage(),
+                                       ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
+                       alarmLogger.sendAlarm("MsoConfigurationError", MsoAlarmLogger.CRITICAL,
+                                       Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
+                       msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
+                                       MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,
+                                       "Exception while communicate with BPMN engine");
+                       msoLogger.debug("End of the transaction, the final response is: " + (String) resp.getEntity());
+                       createOperationStatusRecordForError(action, requestId);
+                       return resp;
+               }
+
+               if (response == null) {
+                       Response resp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,
+                                       MsoException.ServiceException, "bpelResponse is null", ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
+                       msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
+                                       MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError,
+                                       "Null response from BPMN");
+                       msoLogger.debug(END_OF_THE_TRANSACTION + (String) resp.getEntity());
+                       return resp;
+               }
+
+               ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());
+               int bpelStatus = respHandler.getStatus();
+
+               return beplStatusUpdate(requestId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action, instanceIdMap);
+       }
+
+       private void closeCatalogDB(CatalogDatabase db) {
+               if (db != null) {
+                       db.close();
+               }
+       }
+
+       private Response beplStatusUpdate(String requestId, long startTime,
+                       MsoRequest msoRequest, RequestClient requestClient,
+                       ResponseHandler respHandler, int bpelStatus, Action action,
+                       HashMap<String, String> instanceIdMap) {
+               // BPMN accepted the request, the request is in progress
                if (bpelStatus == HttpStatus.SC_ACCEPTED) {
                        String camundaJSONResponseBody = respHandler.getResponseBody();
                        msoLogger
-                       .debug("Received from Camunda: " + camundaJSONResponseBody);
-                       (RequestsDatabase.getInstance()).updateInfraStatus(requestId,
-                                       Status.IN_PROGRESS.toString(),
-                                       Constants.PROGRESS_REQUEST_IN_PROGRESS,
-                                       Constants.MODIFIED_BY_APIHANDLER);
-
+                                       .debug("Received from Camunda: " + camundaJSONResponseBody);
+
+                       // currently only for delete case we update the status here
+                       if (action == Action.deleteInstance) {
+                               ObjectMapper mapper = new ObjectMapper();
+                               try {
+                                       DelE2ESvcResp jo = mapper.readValue(
+                                                       camundaJSONResponseBody, DelE2ESvcResp.class);
+                                       String operationId = jo.getOperationId();
+                               this.createOperationStatusRecord("DELETE", requestId,
+                                                               operationId);
+                               } catch (Exception ex) {
+                                       msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,
+                                                       requestClient.getUrl(), "", "",
+                                                       MsoLogger.ErrorCode.BusinessProcesssError,
+                                                       "Response from BPEL engine is failed with HTTP Status="
+                                                                       + bpelStatus);
+                               }
+                       }
                        msoLogger.recordAuditEvent(startTime,
                                        MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
                                        "BPMN accepted the request, the request is in progress");
-                       msoLogger.debug("End of the transaction, the final response is: "
-                                       + (String) camundaJSONResponseBody);
+                       msoLogger.debug(END_OF_THE_TRANSACTION + camundaJSONResponseBody);
                        return Response.status(HttpStatus.SC_ACCEPTED)
                                        .entity(camundaJSONResponseBody).build();
                } else {
-                       List<String> variables = new ArrayList<String>();
+                       List<String> variables = new ArrayList<>();
                        variables.add(bpelStatus + "");
                        String camundaJSONResponseBody = respHandler.getResponseBody();
                        if (camundaJSONResponseBody != null
@@ -356,7 +631,7 @@ public class E2EServiceInstances {
                                                bpelStatus, MsoException.ServiceException,
                                                "Request Failed due to BPEL error with HTTP Status= %1 "
                                                                + '\n' + camundaJSONResponseBody,
-                                                               ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, variables);
+                                               ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, variables);
                                msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,
                                                requestClient.getUrl(), "", "",
                                                MsoLogger.ErrorCode.BusinessProcesssError,
@@ -366,8 +641,7 @@ public class E2EServiceInstances {
                                                MsoLogger.StatusCode.ERROR,
                                                MsoLogger.ResponseCode.InternalError,
                                                "Response from BPMN engine is failed");
-                               msoLogger
-                               .debug("End of the transaction, the final response is: "
+                               msoLogger.debug(END_OF_THE_TRANSACTION
                                                + (String) resp.getEntity());
                                return resp;
                        } else {
@@ -386,41 +660,65 @@ public class E2EServiceInstances {
                                                MsoLogger.StatusCode.ERROR,
                                                MsoLogger.ResponseCode.InternalError,
                                                "Response from BPEL engine is empty");
-                               msoLogger
-                               .debug("End of the transaction, the final response is: "
+                               msoLogger.debug(END_OF_THE_TRANSACTION
                                                + (String) resp.getEntity());
                                return resp;
                        }
                }
        }
 
+       /**
+        * Getting recipes from catalogDb
+        * 
+        * @param db the catalog db
+        * @param serviceModelUUID the service model version uuid
+        * @param action the action for the service
+        * @return the service recipe result
+        */
        private RecipeLookupResult getServiceInstanceOrchestrationURI(
-                       CatalogDatabase db, E2EServiceInstanceRequest sir, Action action) {
+                       CatalogDatabase db, String serviceModelUUID, Action action) {
 
-               RecipeLookupResult recipeLookupResult = null;
-
-               recipeLookupResult = getServiceURI(db, sir, action);
+               RecipeLookupResult recipeLookupResult = getServiceURI(db, serviceModelUUID, action);
 
                if (recipeLookupResult != null) {
-                       msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
-               }
-               else {
+                       msoLogger.debug("Orchestration URI is: "
+                                       + recipeLookupResult.getOrchestrationURI()
+                                       + ", recipe Timeout is: "
+                                       + Integer.toString(recipeLookupResult.getRecipeTimeout()));
+               } else {
                        msoLogger.debug("No matching recipe record found");
                }
                return recipeLookupResult;
        }
 
-       private RecipeLookupResult getServiceURI(CatalogDatabase db,
-                       E2EServiceInstanceRequest sir, Action action) {
+       /**
+        * Getting recipes from catalogDb
+        * If Service recipe is not set, use default recipe, if set , use special recipe.
+        * @param db the catalog db
+        * @param serviceModelUUID the service version uuid
+        * @param action the action of the service.
+        * @return the service recipe result.
+        */
+       private RecipeLookupResult getServiceURI(CatalogDatabase db, String serviceModelUUID, Action action) {
 
                String defaultServiceModelName = "UUI_DEFAULT";
 
-               Service serviceRecord = null;
-               ServiceRecipe recipe = null;
-
-               serviceRecord = db.getServiceByModelName(defaultServiceModelName);
-               recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
-
+               Service defaultServiceRecord = db
+                               .getServiceByModelName(defaultServiceModelName);
+               ServiceRecipe defaultRecipe = db.getServiceRecipeByModelUUID(
+                       defaultServiceRecord.getModelUUID(), action.name());
+               //set recipe as default generic recipe
+               ServiceRecipe recipe = defaultRecipe;
+               //check the service special recipe 
+               if(null != serviceModelUUID && ! serviceModelUUID.isEmpty()){
+                     ServiceRecipe serviceSpecialRecipe = db.getServiceRecipeByModelUUID(
+                             serviceModelUUID, action.name());
+                     if(null != serviceSpecialRecipe){
+                         //set service special recipe.
+                         recipe = serviceSpecialRecipe;
+                     }
+               }       
+               
                if (recipe == null) {
                        return null;
                }
@@ -429,94 +727,214 @@ public class E2EServiceInstances {
 
        }
 
-       private String mappingObtainedRequestJSONToServiceInstanceRequest(E2EServiceInstanceRequest e2eSir){
+       /**
+        * Converting E2EServiceInstanceRequest to ServiceInstanceRequest and
+        * passing it to camunda engine.
+        * 
+        * @param e2eSir
+        * @return
+        */
+       private String mapReqJsonToSvcInstReq(E2EServiceInstanceRequest e2eSir,
+                       String requestJSON) {
 
-               ServiceInstancesRequest sir = new ServiceInstancesRequest();
+               sir = new ServiceInstancesRequest();
 
                String returnString = null;
                RequestDetails requestDetails = new RequestDetails();
                ModelInfo modelInfo = new ModelInfo();
-               
-               //ModelInvariantId
+
+               // ModelInvariantId
                modelInfo.setModelInvariantId(e2eSir.getService().getServiceDefId());
-               
-               //modelNameVersionId
+
+               // modelNameVersionId
                modelInfo.setModelNameVersionId(e2eSir.getService().getTemplateId());
-               
-               String modelInfoValue = e2eSir.getService().getParameters().getNodeTemplateName();
-               String[] arrayOfInfo = modelInfoValue.split(":");
-               String modelName = arrayOfInfo[0];
-               String modelVersion = arrayOfInfo[1];
-               
-               //modelName
+
+               // String modelInfoValue =
+               // e2eSir.getService().getParameters().getNodeTemplateName();
+               // String[] arrayOfInfo = modelInfoValue.split(":");
+               // String modelName = arrayOfInfo[0];
+               // String modelVersion = arrayOfInfo[1];
+
+               // TODO: To ensure, if we dont get the values from the UUI
+               String modelName = "voLTE";
+               String modelVersion = "1.0";
+               // modelName
                modelInfo.setModelName(modelName);
-               
-               //modelVersion
+
+               // modelVersion
                modelInfo.setModelVersion(modelVersion);
-               
-               //modelType
-               //if(ModelType.service.equals(e2eSir.getService().getParameters().getNodeType())){
-                       modelInfo.setModelType(ModelType.service);
-               //}
-               
-               //setting modelInfo to requestDetails
+
+               // modelType
+               modelInfo.setModelType(ModelType.service);
+
+               // setting modelInfo to requestDetails
                requestDetails.setModelInfo(modelInfo);
-               
+
                SubscriberInfo subscriberInfo = new SubscriberInfo();
 
-               //globalsubscriberId
-               subscriberInfo.setGlobalSubscriberId(e2eSir.getService().getParameters().getGlobalSubscriberId());
+               // globalsubscriberId
+               subscriberInfo.setGlobalSubscriberId(e2eSir.getService()
+                               .getParameters().getGlobalSubscriberId());
 
-               //subscriberName
-               subscriberInfo.setSubscriberName(e2eSir.getService().getParameters().getSubscriberName());
-               
-               //setting subscriberInfo to requestDetails
+               // subscriberName
+               subscriberInfo.setSubscriberName(e2eSir.getService().getParameters()
+                               .getSubscriberName());
+
+               // setting subscriberInfo to requestDetails
                requestDetails.setSubscriberInfo(subscriberInfo);
-               
+
                RequestInfo requestInfo = new RequestInfo();
-               
-               //instanceName
+
+               // instanceName
                requestInfo.setInstanceName(e2eSir.getService().getName());
 
-               //source
+               // source
                requestInfo.setSource("UUI");
 
-               //suppressRollback
+               // suppressRollback
                requestInfo.setSuppressRollback(true);
 
-               //setting requestInfo to requestDetails
+               // setting requestInfo to requestDetails
                requestDetails.setRequestInfo(requestInfo);
-               
+
                RequestParameters requestParameters = new RequestParameters();
-               
-               //subscriptionServiceType
-               requestParameters.setSubscriptionServiceType("MOG");
 
-               //Userparams
-               List<E2EUserParam> userParams = new ArrayList<>(); 
-               userParams = e2eSir.getService().getParameters().getRequestParameters().getUserParams();
-               List<Map<String, String>> userParamList = new ArrayList<Map<String,String>>();
-               Map<String,String> userParamMap= new HashMap<String, String>();
-               for(E2EUserParam userp: userParams){
-                       userParamMap.put(userp.getName(), userp.getValue());
-                       userParamList.add(userParamMap);
-               }
+               // subscriptionServiceType
+               requestParameters.setSubscriptionServiceType("MOG");
 
+               // Userparams
+               List<E2EUserParam> userParams;
+               // userParams =
+               // e2eSir.getService().getParameters().getRequestParameters().getUserParams();
+               List<Map<String, String>> userParamList = new ArrayList<>();
+               Map<String, String> userParamMap = new HashMap<>();
+               // complete json request updated in the camunda
+               userParamMap.put("UUIRequest", requestJSON);
+               userParamMap.put("ServiceInstanceName", e2eSir.getService().getName());
+
+               // Map<String, String> userParamMap3 = null;
+               // for (E2EUserParam userp : userParams) {
+               // userParamMap.put(userp.getName(), userp.getValue());
+               //
+               // }
+               userParamList.add(userParamMap);
                requestParameters.setUserParams(userParamList);
-               
-               //setting requestParameters to requestDetails
+
+               // setting requestParameters to requestDetails
                requestDetails.setRequestParameters(requestParameters);
-               
+
                sir.setRequestDetails(requestDetails);
 
-               //converting to string
+               // converting to string
                ObjectMapper mapper = new ObjectMapper();
                try {
                        returnString = mapper.writeValueAsString(sir);
                } catch (IOException e) {
-                       msoLogger.debug("Exception while converting ServiceInstancesRequest object to string", e);
+                       msoLogger
+                                       .debug("Exception while converting ServiceInstancesRequest object to string",
+                                                       e);
                }
 
                return returnString;
        }
+
+       private void createOperationStatusRecordForError(Action action,
+                       String requestId) throws MsoDatabaseException {
+
+               AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager();
+
+               Session session = null;
+               try {
+
+                       session = requestsDbSessionFactoryManager.getSessionFactory()
+                                       .openSession();
+                       session.beginTransaction();
+
+                       OperationStatus os = new OperationStatus();
+                       os.setOperation(action.name());
+                       os.setOperationContent("");
+                       os.setOperationId("");
+                       os.setProgress("100");
+                       os.setReason("");
+                       os.setResult("error");
+                       os.setServiceId(requestId);
+                       os.setUserId("");
+                       Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());
+                       Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());
+                       os.setFinishedAt(endTimeStamp);
+                       os.setOperateAt(startTimeStamp);
+
+                       session.save(os);
+                       session.getTransaction().commit();
+
+               } catch (Exception e) {
+                       msoLogger.error(MessageEnum.APIH_DB_INSERT_EXC, "", "",
+                                       MsoLogger.ErrorCode.DataError,
+                                       "Exception when creation record request in Operation", e);
+                       throw new MsoDatabaseException(
+                                       "Data did inserted in Operatus Status Table for failure", e);
+               } finally {
+                       if (null != session) {
+                               session.close();
+                       }
+               }
+       }
+
+       private void createOperationStatusRecord(String actionNm, String serviceId,
+                       String operationId) throws MsoDatabaseException {
+
+               AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager();
+
+               Session session = null;
+               try {
+
+                       session = requestsDbSessionFactoryManager.getSessionFactory()
+                                       .openSession();
+                       session.beginTransaction();
+
+                       OperationStatus os = new OperationStatus();
+                       os.setOperation(actionNm);
+                       os.setOperationContent("");
+                       os.setOperationId(operationId);
+                       os.setProgress("0");
+                       os.setReason("");
+                       os.setResult("processing");
+                       os.setServiceId(serviceId);
+                       // TODO : to be updated...
+                       os.setUserId("");
+                       Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());
+                       Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());
+                       os.setFinishedAt(endTimeStamp);
+                       os.setOperateAt(startTimeStamp);
+
+                       session.save(os);
+                       session.getTransaction().commit();
+
+               } catch (Exception e) {
+                       msoLogger.error(MessageEnum.APIH_DB_INSERT_EXC, "", "",
+                                       MsoLogger.ErrorCode.DataError,
+                                       "Exception when creation record request in Operation", e);
+                       throw new MsoDatabaseException(
+                                       "Data did inserted in Operatus Status Table", e);
+               } finally {
+                       if (null != session) {
+                               session.close();
+                       }
+               }
+       }
+
+       private OperationStatus chkDuplicateServiceInOperStatus(String serviceId) {
+               OperationStatus dupServiceName = (RequestsDatabase.getInstance())
+                               .getOperationStatusByServiceId(serviceId);
+
+               return dupServiceName;
+       }
+
+       private OperationStatus chkDuplicateServiceNameInOperStatus(
+                       String serviceName) {
+               OperationStatus dupServiceName = (RequestsDatabase.getInstance())
+                               .getOperationStatusByServiceName(serviceName);
+
+               return dupServiceName;
+       }
 }
\ No newline at end of file