2  * ============LICENSE_START=======================================================
\r 
   4  * ================================================================================
\r 
   5  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
\r 
   6  * ================================================================================
\r 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
\r 
   8  * you may not use this file except in compliance with the License.
\r 
   9  * You may obtain a copy of the License at
\r 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
\r 
  13  * Unless required by applicable law or agreed to in writing, software
\r 
  14  * distributed under the License is distributed on an "AS IS" BASIS,
\r 
  15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r 
  16  * See the License for the specific language governing permissions and
\r 
  17  * limitations under the License.
\r 
  18  * ============LICENSE_END=========================================================
\r 
  21 package org.openecomp.mso.apihandlerinfra;
\r 
  23 import java.io.IOException;
\r 
  24 import java.sql.Timestamp;
\r 
  25 import java.util.ArrayList;
\r 
  26 import java.util.HashMap;
\r 
  27 import java.util.List;
\r 
  28 import java.util.Map;
\r 
  30 import javax.ws.rs.Consumes;
\r 
  31 import javax.ws.rs.DELETE;
\r 
  32 import javax.ws.rs.GET;
\r 
  33 import javax.ws.rs.POST;
\r 
  34 import javax.ws.rs.PUT;
\r 
  35 import javax.ws.rs.Path;
\r 
  36 import javax.ws.rs.PathParam;
\r 
  37 import javax.ws.rs.Produces;
\r 
  38 import javax.ws.rs.core.MediaType;
\r 
  39 import javax.ws.rs.core.Response;
\r 
  41 import org.apache.http.HttpResponse;
\r 
  42 import org.apache.http.HttpStatus;
\r 
  43 import org.codehaus.jackson.map.ObjectMapper;
\r 
  44 import org.hibernate.Session;
\r 
  45 import org.json.JSONObject;
\r 
  46 import org.openecomp.mso.apihandler.common.ErrorNumbers;
\r 
  47 import org.openecomp.mso.apihandler.common.RequestClient;
\r 
  48 import org.openecomp.mso.apihandler.common.RequestClientFactory;
\r 
  49 import org.openecomp.mso.apihandler.common.ResponseHandler;
\r 
  50 import org.openecomp.mso.apihandlerinfra.Messages;
\r 
  51 import org.openecomp.mso.apihandlerinfra.MsoException;
\r 
  52 import org.openecomp.mso.apihandlerinfra.MsoRequest;
\r 
  53 import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.CompareModelsRequest;
\r 
  54 import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.DelE2ESvcResp;
\r 
  55 import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.E2EServiceInstanceDeleteRequest;
\r 
  56 import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.E2EServiceInstanceRequest;
\r 
  57 import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.E2EUserParam;
\r 
  58 import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.GetE2EServiceInstanceResponse;
\r 
  59 import org.openecomp.mso.serviceinstancebeans.ModelInfo;
\r 
  60 import org.openecomp.mso.serviceinstancebeans.ModelType;
\r 
  61 import org.openecomp.mso.serviceinstancebeans.RequestDetails;
\r 
  62 import org.openecomp.mso.serviceinstancebeans.RequestInfo;
\r 
  63 import org.openecomp.mso.serviceinstancebeans.RequestParameters;
\r 
  64 import org.openecomp.mso.serviceinstancebeans.ServiceInstancesRequest;
\r 
  65 import org.openecomp.mso.serviceinstancebeans.SubscriberInfo;
\r 
  66 import org.openecomp.mso.db.AbstractSessionFactoryManager;
\r 
  67 import org.openecomp.mso.db.catalog.CatalogDatabase;
\r 
  68 import org.openecomp.mso.db.catalog.beans.Service;
\r 
  69 import org.openecomp.mso.db.catalog.beans.ServiceRecipe;
\r 
  70 import org.openecomp.mso.logger.MessageEnum;
\r 
  71 import org.openecomp.mso.logger.MsoAlarmLogger;
\r 
  72 import org.openecomp.mso.logger.MsoLogger;
\r 
  73 import org.openecomp.mso.properties.MsoDatabaseException;
\r 
  74 import org.openecomp.mso.requestsdb.OperationStatus;
\r 
  75 import org.openecomp.mso.requestsdb.RequestsDatabase;
\r 
  76 import org.openecomp.mso.requestsdb.RequestsDbSessionFactoryManager;
\r 
  77 import org.openecomp.mso.utils.UUIDChecker;
\r 
  79 import com.wordnik.swagger.annotations.Api;
\r 
  80 import com.wordnik.swagger.annotations.ApiOperation;
\r 
  82 @Path("/e2eServiceInstances")
\r 
  83 @Api(value = "/e2eServiceInstances", description = "API Requests for E2E Service Instances")
