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