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