\r 
  84 public class E2EServiceInstances {
\r 
  86         private HashMap<String, String> instanceIdMap = new HashMap<>();
\r 
  87         private static MsoLogger msoLogger = MsoLogger
\r 
  88                         .getMsoLogger(MsoLogger.Catalog.APIH);
\r 
  89         private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger();
\r 
  90         public static final String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
\r 
  91         private ServiceInstancesRequest sir = null;
\r 
  93         public static final String END_OF_THE_TRANSACTION = "End of the transaction, the final response is: ";
\r 
  94         public static final String EXCEPTION_CREATING_DB_RECORD = "Exception while creating record in DB";
\r 
  95         public static final String EXCEPTION_COMMUNICATE_BPMN_ENGINE = "Exception while communicate with BPMN engine";
\r 
  98          * POST Requests for E2E Service create Instance on a version provided
\r 
 102         @Path("/{version:[vV][3-5]}")
\r 
 103         @Consumes(MediaType.APPLICATION_JSON)
\r 
 104         @Produces(MediaType.APPLICATION_JSON)
\r 
 105         @ApiOperation(value = "Create an E2E Service Instance on a version provided", response = Response.class)
\r 
 106         public Response createE2EServiceInstance(String request,
\r 
 107                         @PathParam("version") String version) {
\r 
 109                 return processE2EserviceInstances(request, Action.createInstance, null,
\r 
 114          * PUT Requests for E2E Service update Instance on a version provided
\r 
 118         @Path("/{version:[vV][3-5]}/{serviceId}")
\r 
 119         @Consumes(MediaType.APPLICATION_JSON)
\r 
 120         @Produces(MediaType.APPLICATION_JSON)
\r 
 121         @ApiOperation(value = "Update an E2E Service Instance on a version provided and serviceId", response = Response.class)
\r 
 122         public Response updateE2EServiceInstance(String request,
\r 
 123                         @PathParam("version") String version,
\r 
 124                         @PathParam("serviceId") String serviceId) {
\r 
 126                 instanceIdMap.put("serviceId", serviceId);
\r 
 128                 return updateE2EserviceInstances(request, Action.updateInstance, instanceIdMap,
\r 
 133          * DELETE Requests for E2E Service delete Instance on a specified version
\r 
 138         @Path("/{version:[vV][3-5]}/{serviceId}")
\r 
 139         @Consumes(MediaType.APPLICATION_JSON)
\r 
 140         @Produces(MediaType.APPLICATION_JSON)
\r 
 141         @ApiOperation(value = "Delete E2E Service Instance on a specified version and serviceId", response = Response.class)
\r 
 142         public Response deleteE2EServiceInstance(String request,
\r 
 143                         @PathParam("version") String version,
\r 
 144                         @PathParam("serviceId") String serviceId) {
\r 
 146                 instanceIdMap.put("serviceId", serviceId);
\r 
 148                 return deleteE2EserviceInstances(request, Action.deleteInstance,
\r 
 149                                 instanceIdMap, version);
\r 
 153         @Path("/{version:[vV][3-5]}/{serviceId}/operations/{operationId}")
\r 
 154         @ApiOperation(value = "Find e2eServiceInstances Requests for a given serviceId and operationId", response = Response.class)
\r 
 155         @Produces(MediaType.APPLICATION_JSON)
\r 
 156         public Response getE2EServiceInstances(
\r 
 157                         @PathParam("serviceId") String serviceId,
\r 
 158                         @PathParam("version") String version,
\r 
 159                         @PathParam("operationId") String operationId) {
\r 
 160                 return getE2EServiceInstances(serviceId, operationId);
\r 
 164          * GET Requests for Comparing model of service instance with target version
\r 
 168         @Path("/{version:[vV][3-5]}/{serviceId}/modeldifferences")
\r 
 169         @Consumes(MediaType.APPLICATION_JSON)
\r 
 170         @Produces(MediaType.APPLICATION_JSON)
\r 
 171         @ApiOperation(value = "Find added and deleted resources of target model for the e2eserviceInstance on a given serviceId ", response = Response.class)
\r 
 172         public Response compareModelwithTargetVersion(String request,
\r 
 173                         @PathParam("serviceId") String serviceId,
\r 
 174                         @PathParam("version") String version) {
\r 
 176                 instanceIdMap.put("serviceId", serviceId);
\r 
 178                 return compareModelwithTargetVersion(request, Action.compareModel, instanceIdMap, version);
\r 
 181         private Response compareModelwithTargetVersion(String requestJSON, Action action,
\r 
 182                         HashMap<String, String> instanceIdMap, String version) {
\r 
 184                 String requestId = instanceIdMap.get("serviceId");
\r 
 185                 long startTime = System.currentTimeMillis();
\r 
 186                 msoLogger.debug("requestId is: " + requestId);
\r 
 188                 CompareModelsRequest e2eCompareModelReq = null;
\r 
 190                 MsoRequest msoRequest = new MsoRequest(requestId);
\r 
 192                 ObjectMapper mapper = new ObjectMapper();
\r 
 194                         e2eCompareModelReq = mapper.readValue(requestJSON, CompareModelsRequest.class);
\r 
 196                 } catch (Exception e) {
\r 
 198                         msoLogger.debug("Mapping of request to JSON object failed : ", e);
\r 
 199                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,
\r 
 200                                         MsoException.ServiceException, "Mapping of request to JSON object failed.  " + e.getMessage(),
\r 
 201                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
\r 
 202                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 203                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);
\r 
 204                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,
\r 
 205                                         "Mapping of request to JSON object failed");
\r 
 206                         msoLogger.debug("End of the transaction, the final response is: " + response.getEntity().toString());
\r 
 211                 Response returnResp = runCompareModelBPMWorkflow(e2eCompareModelReq, msoRequest, requestJSON, requestId,
\r 
 212                                 startTime, action);
\r 
 218         private Response runCompareModelBPMWorkflow(CompareModelsRequest e2eCompareModelReq, MsoRequest msoRequest,
\r 
 219                         String requestJSON, String requestId, long startTime, Action action) {
\r 
 221                 // Define RecipeLookupResult info here instead of query DB for efficiency
\r 
 222                 String workflowUrl = "/mso/async/services/CompareModelofE2EServiceInstance";
\r 
 223                 int recipeTimeout = 180;
\r 
 225                 RequestClient requestClient = null;
\r 
 226                 HttpResponse response = null;
\r 
 228                 long subStartTime = System.currentTimeMillis();
\r 
 231                         requestClient = RequestClientFactory.getRequestClient(workflowUrl, MsoPropertiesUtils.loadMsoProperties());
\r 
 233                         JSONObject jjo = new JSONObject(requestJSON);
\r 
 234                         String bpmnRequest = jjo.toString();
\r 
 236                         // Capture audit event
\r 
 237                         msoLogger.debug("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl());
\r 
 238                         String serviceId = instanceIdMap.get("serviceId");
\r 
 239                         String serviceType = e2eCompareModelReq.getServiceType();
\r 
 240                         response = requestClient.post(requestId, false, recipeTimeout, action.name(), serviceId, null, null, null,
\r 
 241                                         null, null, serviceType, null, null, null, bpmnRequest, null);
\r 
 243                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
\r 
 244                                         "Successfully received response from BPMN engine", "BPMN", workflowUrl, null);
\r 
 245                 } catch (Exception e) {
\r 
 246                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR,
\r 
 247                                         MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN",
\r 
 248                                         workflowUrl, null);
\r 
 249                         Response resp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,
\r 
 250                                         MsoException.ServiceException, "Failed calling bpmn " + e.getMessage(),
\r 
 251                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
\r 
 252                         alarmLogger.sendAlarm("MsoConfigurationError", MsoAlarmLogger.CRITICAL,
\r 
 253                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
\r 
 254                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 255                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
\r 
 256                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,
\r 
 257                                         "Exception while communicate with BPMN engine");
\r 
 258                         msoLogger.debug("End of the transaction, the final response is: " + resp.getEntity().toString());
\r 
 262                 if (response == null) {
\r 
 263                         Response resp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,
\r 
 264                                         MsoException.ServiceException, "bpelResponse is null", ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
\r 
 265                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 266                                         MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
\r 
 267                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError,
\r 
 268                                         "Null response from BPMN");
\r 
 269                         msoLogger.debug(END_OF_THE_TRANSACTION + resp.getEntity().toString());
\r 
 273                 ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());
\r 
 274                 int bpelStatus = respHandler.getStatus();
\r 
 275                 // String responseBody = respHandler.getResponseBody();
\r 
 276                 // CompareModelsResult modelDiffResponse = new CompareModelsResult();
\r 
 278                 return beplStatusUpdate(requestId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action,
\r 
 282         private Response getE2EServiceInstances(String serviceId, String operationId) {
\r 
 283                 RequestsDatabase requestsDB = RequestsDatabase.getInstance();
\r 
 285                 GetE2EServiceInstanceResponse e2eServiceResponse = new GetE2EServiceInstanceResponse();
\r 
 287                 MsoRequest msoRequest = new MsoRequest(serviceId);
\r 
 289                 long startTime = System.currentTimeMillis();
\r 
 291                 OperationStatus operationStatus = null;
\r 
 294                         operationStatus = requestsDB.getOperationStatus(serviceId,
\r 
 297                 } catch (Exception e) {
\r 
 299                                         .error(MessageEnum.APIH_DB_ACCESS_EXC,
\r 
 300                                                         MSO_PROP_APIHANDLER_INFRA,
\r 
 303                                                         MsoLogger.ErrorCode.AvailabilityError,
\r 
 304                                                         "Exception while communciate with Request DB - Infra Request Lookup",
\r 
 307                                         .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
\r 
 308                         Response response = msoRequest.buildServiceErrorResponse(
\r 
 309                                         HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,
\r 
 311                                         ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB, null);
\r 
 312                         alarmLogger.sendAlarm("MsoDatabaseAccessError",
\r 
 313                                         MsoAlarmLogger.CRITICAL, Messages.errors
\r 
 314                                                         .get(ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB));
\r 
 315                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
\r 
 316                                         MsoLogger.ResponseCode.DBAccessError,
\r 
 317                                         "Exception while communciate with Request DB");
\r 
 318                         msoLogger.debug("End of the transaction, the final response is: "
\r 
 319                                         + (String) response.getEntity());
\r 
 324                 if (operationStatus == null) {
\r 
 325                         Response resp = msoRequest.buildServiceErrorResponse(
\r 
 326                                         HttpStatus.SC_NO_CONTENT, MsoException.ServiceException,
\r 
 327                                         "E2E serviceId " + serviceId + " is not found in DB",
\r 
 328                                         ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);
\r 
 329                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR,
\r 
 330                                         MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 331                                         MsoLogger.ErrorCode.BusinessProcesssError,
\r 
 332                                         "Null response from RequestDB when searching by serviceId");
\r 
 333                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
\r 
 334                                         MsoLogger.ResponseCode.DataNotFound,
\r 
 335                                         "Null response from RequestDB when searching by serviceId");
\r 
 336                         msoLogger.debug("End of the transaction, the final response is: "
\r 
 337                                         + (String) resp.getEntity());
\r 
 342                 e2eServiceResponse.setOperationStatus(operationStatus);
\r 
 344                 return Response.status(200).entity(e2eServiceResponse).build();
\r 
 347         private Response deleteE2EserviceInstances(String requestJSON,
\r 
 348                         Action action, HashMap<String, String> instanceIdMap, String version) {
\r 
 349                 // TODO should be a new one or the same service instance Id
\r 
 350                 String requestId = instanceIdMap.get("serviceId");
\r 
 351                 long startTime = System.currentTimeMillis();
\r 
 352                 msoLogger.debug("requestId is: " + requestId);
\r 
 353                 E2EServiceInstanceDeleteRequest e2eDelReq = null;
\r 
 355                 MsoRequest msoRequest = new MsoRequest(requestId);
\r 
 357                 ObjectMapper mapper = new ObjectMapper();
\r 
 359                         e2eDelReq = mapper.readValue(requestJSON,
\r 
 360                                         E2EServiceInstanceDeleteRequest.class);
\r 
 362                 } catch (Exception e) {
\r 
 364                         msoLogger.debug("Mapping of request to JSON object failed : ", e);
\r 
 365                         Response response = msoRequest.buildServiceErrorResponse(
\r 
 366                                         HttpStatus.SC_BAD_REQUEST,
\r 
 367                                         MsoException.ServiceException,
\r 
 368                                         "Mapping of request to JSON object failed.  "
\r 
 369                                                         + e.getMessage(), ErrorNumbers.SVC_BAD_PARAMETER,
\r 
 371                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR,
\r 
 372                                         MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 373                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);
\r 
 374                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
\r 
 375                                         MsoLogger.ResponseCode.SchemaError,
\r 
 376                                         "Mapping of request to JSON object failed");
\r 
 377                         msoLogger.debug("End of the transaction, the final response is: "
\r 
 378                                         + (String) response.getEntity());
\r 
 379                         createOperationStatusRecordForError(action, requestId);
\r 
 383                 CatalogDatabase db = null;
\r 
 384                 RecipeLookupResult recipeLookupResult = null;
\r 
 386                         db = CatalogDatabase.getInstance();
\r 
 387                         //TODO  Get the service template model version uuid from AAI.
\r 
 388                         recipeLookupResult = getServiceInstanceOrchestrationURI(db, null, action);
\r 
 389                 } catch (Exception e) {
\r 
 390                         msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC,
\r 
 391                                         MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 392                                         MsoLogger.ErrorCode.AvailabilityError,
\r 
 393                                         "Exception while communciate with Catalog DB", e);
\r 
 395                                         .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
\r 
 396                         Response response = msoRequest.buildServiceErrorResponse(
\r 
 397                                         HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,
\r 
 398                                         "No communication to catalog DB " + e.getMessage(),
\r 
 399                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
\r 
 400                         alarmLogger.sendAlarm("MsoDatabaseAccessError",
\r 
 401                                         MsoAlarmLogger.CRITICAL, Messages.errors
\r 
 402                                                         .get(ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
\r 
 403                         msoRequest.createRequestRecord(Status.FAILED, action);
\r 
 404                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
\r 
 405                                         MsoLogger.ResponseCode.DBAccessError,
\r 
 406                                         "Exception while communciate with DB");
\r 
 407                         msoLogger.debug(END_OF_THE_TRANSACTION
\r 
 408                                         + (String) response.getEntity());
\r 
 411                         closeCatalogDB(db);
\r 
 413                 if (recipeLookupResult == null) {
\r 
 414                         msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND,
\r 
 415                                         MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 416                                         MsoLogger.ErrorCode.DataError, "No recipe found in DB");
\r 
 418                                         .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
\r 
 419                         Response response = msoRequest.buildServiceErrorResponse(
\r 
 420                                         HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,
\r 
 421                                         "Recipe does not exist in catalog DB",
\r 
 422                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);
\r 
 423                         msoRequest.createRequestRecord(Status.FAILED, action);
\r 
 424                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
\r 
 425                                         MsoLogger.ResponseCode.DataNotFound,
\r 
 426                                         "No recipe found in DB");
\r 
 427                         msoLogger.debug(END_OF_THE_TRANSACTION
\r 
 428                                         + (String) response.getEntity());
\r 
 429                         createOperationStatusRecordForError(action, requestId);
\r 
 433                 RequestClient requestClient = null;
\r 
 434                 HttpResponse response = null;
\r 
 436                 long subStartTime = System.currentTimeMillis();
\r 
 437                 // String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);
\r 
 440                         requestClient = RequestClientFactory.getRequestClient(
\r 
 441                                         recipeLookupResult.getOrchestrationURI(),
\r 
 442                                         MsoPropertiesUtils.loadMsoProperties());
\r 
 444                         JSONObject jjo = new JSONObject(requestJSON);
\r 
 445                         jjo.put("operationId", UUIDChecker.generateUUID(msoLogger));
\r 
 447                         String bpmnRequest = jjo.toString();
\r 
 449                         // Capture audit event
\r 
 451                                         .debug("MSO API Handler Posting call to BPEL engine for url: "
\r 
 452                                                         + requestClient.getUrl());
\r 
 453                         String serviceId = instanceIdMap.get("serviceId");
\r 
 454                         String serviceInstanceType = e2eDelReq.getServiceType();
\r 
 455                         response = requestClient.post(requestId, false,
\r 
 456                                         recipeLookupResult.getRecipeTimeout(), action.name(),
\r 
 457                                         serviceId, null, null, null, null, null, serviceInstanceType,
\r 
 458                                         null, null, null, bpmnRequest, recipeLookupResult.getRecipeParamXsd());
\r 
 460                         msoLogger.recordMetricEvent(subStartTime,
\r 
 461                                         MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
\r 
 462                                         "Successfully received response from BPMN engine", "BPMN",
\r 
 463                                         recipeLookupResult.getOrchestrationURI(), null);
\r 
 464                 } catch (Exception e) {
\r 
 465                         msoLogger.recordMetricEvent(subStartTime,
\r 
 466                                         MsoLogger.StatusCode.ERROR,
\r 
 467                                         MsoLogger.ResponseCode.CommunicationError,
\r 
 468                                         "Exception while communicate with BPMN engine", "BPMN",
\r 
 469                                         recipeLookupResult.getOrchestrationURI(), null);
\r 
 470                         Response resp = msoRequest.buildServiceErrorResponse(
\r 
 471                                         HttpStatus.SC_BAD_GATEWAY, MsoException.ServiceException,
\r 
 472                                         "Failed calling bpmn " + e.getMessage(),
\r 
 473                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
\r 
 474                         alarmLogger.sendAlarm("MsoConfigurationError",
\r 
 475                                         MsoAlarmLogger.CRITICAL,
\r 
 476                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
\r 
 477                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR,
\r 
 478                                         MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 479                                         MsoLogger.ErrorCode.AvailabilityError,
\r 
 480                                         "Exception while communicate with BPMN engine");
\r 
 481                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
\r 
 482                                         MsoLogger.ResponseCode.CommunicationError,
\r 
 483                                         "Exception while communicate with BPMN engine");
\r 
 484                         msoLogger.debug("End of the transaction, the final response is: "
\r 
 485                                         + (String) resp.getEntity());
\r 
 486                         createOperationStatusRecordForError(action, requestId);
\r 
 490                 if (response == null) {
\r 
 491                         Response resp = msoRequest.buildServiceErrorResponse(
\r 
 492                                         HttpStatus.SC_BAD_GATEWAY, MsoException.ServiceException,
\r 
 493                                         "bpelResponse is null",
\r 
 494                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
\r 
 495                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR,
\r 
 496                                         MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 497                                         MsoLogger.ErrorCode.BusinessProcesssError,
\r 
 498                                         "Null response from BPEL");
\r 
 499                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,
\r 
 500                                         MsoLogger.ResponseCode.InternalError,
\r 
 501                                         "Null response from BPMN");
\r 
 502                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) resp.getEntity());
\r 
 503                         createOperationStatusRecordForError(action, requestId);
\r 
 507                 ResponseHandler respHandler = new ResponseHandler(response,
\r 
 508                                 requestClient.getType());
\r 
 509                 int bpelStatus = respHandler.getStatus();
\r 
 511                 return beplStatusUpdate(requestId, startTime, msoRequest,
\r 
 512                                 requestClient, respHandler, bpelStatus, action, instanceIdMap);
\r 
 515         private Response updateE2EserviceInstances(String requestJSON, Action action,
\r 
 516                         HashMap<String, String> instanceIdMap, String version) {
\r 
 518                 String requestId = instanceIdMap.get("serviceId");
\r 
 519                 long startTime = System.currentTimeMillis();
\r 
 520                 msoLogger.debug("requestId is: " + requestId);
\r 
 521                 E2EServiceInstanceRequest e2eSir = null;
\r 
 523                 MsoRequest msoRequest = new MsoRequest(requestId);
\r 
 524                 ObjectMapper mapper = new ObjectMapper();
\r 
 526                         e2eSir = mapper.readValue(requestJSON, E2EServiceInstanceRequest.class);
\r 
 528                 } catch (Exception e) {
\r 
 530           this.createOperationStatusRecordForError(action, requestId);
\r 
 532                         msoLogger.debug("Mapping of request to JSON object failed : ", e);
\r 
 533                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,
\r 
 534                                         MsoException.ServiceException, "Mapping of request to JSON object failed.  " + e.getMessage(),
\r 
 535                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
\r 
 536                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 537                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);
\r 
 538                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,
\r 
 539                                         "Mapping of request to JSON object failed");
\r 
 540                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
\r 
 544                 mapReqJsonToSvcInstReq(e2eSir, requestJSON);
\r 
 545                 sir.getRequestDetails().getRequestParameters().setaLaCarte(true);
\r 
 547                         msoRequest.parse(sir, instanceIdMap, action, version, requestJSON);
\r 
 548                 } catch (Exception e) {
\r 
 549                         msoLogger.debug("Validation failed: ", e);
\r 
 550                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,
\r 
 551                                         MsoException.ServiceException, "Error parsing request.  " + e.getMessage(),
\r 
 552                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
\r 
 553                         if (msoRequest.getRequestId() != null) {
\r 
 554                                 msoLogger.debug("Logging failed message to the database");
\r 
 555                                 this.createOperationStatusRecordForError(action, requestId);
\r 
 557                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 558                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);
\r 
 559                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,
\r 
 560                                         "Validation of the input request failed");
\r 
 561                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
\r 
 565                 //check for the current operation status
\r 
 566                 Response resp = checkE2ESvcInstStatus(action, requestId, startTime, msoRequest);
\r 
 567                 if(resp != null && resp.getStatus() != 200) {
\r 
 571                 CatalogDatabase db = null;
\r 
 572                 RecipeLookupResult recipeLookupResult = null;
\r 
 574                         db = CatalogDatabase.getInstance();
\r 
 575                         recipeLookupResult = getServiceInstanceOrchestrationURI(db, e2eSir.getService().getServiceUuid(), action);
\r 
 576                 } catch (Exception e) {
\r 
 577                         msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 578                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
\r 
 579                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
\r 
 580                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,
\r 
 581                                         MsoException.ServiceException, "No communication to catalog DB " + e.getMessage(),
\r 
 582                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
\r 
 583                         alarmLogger.sendAlarm("MsoDatabaseAccessError", MsoAlarmLogger.CRITICAL,
\r 
 584                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
\r 
 586                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,
\r 
 587                                         "Exception while communciate with DB");
\r 
 588                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());
\r 
 589                         createOperationStatusRecordForError(action, requestId);
\r 
 592                         closeCatalogDB(db);
\r 
 595                 if (recipeLookupResult == null) {
\r 
 596                         msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 597                                         MsoLogger.ErrorCode.DataError, "No recipe found in DB");
\r 
 598                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
\r 
 599                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,
\r 
 600                                         MsoException.ServiceException, "Recipe does not exist in catalog DB",
\r 
 601                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);
\r 
 603                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound,
\r 
 604                                         "No recipe found in DB");
\r 
 605                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());
\r 
 606                         createOperationStatusRecordForError(action, requestId);
\r 
 610                 String serviceInstanceType = e2eSir.getService().getServiceType();
\r 
 612                 String serviceId = "";
\r 
 613                 RequestClient requestClient = null;
\r 
 614                 HttpResponse response = null;
\r 
 616                 long subStartTime = System.currentTimeMillis();
\r 
 617                 String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);
