cb3e8e6a82a24960d6acb738add6d2c75f3486b7
[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                 String serviceId = instanceIdMap.get("serviceId");\r
541 \r
542                 MsoRequest msoRequest = new MsoRequest(requestId);\r
543                 ObjectMapper mapper = new ObjectMapper();\r
544                 try {\r
545                         e2eSir = mapper.readValue(requestJSON, E2EServiceInstanceRequest.class);\r
546 \r
547                 } catch (Exception e) {\r
548           \r
549                         msoLogger.debug("Mapping of request to JSON object failed : ", e);\r
550                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,\r
551                                         MsoException.ServiceException, "Mapping of request to JSON object failed.  " + e.getMessage(),\r
552                                         ErrorNumbers.SVC_BAD_PARAMETER, null);\r
553                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
554                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);\r
555                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,\r
556                                         "Mapping of request to JSON object failed");\r
557                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
558                         return response;\r
559                 }\r
560 \r
561                 mapReqJsonToSvcInstReq(e2eSir, requestJSON);\r
562                 sir.getRequestDetails().getRequestParameters().setaLaCarte(true);\r
563                 try {\r
564                         msoRequest.parse(sir, instanceIdMap, action, version, requestJSON);\r
565                 } catch (Exception e) {\r
566                         msoLogger.debug("Validation failed: ", e);\r
567                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,\r
568                                         MsoException.ServiceException, "Error parsing request.  " + e.getMessage(),\r
569                                         ErrorNumbers.SVC_BAD_PARAMETER, null);\r
570                         if (msoRequest.getRequestId() != null) {\r
571                                 msoLogger.debug("Logging failed message to the database");\r
572                         }\r
573                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
574                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);\r
575                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,\r
576                                         "Validation of the input request failed");\r
577                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
578                         return response;\r
579                 }\r
580                 \r
581                 //check for the current operation status\r
582 //              Response resp = checkE2ESvcInstStatus(action, serviceId, startTime, msoRequest);\r
583 //              if(resp != null && resp.getStatus() != 200) {\r
584 //                      return resp;\r
585 //              }\r
586                 \r
587                 CatalogDatabase db = null;\r
588                 RecipeLookupResult recipeLookupResult = null;\r
589                 try {\r
590                         db = CatalogDatabase.getInstance();\r
591                         recipeLookupResult = getServiceInstanceOrchestrationURI(db, e2eSir.getService().getServiceUuid(), action);\r
592                 } catch (Exception e) {\r
593                         msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",\r
594                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);\r
595                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
596                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,\r
597                                         MsoException.ServiceException, "No communication to catalog DB " + e.getMessage(),\r
598                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
599                         alarmLogger.sendAlarm("MsoDatabaseAccessError", MsoAlarmLogger.CRITICAL,\r
600                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));\r
601                         \r
602                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
603                                         "Exception while communciate with DB");\r
604                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());\r
605                         \r
606                         return response;\r
607                 } finally {\r
608                         closeCatalogDB(db);\r
609                 }\r
610 \r
611                 if (recipeLookupResult == null) {\r
612                         msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "",\r
613                                         MsoLogger.ErrorCode.DataError, "No recipe found in DB");\r
614                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
615                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,\r
616                                         MsoException.ServiceException, "Recipe does not exist in catalog DB",\r
617                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);\r
618                 \r
619                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound,\r
620                                         "No recipe found in DB");\r
621                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());\r
622 \r
623                         return response;\r
624                 }\r
625 \r
626                 String serviceInstanceType = e2eSir.getService().getServiceType();\r
627 \r
628                 RequestClient requestClient = null;\r
629                 HttpResponse response = null;\r
630 \r
631                 long subStartTime = System.currentTimeMillis();\r
632                 String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);\r
633 \r
634                 try {\r
635                         requestClient = RequestClientFactory.getRequestClient(recipeLookupResult.getOrchestrationURI(),\r
636                                         MsoPropertiesUtils.loadMsoProperties());\r
637 \r
638                         // Capture audit event\r
639                         msoLogger.debug("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl());\r
640 \r
641                         response = requestClient.post(requestId, false, recipeLookupResult.getRecipeTimeout(), action.name(),\r
642                                         serviceId, null, null, null, null, null, serviceInstanceType, null, null, null, sirRequestJson,\r
643                                         recipeLookupResult.getRecipeParamXsd());\r
644 \r
645                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,\r
646                                         "Successfully received response from BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI(),\r
647                                         null);\r
648                 } catch (Exception e) {\r
649                         msoLogger.debug("Exception while communicate with BPMN engine", e);\r
650                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR,\r
651                                         MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN",\r
652                                         recipeLookupResult.getOrchestrationURI(), null);\r
653                         Response getBPMNResp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,\r
654                                         MsoException.ServiceException, "Failed calling bpmn " + e.getMessage(),\r
655                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
656                         alarmLogger.sendAlarm("MsoConfigurationError", MsoAlarmLogger.CRITICAL,\r
657                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_BPEL));\r
658                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
659                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");\r
660                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,\r
661                                         "Exception while communicate with BPMN engine");\r
662                         msoLogger.debug("End of the transaction, the final response is: " + (String) getBPMNResp.getEntity());\r
663 \r
664                         return getBPMNResp;\r
665                 }\r
666 \r
667                 if (response == null) {\r
668                         Response getBPMNResp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,\r
669                                         MsoException.ServiceException, "bpelResponse is null", ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
670                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
671                                         MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");\r
672                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError,\r
673                                         "Null response from BPMN");\r
674                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) getBPMNResp.getEntity());\r
675 \r
676                         return getBPMNResp;\r
677                 }\r
678 \r
679                 ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());\r
680                 int bpelStatus = respHandler.getStatus();\r
681 \r
682                 return beplStatusUpdate(serviceId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action, instanceIdMap);\r
683         }\r
684 \r
685         private Response checkE2ESvcInstStatus(Action action, String serviceId, long startTime, MsoRequest msoRequest) {\r
686                 OperationStatus curStatus = null;\r
687 //              String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();\r
688                 String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();\r
689                 try {\r
690                         if (!(serviceId == null && "service".equals(requestScope) && (action == Action.updateInstance))) {                          \r
691                                 curStatus = chkSvcInstOperStatusbySvcId(serviceId);\r
692                         }\r
693                 } catch (Exception e) {\r
694                         msoLogger.error(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",\r
695                                         MsoLogger.ErrorCode.DataError, "Error during current operation status check ", e);\r
696 \r
697                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,\r
698                                         MsoException.ServiceException, e.getMessage(), ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);\r
699 \r
700                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
701                                         "Error during current operation status check");\r
702                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
703                         return response;\r
704                 }\r
705 \r
706                 if (curStatus != null && curStatus.getResult() != null && curStatus.getResult().equalsIgnoreCase("processing")) {\r
707                         String chkMessage = "Error: Locked instance - This " + requestScope + " (" + serviceId + ") "\r
708                                         + "now being worked with a status of " + curStatus.getResult() \r
709                                         + ". The latest workflow of instance must be finished or cleaned up.";\r
710 \r
711                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT,\r
712                                         MsoException.ServiceException, chkMessage, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);\r
713 \r
714                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict,\r
715                                         chkMessage);\r
716 \r
717                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
718 \r
719                         return response;\r
720                 }\r
721                 \r
722                 return Response.status(200).entity(null).build();\r
723         }\r
724         \r
725         private Response processE2EserviceInstances(String requestJSON, Action action,\r
726                         HashMap<String, String> instanceIdMap, String version) {\r
727 \r
728                 String requestId = UUIDChecker.generateUUID(msoLogger);\r
729                 long startTime = System.currentTimeMillis();\r
730                 msoLogger.debug("requestId is: " + requestId);\r
731                 E2EServiceInstanceRequest e2eSir = null;\r
732 \r
733                 MsoRequest msoRequest = new MsoRequest(requestId);\r
734                 ObjectMapper mapper = new ObjectMapper();\r
735                 try {\r
736                         e2eSir = mapper.readValue(requestJSON, E2EServiceInstanceRequest.class);\r
737 \r
738                 } catch (Exception e) {\r
739           //TODO update the service name\r
740           this.createOperationStatusRecordForError(action, requestId);\r
741                   \r
742                         msoLogger.debug("Mapping of request to JSON object failed : ", e);\r
743                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,\r
744                                         MsoException.ServiceException, "Mapping of request to JSON object failed.  " + e.getMessage(),\r
745                                         ErrorNumbers.SVC_BAD_PARAMETER, null);\r
746                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
747                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);\r
748                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,\r
749                                         "Mapping of request to JSON object failed");\r
750                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
751                         return response;\r
752                 }\r
753 \r
754                 mapReqJsonToSvcInstReq(e2eSir, requestJSON);\r
755                 sir.getRequestDetails().getRequestParameters().setaLaCarte(true);\r
756                 try {\r
757                         msoRequest.parse(sir, instanceIdMap, action, version, requestJSON);\r
758                 } catch (Exception e) {\r
759                         msoLogger.debug("Validation failed: ", e);\r
760                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST,\r
761                                         MsoException.ServiceException, "Error parsing request.  " + e.getMessage(),\r
762                                         ErrorNumbers.SVC_BAD_PARAMETER, null);\r
763                         if (msoRequest.getRequestId() != null) {\r
764                                 msoLogger.debug("Logging failed message to the database");\r
765                                 //TODO update the service name\r
766                           this.createOperationStatusRecordForError(action, requestId);\r
767                         }\r
768                         msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
769                                         MsoLogger.ErrorCode.SchemaError, requestJSON, e);\r
770                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError,\r
771                                         "Validation of the input request failed");\r
772                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
773                         return response;\r
774                 }\r
775                 \r
776                 OperationStatus dup = null;\r
777                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();\r
778                 String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();\r
779                 try {\r
780                         if (!(instanceName == null && "service".equals(requestScope)\r
781                                         && (action == Action.createInstance || action == Action.activateInstance))) {\r
782                           //TODO : Need to check for the duplicate record from the operation status,\r
783                           //TODO : commenting this check for unblocking current testing for now...  induces dead code...\r
784                                 dup = chkDuplicateServiceNameInOperStatus( instanceName);\r
785                         }\r
786                 } catch (Exception e) {\r
787                         msoLogger.error(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",\r
788                                         MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);\r
789 \r
790                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,\r
791                                         MsoException.ServiceException, e.getMessage(), ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);\r
792 \r
793                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
794                                         "Error during duplicate check");\r
795                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
796                         return response;\r
797                 }\r
798 \r
799                 if (dup != null) {\r
800                         // Found the duplicate record. Return the appropriate error.\r
801                         String instance = null;\r
802                         if (instanceName != null) {\r
803                                 instance = instanceName;\r
804                         } else {\r
805                                 instance = instanceIdMap.get(requestScope + "InstanceId");\r
806                         }\r
807                         String dupMessage = "Error: Locked instance - This " + requestScope + " (" + instance + ") "\r
808                                         + "already has a request being worked with a status of " + dup.getProgress() + " (ServiceId - "\r
809                                         + dup.getServiceId() + "). The existing request must finish or be cleaned up before proceeding.";\r
810 \r
811                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT,\r
812                                         MsoException.ServiceException, dupMessage, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, null);\r
813 \r
814                         msoLogger.warn(MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError,\r
815                                         "Duplicate request - Subscriber already has a request for this service");\r
816                         \r
817                         \r
818                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict,\r
819                                         dupMessage);\r
820                         msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
821                         createOperationStatusRecordForError(action, requestId);\r
822                         return response;\r
823                 }\r
824                 \r
825                 CatalogDatabase db = null;\r
826                 RecipeLookupResult recipeLookupResult = null;\r
827                 try {\r
828                         db = CatalogDatabase.getInstance();\r
829                         recipeLookupResult = getServiceInstanceOrchestrationURI(db, e2eSir.getService().getServiceUuid(), action);\r
830                 } catch (Exception e) {\r
831                         msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "",\r
832                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);\r
833                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
834                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,\r
835                                         MsoException.ServiceException, "No communication to catalog DB " + e.getMessage(),\r
836                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
837                         alarmLogger.sendAlarm("MsoDatabaseAccessError", MsoAlarmLogger.CRITICAL,\r
838                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));\r
839                         \r
840                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
841                                         "Exception while communciate with DB");\r
842                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());\r
843                         createOperationStatusRecordForError(action, requestId);\r
844                         return response;\r
845                 } finally {\r
846                         closeCatalogDB(db);\r
847                 }\r
848 \r
849                 if (recipeLookupResult == null) {\r
850                         msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "",\r
851                                         MsoLogger.ErrorCode.DataError, "No recipe found in DB");\r
852                         msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
853                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,\r
854                                         MsoException.ServiceException, "Recipe does not exist in catalog DB",\r
855                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);\r
856                 \r
857                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound,\r
858                                         "No recipe found in DB");\r
859                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) response.getEntity());\r
860                         createOperationStatusRecordForError(action, requestId);\r
861                         return response;\r
862                 }\r
863 //              try {\r
864 //                      msoRequest.createRequestRecord(Status.PENDING, action);\r
865 //                      //createOperationStatusRecord(action, requestId);\r
866 //              } catch (Exception e) {\r
867 //                      msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "",\r
868 //                                      MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);\r
869 //                      msoRequest.setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
870 //                      Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,\r
871 //                                      MsoException.ServiceException, "Exception while creating record in DB " + e.getMessage(),\r
872 //                                      ErrorNumbers.SVC_BAD_PARAMETER, null);\r
873 //                      msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError,\r
874 //                                      "Exception while creating record in DB");\r
875 //                      msoLogger.debug("End of the transaction, the final response is: " + (String) response.getEntity());\r
876 //                      return response;\r
877 //              }\r
878 \r
879                 String serviceInstanceType = e2eSir.getService().getServiceType();\r
880 \r
881                 String serviceId = "";\r
882                 RequestClient requestClient = null;\r
883                 HttpResponse response = null;\r
884 \r
885                 long subStartTime = System.currentTimeMillis();\r
886                 String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);\r
887 \r
888                 try {\r
889                         requestClient = RequestClientFactory.getRequestClient(recipeLookupResult.getOrchestrationURI(),\r
890                                         MsoPropertiesUtils.loadMsoProperties());\r
891 \r
892                         // Capture audit event\r
893                         msoLogger.debug("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl());\r
894 \r
895                         response = requestClient.post(requestId, false, recipeLookupResult.getRecipeTimeout(), action.name(),\r
896                                         serviceId, null, null, null, null, null, serviceInstanceType, null, null, null, sirRequestJson,\r
897                                         recipeLookupResult.getRecipeParamXsd());\r
898 \r
899                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,\r
900                                         "Successfully received response from BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI(),\r
901                                         null);\r
902                 } catch (Exception e) {\r
903                         msoLogger.recordMetricEvent(subStartTime, MsoLogger.StatusCode.ERROR,\r
904                                         MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN",\r
905                                         recipeLookupResult.getOrchestrationURI(), null);\r
906                         Response resp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,\r
907                                         MsoException.ServiceException, "Failed calling bpmn " + e.getMessage(),\r
908                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
909                         alarmLogger.sendAlarm("MsoConfigurationError", MsoAlarmLogger.CRITICAL,\r
910                                         Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_BPEL));\r
911                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
912                                         MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");\r
913                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError,\r
914                                         "Exception while communicate with BPMN engine");\r
915                         msoLogger.debug("End of the transaction, the final response is: " + (String) resp.getEntity());\r
916                         createOperationStatusRecordForError(action, requestId);\r
917                         return resp;\r
918                 }\r
919 \r
920                 if (response == null) {\r
921                         Response resp = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_GATEWAY,\r
922                                         MsoException.ServiceException, "bpelResponse is null", ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
923                         msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "",\r
924                                         MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");\r
925                         msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError,\r
926                                         "Null response from BPMN");\r
927                         msoLogger.debug(END_OF_THE_TRANSACTION + (String) resp.getEntity());\r
928                         return resp;\r
929                 }\r
930 \r
931                 ResponseHandler respHandler = new ResponseHandler(response, requestClient.getType());\r
932                 int bpelStatus = respHandler.getStatus();\r
933 \r
934                 return beplStatusUpdate(requestId, startTime, msoRequest, requestClient, respHandler, bpelStatus, action, instanceIdMap);\r
935         }\r
936 \r
937    private Response scaleE2EserviceInstances(String requestJSON,\r
938                                                Action action, HashMap<String, String> instanceIdMap, String version) {\r
939 \r
940         String requestId = instanceIdMap.get("serviceId");\r
941         long startTime = System.currentTimeMillis();\r
942         msoLogger.debug("requestId is: " + requestId);\r
943                 E2EServiceInstanceScaleRequest e2eScaleReq = null;\r
944 \r
945         MsoRequest msoRequest = new MsoRequest(requestId);\r
946 \r
947         ObjectMapper mapper = new ObjectMapper();\r
948         try {\r
949                 e2eScaleReq = mapper.readValue(requestJSON,\r
950                                         E2EServiceInstanceScaleRequest.class);\r
951 \r
952         } catch (Exception e) {\r
953 \r
954             msoLogger.debug("Mapping of request to JSON object failed : ", e);\r
955             Response response = msoRequest.buildServiceErrorResponse(\r
956                     HttpStatus.SC_BAD_REQUEST,\r
957                     MsoException.ServiceException,\r
958                     "Mapping of request to JSON object failed.  "\r
959                             + e.getMessage(), ErrorNumbers.SVC_BAD_PARAMETER,\r
960                     null);\r
961             msoLogger.error(MessageEnum.APIH_REQUEST_VALIDATION_ERROR,\r
962                     MSO_PROP_APIHANDLER_INFRA, "", "",\r
963                     MsoLogger.ErrorCode.SchemaError, requestJSON, e);\r
964             msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,\r
965                     MsoLogger.ResponseCode.SchemaError,\r
966                     "Mapping of request to JSON object failed");\r
967             msoLogger.debug("End of the transaction, the final response is: "\r
968                     + (String) response.getEntity());\r
969             createOperationStatusRecordForError(action, requestId);\r
970             return response;\r
971         }\r
972 \r
973         CatalogDatabase db = null;\r
974         RecipeLookupResult recipeLookupResult = null;\r
975         try {\r
976             db = CatalogDatabase.getInstance();\r
977                         //TODO  Get the service template model version uuid from AAI.\r
978                         recipeLookupResult = getServiceInstanceOrchestrationURI(db, null, action);\r
979         } catch (Exception e) {\r
980             msoLogger.error(MessageEnum.APIH_DB_ACCESS_EXC,\r
981                     MSO_PROP_APIHANDLER_INFRA, "", "",\r
982                     MsoLogger.ErrorCode.AvailabilityError,\r
983                     "Exception while communciate with Catalog DB", e);\r
984             msoRequest\r
985                     .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
986             Response response = msoRequest.buildServiceErrorResponse(\r
987                     HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,\r
988                     "No communication to catalog DB " + e.getMessage(),\r
989                     ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
990             alarmLogger.sendAlarm("MsoDatabaseAccessError",\r
991                     MsoAlarmLogger.CRITICAL, Messages.errors\r
992                             .get(ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));\r
993             msoRequest.createRequestRecord(Status.FAILED, action);\r
994             msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,\r
995                     MsoLogger.ResponseCode.DBAccessError,\r
996                     "Exception while communciate with DB");\r
997             msoLogger.debug(END_OF_THE_TRANSACTION\r
998                     + (String) response.getEntity());\r
999             return response;\r
1000         } finally {\r
1001             closeCatalogDB(db);\r
1002         }\r
1003         if (recipeLookupResult == null) {\r
1004             msoLogger.error(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND,\r
1005                     MSO_PROP_APIHANDLER_INFRA, "", "",\r
1006                     MsoLogger.ErrorCode.DataError, "No recipe found in DB");\r
1007             msoRequest\r
1008                     .setStatus(org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);\r
1009             Response response = msoRequest.buildServiceErrorResponse(\r
1010                     HttpStatus.SC_NOT_FOUND, MsoException.ServiceException,\r
1011                     "Recipe does not exist in catalog DB",\r
1012                     ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);\r
1013             msoRequest.createRequestRecord(Status.FAILED, action);\r
1014             msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,\r
1015                     MsoLogger.ResponseCode.DataNotFound,\r
1016                     "No recipe found in DB");\r
1017             msoLogger.debug(END_OF_THE_TRANSACTION\r
1018                     + (String) response.getEntity());\r
1019             createOperationStatusRecordForError(action, requestId);\r
1020             return response;\r
1021         }\r
1022 \r
1023         RequestClient requestClient = null;\r
1024         HttpResponse response = null;\r
1025 \r
1026         long subStartTime = System.currentTimeMillis();\r
1027         // String sirRequestJson = mapReqJsonToSvcInstReq(e2eSir, requestJSON);\r
1028 \r
1029         try {\r
1030             requestClient = RequestClientFactory.getRequestClient(\r
1031                     recipeLookupResult.getOrchestrationURI(),\r
1032                     MsoPropertiesUtils.loadMsoProperties());\r
1033 \r
1034             JSONObject jjo = new JSONObject(requestJSON);\r
1035             jjo.put("operationId", UUIDChecker.generateUUID(msoLogger));\r
1036 \r
1037             String bpmnRequest = jjo.toString();\r
1038 \r
1039             // Capture audit event\r
1040             msoLogger\r
1041                     .debug("MSO API Handler Posting call to BPEL engine for url: "\r
1042                             + requestClient.getUrl());\r
1043             String serviceId = instanceIdMap.get("serviceId");\r
1044             String serviceInstanceType = e2eScaleReq.getService().getServiceType();\r
1045             response = requestClient.post(requestId, false,\r
1046                                         recipeLookupResult.getRecipeTimeout(), action.name(),\r
1047                                         serviceId, null, null, null, null, null, serviceInstanceType,\r
1048                                         null, null, null, bpmnRequest, recipeLookupResult.getRecipeParamXsd());\r
1049 \r
1050             msoLogger.recordMetricEvent(subStartTime,\r
1051                     MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,\r
1052                     "Successfully received response from BPMN engine", "BPMN",\r
1053                     recipeLookupResult.getOrchestrationURI(), null);\r
1054         } catch (Exception e) {\r
1055             msoLogger.recordMetricEvent(subStartTime,\r
1056                     MsoLogger.StatusCode.ERROR,\r
1057                     MsoLogger.ResponseCode.CommunicationError,\r
1058                     "Exception while communicate with BPMN engine", "BPMN",\r
1059                     recipeLookupResult.getOrchestrationURI(), null);\r
1060             Response resp = msoRequest.buildServiceErrorResponse(\r
1061                     HttpStatus.SC_BAD_GATEWAY, MsoException.ServiceException,\r
1062                     "Failed calling bpmn " + e.getMessage(),\r
1063                     ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
1064             alarmLogger.sendAlarm("MsoConfigurationError",\r
1065                     MsoAlarmLogger.CRITICAL,\r
1066                     Messages.errors.get(ErrorNumbers.NO_COMMUNICATION_TO_BPEL));\r
1067             msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR,\r
1068                     MSO_PROP_APIHANDLER_INFRA, "", "",\r
1069                     MsoLogger.ErrorCode.AvailabilityError,\r
1070                     "Exception while communicate with BPMN engine");\r
1071             msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,\r
1072                     MsoLogger.ResponseCode.CommunicationError,\r
1073                     "Exception while communicate with BPMN engine");\r
1074             msoLogger.debug("End of the transaction, the final response is: "\r
1075                     + (String) resp.getEntity());\r
1076             createOperationStatusRecordForError(action, requestId);\r
1077             return resp;\r
1078         }\r
1079 \r
1080         if (response == null) {\r
1081             Response resp = msoRequest.buildServiceErrorResponse(\r
1082                     HttpStatus.SC_BAD_GATEWAY, MsoException.ServiceException,\r
1083                     "bpelResponse is null",\r
1084                     ErrorNumbers.SVC_NO_SERVER_RESOURCES, null);\r
1085             msoLogger.error(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR,\r
1086                     MSO_PROP_APIHANDLER_INFRA, "", "",\r
1087                     MsoLogger.ErrorCode.BusinessProcesssError,\r
1088                     "Null response from BPEL");\r
1089             msoLogger.recordAuditEvent(startTime, MsoLogger.StatusCode.ERROR,\r
1090                     MsoLogger.ResponseCode.InternalError,\r
1091                     "Null response from BPMN");\r
1092             msoLogger.debug(END_OF_THE_TRANSACTION + (String) resp.getEntity());\r
1093             createOperationStatusRecordForError(action, requestId);\r
1094             return resp;\r
1095         }\r
1096 \r
1097         ResponseHandler respHandler = new ResponseHandler(response,\r
1098                 requestClient.getType());\r
1099         int bpelStatus = respHandler.getStatus();\r
1100 \r
1101         return beplStatusUpdate(requestId, startTime, msoRequest,\r
1102                 requestClient, respHandler, bpelStatus, action, instanceIdMap);\r
1103     }\r
1104 \r
1105         private void closeCatalogDB(CatalogDatabase db) {\r
1106                 if (db != null) {\r
1107                         db.close();\r
1108                 }\r
1109         }\r
1110 \r
1111         private Response beplStatusUpdate(String serviceId, long startTime,\r
1112                         MsoRequest msoRequest, RequestClient requestClient,\r
1113                         ResponseHandler respHandler, int bpelStatus, Action action,\r
1114                         HashMap<String, String> instanceIdMap) {\r
1115                 // BPMN accepted the request, the request is in progress\r
1116                 if (bpelStatus == HttpStatus.SC_ACCEPTED) {\r
1117                         String camundaJSONResponseBody = respHandler.getResponseBody();\r
1118                         msoLogger.debug("Received from Camunda: " + camundaJSONResponseBody);\r
1119 \r
1120                         // currently only for delete case we update the status here\r
1121                         if (action == Action.deleteInstance) {\r
1122                                 ObjectMapper mapper = new ObjectMapper();\r
1123                                 try {\r
1124                                         DelE2ESvcResp jo = mapper.readValue(\r
1125                                                         camundaJSONResponseBody, DelE2ESvcResp.class);\r
1126                                         String operationId = jo.getOperationId();\r
1127                                 this.createOperationStatusRecord("DELETE", serviceId,\r
1128                                                                 operationId);\r
1129                                 } catch (Exception ex) {\r
1130                                         msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,\r
1131                                                         requestClient.getUrl(), "", "",\r
1132                                                         MsoLogger.ErrorCode.BusinessProcesssError,\r
1133                                                         "Response from BPEL engine is failed with HTTP Status="\r
1134                                                                         + bpelStatus);\r
1135                                 }\r
1136                         }\r
1137                         \r
1138                         msoLogger.recordAuditEvent(startTime,\r
1139                                         MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc,\r
1140                                         "BPMN accepted the request, the request is in progress");\r
1141                         msoLogger.debug(END_OF_THE_TRANSACTION + camundaJSONResponseBody);\r
1142                         return Response.status(HttpStatus.SC_ACCEPTED)\r
1143                                         .entity(camundaJSONResponseBody).build();\r
1144                 } else {\r
1145                         List<String> variables = new ArrayList<>();\r
1146                         variables.add(bpelStatus + "");\r
1147                         String camundaJSONResponseBody = respHandler.getResponseBody();\r
1148                         if (camundaJSONResponseBody != null\r
1149                                         && !camundaJSONResponseBody.isEmpty()) {\r
1150                                 Response resp = msoRequest.buildServiceErrorResponse(\r
1151                                                 bpelStatus, MsoException.ServiceException,\r
1152                                                 "Request Failed due to BPEL error with HTTP Status= %1 "\r
1153                                                                 + '\n' + camundaJSONResponseBody,\r
1154                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR, variables);\r
1155                                 msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,\r
1156                                                 requestClient.getUrl(), "", "",\r
1157                                                 MsoLogger.ErrorCode.BusinessProcesssError,\r
1158                                                 "Response from BPEL engine is failed with HTTP Status="\r
1159                                                                 + bpelStatus);\r
1160                                 msoLogger.recordAuditEvent(startTime,\r
1161                                                 MsoLogger.StatusCode.ERROR,\r
1162                                                 MsoLogger.ResponseCode.InternalError,\r
1163                                                 "Response from BPMN engine is failed");\r
1164                                 msoLogger.debug(END_OF_THE_TRANSACTION\r
1165                                                 + (String) resp.getEntity());\r
1166                                 return resp;\r
1167                         } else {\r
1168                                 Response resp = msoRequest\r
1169                                                 .buildServiceErrorResponse(\r
1170                                                                 bpelStatus,\r
1171                                                                 MsoException.ServiceException,\r
1172                                                                 "Request Failed due to BPEL error with HTTP Status= %1",\r
1173                                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,\r
1174                                                                 variables);\r
1175                                 msoLogger.error(MessageEnum.APIH_BPEL_RESPONSE_ERROR,\r
1176                                                 requestClient.getUrl(), "", "",\r
1177                                                 MsoLogger.ErrorCode.BusinessProcesssError,\r
1178                                                 "Response from BPEL engine is empty");\r
1179                                 msoLogger.recordAuditEvent(startTime,\r
1180                                                 MsoLogger.StatusCode.ERROR,\r
1181                                                 MsoLogger.ResponseCode.InternalError,\r
1182                                                 "Response from BPEL engine is empty");\r
1183                                 msoLogger.debug(END_OF_THE_TRANSACTION\r
1184                                                 + (String) resp.getEntity());\r
1185                                 return resp;\r
1186                         }\r
1187                 }\r
1188         }\r
1189 \r
1190         /**\r
1191          * Getting recipes from catalogDb\r
1192          * \r
1193          * @param db the catalog db\r
1194          * @param serviceModelUUID the service model version uuid\r
1195          * @param action the action for the service\r
1196          * @return the service recipe result\r
1197          */\r
1198         private RecipeLookupResult getServiceInstanceOrchestrationURI(\r
1199                         CatalogDatabase db, String serviceModelUUID, Action action) {\r
1200 \r
1201                 RecipeLookupResult recipeLookupResult = getServiceURI(db, serviceModelUUID, action);\r
1202 \r
1203                 if (recipeLookupResult != null) {\r
1204                         msoLogger.debug("Orchestration URI is: "\r
1205                                         + recipeLookupResult.getOrchestrationURI()\r
1206                                         + ", recipe Timeout is: "\r
1207                                         + Integer.toString(recipeLookupResult.getRecipeTimeout()));\r
1208                 } else {\r
1209                         msoLogger.debug("No matching recipe record found");\r
1210                 }\r
1211                 return recipeLookupResult;\r
1212         }\r
1213 \r
1214         /**\r
1215          * Getting recipes from catalogDb\r
1216          * If Service recipe is not set, use default recipe, if set , use special recipe.\r
1217          * @param db the catalog db\r
1218          * @param serviceModelUUID the service version uuid\r
1219          * @param action the action of the service.\r
1220          * @return the service recipe result.\r
1221          */\r
1222         private RecipeLookupResult getServiceURI(CatalogDatabase db, String serviceModelUUID, Action action) {\r
1223 \r
1224                 String defaultServiceModelName = "UUI_DEFAULT";\r
1225 \r
1226                 Service defaultServiceRecord = db\r
1227                                 .getServiceByModelName(defaultServiceModelName);\r
1228                 ServiceRecipe defaultRecipe = db.getServiceRecipeByModelUUID(\r
1229                         defaultServiceRecord.getModelUUID(), action.name());\r
1230                 //set recipe as default generic recipe\r
1231                 ServiceRecipe recipe = defaultRecipe;\r
1232                 //check the service special recipe \r
1233                 if(null != serviceModelUUID && ! serviceModelUUID.isEmpty()){\r
1234                       ServiceRecipe serviceSpecialRecipe = db.getServiceRecipeByModelUUID(\r
1235                               serviceModelUUID, action.name());\r
1236                       if(null != serviceSpecialRecipe){\r
1237                           //set service special recipe.\r
1238                           recipe = serviceSpecialRecipe;\r
1239                       }\r
1240                 }       \r
1241                 \r
1242                 if (recipe == null) {\r
1243                         return null;\r
1244                 }\r
1245                 return new RecipeLookupResult(recipe.getOrchestrationUri(),\r
1246                                 recipe.getRecipeTimeout(), recipe.getServiceParamXSD());\r
1247 \r
1248         }\r
1249 \r
1250         /**\r
1251          * Converting E2EServiceInstanceRequest to ServiceInstanceRequest and\r
1252          * passing it to camunda engine.\r
1253          * \r
1254          * @param e2eSir\r
1255          * @return\r
1256          */\r
1257         private String mapReqJsonToSvcInstReq(E2EServiceInstanceRequest e2eSir,\r
1258                         String requestJSON) {\r
1259 \r
1260                 sir = new ServiceInstancesRequest();\r
1261 \r
1262                 String returnString = null;\r
1263                 RequestDetails requestDetails = new RequestDetails();\r
1264                 ModelInfo modelInfo = new ModelInfo();\r
1265 \r
1266                 // ModelInvariantId\r
1267                 modelInfo.setModelInvariantId(e2eSir.getService().getServiceInvariantUuid());\r
1268 \r
1269                 // modelNameVersionId\r
1270                 modelInfo.setModelNameVersionId(e2eSir.getService().getServiceUuid());\r
1271 \r
1272                 // String modelInfoValue =\r
1273                 // e2eSir.getService().getParameters().getNodeTemplateName();\r
1274                 // String[] arrayOfInfo = modelInfoValue.split(":");\r
1275                 // String modelName = arrayOfInfo[0];\r
1276                 // String modelVersion = arrayOfInfo[1];\r
1277 \r
1278                 // TODO: To ensure, if we dont get the values from the UUI\r
1279                 String modelName = "voLTE";\r
1280                 String modelVersion = "1.0";\r
1281                 // modelName\r
1282                 modelInfo.setModelName(modelName);\r
1283 \r
1284                 // modelVersion\r
1285                 modelInfo.setModelVersion(modelVersion);\r
1286 \r
1287                 // modelType\r
1288                 modelInfo.setModelType(ModelType.service);\r
1289 \r
1290                 // setting modelInfo to requestDetails\r
1291                 requestDetails.setModelInfo(modelInfo);\r
1292 \r
1293                 SubscriberInfo subscriberInfo = new SubscriberInfo();\r
1294 \r
1295                 // globalsubscriberId\r
1296                 subscriberInfo.setGlobalSubscriberId(e2eSir.getService().getGlobalSubscriberId());\r
1297 \r
1298                 // setting subscriberInfo to requestDetails\r
1299                 requestDetails.setSubscriberInfo(subscriberInfo);\r
1300 \r
1301                 RequestInfo requestInfo = new RequestInfo();\r
1302 \r
1303                 // instanceName\r
1304                 requestInfo.setInstanceName(e2eSir.getService().getName());\r
1305 \r
1306                 // source\r
1307                 requestInfo.setSource("UUI");\r
1308 \r
1309                 // suppressRollback\r
1310                 requestInfo.setSuppressRollback(true);\r
1311 \r
1312                 // setting requestInfo to requestDetails\r
1313                 requestDetails.setRequestInfo(requestInfo);\r
1314 \r
1315                 RequestParameters requestParameters = new RequestParameters();\r
1316 \r
1317                 // subscriptionServiceType\r
1318                 requestParameters.setSubscriptionServiceType("MOG");\r
1319 \r
1320                 // Userparams\r
1321                 List<E2EUserParam> userParams;\r
1322                 // userParams =\r
1323                 // e2eSir.getService().getParameters().getRequestParameters().getUserParams();\r
1324                 List<Map<String, Object>> userParamList = new ArrayList<>();\r
1325                 Map<String, Object> userParamMap = new HashMap<>();\r
1326                 // complete json request updated in the camunda\r
1327                 userParamMap.put("UUIRequest", requestJSON);\r
1328                 userParamMap.put("ServiceInstanceName", e2eSir.getService().getName());\r
1329 \r
1330                 // Map<String, String> userParamMap3 = null;\r
1331                 // for (E2EUserParam userp : userParams) {\r
1332                 // userParamMap.put(userp.getName(), userp.getValue());\r
1333                 //\r
1334                 // }\r
1335                 userParamList.add(userParamMap);\r
1336                 requestParameters.setUserParams(userParamList);\r
1337 \r
1338                 // setting requestParameters to requestDetails\r
1339                 requestDetails.setRequestParameters(requestParameters);\r
1340 \r
1341                 sir.setRequestDetails(requestDetails);\r
1342 \r
1343                 // converting to string\r
1344                 ObjectMapper mapper = new ObjectMapper();\r
1345                 try {\r
1346                         returnString = mapper.writeValueAsString(sir);\r
1347                 } catch (IOException e) {\r
1348                         msoLogger\r
1349                                         .debug("Exception while converting ServiceInstancesRequest object to string",\r
1350                                                         e);\r
1351                 }\r
1352 \r
1353                 return returnString;\r
1354         }\r
1355 \r
1356         private void createOperationStatusRecordForError(Action action,\r
1357                         String serviceId) throws MsoDatabaseException {\r
1358 \r
1359                 AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager();\r
1360 \r
1361                 Session session = null;\r
1362                 try {\r
1363 \r
1364                         session = requestsDbSessionFactoryManager.getSessionFactory()\r
1365                                         .openSession();\r
1366                         session.beginTransaction();\r
1367 \r
1368                         OperationStatus os = new OperationStatus();\r
1369                         os.setOperation(action.name());\r
1370                         os.setOperationContent("");\r
1371                         os.setOperationId("");\r
1372                         os.setProgress("100");\r
1373                         os.setReason("");\r
1374                         os.setResult("error");\r
1375                         os.setServiceId(serviceId);\r
1376                         os.setUserId("");\r
1377                         Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());\r
1378                         Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());\r
1379                         os.setFinishedAt(endTimeStamp);\r
1380                         os.setOperateAt(startTimeStamp);\r
1381 \r
1382                         session.save(os);\r
1383                         session.getTransaction().commit();\r
1384 \r
1385                 } catch (Exception e) {\r
1386                         msoLogger.error(MessageEnum.APIH_DB_INSERT_EXC, "", "",\r
1387                                         MsoLogger.ErrorCode.DataError,\r
1388                                         "Exception when creation record request in Operation", e);\r
1389                         throw new MsoDatabaseException(\r
1390                                         "Data did inserted in Operatus Status Table for failure", e);\r
1391                 } finally {\r
1392                         if (null != session) {\r
1393                                 session.close();\r
1394                         }\r
1395                 }\r
1396         }\r
1397 \r
1398         private void createOperationStatusRecord(String actionNm, String serviceId,\r
1399                         String operationId) throws MsoDatabaseException {\r
1400 \r
1401                 AbstractSessionFactoryManager requestsDbSessionFactoryManager = new RequestsDbSessionFactoryManager();\r
1402 \r
1403                 Session session = null;\r
1404                 try {\r
1405 \r
1406                         session = requestsDbSessionFactoryManager.getSessionFactory()\r
1407                                         .openSession();\r
1408                         session.beginTransaction();\r
1409 \r
1410                         OperationStatus os = new OperationStatus();\r
1411                         os.setOperation(actionNm);\r
1412                         os.setOperationContent("");\r
1413                         os.setOperationId(operationId);\r
1414                         os.setProgress("0");\r
1415                         os.setReason("");\r
1416                         os.setResult("processing");\r
1417                         os.setServiceId(serviceId);\r
1418                         // TODO : to be updated...\r
1419                         os.setUserId("");\r
1420                         Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());\r
1421                         Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());\r
1422                         os.setFinishedAt(endTimeStamp);\r
1423                         os.setOperateAt(startTimeStamp);\r
1424 \r
1425                         session.save(os);\r
1426                         session.getTransaction().commit();\r
1427 \r
1428                 } catch (Exception e) {\r
1429                         msoLogger.error(MessageEnum.APIH_DB_INSERT_EXC, "", "",\r
1430                                         MsoLogger.ErrorCode.DataError,\r
1431                                         "Exception when creation record request in Operation", e);\r
1432                         throw new MsoDatabaseException(\r
1433                                         "Data did inserted in Operatus Status Table", e);\r
1434                 } finally {\r
1435                         if (null != session) {\r
1436                                 session.close();\r
1437                         }\r
1438                 }\r
1439         }\r
1440 \r
1441         private OperationStatus chkSvcInstOperStatusbySvcId(String serviceId) {\r
1442                 OperationStatus svcInstanceOperStatus = (RequestsDatabase.getInstance())\r
1443                                 .getOperationStatusByServiceId(serviceId);\r
1444 \r
1445                 return svcInstanceOperStatus;\r
1446         }\r
1447 \r
1448         private OperationStatus chkDuplicateServiceNameInOperStatus(\r
1449                         String serviceName) {\r
1450                 OperationStatus dupServiceName = (RequestsDatabase.getInstance())\r
1451                                 .getOperationStatusByServiceName(serviceName);\r
1452 \r
1453                 return dupServiceName;\r
1454         }\r
1455 }\r