Adding Junit
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / openecomp / mso / apihandlerinfra / E2EServiceInstances.java
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * ONAP - SO\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
10  *\r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  *\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
19  */\r
20 \r
21 package org.openecomp.mso.apihandlerinfra;\r
22 \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
29 \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
40 \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.DelE2ESvcResp;\r
54 import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.E2EServiceInstanceDeleteRequest;\r
55 import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.E2EServiceInstanceRequest;\r
56 import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.E2EUserParam;\r
57 import org.openecomp.mso.apihandlerinfra.e2eserviceinstancebeans.GetE2EServiceInstanceResponse;\r
58 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ModelInfo;\r
59 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestDetails;\r
60 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestInfo;\r
61 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestParameters;\r
62 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesRequest;\r
63 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.SubscriberInfo;\r
64 import org.openecomp.mso.db.AbstractSessionFactoryManager;\r
65 import org.openecomp.mso.db.catalog.CatalogDatabase;\r
66 import org.openecomp.mso.db.catalog.beans.Service;\r
67 import org.openecomp.mso.db.catalog.beans.ServiceRecipe;\r
68 import org.openecomp.mso.logger.MessageEnum;\r
69 import org.openecomp.mso.logger.MsoAlarmLogger;\r
70 import org.openecomp.mso.logger.MsoLogger;\r
71 import org.openecomp.mso.properties.MsoDatabaseException;\r
72 import org.openecomp.mso.requestsdb.OperationStatus;\r
73 import org.openecomp.mso.requestsdb.RequestsDatabase;\r
74 import org.openecomp.mso.requestsdb.RequestsDbSessionFactoryManager;\r
75 import org.openecomp.mso.utils.UUIDChecker;\r
76 \r
77 import com.wordnik.swagger.annotations.Api;\r
78 import com.wordnik.swagger.annotations.ApiOperation;\r
79 \r
80 @Path("/e2eServiceInstances")\r
81 @Api(value = "/e2eServiceInstances", description = "API Requests for E2E Service Instances")\r
82 public class E2EServiceInstances {\r
83 \r
84         private HashMap<String, String> instanceIdMap = new HashMap<>();\r
85         private static MsoLogger msoLogger = MsoLogger\r
86                         .getMsoLogger(MsoLogger.Catalog.APIH);\r
87         private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger();\r
88         public static final String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";\r
89         private ServiceInstancesRequest sir = null;\r
90 \r
91         public static final String END_OF_THE_TRANSACTION = "End of the transaction, the final response is: ";\r
92         public static final String EXCEPTION_CREATING_DB_RECORD = "Exception while creating record in DB";\r
93         public static final String EXCEPTION_COMMUNICATE_BPMN_ENGINE = "Exception while communicate with BPMN engine";\r
94 \r
95         /**\r
96          * POST Requests for E2E Service create Instance on a version provided\r
97          */\r
98 \r
99         @POST\r
100         @Path("/{version:[vV][3-5]}")\r
101         @Consumes(MediaType.APPLICATION_JSON)\r
102         @Produces(MediaType.APPLICATION_JSON)\r
103         @ApiOperation(value = "Create an E2E Service Instance on a version provided", response = Response.class)\r
104         public Response createE2EServiceInstance(String request,\r
105                         @PathParam("version") String version) {\r
106 \r
107                 return processE2EserviceInstances(request, Action.createInstance, null,\r
108                                 version);\r
109         }\r
110         \r
111         /**\r
112          * PUT Requests for E2E Service update Instance on a version provided\r
113          */\r
114 \r
115         @PUT\r
116         @Path("/{version:[vV][3-5]}/{serviceId}")\r
117         @Consumes(MediaType.APPLICATION_JSON)\r
118         @Produces(MediaType.APPLICATION_JSON)\r
119         @ApiOperation(value = "Update an E2E Service Instance on a version provided and serviceId", response = Response.class)\r
120         public Response updateE2EServiceInstance(String request,\r
121                         @PathParam("version") String version,\r
122                         @PathParam("serviceId") String serviceId) {\r
123                 \r
124                 instanceIdMap.put("serviceId", serviceId);\r
125 \r
126                 return updateE2EserviceInstances(request, Action.updateInstance, instanceIdMap,\r
127                                 version);\r
128         }\r
129 \r
130         /**\r
131          * DELETE Requests for E2E Service delete Instance on a specified version\r
132          * and serviceId\r
133          */\r
134 \r
135         @DELETE\r
136         @Path("/{version:[vV][3-5]}/{serviceId}")\r
137         @Consumes(MediaType.APPLICATION_JSON)\r
138         @Produces(MediaType.APPLICATION_JSON)\r
139         @ApiOperation(value = "Delete E2E Service Instance on a specified version and serviceId", response = Response.class)\r
140         public Response deleteE2EServiceInstance(String request,\r
141                         @PathParam("version") String version,\r
142                         @PathParam("serviceId") String serviceId) {\r
143 \r
144                 instanceIdMap.put("serviceId", serviceId);\r
145 \r
146                 return deleteE2EserviceInstances(request, Action.deleteInstance,\r
147                                 instanceIdMap, version);\r
148         }\r
149 \r
150         @GET\r
151         @Path("/{version:[vV][3-5]}/{serviceId}/operations/{operationId}")\r
152         @ApiOperation(value = "Find e2eServiceInstances Requests for a given serviceId and operationId", response = Response.class)\r
153         @Produces(MediaType.APPLICATION_JSON)\r
154         public Response getE2EServiceInstances(\r
155                         @PathParam("serviceId") String serviceId,\r
156                         @PathParam("version") String version,\r
157                         @PathParam("operationId") String operationId) {\r
158                 return getE2EServiceInstances(serviceId, operationId);\r
159         }\r
160 \r
161         private Response getE2EServiceInstances(String serviceId, String operationId) {\r
162                 RequestsDatabase requestsDB = RequestsDatabase.getInstance();\r
163 \r
164                 GetE2EServiceInstanceResponse e2eServiceResponse = new GetE2EServiceInstanceResponse();\r
165 \r
166                 MsoRequest msoRequest = new MsoRequest(serviceId);\r
167 \r
168                 long startTime = System.currentTimeMillis();\r
169 \r
170                 OperationStatus operationStatus = null;\r
171 \r
172                 try {\r
173                         operationStatus = requestsDB.getOperationStatus(serviceId,\r
174                                         operationId);\r
175 \r
176                 } catch (Exception e) {\r
177                         msoLogger\r
178                                         .error(MessageEnum.APIH_DB_ACCESS_EXC,\r
179                                                         MSO_PROP_APIHANDLER_INFRA,\r
180                                                         "",\r
181                                                         "",\r
182                                                         MsoLogger.ErrorCode.AvailabilityError,\r
183                                                         "Exception while communciate with Request DB - Infra Request Lookup",\r
184                                                         e);\r
185                         msoRequest\r
186                                         .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
187                         Response response = msoRequest.buildServiceErrorResponse(\r
188                                         HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,\r
189                                         e.getMessage(),\r
190                                         ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB, null);\r
191                         alarmLogger.sendAlarm("MsoDatabaseAccessError",\r
192                                         MsoAlarmLogger.CRITICAL, Messages.errors\r
193                                                         .get(ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB));\r
194                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,\r
195                                         MsoLogger.ResponseCode.DBAccessError,\r
196                                         "Exception while communciate with Request DB");\r
197                         msoLogger.debug("End of the transaction, the final response is: "\r
198                                         + (String) response.getEntity());\r
199                         return response;\r
200 \r
201                 }\r
202 \r
203                 if (operationStatus == null) {\r
204                         Response resp = msoRequest.buildServiceErrorResponse(\r
205                                         HttpStatus.SC_NO_CONTENT, MsoException.ServiceException,\r
206                                         "E2E serviceId " + serviceId + " is not found in DB",\r
207                                         ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);\r
208                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR,\r
209                                         MSO_PROP_APIHANDLER_INFRA, "", "",\r
210                                         MsoLogger.ErrorCode.BusinessProcesssError,\r
211                                         "Null response from RequestDB when searching by serviceId");\r
212                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,\r
213                                         MsoLogger.ResponseCode.DataNotFound,\r
214                                         "Null response from RequestDB when searching by serviceId");\r
215                         msoLogger.debug("End of the transaction, the final response is: "\r
216                                         + (String) resp.getEntity());\r
217                         return resp;\r
218 \r
219                 }\r
220 \r
221                 e2eServiceResponse.setOperationStatus(operationStatus);\r
222 \r
223                 return Response.status(200).entity(e2eServiceResponse).build();\r
224         }\r
225 \r
226         private Response deleteE2EserviceInstances(String requestJSON,\r
227                         Action action, HashMap<String, String> instanceIdMap, String version) {\r
228                 // TODO should be a new one or the same service instance Id\r
229                 String requestId = instanceIdMap.get("serviceId");\r
230                 long startTime = System.currentTimeMillis();\r
231                 msoLogger.debug("requestId is: " + requestId);\r
232                 E2EServiceInstanceDeleteRequest e2eDelReq = null;\r
233 \r
234                 MsoRequest msoRequest = new MsoRequest(requestId);\r
235 \r
236                 ObjectMapper mapper = new ObjectMapper();\r
237                 try {\r
238                         e2eDelReq = mapper.readValue(requestJSON,\r
239                                         E2EServiceInstanceDeleteRequest.class);\r
240 \r
241                 } catch (Exception e) {\r
242 \r
243                         msoLogger.debug("Mapping of request to JSON object failed : ", e);\r
244                         Response response = msoRequest.buildServiceErrorResponse(\r
245                                         HttpStatus.SC_BAD_REQUEST,\r
246                                         MsoException.ServiceException,\r
247                                         "Mapping of request to JSON object failed.  "\r
248                                                         + e.getMessage(), ErrorNumbers.SVC_BAD_PARAMETER,\r
249                                         null);\r
250                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR,\r
251                                         MSO_PROP_APIHANDLER_INFRA, "", "",\r
252                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);\r
253                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,\r
254                                         MsoLogger.ResponseCode.SchemaError,\r
255                                         "Mapping of request to JSON object failed");\r
256                         msoLogger.debug("End of the transaction, the final response is: "\r
257                                         + (String) response.getEntity());\r
258                         createOperationStatusRecordForError(action, requestId);\r
259                         return response;\r
260                 }\r
261 \r
262                 CatalogDatabase db = null;\r
263                 RecipeLookupResult recipeLookupResult = null;\r
264                 try {\r
265                         db = CatalogDatabase.getInstance();\r
266                         //TODO  Get the service template model version uuid from AAI.\r
267                         recipeLookupResult = getServiceInstanceOrchestrationURI(db, null, action);\r
268                 } catch (Exception e) {\r
269                         msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC,\r
270                                         MSO_PROP_APIHANDLER_INFRA, "", "",\r
271                                         MsoLogger.ErrorCode.AvailabilityError,\r
272                                         "Exception while communciate with Catalog DB", e);\r
273                         msoRequest\r
274                                         .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
275                         Response response = msoRequest.buildServiceErrorResponse(\r
276                                         HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,\r
277                                         "No communication to catalog DB " + e.getMessage(),\r
278                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
279                         alarmLogger.sendAlarm("MsoDatabaseAccessError",\r
280                                         MsoAlarmLogger.CRITICAL, Messages.errors\r
281                                                         .get(ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));\r
282                         msoRequest.createRequestRecord(Status.FAILED, action);\r
283                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,\r
284                                         MsoLogger.ResponseCode.DBAccessError,\r
285                                         "Exception while communciate with DB");\r
286                         msoLogger.debug(END_OF_THE_TRANSACTION\r
287                                         + (String) response.getEntity());\r
288                         return response;\r
289                 } finally {\r
290                         closeCatalogDB(db);\r
291                 }\r
292                 if (recipeLookupResult == null) {\r
293                         msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND,\r
294                                         MSO_PROP_APIHANDLER_INFRA, "", "",\r
295                                         MsoLogger.ErrorCode.DataError, "No recipe found in DB");\r
296                         msoRequest\r
297                                         .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
298                         Response response = msoRequest.buildServiceErrorResponse(\r
299                                         HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,\r
300                                         "Recipe does not exist in catalog DB",\r
301                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);\r
302                         msoRequest.createRequestRecord(Status.FAILED, action);\r
303                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,\r
304                                         MsoLogger.ResponseCode.DataNotFound,\r
305                                         "No recipe found in DB");\r
306                         msoLogger.debug(END_OF_THE_TRANSACTION\r
307                                         + (String) response.getEntity());\r
308                         createOperationStatusRecordForError(action, requestId);\r
309                         return response;\r
310                 }\r
311 \r
312                 RequestClient requestClient = null;\r
313                 HttpResponse response = null;\r
314 \r
315                 long subStartTime = System.currentTimeMillis();\r
316                 // String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);\r
317 \r
318                 try {\r
319                         requestClient = RequestClientFactory.getRequestClient(\r
320                                         recipeLookupResult.getOrchestrationURI(),\r
321                                         MsoPropertiesUtils.loadMsoProperties());\r
322 \r
323                         JSONObject jjo = new JSONObject(requestJSON);\r
324                         jjo.put("operationId", UUIDChecker.generateUUID(msoLogger));\r
325 \r
326                         String bpmnRequest = jjo.toString();\r
327 \r
328                         // Capture audit event\r
329                         msoLogger\r
330                                         .debug("MSO API Handler Posting call to BPEL engine for url: "\r
331                                                         + requestClient.getUrl());\r
332                         String serviceId = instanceIdMap.get("serviceId");\r
333                         String serviceInstanceType = e2eDelReq.getServiceType();\r
334                         response = requestClient.post(requestId, false,\r
335                                         recipeLookupResult.getRecipeTimeout(), action.name(),\r
336                                         serviceId, null, null, null, null, serviceInstanceType,\r
337                                         null, null, null, bpmnRequest, recipeLookupResult.getRecipeParamXsd());\r
338 \r
339                         msoLogger.recordMetricEvent(subStartTime,\r
340                                         MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,\r
341                                         "Successfully received response from BPMN engine", "BPMN",\r
342                                         recipeLookupResult.getOrchestrationURI(), null);\r
343                 } catch (Exception e) {\r
344                         msoLogger.recordMetricEvent(subStartTime,\r
345                                         MsoLogger.StatusCode.ERROR,\r
346                                         MsoLogger.ResponseCode.CommunicationError,\r
347                                         "Exception while communicate with BPMN engine", "BPMN",\r
348                                         recipeLookupResult.getOrchestrationURI(), null);\r
349                         Response resp = msoRequest.buildServiceErrorResponse(\r
350                                         HttpStatus.SC_BAD_GATEWAY, MsoException.ServiceException,\r
351                                         "Failed calling bpmn " + e.getMessage(),\r
352                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
353                         alarmLogger.sendAlarm("MsoConfigurationError",\r
354                                         MsoAlarmLogger.CRITICAL,\r
355                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_BPEL));\r
356                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR,\r
357                                         MSO_PROP_APIHANDLER_INFRA, "", "",\r
358                                         MsoLogger.ErrorCode.AvailabilityError,\r
359                                         "Exception while communicate with BPMN engine");\r
360                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,\r
361                                         MsoLogger.ResponseCode.CommunicationError,\r
362                                         "Exception while communicate with BPMN engine");\r
363                         msoLogger.debug("End of the transaction, the final response is: "\r
364                                         + (String) resp.getEntity());\r
365                         createOperationStatusRecordForError(action, requestId);\r
366                         return resp;\r
367                 }\r
368 \r
369                 if (response == null) {\r
370                         Response resp = msoRequest.buildServiceErrorResponse(\r
371                                         HttpStatus.SC_BAD_GATEWAY, MsoException.ServiceException,\r
372                                         "bpelResponse is null",\r
373                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
374                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR,\r
375                                         MSO_PROP_APIHANDLER_INFRA, "", "",\r
376                                         MsoLogger.ErrorCode.BusinessProcesssError,\r
377                                         "Null response from BPEL");\r
378                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,\r
379                                         MsoLogger.ResponseCode.InternalError,\r
380                                         "Null response from BPMN");\r
381                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) resp.getEntity());\r
382                         createOperationStatusRecordForError(action, requestId);\r
383                         return resp;\r
384                 }\r
385 \r
386                 ResponseHandler respHandler = new ResponseHandler(response,\r
387                                 requestClient.getType());\r
388                 int bpelStatus = respHandler.getStatus();\r
389 \r
390                 return beplStatusUpdate(requestId, startTime, msoRequest,\r
391                                 requestClient, respHandler, bpelStatus, action, instanceIdMap);\r
392         }\r
393 \r
394         private Response updateE2EserviceInstances(String requestJSON, Action action,\r
395                         HashMap<String, String> instanceIdMap, String version) {\r
396 \r
397                 String requestId = instanceIdMap.get("serviceId");\r
398                 long startTime = System.currentTimeMillis();\r
399                 msoLogger.debug("requestId is: " + requestId);\r
400                 E2EServiceInstanceRequest e2eSir = null;\r
401 \r
402                 MsoRequest msoRequest = new MsoRequest(requestId);\r
403                 ObjectMapper mapper = new ObjectMapper();\r
404                 try {\r
405                         e2eSir = mapper.readValue(requestJSON, E2EServiceInstanceRequest.class);\r
406 \r
407                 } catch (Exception e) {\r
408           \r
409           this.createOperationStatusRecordForError(action, requestId);\r
410                   \r
411                         msoLogger.debug("Mapping of request to JSON object failed : ", e);\r
412                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,\r
413                                         MsoException.ServiceException, "Mapping of request to JSON object failed.  " + e.getMessage(),\r
414                                         ErrorNumbers.SVC_BAD_PARAMETER, null);\r
415                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
416                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);\r
417                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,\r
418                                         "Mapping of request to JSON object failed");\r
419                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
420                         return response;\r
421                 }\r
422 \r
423                 mapReqJsonToSvcInstReq(e2eSir, requestJSON);\r
424                 sir.getRequestDetails().getRequestParameters().setaLaCarte(true);\r
425                 try {\r
426                         msoRequest.parse(sir, instanceIdMap, action, version);\r
427                 } catch (Exception e) {\r
428                         msoLogger.debug("Validation failed: ", e);\r
429                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,\r
430                                         MsoException.ServiceException, "Error parsing request.  " + e.getMessage(),\r
431                                         ErrorNumbers.SVC_BAD_PARAMETER, null);\r
432                         if (msoRequest.getRequestId() != null) {\r
433                                 msoLogger.debug("Logging failed message to the database");\r
434                                 this.createOperationStatusRecordForError(action, requestId);\r
435                         }\r
436                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
437                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);\r
438                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,\r
439                                         "Validation of the input request failed");\r
440                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
441                         return response;\r
442                 }\r
443                 \r
444                 //check for the current operation status\r
445                 Response resp = checkE2ESvcInstStatus(action, requestId, startTime, msoRequest);\r
446                 if(resp != null && resp.getStatus() != 200) {\r
447                         return resp;\r
448                 }\r
449                 \r
450                 CatalogDatabase db = null;\r
451                 RecipeLookupResult recipeLookupResult = null;\r
452                 try {\r
453                         db = CatalogDatabase.getInstance();\r
454                         recipeLookupResult = getServiceInstanceOrchestrationURI(db, e2eSir.getService().getTemplateId(), action);\r
455                 } catch (Exception e) {\r
456                         msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",\r
457                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);\r
458                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
459                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,\r
460                                         MsoException.ServiceException, "No communication to catalog DB " + e.getMessage(),\r
461                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
462                         alarmLogger.sendAlarm("MsoDatabaseAccessError", MsoAlarmLogger.CRITICAL,\r
463                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));\r
464                         \r
465                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
466                                         "Exception while communciate with DB");\r
467                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());\r
468                         createOperationStatusRecordForError(action, requestId);\r
469                         return response;\r
470                 } finally {\r
471                         closeCatalogDB(db);\r
472                 }\r
473 \r
474                 if (recipeLookupResult == null) {\r
475                         msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "",\r
476                                         MsoLogger.ErrorCode.DataError, "No recipe found in DB");\r
477                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
478                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,\r
479                                         MsoException.ServiceException, "Recipe does not exist in catalog DB",\r
480                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);\r
481                 \r
482                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound,\r
483                                         "No recipe found in DB");\r
484                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());\r
485                         createOperationStatusRecordForError(action, requestId);\r
486                         return response;\r
487                 }\r
488 \r
489                 String serviceInstanceType = e2eSir.getService().getParameters().getServiceType();\r
490 \r
491                 String serviceId = "";\r
492                 RequestClient requestClient = null;\r
493                 HttpResponse response = null;\r
494 \r
495                 long subStartTime = System.currentTimeMillis();\r
496                 String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);\r
497 \r
498                 try {\r
499                         requestClient = RequestClientFactory.getRequestClient(recipeLookupResult.getOrchestrationURI(),\r
500                                         MsoPropertiesUtils.loadMsoProperties());\r
501 \r
502                         // Capture audit event\r
503                         msoLogger.debug("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl());\r
504 \r
505                         response = requestClient.post(requestId, false, recipeLookupResult.getRecipeTimeout(), action.name(),\r
506                                         serviceId, null, null, null, null, serviceInstanceType, null, null, null, sirRequestJson, recipeLookupResult.getRecipeParamXsd());\r
507 \r
508                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,\r
509                                         "Successfully received response from BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI(),\r
510                                         null);\r
511                 } catch (Exception e) {\r
512                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR,\r
513                                         MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN",\r
514                                         recipeLookupResult.getOrchestrationURI(), null);\r
515                         Response getBPMNResp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,\r
516                                         MsoException.ServiceException, "Failed calling bpmn " + e.getMessage(),\r
517                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
518                         alarmLogger.sendAlarm("MsoConfigurationError", MsoAlarmLogger.CRITICAL,\r
519                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_BPEL));\r
520                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
521                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");\r
522                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,\r
523                                         "Exception while communicate with BPMN engine");\r
524                         msoLogger.debug("End of the transaction, the final response is: " + (String) getBPMNResp.getEntity());\r
525                         createOperationStatusRecordForError(action, requestId);\r
526                         return getBPMNResp;\r
527                 }\r
528 \r
529                 if (response == null) {\r
530                         Response getBPMNResp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,\r
531                                         MsoException.ServiceException, "bpelResponse is null", ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
532                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
533                                         MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");\r
534                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError,\r
535                                         "Null response from BPMN");\r
536                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) getBPMNResp.getEntity());\r
537                         return getBPMNResp;\r
538                 }\r
539 \r
540                 ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());\r
541                 int bpelStatus = respHandler.getStatus();\r
542 \r
543                 return beplStatusUpdate(requestId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action, instanceIdMap);\r
544         }\r
545 \r
546         private Response checkE2ESvcInstStatus(Action action, String requestId, long startTime, MsoRequest msoRequest) {\r
547                 OperationStatus curStatus = null;\r
548 //              String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();\r
549                 String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();\r
550                 try {\r
551                         if (!(requestId == null && "service".equals(requestScope) && (action == Action.updateInstance))) {                          \r
552                                 curStatus = chkSvcInstOperStatusbySvcId(requestId);\r
553                         }\r
554                 } catch (Exception e) {\r
555                         msoLogger.error(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",\r
556                                         MsoLogger.ErrorCode.DataError, "Error during current operation status check ", e);\r
557 \r
558                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,\r
559                                         MsoException.ServiceException, e.getMessage(), ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);\r
560 \r
561                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
562                                         "Error during current operation status check");\r
563                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
564                         return response;\r
565                 }\r
566 \r
567                 if (curStatus != null && !curStatus.getProgress().equals("100")) {\r
568                         String chkMessage = "Error: Locked instance - This " + requestScope + " (" + requestId + ") "\r
569                                         + "now being worked with a status of " + curStatus.getProgress() + " (ServiceName - "\r
570                                         + curStatus.getServiceName()\r
571                                         + "). The existing request must finish or be cleaned up before proceeding.";\r
572 \r
573                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT,\r
574                                         MsoException.ServiceException, chkMessage, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);\r
575 \r
576                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict,\r
577                                         chkMessage);\r
578 \r
579                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
580 \r
581                         createOperationStatusRecordForError(action, requestId);\r
582 \r
583                         return response;\r
584                 }\r
585                 \r
586                 return Response.status(200).entity(null).build();\r
587         }\r
588         \r
589         private Response processE2EserviceInstances(String requestJSON, Action action,\r
590                         HashMap<String, String> instanceIdMap, String version) {\r
591 \r
592                 String requestId = UUIDChecker.generateUUID(msoLogger);\r
593                 long startTime = System.currentTimeMillis();\r
594                 msoLogger.debug("requestId is: " + requestId);\r
595                 E2EServiceInstanceRequest e2eSir = null;\r
596 \r
597                 MsoRequest msoRequest = new MsoRequest(requestId);\r
598                 ObjectMapper mapper = new ObjectMapper();\r
599                 try {\r
600                         e2eSir = mapper.readValue(requestJSON, E2EServiceInstanceRequest.class);\r
601 \r
602                 } catch (Exception e) {\r
603           //TODO update the service name\r
604           this.createOperationStatusRecordForError(action, requestId);\r
605                   \r
606                         msoLogger.debug("Mapping of request to JSON object failed : ", e);\r
607                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,\r
608                                         MsoException.ServiceException, "Mapping of request to JSON object failed.  " + e.getMessage(),\r
609                                         ErrorNumbers.SVC_BAD_PARAMETER, null);\r
610                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
611                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);\r
612                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,\r
613                                         "Mapping of request to JSON object failed");\r
614                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
615                         return response;\r
616                 }\r
617 \r
618                 mapReqJsonToSvcInstReq(e2eSir, requestJSON);\r
619                 sir.getRequestDetails().getRequestParameters().setaLaCarte(true);\r
620                 try {\r
621                         msoRequest.parse(sir, instanceIdMap, action, version);\r
622                 } catch (Exception e) {\r
623                         msoLogger.debug("Validation failed: ", e);\r
624                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,\r
625                                         MsoException.ServiceException, "Error parsing request.  " + e.getMessage(),\r
626                                         ErrorNumbers.SVC_BAD_PARAMETER, null);\r
627                         if (msoRequest.getRequestId() != null) {\r
628                                 msoLogger.debug("Logging failed message to the database");\r
629                                 //TODO update the service name\r
630                           this.createOperationStatusRecordForError(action, requestId);\r
631                         }\r
632                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
633                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);\r
634                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,\r
635                                         "Validation of the input request failed");\r
636                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
637                         return response;\r
638                 }\r
639                 \r
640                 OperationStatus dup = null;\r
641                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();\r
642                 String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();\r
643                 try {\r
644                         if (!(instanceName == null && "service".equals(requestScope)\r
645                                         && (action == Action.createInstance || action == Action.activateInstance))) {\r
646                           //TODO : Need to check for the duplicate record from the operation status,\r
647                           //TODO : commenting this check for unblocking current testing for now...  induces dead code...\r
648                                 dup = chkDuplicateServiceNameInOperStatus( instanceName);\r
649                         }\r
650                 } catch (Exception e) {\r
651                         msoLogger.error(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",\r
652                                         MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);\r
653 \r
654                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,\r
655                                         MsoException.ServiceException, e.getMessage(), ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);\r
656 \r
657                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
658                                         "Error during duplicate check");\r
659                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
660                         return response;\r
661                 }\r
662 \r
663                 if (dup != null) {\r
664                         // Found the duplicate record. Return the appropriate error.\r
665                         String instance = null;\r
666                         if (instanceName != null) {\r
667                                 instance = instanceName;\r
668                         } else {\r
669                                 instance = instanceIdMap.get(requestScope + "InstanceId");\r
670                         }\r
671                         String dupMessage = "Error: Locked instance - This " + requestScope + " (" + instance + ") "\r
672                                         + "already has a request being worked with a status of " + dup.getProgress() + " (ServiceId - "\r
673                                         + dup.getServiceId() + "). The existing request must finish or be cleaned up before proceeding.";\r
674 \r
675                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT,\r
676                                         MsoException.ServiceException, dupMessage, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);\r
677 \r
678                         msoLogger.warn(MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError,\r
679                                         "Duplicate request - Subscriber already has a request for this service");\r
680                         \r
681                         \r
682                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict,\r
683                                         dupMessage);\r
684                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
685                         createOperationStatusRecordForError(action, requestId);\r
686                         return response;\r
687                 }\r
688                 \r
689                 CatalogDatabase db = null;\r
690                 RecipeLookupResult recipeLookupResult = null;\r
691                 try {\r
692                         db = CatalogDatabase.getInstance();\r
693                         recipeLookupResult = getServiceInstanceOrchestrationURI(db, e2eSir.getService().getTemplateId(), action);\r
694                 } catch (Exception e) {\r
695                         msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",\r
696                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);\r
697                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
698                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,\r
699                                         MsoException.ServiceException, "No communication to catalog DB " + e.getMessage(),\r
700                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
701                         alarmLogger.sendAlarm("MsoDatabaseAccessError", MsoAlarmLogger.CRITICAL,\r
702                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));\r
703                         \r
704                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
705                                         "Exception while communciate with DB");\r
706                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());\r
707                         createOperationStatusRecordForError(action, requestId);\r
708                         return response;\r
709                 } finally {\r
710                         closeCatalogDB(db);\r
711                 }\r
712 \r
713                 if (recipeLookupResult == null) {\r
714                         msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "",\r
715                                         MsoLogger.ErrorCode.DataError, "No recipe found in DB");\r
716                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
717                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,\r
718                                         MsoException.ServiceException, "Recipe does not exist in catalog DB",\r
719                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);\r
720                 \r
721                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound,\r
722                                         "No recipe found in DB");\r
723                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());\r
724                         createOperationStatusRecordForError(action, requestId);\r
725                         return response;\r
726                 }\r
727 //              try {\r
728 //                      msoRequest.createRequestRecord(Status.PENDING, action);\r
729 //                      //createOperationStatusRecord(action, requestId);\r
730 //              } catch (Exception e) {\r
731 //                      msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "",\r
732 //                                      MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);\r
733 //                      msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
734 //                      Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,\r
735 //                                      MsoException.ServiceException, "Exception while creating record in DB " + e.getMessage(),\r
736 //                                      ErrorNumbers.SVC_BAD_PARAMETER, null);\r
737 //                      msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
738 //                                      "Exception while creating record in DB");\r
739 //                      msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
740 //                      return response;\r
741 //              }\r
742 \r
743                 String serviceInstanceType = e2eSir.getService().getParameters().getServiceType();\r
744 \r
745                 String serviceId = "";\r
746                 RequestClient requestClient = null;\r
747                 HttpResponse response = null;\r
748 \r
749                 long subStartTime = System.currentTimeMillis();\r
750                 String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);\r
751 \r
752                 try {\r
753                         requestClient = RequestClientFactory.getRequestClient(recipeLookupResult.getOrchestrationURI(),\r
754                                         MsoPropertiesUtils.loadMsoProperties());\r
755 \r
756                         // Capture audit event\r
757                         msoLogger.debug("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl());\r
758 \r
759                         response = requestClient.post(requestId, false, recipeLookupResult.getRecipeTimeout(), action.name(),\r
760                                         serviceId, null, null, null, null, serviceInstanceType, null, null, null, sirRequestJson, recipeLookupResult.getRecipeParamXsd());\r
761 \r
762                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,\r
763                                         "Successfully received response from BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI(),\r
764                                         null);\r
765                 } catch (Exception e) {\r
766                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR,\r
767                                         MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN",\r
768                                         recipeLookupResult.getOrchestrationURI(), null);\r
769                         Response resp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,\r
770                                         MsoException.ServiceException, "Failed calling bpmn " + e.getMessage(),\r
771                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
772                         alarmLogger.sendAlarm("MsoConfigurationError", MsoAlarmLogger.CRITICAL,\r
773                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_BPEL));\r
774                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
775                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");\r
776                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,\r
777                                         "Exception while communicate with BPMN engine");\r
778                         msoLogger.debug("End of the transaction, the final response is: " + (String) resp.getEntity());\r
779                         createOperationStatusRecordForError(action, requestId);\r
780                         return resp;\r
781                 }\r
782 \r
783                 if (response == null) {\r
784                         Response resp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,\r
785                                         MsoException.ServiceException, "bpelResponse is null", ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
786                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
787                                         MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");\r
788                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError,\r
789                                         "Null response from BPMN");\r
790                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) resp.getEntity());\r
791                         return resp;\r
792                 }\r
793 \r
794                 ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());\r
795                 int bpelStatus = respHandler.getStatus();\r
796 \r
797                 return beplStatusUpdate(requestId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action, instanceIdMap);\r
798         }\r
799 \r
800         private void closeCatalogDB(CatalogDatabase db) {\r
801                 if (db != null) {\r
802                         db.close();\r
803                 }\r
804         }\r
805 \r
806         private Response beplStatusUpdate(String requestId, long startTime,\r
807                         MsoRequest msoRequest, RequestClient requestClient,\r
808                         ResponseHandler respHandler, int bpelStatus, Action action,\r
809                         HashMap<String, String> instanceIdMap) {\r
810                 // BPMN accepted the request, the request is in progress\r
811                 if (bpelStatus == HttpStatus.SC_ACCEPTED) {\r
812                         String camundaJSONResponseBody = respHandler.getResponseBody();\r
813                         msoLogger\r
814                                         .debug("Received from Camunda: " + camundaJSONResponseBody);\r
815 \r
816                         // currently only for delete case we update the status here\r
817                         if (action == Action.deleteInstance) {\r
818                                 ObjectMapper mapper = new ObjectMapper();\r
819                                 try {\r
820                                         DelE2ESvcResp jo = mapper.readValue(\r
821                                                         camundaJSONResponseBody, DelE2ESvcResp.class);\r
822                                         String operationId = jo.getOperationId();\r
823                                 this.createOperationStatusRecord("DELETE", requestId,\r
824                                                                 operationId);\r
825                                 } catch (Exception ex) {\r
826                                         msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,\r
827                                                         requestClient.getUrl(), "", "",\r
828                                                         MsoLogger.ErrorCode.BusinessProcesssError,\r
829                                                         "Response from BPEL engine is failed with HTTP Status="\r
830                                                                         + bpelStatus);\r
831                                 }\r
832                         }\r
833                         msoLogger.recordAuditEvent(startTime,\r
834                                         MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,\r
835                                         "BPMN accepted the request, the request is in progress");\r
836                         msoLogger.debug(END_OF_THE_TRANSACTION + camundaJSONResponseBody);\r
837                         return Response.status(HttpStatus.SC_ACCEPTED)\r
838                                         .entity(camundaJSONResponseBody).build();\r
839                 } else {\r
840                         List<String> variables = new ArrayList<>();\r
841                         variables.add(bpelStatus + "");\r
842                         String camundaJSONResponseBody = respHandler.getResponseBody();\r
843                         if (camundaJSONResponseBody != null\r
844                                         && !camundaJSONResponseBody.isEmpty()) {\r
845                                 Response resp = msoRequest.buildServiceErrorResponse(\r
846                                                 bpelStatus, MsoException.ServiceException,\r
847                                                 "Request Failed due to BPEL error with HTTP Status= %1 "\r
848                                                                 + '\n' + camundaJSONResponseBody,\r
849                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, variables);\r
850                                 msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,\r
851                                                 requestClient.getUrl(), "", "",\r
852                                                 MsoLogger.ErrorCode.BusinessProcesssError,\r
853                                                 "Response from BPEL engine is failed with HTTP Status="\r
854                                                                 + bpelStatus);\r
855                                 msoLogger.recordAuditEvent(startTime,\r
856                                                 MsoLogger.StatusCode.ERROR,\r
857                                                 MsoLogger.ResponseCode.InternalError,\r
858                                                 "Response from BPMN engine is failed");\r
859                                 msoLogger.debug(END_OF_THE_TRANSACTION\r
860                                                 + (String) resp.getEntity());\r
861                                 return resp;\r
862                         } else {\r
863                                 Response resp = msoRequest\r
864                                                 .buildServiceErrorResponse(\r
865                                                                 bpelStatus,\r
866                                                                 MsoException.ServiceException,\r
867                                                                 "Request Failed due to BPEL error with HTTP Status= %1",\r
868                                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,\r
869                                                                 variables);\r
870                                 msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,\r
871                                                 requestClient.getUrl(), "", "",\r
872                                                 MsoLogger.ErrorCode.BusinessProcesssError,\r
873                                                 "Response from BPEL engine is empty");\r
874                                 msoLogger.recordAuditEvent(startTime,\r
875                                                 MsoLogger.StatusCode.ERROR,\r
876                                                 MsoLogger.ResponseCode.InternalError,\r
877                                                 "Response from BPEL engine is empty");\r
878                                 msoLogger.debug(END_OF_THE_TRANSACTION\r
879                                                 + (String) resp.getEntity());\r
880                                 return resp;\r
881                         }\r
882                 }\r
883         }\r
884 \r
885         /**\r
886          * Getting recipes from catalogDb\r
887          * \r
888          * @param db the catalog db\r
889          * @param serviceModelUUID the service model version uuid\r
890          * @param action the action for the service\r
891          * @return the service recipe result\r
892          */\r
893         private RecipeLookupResult getServiceInstanceOrchestrationURI(\r
894                         CatalogDatabase db, String serviceModelUUID, Action action) {\r
895 \r
896                 RecipeLookupResult recipeLookupResult = getServiceURI(db, serviceModelUUID, action);\r
897 \r
898                 if (recipeLookupResult != null) {\r
899                         msoLogger.debug("Orchestration URI is: "\r
900                                         + recipeLookupResult.getOrchestrationURI()\r
901                                         + ", recipe Timeout is: "\r
902                                         + Integer.toString(recipeLookupResult.getRecipeTimeout()));\r
903                 } else {\r
904                         msoLogger.debug("No matching recipe record found");\r
905                 }\r
906                 return recipeLookupResult;\r
907         }\r
908 \r
909         /**\r
910          * Getting recipes from catalogDb\r
911          * If Service recipe is not set, use default recipe, if set , use special recipe.\r
912          * @param db the catalog db\r
913          * @param serviceModelUUID the service version uuid\r
914          * @param action the action of the service.\r
915          * @return the service recipe result.\r
916          */\r
917         private RecipeLookupResult getServiceURI(CatalogDatabase db, String serviceModelUUID, Action action) {\r
918 \r
919                 String defaultServiceModelName = "UUI_DEFAULT";\r
920 \r
921                 Service defaultServiceRecord = db\r
922                                 .getServiceByModelName(defaultServiceModelName);\r
923                 ServiceRecipe defaultRecipe = db.getServiceRecipeByModelUUID(\r
924                         defaultServiceRecord.getModelUUID(), action.name());\r
925                 //set recipe as default generic recipe\r
926                 ServiceRecipe recipe = defaultRecipe;\r
927                 //check the service special recipe \r
928                 if(null != serviceModelUUID && ! serviceModelUUID.isEmpty()){\r
929                       ServiceRecipe serviceSpecialRecipe = db.getServiceRecipeByModelUUID(\r
930                               serviceModelUUID, action.name());\r
931                       if(null != serviceSpecialRecipe){\r
932                           //set service special recipe.\r
933                           recipe = serviceSpecialRecipe;\r
934                       }\r
935                 }       \r
936                 \r
937                 if (recipe == null) {\r
938                         return null;\r
939                 }\r
940                 return new RecipeLookupResult(recipe.getOrchestrationUri(),\r
941                                 recipe.getRecipeTimeout(), recipe.getServiceParamXSD());\r
942 \r
943         }\r
944 \r
945         /**\r
946          * Converting E2EServiceInstanceRequest to ServiceInstanceRequest and\r
947          * passing it to camunda engine.\r
948          * \r
949          * @param e2eSir\r
950          * @return\r
951          */\r
952         private String mapReqJsonToSvcInstReq(E2EServiceInstanceRequest e2eSir,\r
953                         String requestJSON) {\r
954 \r
955                 sir = new ServiceInstancesRequest();\r
956 \r
957                 String returnString = null;\r
958                 RequestDetails requestDetails = new RequestDetails();\r
959                 ModelInfo modelInfo = new ModelInfo();\r
960 \r
961                 // ModelInvariantId\r
962                 modelInfo.setModelInvariantId(e2eSir.getService().getServiceDefId());\r
963 \r
964                 // modelNameVersionId\r
965                 modelInfo.setModelNameVersionId(e2eSir.getService().getTemplateId());\r
966 \r
967                 // String modelInfoValue =\r
968                 // e2eSir.getService().getParameters().getNodeTemplateName();\r
969                 // String[] arrayOfInfo = modelInfoValue.split(":");\r
970                 // String modelName = arrayOfInfo[0];\r
971                 // String modelVersion = arrayOfInfo[1];\r
972 \r
973                 // TODO: To ensure, if we dont get the values from the UUI\r
974                 String modelName = "voLTE";\r
975                 String modelVersion = "1.0";\r
976                 // modelName\r
977                 modelInfo.setModelName(modelName);\r
978 \r
979                 // modelVersion\r
980                 modelInfo.setModelVersion(modelVersion);\r
981 \r
982                 // modelType\r
983                 modelInfo.setModelType(ModelType.service);\r
984 \r
985                 // setting modelInfo to requestDetails\r
986                 requestDetails.setModelInfo(modelInfo);\r
987 \r
988                 SubscriberInfo subscriberInfo = new SubscriberInfo();\r
989 \r
990                 // globalsubscriberId\r
991                 subscriberInfo.setGlobalSubscriberId(e2eSir.getService()\r
992                                 .getParameters().getGlobalSubscriberId());\r
993 \r
994                 // subscriberName\r
995                 subscriberInfo.setSubscriberName(e2eSir.getService().getParameters()\r
996                                 .getSubscriberName());\r
997 \r
998                 // setting subscriberInfo to requestDetails\r
999                 requestDetails.setSubscriberInfo(subscriberInfo);\r
1000 \r
1001                 RequestInfo requestInfo = new RequestInfo();\r
1002 \r
1003                 // instanceName\r
1004                 requestInfo.setInstanceName(e2eSir.getService().getName());\r
1005 \r
1006                 // source\r
1007                 requestInfo.setSource("UUI");\r
1008 \r
1009                 // suppressRollback\r
1010                 requestInfo.setSuppressRollback(true);\r
1011 \r
1012                 // setting requestInfo to requestDetails\r
1013                 requestDetails.setRequestInfo(requestInfo);\r
1014 \r
1015                 RequestParameters requestParameters = new RequestParameters();\r
1016 \r
1017                 // subscriptionServiceType\r
1018                 requestParameters.setSubscriptionServiceType("MOG");\r
1019 \r
1020                 // Userparams\r
1021                 List<E2EUserParam> userParams;\r
1022                 // userParams =\r
1023                 // e2eSir.getService().getParameters().getRequestParameters().getUserParams();\r
1024                 List<Map<String, String>> userParamList = new ArrayList<>();\r
1025                 Map<String, String> userParamMap = new HashMap<>();\r
1026                 // complete json request updated in the camunda\r
1027                 userParamMap.put("UUIRequest", requestJSON);\r
1028                 userParamMap.put("ServiceInstanceName", e2eSir.getService().getName());\r
1029 \r
1030                 // Map<String, String> userParamMap3 = null;\r
1031                 // for (E2EUserParam userp : userParams) {\r
1032                 // userParamMap.put(userp.getName(), userp.getValue());\r
1033                 //\r
1034                 // }\r
1035                 userParamList.add(userParamMap);\r
1036                 requestParameters.setUserParams(userParamList);\r
1037 \r
1038                 // setting requestParameters to requestDetails\r
1039                 requestDetails.setRequestParameters(requestParameters);\r
1040 \r
1041                 sir.setRequestDetails(requestDetails);\r
1042 \r
1043                 // converting to string\r
1044                 ObjectMapper mapper = new ObjectMapper();\r
1045                 try {\r
1046                         returnString = mapper.writeValueAsString(sir);\r
1047                 } catch (IOException e) {\r
1048                         msoLogger\r
1049                                         .debug("Exception while converting ServiceInstancesRequest object to string",\r
1050                                                         e);\r
1051                 }\r
1052 \r
1053                 return returnString;\r
1054         }\r
1055 \r
1056         private void createOperationStatusRecordForError(Action action,\r
1057                         String requestId) throws MsoDatabaseException {\r
1058 \r
1059                 AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager();\r
1060 \r
1061                 Session session = null;\r
1062                 try {\r
1063 \r
1064                         session = requestsDbSessionFactoryManager.getSessionFactory()\r
1065                                         .openSession();\r
1066                         session.beginTransaction();\r
1067 \r
1068                         OperationStatus os = new OperationStatus();\r
1069                         os.setOperation(action.name());\r
1070                         os.setOperationContent("");\r
1071                         os.setOperationId("");\r
1072                         os.setProgress("100");\r
1073                         os.setReason("");\r
1074                         os.setResult("error");\r
1075                         os.setServiceId(requestId);\r
1076                         os.setUserId("");\r
1077                         Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());\r
1078                         Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());\r
1079                         os.setFinishedAt(endTimeStamp);\r
1080                         os.setOperateAt(startTimeStamp);\r
1081 \r
1082                         session.save(os);\r
1083                         session.getTransaction().commit();\r
1084 \r
1085                 } catch (Exception e) {\r
1086                         msoLogger.error(MessageEnum.APIH_DB_INSERT_EXC, "", "",\r
1087                                         MsoLogger.ErrorCode.DataError,\r
1088                                         "Exception when creation record request in Operation", e);\r
1089                         throw new MsoDatabaseException(\r
1090                                         "Data did inserted in Operatus Status Table for failure", e);\r
1091                 } finally {\r
1092                         if (null != session) {\r
1093                                 session.close();\r
1094                         }\r
1095                 }\r
1096         }\r
1097 \r
1098         private void createOperationStatusRecord(String actionNm, String serviceId,\r
1099                         String operationId) throws MsoDatabaseException {\r
1100 \r
1101                 AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager();\r
1102 \r
1103                 Session session = null;\r
1104                 try {\r
1105 \r
1106                         session = requestsDbSessionFactoryManager.getSessionFactory()\r
1107                                         .openSession();\r
1108                         session.beginTransaction();\r
1109 \r
1110                         OperationStatus os = new OperationStatus();\r
1111                         os.setOperation(actionNm);\r
1112                         os.setOperationContent("");\r
1113                         os.setOperationId(operationId);\r
1114                         os.setProgress("0");\r
1115                         os.setReason("");\r
1116                         os.setResult("processing");\r
1117                         os.setServiceId(serviceId);\r
1118                         // TODO : to be updated...\r
1119                         os.setUserId("");\r
1120                         Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());\r
1121                         Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());\r
1122                         os.setFinishedAt(endTimeStamp);\r
1123                         os.setOperateAt(startTimeStamp);\r
1124 \r
1125                         session.save(os);\r
1126                         session.getTransaction().commit();\r
1127 \r
1128                 } catch (Exception e) {\r
1129                         msoLogger.error(MessageEnum.APIH_DB_INSERT_EXC, "", "",\r
1130                                         MsoLogger.ErrorCode.DataError,\r
1131                                         "Exception when creation record request in Operation", e);\r
1132                         throw new MsoDatabaseException(\r
1133                                         "Data did inserted in Operatus Status Table", e);\r
1134                 } finally {\r
1135                         if (null != session) {\r
1136                                 session.close();\r
1137                         }\r
1138                 }\r
1139         }\r
1140 \r
1141         private OperationStatus chkSvcInstOperStatusbySvcId(String serviceId) {\r
1142                 OperationStatus svcInstanceOperStatus = (RequestsDatabase.getInstance())\r
1143                                 .getOperationStatusByServiceId(serviceId);\r
1144 \r
1145                 return svcInstanceOperStatus;\r
1146         }\r
1147 \r
1148         private OperationStatus chkDuplicateServiceNameInOperStatus(\r
1149                         String serviceName) {\r
1150                 OperationStatus dupServiceName = (RequestsDatabase.getInstance())\r
1151                                 .getOperationStatusByServiceName(serviceName);\r
1152 \r
1153                 return dupServiceName;\r
1154         }\r
1155 }