\r 
 620                         requestClient = RequestClientFactory.getRequestClient(recipeLookupResult.getOrchestrationURI(),
\r 
 621                                         MsoPropertiesUtils.loadMsoProperties());
\r 
 623                         // Capture audit event
\r 
 624                         msoLogger.debug("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl());
\r 
 626                         response = requestClient.post(requestId, false, recipeLookupResult.getRecipeTimeout(), action.name(),
\r 
 627                                         serviceId, null, null, null, null, null, serviceInstanceType, null, null, null, sirRequestJson,
\r 
 628                                         recipeLookupResult.getRecipeParamXsd());
\r 
 630                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
\r 
 631                                         "Successfully received response from BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI(),
\r 
 633                 } catch (Exception e) {
\r 
 634                         msoLogger.debug("Exception while communicate with BPMN engine", e);
\r 
 635                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR,
\r 
 636                                         MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN",
\r 
 637                                         recipeLookupResult.getOrchestrationURI(), null);
\r 
 638                         Response getBPMNResp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,
\r 
 639                                         MsoException.ServiceException, "Failed calling bpmn " + e.getMessage(),
\r 
 640                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
\r 
 641                         alarmLogger.sendAlarm("MsoConfigurationError", MsoAlarmLogger.CRITICAL,
\r 
 642                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
\r 
 643                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 644                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
\r 
 645                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,
\r 
 646                                         "Exception while communicate with BPMN engine");
