c27e8277da4d6d34d4619b1efa91f5814fb10803
[so.git] /
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().getServiceUuid(), 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().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.debug("Exception while communicate with BPMN engine", e);\r
515                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR,\r
516                                         MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN",\r
517                                         recipeLookupResult.getOrchestrationURI(), null);\r
518                         Response getBPMNResp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,\r
519                                         MsoException.ServiceException, "Failed calling bpmn " + e.getMessage(),\r
520                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
521                         alarmLogger.sendAlarm("MsoConfigurationError", MsoAlarmLogger.CRITICAL,\r
522                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_BPEL));\r
523                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
524                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");\r
525                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,\r
526                                         "Exception while communicate with BPMN engine");\r
527                         msoLogger.debug("End of the transaction, the final response is: " + (String) getBPMNResp.getEntity());\r
528                         createOperationStatusRecordForError(action, requestId);\r
529                         return getBPMNResp;\r
530                 }\r
531 \r
532                 if (response == null) {\r
533                         Response getBPMNResp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,\r
534                                         MsoException.ServiceException, "bpelResponse is null", ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
535                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
536                                         MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");\r
537                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError,\r
538                                         "Null response from BPMN");\r
539                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) getBPMNResp.getEntity());\r
540                         return getBPMNResp;\r
541                 }\r
542 \r
543                 ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());\r
544                 int bpelStatus = respHandler.getStatus();\r
545 \r
546                 return beplStatusUpdate(requestId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action, instanceIdMap);\r
547         }\r
548 \r
549         private Response checkE2ESvcInstStatus(Action action, String requestId, long startTime, MsoRequest msoRequest) {\r
550                 OperationStatus curStatus = null;\r
551 //              String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();\r
552                 String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();\r
553                 try {\r
554                         if (!(requestId == null && "service".equals(requestScope) && (action == Action.updateInstance))) {                          \r
555                                 curStatus = chkSvcInstOperStatusbySvcId(requestId);\r
556                         }\r
557                 } catch (Exception e) {\r
558                         msoLogger.error(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",\r
559                                         MsoLogger.ErrorCode.DataError, "Error during current operation status check ", e);\r
560 \r
561                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,\r
562                                         MsoException.ServiceException, e.getMessage(), ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);\r
563 \r
564                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
565                                         "Error during current operation status check");\r
566                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
567                         return response;\r
568                 }\r
569 \r
570                 if (curStatus != null && !curStatus.getProgress().equals("100")) {\r
571                         String chkMessage = "Error: Locked instance - This " + requestScope + " (" + requestId + ") "\r
572                                         + "now being worked with a status of " + curStatus.getProgress() + " (ServiceName - "\r
573                                         + curStatus.getServiceName()\r
574                                         + "). The existing request must finish or be cleaned up before proceeding.";\r
575 \r
576                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT,\r
577                                         MsoException.ServiceException, chkMessage, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);\r
578 \r
579                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict,\r
580                                         chkMessage);\r
581 \r
582                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
583 \r
584                         createOperationStatusRecordForError(action, requestId);\r
585 \r
586                         return response;\r
587                 }\r
588                 \r
589                 return Response.status(200).entity(null).build();\r
590         }\r
591         \r
592         private Response processE2EserviceInstances(String requestJSON, Action action,\r
593                         HashMap<String, String> instanceIdMap, String version) {\r
594 \r
595                 String requestId = UUIDChecker.generateUUID(msoLogger);\r
596                 long startTime = System.currentTimeMillis();\r
597                 msoLogger.debug("requestId is: " + requestId);\r
598                 E2EServiceInstanceRequest e2eSir = null;\r
599 \r
600                 MsoRequest msoRequest = new MsoRequest(requestId);\r
601                 ObjectMapper mapper = new ObjectMapper();\r
602                 try {\r
603                         e2eSir = mapper.readValue(requestJSON, E2EServiceInstanceRequest.class);\r
604 \r
605                 } catch (Exception e) {\r
606           //TODO update the service name\r
607           this.createOperationStatusRecordForError(action, requestId);\r
608                   \r
609                         msoLogger.debug("Mapping of request to JSON object failed : ", e);\r
610                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,\r
611                                         MsoException.ServiceException, "Mapping of request to JSON object failed.  " + e.getMessage(),\r
612                                         ErrorNumbers.SVC_BAD_PARAMETER, null);\r
613                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
614                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);\r
615                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,\r
616                                         "Mapping of request to JSON object failed");\r
617                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
618                         return response;\r
619                 }\r
620 \r
621                 mapReqJsonToSvcInstReq(e2eSir, requestJSON);\r
622                 sir.getRequestDetails().getRequestParameters().setaLaCarte(true);\r
623                 try {\r
624                         msoRequest.parse(sir, instanceIdMap, action, version, requestJSON);\r
625                 } catch (Exception e) {\r
626                         msoLogger.debug("Validation failed: ", e);\r
627                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,\r
628                                         MsoException.ServiceException, "Error parsing request.  " + e.getMessage(),\r
629                                         ErrorNumbers.SVC_BAD_PARAMETER, null);\r
630                         if (msoRequest.getRequestId() != null) {\r
631                                 msoLogger.debug("Logging failed message to the database");\r
632                                 //TODO update the service name\r
633                           this.createOperationStatusRecordForError(action, requestId);\r
634                         }\r
635                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
636                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);\r
637                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,\r
638                                         "Validation of the input request failed");\r
639                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
640                         return response;\r
641                 }\r
642                 \r
643                 OperationStatus dup = null;\r
644                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();\r
645                 String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();\r
646                 try {\r
647                         if (!(instanceName == null && "service".equals(requestScope)\r
648                                         && (action == Action.createInstance || action == Action.activateInstance))) {\r
649                           //TODO : Need to check for the duplicate record from the operation status,\r
650                           //TODO : commenting this check for unblocking current testing for now...  induces dead code...\r
651                                 dup = chkDuplicateServiceNameInOperStatus( instanceName);\r
652                         }\r
653                 } catch (Exception e) {\r
654                         msoLogger.error(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",\r
655                                         MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);\r
656 \r
657                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,\r
658                                         MsoException.ServiceException, e.getMessage(), ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);\r
659 \r
660                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
661                                         "Error during duplicate check");\r
662                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
663                         return response;\r
664                 }\r
665 \r
666                 if (dup != null) {\r
667                         // Found the duplicate record. Return the appropriate error.\r
668                         String instance = null;\r
669                         if (instanceName != null) {\r
670                                 instance = instanceName;\r
671                         } else {\r
672                                 instance = instanceIdMap.get(requestScope + "InstanceId");\r
673                         }\r
674                         String dupMessage = "Error: Locked instance - This " + requestScope + " (" + instance + ") "\r
675                                         + "already has a request being worked with a status of " + dup.getProgress() + " (ServiceId - "\r
676                                         + dup.getServiceId() + "). The existing request must finish or be cleaned up before proceeding.";\r
677 \r
678                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT,\r
679                                         MsoException.ServiceException, dupMessage, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);\r
680 \r
681                         msoLogger.warn(MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError,\r
682                                         "Duplicate request - Subscriber already has a request for this service");\r
683                         \r
684                         \r
685                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict,\r
686                                         dupMessage);\r
687                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
688                         createOperationStatusRecordForError(action, requestId);\r
689                         return response;\r
690                 }\r
691                 \r
692                 CatalogDatabase db = null;\r
693                 RecipeLookupResult recipeLookupResult = null;\r
694                 try {\r
695                         db = CatalogDatabase.getInstance();\r
696                         recipeLookupResult = getServiceInstanceOrchestrationURI(db, e2eSir.getService().getServiceUuid(), action);\r
697                 } catch (Exception e) {\r
698                         msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",\r
699                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);\r
700                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
701                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,\r
702                                         MsoException.ServiceException, "No communication to catalog DB " + e.getMessage(),\r
703                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
704                         alarmLogger.sendAlarm("MsoDatabaseAccessError", MsoAlarmLogger.CRITICAL,\r
705                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));\r
706                         \r
707                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
708                                         "Exception while communciate with DB");\r
709                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());\r
710                         createOperationStatusRecordForError(action, requestId);\r
711                         return response;\r
712                 } finally {\r
713                         closeCatalogDB(db);\r
714                 }\r
715 \r
716                 if (recipeLookupResult == null) {\r
717                         msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "",\r
718                                         MsoLogger.ErrorCode.DataError, "No recipe found in DB");\r
719                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
720                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,\r
721                                         MsoException.ServiceException, "Recipe does not exist in catalog DB",\r
722                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);\r
723                 \r
724                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound,\r
725                                         "No recipe found in DB");\r
726                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());\r
727                         createOperationStatusRecordForError(action, requestId);\r
728                         return response;\r
729                 }\r
730 //              try {\r
731 //                      msoRequest.createRequestRecord(Status.PENDING, action);\r
732 //                      //createOperationStatusRecord(action, requestId);\r
733 //              } catch (Exception e) {\r
734 //                      msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "",\r
735 //                                      MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);\r
736 //                      msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
737 //                      Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,\r
738 //                                      MsoException.ServiceException, "Exception while creating record in DB " + e.getMessage(),\r
739 //                                      ErrorNumbers.SVC_BAD_PARAMETER, null);\r
740 //                      msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
741 //                                      "Exception while creating record in DB");\r
742 //                      msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
743 //                      return response;\r
744 //              }\r
745 \r
746                 String serviceInstanceType = e2eSir.getService().getServiceType();\r
747 \r
748                 String serviceId = "";\r
749                 RequestClient requestClient = null;\r
750                 HttpResponse response = null;\r
751 \r
752                 long subStartTime = System.currentTimeMillis();\r
753                 String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);\r
754 \r
755                 try {\r
756                         requestClient = RequestClientFactory.getRequestClient(recipeLookupResult.getOrchestrationURI(),\r
757                                         MsoPropertiesUtils.loadMsoProperties());\r
758 \r
759                         // Capture audit event\r
760                         msoLogger.debug("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl());\r
761 \r
762                         response = requestClient.post(requestId, false, recipeLookupResult.getRecipeTimeout(), action.name(),\r
763                                         serviceId, null, null, null, null, null, serviceInstanceType, null, null, null, sirRequestJson,\r
764                                         recipeLookupResult.getRecipeParamXsd());\r
765 \r
766                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,\r
767                                         "Successfully received response from BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI(),\r
768                                         null);\r
769                 } catch (Exception e) {\r
770                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR,\r
771                                         MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN",\r
772                                         recipeLookupResult.getOrchestrationURI(), null);\r
773                         Response resp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,\r
774                                         MsoException.ServiceException, "Failed calling bpmn " + e.getMessage(),\r
775                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
776                         alarmLogger.sendAlarm("MsoConfigurationError", MsoAlarmLogger.CRITICAL,\r
777                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_BPEL));\r
778                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
779                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");\r
780                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,\r
781                                         "Exception while communicate with BPMN engine");\r
782                         msoLogger.debug("End of the transaction, the final response is: " + (String) resp.getEntity());\r
783                         createOperationStatusRecordForError(action, requestId);\r
784                         return resp;\r
785                 }\r
786 \r
787                 if (response == null) {\r
788                         Response resp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,\r
789                                         MsoException.ServiceException, "bpelResponse is null", ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
790                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
791                                         MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");\r
792                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError,\r
793                                         "Null response from BPMN");\r
794                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) resp.getEntity());\r
795                         return resp;\r
796                 }\r
797 \r
798                 ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());\r
799                 int bpelStatus = respHandler.getStatus();\r
800 \r
801                 return beplStatusUpdate(requestId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action, instanceIdMap);\r
802         }\r
803 \r
804         private void closeCatalogDB(CatalogDatabase db) {\r
805                 if (db != null) {\r
806                         db.close();\r
807                 }\r
808         }\r
809 \r
810         private Response beplStatusUpdate(String requestId, long startTime,\r
811                         MsoRequest msoRequest, RequestClient requestClient,\r
812                         ResponseHandler respHandler, int bpelStatus, Action action,\r
813                         HashMap<String, String> instanceIdMap) {\r
814                 // BPMN accepted the request, the request is in progress\r
815                 if (bpelStatus == HttpStatus.SC_ACCEPTED) {\r
816                         String camundaJSONResponseBody = respHandler.getResponseBody();\r
817                         msoLogger\r
818                                         .debug("Received from Camunda: " + camundaJSONResponseBody);\r
819 \r
820                         // currently only for delete case we update the status here\r
821                         if (action == Action.deleteInstance) {\r
822                                 ObjectMapper mapper = new ObjectMapper();\r
823                                 try {\r
824                                         DelE2ESvcResp jo = mapper.readValue(\r
825                                                         camundaJSONResponseBody, DelE2ESvcResp.class);\r
826                                         String operationId = jo.getOperationId();\r
827                                 this.createOperationStatusRecord("DELETE", requestId,\r
828                                                                 operationId);\r
829                                 } catch (Exception ex) {\r
830                                         msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,\r
831                                                         requestClient.getUrl(), "", "",\r
832                                                         MsoLogger.ErrorCode.BusinessProcesssError,\r
833                                                         "Response from BPEL engine is failed with HTTP Status="\r
834                                                                         + bpelStatus);\r
835                                 }\r
836                         }\r
837                         msoLogger.recordAuditEvent(startTime,\r
838                                         MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,\r
839                                         "BPMN accepted the request, the request is in progress");\r
840                         msoLogger.debug(END_OF_THE_TRANSACTION + camundaJSONResponseBody);\r
841                         return Response.status(HttpStatus.SC_ACCEPTED)\r
842                                         .entity(camundaJSONResponseBody).build();\r
843                 } else {\r
844                         List<String> variables = new ArrayList<>();\r
845                         variables.add(bpelStatus + "");\r
846                         String camundaJSONResponseBody = respHandler.getResponseBody();\r
847                         if (camundaJSONResponseBody != null\r
848                                         && !camundaJSONResponseBody.isEmpty()) {\r
849                                 Response resp = msoRequest.buildServiceErrorResponse(\r
850                                                 bpelStatus, MsoException.ServiceException,\r
851                                                 "Request Failed due to BPEL error with HTTP Status= %1 "\r
852                                                                 + '\n' + camundaJSONResponseBody,\r
853                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, variables);\r
854                                 msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,\r
855                                                 requestClient.getUrl(), "", "",\r
856                                                 MsoLogger.ErrorCode.BusinessProcesssError,\r
857                                                 "Response from BPEL engine is failed with HTTP Status="\r
858                                                                 + bpelStatus);\r
859                                 msoLogger.recordAuditEvent(startTime,\r
860                                                 MsoLogger.StatusCode.ERROR,\r
861                                                 MsoLogger.ResponseCode.InternalError,\r
862                                                 "Response from BPMN engine is failed");\r
863                                 msoLogger.debug(END_OF_THE_TRANSACTION\r
864                                                 + (String) resp.getEntity());\r
865                                 return resp;\r
866                         } else {\r
867                                 Response resp = msoRequest\r
868                                                 .buildServiceErrorResponse(\r
869                                                                 bpelStatus,\r
870                                                                 MsoException.ServiceException,\r
871                                                                 "Request Failed due to BPEL error with HTTP Status= %1",\r
872                                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,\r
873                                                                 variables);\r
874                                 msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,\r
875                                                 requestClient.getUrl(), "", "",\r
876                                                 MsoLogger.ErrorCode.BusinessProcesssError,\r
877                                                 "Response from BPEL engine is empty");\r
878                                 msoLogger.recordAuditEvent(startTime,\r
879                                                 MsoLogger.StatusCode.ERROR,\r
880                                                 MsoLogger.ResponseCode.InternalError,\r
881                                                 "Response from BPEL engine is empty");\r
882                                 msoLogger.debug(END_OF_THE_TRANSACTION\r
883                                                 + (String) resp.getEntity());\r
884                                 return resp;\r
885                         }\r
886                 }\r
887         }\r
888 \r
889         /**\r
890          * Getting recipes from catalogDb\r
891          * \r
892          * @param db the catalog db\r
893          * @param serviceModelUUID the service model version uuid\r
894          * @param action the action for the service\r
895          * @return the service recipe result\r
896          */\r
897         private RecipeLookupResult getServiceInstanceOrchestrationURI(\r
898                         CatalogDatabase db, String serviceModelUUID, Action action) {\r
899 \r
900                 RecipeLookupResult recipeLookupResult = getServiceURI(db, serviceModelUUID, action);\r
901 \r
902                 if (recipeLookupResult != null) {\r
903                         msoLogger.debug("Orchestration URI is: "\r
904                                         + recipeLookupResult.getOrchestrationURI()\r
905                                         + ", recipe Timeout is: "\r
906                                         + Integer.toString(recipeLookupResult.getRecipeTimeout()));\r
907                 } else {\r
908                         msoLogger.debug("No matching recipe record found");\r
909                 }\r
910                 return recipeLookupResult;\r
911         }\r
912 \r
913         /**\r
914          * Getting recipes from catalogDb\r
915          * If Service recipe is not set, use default recipe, if set , use special recipe.\r
916          * @param db the catalog db\r
917          * @param serviceModelUUID the service version uuid\r
918          * @param action the action of the service.\r
919          * @return the service recipe result.\r
920          */\r
921         private RecipeLookupResult getServiceURI(CatalogDatabase db, String serviceModelUUID, Action action) {\r
922 \r
923                 String defaultServiceModelName = "UUI_DEFAULT";\r
924 \r
925                 Service defaultServiceRecord = db\r
926                                 .getServiceByModelName(defaultServiceModelName);\r
927                 ServiceRecipe defaultRecipe = db.getServiceRecipeByModelUUID(\r
928                         defaultServiceRecord.getModelUUID(), action.name());\r
929                 //set recipe as default generic recipe\r
930                 ServiceRecipe recipe = defaultRecipe;\r
931                 //check the service special recipe \r
932                 if(null != serviceModelUUID && ! serviceModelUUID.isEmpty()){\r
933                       ServiceRecipe serviceSpecialRecipe = db.getServiceRecipeByModelUUID(\r
934                               serviceModelUUID, action.name());\r
935                       if(null != serviceSpecialRecipe){\r
936                           //set service special recipe.\r
937                           recipe = serviceSpecialRecipe;\r
938                       }\r
939                 }       \r
940                 \r
941                 if (recipe == null) {\r
942                         return null;\r
943                 }\r
944                 return new RecipeLookupResult(recipe.getOrchestrationUri(),\r
945                                 recipe.getRecipeTimeout(), recipe.getServiceParamXSD());\r
946 \r
947         }\r
948 \r
949         /**\r
950          * Converting E2EServiceInstanceRequest to ServiceInstanceRequest and\r
951          * passing it to camunda engine.\r
952          * \r
953          * @param e2eSir\r
954          * @return\r
955          */\r
956         private String mapReqJsonToSvcInstReq(E2EServiceInstanceRequest e2eSir,\r
957                         String requestJSON) {\r
958 \r
959                 sir = new ServiceInstancesRequest();\r
960 \r
961                 String returnString = null;\r
962                 RequestDetails requestDetails = new RequestDetails();\r
963                 ModelInfo modelInfo = new ModelInfo();\r
964 \r
965                 // ModelInvariantId\r
966                 modelInfo.setModelInvariantId(e2eSir.getService().getServiceInvariantUuid());\r
967 \r
968                 // modelNameVersionId\r
969                 modelInfo.setModelNameVersionId(e2eSir.getService().getServiceUuid());\r
970 \r
971                 // String modelInfoValue =\r
972                 // e2eSir.getService().getParameters().getNodeTemplateName();\r
973                 // String[] arrayOfInfo = modelInfoValue.split(":");\r
974                 // String modelName = arrayOfInfo[0];\r
975                 // String modelVersion = arrayOfInfo[1];\r
976 \r
977                 // TODO: To ensure, if we dont get the values from the UUI\r
978                 String modelName = "voLTE";\r
979                 String modelVersion = "1.0";\r
980                 // modelName\r
981                 modelInfo.setModelName(modelName);\r
982 \r
983                 // modelVersion\r
984                 modelInfo.setModelVersion(modelVersion);\r
985 \r
986                 // modelType\r
987                 modelInfo.setModelType(ModelType.service);\r
988 \r
989                 // setting modelInfo to requestDetails\r
990                 requestDetails.setModelInfo(modelInfo);\r
991 \r
992                 SubscriberInfo subscriberInfo = new SubscriberInfo();\r
993 \r
994                 // globalsubscriberId\r
995                 subscriberInfo.setGlobalSubscriberId(e2eSir.getService().getGlobalSubscriberId());\r
996 \r
997                 // setting subscriberInfo to requestDetails\r
998                 requestDetails.setSubscriberInfo(subscriberInfo);\r
999 \r
1000                 RequestInfo requestInfo = new RequestInfo();\r
1001 \r
1002                 // instanceName\r
1003                 requestInfo.setInstanceName(e2eSir.getService().getName());\r
1004 \r
1005                 // source\r
1006                 requestInfo.setSource("UUI");\r
1007 \r
1008                 // suppressRollback\r
1009                 requestInfo.setSuppressRollback(true);\r
1010 \r
1011                 // setting requestInfo to requestDetails\r
1012                 requestDetails.setRequestInfo(requestInfo);\r
1013 \r
1014                 RequestParameters requestParameters = new RequestParameters();\r
1015 \r
1016                 // subscriptionServiceType\r
1017                 requestParameters.setSubscriptionServiceType("MOG");\r
1018 \r
1019                 // Userparams\r
1020                 List<E2EUserParam> userParams;\r
1021                 // userParams =\r
1022                 // e2eSir.getService().getParameters().getRequestParameters().getUserParams();\r
1023                 List<Map<String, Object>> userParamList = new ArrayList<>();\r
1024                 Map<String, Object> userParamMap = new HashMap<>();\r
1025                 // complete json request updated in the camunda\r
1026                 userParamMap.put("UUIRequest", requestJSON);\r
1027                 userParamMap.put("ServiceInstanceName", e2eSir.getService().getName());\r
1028 \r
1029                 // Map<String, String> userParamMap3 = null;\r
1030                 // for (E2EUserParam userp : userParams) {\r
1031                 // userParamMap.put(userp.getName(), userp.getValue());\r
1032                 //\r
1033                 // }\r
1034                 userParamList.add(userParamMap);\r
1035                 requestParameters.setUserParams(userParamList);\r
1036 \r
1037                 // setting requestParameters to requestDetails\r
1038                 requestDetails.setRequestParameters(requestParameters);\r
1039 \r
1040                 sir.setRequestDetails(requestDetails);\r
1041 \r
1042                 // converting to string\r
1043                 ObjectMapper mapper = new ObjectMapper();\r
1044                 try {\r
1045                         returnString = mapper.writeValueAsString(sir);\r
1046                 } catch (IOException e) {\r
1047                         msoLogger\r
1048                                         .debug("Exception while converting ServiceInstancesRequest object to string",\r
1049                                                         e);\r
1050                 }\r
1051 \r
1052                 return returnString;\r
1053         }\r
1054 \r
1055         private void createOperationStatusRecordForError(Action action,\r
1056                         String requestId) throws MsoDatabaseException {\r
1057 \r
1058                 AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager();\r
1059 \r
1060                 Session session = null;\r
1061                 try {\r
1062 \r
1063                         session = requestsDbSessionFactoryManager.getSessionFactory()\r
1064                                         .openSession();\r
1065                         session.beginTransaction();\r
1066 \r
1067                         OperationStatus os = new OperationStatus();\r
1068                         os.setOperation(action.name());\r
1069                         os.setOperationContent("");\r
1070                         os.setOperationId("");\r
1071                         os.setProgress("100");\r
1072                         os.setReason("");\r
1073                         os.setResult("error");\r
1074                         os.setServiceId(requestId);\r
1075                         os.setUserId("");\r
1076                         Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());\r
1077                         Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());\r
1078                         os.setFinishedAt(endTimeStamp);\r
1079                         os.setOperateAt(startTimeStamp);\r
1080 \r
1081                         session.save(os);\r
1082                         session.getTransaction().commit();\r
1083 \r
1084                 } catch (Exception e) {\r
1085                         msoLogger.error(MessageEnum.APIH_DB_INSERT_EXC, "", "",\r
1086                                         MsoLogger.ErrorCode.DataError,\r
1087                                         "Exception when creation record request in Operation", e);\r
1088                         throw new MsoDatabaseException(\r
1089                                         "Data did inserted in Operatus Status Table for failure", e);\r
1090                 } finally {\r
1091                         if (null != session) {\r
1092                                 session.close();\r
1093                         }\r
1094                 }\r
1095         }\r
1096 \r
1097         private void createOperationStatusRecord(String actionNm, String serviceId,\r
1098                         String operationId) throws MsoDatabaseException {\r
1099 \r
1100                 AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager();\r
1101 \r
1102                 Session session = null;\r
1103                 try {\r
1104 \r
1105                         session = requestsDbSessionFactoryManager.getSessionFactory()\r
1106                                         .openSession();\r
1107                         session.beginTransaction();\r
1108 \r
1109                         OperationStatus os = new OperationStatus();\r
1110                         os.setOperation(actionNm);\r
1111                         os.setOperationContent("");\r
1112                         os.setOperationId(operationId);\r
1113                         os.setProgress("0");\r
1114                         os.setReason("");\r
1115                         os.setResult("processing");\r
1116                         os.setServiceId(serviceId);\r
1117                         // TODO : to be updated...\r
1118                         os.setUserId("");\r
1119                         Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());\r
1120                         Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());\r
1121                         os.setFinishedAt(endTimeStamp);\r
1122                         os.setOperateAt(startTimeStamp);\r
1123 \r
1124                         session.save(os);\r
1125                         session.getTransaction().commit();\r
1126 \r
1127                 } catch (Exception e) {\r
1128                         msoLogger.error(MessageEnum.APIH_DB_INSERT_EXC, "", "",\r
1129                                         MsoLogger.ErrorCode.DataError,\r
1130                                         "Exception when creation record request in Operation", e);\r
1131                         throw new MsoDatabaseException(\r
1132                                         "Data did inserted in Operatus Status Table", e);\r
1133                 } finally {\r
1134                         if (null != session) {\r
1135                                 session.close();\r
1136                         }\r
1137                 }\r
1138         }\r
1139 \r
1140         private OperationStatus chkSvcInstOperStatusbySvcId(String serviceId) {\r
1141                 OperationStatus svcInstanceOperStatus = (RequestsDatabase.getInstance())\r
1142                                 .getOperationStatusByServiceId(serviceId);\r
1143 \r
1144                 return svcInstanceOperStatus;\r
1145         }\r
1146 \r
1147         private OperationStatus chkDuplicateServiceNameInOperStatus(\r
1148                         String serviceName) {\r
1149                 OperationStatus dupServiceName = (RequestsDatabase.getInstance())\r
1150                                 .getOperationStatusByServiceName(serviceName);\r
1151 \r
1152                 return dupServiceName;\r
1153         }\r
1154 }\r