Select recipe for create service
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / openecomp / mso / apihandlerinfra / E2EServiceInstances.java
index ecd0e4d..403e940 100644 (file)
@@ -67,7 +67,7 @@ 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;
@@ -81,11 +81,12 @@ import com.wordnik.swagger.annotations.ApiOperation;
 public class E2EServiceInstances {
 
        private HashMap<String, String> instanceIdMap = new HashMap<>();
-       private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.APIH);
+       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";
@@ -99,9 +100,11 @@ public class E2EServiceInstances {
        @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) {
+       public Response createE2EServiceInstance(String request,
+                       @PathParam("version") String version) {
 
-               return processE2EserviceInstances(request, Action.createInstance, null, version);
+               return processE2EserviceInstances(request, Action.createInstance, null,
+                               version);
        }
 
        /**
@@ -114,22 +117,30 @@ public class E2EServiceInstances {
        @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,
+       public Response deleteE2EServiceInstance(String request,
+                       @PathParam("version") String version,
                        @PathParam("serviceId") String serviceId) {
 
                instanceIdMap.put("serviceId", serviceId);
 
-               return deleteE2EserviceInstances(request, Action.deleteInstance, instanceIdMap, version);
+               return deleteE2EserviceInstances(request, Action.deleteInstance,
+                               instanceIdMap, version);
        }
-       
+
        @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) {
+       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);
@@ -139,169 +150,225 @@ public class E2EServiceInstances {
                OperationStatus operationStatus = null;
 
                try {
-                       operationStatus = requestsDB.getOperationStatus(serviceId, operationId);
+                       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,
+                       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());
+                       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",
+                       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.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,
+                       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());
+                       msoLogger.debug("End of the transaction, the final response is: "
+                                       + (String) resp.getEntity());
                        return resp;
 
                }
 
-               e2eServiceResponse.setE2eRequest(operationStatus);
+               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
+       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);
                E2EServiceInstanceDeleteRequest e2eDelReq = null;
 
                MsoRequest msoRequest = new MsoRequest(requestId);
-               
+
                ObjectMapper mapper = new ObjectMapper();
                try {
-                       e2eDelReq = mapper.readValue(requestJSON, E2EServiceInstanceDeleteRequest.class);
+                       e2eDelReq = mapper.readValue(requestJSON,
+                                       E2EServiceInstanceDeleteRequest.class);
 
                } catch (Exception e) {
 
                        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, "", "",
+                       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,
+                       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());
+                       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, action);
+                       //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.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(),
+                       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));
+                       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,
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
+                                       MsoLogger.ResponseCode.DBAccessError,
                                        "Exception while communciate with DB");
-                       msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());
+                       msoLogger.debug(END_OF_THE_TRANSACTION
+                                       + (String) response.getEntity());
                        return response;
                } finally {
                        closeCatalogDB(db);
                }
                if (recipeLookupResult == null) {
-                       msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "",
+                       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",
+                       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,
+                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
+                                       MsoLogger.ResponseCode.DataNotFound,
                                        "No recipe found in DB");
-                       msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());
+                       msoLogger.debug(END_OF_THE_TRANSACTION
+                                       + (String) response.getEntity());
                        createOperationStatusRecordForError(action, requestId);
                        return response;
                }
 
-               
                RequestClient requestClient = null;
                HttpResponse response = null;
 
                long subStartTime = System.currentTimeMillis();
-               //String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);
+               // String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);
 
                try {
-                       requestClient = RequestClientFactory.getRequestClient(recipeLookupResult.getOrchestrationURI(),
+                       requestClient = RequestClientFactory.getRequestClient(
+                                       recipeLookupResult.getOrchestrationURI(),
                                        MsoPropertiesUtils.loadMsoProperties());
 
                        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, bpmnRequest);
 
-                       msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
-                                       "Successfully received response from BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI(),
-                                       null);
+                       // 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, bpmnRequest);
+
+                       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",
+                       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(),
+                       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,
+                       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,
+                       msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR,
+                                       MSO_PROP_APIHANDLER_INFRA, "", "",
+                                       MsoLogger.ErrorCode.AvailabilityError,
                                        "Exception while communicate with BPMN engine");
-                       msoLogger.debug("End of the transaction, the final response is: " + (String) resp.getEntity());
+                       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,
+                       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());
                        createOperationStatusRecordForError(action, requestId);
                        return resp;
                }
 
-               ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());
+               ResponseHandler respHandler = new ResponseHandler(response,
+                               requestClient.getType());
                int bpelStatus = respHandler.getStatus();
 
-               return beplStatusUpdate(requestId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action);
+               return beplStatusUpdate(requestId, startTime, msoRequest,
+                               requestClient, respHandler, bpelStatus, action, instanceIdMap);
        }
 
        private Response processE2EserviceInstances(String requestJSON, Action action,
@@ -354,10 +421,8 @@ public class E2EServiceInstances {
                        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();
+               
+               OperationStatus dup = null;
                String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
                String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
                try {
@@ -365,8 +430,7 @@ public class E2EServiceInstances {
                                        && (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 = (RequestsDatabase.getInstance()).checkInstanceNameDuplicate(instanceIdMap, instanceName,
-//                                             requestScope);
+                               dup = chkDuplicateServiceNameInOperStatus( instanceName);
                        }
                } catch (Exception e) {
                        msoLogger.error(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",
@@ -390,8 +454,8 @@ public class E2EServiceInstances {
                                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.";
+                                       + "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);
@@ -411,7 +475,7 @@ public class E2EServiceInstances {
                RecipeLookupResult recipeLookupResult = null;
                try {
                        db = CatalogDatabase.getInstance();
-                       recipeLookupResult = getServiceInstanceOrchestrationURI(db, action);
+                       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);
@@ -445,7 +509,6 @@ public class E2EServiceInstances {
                        createOperationStatusRecordForError(action, requestId);
                        return response;
                }
-
 //             try {
 //                     msoRequest.createRequestRecord(Status.PENDING, action);
 //                     //createOperationStatusRecord(action, requestId);
@@ -516,7 +579,7 @@ public class E2EServiceInstances {
                ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());
                int bpelStatus = respHandler.getStatus();
 
-               return beplStatusUpdate(requestId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action);
+               return beplStatusUpdate(requestId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action, instanceIdMap);
        }
 
        private void closeCatalogDB(CatalogDatabase db) {
@@ -525,91 +588,80 @@ public class E2EServiceInstances {
                }
        }
 
-       private InfraActiveRequests checkForDuplicateRecord(Action action, HashMap<String, String> instanceIdMap,
-                       String instanceName, String requestScope) {
-               InfraActiveRequests dupValue = null;
-               if (!(instanceName == null && "service".equals(requestScope)
-                               && (action == Action.createInstance || action == Action.activateInstance))) {
-                       dupValue = (RequestsDatabase.getInstance()).checkInstanceNameDuplicate(instanceIdMap, instanceName,
-                                       requestScope);
-               }
-               return dupValue;
-       }
-
-       private Response duplicateRecordFound(Action action, HashMap<String, String> instanceIdMap, long startTime,
-                       MsoRequest msoRequest, InfraActiveRequests dup, String instanceName, String requestScope) {
-               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 + (String) response.getEntity());
-               return response;
-       }
-
-       private Response beplStatusUpdate(String requestId, long startTime, MsoRequest msoRequest,
-                       RequestClient requestClient, ResponseHandler respHandler, int bpelStatus, Action action) {
+       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);
-                       
+                       msoLogger
+                                       .debug("Received from Camunda: " + camundaJSONResponseBody);
+
                        // currently only for delete case we update the status here
-                       if(action == Action.deleteInstance){
+                       if (action == Action.deleteInstance) {
                                ObjectMapper mapper = new ObjectMapper();
-                               try{
-                                       DelE2ESvcResp jo = mapper.readValue(camundaJSONResponseBody, DelE2ESvcResp.class);
+                               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(), "", "",
+                               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);
+                                                       "Response from BPEL engine is failed with HTTP Status="
+                                                                       + bpelStatus);
                                }
                        }
-                       msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
+                       msoLogger.recordAuditEvent(startTime,
+                                       MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
                                        "BPMN accepted the request, the request is in progress");
                        msoLogger.debug(END_OF_THE_TRANSACTION + camundaJSONResponseBody);
-                       return Response.status(HttpStatus.SC_ACCEPTED).entity(camundaJSONResponseBody).build();
+                       return Response.status(HttpStatus.SC_ACCEPTED)
+                                       .entity(camundaJSONResponseBody).build();
                } else {
                        List<String> variables = new ArrayList<>();
                        variables.add(bpelStatus + "");
                        String camundaJSONResponseBody = respHandler.getResponseBody();
-                       if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty()) {
-                               Response resp = msoRequest.buildServiceErrorResponse(bpelStatus, MsoException.ServiceException,
-                                               "Request Failed due to BPEL error with HTTP Status= %1 " + '\n' + camundaJSONResponseBody,
+                       if (camundaJSONResponseBody != null
+                                       && !camundaJSONResponseBody.isEmpty()) {
+                               Response resp = msoRequest.buildServiceErrorResponse(
+                                               bpelStatus, MsoException.ServiceException,
+                                               "Request Failed due to BPEL error with HTTP Status= %1 "
+                                                               + '\n' + camundaJSONResponseBody,
                                                ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, variables);
-                               msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl(), "", "",
+                               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.ERROR, MsoLogger.ResponseCode.InternalError,
+                                               "Response from BPEL engine is failed with HTTP Status="
+                                                               + bpelStatus);
+                               msoLogger.recordAuditEvent(startTime,
+                                               MsoLogger.StatusCode.ERROR,
+                                               MsoLogger.ResponseCode.InternalError,
                                                "Response from BPMN engine is failed");
-                               msoLogger.debug(END_OF_THE_TRANSACTION + (String) resp.getEntity());
+                               msoLogger.debug(END_OF_THE_TRANSACTION
+                                               + (String) resp.getEntity());
                                return resp;
                        } else {
-                               Response resp = msoRequest.buildServiceErrorResponse(bpelStatus, MsoException.ServiceException,
-                                               "Request Failed due to BPEL error with HTTP Status= %1",
-                                               ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, variables);
-                               msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl(), "", "",
-                                               MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
-                               msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError,
+                               Response resp = msoRequest
+                                               .buildServiceErrorResponse(
+                                                               bpelStatus,
+                                                               MsoException.ServiceException,
+                                                               "Request Failed due to BPEL error with HTTP Status= %1",
+                                                               ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
+                                                               variables);
+                               msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,
+                                               requestClient.getUrl(), "", "",
+                                               MsoLogger.ErrorCode.BusinessProcesssError,
+                                               "Response from BPEL engine is empty");
+                               msoLogger.recordAuditEvent(startTime,
+                                               MsoLogger.StatusCode.ERROR,
+                                               MsoLogger.ResponseCode.InternalError,
                                                "Response from BPEL engine is empty");
-                               msoLogger.debug(END_OF_THE_TRANSACTION + (String) resp.getEntity());
+                               msoLogger.debug(END_OF_THE_TRANSACTION
+                                               + (String) resp.getEntity());
                                return resp;
                        }
                }
@@ -618,17 +670,21 @@ public class E2EServiceInstances {
        /**
         * Getting recipes from catalogDb
         * 
-        * @param db
-        * @param action
-        * @return
+        * @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, Action action) {
+       private RecipeLookupResult getServiceInstanceOrchestrationURI(
+                       CatalogDatabase db, String serviceModelUUID, Action action) {
 
-               RecipeLookupResult recipeLookupResult = getServiceURI(db, action);
+               RecipeLookupResult recipeLookupResult = getServiceURI(db, serviceModelUUID, action);
 
                if (recipeLookupResult != null) {
-                       msoLogger.debug("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI()
-                                       + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout()));
+                       msoLogger.debug("Orchestration URI is: "
+                                       + recipeLookupResult.getOrchestrationURI()
+                                       + ", recipe Timeout is: "
+                                       + Integer.toString(recipeLookupResult.getRecipeTimeout()));
                } else {
                        msoLogger.debug("No matching recipe record found");
                }
@@ -637,22 +693,37 @@ public class E2EServiceInstances {
 
        /**
         * Getting recipes from catalogDb
-        * 
-        * @param db
-        * @param action
-        * @return
+        * 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, Action action) {
+       private RecipeLookupResult getServiceURI(CatalogDatabase db, String serviceModelUUID, Action action) {
 
                String defaultServiceModelName = "UUI_DEFAULT";
 
-               Service serviceRecord = db.getServiceByModelName(defaultServiceModelName);
-               ServiceRecipe 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;
                }
-               return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout());
+               return new RecipeLookupResult(recipe.getOrchestrationUri(),
+                               recipe.getRecipeTimeout());
 
        }
 
@@ -663,7 +734,8 @@ public class E2EServiceInstances {
         * @param e2eSir
         * @return
         */
-       private String mapReqJsonToSvcInstReq(E2EServiceInstanceRequest e2eSir, String requestJSON) {
+       private String mapReqJsonToSvcInstReq(E2EServiceInstanceRequest e2eSir,
+                       String requestJSON) {
 
                sir = new ServiceInstancesRequest();
 
@@ -677,14 +749,15 @@ public class E2EServiceInstances {
                // modelNameVersionId
                modelInfo.setModelNameVersionId(e2eSir.getService().getTemplateId());
 
-//             String modelInfoValue = e2eSir.getService().getParameters().getNodeTemplateName();
-//             String[] arrayOfInfo = modelInfoValue.split(":");
-//             String modelName = arrayOfInfo[0];
-//             String modelVersion = arrayOfInfo[1];
+               // 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";
+               // TODO: To ensure, if we dont get the values from the UUI
+               String modelName = "voLTE";
+               String modelVersion = "1.0";
                // modelName
                modelInfo.setModelName(modelName);
 
@@ -700,10 +773,12 @@ public class E2EServiceInstances {
                SubscriberInfo subscriberInfo = new SubscriberInfo();
 
                // globalsubscriberId
-               subscriberInfo.setGlobalSubscriberId(e2eSir.getService().getParameters().getGlobalSubscriberId());
+               subscriberInfo.setGlobalSubscriberId(e2eSir.getService()
+                               .getParameters().getGlobalSubscriberId());
 
                // subscriberName
-               subscriberInfo.setSubscriberName(e2eSir.getService().getParameters().getSubscriberName());
+               subscriberInfo.setSubscriberName(e2eSir.getService().getParameters()
+                               .getSubscriberName());
 
                // setting subscriberInfo to requestDetails
                requestDetails.setSubscriberInfo(subscriberInfo);
@@ -729,18 +804,19 @@ public class E2EServiceInstances {
 
                // Userparams
                List<E2EUserParam> userParams;
-               //userParams = e2eSir.getService().getParameters().getRequestParameters().getUserParams();
+               // 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
+               // 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());
-//                     
-//             }
+               // Map<String, String> userParamMap3 = null;
+               // for (E2EUserParam userp : userParams) {
+               // userParamMap.put(userp.getName(), userp.getValue());
+               //
+               // }
                userParamList.add(userParamMap);
                requestParameters.setUserParams(userParamList);
 
@@ -754,78 +830,111 @@ public class E2EServiceInstances {
                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) {
-
-                       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("");
-                         os.setFinishedAt(new Timestamp(System.currentTimeMillis()));
-                         os.setOperateAt(new Timestamp(System.currentTimeMillis()));
-
-                               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);
-                       } finally {
-                               if (null != session) {
-                                       session.close();
-                               }
+       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) {
+       }
 
-                               AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager();
+       private void createOperationStatusRecord(String actionNm, String serviceId,
+                       String operationId) throws MsoDatabaseException {
 
-                               Session session = null;
-                               try {
+               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();
 
-                                       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("");
-                                 os.setFinishedAt(new Timestamp(System.currentTimeMillis()));
-                                 os.setOperateAt(new Timestamp(System.currentTimeMillis()));
-
-                                       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);
-                               } finally {
-                                       if (null != session) {
-                                               session.close();
-                                       }
+               } 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