\r 
 647                         msoLogger.debug("End of the transaction, the final response is: " + (String) getBPMNResp.getEntity());
\r 
 648                         createOperationStatusRecordForError(action, requestId);
\r 
 649                         return getBPMNResp;
\r 
 652                 if (response == null) {
\r 
 653                         Response getBPMNResp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,
\r 
 654                                         MsoException.ServiceException, "bpelResponse is null", ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
\r 
 655                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 656                                         MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
\r 
 657                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError,
\r 
 658                                         "Null response from BPMN");
\r 
 659                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) getBPMNResp.getEntity());
\r 
 660                         return getBPMNResp;
\r 
 663                 ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());
\r 
 664                 int bpelStatus = respHandler.getStatus();
\r 
 666                 return beplStatusUpdate(requestId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action, instanceIdMap);
\r 
 669         private Response checkE2ESvcInstStatus(Action action, String requestId, long startTime, MsoRequest msoRequest) {
\r 
 670                 OperationStatus curStatus = null;
\r 
 671 //              String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
\r 
 672                 String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
\r 
 674                         if (!(requestId == null && "service".equals(requestScope) && (action == Action.updateInstance))) {                          
\r 
 675                                 curStatus = chkSvcInstOperStatusbySvcId(requestId);
\r 
 677                 } catch (Exception e) {
\r 
 678                         msoLogger.error(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 679                                         MsoLogger.ErrorCode.DataError, "Error during current operation status check ", e);
\r 
 681                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
\r 
 682                                         MsoException.ServiceException, e.getMessage(), ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);
\r 
 684                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,
\r 
 685                                         "Error during current operation status check");
