Initial OpenECOMP MSO commit
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / openecomp / mso / apihandlerinfra / RequestHandler.java
1 package org.openecomp.mso.apihandlerinfra;
2
3 /*-
4  * #%L
5  * MSO
6  * %%
7  * Copyright (C) 2016 OPENECOMP - MSO
8  * %%
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
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
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.
20  * #L%
21  */
22
23
24 import java.text.SimpleDateFormat;
25 import java.util.*;
26
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;
44
45 import org.openecomp.mso.HealthCheckUtils;
46
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;
51
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;
86
87 @Path("/")
88 public class RequestHandler {
89
90     public final static String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
91
92     private static MsoPropertiesFactory msoPropertiesFactory = new MsoPropertiesFactory ();
93
94     @Context
95     private UriInfo uriInfo;
96
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>";
98
99     private static final Response NOT_STARTED_RESPONSE = Response.status (HttpStatus.SC_SERVICE_UNAVAILABLE)
100                                                                  .entity (NOT_FOUND)
101                                                                  .build ();
102
103     private static boolean noProperties = true;
104
105     private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
106     private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
107
108     @Context
109     private ServletContext sc;
110
111     private static MsoJavaProperties props = loadMsoProperties ();
112     HashMap<String, String> instanceIdMap = new HashMap<String,String>();
113
114     @HEAD
115     @GET
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;
125         }
126
127         if (!healthCheck.configFileCheck(msoLogger, startTime, MSO_PROP_APIHANDLER_INFRA)) {
128             return HealthCheckUtils.NOT_STARTED_RESPONSE;
129         }
130
131         if (!healthCheck.requestDBCheck (msoLogger, startTime)) {
132             return HealthCheckUtils.NOT_STARTED_RESPONSE;
133         }
134         msoLogger.debug("healthcheck - Successful");
135         return HealthCheckUtils.HEALTH_CHECK_RESPONSE;
136     }
137
138     @HEAD
139     @GET
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;
150         }
151
152         if (healthCheck.verifyGlobalHealthCheck(enableBpmn, requestId)) {
153             msoLogger.debug("globalHealthcheck - Successful");
154             return HealthCheckUtils.HEALTH_CHECK_RESPONSE;
155         } else {
156             msoLogger.debug("globalHealthcheck - At leaset one of the sub-modules is not available");
157             return  HealthCheckUtils.HEALTH_CHECK_NOK_RESPONSE;
158         }
159     } 
160
161     private static MsoJavaProperties loadMsoProperties () {
162         MsoJavaProperties msoProperties;
163         try {
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);
167             return null;
168         }
169
170         if (msoProperties != null && msoProperties.size () > 0) {
171             noProperties = false;
172             msoLogger.info (MessageEnum.APIH_PROPERTY_LOAD_SUC, "", "");
173             return msoProperties;
174         } else {
175             msoLogger.error (MessageEnum.APIH_NO_PROPERTIES, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No MSO APIH_INFRA Properties found");
176             return null;
177         }
178     }
179     
180         @POST
181         @Path("/serviceInstances/v2")
182         @Consumes(MediaType.APPLICATION_JSON)
183         @Produces(MediaType.APPLICATION_JSON)
184         public Response createServiceInstance(String request) {
185                                 
186                 Response response = serviceInstances(request, Action.createInstance, null);
187                 
188                 return response;
189         }
190         
191         @DELETE
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) {
196                 
197                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
198                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
199                 return response;
200         }
201         
202         @POST
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) {
207                 
208                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
209                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
210                 
211                 return response;
212         }
213         
214         @DELETE
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) {
220                 
221                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
222                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
223                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
224                 
225                 return response;
226         }
227         
228         @POST
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) {
234                 
235                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
236                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
237                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
238                 
239                 return response;
240         }
241         
242         @PUT
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) {
249                 
250                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
251                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
252                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
253                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap);
254                 
255                 return response;
256         }
257         
258         @DELETE
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) {
265                 
266                 
267                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
268                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
269                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
270                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
271                 
272                 return response;
273         }
274         
275         
276         @POST
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) {
282                 
283                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
284                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
285                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
286                 
287                 return response;
288         }
289         
290         @PUT
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) {
297                 
298                 
299                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
300                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
301                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
302                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap);
303                 
304                 return response;
305         }
306         
307         @DELETE
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) {
314                 
315                 
316                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
317                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
318                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
319                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
320                 
321                 return response;
322         }
323         
324         @POST
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) {
329                 
330                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
331                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap);
332                 
333                 return response;
334         }
335         
336         @PUT
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) {
342                 
343                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
344                 instanceIdMap.put("networkInstanceId", networkInstanceId);
345                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap);
346                 
347                 return response;
348         } 
349         
350         @DELETE
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) {
356                 
357                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
358                 instanceIdMap.put("networkInstanceId", networkInstanceId);
359                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap);
360                 
361                 return response;
362         } 
363     
364     
365         
366         private Response serviceInstances(String requestJSON, Action action, HashMap<String,String> instanceIdMap) {
367                 
368            String requestId = UUIDChecker.generateUUID(msoLogger);
369            long startTime = System.currentTimeMillis ();
370            msoLogger.debug ("requestId is: " + requestId);
371            ServiceInstancesRequest sir = null;
372            
373            MsoRequest msoRequest = new MsoRequest (requestId);
374            
375            
376            try{
377         ObjectMapper mapper = new ObjectMapper();
378         sir = mapper.readValue(requestJSON, ServiceInstancesRequest.class);
379         
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);
388            }
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 ());
392            return response;
393        } 
394            
395           
396            try{
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);
406            }
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 ());
410            return response;
411        }
412            
413            InfraActiveRequests dup = null;
414            String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
415            String requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
416        try {
417                  dup = RequestsDatabase.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
418                                  
419           } catch (Exception e) {
420            msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
421                        
422           Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException, 
423                                                                  e.getMessage(), 
424                                                                  ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
425                                                                  null) ;
426           
427           
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 ());
430           return response;
431        }
432               
433        if (dup != null) {
434                  // Found the duplicate record. Return the appropriate error.
435                    String instance = null;
436                    if(instanceName != null){
437                            instance = instanceName;
438                    }else{
439                            instance = instanceIdMap.get(requestScope + "InstanceId");
440                    }
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());
444            
445            Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException, 
446                    dupMessage, 
447                    ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
448                    null) ;
449            
450            
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 ());
455            return response;
456        }
457            
458            
459            ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
460            
461            RequestReferences referencesResponse = new RequestReferences();
462            
463            referencesResponse.setRequestId(requestId);
464            
465            serviceResponse.setRequestReferences(referencesResponse);    
466                    
467        try (CatalogDatabase db = new CatalogDatabase()) {
468
469            RecipeLookupResult recipeLookupResult = null;
470            try {
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,
479                        null);
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 ());
486                db.close();
487                return response;
488            }
489
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,
497                        null);
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 ());
501                db.close();
502                return response;
503            }
504
505
506            Boolean isBaseVfModule = false;
507
508            if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule)) {
509                String asdcServiceModelVersion = msoRequest.getAsdcServiceModelVersion ();
510
511                // Get VF Module-specific base module indicator
512                VfModule vfm = null;
513
514                if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
515                    vfm = db.getVfModuleType (msoRequest.getVfModuleType (), asdcServiceModelVersion);
516                }
517                else {
518                    vfm = db.getVfModuleType (msoRequest.getVfModuleType ());
519                }
520
521                if (vfm != null) {
522                    if (vfm.getIsBase() == 1) {
523                        isBaseVfModule = true;
524                    }
525                }
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;
534                    }
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,
539                            null);
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 ());
543                    db.close();
544                    return response;
545                }
546            }
547
548            db.close();
549
550            String serviceInstanceId = "";
551            String vnfId = "";
552            String vfModuleId = "";
553            String volumeGroupId = "";
554            String networkId = "";
555            ServiceInstancesRequest siReq = msoRequest.getServiceInstancesRequest();
556
557            if(siReq.getServiceInstanceId () != null){
558                serviceInstanceId = siReq.getServiceInstanceId ();
559            }
560
561            if(siReq.getVnfInstanceId () != null){
562                vnfId = siReq.getVnfInstanceId ();
563            }
564
565            if(siReq.getVfModuleInstanceId () != null){
566                vfModuleId = siReq.getVfModuleInstanceId ();
567            }
568
569            if(siReq.getVolumeGroupInstanceId () != null){
570                volumeGroupId = siReq.getVolumeGroupInstanceId ();
571            }
572
573            if(siReq.getNetworkInstanceId () != null){
574                networkId = siReq.getNetworkInstanceId ();
575            }
576
577
578            requestId = msoRequest.getRequestId ();
579            msoLogger.debug ("requestId is: " + requestId);
580            msoLogger.debug ("About to insert a record");
581
582            try {
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,
591                        null);
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 ());
594                return response;
595            }
596
597            RequestClient requestClient = null;
598            HttpResponse response = null;
599            long subStartTime = System.currentTimeMillis();
600            try {
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 ());
604
605                System.out.println("URL : " + requestClient.getUrl ());
606
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);
612
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,
621                        null);
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 ());
629                return resp;
630            }
631
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,
638                        null);
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 ());
643                return resp;
644            }
645
646            ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
647            int bpelStatus = respHandler.getStatus ();
648
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 ();
661            } else {
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,
671                            variables);
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 ());
676                    return resp;
677                } else {
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,
683                            variables);
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 ());
688                    return resp;
689                }
690            }
691
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,
701                                                                   null);
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 ());
708            return response;
709        }
710         } 
711         
712         @GET
713         @Path("/orchestrationRequests/v2/{requestId}")
714         @Produces(MediaType.APPLICATION_JSON)
715         public Response getOrchestrationRequest(@PathParam("requestId") String requestId) {
716                 
717                 GetOrchestrationResponse orchestrationResponse = new GetOrchestrationResponse();
718                 
719                 MsoRequest msoRequest = new MsoRequest (requestId);
720                 
721                 long startTime = System.currentTimeMillis ();
722                 
723                 InfraActiveRequests requestDB = null;
724         
725         try {
726                  requestDB = RequestsDatabase.getRequestFromInfraActive(requestId);
727                  
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,
733                                                                                                                           e.getMessage (),
734                                                                        ErrorNumbers.NO_COMMUNICATION_TO_REQUESTS_DB,
735                                                                        null);
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 ());
741                 return response;
742                 
743             }
744         
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,
750                                                              null);
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 ());
754             return resp;
755                 
756         }
757   
758         Request request = mapInfraActiveRequestToRequest(requestDB);
759          
760         orchestrationResponse.setRequest(request);
761                 
762         return Response.status(200).entity(orchestrationResponse).build();
763         }
764         
765         @GET
766         @Path("/orchestrationRequests/v2")
767         @Produces(MediaType.APPLICATION_JSON)
768         public Response getOrchestrationRequest(@Context UriInfo ui) {
769                 
770                 long startTime = System.currentTimeMillis ();
771                 
772                 MsoRequest msoRequest = new MsoRequest();
773                 
774                 MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
775                 
776                 List<InfraActiveRequests> activeRequests = null;
777                 
778                 GetOrchestrationListResponse orchestrationList = null;
779                 
780                 
781                 try{
782                 
783                         Map<String, List<String>> orchestrationMap = msoRequest.getOrchestrationFilters(queryParams);
784                         
785                         activeRequests = RequestsDatabase.getOrchestrationFiltersFromInfraActive(orchestrationMap);
786                         
787                         orchestrationList = new GetOrchestrationListResponse();
788
789                         List<RequestList> requestLists = new ArrayList<RequestList>();
790                                                 
791                         for(InfraActiveRequests infraActive : activeRequests){
792                                 
793                                 Request request = mapInfraActiveRequestToRequest(infraActive);
794                                 RequestList requestList = new RequestList();
795                                 requestList.setRequest(request);
796
797                                 requestLists.add(requestList);
798
799                         }
800                         
801                         orchestrationList.setRequestList(requestLists);
802
803                 }catch(Exception e){
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 ());
811                    return response;
812                 }
813                 
814                         
815         return Response.status(200).entity(orchestrationList).build();
816         }
817
818         @POST
819     @Path("/v3/vnf-request")
820     @Consumes("*/*")
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);
826     }
827
828
829     @POST
830     @Path("/v2/vnf-request")
831     @Consumes("*/*")
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);
837     }
838
839     @POST
840     @Path("/v1/vnf-request")
841     @Consumes("*/*")
842     @Produces("application/xml")
843     public Response manageVnfRequestV1 (String reqXML) {
844
845         // Set logger parameters
846         MsoLogger.setServiceName ("VnfRequest");
847
848         return manageVnfRequestImpl (reqXML, Constants.SCHEMA_VERSION_V1);
849     }
850     
851     @POST
852     @Path("/v3/network-request")
853     @Consumes("*/*")
854     @Produces("application/xml")
855     public Response manageNetworkRequestV3 (String reqXML) {
856
857         // Set logger parameters
858         MsoLogger.setServiceName ("NetworkRequest");
859
860         return manageNetworkRequestImpl (reqXML, Constants.SCHEMA_VERSION_V3);
861     }
862
863     @POST
864     @Path("/v2/network-request")
865     @Consumes("*/*")
866     @Produces("application/xml")
867     public Response manageNetworkRequestV2 (String reqXML) {
868
869         // Set logger parameters
870         MsoLogger.setServiceName ("NetworkRequest");
871
872         return manageNetworkRequestImpl (reqXML, Constants.SCHEMA_VERSION_V2);
873     }
874     
875     @POST
876     @Path("/v1/network-request")
877     @Consumes("*/*")
878     @Produces("application/xml")
879     public Response manageNetworkRequestV1 (String reqXML) {
880
881         // Set logger parameters
882         MsoLogger.setServiceName ("NetworkRequest");
883
884         return manageNetworkRequestImpl (reqXML, Constants.SCHEMA_VERSION_V1);
885     }
886     
887     @POST
888     @Path("/v3/volume-request")
889     @Consumes("*/*")
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);
895     }
896
897     @POST
898     @Path("/v2/volume-request")
899     @Consumes("*/*")
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);
905     }
906
907     @POST
908     @Path("/v1/volume-request")
909     @Consumes("*/*")
910     @Produces("application/xml")
911     public Response manageVolumeRequestV1 (String reqXML) {
912
913         // Set logger parameters
914         MsoLogger.setServiceName ("VolumeRequest");
915
916         return manageVolumeRequestImpl (reqXML, Constants.SCHEMA_VERSION_V1);
917     }
918
919
920     private Response manageVnfRequestImpl (String reqXML, String version) {
921         String methodName = "VnfRequest";
922         props = loadMsoProperties ();
923         long startTime = System.currentTimeMillis ();
924
925         // Generate unique request id for the new request
926         UUID requestUUID = UUID.randomUUID ();
927
928         VnfMsoInfraRequest msoRequest = new VnfMsoInfraRequest (requestUUID.toString ());
929         MsoLogger.setLogContext (msoRequest.getRequestId (), null);
930
931         if (noProperties) {
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;
934         }
935
936         uriInfo.getRequestUri ();
937
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 ();
941         }
942
943         String requestUri = uriInfo.getRequestUri ().toString ();
944         msoLogger.debug ("Incoming request received for pose VNFRequest:" + reqXML);
945
946         msoRequest.setRequestUri (requestUri);
947         msoLogger.debug ("Schema version: " + version);
948         try {
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);
957             }
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 ());
961             return response;
962         }
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;
969             try {
970                 dup = RequestsDatabase.checkDuplicateByVnfName (msoRequest.getVnfInputs ().getVnfName (),
971                                                                 msoRequest.getRequestInfo ().getAction ().value (),
972                                                                 "VNF");
973
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,
979                                                                        null,
980                                                                        e.getMessage ());
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 ());
988                 return response;
989             }
990             if (dup != null) {
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,
995                                                               dup);
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 ());
1000                 return response;
1001             }
1002         } else {
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");
1006             try {
1007                 dup = RequestsDatabase.checkDuplicateByVnfId (msoRequest.getVnfInputs ().getVnfId (),
1008                                                               msoRequest.getRequestInfo ().getAction ().value (),
1009                                                               "VNF");
1010
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,
1016                                                                        null,
1017                                                                        e.getMessage ());
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 ());
1025                 return response;
1026             }
1027             if (dup != null) {
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,
1032                                                               dup);
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");
1036
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 ());
1040                 return response;
1041             }
1042         }
1043
1044         String orchestrationURI = "";
1045
1046         try (CatalogDatabase db = new CatalogDatabase()) {
1047
1048             Recipe recipe = null;
1049
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 ());
1057                 }
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 (),
1062                             null);
1063                 }
1064             }
1065             if (version.equals (Constants.SCHEMA_VERSION_V2) || version.equals (Constants.SCHEMA_VERSION_V3)) {
1066                 switch (msoRequest.getRequestInfo ().getAction ()) {
1067                     case CREATE:
1068                     case UPDATE:
1069                     case DELETE:
1070                         // First get recipe for the vnf type given
1071                         recipe = db.getVnfRecipe (msoRequest.getVnfInputs ().getVnfType (),
1072                                 msoRequest.getRequestInfo ().getAction ().value ());
1073
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 ());
1078                         }
1079                         break;
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 ());
1086
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 ());
1091                         }
1092                         // First get recipe for the vnf type given
1093                         //recipe = db.getVnfRecipe (msoRequest.getVnfInputs ().getVnfType (),
1094                         //      msoRequest.getRequestInfo ().getAction ().value ());
1095
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 ());
1100                         //
1101                         //}
1102                         break;
1103                     default:
1104                         break;
1105                 }
1106
1107             }
1108
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,
1114                         null,
1115                         "");
1116                 msoRequest.createRequestRecord (Status.FAILED);
1117                 db.close ();
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 ());
1120                 return response;
1121             }
1122             orchestrationURI = recipe.getOrchestrationUri ();
1123             msoLogger.debug ("Orchestration URI is: " + orchestrationURI);
1124
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 ();
1135
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);
1141                     }
1142                     else {
1143                         vfm = db.getVfModuleType (vfModuleType);
1144                     }
1145                     if (vfm != null) {
1146                         if (vfm.getIsBase() == 1) {
1147                             isBase = true;
1148                         }
1149                         personaModelId = vfm.getModelInvariantUuid();
1150                         personaModelVersion = vfm.getModelVersion();
1151                         msoLogger.debug("Setting personaModelId to " + personaModelId +
1152                                 ", personaModelVersion to " + personaModelVersion);
1153                     }
1154                     // Get VNF-specific persona info
1155                     VnfResource vnfr = null;
1156                     if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
1157                         vnfr = db.getVnfResource (msoRequest.getVnfInputs ().getVnfType (), asdcServiceModelVersion);
1158                     }
1159                     else {
1160                         vnfr = db.getVnfResource (msoRequest.getVnfInputs ().getVnfType ());
1161                     }
1162                     if (vnfr != null) {
1163                         vnfPersonaModelId = vnfr.getModelInvariantUuid ();
1164                         vnfPersonaModelVersion = vnfr.getModelVersion();
1165                         msoLogger.debug("Setting vnfPersonaModelId to " + vnfPersonaModelId +
1166                                 ", vnfPersonaModelVersion to " + vnfPersonaModelVersion);
1167                     }
1168
1169                     msoRequest.addBPMNSpecificInputs(personaModelId, personaModelVersion, isBase,
1170                             vnfPersonaModelId, vnfPersonaModelVersion);
1171
1172                     break;
1173                 default:
1174                     break;
1175             }
1176
1177             db.close ();
1178
1179             String requestId = msoRequest.getRequestId ();
1180             msoLogger.debug ("requestId is: " + requestId);
1181             msoLogger.debug ("About to insert a record");
1182
1183             try {
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,
1190                         null,
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 ());
1196                 return response;
1197             }
1198
1199             msoLogger.debug("Request going to BPEL: " + msoRequest.getRequestXML ());
1200
1201             RequestClient requestClient = null;
1202             HttpResponse response = null;
1203             long subStartTime = System.currentTimeMillis();
1204             try {
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 (),
1209                         requestId,
1210                         Integer.toString (recipe.getRecipeTimeout ()).toString (),
1211                         version,
1212                         null,
1213                         null);
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,
1220                         null,
1221                         e.getMessage ());
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 ());
1229                 return resp;
1230             }
1231
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,
1236                         null,
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 ());
1242                 return resp;
1243             }
1244
1245             ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
1246             int bpelStatus = respHandler.getStatus ();
1247
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 ());
1260                 return resp;
1261             } else {
1262
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 ());
1272                     return resp;
1273                 } else {
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 ());
1280                     return resp;
1281                 }
1282             }
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,
1288                                                                    null,
1289                                                                    e.getMessage ());
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 ());
1296             return response;
1297         }
1298     }
1299
1300     private Response manageNetworkRequestImpl (String reqXML, String version) {
1301         String methodName = "NetworkRequest";
1302
1303         props = loadMsoProperties ();
1304
1305         long startTime = System.currentTimeMillis ();
1306         if (noProperties) {
1307             msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.ServiceNotAvailable, "Application not started, properties file missing or invalid");
1308                 return NOT_STARTED_RESPONSE;
1309         }
1310         uriInfo.getRequestUri ();
1311
1312         // Generate unique request id for the new request
1313         UUID requestUUID = UUID.randomUUID ();
1314
1315         NetworkMsoInfraRequest msoRequest = new NetworkMsoInfraRequest (requestUUID.toString ());
1316         MsoLogger.setLogContext (msoRequest.getRequestId (), null);
1317
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 ();
1321         }
1322
1323         String requestUri = uriInfo.getRequestUri ().toString ();
1324
1325         msoLogger.debug ("Incoming Request: " + reqXML);
1326
1327         msoRequest.setRequestUri (requestUri);
1328         msoLogger.debug ("Schema version: " + version);
1329         try {
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);
1338             }
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 ());
1342             return response;
1343         }
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;
1351             try {
1352
1353                 dup = RequestsDatabase.checkDuplicateByVnfName (msoRequest.getNetworkInputs ().getNetworkName (),
1354                                                                 msoRequest.getRequestInfo ().getAction ().value (),
1355                                                                 "NETWORK");
1356
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,
1362                                                                        null,
1363                                                                        e.getMessage ());
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 ());
1371                 return response;
1372             }
1373             if (dup != null) {
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,
1378                                                               dup);
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 ());
1384                 return response;
1385             }
1386         } else {
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");
1390             try {
1391                 dup = RequestsDatabase.checkDuplicateByVnfId (msoRequest.getNetworkInputs ().getNetworkId (),
1392                                                               msoRequest.getRequestInfo ().getAction ().value (),
1393                                                               "NETWORK");
1394
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,
1400                                                                        null,
1401                                                                        e.getMessage ());
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 ());
1409                 return response;
1410             }
1411             if (dup != null) {
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,
1416                                                               dup);
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");
1420
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 ());
1424                 return response;
1425             }
1426         }
1427
1428         String orchestrationURI = "";
1429
1430         // Query MSO Catalog DB
1431         try (CatalogDatabase db = new CatalogDatabase()) {
1432             Recipe recipe = null;
1433
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 ());
1439
1440             }
1441             if (recipe == null) {
1442                 recipe = db.getNetworkRecipe (msoRequest.getNetworkInputs ().getNetworkType (),
1443                         msoRequest.getRequestInfo ().getAction ().value (),
1444                         null);
1445             }
1446
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,
1452                         null,
1453                         "");
1454                 msoRequest.createRequestRecord (Status.FAILED);
1455                 db.close ();
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 ());
1458                 return response;
1459             }
1460             orchestrationURI = recipe.getOrchestrationUri ();
1461             msoLogger.debug ("Orchestration URI is: " + orchestrationURI);
1462
1463             String requestId = msoRequest.getRequestId ();
1464             msoLogger.debug ("requestId is: " + requestId);
1465             msoLogger.debug ("About to insert a record");
1466
1467             try {
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,
1474                         null,
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 ());
1480                 return response;
1481             }
1482
1483             RequestClient requestClient = null;
1484             HttpResponse response = null;
1485             long subStartTime = System.currentTimeMillis();
1486             try {
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 (),
1491                         requestId,
1492                         Integer.toString (recipe.getRecipeTimeout ()).toString (),
1493                         version,
1494                         null,
1495                         null);
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,
1502                         null,
1503                         e.getMessage ());
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 ());
1511                 return resp;
1512             }
1513
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,
1518                         null,
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 ());
1524                 return resp;
1525             }
1526
1527             ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
1528             int bpelStatus = respHandler.getStatus ();
1529
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 ());
1542                 return resp;
1543             } else {
1544
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 ());
1554                     return resp;
1555                 } else {
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 ());
1562                     return resp;
1563                 }
1564             }
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,
1570                                                                    null,
1571                                                                    e.getMessage ());
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 ());
1578             return response;
1579         }
1580     }
1581
1582     private Response manageVolumeRequestImpl (String reqXML, String version) {
1583         String methodName = "VolumeRequest";
1584         props = loadMsoProperties ();
1585        
1586         long startTime = System.currentTimeMillis ();
1587         if (noProperties) {
1588             msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.ServiceNotAvailable, "Application not started, properties file missing or invalid");
1589                 return NOT_STARTED_RESPONSE;
1590         }
1591
1592         uriInfo.getRequestUri ();
1593
1594         // Generate unique request id for the new request
1595         UUID requestUUID = UUID.randomUUID ();
1596
1597         VolumeMsoInfraRequest msoRequest = new VolumeMsoInfraRequest (requestUUID.toString ());
1598
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 ();
1602         }
1603
1604         String requestUri = uriInfo.getRequestUri ().toString ();
1605
1606         msoLogger.debug ("Incoming Request: " + reqXML);
1607
1608         msoRequest.setRequestUri (requestUri);
1609        
1610         msoLogger.debug ("Schema version: " + version);
1611         try {
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);
1620             }
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 ());
1624             return response;
1625         }
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;
1633             try {
1634
1635                 dup = RequestsDatabase.checkDuplicateByVnfName (msoRequest.getVolumeInputs ().getVolumeGroupName (),
1636                                                                 msoRequest.getRequestInfo ().getAction ().value (),
1637                                                                 "VOLUME");
1638
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,
1644                                                                        null,
1645                                                                        e.getMessage ());
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 ());
1653                 return response;
1654             }
1655             if (dup != null) {
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,
1660                                                               dup);
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 ());
1666                 return response;
1667             }
1668         } else {
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");
1672             try {
1673                 dup = RequestsDatabase.checkDuplicateByVnfId (msoRequest.getVolumeInputs ().getVolumeGroupId (),
1674                                                               msoRequest.getRequestInfo ().getAction ().value (),
1675                                                               "VOLUME");
1676
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,
1682                                                                        null,
1683                                                                        e.getMessage ());
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 ());
1691                 return response;
1692             }
1693             if (dup != null) {
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,
1698                                                               dup);
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 ());
1705                 return response;
1706             }
1707         }
1708
1709         String orchestrationURI = "";
1710
1711         // Query MSO Catalog DB
1712         try (CatalogDatabase db = new CatalogDatabase()) {
1713
1714             Recipe recipe = null;
1715
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 ());
1723                 }
1724                 if (recipe == null) {
1725                     recipe = db.getVnfComponentsRecipe (msoRequest.getVolumeInputs ().getVnfType (),
1726                             Constants.VOLUME_GROUP_COMPONENT_TYPE,
1727                             msoRequest.getRequestInfo ().getAction ().value (),
1728                             null);
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 (),
1734                                 null);
1735                     }
1736                 }
1737             }
1738             else if (version.equals (Constants.SCHEMA_VERSION_V2) || version.equals (Constants.SCHEMA_VERSION_V3)) {
1739                 switch (msoRequest.getRequestInfo ().getAction ()) {
1740                     case CREATE:
1741                     case UPDATE:
1742                     case DELETE:
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);
1747
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);
1753                         }
1754                         break;
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);
1762
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 ());
1768                         }
1769                         break;
1770                     default:
1771                         break;
1772                 }
1773
1774             }
1775
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,
1781                         null,
1782                         "");
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 ());
1786                 return response;
1787             }
1788             orchestrationURI = recipe.getOrchestrationUri ();
1789             msoLogger.debug ("Orchestration URI is: " + orchestrationURI);
1790
1791             String requestId = msoRequest.getRequestId ();
1792             msoLogger.debug ("requestId is: " + requestId);
1793             msoLogger.debug ("About to insert a record");
1794
1795             try {
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,
1802                         null,
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 ());
1808                 return response;
1809             }
1810
1811             RequestClient requestClient = null;
1812             HttpResponse response = null;
1813             long subStartTime = System.currentTimeMillis();
1814             try {
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 (),
1819                         requestId,
1820                         Integer.toString (recipe.getRecipeTimeout ()).toString (),
1821                         version,
1822                         null,
1823                         null);
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,
1830                         null,
1831                         e.getMessage ());
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 ());
1839                 return resp;
1840             }
1841
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,
1846                         null,
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 ());
1852                 return resp;
1853             }
1854
1855             ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
1856             int bpelStatus = respHandler.getStatus ();
1857
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 ());
1870                 return resp;
1871             } else {
1872
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 ());
1882                     return resp;
1883                 } else {
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 ());
1890                     return resp;
1891                 }
1892             }
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,
1898                                                                    null,
1899                                                                    e.getMessage ());
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 ());
1906             return response;
1907         }
1908     }
1909     
1910     private Request mapInfraActiveRequestToRequest(InfraActiveRequests requestDB)  {
1911         
1912           
1913         Request request = new Request();
1914         
1915         ObjectMapper mapper = new ObjectMapper();
1916        // mapper.configure(Feature.WRAP_ROOT_VALUE, true);
1917        
1918        request.setRequestId(requestDB.getRequestId());
1919        request.setRequestScope(requestDB.getRequestScope());
1920        request.setRequestType(requestDB.getRequestAction());
1921        
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());
1943
1944        
1945        request.setInstanceReferences(ir);
1946        
1947        String requestBody = requestDB.getRequestBody();
1948               
1949        RequestDetails requestDetails = null;
1950        
1951        try{
1952         requestDetails = mapper.readValue(requestBody, RequestDetails.class);
1953         
1954        }catch(Exception e){
1955         msoLogger.debug("Exception caught mapping requestBody to RequestDetails");
1956        }
1957                
1958        request.setRequestDetails(requestDetails);
1959        String startTimeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss").format(requestDB.getStartTime()) + " GMT";
1960        request.setStartTime(startTimeStamp);
1961        
1962        RequestStatus status = new RequestStatus();
1963        if(requestDB.getStatusMessage() != null){
1964            status.setStatusMessage(requestDB.getStatusMessage());
1965        }
1966        
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);
1970        }
1971
1972         
1973        if(requestDB.getRequestStatus() != null){
1974            status.setRequestState(requestDB.getRequestStatus());
1975        }
1976        
1977        if(requestDB.getProgress() != null){
1978            status.setPercentProgress(requestDB.getProgress().intValue());
1979        }
1980        
1981        request.setRequestStatus(status);
1982        
1983        return request;
1984    }
1985     
1986     private RecipeLookupResult getServiceInstanceOrchestrationURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1987
1988         RecipeLookupResult recipeLookupResult = null;
1989         // Query MSO Catalog DB
1990                
1991         if (msoRequest.getModelInfo().getModelType().equals(ModelType.service)) {
1992                 
1993         // SERVICE REQUEST
1994                 // Construct the default service name
1995             // TODO need to make this a configurable property
1996             
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());
2001                 
2002                 if (recipe == null) {                 
2003                 return null;
2004             }   
2005                 
2006                 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());                
2007         }
2008         else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule) ||
2009                         msoRequest.getModelInfo().getModelType().equals(ModelType.volumeGroup)) {
2010                 
2011                 String vnfComponentType = msoRequest.getModelInfo().getModelType().name();
2012                 VnfComponentsRecipe recipe = null;
2013                 
2014                 if (action != Action.deleteInstance) {
2015                         RelatedInstanceList[] instanceList = null;
2016                         if (msoRequest.getServiceInstancesRequest().getRequestDetails() != null) {
2017                                 instanceList = msoRequest.getServiceInstancesRequest().getRequestDetails().getRelatedInstanceList();
2018                         }
2019                         
2020                         String serviceModelName = null;
2021                         String vnfModelName = null;
2022                         String vfModuleModelName = null;
2023                         String asdcServiceModelVersion = null;
2024                         String modelVersion = null;
2025                         
2026                         if (instanceList != null) {
2027                         
2028                                 for(RelatedInstanceList relatedInstanceList : instanceList){
2029                                         
2030                                         RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
2031                                         if(relatedInstance.getModelInfo().getModelType().equals(ModelType.service)){
2032                                                 serviceModelName = relatedInstance.getModelInfo().getModelName();
2033                                                 asdcServiceModelVersion = relatedInstance.getModelInfo().getModelVersion();
2034                                         }
2035                                         
2036                                         if(relatedInstance.getModelInfo().getModelType().equals(ModelType.vnf)){
2037                                                 vnfModelName = relatedInstance.getModelInfo().getModelCustomizationName();
2038                                         }
2039                                         
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();
2044                                         }                       
2045                                 }
2046                         }
2047                         
2048                         String vnfType = serviceModelName + "/" + vnfModelName;
2049                         
2050                         // Try to find a recipe for a custom flow first
2051                         recipe = db.getVnfComponentsRecipe(vnfType, vfModuleModelName, asdcServiceModelVersion, modelVersion, action.name());
2052                 }
2053                 
2054                 if (recipe == null) {
2055                         // Find the default recipe record
2056                         recipe = db.getVnfComponentsRecipeByVfModuleId("VID_DEFAULT", vnfComponentType, action.name());
2057                         
2058                         if (recipe == null) {                              
2059                                 return null;
2060                         }
2061             }                   
2062                 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());                
2063                 
2064         }
2065         else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vnf)) {
2066                 // VNF REQUEST
2067                 // Construct the default vnf type
2068             // TODO need to make this a configurable property
2069             
2070             String defaultVnfType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
2071                 
2072                 VnfRecipe recipe = db.getVnfRecipe(defaultVnfType, action.name());
2073                 
2074                 if (recipe == null) {               
2075                 return null;
2076             }                   
2077                 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());        
2078         }
2079         else if (msoRequest.getModelInfo().getModelType().equals(ModelType.network)) {
2080                 // NETWORK REQUEST
2081                 // Construct the default network type
2082             // TODO need to make this a configurable property
2083             
2084             String defaultNetworkType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
2085                 
2086                 Recipe recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
2087                 
2088                 if (recipe == null) {                
2089                 return null;
2090             }                   
2091                 recipeLookupResult = new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());   
2092         }       
2093         
2094         if (recipeLookupResult != null) {
2095                 msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
2096         }
2097         else {
2098                 msoLogger.debug("No matching recipe record found");
2099         }
2100         return recipeLookupResult;
2101     }
2102 }