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