\r 
 686                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
\r 
 690                 if (curStatus != null && !curStatus.getProgress().equals("100")) {
\r 
 691                         String chkMessage = "Error: Locked instance - This " + requestScope + " (" + requestId + ") "
\r 
 692                                         + "now being worked with a status of " + curStatus.getProgress() + " (ServiceName - "
\r 
 693                                         + curStatus.getServiceName()
\r 
 694                                         + "). The existing request must finish or be cleaned up before proceeding.";
\r 
 696                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT,
\r 
 697                                         MsoException.ServiceException, chkMessage, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);
\r 
 699                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict,
\r 
 702                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
\r 
 704                         createOperationStatusRecordForError(action, requestId);
\r 
 709                 return Response.status(200).entity(null).build();
\r 
 712         private Response processE2EserviceInstances(String requestJSON, Action action,
\r 
 713                         HashMap<String, String> instanceIdMap, String version) {
\r 
 715                 String requestId = UUIDChecker.generateUUID(msoLogger);
\r 
 716                 long startTime = System.currentTimeMillis();
\r 
 717                 msoLogger.debug("requestId is: " + requestId);
\r 
 718                 E2EServiceInstanceRequest e2eSir = null;
\r 
 720                 MsoRequest msoRequest = new MsoRequest(requestId);
\r 
 721                 ObjectMapper mapper = new ObjectMapper();
\r 
 723                         e2eSir = mapper.readValue(requestJSON, E2EServiceInstanceRequest.class);
\r 
 725                 } catch (Exception e) {
\r 
 726           //TODO update the service name
\r 
 727           this.createOperationStatusRecordForError(action, requestId);
\r 
 729                         msoLogger.debug("Mapping of request to JSON object failed : ", e);
\r 
 730                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,
\r 
 731                                         MsoException.ServiceException, "Mapping of request to JSON object failed.  " + e.getMessage(),
\r 
 732                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
\r 
 733                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 734                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);
\r 
 735                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,
\r 
 736                                         "Mapping of request to JSON object failed");
\r 
 737                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
\r 
 741                 mapReqJsonToSvcInstReq(e2eSir, requestJSON);
\r 
 742                 sir.getRequestDetails().getRequestParameters().setaLaCarte(true);
\r 
 744                         msoRequest.parse(sir, instanceIdMap, action, version, requestJSON);
\r 
 745                 } catch (Exception e) {
\r 
 746                         msoLogger.debug("Validation failed: ", e);
\r 
 747                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,
\r 
 748                                         MsoException.ServiceException, "Error parsing request.  " + e.getMessage(),
\r 
 749                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
\r 
 750                         if (msoRequest.getRequestId() != null) {
\r 
 751                                 msoLogger.debug("Logging failed message to the database");
\r 
 752                                 //TODO update the service name
\r 
 753                           this.createOperationStatusRecordForError(action, requestId);
\r 
 755                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 756                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);
\r 
 757                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,
\r 
 758                                         "Validation of the input request failed");
\r 
 759                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
\r 
 763                 OperationStatus dup = null;
\r 
 764                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
\r 
 765                 String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
