1 package org.openecomp.mso.apihandlerinfra;
7 * Copyright (C) 2016 OPENECOMP - MSO
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
24 import java.text.SimpleDateFormat;
27 import javax.servlet.ServletContext;
28 import javax.ws.rs.Consumes;
29 import javax.ws.rs.DELETE;
30 import javax.ws.rs.GET;
31 import javax.ws.rs.HEAD;
32 import javax.ws.rs.POST;
33 import javax.ws.rs.PUT;
34 import javax.ws.rs.Path;
35 import javax.ws.rs.PathParam;
36 import javax.ws.rs.Produces;
37 import javax.ws.rs.QueryParam;
38 import javax.ws.rs.DefaultValue;
39 import javax.ws.rs.core.Context;
40 import javax.ws.rs.core.MediaType;
41 import javax.ws.rs.core.MultivaluedMap;
42 import javax.ws.rs.core.Response;
43 import javax.ws.rs.core.UriInfo;
45 import org.openecomp.mso.HealthCheckUtils;
47 import org.apache.http.HttpResponse;
48 import org.apache.http.HttpStatus;
49 import org.codehaus.jackson.map.ObjectMapper;
50 import org.codehaus.jackson.map.SerializationConfig.Feature;
52 import org.openecomp.mso.apihandler.common.ErrorNumbers;
53 import org.openecomp.mso.apihandler.common.RequestClient;
54 import org.openecomp.mso.apihandler.common.RequestClientFactory;
55 import org.openecomp.mso.apihandler.common.ResponseHandler;
56 import org.openecomp.mso.apihandler.common.ValidationException;
57 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.GetOrchestrationListResponse;
58 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.GetOrchestrationResponse;
59 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.InstanceReferences;
60 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstance;
61 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RelatedInstanceList;
62 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.Request;
63 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestDetails;
64 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestError;
65 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestList;
66 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestStatus;
67 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.RequestReferences;
68 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesRequest;
69 import org.openecomp.mso.apihandlerinfra.serviceinstancebeans.ServiceInstancesResponse;
70 import org.openecomp.mso.db.catalog.CatalogDatabase;
71 import org.openecomp.mso.db.catalog.beans.Recipe;
72 import org.openecomp.mso.db.catalog.beans.Service;
73 import org.openecomp.mso.db.catalog.beans.ServiceRecipe;
74 import org.openecomp.mso.db.catalog.beans.VfModule;
75 import org.openecomp.mso.db.catalog.beans.VnfComponentsRecipe;
76 import org.openecomp.mso.db.catalog.beans.VnfRecipe;
77 import org.openecomp.mso.db.catalog.beans.VnfResource;
78 import org.openecomp.mso.logger.MessageEnum;
79 import org.openecomp.mso.logger.MsoAlarmLogger;
80 import org.openecomp.mso.logger.MsoLogger;
81 import org.openecomp.mso.properties.MsoJavaProperties;
82 import org.openecomp.mso.properties.MsoPropertiesFactory;
83 import org.openecomp.mso.requestsdb.InfraActiveRequests;
84 import org.openecomp.mso.requestsdb.RequestsDatabase;
85 import org.openecomp.mso.utils.UUIDChecker;
88 public class RequestHandler {
90 public final static String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
92 private static MsoPropertiesFactory msoPropertiesFactory = new MsoPropertiesFactory ();
95 private UriInfo uriInfo;
97 private static final String NOT_FOUND = "<!DOCTYPE html><html><head><meta charset=\"ISO-8859-1\"><title>Application Not Started</title></head><body>Application not started, properties file missing or invalid or Database Connection failed</body></html>";
99 private static final Response NOT_STARTED_RESPONSE = Response.status (HttpStatus.SC_SERVICE_UNAVAILABLE)
103 private static boolean noProperties = true;
105 private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
106 private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
109 private ServletContext sc;
111 private static MsoJavaProperties props = loadMsoProperties ();
112 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
116 @Path("/healthcheck")
117 @Produces("text/html")
118 public Response healthcheck (@QueryParam("requestId") String requestId) {
119 long startTime = System.currentTimeMillis ();
120 MsoLogger.setServiceName ("Healthcheck");
121 UUIDChecker.verifyOldUUID(requestId, msoLogger);
122 HealthCheckUtils healthCheck = new HealthCheckUtils ();
123 if (!healthCheck.siteStatusCheck(msoLogger, startTime)) {
124 return HealthCheckUtils.HEALTH_CHECK_NOK_RESPONSE;
127 if (!healthCheck.configFileCheck(msoLogger, startTime, MSO_PROP_APIHANDLER_INFRA)) {
128 return HealthCheckUtils.NOT_STARTED_RESPONSE;
131 if (!healthCheck.requestDBCheck (msoLogger, startTime)) {
132 return HealthCheckUtils.NOT_STARTED_RESPONSE;
134 msoLogger.debug("healthcheck - Successful");
135 return HealthCheckUtils.HEALTH_CHECK_RESPONSE;
140 @Path("/globalhealthcheck")
141 @Produces("text/html")
142 public Response globalHealthcheck (@DefaultValue("true") @QueryParam("enableBpmn") boolean enableBpmn) {
143 long startTime = System.currentTimeMillis ();
144 MsoLogger.setServiceName ("GlobalHealthcheck");
145 // Generate a Request Id
146 String requestId = UUIDChecker.generateUUID(msoLogger);
147 HealthCheckUtils healthCheck = new HealthCheckUtils ();
148 if (!healthCheck.siteStatusCheck (msoLogger, startTime)) {
149 return HealthCheckUtils.HEALTH_CHECK_NOK_RESPONSE;
152 if (healthCheck.verifyGlobalHealthCheck(enableBpmn, requestId)) {
153 msoLogger.debug("globalHealthcheck - Successful");
154 return HealthCheckUtils.HEALTH_CHECK_RESPONSE;
156 msoLogger.debug("globalHealthcheck - At leaset one of the sub-modules is not available");
157 return HealthCheckUtils.HEALTH_CHECK_NOK_RESPONSE;
161 private static MsoJavaProperties loadMsoProperties () {
162 MsoJavaProperties msoProperties;
164 msoProperties = msoPropertiesFactory.getMsoJavaProperties (MSO_PROP_APIHANDLER_INFRA);
165 } catch (Exception e) {
166 msoLogger.error (MessageEnum.APIH_LOAD_PROPERTIES_FAIL, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Exception when loading MSO Properties", e);
170 if (msoProperties != null && msoProperties.size () > 0) {
171 noProperties = false;
172 msoLogger.info (MessageEnum.APIH_PROPERTY_LOAD_SUC, "", "");
173 return msoProperties;
175 msoLogger.error (MessageEnum.APIH_NO_PROPERTIES, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No MSO APIH_INFRA Properties found");
181 @Path("/serviceInstances/v2")
182 @Consumes(MediaType.APPLICATION_JSON)
183 @Produces(MediaType.APPLICATION_JSON)
184 public Response createServiceInstance(String request) {
186 Response response = serviceInstances(request, Action.createInstance, null);
192 @Path("/serviceInstances/v2/{serviceInstanceId}")
193 @Consumes(MediaType.APPLICATION_JSON)
194 @Produces(MediaType.APPLICATION_JSON)
195 public Response deleteServiceInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId) {
197 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
198 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
203 @Path("/serviceInstances/v2/{serviceInstanceId}/vnfs")
204 @Consumes(MediaType.APPLICATION_JSON)
205 @Produces(MediaType.APPLICATION_JSON)
206 public Response createVnfInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId) {
208 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
209 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
215 @Path("/serviceInstances/v2/{serviceInstanceId}/vnfs/{vnfInstanceId}")
216 @Consumes(MediaType.APPLICATION_JSON)
217 @Produces(MediaType.APPLICATION_JSON)
218 public Response deleteVnfInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
219 @PathParam("vnfInstanceId") String vnfInstanceId) {
221 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
222 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
223 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
229 @Path("/serviceInstances/v2/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
230 @Consumes(MediaType.APPLICATION_JSON)
231 @Produces(MediaType.APPLICATION_JSON)
232 public Response createVfModuleInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
233 @PathParam("vnfInstanceId") String vnfInstanceId) {
235 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
236 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
237 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
243 @Path("/serviceInstances/v2/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
244 @Consumes(MediaType.APPLICATION_JSON)
245 @Produces(MediaType.APPLICATION_JSON)
246 public Response updateVfModuleInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
247 @PathParam("vnfInstanceId") String vnfInstanceId,
248 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
250 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
251 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
252 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
253 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap);
259 @Path("/serviceInstances/v2/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
260 @Consumes(MediaType.APPLICATION_JSON)
261 @Produces(MediaType.APPLICATION_JSON)
262 public Response deleteVfModuleInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
263 @PathParam("vnfInstanceId") String vnfInstanceId,
264 @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
267 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
268 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
269 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
270 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
277 @Path("/serviceInstances/v2/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
278 @Consumes(MediaType.APPLICATION_JSON)
279 @Produces(MediaType.APPLICATION_JSON)
280 public Response createVolumeGroupInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
281 @PathParam("vnfInstanceId") String vnfInstanceId) {
283 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
284 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
285 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
291 @Path("/serviceInstances/v2/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
292 @Consumes(MediaType.APPLICATION_JSON)
293 @Produces(MediaType.APPLICATION_JSON)
294 public Response updateVolumeGroupInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
295 @PathParam("vnfInstanceId") String vnfInstanceId,
296 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
299 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
300 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
301 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
302 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap);
308 @Path("/serviceInstances/v2/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
309 @Consumes(MediaType.APPLICATION_JSON)
310 @Produces(MediaType.APPLICATION_JSON)
311 public Response deleteVolumeGroupInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
312 @PathParam("vnfInstanceId") String vnfInstanceId,
313 @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
316 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
317 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
318 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
319 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
325 @Path("/serviceInstances/v2/{serviceInstanceId}/networks")
326 @Consumes(MediaType.APPLICATION_JSON)
327 @Produces(MediaType.APPLICATION_JSON)
328 public Response createNetworkInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId) {
330 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
331 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
337 @Path("/serviceInstances/v2/{serviceInstanceId}/networks/{networkInstanceId}")
338 @Consumes(MediaType.APPLICATION_JSON)
339 @Produces(MediaType.APPLICATION_JSON)
340 public Response updateNetworkInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
341 @PathParam("networkInstanceId") String networkInstanceId) {
343 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
344 instanceIdMap.put("networkInstanceId", networkInstanceId);
345 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap);
351 @Path("/serviceInstances/v2/{serviceInstanceId}/networks/{networkInstanceId}")
352 @Consumes(MediaType.APPLICATION_JSON)
353 @Produces(MediaType.APPLICATION_JSON)
354 public Response deleteNetworkInstance(String request, @PathParam("serviceInstanceId") String serviceInstanceId,
355 @PathParam("networkInstanceId") String networkInstanceId) {
357 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
358 instanceIdMap.put("networkInstanceId", networkInstanceId);
359 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
366 private Response serviceInstances(String requestJSON, Action action, HashMap<String,String> instanceIdMap) {
368 String requestId = UUIDChecker.generateUUID(msoLogger);
369 long startTime = System.currentTimeMillis ();
370 msoLogger.debug ("requestId is: " + requestId);
371 ServiceInstancesRequest sir = null;
373 MsoRequest msoRequest = new MsoRequest (requestId);
377 ObjectMapper mapper = new ObjectMapper();
378 sir = mapper.readValue(requestJSON, ServiceInstancesRequest.class);
380 } catch(Exception e){
381 msoLogger.debug ("Mapping of request to JSON object failed : ", e);
382 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
383 "Mapping of request to JSON object failed. " + e.getMessage(),
384 ErrorNumbers.SVC_BAD_PARAMETER, null);
385 if (msoRequest.getRequestId () != null) {
386 msoLogger.debug ("Mapping of request to JSON object failed");
387 msoRequest.createRequestRecord (Status.FAILED, action);
389 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
390 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed");
391 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
397 msoRequest.parse(sir, instanceIdMap, action);
398 } catch (Exception e) {
399 msoLogger.debug ("Validation failed: ", e);
400 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
401 "Error parsing request. " + e.getMessage(),
402 ErrorNumbers.SVC_BAD_PARAMETER, null);
403 if (msoRequest.getRequestId () != null) {
404 msoLogger.debug ("Logging failed message to the database");
405 msoRequest.createRequestRecord (Status.FAILED, action);
407 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
408 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
409 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
413 InfraActiveRequests dup = null;
414 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
415 String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
417 dup = RequestsDatabase.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
419 } catch (Exception e) {
420 msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
422 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
424 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
428 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check");
429 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
434 // Found the duplicate record. Return the appropriate error.
435 String instance = null;
436 if(instanceName != null){
437 instance = instanceName;
439 instance = instanceIdMap.get(requestScope + "InstanceId");
441 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.";
442 //List<String> variables = new ArrayList<String>();
443 //variables.add(dup.getRequestStatus());
445 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException,
447 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
451 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, "Duplicate request - Subscriber already has a request for this service");
452 msoRequest.createRequestRecord (Status.FAILED, action);
453 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage);
454 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
459 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
461 RequestReferences referencesResponse = new RequestReferences();
463 referencesResponse.setRequestId(requestId);
465 serviceResponse.setRequestReferences(referencesResponse);
467 try (CatalogDatabase db = new CatalogDatabase()) {
469 RecipeLookupResult recipeLookupResult = null;
471 recipeLookupResult = getServiceInstanceOrchestrationURI (db, msoRequest, action);
472 } catch (Exception e) {
473 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Exception while querying Catalog DB", e);
474 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
475 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
476 MsoException.ServiceException,
477 "Recipe could not be retrieved from catalog DB " + e.getMessage (),
478 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
480 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
481 MsoAlarmLogger.CRITICAL,
482 Messages.errors.get (ErrorNumbers.ERROR_FROM_CATALOG_DB));
483 msoRequest.createRequestRecord (Status.FAILED,action);
484 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while querying Catalog DB");
485 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
490 if (recipeLookupResult == null) {
491 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
492 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
493 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
494 MsoException.ServiceException,
495 "Recipe does not exist in catalog DB",
496 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
498 msoRequest.createRequestRecord (Status.FAILED, action);
499 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
500 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
506 Boolean isBaseVfModule = false;
508 if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule)) {
509 String asdcServiceModelVersion = msoRequest.getAsdcServiceModelVersion ();
511 // Get VF Module-specific base module indicator
514 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
515 vfm = db.getVfModuleType (msoRequest.getVfModuleType (), asdcServiceModelVersion);
518 vfm = db.getVfModuleType (msoRequest.getVfModuleType ());
522 if (vfm.getIsBase() == 1) {
523 isBaseVfModule = true;
526 else if (action == Action.createInstance || action == Action.updateInstance){
527 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
528 // This request cannot proceed
529 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MSO_PROP_APIHANDLER_INFRA, "VF Module Type", "", MsoLogger.ErrorCode.DataError, "No VfModuleType found in DB");
530 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
531 String serviceVersionText = "";
532 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
533 serviceVersionText = " with version " + asdcServiceModelVersion;
535 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
536 MsoException.ServiceException,
537 "VnfType " + msoRequest.getVnfType () + " and VF Module Model Name " + msoRequest.getVfModuleModelName() + serviceVersionText + " not found in MSO Catalog DB",
538 ErrorNumbers.SVC_BAD_PARAMETER,
540 msoRequest.createRequestRecord (Status.FAILED, action);
541 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No matching vfModuleType found in DB");
542 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
550 String serviceInstanceId = "";
552 String vfModuleId = "";
553 String volumeGroupId = "";
554 String networkId = "";
555 ServiceInstancesRequest siReq = msoRequest.getServiceInstancesRequest();
557 if(siReq.getServiceInstanceId () != null){
558 serviceInstanceId = siReq.getServiceInstanceId ();
561 if(siReq.getVnfInstanceId () != null){
562 vnfId = siReq.getVnfInstanceId ();
565 if(siReq.getVfModuleInstanceId () != null){
566 vfModuleId = siReq.getVfModuleInstanceId ();
569 if(siReq.getVolumeGroupInstanceId () != null){
570 volumeGroupId = siReq.getVolumeGroupInstanceId ();
573 if(siReq.getNetworkInstanceId () != null){
574 networkId = siReq.getNetworkInstanceId ();
578 requestId = msoRequest.getRequestId ();
579 msoLogger.debug ("requestId is: " + requestId);
580 msoLogger.debug ("About to insert a record");
583 msoRequest.createRequestRecord (Status.PENDING, action);
584 } catch (Exception e) {
585 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
586 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
587 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_INTERNAL_SERVER_ERROR,
588 MsoException.ServiceException,
589 "Exception while creating record in DB " + e.getMessage(),
590 ErrorNumbers.SVC_BAD_PARAMETER,
592 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
593 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
597 RequestClient requestClient = null;
598 HttpResponse response = null;
599 long subStartTime = System.currentTimeMillis();
601 requestClient = RequestClientFactory.getRequestClient (recipeLookupResult.getOrchestrationURI (), props);
602 // Capture audit event
603 msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
605 System.out.println("URL : " + requestClient.getUrl ());
607 response = requestClient.post(requestId, isBaseVfModule, recipeLookupResult.getRecipeTimeout (), action.name (),
608 serviceInstanceId, vnfId, vfModuleId, volumeGroupId, networkId,
609 msoRequest.getServiceInstanceType (),
610 msoRequest.getVnfType (), msoRequest.getVfModuleType (),
611 msoRequest.getNetworkType (), requestJSON);
613 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI (), null);
614 } catch (Exception e) {
615 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", recipeLookupResult.getOrchestrationURI (), null);
616 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
617 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
618 MsoException.ServiceException,
619 "Failed calling bpmn " + e.getMessage (),
620 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
622 alarmLogger.sendAlarm ("MsoConfigurationError",
623 MsoAlarmLogger.CRITICAL,
624 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
625 msoRequest.updateFinalStatus (Status.FAILED);
626 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
627 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
628 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
632 if (response == null) {
633 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
634 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
635 MsoException.ServiceException,
636 "bpelResponse is null",
637 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
639 msoRequest.updateFinalStatus (Status.FAILED);
640 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
641 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Null response from BPMN");
642 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
646 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
647 int bpelStatus = respHandler.getStatus ();
649 // BPEL accepted the request, the request is in progress
650 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
651 String camundaJSONResponseBody = respHandler.getResponseBody ();
652 msoLogger.debug ("Received from Camunda: " + camundaJSONResponseBody);
653 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.IN_PROGRESS);
654 RequestsDatabase.updateInfraStatus (msoRequest.getRequestId (),
655 Status.IN_PROGRESS.toString (),
656 Constants.PROGRESS_REQUEST_IN_PROGRESS,
657 Constants.MODIFIED_BY_APIHANDLER);
658 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
659 msoLogger.debug ("End of the transaction, the final response is: " + (String) camundaJSONResponseBody);
660 return Response.status (HttpStatus.SC_ACCEPTED).entity (camundaJSONResponseBody).build ();
662 List<String> variables = new ArrayList<String>();
663 variables.add(bpelStatus + "");
664 String camundaJSONResponseBody = respHandler.getResponseBody ();
665 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
666 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
667 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
668 MsoException.ServiceException,
669 "Request Failed due to BPEL error with HTTP Status= %1 " + '\n' + camundaJSONResponseBody,
670 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
672 msoRequest.updateFinalStatus (Status.FAILED);
673 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
674 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is failed");
675 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
678 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
679 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
680 MsoException.ServiceException,
681 "Request Failed due to BPEL error with HTTP Status= %1" ,
682 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
684 msoRequest.updateFinalStatus (Status.FAILED);
685 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
686 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPEL engine is empty");
687 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
692 //return Response.status (HttpStatus.SC_ACCEPTED).entity (serviceResponse).build ();
693 // return serviceResponse;
694 } catch (Exception e) {
695 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
696 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
697 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
698 MsoException.ServiceException,
699 "No communication to catalog DB " + e.getMessage (),
700 ErrorNumbers.SVC_NO_SERVER_RESOURCES,
702 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
703 MsoAlarmLogger.CRITICAL,
704 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
705 msoRequest.createRequestRecord (Status.FAILED,action);
706 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
707 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
713 @Path("/orchestrationRequests/v2/{requestId}")
714 @Produces(MediaType.APPLICATION_JSON)
715 public Response getOrchestrationRequest(@PathParam("requestId") String requestId) {
717 GetOrchestrationResponse orchestrationResponse = new GetOrchestrationResponse();
719 MsoRequest msoRequest = new MsoRequest (requestId);
721 long startTime = System.currentTimeMillis ();
723 InfraActiveRequests requestDB = null;
726 requestDB = RequestsDatabase.getRequestFromInfraActive(requestId);
728 } catch (Exception e) {
729 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Request DB - Infra Request Lookup", e);
730 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
731 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
732 MsoException.ServiceException,
734 ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB,
736 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
737 MsoAlarmLogger.CRITICAL,
738 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB));
739 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with Request DB");
740 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
745 if(requestDB == null) {
746 Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NO_CONTENT,
747 MsoException.ServiceException,
748 "Orchestration RequestId " + requestId + " is not found in DB",
749 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
751 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from RequestDB when searching by RequestId");
752 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "Null response from RequestDB when searching by RequestId");
753 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
758 Request request = mapInfraActiveRequestToRequest(requestDB);
760 orchestrationResponse.setRequest(request);
762 return Response.status(200).entity(orchestrationResponse).build();
766 @Path("/orchestrationRequests/v2")
767 @Produces(MediaType.APPLICATION_JSON)
768 public Response getOrchestrationRequest(@Context UriInfo ui) {
770 long startTime = System.currentTimeMillis ();
772 MsoRequest msoRequest = new MsoRequest();
774 MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
776 List<InfraActiveRequests> activeRequests = null;
778 GetOrchestrationListResponse orchestrationList = null;
783 Map<String, List<String>> orchestrationMap = msoRequest.getOrchestrationFilters(queryParams);
785 activeRequests = RequestsDatabase.getOrchestrationFiltersFromInfraActive(orchestrationMap);
787 orchestrationList = new GetOrchestrationListResponse();
789 List<RequestList> requestLists = new ArrayList<RequestList>();
791 for(InfraActiveRequests infraActive : activeRequests){
793 Request request = mapInfraActiveRequestToRequest(infraActive);
794 RequestList requestList = new RequestList();
795 requestList.setRequest(request);
797 requestLists.add(requestList);
801 orchestrationList.setRequestList(requestLists);
804 msoLogger.debug ("Get Orchestration Request with Filters Failed : ", e);
805 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
806 "Get Orchestration Request with Filters Failed. " + e.getMessage(),
807 ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null);
808 msoLogger.error (MessageEnum.APIH_GENERAL_EXCEPTION, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Get Orchestration Request with Filters Failed : " + e);
809 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataError, "Get Orchestration Request with Filters Failed");
810 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
815 return Response.status(200).entity(orchestrationList).build();
819 @Path("/v3/vnf-request")
821 @Produces("application/xml")
822 public Response manageVnfRequestV3 (String reqXML) {
823 // Set logger parameters
824 MsoLogger.setServiceName ("VnfRequest");
825 return manageVnfRequestImpl (reqXML, Constants.SCHEMA_VERSION_V3);
830 @Path("/v2/vnf-request")
832 @Produces("application/xml")
833 public Response manageVnfRequestV2 (String reqXML) {
834 // Set logger parameters
835 MsoLogger.setServiceName ("VnfRequest");
836 return manageVnfRequestImpl (reqXML, Constants.SCHEMA_VERSION_V2);
840 @Path("/v1/vnf-request")
842 @Produces("application/xml")
843 public Response manageVnfRequestV1 (String reqXML) {
845 // Set logger parameters
846 MsoLogger.setServiceName ("VnfRequest");
848 return manageVnfRequestImpl (reqXML, Constants.SCHEMA_VERSION_V1);
852 @Path("/v3/network-request")
854 @Produces("application/xml")
855 public Response manageNetworkRequestV3 (String reqXML) {
857 // Set logger parameters
858 MsoLogger.setServiceName ("NetworkRequest");
860 return manageNetworkRequestImpl (reqXML, Constants.SCHEMA_VERSION_V3);
864 @Path("/v2/network-request")
866 @Produces("application/xml")
867 public Response manageNetworkRequestV2 (String reqXML) {
869 // Set logger parameters
870 MsoLogger.setServiceName ("NetworkRequest");
872 return manageNetworkRequestImpl (reqXML, Constants.SCHEMA_VERSION_V2);
876 @Path("/v1/network-request")
878 @Produces("application/xml")
879 public Response manageNetworkRequestV1 (String reqXML) {
881 // Set logger parameters
882 MsoLogger.setServiceName ("NetworkRequest");
884 return manageNetworkRequestImpl (reqXML, Constants.SCHEMA_VERSION_V1);
888 @Path("/v3/volume-request")
890 @Produces("application/xml")
891 public Response manageVolumeRequestV3 (String reqXML) {
892 // Set logger parameters
893 MsoLogger.setServiceName ("VolumeRequest");
894 return manageVolumeRequestImpl (reqXML, Constants.SCHEMA_VERSION_V3);
898 @Path("/v2/volume-request")
900 @Produces("application/xml")
901 public Response manageVolumeRequestV2 (String reqXML) {
902 // Set logger parameters
903 MsoLogger.setServiceName ("VolumeRequest");
904 return manageVolumeRequestImpl (reqXML, Constants.SCHEMA_VERSION_V2);
908 @Path("/v1/volume-request")
910 @Produces("application/xml")
911 public Response manageVolumeRequestV1 (String reqXML) {
913 // Set logger parameters
914 MsoLogger.setServiceName ("VolumeRequest");
916 return manageVolumeRequestImpl (reqXML, Constants.SCHEMA_VERSION_V1);
920 private Response manageVnfRequestImpl (String reqXML, String version) {
921 String methodName = "VnfRequest";
922 props = loadMsoProperties ();
923 long startTime = System.currentTimeMillis ();
925 // Generate unique request id for the new request
926 UUID requestUUID = UUID.randomUUID ();
928 VnfMsoInfraRequest msoRequest = new VnfMsoInfraRequest (requestUUID.toString ());
929 MsoLogger.setLogContext (msoRequest.getRequestId (), null);
932 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.ServiceNotAvailable, "Exiting the transaction: Infra API Handler not started, properties file missing or invalid");
933 return NOT_STARTED_RESPONSE;
936 uriInfo.getRequestUri ();
938 if (reqXML == null) {
939 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.BadRequest, "The content of the request is null");
940 return Response.status (HttpStatus.SC_NO_CONTENT).entity ("").build ();
943 String requestUri = uriInfo.getRequestUri ().toString ();
944 msoLogger.debug ("Incoming request received for pose VNFRequest:" + reqXML);
946 msoRequest.setRequestUri (requestUri);
947 msoLogger.debug ("Schema version: " + version);
949 msoRequest.parse (reqXML, version, props);
950 } catch (Exception e) {
951 msoLogger.debug ("Validation failed: ", e);
952 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
953 Response response = msoRequest.buildResponseFailedValidation (HttpStatus.SC_BAD_REQUEST, e.getMessage ());
954 if (msoRequest.getRequestId () != null) {
955 msoLogger.debug ("Logging failed message to the database");
956 msoRequest.createRequestRecord (Status.FAILED);
958 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, reqXML, "", "", MsoLogger.ErrorCode.SchemaError, "Exception when parsing reqXML", e);
959 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
960 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
963 MsoLogger.setServiceName (MsoLogger.getServiceName () + "_" + msoRequest.getRequestInfo().getAction().name());
964 msoLogger.debug ("Update serviceName with detailed action info to:" + MsoLogger.getServiceName () + "_" + msoRequest.getRequestInfo().getAction().name());
965 if (msoRequest.getRequestInfo ().getAction () == org.openecomp.mso.apihandlerinfra.vnfbeans.ActionType.CREATE) {
966 // Check if this request is a duplicate of the one with the same vnfName
967 msoLogger.debug ("Checking for a duplicate with the same vnf-name");
968 InfraActiveRequests dup = null;
970 dup = RequestsDatabase.checkDuplicateByVnfName (msoRequest.getVnfInputs ().getVnfName (),
971 msoRequest.getRequestInfo ().getAction ().value (),
974 } catch (Exception e) {
975 msoLogger.debug ("Exception", e);
976 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
977 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_INTERNAL_SERVER_ERROR,
978 ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB,
981 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
982 MsoAlarmLogger.CRITICAL,
983 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB));
984 msoRequest.createRequestRecord (Status.FAILED);
985 msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC_ATT, "vnf-name", "", "", MsoLogger.ErrorCode.DataError, "Exception while checking for duplicated request", e);
986 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while checking for duplicated request");
987 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
991 // Found the duplicate record. Return the appropriate error.
992 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
993 Response response = msoRequest.buildResponse (HttpStatus.SC_CONFLICT,
994 ErrorNumbers.LOCKED_CREATE_ON_THE_SAME_VNF_NAME_IN_PROGRESS,
996 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, "CREATE on the same VNF Name is already progress", "", "", MsoLogger.ErrorCode.DataError, "Duplicates request - CREATE on the same VNF Name is already progress");
997 msoRequest.createRequestRecord (Status.FAILED);
998 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, "Duplicates request - CREATE on the same VNF Name is already progress");
999 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1003 // Check if this request is a duplicate of the one with the same vnfId
1004 InfraActiveRequests dup = null;
1005 msoLogger.debug ("Checking for a duplicate with the same vnf-id");
1007 dup = RequestsDatabase.checkDuplicateByVnfId (msoRequest.getVnfInputs ().getVnfId (),
1008 msoRequest.getRequestInfo ().getAction ().value (),
1011 } catch (Exception e) {
1012 msoLogger.debug ("Exception", e);
1013 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1014 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1015 ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB,
1018 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
1019 MsoAlarmLogger.CRITICAL,
1020 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB));
1021 msoRequest.createRequestRecord (Status.FAILED);
1022 msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC_ATT, "vnf-id", "", "", MsoLogger.ErrorCode.DataError, "Exception while checking for a duplicate request with the same vnf-id", e);
1023 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while checking for a duplicate request with the same vnf-id");
1024 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1028 // Found the duplicate record. Return the appropriate error.
1029 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1030 Response response = msoRequest.buildResponse (HttpStatus.SC_CONFLICT,
1031 ErrorNumbers.LOCKED_SAME_ACTION_AND_VNF_ID,
1033 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND,
1034 msoRequest.getRequestInfo ().getAction ().value ()
1035 + " on the same VNF Id already in progress", "", "", MsoLogger.ErrorCode.DataError, "Duplicated request on the same VNF Id already in progress");
1037 msoRequest.createRequestRecord (Status.FAILED);
1038 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, "Duplicated request on the same VNF Id already in progress");
1039 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1044 String orchestrationURI = "";
1046 try (CatalogDatabase db = new CatalogDatabase()) {
1048 Recipe recipe = null;
1050 if (version.equals(Constants.SCHEMA_VERSION_V1)) {
1051 // First get recipe for the service type given
1052 if (msoRequest.getServiceType () != null
1053 && msoRequest.getServiceType ().length () > 0) {
1054 recipe = db.getVnfRecipe (msoRequest.getVnfInputs ().getVnfType (),
1055 msoRequest.getRequestInfo ().getAction ().value (),
1056 msoRequest.getServiceType ());
1058 // If no recipe for the service type or no service type was given, look for recipe without service type
1059 if (recipe == null) {
1060 recipe = db.getVnfRecipe (msoRequest.getVnfInputs ().getVnfType (),
1061 msoRequest.getRequestInfo ().getAction ().value (),
1065 if (version.equals (Constants.SCHEMA_VERSION_V2) || version.equals (Constants.SCHEMA_VERSION_V3)) {
1066 switch (msoRequest.getRequestInfo ().getAction ()) {
1070 // First get recipe for the vnf type given
1071 recipe = db.getVnfRecipe (msoRequest.getVnfInputs ().getVnfType (),
1072 msoRequest.getRequestInfo ().getAction ().value ());
1074 // If no recipe for the vnf type is found, look for generic recipe with "*" vnf type
1075 if (recipe == null) {
1076 recipe = db.getVnfRecipe (Constants.VNF_TYPE_WILDCARD,
1077 msoRequest.getRequestInfo ().getAction ().value ());
1080 case CREATE_VF_MODULE:
1081 case UPDATE_VF_MODULE:
1082 case DELETE_VF_MODULE:
1083 // First get recipe for the vnf type/vf module model name through vf module id query
1084 recipe = db.getVfModuleRecipe (msoRequest.getVnfInputs ().getVnfType (), msoRequest.getVnfInputs ().getVfModuleModelName (),
1085 msoRequest.getRequestInfo ().getAction ().value ());
1087 // If no recipe is found, look for generic recipe with "*" vnf type
1088 if (recipe == null) {
1089 recipe = db.getVnfRecipeByVfModuleId (msoRequest.getVnfInputs ().getVfModuleId (),
1090 Constants.VNF_TYPE_WILDCARD, msoRequest.getRequestInfo ().getAction ().value ());
1092 // First get recipe for the vnf type given
1093 //recipe = db.getVnfRecipe (msoRequest.getVnfInputs ().getVnfType (),
1094 // msoRequest.getRequestInfo ().getAction ().value ());
1096 // If no recipe for the vnf type is found, look for generic recipe with "*" vnf type
1097 //if (recipe == null) {
1098 // recipe = db.getVnfRecipe (Constants.VNF_TYPE_WILDCARD,
1099 // msoRequest.getRequestInfo ().getAction ().value ());
1109 if (recipe == null) {
1110 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, "VNF Recipe", "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
1111 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1112 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_NOT_FOUND,
1113 ErrorNumbers.RECIPE_DOES_NOT_EXIST,
1116 msoRequest.createRequestRecord (Status.FAILED);
1118 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
1119 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1122 orchestrationURI = recipe.getOrchestrationUri ();
1123 msoLogger.debug ("Orchestration URI is: " + orchestrationURI);
1125 // Retrieve additional info for Vf Modules from Catalog DB to send it to BPMN
1126 switch (msoRequest.getRequestInfo ().getAction ()) {
1127 case CREATE_VF_MODULE:
1128 case UPDATE_VF_MODULE:
1129 String personaModelId = "";
1130 String personaModelVersion = "";
1131 String vnfPersonaModelId = "";
1132 String vnfPersonaModelVersion = "";
1133 Boolean isBase = false;
1134 String asdcServiceModelVersion = msoRequest.getVnfInputs ().getAsdcServiceModelVersion ();
1136 // Get VF Module-specific persona info and base module indicator
1137 VfModule vfm = null;
1138 String vfModuleType = msoRequest.getVnfInputs ().getVnfType () + "::" + msoRequest.getVnfInputs ().getVfModuleModelName ();
1139 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
1140 vfm = db.getVfModuleType (vfModuleType, asdcServiceModelVersion);
1143 vfm = db.getVfModuleType (vfModuleType);
1146 if (vfm.getIsBase() == 1) {
1149 personaModelId = vfm.getModelInvariantUuid();
1150 personaModelVersion = vfm.getModelVersion();
1151 msoLogger.debug("Setting personaModelId to " + personaModelId +
1152 ", personaModelVersion to " + personaModelVersion);
1154 // Get VNF-specific persona info
1155 VnfResource vnfr = null;
1156 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
1157 vnfr = db.getVnfResource (msoRequest.getVnfInputs ().getVnfType (), asdcServiceModelVersion);
1160 vnfr = db.getVnfResource (msoRequest.getVnfInputs ().getVnfType ());
1163 vnfPersonaModelId = vnfr.getModelInvariantUuid ();
1164 vnfPersonaModelVersion = vnfr.getModelVersion();
1165 msoLogger.debug("Setting vnfPersonaModelId to " + vnfPersonaModelId +
1166 ", vnfPersonaModelVersion to " + vnfPersonaModelVersion);
1169 msoRequest.addBPMNSpecificInputs(personaModelId, personaModelVersion, isBase,
1170 vnfPersonaModelId, vnfPersonaModelVersion);
1179 String requestId = msoRequest.getRequestId ();
1180 msoLogger.debug ("requestId is: " + requestId);
1181 msoLogger.debug ("About to insert a record");
1184 msoRequest.createRequestRecord (Status.PENDING);
1185 } catch (Exception e) {
1186 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
1187 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1188 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1189 ErrorNumbers.COULD_NOT_WRITE_TO_REQUESTS_DB,
1191 "non-unique request-id specified");
1192 // Cannot create a record of this request here, our communication with MSO DB just failed. Do not try
1193 // to create a failed record
1194 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
1195 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1199 msoLogger.debug("Request going to BPEL: " + msoRequest.getRequestXML ());
1201 RequestClient requestClient = null;
1202 HttpResponse response = null;
1203 long subStartTime = System.currentTimeMillis();
1205 requestClient = RequestClientFactory.getRequestClient (orchestrationURI, props);
1206 // Capture audit event
1207 msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
1208 response = requestClient.post (msoRequest.getRequestXML (),
1210 Integer.toString (recipe.getRecipeTimeout ()).toString (),
1214 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", orchestrationURI, null);
1215 } catch (Exception e) {
1216 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", orchestrationURI, null);
1217 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1218 Response resp = msoRequest.buildResponseWithError (HttpStatus.SC_BAD_GATEWAY,
1219 ErrorNumbers.NO_COMMUNICATION_TO_BPEL,
1222 alarmLogger.sendAlarm ("MsoConfigurationError",
1223 MsoAlarmLogger.CRITICAL,
1224 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
1225 msoRequest.updateFinalStatus (Status.FAILED);
1226 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, "Camunda", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine", e);
1227 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
1228 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1232 if (response == null) {
1233 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1234 Response resp = msoRequest.buildResponseWithError (HttpStatus.SC_BAD_GATEWAY,
1235 ErrorNumbers.NO_RESPONSE_FROM_BPEL,
1237 "bpelResponse is null");
1238 msoRequest.updateFinalStatus (Status.FAILED);
1239 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, "Null response from BPEL", "Camunda", "", MsoLogger.ErrorCode.AvailabilityError, "Null response from BPEL");
1240 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Null response from BPMN");
1241 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1245 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
1246 int bpelStatus = respHandler.getStatus ();
1248 // BPEL accepted the request, the request is in progress
1249 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
1250 String bpelXMLResponseBody = respHandler.getResponseBody ();
1251 msoLogger.debug ("Received from BPEL: " + bpelXMLResponseBody);
1252 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.IN_PROGRESS);
1253 RequestsDatabase.updateInfraStatus (msoRequest.getRequestId (),
1254 Status.IN_PROGRESS.toString (),
1255 Constants.PROGRESS_REQUEST_IN_PROGRESS,
1256 Constants.MODIFIED_BY_APIHANDLER);
1257 Response resp = msoRequest.buildResponse (bpelStatus, null, null);
1258 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
1259 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1263 String bpelXMLResponseBody = respHandler.getResponseBody ();
1264 if (bpelXMLResponseBody != null && !bpelXMLResponseBody.isEmpty ()) {
1265 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1266 Response resp = msoRequest.buildResponse (bpelStatus, bpelXMLResponseBody, null);
1267 msoRequest.updateFinalStatus (Status.FAILED);
1268 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR,
1269 "Response from BPEL engine is failed with HTTP Status=" + bpelStatus, "Camunda", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
1270 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is failed");
1271 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1274 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1275 Response resp = msoRequest.buildResponse (bpelStatus, ErrorNumbers.ERROR_FROM_BPEL, null);
1276 msoRequest.updateFinalStatus (Status.FAILED);
1277 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, "Response from BPEL engine is empty", "Camunda", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
1278 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPEL engine is empty");
1279 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1283 } catch (Exception e) {
1284 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
1285 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1286 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_NOT_FOUND,
1287 ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB,
1290 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
1291 MsoAlarmLogger.CRITICAL,
1292 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
1293 msoRequest.createRequestRecord (Status.FAILED);
1294 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
1295 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1300 private Response manageNetworkRequestImpl (String reqXML, String version) {
1301 String methodName = "NetworkRequest";
1303 props = loadMsoProperties ();
1305 long startTime = System.currentTimeMillis ();
1307 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.ServiceNotAvailable, "Application not started, properties file missing or invalid");
1308 return NOT_STARTED_RESPONSE;
1310 uriInfo.getRequestUri ();
1312 // Generate unique request id for the new request
1313 UUID requestUUID = UUID.randomUUID ();
1315 NetworkMsoInfraRequest msoRequest = new NetworkMsoInfraRequest (requestUUID.toString ());
1316 MsoLogger.setLogContext (msoRequest.getRequestId (), null);
1318 if (reqXML == null) {
1319 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.BadRequest, "The input Request is null");
1320 return Response.status (HttpStatus.SC_NO_CONTENT).entity ("").build ();
1323 String requestUri = uriInfo.getRequestUri ().toString ();
1325 msoLogger.debug ("Incoming Request: " + reqXML);
1327 msoRequest.setRequestUri (requestUri);
1328 msoLogger.debug ("Schema version: " + version);
1330 msoRequest.parse (reqXML, version, props);
1331 } catch (Exception e) {
1332 msoLogger.debug ("Validation failed: ", e);
1333 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType.FAILED);
1334 Response response = msoRequest.buildResponseFailedValidation (HttpStatus.SC_BAD_REQUEST, e.getMessage ());
1335 if (msoRequest.getRequestId () != null) {
1336 msoLogger.debug ("Logging failed message to the database");
1337 msoRequest.createRequestRecord (Status.FAILED);
1339 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, reqXML, "", "", MsoLogger.ErrorCode.DataError, "Exception when parsing reqXML", e);
1340 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
1341 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1344 MsoLogger.setServiceName (MsoLogger.getServiceName () + "_" + msoRequest.getRequestInfo().getAction().name());
1345 msoLogger.debug ("Update serviceName with detailed action info to:" + MsoLogger.getServiceName () + "_" + msoRequest.getRequestInfo().getAction().name());
1346 if (msoRequest.getRequestInfo ()
1347 .getAction () == org.openecomp.mso.apihandlerinfra.networkbeans.ActionType.CREATE) {
1348 // Check if this request is a duplicate of the one with the same network Name
1349 msoLogger.debug ("Checking for a duplicate with the same network-name");
1350 InfraActiveRequests dup = null;
1353 dup = RequestsDatabase.checkDuplicateByVnfName (msoRequest.getNetworkInputs ().getNetworkName (),
1354 msoRequest.getRequestInfo ().getAction ().value (),
1357 } catch (Exception e) {
1358 msoLogger.debug ("Exception", e);
1359 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType.FAILED);
1360 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1361 ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB,
1364 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
1365 MsoAlarmLogger.CRITICAL,
1366 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB));
1367 msoRequest.createRequestRecord (Status.FAILED);
1368 msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC_ATT, "network-name", "", "", MsoLogger.ErrorCode.DataError, "Exception while checking for duplicated request", e);
1369 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while checking for duplicated request");
1370 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1374 // Found the duplicate record. Return the appropriate error.
1375 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType.FAILED);
1376 Response response = msoRequest.buildResponse (HttpStatus.SC_CONFLICT,
1377 ErrorNumbers.LOCKED_CREATE_ON_THE_SAME_VNF_NAME_IN_PROGRESS,
1379 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND,
1380 "CREATE on the same Network Name is already progress", "", "", MsoLogger.ErrorCode.DataError, "Duplicates request - CREATE on the same Network Name is already progress");
1381 msoRequest.createRequestRecord (Status.FAILED);
1382 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, "Duplicates request - CREATE on the same Network Name is already progress");
1383 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1387 // Check if this request is a duplicate of the one with the same networkId
1388 InfraActiveRequests dup = null;
1389 msoLogger.debug ("Checking for a duplicate with the same network-id");
1391 dup = RequestsDatabase.checkDuplicateByVnfId (msoRequest.getNetworkInputs ().getNetworkId (),
1392 msoRequest.getRequestInfo ().getAction ().value (),
1395 } catch (Exception e) {
1396 msoLogger.debug ("Exception", e);
1397 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType.FAILED);
1398 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1399 ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB,
1402 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
1403 MsoAlarmLogger.CRITICAL,
1404 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB));
1405 msoRequest.createRequestRecord (Status.FAILED);
1406 msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC_ATT, "network-id", "", "", MsoLogger.ErrorCode.DataError, "Exception while checking for a duplicate request with the same network-id", e);
1407 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while checking for a duplicate request with the same network-id");
1408 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1412 // Found the duplicate record. Return the appropriate error.
1413 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType.FAILED);
1414 Response response = msoRequest.buildResponse (HttpStatus.SC_CONFLICT,
1415 ErrorNumbers.LOCKED_SAME_ACTION_AND_VNF_ID,
1417 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND,
1418 msoRequest.getRequestInfo ().getAction ().value ()
1419 + " on the same Network Id already in progress", "", "", MsoLogger.ErrorCode.DataError, "Duplicated request on the same Network Id already in progress");
1421 msoRequest.createRequestRecord (Status.FAILED);
1422 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, "Duplicated request on the same Network Id already in progress.");
1423 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1428 String orchestrationURI = "";
1430 // Query MSO Catalog DB
1431 try (CatalogDatabase db = new CatalogDatabase()) {
1432 Recipe recipe = null;
1434 if (msoRequest.getServiceType () != null
1435 && msoRequest.getServiceType ().length () > 0) {
1436 recipe = db.getNetworkRecipe (msoRequest.getNetworkInputs ().getNetworkType (),
1437 msoRequest.getRequestInfo ().getAction ().value (),
1438 msoRequest.getServiceType ());
1441 if (recipe == null) {
1442 recipe = db.getNetworkRecipe (msoRequest.getNetworkInputs ().getNetworkType (),
1443 msoRequest.getRequestInfo ().getAction ().value (),
1447 if (recipe == null) {
1448 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, "VNF Recipe", "", "", MsoLogger.ErrorCode.DataError, "VNF Recipe attribute not found");
1449 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType.FAILED);
1450 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_NOT_FOUND,
1451 ErrorNumbers.RECIPE_DOES_NOT_EXIST,
1454 msoRequest.createRequestRecord (Status.FAILED);
1456 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
1457 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1460 orchestrationURI = recipe.getOrchestrationUri ();
1461 msoLogger.debug ("Orchestration URI is: " + orchestrationURI);
1463 String requestId = msoRequest.getRequestId ();
1464 msoLogger.debug ("requestId is: " + requestId);
1465 msoLogger.debug ("About to insert a record");
1468 msoRequest.createRequestRecord (Status.PENDING);
1469 } catch (Exception e) {
1470 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.DataError, "Exception while creating record in DB", e);
1471 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType.FAILED);
1472 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1473 ErrorNumbers.COULD_NOT_WRITE_TO_REQUESTS_DB,
1475 "non-unique request-id specified");
1476 // Cannot create a record of this request here, our communication with MSO DB just failed. Do not try
1477 // to create a failed record
1478 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
1479 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1483 RequestClient requestClient = null;
1484 HttpResponse response = null;
1485 long subStartTime = System.currentTimeMillis();
1487 requestClient = RequestClientFactory.getRequestClient (orchestrationURI, props);
1488 // Capture audit event
1489 msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
1490 response = requestClient.post (msoRequest.getRequestXML (),
1492 Integer.toString (recipe.getRecipeTimeout ()).toString (),
1496 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", orchestrationURI, null);
1497 } catch (Exception e) {
1498 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", orchestrationURI, null);
1499 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType.FAILED);
1500 Response resp = msoRequest.buildResponseWithError (HttpStatus.SC_BAD_GATEWAY,
1501 ErrorNumbers.NO_COMMUNICATION_TO_BPEL,
1504 alarmLogger.sendAlarm ("MsoConfigurationError",
1505 MsoAlarmLogger.CRITICAL,
1506 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
1507 msoRequest.updateFinalStatus (Status.FAILED);
1508 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, "Camunda", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine", e);
1509 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
1510 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1514 if (response == null) {
1515 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType.FAILED);
1516 Response resp = msoRequest.buildResponseWithError (HttpStatus.SC_BAD_GATEWAY,
1517 ErrorNumbers.NO_RESPONSE_FROM_BPEL,
1519 "bpelResponse is null");
1520 msoRequest.updateFinalStatus (Status.FAILED);
1521 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, "Null response from BPEL", "Camunda", "", MsoLogger.ErrorCode.DataError, "bpelResponse is null");
1522 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is null");
1523 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1527 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
1528 int bpelStatus = respHandler.getStatus ();
1530 // BPEL accepted the request, the request is in progress
1531 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
1532 String bpelXMLResponseBody = respHandler.getResponseBody ();
1533 msoLogger.debug ("Received from BPEL: " + bpelXMLResponseBody);
1534 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType.IN_PROGRESS);
1535 RequestsDatabase.updateInfraStatus (msoRequest.getRequestId (),
1536 Status.IN_PROGRESS.toString (),
1537 Constants.PROGRESS_REQUEST_IN_PROGRESS,
1538 Constants.MODIFIED_BY_APIHANDLER);
1539 Response resp = msoRequest.buildResponse (bpelStatus, null, null);
1540 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
1541 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1545 String bpelXMLResponseBody = respHandler.getResponseBody ();
1546 if (bpelXMLResponseBody != null && !bpelXMLResponseBody.isEmpty ()) {
1547 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType.FAILED);
1548 Response resp = msoRequest.buildResponse (bpelStatus, bpelXMLResponseBody, null);
1549 msoRequest.updateFinalStatus (Status.FAILED);
1550 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR,
1551 "Response from BPEL engine is failed with HTTP Status=" + bpelStatus, "Camunda", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
1552 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is with status Failed");
1553 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1556 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType.FAILED);
1557 Response resp = msoRequest.buildResponse (bpelStatus, ErrorNumbers.ERROR_FROM_BPEL, null);
1558 msoRequest.updateFinalStatus (Status.FAILED);
1559 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, "Response from BPEL engine is empty", "Camunda", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
1560 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPEL engine is empty");
1561 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1565 } catch (Exception e) {
1566 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, "", "", MsoLogger.ErrorCode.DataError, "Exception while communciate with Catalog DB", e);
1567 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.networkbeans.RequestStatusType.FAILED);
1568 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_NOT_FOUND,
1569 ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB,
1572 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
1573 MsoAlarmLogger.CRITICAL,
1574 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
1575 msoRequest.createRequestRecord (Status.FAILED);
1576 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
1577 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1582 private Response manageVolumeRequestImpl (String reqXML, String version) {
1583 String methodName = "VolumeRequest";
1584 props = loadMsoProperties ();
1586 long startTime = System.currentTimeMillis ();
1588 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.ServiceNotAvailable, "Application not started, properties file missing or invalid");
1589 return NOT_STARTED_RESPONSE;
1592 uriInfo.getRequestUri ();
1594 // Generate unique request id for the new request
1595 UUID requestUUID = UUID.randomUUID ();
1597 VolumeMsoInfraRequest msoRequest = new VolumeMsoInfraRequest (requestUUID.toString ());
1599 if (reqXML == null) {
1600 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.BadRequest, "The input request is null");
1601 return Response.status (HttpStatus.SC_NO_CONTENT).entity ("").build ();
1604 String requestUri = uriInfo.getRequestUri ().toString ();
1606 msoLogger.debug ("Incoming Request: " + reqXML);
1608 msoRequest.setRequestUri (requestUri);
1610 msoLogger.debug ("Schema version: " + version);
1612 msoRequest.parse (reqXML, version, props);
1613 } catch (Exception e) {
1614 msoLogger.debug ("Validation failed: ", e);
1615 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType.FAILED);
1616 Response response = msoRequest.buildResponseFailedValidation (HttpStatus.SC_BAD_REQUEST, e.getMessage ());
1617 if (msoRequest.getRequestId () != null) {
1618 msoLogger.debug ("Logging failed message to the database");
1619 msoRequest.createRequestRecord (Status.FAILED);
1621 msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, reqXML, "", "", MsoLogger.ErrorCode.DataError, "Exception when parsing reqXML", e);
1622 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
1623 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1626 MsoLogger.setServiceName (MsoLogger.getServiceName () + "_" + msoRequest.getRequestInfo ().getAction ().name ());
1627 msoLogger.debug ("Update serviceName with detailed action info to:" + MsoLogger.getServiceName () + "_" + msoRequest.getRequestInfo ().getAction ().name ());
1628 if (msoRequest.getRequestInfo ()
1629 .getAction () == org.openecomp.mso.apihandlerinfra.volumebeans.ActionType.CREATE) {
1630 // Check if this request is a duplicate of the one with the same network Name
1631 msoLogger.debug ("Checking for a duplicate with the same volume-name");
1632 InfraActiveRequests dup = null;
1635 dup = RequestsDatabase.checkDuplicateByVnfName (msoRequest.getVolumeInputs ().getVolumeGroupName (),
1636 msoRequest.getRequestInfo ().getAction ().value (),
1639 } catch (Exception e) {
1640 msoLogger.debug ("Exception", e);
1641 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType.FAILED);
1642 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1643 ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB,
1646 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
1647 MsoAlarmLogger.CRITICAL,
1648 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB));
1649 msoRequest.createRequestRecord (Status.FAILED);
1650 msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC_ATT, "volume-group-name", "", "", MsoLogger.ErrorCode.DataError, "Exception while checking for duplicated request", e);
1651 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while checking for duplicated request");
1652 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1656 // Found the duplicate record. Return the appropriate error.
1657 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType.FAILED);
1658 Response response = msoRequest.buildResponse (HttpStatus.SC_CONFLICT,
1659 ErrorNumbers.LOCKED_CREATE_ON_THE_SAME_VNF_NAME_IN_PROGRESS,
1661 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND,
1662 "CREATE on the same Volume Group Name is already progress", "", "", MsoLogger.ErrorCode.DataError, "Duplicates request - CREATE on the same Volume Group Name is already progress");
1663 msoRequest.createRequestRecord (Status.FAILED);
1664 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, "Duplicates request - CREATE on the same Volume Group Name is already progress");
1665 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1669 // Check if this request is a duplicate of the one with the same volumeGroupId
1670 InfraActiveRequests dup = null;
1671 msoLogger.debug ("Checking for a duplicate with the same volume-group-id");
1673 dup = RequestsDatabase.checkDuplicateByVnfId (msoRequest.getVolumeInputs ().getVolumeGroupId (),
1674 msoRequest.getRequestInfo ().getAction ().value (),
1677 } catch (Exception e) {
1678 msoLogger.debug ("Exception", e);
1679 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType.FAILED);
1680 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1681 ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB,
1684 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
1685 MsoAlarmLogger.CRITICAL,
1686 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB));
1687 msoRequest.createRequestRecord (Status.FAILED);
1688 msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC_ATT, "volume-group-id", "", "", MsoLogger.ErrorCode.DataError, "Exception while checking for a duplicate request with the sam volume-group-id", e);
1689 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while checking for a duplicate request with the sam volume-group-id");
1690 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1694 // Found the duplicate record. Return the appropriate error.
1695 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType.FAILED);
1696 Response response = msoRequest.buildResponse (HttpStatus.SC_CONFLICT,
1697 ErrorNumbers.LOCKED_SAME_ACTION_AND_VNF_ID,
1699 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND,
1700 msoRequest.getRequestInfo ().getAction ().value ()
1701 + " on the same Volume Group Id already in progress", "", "", MsoLogger.ErrorCode.DataError, "Duplicated request on the same Volume Group Id already in progress");
1702 msoRequest.createRequestRecord (Status.FAILED);
1703 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, "Duplicated request on the same Volume Group Id already in progress");
1704 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1709 String orchestrationURI = "";
1711 // Query MSO Catalog DB
1712 try (CatalogDatabase db = new CatalogDatabase()) {
1714 Recipe recipe = null;
1716 if (version.equals(Constants.SCHEMA_VERSION_V1)) {
1717 if (msoRequest.getServiceType () != null
1718 && msoRequest.getServiceType ().length () > 0) {
1719 recipe = db.getVnfComponentsRecipe (msoRequest.getVolumeInputs ().getVnfType (),
1720 Constants.VOLUME_GROUP_COMPONENT_TYPE,
1721 msoRequest.getRequestInfo ().getAction ().value (),
1722 msoRequest.getServiceType ());
1724 if (recipe == null) {
1725 recipe = db.getVnfComponentsRecipe (msoRequest.getVolumeInputs ().getVnfType (),
1726 Constants.VOLUME_GROUP_COMPONENT_TYPE,
1727 msoRequest.getRequestInfo ().getAction ().value (),
1729 // If no recipe for the vnf type is found, look for generic recipe with "*" vnf type
1730 if (recipe == null) {
1731 recipe = db.getVnfComponentsRecipe (Constants.VNF_TYPE_WILDCARD,
1732 Constants.VOLUME_GROUP_COMPONENT_TYPE,
1733 msoRequest.getRequestInfo ().getAction ().value (),
1738 else if (version.equals (Constants.SCHEMA_VERSION_V2) || version.equals (Constants.SCHEMA_VERSION_V3)) {
1739 switch (msoRequest.getRequestInfo ().getAction ()) {
1743 // First get recipe for the vnf type given
1744 recipe = db.getVnfComponentsRecipe (msoRequest.getVolumeInputs ().getVnfType (),
1745 Constants.VOLUME_GROUP_COMPONENT_TYPE,
1746 msoRequest.getRequestInfo ().getAction ().value (), null);
1748 // If no recipe for the vnf type is found, look for generic recipe with "*" vnf type
1749 if (recipe == null) {
1750 recipe = db.getVnfComponentsRecipe (Constants.VNF_TYPE_WILDCARD,
1751 Constants.VOLUME_GROUP_COMPONENT_TYPE,
1752 msoRequest.getRequestInfo ().getAction ().value (), null);
1755 case CREATE_VF_MODULE_VOL:
1756 case UPDATE_VF_MODULE_VOL:
1757 case DELETE_VF_MODULE_VOL:
1758 // First get recipe for the vnf type given
1759 recipe = db.getVnfComponentsRecipe (msoRequest.getVolumeInputs ().getVnfType (),
1760 Constants.VOLUME_GROUP_COMPONENT_TYPE,
1761 msoRequest.getRequestInfo ().getAction ().value (), null);
1763 // If no recipe for the vnf type is found, look for generic recipe with "*" in vf module id
1764 if (recipe == null) {
1765 recipe = db.getVnfComponentsRecipeByVfModuleId (Constants.VNF_TYPE_WILDCARD,
1766 Constants.VOLUME_GROUP_COMPONENT_TYPE,
1767 msoRequest.getRequestInfo ().getAction ().value ());
1776 if (recipe == null) {
1777 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, "VNF Recipe", "", "", MsoLogger.ErrorCode.DataError, "VNF Recipe not found in DB");
1778 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType.FAILED);
1779 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_NOT_FOUND,
1780 ErrorNumbers.RECIPE_DOES_NOT_EXIST,
1783 msoRequest.createRequestRecord (Status.FAILED);
1784 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "VNF Recipe not found in DB");
1785 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1788 orchestrationURI = recipe.getOrchestrationUri ();
1789 msoLogger.debug ("Orchestration URI is: " + orchestrationURI);
1791 String requestId = msoRequest.getRequestId ();
1792 msoLogger.debug ("requestId is: " + requestId);
1793 msoLogger.debug ("About to insert a record");
1796 msoRequest.createRequestRecord (Status.PENDING);
1797 } catch (Exception e) {
1798 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception in createRequestRecord", e);
1799 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType.FAILED);
1800 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1801 ErrorNumbers.COULD_NOT_WRITE_TO_REQUESTS_DB,
1803 "non-unique request-id specified");
1804 // Cannot create a record of this request here, our communication with MSO DB just failed. Do not try
1805 // to create a failed record
1806 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
1807 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1811 RequestClient requestClient = null;
1812 HttpResponse response = null;
1813 long subStartTime = System.currentTimeMillis();
1815 requestClient = RequestClientFactory.getRequestClient (orchestrationURI, props);
1816 // Capture audit event
1817 msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
1818 response = requestClient.post (msoRequest.getRequestXML (),
1820 Integer.toString (recipe.getRecipeTimeout ()).toString (),
1824 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", orchestrationURI, null);
1825 } catch (Exception e) {
1826 msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", orchestrationURI, null);
1827 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType.FAILED);
1828 Response resp = msoRequest.buildResponseWithError (HttpStatus.SC_BAD_GATEWAY,
1829 ErrorNumbers.NO_COMMUNICATION_TO_BPEL,
1832 alarmLogger.sendAlarm ("MsoConfigurationError",
1833 MsoAlarmLogger.CRITICAL,
1834 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
1835 msoRequest.updateFinalStatus (Status.FAILED);
1836 msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, "Camunda", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine", e);
1837 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
1838 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1842 if (response == null) {
1843 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType.FAILED);
1844 Response resp = msoRequest.buildResponseWithError (HttpStatus.SC_BAD_GATEWAY,
1845 ErrorNumbers.NO_RESPONSE_FROM_BPEL,
1847 "bpelResponse is null");
1848 msoRequest.updateFinalStatus (Status.FAILED);
1849 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, "Null response from BPEL", "Camunda", "", MsoLogger.ErrorCode.DataError, "Null response from BPMN engine");
1850 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Null response from BPMN engine");
1851 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1855 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
1856 int bpelStatus = respHandler.getStatus ();
1858 // BPEL accepted the request, the request is in progress
1859 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
1860 String bpelXMLResponseBody = respHandler.getResponseBody ();
1861 msoLogger.debug ("Received from BPEL: " + bpelXMLResponseBody);
1862 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType.IN_PROGRESS);
1863 RequestsDatabase.updateInfraStatus (msoRequest.getRequestId (),
1864 Status.IN_PROGRESS.toString (),
1865 Constants.PROGRESS_REQUEST_IN_PROGRESS,
1866 Constants.MODIFIED_BY_APIHANDLER);
1867 Response resp = msoRequest.buildResponse (bpelStatus, null, null);
1868 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
1869 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1873 String bpelXMLResponseBody = respHandler.getResponseBody ();
1874 if (bpelXMLResponseBody != null && !bpelXMLResponseBody.isEmpty ()) {
1875 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType.FAILED);
1876 Response resp = msoRequest.buildResponse (bpelStatus, bpelXMLResponseBody, null);
1877 msoRequest.updateFinalStatus (Status.FAILED);
1878 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR,
1879 "Response from BPEL engine is failed with HTTP Status=" + bpelStatus, "Camunda", "", MsoLogger.ErrorCode.DataError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
1880 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is with status Failed");
1881 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1884 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType.FAILED);
1885 Response resp = msoRequest.buildResponse (bpelStatus, ErrorNumbers.ERROR_FROM_BPEL, null);
1886 msoRequest.updateFinalStatus (Status.FAILED);
1887 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, "Response from BPEL engine is empty", "Camunda", "", MsoLogger.ErrorCode.DataError, "Response from BPEL engine is empty");
1888 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is empty");
1889 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
1893 } catch (Exception e) {
1894 msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, "", "", MsoLogger.ErrorCode.DataError, "Exception while communciate with Catalog DB", e);
1895 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.volumebeans.RequestStatusType.FAILED);
1896 Response response = msoRequest.buildResponseWithError (HttpStatus.SC_NOT_FOUND,
1897 ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB,
1900 alarmLogger.sendAlarm ("MsoDatabaseAccessError",
1901 MsoAlarmLogger.CRITICAL,
1902 Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
1903 msoRequest.createRequestRecord (Status.FAILED);
1904 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
1905 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1910 private Request mapInfraActiveRequestToRequest(InfraActiveRequests requestDB) {
1913 Request request = new Request();
1915 ObjectMapper mapper = new ObjectMapper();
1916 // mapper.configure(Feature.WRAP_ROOT_VALUE, true);
1918 request.setRequestId(requestDB.getRequestId());
1919 request.setRequestScope(requestDB.getRequestScope());
1920 request.setRequestType(requestDB.getRequestAction());
1922 InstanceReferences ir = new InstanceReferences();
1923 if(requestDB.getNetworkId() != null)
1924 ir.setNetworkInstanceId(requestDB.getNetworkId());
1925 if(requestDB.getNetworkName() != null)
1926 ir.setNetworkInstanceName(requestDB.getNetworkName());
1927 if(requestDB.getServiceInstanceId() != null)
1928 ir.setServiceInstanceId(requestDB.getServiceInstanceId());
1929 if(requestDB.getServiceInstanceName() != null)
1930 ir.setServiceInstanceName(requestDB.getServiceInstanceName());
1931 if(requestDB.getVfModuleId() != null)
1932 ir.setVfModuleInstanceId(requestDB.getVfModuleId());
1933 if(requestDB.getVfModuleName() != null)
1934 ir.setVfModuleInstanceName(requestDB.getVfModuleName());
1935 if(requestDB.getVnfId() != null)
1936 ir.setVnfInstanceId(requestDB.getVnfId());
1937 if(requestDB.getVnfName() != null)
1938 ir.setVnfInstanceName(requestDB.getVnfName());
1939 if(requestDB.getVolumeGroupId() != null)
1940 ir.setVolumeGroupInstanceId(requestDB.getVolumeGroupId());
1941 if(requestDB.getVolumeGroupName() != null)
1942 ir.setVolumeGroupInstanceName(requestDB.getVolumeGroupName());
1945 request.setInstanceReferences(ir);
1947 String requestBody = requestDB.getRequestBody();
1949 RequestDetails requestDetails = null;
1952 requestDetails = mapper.readValue(requestBody, RequestDetails.class);
1954 }catch(Exception e){
1955 msoLogger.debug("Exception caught mapping requestBody to RequestDetails");
1958 request.setRequestDetails(requestDetails);
1959 String startTimeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss").format(requestDB.getStartTime()) + " GMT";
1960 request.setStartTime(startTimeStamp);
1962 RequestStatus status = new RequestStatus();
1963 if(requestDB.getStatusMessage() != null){
1964 status.setStatusMessage(requestDB.getStatusMessage());
1967 if(requestDB.getEndTime() != null){
1968 String endTimeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss").format(requestDB.getEndTime()) + " GMT";
1969 status.setFinishTime(endTimeStamp);
1973 if(requestDB.getRequestStatus() != null){
1974 status.setRequestState(requestDB.getRequestStatus());
1977 if(requestDB.getProgress() != null){
1978 status.setPercentProgress(requestDB.getProgress().intValue());
1981 request.setRequestStatus(status);
1986 private RecipeLookupResult getServiceInstanceOrchestrationURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1988 RecipeLookupResult recipeLookupResult = null;
1989 // Query MSO Catalog DB
1991 if (msoRequest.getModelInfo().getModelType().equals(ModelType.service)) {
1994 // Construct the default service name
1995 // TODO need to make this a configurable property
1997 String defaultServiceName = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1998 Service serviceRecord = db.getServiceByName(defaultServiceName);
1999 int serviceId = serviceRecord.getId();
2000 ServiceRecipe recipe = db.getServiceRecipe(serviceId, action.name());
2002 if (recipe == null) {
2006 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
2008 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule) ||
2009 msoRequest.getModelInfo().getModelType().equals(ModelType.volumeGroup)) {
2011 String vnfComponentType = msoRequest.getModelInfo().getModelType().name();
2012 VnfComponentsRecipe recipe = null;
2014 if (action != Action.deleteInstance) {
2015 RelatedInstanceList[] instanceList = null;
2016 if (msoRequest.getServiceInstancesRequest().getRequestDetails() != null) {
2017 instanceList = msoRequest.getServiceInstancesRequest().getRequestDetails().getRelatedInstanceList();
2020 String serviceModelName = null;
2021 String vnfModelName = null;
2022 String vfModuleModelName = null;
2023 String asdcServiceModelVersion = null;
2024 String modelVersion = null;
2026 if (instanceList != null) {
2028 for(RelatedInstanceList relatedInstanceList : instanceList){
2030 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
2031 if(relatedInstance.getModelInfo().getModelType().equals(ModelType.service)){
2032 serviceModelName = relatedInstance.getModelInfo().getModelName();
2033 asdcServiceModelVersion = relatedInstance.getModelInfo().getModelVersion();
2036 if(relatedInstance.getModelInfo().getModelType().equals(ModelType.vnf)){
2037 vnfModelName = relatedInstance.getModelInfo().getModelCustomizationName();
2040 if(relatedInstance.getModelInfo().getModelType().equals(ModelType.vfModule) ||
2041 relatedInstance.getModelInfo().getModelType().equals(ModelType.volumeGroup)) {
2042 vfModuleModelName = relatedInstance.getModelInfo().getModelName();
2043 modelVersion = relatedInstance.getModelInfo().getModelVersion();
2048 String vnfType = serviceModelName + "/" + vnfModelName;
2050 // Try to find a recipe for a custom flow first
2051 recipe = db.getVnfComponentsRecipe(vnfType, vfModuleModelName, asdcServiceModelVersion, modelVersion, action.name());
2054 if (recipe == null) {
2055 // Find the default recipe record
2056 recipe = db.getVnfComponentsRecipeByVfModuleId("VID_DEFAULT", vnfComponentType, action.name());
2058 if (recipe == null) {
2062 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
2065 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vnf)) {
2067 // Construct the default vnf type
2068 // TODO need to make this a configurable property
2070 String defaultVnfType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
2072 VnfRecipe recipe = db.getVnfRecipe(defaultVnfType, action.name());
2074 if (recipe == null) {
2077 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
2079 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.network)) {
2081 // Construct the default network type
2082 // TODO need to make this a configurable property
2084 String defaultNetworkType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
2086 Recipe recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
2088 if (recipe == null) {
2091 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
2094 if (recipeLookupResult != null) {
2095 msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
2098 msoLogger.debug("No matching recipe record found");
2100 return recipeLookupResult;