Merge "Add correlationId to ServiceInstancesRequest"
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / openecomp / mso / apihandlerinfra / ServiceInstances.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21 package org.openecomp.mso.apihandlerinfra;
22
23 import java.io.IOException;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
27
28 import javax.ws.rs.Consumes;
29 import javax.ws.rs.DELETE;
30 import javax.ws.rs.POST;
31 import javax.ws.rs.PUT;
32 import javax.ws.rs.Path;
33 import javax.ws.rs.PathParam;
34 import javax.ws.rs.Produces;
35 import javax.ws.rs.core.MediaType;
36 import javax.ws.rs.core.Response;
37
38 import org.apache.commons.lang.StringUtils;
39 import org.apache.http.HttpResponse;
40 import org.apache.http.HttpStatus;
41 import com.fasterxml.jackson.databind.ObjectMapper;
42 import org.openecomp.mso.apihandler.common.CommonConstants;
43 import org.openecomp.mso.apihandler.common.ErrorNumbers;
44 import org.openecomp.mso.apihandler.common.RequestClient;
45 import org.openecomp.mso.apihandler.common.RequestClientFactory;
46 import org.openecomp.mso.apihandler.common.RequestClientParamater;
47 import org.openecomp.mso.apihandler.common.ResponseHandler;
48 import org.openecomp.mso.apihandler.common.ValidationException;
49 import org.openecomp.mso.serviceinstancebeans.ModelInfo;
50 import org.openecomp.mso.serviceinstancebeans.ModelType;
51 import org.openecomp.mso.serviceinstancebeans.RelatedInstance;
52 import org.openecomp.mso.serviceinstancebeans.RelatedInstanceList;
53 import org.openecomp.mso.serviceinstancebeans.RequestParameters;
54 import org.openecomp.mso.serviceinstancebeans.RequestReferences;
55 import org.openecomp.mso.serviceinstancebeans.ServiceInstancesRequest;
56 import org.openecomp.mso.serviceinstancebeans.ServiceInstancesResponse;
57 import org.openecomp.mso.db.catalog.CatalogDatabase;
58 import org.openecomp.mso.db.catalog.beans.NetworkResource;
59 import org.openecomp.mso.db.catalog.beans.Recipe;
60 import org.openecomp.mso.db.catalog.beans.Service;
61 import org.openecomp.mso.db.catalog.beans.ServiceRecipe;
62 import org.openecomp.mso.db.catalog.beans.VfModule;
63 import org.openecomp.mso.db.catalog.beans.VfModuleCustomization;
64 import org.openecomp.mso.db.catalog.beans.VnfRecipe;
65 import org.openecomp.mso.db.catalog.beans.VnfResource;
66 import org.openecomp.mso.db.catalog.beans.VnfResourceCustomization;
67 import org.openecomp.mso.logger.MessageEnum;
68 import org.openecomp.mso.logger.MsoAlarmLogger;
69 import org.openecomp.mso.logger.MsoLogger;
70 import org.openecomp.mso.properties.MsoJavaProperties;
71 import org.openecomp.mso.requestsdb.InfraActiveRequests;
72 import org.openecomp.mso.requestsdb.RequestsDatabase;
73 import org.openecomp.mso.utils.UUIDChecker;
74
75 import com.wordnik.swagger.annotations.Api;
76 import com.wordnik.swagger.annotations.ApiOperation;
77
78 @Path("/serviceInstances")
79 @Api(value="/serviceInstances",description="API Requests for Service Instances")
80 public class ServiceInstances {
81
82         private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH);
83         private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger ();
84
85         @POST
86         @Path("/{version:[vV][4-6]}")
87         @Consumes(MediaType.APPLICATION_JSON)
88         @Produces(MediaType.APPLICATION_JSON)
89         @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
90         public Response createServiceInstance(String request, @PathParam("version") String version) {
91
92                 Response response = serviceInstances(request, Action.createInstance, null, version);
93
94                 return response;
95         }
96         
97         @POST
98         @Path("/{version:[vV][5-6]}/{serviceInstanceId}/activate")
99         @Consumes(MediaType.APPLICATION_JSON)
100         @Produces(MediaType.APPLICATION_JSON)
101         @ApiOperation(value="Activate provided Service Instance",response=Response.class)
102         public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
103                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
104                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
105                 Response response = serviceInstances(request, Action.activateInstance, instanceIdMap, version);
106
107                 return response;
108         }
109         
110         @POST
111         @Path("/{version:[vV][5-6]}/{serviceInstanceId}/deactivate")
112         @Consumes(MediaType.APPLICATION_JSON)
113         @Produces(MediaType.APPLICATION_JSON)
114         @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
115         public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
116                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
117                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
118                 Response response = serviceInstances(request, Action.deactivateInstance, instanceIdMap, version);
119
120                 return response;
121         }
122         
123         @DELETE
124         @Path("/{version:[vV][4-6]}/{serviceInstanceId}")
125         @Consumes(MediaType.APPLICATION_JSON)
126         @Produces(MediaType.APPLICATION_JSON)
127         @ApiOperation(value="Delete provided Service Instance",response=Response.class)
128         public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
129                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
130                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
131                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
132                 return response;
133         }
134         
135         @POST
136         @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations")
137         @Consumes(MediaType.APPLICATION_JSON)
138         @Produces(MediaType.APPLICATION_JSON)
139         @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
140         public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
141                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
142                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
143                 Response response = configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version);
144
145                 return response;
146         }
147         
148         @DELETE
149         @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}")
150         @Consumes(MediaType.APPLICATION_JSON)
151         @Produces(MediaType.APPLICATION_JSON)
152         @ApiOperation(value="Delete provided Port",response=Response.class)
153         public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
154                                                                         @PathParam("configurationInstanceId") String configurationInstanceId) {
155                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
156                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
157                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
158                 Response response = configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version);
159                 return response;
160         }
161         
162         @POST
163         @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
164         @Consumes(MediaType.APPLICATION_JSON)
165         @Produces(MediaType.APPLICATION_JSON)
166         @ApiOperation(value="Enable Port Mirroring",response=Response.class)
167         public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
168                                                                 @PathParam("configurationInstanceId") String configurationInstanceId) {
169                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
170                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
171                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
172                 Response response = configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version);
173
174                 return response;
175         }
176         
177         @POST
178         @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
179         @Consumes(MediaType.APPLICATION_JSON)
180         @Produces(MediaType.APPLICATION_JSON)
181         @ApiOperation(value="Disable Port Mirroring",response=Response.class)
182         public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
183                                                                 @PathParam("configurationInstanceId") String configurationInstanceId) {
184                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
185                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
186                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
187                 Response response = configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version);
188
189                 return response;
190         }
191         
192         @POST
193         @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
194         @Consumes(MediaType.APPLICATION_JSON)
195         @Produces(MediaType.APPLICATION_JSON)
196         @ApiOperation(value="Activate Port Mirroring",response=Response.class)
197         public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
198                                                                 @PathParam("configurationInstanceId") String configurationInstanceId) {
199                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
200                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
201                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
202                 Response response = configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version);
203
204                 return response;
205         }
206         
207         @POST
208         @Path("/{version:[vV][5-6]}/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
209         @Consumes(MediaType.APPLICATION_JSON)
210         @Produces(MediaType.APPLICATION_JSON)
211         @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
212         public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
213                                                                 @PathParam("configurationInstanceId") String configurationInstanceId) {
214                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
215                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
216                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
217                 Response response = configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version);
218
219                 return response;
220         }
221
222         @POST
223         @Path("/{version:[vV][6]}/{serviceInstanceId}/addRelationships")
224         @Consumes(MediaType.APPLICATION_JSON)
225         @Produces(MediaType.APPLICATION_JSON)
226         @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
227         public Response addRelationships(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
228                 msoLogger.debug ("version is: " + version);
229                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
230                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
231                 Response response = configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version);
232
233                 return response;
234         }
235         
236         @POST
237         @Path("/{version:[vV][6]}/{serviceInstanceId}/removeRelationships")
238         @Consumes(MediaType.APPLICATION_JSON)
239         @Produces(MediaType.APPLICATION_JSON)
240         @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
241         public Response removeRelationships(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
242                 msoLogger.debug ("version is: " + version);
243                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
244                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
245                 Response response = configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version);
246
247                 return response;
248         }
249         
250         @POST
251         @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs")
252         @Consumes(MediaType.APPLICATION_JSON)
253         @Produces(MediaType.APPLICATION_JSON)
254         @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
255         public Response createVnfInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
256                 msoLogger.debug ("version is: " + version);
257                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
258                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
259                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
260
261                 return response;
262         }
263         
264         @POST
265         @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
266         @Consumes(MediaType.APPLICATION_JSON)
267         @Produces(MediaType.APPLICATION_JSON)
268         @ApiOperation(value="Replace provided VNF instance",response=Response.class)
269         public Response replaceVnfInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
270                         @PathParam("vnfInstanceId") String vnfInstanceId) {
271                 msoLogger.debug ("version is: " + version);
272                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
273                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
274                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
275                 Response response = serviceInstances(request, Action.replaceInstance, instanceIdMap, version);
276
277                 return response;
278         }
279         
280         @PUT
281         @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}")
282         @Consumes(MediaType.APPLICATION_JSON)
283         @Produces(MediaType.APPLICATION_JSON)
284         @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
285         public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
286                         @PathParam("vnfInstanceId") String vnfInstanceId) {                     
287                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
288                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
289                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
290                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
291
292                 return response;
293         }
294         
295         @POST
296         @Path("/{version:[vV][6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
297         @Consumes(MediaType.APPLICATION_JSON)
298         @Produces(MediaType.APPLICATION_JSON)
299         @ApiOperation(value="Apply updated configuration",response=Response.class)
300         public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
301                         @PathParam("vnfInstanceId") String vnfInstanceId) {                     
302                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
303                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
304                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
305                 Response response = serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version);
306
307                 return response;
308         }
309
310
311         @DELETE
312         @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}")
313         @Consumes(MediaType.APPLICATION_JSON)
314         @Produces(MediaType.APPLICATION_JSON)
315         @ApiOperation(value="Delete provided VNF instance",response=Response.class)
316         public Response deleteVnfInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
317                         @PathParam("vnfInstanceId") String vnfInstanceId) {
318                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
319                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
320                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
321                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
322
323                 return response;
324         }
325
326         @POST
327         @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
328         @Consumes(MediaType.APPLICATION_JSON)
329         @Produces(MediaType.APPLICATION_JSON)
330         @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
331         public Response createVfModuleInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
332                         @PathParam("vnfInstanceId") String vnfInstanceId) {
333                 msoLogger.debug ("version is: " + version);
334                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
335                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
336                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
337                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
338
339                 return response;
340         }
341         
342         @POST
343         @Path("/{version:[vV][5-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
344         @Consumes(MediaType.APPLICATION_JSON)
345         @Produces(MediaType.APPLICATION_JSON)
346         @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
347         public Response replaceVfModuleInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
348                         @PathParam("vnfInstanceId") String vnfInstanceId,
349                         @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
350                 msoLogger.debug ("version is: " + version);
351                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
352                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
353                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
354                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
355                 Response response = serviceInstances(request, Action.replaceInstance, instanceIdMap, version);
356
357                 return response;
358         }
359
360         @PUT
361         @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
362         @Consumes(MediaType.APPLICATION_JSON)
363         @Produces(MediaType.APPLICATION_JSON)
364         @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
365         public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
366                         @PathParam("vnfInstanceId") String vnfInstanceId,
367                         @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
368                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
369                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
370                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
371                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
372                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
373
374                 return response;
375         }
376         
377         @POST
378         @Path("/{version:[vV][6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
379         @Consumes(MediaType.APPLICATION_JSON)
380         @Produces(MediaType.APPLICATION_JSON)
381         @ApiOperation(value="Perform VNF software update",response=Response.class)
382         public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
383                         @PathParam("vnfInstanceId") String vnfInstanceId) {                     
384                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
385                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
386                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
387                 Response response = serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version);
388
389                 return response;
390         }
391         
392         @DELETE
393         @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
394         @Consumes(MediaType.APPLICATION_JSON)
395         @Produces(MediaType.APPLICATION_JSON)
396         @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
397         public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
398                         @PathParam("vnfInstanceId") String vnfInstanceId,
399                         @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId) {
400                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
401                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
402                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
403                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
404                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
405
406                 return response;
407         }
408
409
410         @POST
411         @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
412         @Consumes(MediaType.APPLICATION_JSON)
413         @Produces(MediaType.APPLICATION_JSON)
414         @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
415         public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
416                         @PathParam("vnfInstanceId") String vnfInstanceId) {
417                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
418                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
419                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
420                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
421
422                 return response;
423         }
424
425         @PUT
426         @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
427         @Consumes(MediaType.APPLICATION_JSON)
428         @Produces(MediaType.APPLICATION_JSON)
429         @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
430         public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
431                         @PathParam("vnfInstanceId") String vnfInstanceId,
432                         @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
433                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
434                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
435                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
436                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
437                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
438
439                 return response;
440         }
441
442         @DELETE
443         @Path("/{version:[vV][4-6]}/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
444         @Consumes(MediaType.APPLICATION_JSON)
445         @Produces(MediaType.APPLICATION_JSON)
446         @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
447         public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
448                         @PathParam("vnfInstanceId") String vnfInstanceId,
449                         @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId) {
450                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
451                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
452                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
453                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
454                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
455
456                 return response;
457         }
458
459         @POST
460         @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks")
461         @Consumes(MediaType.APPLICATION_JSON)
462         @Produces(MediaType.APPLICATION_JSON)
463         @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
464         public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId) {
465                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
466                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
467                 Response response = serviceInstances(request, Action.createInstance, instanceIdMap, version);
468
469                 return response;
470         }
471
472         @PUT
473         @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks/{networkInstanceId}")
474         @Consumes(MediaType.APPLICATION_JSON)
475         @Produces(MediaType.APPLICATION_JSON)
476         @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
477         public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
478                         @PathParam("networkInstanceId") String networkInstanceId) {
479                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
480                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
481                 instanceIdMap.put("networkInstanceId", networkInstanceId);
482                 Response response = serviceInstances(request, Action.updateInstance, instanceIdMap, version);
483
484                 return response;
485         }
486
487         @DELETE
488         @Path("/{version:[vV][4-6]}/{serviceInstanceId}/networks/{networkInstanceId}")
489         @Consumes(MediaType.APPLICATION_JSON)
490         @Produces(MediaType.APPLICATION_JSON)
491         @ApiOperation(value="Delete provided Network instance",response=Response.class)
492         public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
493                         @PathParam("networkInstanceId") String networkInstanceId) {
494                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
495                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
496                 instanceIdMap.put("networkInstanceId", networkInstanceId);
497                 Response response = serviceInstances(request, Action.deleteInstance, instanceIdMap, version);
498
499                 return response;
500         }
501
502         private Response serviceInstances(String requestJSON, Action action, HashMap<String,String> instanceIdMap, String version) {
503
504                 String requestId = UUIDChecker.generateUUID(msoLogger);
505                 long startTime = System.currentTimeMillis ();
506                 msoLogger.debug ("requestId is: " + requestId);
507                 ServiceInstancesRequest sir = null;
508
509                 MsoRequest msoRequest = new MsoRequest (requestId);
510
511                 try {
512                         sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, msoRequest);
513                 } catch(Exception e) {
514                         msoLogger.debug("Exception occurred while mapping of request to JSON object ", e);
515                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
516                                         "Mapping of request to JSON object failed.  " + e.getMessage(),
517                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
518                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
519                         return response;
520                 }
521
522                 try {
523                         parseRequest(requestJSON, action, instanceIdMap, version, startTime, sir, msoRequest);
524                 } catch(Exception e) {
525                         msoLogger.debug("Exception occurred while logging ", e);
526                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
527                                         "Error parsing request.  " + e.getMessage(),
528                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
529                         if (msoRequest.getRequestId () != null) {
530                                 msoLogger.debug ("Logging failed message to the database");
531                                 msoRequest.createRequestRecord (Status.FAILED, action);
532                         }
533                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
534                         return response;
535                 }
536                 
537                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
538                 String requestScope; 
539                 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
540                         requestScope = (ModelType.vnf.name());
541                 }else{
542                         requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
543                 }
544                 InfraActiveRequests dup = null;
545                                 
546                 try {
547                         dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope);
548                 } catch(Exception e) {
549                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
550                                         e.getMessage(),
551                                         ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
552                                         null) ;
553                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
554                         return response;
555                 }
556
557                 if (dup != null) {
558                         return buildErrorOnDuplicateRecord(action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
559                 }
560
561                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
562
563                 RequestReferences referencesResponse = new RequestReferences();
564
565                 referencesResponse.setRequestId(requestId);
566
567                 serviceResponse.setRequestReferences(referencesResponse);
568
569                 CatalogDatabase db = null;
570                 try {
571                         db = CatalogDatabase.getInstance();
572                 } catch (Exception e) {
573                         msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
574                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
575                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
576                                         MsoException.ServiceException,
577                                         "No communication to catalog DB " + e.getMessage (),
578                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES,
579                                         null);
580                         alarmLogger.sendAlarm ("MsoDatabaseAccessError",
581                                         MsoAlarmLogger.CRITICAL,
582                                         Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
583                         msoRequest.createRequestRecord (Status.FAILED,action);
584                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
585                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
586                         return response;
587                 }
588
589                 RecipeLookupResult recipeLookupResult = null;
590                 try {
591                         recipeLookupResult = getServiceInstanceOrchestrationURI (db, msoRequest, action);
592                 } catch (ValidationException e) {
593                         msoLogger.debug ("Validation failed: ", e);
594                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
595                                         "Error validating request.  " + e.getMessage(),
596                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
597                         if (msoRequest.getRequestId () != null) {
598                                 msoLogger.debug ("Logging failed message to the database");
599                                 msoRequest.createRequestRecord (Status.FAILED, action);
600                         }
601                         msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
602                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
603                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
604                         return response;
605                 } catch (Exception e) {
606                         msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Exception while querying Catalog DB", e);
607                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
608                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
609                                         MsoException.ServiceException,
610                                         "Recipe could not be retrieved from catalog DB " + e.getMessage (),
611                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
612                                         null);
613                         alarmLogger.sendAlarm ("MsoDatabaseAccessError",
614                                         MsoAlarmLogger.CRITICAL,
615                                         Messages.errors.get (ErrorNumbers.ERROR_FROM_CATALOG_DB));
616                         msoRequest.createRequestRecord (Status.FAILED,action);
617                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while querying Catalog DB");
618                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
619                         db.close();
620                         return response;
621                 }
622
623                 if (recipeLookupResult == null) {
624                         msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
625                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
626                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
627                                         MsoException.ServiceException,
628                                         "Recipe does not exist in catalog DB",
629                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
630                                         null);
631                         msoRequest.createRequestRecord (Status.FAILED, action);
632                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
633                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
634                         db.close();
635                         return response;
636                 }
637
638
639                 Boolean isBaseVfModule = false;
640                 
641                 if (msoRequest.getModelInfo() != null && (action == Action.applyUpdatedConfig ||
642                                 action == Action.inPlaceSoftwareUpdate)) {
643                         
644                 }
645                 ModelType modelType;
646                 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
647                         modelType = ModelType.vnf;
648                 }
649                 else {
650                         modelType = msoRequest.getModelInfo().getModelType();
651                 }
652                 
653                 if (modelType.equals(ModelType.vfModule)) {
654                         String asdcServiceModelVersion = msoRequest.getAsdcServiceModelVersion ();
655
656                         // Get VF Module-specific base module indicator
657                         VfModule vfm;
658
659                         String modelVersionId = msoRequest.getModelInfo().getModelVersionId();
660
661                         if(modelVersionId != null) {
662                                 vfm = db.getVfModuleByModelUuid(modelVersionId);
663                         } else {
664                                 vfm = db.getVfModuleByModelInvariantUuidAndModelVersion(msoRequest.getModelInfo().getModelInvariantId(), msoRequest.getModelInfo().getModelVersion());
665                         }
666
667                         if (vfm != null) {
668                                 if (vfm.getIsBase() == 1) {
669                                         isBaseVfModule = true;
670                                 }
671                         }
672                         else if (action == Action.createInstance || action == Action.updateInstance){
673                                 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
674                                 // This request cannot proceed
675                                 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "VF Module Type", "", MsoLogger.ErrorCode.DataError, "No VfModuleType found in DB");
676                                 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
677                                 String serviceVersionText = "";
678                                 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
679                                         serviceVersionText = " with version " + asdcServiceModelVersion;
680                                 }
681                                 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
682                                                 MsoException.ServiceException,
683                                                 "VnfType " + msoRequest.getVnfType () + " and VF Module Model Name " + msoRequest.getVfModuleModelName() + serviceVersionText + " not found in MSO Catalog DB",
684                                                 ErrorNumbers.SVC_BAD_PARAMETER,
685                                                 null);
686                                 msoRequest.createRequestRecord (Status.FAILED, action);
687                                 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No matching vfModuleType found in DB");
688                                 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
689                                 db.close();
690                                 return response;
691                         }
692                 }
693
694                 db.close();
695                 msoLogger.debug ("requestId is: " + msoRequest.getRequestId());
696                 msoLogger.debug ("About to insert a record");
697
698                 try {
699                         createRequestRecord(action, startTime, msoRequest);
700                 } catch(Exception e) {
701                         msoLogger.debug("Exception occurred while creating record in DB", e);
702                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
703                                                                                                                                         MsoException.ServiceException,
704                                                                                                                                         "Exception while creating record in DB " + e.getMessage(),
705                                                                                                                                         ErrorNumbers.SVC_BAD_PARAMETER,
706                                                                                                                                         null);
707                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
708                         return response;
709                 }
710                 
711                 return postBPELRequest(action, startTime, msoRequest, recipeLookupResult.getOrchestrationURI(),
712                                 recipeLookupResult.getRecipeTimeout(), isBaseVfModule);
713         }
714
715         private RequestClientParamater buildRequestClientParameter(MsoRequest msoRequest, boolean isBaseVfModule,
716                         int timeOut, String requestAction) throws IOException {
717                 return new RequestClientParamater.Builder().
718                                 setRequestId(msoRequest.getRequestId()).
719                                 setBaseVfModule(isBaseVfModule).setRecipeTimeout(timeOut).
720                                 setRequestAction(requestAction).
721                                 setServiceInstanceId(msoRequest.getServiceInstancesRequest().getServiceInstanceId()).
722                                 setCorrelationId(msoRequest.getServiceInstancesRequest().getCorrelationId()).
723                                 setVnfId(msoRequest.getServiceInstancesRequest().getVnfInstanceId()).
724                                 setVfModuleId(msoRequest.getServiceInstancesRequest().getVfModuleInstanceId()).
725                                 setVolumeGroupId(msoRequest.getServiceInstancesRequest().getVolumeGroupInstanceId()).
726                                 setNetworkId(msoRequest.getServiceInstancesRequest().getNetworkInstanceId()).
727                                 setConfigurationId(msoRequest.getServiceInstancesRequest().getConfigurationId()).
728                                 setServiceType(msoRequest.getServiceInstanceType()).
729                                 setVnfType(msoRequest.getVnfType()).
730                                 setVfModuleType(msoRequest.getVfModuleType()).
731                                 setNetworkType(msoRequest.getNetworkType()).
732                                 setRequestDetails(msoRequest.getRequestJSON()).build();
733         }
734
735         private Response postBPELRequest(Action action, long startTime, MsoRequest msoRequest,
736                         String orchestrationUri, int timeOut, Boolean isBaseVfModule) {
737                 RequestClient requestClient = null;
738                 HttpResponse response = null;
739                 long subStartTime = System.currentTimeMillis();
740                 try {
741                         requestClient = RequestClientFactory.getRequestClient (orchestrationUri, MsoPropertiesUtils.loadMsoProperties ());
742                         msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
743
744                         System.out.println("URL : " + requestClient.getUrl ());
745
746                         response = requestClient.post(buildRequestClientParameter(msoRequest, isBaseVfModule, timeOut, action.name()));
747                         msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", orchestrationUri, null);
748                 } catch (Exception e) {
749                         msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", orchestrationUri, null);
750                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
751                         Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
752                                         MsoException.ServiceException,
753                                         "Failed calling bpmn " + e.getMessage (),
754                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES,
755                                         null);
756                         alarmLogger.sendAlarm ("MsoConfigurationError",
757                                         MsoAlarmLogger.CRITICAL,
758                                         Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
759                         msoRequest.updateFinalStatus (Status.FAILED);
760                         msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
761                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
762                         msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity (),e);
763                         return resp;
764                 }
765
766                 if (response == null) {
767                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
768                         Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
769                                         MsoException.ServiceException,
770                                         "bpelResponse is null",
771                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES,
772                                         null);
773                         msoRequest.updateFinalStatus (Status.FAILED);
774                         msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
775                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Null response from BPMN");
776                         msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
777                         return resp;
778                 }
779
780                 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
781                 int bpelStatus = respHandler.getStatus ();
782
783                 // BPEL accepted the request, the request is in progress
784                 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
785                         String camundaJSONResponseBody = respHandler.getContent();
786                         msoLogger.debug ("Received from Camunda: " + camundaJSONResponseBody);
787                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.IN_PROGRESS);
788                         (RequestsDatabase.getInstance()).updateInfraStatus (msoRequest.getRequestId (),
789                                         Status.IN_PROGRESS.toString (),
790                                         Constants.PROGRESS_REQUEST_IN_PROGRESS,
791                                         Constants.MODIFIED_BY_APIHANDLER);
792                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
793                         msoLogger.debug ("End of the transaction, the final response is: " + (String) camundaJSONResponseBody);
794                         return Response.status (HttpStatus.SC_ACCEPTED).entity (camundaJSONResponseBody).build ();
795                 } else {
796                         List<String> variables = new ArrayList<>();
797                         variables.add(bpelStatus + "");
798                         String camundaJSONResponseBody = respHandler.getContent();
799                         if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
800                                 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
801                                 Response resp =  msoRequest.buildServiceErrorResponse(bpelStatus,
802                                                 MsoException.ServiceException,
803                                                 "Request Failed due to BPEL error with HTTP Status= %1 " + '\n' + camundaJSONResponseBody,
804                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
805                                                 variables);
806                                 msoRequest.updateFinalStatus (Status.FAILED);
807                                 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
808                                 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is failed");
809                                 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
810                                 return resp;
811                         } else {
812                                 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
813                                 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
814                                                 MsoException.ServiceException,
815                                                 "Request Failed due to BPEL error with HTTP Status= %1" ,
816                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
817                                                 variables);
818                                 msoRequest.updateFinalStatus (Status.FAILED);
819                                 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
820                                 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPEL engine is empty");
821                                 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
822                                 return resp;
823                         }
824                 }
825         }
826
827         private void createRequestRecord(Action action, long startTime, MsoRequest msoRequest) throws Exception {
828                 try {
829                         msoRequest.createRequestRecord (Status.PENDING, action);
830                 } catch (Exception e) {
831                         msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
832                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
833                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
834                         throw new Exception(e);
835                 }
836         }
837
838         private Response buildErrorOnDuplicateRecord(Action action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest, 
839                                                                                         String instanceName, String requestScope, InfraActiveRequests dup) {
840
841                 // Found the duplicate record. Return the appropriate error.
842                 String instance = null;
843                 if(instanceName != null){
844                         instance = instanceName;
845                 }else{
846                         instance = instanceIdMap.get(requestScope + "InstanceId");
847                 }
848                 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.";
849                 //List<String> variables = new ArrayList<String>();
850                 //variables.add(dup.getRequestStatus());
851
852                 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException,
853                                 dupMessage,
854                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
855                                 null) ;
856
857
858                 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, "Duplicate request - Subscriber already has a request for this service");
859                 msoRequest.createRequestRecord (Status.FAILED, action);
860                 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage);
861                 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
862                 return response;
863         }
864
865         private InfraActiveRequests duplicateCheck(Action action, HashMap<String, String> instanceIdMap, long startTime,
866                                                                                                 MsoRequest msoRequest, String instanceName, String requestScope) throws Exception {
867                 InfraActiveRequests dup = null;
868                 try {
869                         if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance))){
870                                 dup = (RequestsDatabase.getInstance()).checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
871                         }
872                 } catch (Exception e) {
873                         msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
874                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check");
875                         throw new Exception(e);
876                 }
877                 return dup;
878         }
879
880         private void parseRequest(String originalRequestJSON, Action action, HashMap<String, String> instanceIdMap, String version,
881                                                                 long startTime, ServiceInstancesRequest sir, MsoRequest msoRequest) throws Exception {
882                 try{
883                         msoRequest.parse(sir, instanceIdMap, action, version, originalRequestJSON);
884                 } catch (Exception e) {
885                         msoLogger.debug ("Validation failed: ", e);
886                         msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, originalRequestJSON, e);
887                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
888                         throw new Exception(e);
889                 }
890         }
891
892         private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Action action, long startTime,
893                         MsoRequest msoRequest) throws Exception {
894                 try{
895                         ObjectMapper mapper = new ObjectMapper();
896                         return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
897                 } catch(Exception e){
898                         msoLogger.debug ("Mapping of request to JSON object failed : ", e);
899                         if (msoRequest.getRequestId () != null) {
900                                 msoLogger.debug ("Mapping of request to JSON object failed");
901                                 msoRequest.createRequestRecord (Status.FAILED, action);
902                         }
903                         msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
904                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed");
905                         throw new Exception(e);
906                 }
907         }
908
909         private RecipeLookupResult getServiceInstanceOrchestrationURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
910                 RecipeLookupResult recipeLookupResult = null;
911                 //if the aLaCarte flag is set to TRUE, the API-H should choose the Ã¢â‚¬Å“VID_DEFAULTâ€\9d recipe for the requested action
912
913                 msoLogger.debug("aLaCarteFlag is " + msoRequest.getALaCarteFlag());
914                 // Query MSO Catalog DB
915                 
916                 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
917                         recipeLookupResult = getDefaultVnfUri(db, msoRequest, action);
918                 }
919                 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.service)) {
920                         recipeLookupResult = getServiceURI(db, msoRequest, action);
921                 }
922                 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule) ||
923                                 msoRequest.getModelInfo().getModelType().equals(ModelType.volumeGroup) || msoRequest.getModelInfo().getModelType().equals(ModelType.vnf)) {
924
925                         recipeLookupResult = getVnfOrVfModuleUri(db, msoRequest, action);
926
927                 }else if (msoRequest.getModelInfo().getModelType().equals(ModelType.network)) {
928
929                         recipeLookupResult = getNetworkUri(db, msoRequest, action);
930                 }
931
932                 if (recipeLookupResult != null) {
933                         msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
934                 }
935                 else {
936                         msoLogger.debug("No matching recipe record found");
937                 }
938                 return recipeLookupResult;
939         }
940
941
942         private RecipeLookupResult getServiceURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
943                 // SERVICE REQUEST
944                 // Construct the default service name
945                 // TODO need to make this a configurable property
946                 String defaultServiceModelName = "*";
947                 String defaultSourceServiceModelName = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
948
949                 Service serviceRecord;
950                 ModelInfo modelInfo = msoRequest.getModelInfo();
951                 if(msoRequest.getALaCarteFlag()){
952                         serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
953                         if (serviceRecord == null) {
954                                 serviceRecord = db.getServiceByModelName(defaultServiceModelName);
955                         }
956                 }else{
957                         serviceRecord = db.getServiceByModelUUID(modelInfo.getModelVersionId()); // ModelVersionId is not required in v3
958                         if(serviceRecord == null) {
959                                 serviceRecord = db.getServiceByVersionAndInvariantId(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
960                         }
961                 }
962
963                 ServiceRecipe recipe = null;
964                 if(serviceRecord !=null){
965                         recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
966                 }
967                 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
968                 RequestParameters reqParam = msoRequest.getServiceInstancesRequest().getRequestDetails().getRequestParameters();
969                 if(reqParam!=null && reqParam.isaLaCarte()!=null && reqParam.isaLaCarte() && recipe==null){
970                         return null;
971                 } else if (recipe==null) {
972                         //aLaCarte wasn't sent, so we'll try the default
973                         serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
974                         if (serviceRecord == null) {
975                                 serviceRecord = db.getServiceByModelName(defaultServiceModelName);
976                         }
977                         recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
978                 }
979
980                 if(modelInfo.getModelVersionId() == null) {
981                         modelInfo.setModelVersionId(serviceRecord.getModelUUID());
982                 }
983                 if(recipe==null){
984                         return null;
985                 }
986                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
987         }
988
989
990         private RecipeLookupResult getVnfOrVfModuleUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
991
992                 ModelInfo modelInfo = msoRequest.getModelInfo();
993                 String vnfComponentType = modelInfo.getModelType().name();
994
995                 RelatedInstanceList[] instanceList = null;
996                 if (msoRequest.getServiceInstancesRequest().getRequestDetails() != null) {
997                         instanceList = msoRequest.getServiceInstancesRequest().getRequestDetails().getRelatedInstanceList();
998                 }
999
1000                 Recipe recipe = null;
1001                 String defaultSource = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1002                 String modelCustomizationId = modelInfo.getModelCustomizationId();
1003                 String modelCustomizationName = modelInfo.getModelCustomizationName();
1004                 String relatedInstanceModelVersionId = null;
1005                 String relatedInstanceModelInvariantId = null;
1006                 String relatedInstanceVersion = null;
1007                 String relatedInstanceModelCustomizationName = null;
1008
1009                 if (instanceList != null) {
1010
1011                         for(RelatedInstanceList relatedInstanceList : instanceList){
1012
1013                                 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1014                                 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1015                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1016                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1017                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1018                                 }
1019
1020                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1021                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1022                                         relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1023                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1024                                         relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1025                                 }
1026                         }
1027
1028                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1029                                 //                      a.      For a vnf request (only create, no update currently): 
1030                                 //                              i.      (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1031                                 //                              ii.     (v2-v4) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have 
1032                                 //                                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName 
1033                                 //                                      to Ã¢â‚¬Å“joinâ€\9d service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid  record exists. 
1034                                 //                              **If relatedInstance.modelInfo[service].modelVersionId  was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId 
1035                                 //                                      (MODEL_UUID) in SERVICE table.
1036                                 //                              iii.    Regardless of how the value was provided/obtained above, APIH must always populate vnfModelCustomizationId in bpmnRequest.  It would be assumed it was MSO generated 
1037                                 //                                      during 1707 data migration if VID did not provide it originally on request.
1038                                 //                              iv.     Note: continue to construct the Ã¢â‚¬Å“vnf-typeâ€\9d value and pass to BPMN (must still be populated in A&AI).  
1039                                 //                              1.      If modelCustomizationName is NOT provided on a vnf/vfModule request, use modelCustomizationId to look it up in our catalog to construct vnf-type value to pass to BPMN.
1040
1041                                 VnfResource vnfResource = null;
1042                                 VnfResourceCustomization vrc;
1043                                 // Validation for vnfResource
1044
1045                                 if(modelCustomizationId!=null) {
1046                                         vnfResource = db.getVnfResourceByModelCustomizationId(modelCustomizationId);
1047                                 } else {
1048                                         Service service = db.getServiceByModelUUID(relatedInstanceModelVersionId);
1049                                         if(service == null) {
1050                                                 service = db.getServiceByVersionAndInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion);
1051                                         }
1052
1053                                 if(service == null) {
1054                                         throw new ValidationException("service in relatedInstance");
1055                                 }
1056
1057                                         vrc = db.getVnfResourceCustomizationByModelCustomizationName(modelCustomizationName, service.getModelUUID());
1058                                         if(vrc != null) {
1059                                                 vnfResource = vrc.getVnfResource();
1060                                                 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUuid());
1061                                                 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUuid());
1062                                         }
1063                                 }
1064
1065                                 if(vnfResource==null){
1066                                         throw new ValidationException("catalog entry");
1067                                 } else {
1068                                         if(modelInfo.getModelVersionId() == null) {
1069                                                 modelInfo.setModelVersionId(vnfResource.getModelUuid());
1070                                         }
1071                                 }
1072
1073                                 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultSource, action.name());
1074
1075                                 if (vnfRecipe == null) {
1076                                         return null;
1077                                 }
1078
1079                                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1080                         } else {
1081                                 //                      ii.     (v2-v4) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have 
1082                                 //                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[vnf].modelVersionId** + modelInfo[vnf].modelCustomizationName 
1083                                 //                      to Ã¢â‚¬Å“joinâ€\9d vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid  record exists. 
1084                                 //                      **If relatedInstance.modelInfo[vnf].modelVersionId  was not provided, use relatedInstance.modelInfo[vnf].modelInvariantId + modelVersion instead 
1085                                 //                      to lookup modelVersionId (MODEL_UUID) in vnf_resource table. Once the vnf’s model_customization_uuid has been obtained, use it to find all vfModule customizations 
1086                                 //                      for that vnf customization in the vnf_res_custom_to_vf_module_custom join table. For each vf_module_cust_model_customization_uuid value returned, 
1087                                 //                      use that UUID to query vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId** to confirm record matches request data 
1088                                 //                      (and to identify the modelCustomizationId associated with the vfModule in the request). **If modelInfo[vfModule|volumeGroup].modelVersionId was not 
1089                                 //                      provided (potentially in v2/v3), use modelInfo[vfModule|volumeGroup].modelInvariantId + modelVersion instead. This means taking each record found 
1090                                 //                      in vf_module_customization and looking up in vf_module (using vf_module_customization’s FK into vf_module) to find a match on MODEL_INVARIANT_UUID (modelInvariantId) 
1091                                 //                      and MODEL_VERSION (modelVersion).
1092
1093                                 VfModuleCustomization vfmc = null;
1094                                         VnfResourceCustomization vnfrc;
1095                                 VfModule vfModule = null;
1096
1097                                 if( modelInfo.getModelCustomizationId() != null) {
1098                                         vfmc = db.getVfModuleCustomizationByModelCustomizationId(modelInfo.getModelCustomizationId());
1099                                 } else {
1100                                         vnfrc =db.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId(relatedInstanceModelCustomizationName, relatedInstanceModelVersionId);
1101                                         if(vnfrc == null) {
1102                                                 vnfrc = db.getVnfResourceCustomizationByModelInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion, relatedInstanceModelCustomizationName);
1103                                         } 
1104
1105                                         List<VfModuleCustomization> list = db.getVfModuleCustomizationByVnfModuleCustomizationUuid(vnfrc.getModelCustomizationUuid());
1106
1107                                         String vfModuleModelUUID = modelInfo.getModelVersionId();
1108                                         for(VfModuleCustomization vf : list) {
1109                                                 if(vfModuleModelUUID != null) {
1110                                                         vfModule = db.getVfModuleByModelCustomizationIdAndVersion(vf.getModelCustomizationUuid(), vfModuleModelUUID);
1111                                                 } else {
1112                                                         vfModule = db.getVfModuleByModelCustomizationIdModelVersionAndModelInvariantId(vf.getModelCustomizationUuid(), modelInfo.getModelVersion(), modelInfo.getModelInvariantId());
1113                                                 }
1114
1115                                                 if(vfModule != null) {
1116                                                         modelInfo.setModelCustomizationId(vf.getModelCustomizationUuid());
1117                                                         modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUuid());
1118                                                         break;
1119                                                 }
1120                                         }
1121                                 }
1122
1123                                 if(vfmc == null && vfModule == null) {
1124                                         throw new ValidationException("no catalog entry found");
1125                                 } else if (vfModule == null && vfmc != null) {
1126                                         vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1127                                 }
1128
1129                                 if(modelInfo.getModelVersionId() == null) {
1130                                         modelInfo.setModelVersionId(vfModule.getModelUUID());
1131                                 }
1132                                 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(vfModule.getModelUUID(), vnfComponentType, action.name());
1133
1134                                 if(recipe == null) {
1135                                         recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultSource, vnfComponentType, action.name());
1136                                         if (recipe == null) { 
1137                                                 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId("*", vnfComponentType, action.name());
1138                                         }
1139
1140                                         if(recipe == null) {
1141                                                 return null;
1142                                         }
1143                                 }
1144                         }
1145                 } else {
1146                         msoLogger.debug("recipe is null, getting default");
1147
1148                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1149                                 recipe = db.getVnfRecipe(defaultSource, action.name());
1150                                 if (recipe == null) {
1151                                         return null;
1152                                 }
1153                         } else {
1154                                 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultSource, vnfComponentType, action.name());
1155
1156                                 if (recipe == null) {
1157                                         return null;
1158                                 }
1159                         }
1160                 }
1161
1162                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1163         }
1164         
1165         private RecipeLookupResult getDefaultVnfUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1166
1167                 String defaultSource = msoRequest.getRequestInfo().getSource() + "_DEFAULT";            
1168
1169                 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultSource, action.name());
1170
1171                 if (vnfRecipe == null) {
1172                         return null;
1173                 }
1174
1175                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());          
1176         }
1177
1178         private RecipeLookupResult getNetworkUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1179
1180                 String defaultNetworkType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1181
1182                 ModelInfo modelInfo = msoRequest.getModelInfo();
1183                 String modelName = modelInfo.getModelName();
1184                 Recipe recipe = null;
1185
1186                 if(modelInfo.getModelCustomizationId()!=null){
1187                         NetworkResource networkResource = db.getNetworkResourceByModelCustUuid(modelInfo.getModelCustomizationId());
1188                         if(networkResource!=null){
1189                                 if(modelInfo.getModelVersionId() == null) {
1190                                         modelInfo.setModelVersionId(networkResource.getModelUUID());
1191                                 }
1192                                 recipe = db.getNetworkRecipe(networkResource.getModelName(), action.name());
1193                         }else{
1194                                 throw new ValidationException("no catalog entry found");
1195                         }
1196                 }else{
1197                         //ok for version < 3 and action delete
1198                         recipe = db.getNetworkRecipe(modelName, action.name());
1199                 }
1200
1201                 if(recipe == null){
1202                         recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
1203                 }
1204                 
1205                 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1206         }
1207         
1208         private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String,String> instanceIdMap, String version) {
1209                 String requestId = UUIDChecker.generateUUID(msoLogger);
1210                 long startTime = System.currentTimeMillis ();
1211                 msoLogger.debug ("requestId is: " + requestId);
1212                 ServiceInstancesRequest sir = null;
1213                 MsoRequest msoRequest = new MsoRequest (requestId);
1214
1215                 try {
1216                         sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, msoRequest);
1217                 } catch(Exception e) {
1218                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
1219                                         "Mapping of request to JSON object failed.  " + e.getMessage(),
1220                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
1221                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1222                         return response;
1223                 }
1224
1225                 try {
1226                         parseRequest(requestJSON, action, instanceIdMap, version, startTime, sir, msoRequest);
1227                 } catch(Exception e) {
1228                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
1229                                         "Error parsing request.  " + e.getMessage(),
1230                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
1231                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1232                         return response;
1233                 }
1234
1235                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1236                 String requestScope;
1237                 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
1238                         requestScope = (ModelType.vnf.name());
1239                 }else{
1240                         requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
1241                 }
1242                 InfraActiveRequests dup = null;
1243                 
1244                 try {
1245                         dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope);
1246                 } catch(Exception e) {
1247                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
1248                                         e.getMessage(),
1249                                         ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
1250                                         null) ;
1251                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1252                         return response;
1253                 }
1254
1255                 if (dup != null) {
1256                         return buildErrorOnDuplicateRecord(action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1257                 }
1258
1259                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1260                 RequestReferences referencesResponse = new RequestReferences();
1261                 referencesResponse.setRequestId(requestId);
1262                 serviceResponse.setRequestReferences(referencesResponse);
1263                 
1264                 MsoJavaProperties props = MsoPropertiesUtils.loadMsoProperties ();
1265                 String orchestrationUri = props.getProperty(CommonConstants.ALACARTE_ORCHESTRATION, null);
1266                 String timeOut = props.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT, null);
1267                 
1268                 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1269                         String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1270                         
1271                         msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", 
1272                         MsoLogger.ErrorCode.DataError, error);
1273                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1274                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
1275                                                                                                                                         MsoException.ServiceException,
1276                                                                                                                                         error,
1277                                                                                                                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
1278                                                                                                                                         null);
1279                         msoRequest.createRequestRecord (Status.FAILED, action);
1280                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
1281                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1282                         return response;
1283                         
1284                 }
1285
1286                 requestId = msoRequest.getRequestId ();
1287                 msoLogger.debug ("requestId is: " + requestId);
1288                 msoLogger.debug ("About to insert a record");
1289
1290                 try {
1291                         createRequestRecord(action, startTime, msoRequest);
1292                 } catch(Exception e) {
1293                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1294                                         MsoException.ServiceException,
1295                                         "Exception while creating record in DB " + e.getMessage(),
1296                                         ErrorNumbers.SVC_BAD_PARAMETER,
1297                                         null);
1298                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1299                         return response;
1300                 }
1301
1302                 return postBPELRequest(action, startTime, msoRequest, orchestrationUri, Integer.parseInt(timeOut), false);
1303         }
1304 }