\r 
 767                         if (!(instanceName == null && "service".equals(requestScope)
\r 
 768                                         && (action == Action.createInstance || action == Action.activateInstance))) {
\r 
 769                           //TODO : Need to check for the duplicate record from the operation status,
\r 
 770                           //TODO : commenting this check for unblocking current testing for now...  induces dead code...
\r 
 771                                 dup = chkDuplicateServiceNameInOperStatus( instanceName);
\r 
 773                 } catch (Exception e) {
\r 
 774                         msoLogger.error(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 775                                         MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
\r 
 777                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
\r 
 778                                         MsoException.ServiceException, e.getMessage(), ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);
\r 
 780                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,
\r 
 781                                         "Error during duplicate check");
\r 
 782                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
\r 
 787                         // Found the duplicate record. Return the appropriate error.
\r 
 788                         String instance = null;
\r 
 789                         if (instanceName != null) {
\r 
 790                                 instance = instanceName;
\r 
 792                                 instance = instanceIdMap.get(requestScope + "InstanceId");
\r 
 794                         String dupMessage = "Error: Locked instance - This " + requestScope + " (" + instance + ") "
\r 
 795                                         + "already has a request being worked with a status of " + dup.getProgress() + " (ServiceId - "
\r 
 796                                         + dup.getServiceId() + "). The existing request must finish or be cleaned up before proceeding.";
\r 
 798                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT,
\r 
 799                                         MsoException.ServiceException, dupMessage, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);
\r 
 801                         msoLogger.warn(MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError,
\r 
 802                                         "Duplicate request - Subscriber already has a request for this service");
\r 
 805                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict,
\r 
 807                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
\r 
 808                         createOperationStatusRecordForError(action, requestId);
\r 
 812                 CatalogDatabase db = null;
\r 
 813                 RecipeLookupResult recipeLookupResult = null;
\r 
 815                         db = CatalogDatabase.getInstance();
\r 
 816                         recipeLookupResult = getServiceInstanceOrchestrationURI(db, e2eSir.getService().getServiceUuid(), action);
\r 
 817                 } catch (Exception e) {
\r 
 818                         msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 819                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
\r 
 820                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
\r 
 821                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,
\r 
 822                                         MsoException.ServiceException, "No communication to catalog DB " + e.getMessage(),
\r 
 823                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
\r 
 824                         alarmLogger.sendAlarm("MsoDatabaseAccessError", MsoAlarmLogger.CRITICAL,
\r 
 825                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
\r 
 827                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,
\r 
 828                                         "Exception while communciate with DB");
\r 
 829                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());
\r 
 830                         createOperationStatusRecordForError(action, requestId);
\r 
 833                         closeCatalogDB(db);
\r 
 836                 if (recipeLookupResult == null) {
\r 
 837                         msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 838                                         MsoLogger.ErrorCode.DataError, "No recipe found in DB");
\r 
 839                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
\r 
 840                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,
\r 
 841                                         MsoException.ServiceException, "Recipe does not exist in catalog DB",
\r 
 842                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);
\r 
 844                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound,
\r 
 845                                         "No recipe found in DB");
\r 
 846                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());
\r 
 847                         createOperationStatusRecordForError(action, requestId);
\r 
 851 //                      msoRequest.createRequestRecord(Status.PENDING, action);
\r 
 852 //                      //createOperationStatusRecord(action, requestId);
\r 
 853 //              } catch (Exception e) {
\r 
 854 //                      msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "",
\r 
 855 //                                      MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
\r 
 856 //                      msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
\r 
 857 //                      Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
\r 
 858 //                                      MsoException.ServiceException, "Exception while creating record in DB " + e.getMessage(),
\r 
 859 //                                      ErrorNumbers.SVC_BAD_PARAMETER, null);
\r 
 860 //                      msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,
\r 
 861 //                                      "Exception while creating record in DB");
\r 
 862 //                      msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());
\r 
 863 //                      return response;
\r 
 866                 String serviceInstanceType = e2eSir.getService().getServiceType();
\r 
 868                 String serviceId = "";
\r 
 869                 RequestClient requestClient = null;
\r 
 870                 HttpResponse response = null;
\r 
 872                 long subStartTime = System.currentTimeMillis();
\r 
 873                 String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);
\r 
 876                         requestClient = RequestClientFactory.getRequestClient(recipeLookupResult.getOrchestrationURI(),
\r 
 877                                         MsoPropertiesUtils.loadMsoProperties());
\r 
 879                         // Capture audit event
\r 
 880                         msoLogger.debug("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl());
\r 
 882                         response = requestClient.post(requestId, false, recipeLookupResult.getRecipeTimeout(), action.name(),
\r 
 883                                         serviceId, null, null, null, null, null, serviceInstanceType, null, null, null, sirRequestJson,
\r 
 884                                         recipeLookupResult.getRecipeParamXsd());
\r 
 886                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
\r 
 887                                         "Successfully received response from BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI(),
\r 
 889                 } catch (Exception e) {
\r 
 890                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR,
\r 
 891                                         MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN",
\r 
 892                                         recipeLookupResult.getOrchestrationURI(), null);
\r 
 893                         Response resp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,
\r 
 894                                         MsoException.ServiceException, "Failed calling bpmn " + e.getMessage(),
\r 
 895                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
\r 
 896                         alarmLogger.sendAlarm("MsoConfigurationError", MsoAlarmLogger.CRITICAL,
\r 
 897                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
\r 
 898                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 899                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
\r 
 900                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,
\r 
 901                                         "Exception while communicate with BPMN engine");
\r 
 902                         msoLogger.debug("End of the transaction, the final response is: " + (String) resp.getEntity());
\r 
 903                         createOperationStatusRecordForError(action, requestId);
\r 
 907                 if (response == null) {
\r 
 908                         Response resp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,
\r 
 909                                         MsoException.ServiceException, "bpelResponse is null", ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);
\r 
 910                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",
\r 
 911                                         MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
\r 
 912                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError,
\r 
 913                                         "Null response from BPMN");
\r 
 914                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) resp.getEntity());
\r 
 918                 ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());
\r 
 919                 int bpelStatus = respHandler.getStatus();
\r 
 921                 return beplStatusUpdate(requestId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action, instanceIdMap);
