2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
20 package org.openecomp.mso.apihandlerinfra;
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.List;
26 import javax.ws.rs.Consumes;
27 import javax.ws.rs.DELETE;
28 import javax.ws.rs.POST;
29 import javax.ws.rs.PUT;
30 import javax.ws.rs.Path;
31 import javax.ws.rs.PathParam;
32 import javax.ws.rs.Produces;
33 import javax.ws.rs.core.MediaType;
34 import javax.ws.rs.core.Response;
36 import org.apache.http.HttpResponse;
37 import org.apache.http.HttpStatus;
38 import org.codehaus.jackson.map.ObjectMapper;
40 import org.openecomp.mso.apihandler.common.ErrorNumbers;
41 import org.openecomp.mso.apihandler.common.RequestClient;
42 import org.openecomp.mso.apihandler.common.RequestClientFactory;
43 import org.openecomp.mso.apihandler.common.ResponseHandler;
44 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstance;
45 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstanceList;
46 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestReferences;
47 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesRequest;
48 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesResponse;
49 import org.openecomp.mso.db.catalog.CatalogDatabase;
50 import org.openecomp.mso.db.catalog.beans.Recipe;
51 import org.openecomp.mso.db.catalog.beans.Service;
52 import org.openecomp.mso.db.catalog.beans.ServiceRecipe;
53 import org.openecomp.mso.db.catalog.beans.VfModule;
54 import org.openecomp.mso.db.catalog.beans.VnfComponentsRecipe;
55 import org.openecomp.mso.db.catalog.beans.VnfRecipe;
56 import org.openecomp.mso.logger.MessageEnum;
57 import org.openecomp.mso.logger.MsoAlarmLogger;
58 import org.openecomp.mso.logger.MsoLogger;
59 import org.openecomp.mso.properties.MsoJavaProperties;
60 import org.openecomp.mso.properties.MsoPropertiesFactory;
61 import org.openecomp.mso.requestsdb.InfraActiveRequests;
62 import org.openecomp.mso.requestsdb.RequestsDatabase;
63 import org.openecomp.mso.utils.UUIDChecker;
65 @Path("/serviceInstances/v2")
66 public class ServiceInstances {
68 private HashMap<String, String> instanceIdMap = new HashMap<String,String>();
70 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
72 private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
74 public final static String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
76 private static MsoJavaProperties props = MsoPropertiesUtils.loadMsoProperties ();
81 public ServiceInstances() {
82 // TODO Auto-generated constructor stub
87 @Consumes(MediaType.APPLICATION_JSON)
88 @Produces(MediaType.APPLICATION_JSON)
89 public Response createServiceInstance(String request) {
91 Response response = serviceInstances(request, Action.createInstance, null);
97 @Path("/{serviceInstanceId}")
98 @Consumes(MediaType.APPLICATION_JSON)
99 @Produces(MediaType.APPLICATION_JSON)
100 public Response deleteServiceInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId) {
102 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
103 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
108 @Path("/{serviceInstanceId}/vnfs")
109 @Consumes(MediaType.APPLICATION_JSON)
110 @Produces(MediaType.APPLICATION_JSON)
111 public Response createVnfInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId) {
113 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
114 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
120 @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}")
121 @Consumes(MediaType.APPLICATION_JSON)
122 @Produces(MediaType.APPLICATION_JSON)
123 public Response deleteVnfInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
124 @PathParam("vnfInstanceId") String vnfInstanceId) {
126 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
127 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
128 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
134 @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
135 @Consumes(MediaType.APPLICATION_JSON)
136 @Produces(MediaType.APPLICATION_JSON)
137 public Response createVfModuleInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
138 @PathParam("vnfInstanceId") String vnfInstanceId) {
140 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
141 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
142 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
148 @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
149 @Consumes(MediaType.APPLICATION_JSON)
150 @Produces(MediaType.APPLICATION_JSON)
151 public Response updateVfModuleInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
152 @PathParam("vnfInstanceId") String vnfInstanceId,
153 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
155 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
156 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
157 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
158 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap);
164 @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
165 @Consumes(MediaType.APPLICATION_JSON)
166 @Produces(MediaType.APPLICATION_JSON)
167 public Response deleteVfModuleInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
168 @PathParam("vnfInstanceId") String vnfInstanceId,
169 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
172 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
173 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
174 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
175 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
182 @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
183 @Consumes(MediaType.APPLICATION_JSON)
184 @Produces(MediaType.APPLICATION_JSON)
185 public Response createVolumeGroupInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
186 @PathParam("vnfInstanceId") String vnfInstanceId) {
188 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
189 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
190 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
196 @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
197 @Consumes(MediaType.APPLICATION_JSON)
198 @Produces(MediaType.APPLICATION_JSON)
199 public Response updateVolumeGroupInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
200 @PathParam("vnfInstanceId") String vnfInstanceId,
201 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
204 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
205 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
206 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
207 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap);
213 @Path("/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
214 @Consumes(MediaType.APPLICATION_JSON)
215 @Produces(MediaType.APPLICATION_JSON)
216 public Response deleteVolumeGroupInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
217 @PathParam("vnfInstanceId") String vnfInstanceId,
218 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
221 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
222 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
223 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
224 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
230 @Path("/{serviceInstanceId}/networks")
231 @Consumes(MediaType.APPLICATION_JSON)
232 @Produces(MediaType.APPLICATION_JSON)
233 public Response createNetworkInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId) {
235 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
236 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
242 @Path("/{serviceInstanceId}/networks/{networkInstanceId}")
243 @Consumes(MediaType.APPLICATION_JSON)
244 @Produces(MediaType.APPLICATION_JSON)
245 public Response updateNetworkInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
246 @PathParam("networkInstanceId") String networkInstanceId) {
248 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
249 instanceIdMap.put("networkInstanceId", networkInstanceId);
250 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap);
256 @Path("/{serviceInstanceId}/networks/{networkInstanceId}")
257 @Consumes(MediaType.APPLICATION_JSON)
258 @Produces(MediaType.APPLICATION_JSON)
259 public Response deleteNetworkInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
260 @PathParam("networkInstanceId") String networkInstanceId) {
262 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
263 instanceIdMap.put("networkInstanceId", networkInstanceId);
264 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
271 private Response serviceInstances(String requestJSON, Action action, HashMap<String,String> instanceIdMap) {
273 String requestId = UUIDChecker.generateUUID(msoLogger);
274 long startTime = System.currentTimeMillis ();
275 msoLogger.debug ("requestId is: " + requestId);
276 ServiceInstancesRequest sir = null;
278 MsoRequest msoRequest = new MsoRequest (requestId);
282 ObjectMapper mapper = new ObjectMapper();
283 sir = mapper.readValue(requestJSON, ServiceInstancesRequest.class);
285 } catch(Exception e){
286 msoLogger.debug ("Mapping of request to JSON object failed : ", e);
287 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
288 "Mapping of request to JSON object failed. " + e.getMessage(),
289 ErrorNumbers.SVC_BAD_PARAMETER, null);
290 if (msoRequest.getRequestId () != null) {
291 msoLogger.debug ("Mapping of request to JSON object failed");
292 msoRequest.createRequestRecord (Status.FAILED, action);
294 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
295 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed");
296 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
302 msoRequest.parse(sir, instanceIdMap, action);
303 } catch (Exception e) {
304 msoLogger.debug ("Validation failed: ", e);
305 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
306 "Error parsing request. " + e.getMessage(),
307 ErrorNumbers.SVC_BAD_PARAMETER, null);
308 if (msoRequest.getRequestId () != null) {
309 msoLogger.debug ("Logging failed message to the database");
310 msoRequest.createRequestRecord (Status.FAILED, action);
312 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
313 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
314 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
318 InfraActiveRequests dup = null;
319 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
320 String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
322 dup = RequestsDatabase.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
324 } catch (Exception e) {
325 msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
327 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
329 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
333 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check");
334 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
339 // Found the duplicate record. Return the appropriate error.
340 String instance = null;
341 if(instanceName != null){
342 instance = instanceName;
344 instance = instanceIdMap.get(requestScope + "InstanceId");
346 String dupMessage = "Error: Locked instance - This " + requestScope + " (" + instance + ") " + "already has a request being worked with a status of " + dup.getRequestStatus() + " (RequestId - " + dup.getRequestId() + "). The existing request must finish or be cleaned up before proceeding.";
347 //List<String> variables = new ArrayList<String>();
348 //variables.add(dup.getRequestStatus());
350 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException,
352 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
356 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, "Duplicate request - Subscriber already has a request for this service");
357 msoRequest.createRequestRecord (Status.FAILED, action);
358 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage);
359 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
364 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
366 RequestReferences referencesResponse = new RequestReferences();
368 referencesResponse.setRequestId(requestId);
370 serviceResponse.setRequestReferences(referencesResponse);
372 try (CatalogDatabase db = new CatalogDatabase()){
374 RecipeLookupResult recipeLookupResult = null;
376 recipeLookupResult = getServiceInstanceOrchestrationURI (db, msoRequest, action);
377 } catch (Exception e) {
378 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Exception while querying Catalog DB", e);
379 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
380 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
381 MsoException.ServiceException,
382 "Recipe could not be retrieved from catalog DB " + e.getMessage (),
383 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
385 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
386 MsoAlarmLogger.CRITICAL,
387 Messages.errors.get (ErrorNumbers.ERROR_FROM_CATALOG_DB));
388 msoRequest.createRequestRecord (Status.FAILED,action);
389 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while querying Catalog DB");
390 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
395 if (recipeLookupResult == null) {
396 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
397 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
398 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
399 MsoException.ServiceException,
400 "Recipe does not exist in catalog DB",
401 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
403 msoRequest.createRequestRecord (Status.FAILED, action);
404 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
405 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
411 Boolean isBaseVfModule = false;
413 if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule)) {
414 String asdcServiceModelVersion = msoRequest.getAsdcServiceModelVersion ();
416 // Get VF Module-specific base module indicator
419 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
420 vfm = db.getVfModuleType (msoRequest.getVfModuleType (), asdcServiceModelVersion);
423 vfm = db.getVfModuleType (msoRequest.getVfModuleType ());
427 if (vfm.getIsBase() == 1) {
428 isBaseVfModule = true;
431 else if (action == Action.createInstance || action == Action.updateInstance){
432 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
433 // This request cannot proceed
434 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "VF Module Type", "", MsoLogger.ErrorCode.DataError, "No VfModuleType found in DB");
435 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
436 String serviceVersionText = "";
437 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
438 serviceVersionText = " with version " + asdcServiceModelVersion;
440 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
441 MsoException.ServiceException,
442 "VnfType " + msoRequest.getVnfType () + " and VF Module Model Name " + msoRequest.getVfModuleModelName() + serviceVersionText + " not found in MSO Catalog DB",
443 ErrorNumbers.SVC_BAD_PARAMETER,
445 msoRequest.createRequestRecord (Status.FAILED, action);
446 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No matching vfModuleType found in DB");
447 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
455 String serviceInstanceId = "";
457 String vfModuleId = "";
458 String volumeGroupId = "";
459 String networkId = "";
460 ServiceInstancesRequest siReq = msoRequest.getServiceInstancesRequest();
462 if(siReq.getServiceInstanceId () != null){
463 serviceInstanceId = siReq.getServiceInstanceId ();
466 if(siReq.getVnfInstanceId () != null){
467 vnfId = siReq.getVnfInstanceId ();
470 if(siReq.getVfModuleInstanceId () != null){
471 vfModuleId = siReq.getVfModuleInstanceId ();
474 if(siReq.getVolumeGroupInstanceId () != null){
475 volumeGroupId = siReq.getVolumeGroupInstanceId ();
478 if(siReq.getNetworkInstanceId () != null){
479 networkId = siReq.getNetworkInstanceId ();
483 requestId = msoRequest.getRequestId ();
484 msoLogger.debug ("requestId is: " + requestId);
485 msoLogger.debug ("About to insert a record");
488 msoRequest.createRequestRecord (Status.PENDING, action);
489 } catch (Exception e) {
490 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
491 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
492 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_INTERNAL_SERVER_ERROR,
493 MsoException.ServiceException,
494 "Exception while creating record in DB " + e.getMessage(),
495 ErrorNumbers.SVC_BAD_PARAMETER,
497 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
498 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
502 RequestClient requestClient = null;
503 HttpResponse response = null;
504 long subStartTime = System.currentTimeMillis();
506 requestClient = RequestClientFactory.getRequestClient (recipeLookupResult.getOrchestrationURI (), props);
507 // Capture audit event
508 msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
510 System.out.println("URL : " + requestClient.getUrl ());
512 response = requestClient.post(requestId, isBaseVfModule, recipeLookupResult.getRecipeTimeout (), action.name (),
513 serviceInstanceId, vnfId, vfModuleId, volumeGroupId, networkId,
514 msoRequest.getServiceInstanceType (),
515 msoRequest.getVnfType (), msoRequest.getVfModuleType (),
516 msoRequest.getNetworkType (), requestJSON);
518 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI (), null);
519 } catch (Exception e) {
520 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI (), null);
521 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
522 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
523 MsoException.ServiceException,
524 "Failed calling bpmn " + e.getMessage (),
525 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
527 alarmLogger.sendAlarm ("MsoConfigurationError",
528 MsoAlarmLogger.CRITICAL,
529 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
530 msoRequest.updateFinalStatus (Status.FAILED);
531 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
532 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
533 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
537 if (response == null) {
538 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
539 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
540 MsoException.ServiceException,
541 "bpelResponse is null",
542 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
544 msoRequest.updateFinalStatus (Status.FAILED);
545 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
546 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Null response from BPMN");
547 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
551 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
552 int bpelStatus = respHandler.getStatus ();
554 // BPEL accepted the request, the request is in progress
555 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
556 String camundaJSONResponseBody = respHandler.getResponseBody ();
557 msoLogger.debug ("Received from Camunda: " + camundaJSONResponseBody);
558 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.IN_PROGRESS);
559 RequestsDatabase.updateInfraStatus (msoRequest.getRequestId (),
560 Status.IN_PROGRESS.toString (),
561 Constants.PROGRESS_REQUEST_IN_PROGRESS,
562 Constants.MODIFIED_BY_APIHANDLER);
563 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
564 msoLogger.debug ("End of the transaction, the final response is: " + (String) camundaJSONResponseBody);
565 return Response.status (HttpStatus.SC_ACCEPTED).entity (camundaJSONResponseBody).build ();
567 List<String> variables = new ArrayList<String>();
568 variables.add(bpelStatus + "");
569 String camundaJSONResponseBody = respHandler.getResponseBody ();
570 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
571 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
572 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
573 MsoException.ServiceException,
574 "Request Failed due to BPEL error with HTTP Status= %1 " + '\n' + camundaJSONResponseBody,
575 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
577 msoRequest.updateFinalStatus (Status.FAILED);
578 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
579 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is failed");
580 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
583 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
584 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
585 MsoException.ServiceException,
586 "Request Failed due to BPEL error with HTTP Status= %1" ,
587 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
589 msoRequest.updateFinalStatus (Status.FAILED);
590 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
591 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPEL engine is empty");
592 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
597 //return Response.status (HttpStatus.SC_ACCEPTED).entity (serviceResponse).build ();
598 // return serviceResponse;
599 } catch (Exception e) {
600 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
601 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
602 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
603 MsoException.ServiceException,
604 "No communication to catalog DB " + e.getMessage (),
605 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
607 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
608 MsoAlarmLogger.CRITICAL,
609 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
610 msoRequest.createRequestRecord (Status.FAILED,action);
611 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
612 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
617 private RecipeLookupResult getServiceInstanceOrchestrationURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
619 RecipeLookupResult recipeLookupResult = null;
620 // Query MSO Catalog DB
622 if (msoRequest.getModelInfo().getModelType().equals(ModelType.service)) {
625 // Construct the default service name
626 // TODO need to make this a configurable property
628 String defaultServiceName = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
629 Service serviceRecord = db.getServiceByName(defaultServiceName);
630 int serviceId = serviceRecord.getId();
631 ServiceRecipe recipe = db.getServiceRecipe(serviceId, action.name());
633 if (recipe == null) {
637 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
639 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule) ||
640 msoRequest.getModelInfo().getModelType().equals(ModelType.volumeGroup)) {
642 String vnfComponentType = msoRequest.getModelInfo().getModelType().name();
643 VnfComponentsRecipe recipe = null;
645 if (action != Action.deleteInstance) {
646 RelatedInstanceList[] instanceList = null;
647 if (msoRequest.getServiceInstancesRequest().getRequestDetails() != null) {
648 instanceList = msoRequest.getServiceInstancesRequest().getRequestDetails().getRelatedInstanceList();
651 String serviceModelName = null;
652 String vnfModelName = null;
653 String vfModuleModelName = null;
654 String asdcServiceModelVersion = null;
655 String modelVersion = null;
657 if (instanceList != null) {
659 for(RelatedInstanceList relatedInstanceList : instanceList){
661 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
662 if(relatedInstance.getModelInfo().getModelType().equals(ModelType.service)){
663 serviceModelName = relatedInstance.getModelInfo().getModelName();
664 asdcServiceModelVersion = relatedInstance.getModelInfo().getModelVersion();
667 if(relatedInstance.getModelInfo().getModelType().equals(ModelType.vnf)){
668 vnfModelName = relatedInstance.getModelInfo().getModelCustomizationName();
671 if(relatedInstance.getModelInfo().getModelType().equals(ModelType.vfModule) ||
672 relatedInstance.getModelInfo().getModelType().equals(ModelType.volumeGroup)) {
673 vfModuleModelName = relatedInstance.getModelInfo().getModelName();
674 modelVersion = relatedInstance.getModelInfo().getModelVersion();
679 String vnfType = serviceModelName + "/" + vnfModelName;
681 // Try to find a recipe for a custom flow first
682 recipe = db.getVnfComponentsRecipe(vnfType, vfModuleModelName, asdcServiceModelVersion, modelVersion, action.name());
685 if (recipe == null) {
686 // Find the default recipe record
687 recipe = db.getVnfComponentsRecipeByVfModuleId("VID_DEFAULT", vnfComponentType, action.name());
689 if (recipe == null) {
693 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
696 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vnf)) {
698 // Construct the default vnf type
699 // TODO need to make this a configurable property
701 String defaultVnfType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
703 VnfRecipe recipe = db.getVnfRecipe(defaultVnfType, action.name());
705 if (recipe == null) {
708 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
710 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.network)) {
712 // Construct the default network type
713 // TODO need to make this a configurable property
715 String defaultNetworkType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
717 Recipe recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
719 if (recipe == null) {
722 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
725 if (recipeLookupResult != null) {
726 msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
729 msoLogger.debug("No matching recipe record found");
731 return recipeLookupResult;