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