\r 
 924         private void closeCatalogDB(CatalogDatabase db) {
\r 
 930         private Response beplStatusUpdate(String requestId, long startTime,
\r 
 931                         MsoRequest msoRequest, RequestClient requestClient,
\r 
 932                         ResponseHandler respHandler, int bpelStatus, Action action,
\r 
 933                         HashMap<String, String> instanceIdMap) {
\r 
 934                 // BPMN accepted the request, the request is in progress
\r 
 935                 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
\r 
 936                         String camundaJSONResponseBody = respHandler.getResponseBody();
\r 
 937                         msoLogger.debug("Received from Camunda: " + camundaJSONResponseBody);
\r 
 939                         // currently only for delete case we update the status here
\r 
 940                         if (action == Action.deleteInstance) {
\r 
 941                                 ObjectMapper mapper = new ObjectMapper();
\r 
 943                                         DelE2ESvcResp jo = mapper.readValue(
\r 
 944                                                         camundaJSONResponseBody, DelE2ESvcResp.class);
\r 
 945                                         String operationId = jo.getOperationId();
\r 
 946                                 this.createOperationStatusRecord("DELETE", requestId,
\r 
 948                                 } catch (Exception ex) {
\r 
 949                                         msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,
\r 
 950                                                         requestClient.getUrl(), "", "",
\r 
 951                                                         MsoLogger.ErrorCode.BusinessProcesssError,
\r 
 952                                                         "Response from BPEL engine is failed with HTTP Status="
\r 
 957                         msoLogger.recordAuditEvent(startTime,
\r 
 958                                         MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,
\r 
 959                                         "BPMN accepted the request, the request is in progress");
\r 
 960                         msoLogger.debug(END_OF_THE_TRANSACTION + camundaJSONResponseBody);
\r 
 961                         return Response.status(HttpStatus.SC_ACCEPTED)
\r 
 962                                         .entity(camundaJSONResponseBody).build();
\r 
 964                         List<String> variables = new ArrayList<>();
\r 
 965                         variables.add(bpelStatus + "");
\r 
 966                         String camundaJSONResponseBody = respHandler.getResponseBody();
\r 
 967                         if (camundaJSONResponseBody != null
\r 
 968                                         && !camundaJSONResponseBody.isEmpty()) {
\r 
 969                                 Response resp = msoRequest.buildServiceErrorResponse(
\r 
 970                                                 bpelStatus, MsoException.ServiceException,
\r 
 971                                                 "Request Failed due to BPEL error with HTTP Status= %1 "
\r 
 972                                                                 + '\n' + camundaJSONResponseBody,
\r 
 973                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, variables);
\r 
 974                                 msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,
\r 
 975                                                 requestClient.getUrl(), "", "",
\r 
 976                                                 MsoLogger.ErrorCode.BusinessProcesssError,
\r 
 977                                                 "Response from BPEL engine is failed with HTTP Status="
\r 
 979                                 msoLogger.recordAuditEvent(startTime,
\r 
 980                                                 MsoLogger.StatusCode.ERROR,
\r 
 981                                                 MsoLogger.ResponseCode.InternalError,
\r 
 982                                                 "Response from BPMN engine is failed");
\r 
 983                                 msoLogger.debug(END_OF_THE_TRANSACTION
\r 
 984                                                 + (String) resp.getEntity());
\r 
 987                                 Response resp = msoRequest
\r 
 988                                                 .buildServiceErrorResponse(
\r 
 990                                                                 MsoException.ServiceException,
\r 
 991                                                                 "Request Failed due to BPEL error with HTTP Status= %1",
\r 
 992                                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
\r 
 994                                 msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,
\r 
 995                                                 requestClient.getUrl(), "", "",
\r 
 996                                                 MsoLogger.ErrorCode.BusinessProcesssError,
\r 
 997                                                 "Response from BPEL engine is empty");
\r 
 998                                 msoLogger.recordAuditEvent(startTime,
\r 
 999                                                 MsoLogger.StatusCode.ERROR,
\r 
1000                                                 MsoLogger.ResponseCode.InternalError,
\r 
1001                                                 "Response from BPEL engine is empty");
\r 
1002                                 msoLogger.debug(END_OF_THE_TRANSACTION
\r 
1003                                                 + (String) resp.getEntity());
\r 
1010          * Getting recipes from catalogDb
\r 
1012          * @param db the catalog db
\r 
1013          * @param serviceModelUUID the service model version uuid
\r 
1014          * @param action the action for the service
\r 
1015          * @return the service recipe result
\r 
1017         private RecipeLookupResult getServiceInstanceOrchestrationURI(
\r 
1018                         CatalogDatabase db, String serviceModelUUID, Action action) {
\r 
1020                 RecipeLookupResult recipeLookupResult = getServiceURI(db, serviceModelUUID, action);
\r 
1022                 if (recipeLookupResult != null) {
\r 
1023                         msoLogger.debug("Orchestration URI is: "
\r 
1024                                         + recipeLookupResult.getOrchestrationURI()
\r 
1025                                         + ", recipe Timeout is: "
\r 
1026                                         + Integer.toString(recipeLookupResult.getRecipeTimeout()));
\r 
1028                         msoLogger.debug("No matching recipe record found");
\r 
1030                 return recipeLookupResult;
\r 
1034          * Getting recipes from catalogDb
\r 
1035          * If Service recipe is not set, use default recipe, if set , use special recipe.
\r 
1036          * @param db the catalog db
\r 
1037          * @param serviceModelUUID the service version uuid
\r 
1038          * @param action the action of the service.
\r 
1039          * @return the service recipe result.
\r 
1041         private RecipeLookupResult getServiceURI(CatalogDatabase db, String serviceModelUUID, Action action) {
\r 
1043                 String defaultServiceModelName = "UUI_DEFAULT";
\r 
1045                 Service defaultServiceRecord = db
\r 
1046                                 .getServiceByModelName(defaultServiceModelName);
\r 
1047                 ServiceRecipe defaultRecipe = db.getServiceRecipeByModelUUID(
\r 
1048                         defaultServiceRecord.getModelUUID(), action.name());
\r 
1049                 //set recipe as default generic recipe
\r 
1050                 ServiceRecipe recipe = defaultRecipe;
\r 
1051                 //check the service special recipe 
\r 
1052                 if(null != serviceModelUUID && ! serviceModelUUID.isEmpty()){
\r 
1053                       ServiceRecipe serviceSpecialRecipe = db.getServiceRecipeByModelUUID(
\r 
1054                               serviceModelUUID, action.name());
\r 
1055                       if(null != serviceSpecialRecipe){
\r 
1056                           //set service special recipe.
\r 
1057                           recipe = serviceSpecialRecipe;
\r 
1061                 if (recipe == null) {
\r 
1064                 return new RecipeLookupResult(recipe.getOrchestrationUri(),
\r 
1065                                 recipe.getRecipeTimeout(), recipe.getServiceParamXSD());
\r 
1070          * Converting E2EServiceInstanceRequest to ServiceInstanceRequest and
\r 
1071          * passing it to camunda engine.
\r 
1076         private String mapReqJsonToSvcInstReq(E2EServiceInstanceRequest e2eSir,
\r 
1077                         String requestJSON) {
\r 
1079                 sir = new ServiceInstancesRequest();
\r 
1081                 String returnString = null;
\r 
1082                 RequestDetails requestDetails = new RequestDetails();
\r 
1083                 ModelInfo modelInfo = new ModelInfo();
\r 
1085                 // ModelInvariantId
\r 
1086                 modelInfo.setModelInvariantId(e2eSir.getService().getServiceInvariantUuid());
\r 
1088                 // modelNameVersionId
\r 
1089                 modelInfo.setModelNameVersionId(e2eSir.getService().getServiceUuid());
\r 
1091                 // String modelInfoValue =
\r 
1092                 // e2eSir.getService().getParameters().getNodeTemplateName();
\r 
1093                 // String[] arrayOfInfo = modelInfoValue.split(":");
\r 
1094                 // String modelName = arrayOfInfo[0];
\r 
1095                 // String modelVersion = arrayOfInfo[1];
\r 
1097                 // TODO: To ensure, if we dont get the values from the UUI
\r 
1098                 String modelName = "voLTE";
\r 
1099                 String modelVersion = "1.0";
\r 
1101                 modelInfo.setModelName(modelName);
\r 
1104                 modelInfo.setModelVersion(modelVersion);
\r 
1107                 modelInfo.setModelType(ModelType.service);
\r 
1109                 // setting modelInfo to requestDetails
\r 
1110                 requestDetails.setModelInfo(modelInfo);
\r 
1112                 SubscriberInfo subscriberInfo = new SubscriberInfo();
\r 
1114                 // globalsubscriberId
\r 
1115                 subscriberInfo.setGlobalSubscriberId(e2eSir.getService().getGlobalSubscriberId());
\r 
1117                 // setting subscriberInfo to requestDetails
\r 
1118                 requestDetails.setSubscriberInfo(subscriberInfo);
\r 
1120                 RequestInfo requestInfo = new RequestInfo();
\r 
1123                 requestInfo.setInstanceName(e2eSir.getService().getName());
\r 
1126                 requestInfo.setSource("UUI");
\r 
1128                 // suppressRollback
\r 
1129                 requestInfo.setSuppressRollback(true);
\r 
1131                 // setting requestInfo to requestDetails
\r 
1132                 requestDetails.setRequestInfo(requestInfo);
\r 
1134                 RequestParameters requestParameters = new RequestParameters();
\r 
1136                 // subscriptionServiceType
\r 
1137                 requestParameters.setSubscriptionServiceType("MOG");
\r 
1140                 List<E2EUserParam> userParams;
\r 
1142                 // e2eSir.getService().getParameters().getRequestParameters().getUserParams();
\r 
1143                 List<Map<String, Object>> userParamList = new ArrayList<>();
\r 
1144                 Map<String, Object> userParamMap = new HashMap<>();
\r 
1145                 // complete json request updated in the camunda
\r 
1146                 userParamMap.put("UUIRequest", requestJSON);
\r 
1147                 userParamMap.put("ServiceInstanceName", e2eSir.getService().getName());
\r 
1149                 // Map<String, String> userParamMap3 = null;
\r 
1150                 // for (E2EUserParam userp : userParams) {
\r 
1151                 // userParamMap.put(userp.getName(), userp.getValue());
\r 
1154                 userParamList.add(userParamMap);
\r 
1155                 requestParameters.setUserParams(userParamList);
\r 
1157                 // setting requestParameters to requestDetails
\r 
1158                 requestDetails.setRequestParameters(requestParameters);
\r 
1160                 sir.setRequestDetails(requestDetails);
\r 
1162                 // converting to string
\r 
1163                 ObjectMapper mapper = new ObjectMapper();
\r 
1165                         returnString = mapper.writeValueAsString(sir);
\r 
1166                 } catch (IOException e) {
\r 
1168                                         .debug("Exception while converting ServiceInstancesRequest object to string",
\r 
1172                 return returnString;
\r 
1175         private void createOperationStatusRecordForError(Action action,
\r 
1176                         String requestId) throws MsoDatabaseException {
\r 
1178                 AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager();
\r 
1180                 Session session = null;
\r 
1183                         session = requestsDbSessionFactoryManager.getSessionFactory()
\r 
1185                         session.beginTransaction();
\r 
1187                         OperationStatus os = new OperationStatus();
\r 
1188                         os.setOperation(action.name());
\r 
1189                         os.setOperationContent("");
\r 
1190                         os.setOperationId("");
\r 
1191                         os.setProgress("100");
\r 
1193                         os.setResult("error");
\r 
1194                         os.setServiceId(requestId);
\r 
1196                         Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());
\r 
1197                         Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());
\r 
1198                         os.setFinishedAt(endTimeStamp);
\r 
1199                         os.setOperateAt(startTimeStamp);
\r 
1202                         session.getTransaction().commit();
\r 
1204                 } catch (Exception e) {
\r 
1205                         msoLogger.error(MessageEnum.APIH_DB_INSERT_EXC, "", "",
\r 
1206                                         MsoLogger.ErrorCode.DataError,
\r 
1207                                         "Exception when creation record request in Operation", e);
\r 
1208                         throw new MsoDatabaseException(
\r 
1209                                         "Data did inserted in Operatus Status Table for failure", e);
\r 
1211                         if (null != session) {
\r 
1217         private void createOperationStatusRecord(String actionNm, String serviceId,
\r 
1218                         String operationId) throws MsoDatabaseException {
\r 
1220                 AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager();
\r 
1222                 Session session = null;
\r 
1225                         session = requestsDbSessionFactoryManager.getSessionFactory()
\r 
1227                         session.beginTransaction();
\r 
1229                         OperationStatus os = new OperationStatus();
\r 
1230                         os.setOperation(actionNm);
\r 
1231                         os.setOperationContent("");
\r 
1232                         os.setOperationId(operationId);
\r 
1233                         os.setProgress("0");
\r 
1235                         os.setResult("processing");
\r 
1236                         os.setServiceId(serviceId);
\r 
1237                         // TODO : to be updated...
\r 
1239                         Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());
\r 
1240                         Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());
\r 
1241                         os.setFinishedAt(endTimeStamp);
\r 
1242                         os.setOperateAt(startTimeStamp);
\r 
1245                         session.getTransaction().commit();
\r 
1247                 } catch (Exception e) {
\r 
1248                         msoLogger.error(MessageEnum.APIH_DB_INSERT_EXC, "", "",
\r 
1249                                         MsoLogger.ErrorCode.DataError,
\r 
1250                                         "Exception when creation record request in Operation", e);
\r 
1251                         throw new MsoDatabaseException(
\r 
1252                                         "Data did inserted in Operatus Status Table", e);
\r 
1254                         if (null != session) {
\r 
1260         private OperationStatus chkSvcInstOperStatusbySvcId(String serviceId) {
\r 
1261                 OperationStatus svcInstanceOperStatus = (RequestsDatabase.getInstance())
\r 
1262                                 .getOperationStatusByServiceId(serviceId);
\r 
1264                 return svcInstanceOperStatus;
\r 
1267         private OperationStatus chkDuplicateServiceNameInOperStatus(
\r 
1268                         String serviceName) {
\r 
1269                 OperationStatus dupServiceName = (RequestsDatabase.getInstance())
\r 
1270                                 .getOperationStatusByServiceName(serviceName);
\r 
1272                 return dupServiceName;
\r