Sonar Critical
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / openecomp / mso / apihandlerinfra / ServiceInstances.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21 package org.openecomp.mso.apihandlerinfra;
22
23 import java.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                         msoLogger.debug("Exception occurred while mapping of request to JSON object ", e);
514                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
515                                         "Mapping of request to JSON object failed.  " + e.getMessage(),
516                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
517                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
518                         return response;
519                 }
520
521                 try {
522                         parseRequest(requestJSON, action, instanceIdMap, version, startTime, sir, msoRequest);
523                 } catch(Exception e) {
524                         msoLogger.debug("Exception occurred while logging ", e);
525                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
526                                         "Error parsing request.  " + e.getMessage(),
527                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
528                         if (msoRequest.getRequestId () != null) {
529                                 msoLogger.debug ("Logging failed message to the database");
530                                 msoRequest.createRequestRecord (Status.FAILED, action);
531                         }
532                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
533                         return response;
534                 }
535                 
536                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
537                 String requestScope; 
538                 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
539                         requestScope = (ModelType.vnf.name());
540                 }else{
541                         requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
542                 }
543                 InfraActiveRequests dup = null;
544                                 
545                 try {
546                         dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope);
547                 } catch(Exception e) {
548                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
549                                         e.getMessage(),
550                                         ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
551                                         null) ;
552                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
553                         return response;
554                 }
555
556                 if (dup != null) {
557                         return buildErrorOnDuplicateRecord(action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
558                 }
559
560                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
561
562                 RequestReferences referencesResponse = new RequestReferences();
563
564                 referencesResponse.setRequestId(requestId);
565
566                 serviceResponse.setRequestReferences(referencesResponse);
567
568                 CatalogDatabase db = null;
569                 try {
570                         db = CatalogDatabase.getInstance();
571                 } catch (Exception e) {
572                         msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communciate with Catalog DB", e);
573                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
574                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
575                                         MsoException.ServiceException,
576                                         "No communication to catalog DB " + e.getMessage (),
577                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES,
578                                         null);
579                         alarmLogger.sendAlarm ("MsoDatabaseAccessError",
580                                         MsoAlarmLogger.CRITICAL,
581                                         Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_CATALOG_DB));
582                         msoRequest.createRequestRecord (Status.FAILED,action);
583                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while communciate with DB");
584                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
585                         return response;
586                 }
587
588                 RecipeLookupResult recipeLookupResult = null;
589                 try {
590                         recipeLookupResult = getServiceInstanceOrchestrationURI (db, msoRequest, action);
591                 } catch (ValidationException e) {
592                         msoLogger.debug ("Validation failed: ", e);
593                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
594                                         "Error validating request.  " + e.getMessage(),
595                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
596                         if (msoRequest.getRequestId () != null) {
597                                 msoLogger.debug ("Logging failed message to the database");
598                                 msoRequest.createRequestRecord (Status.FAILED, action);
599                         }
600                         msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
601                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
602                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
603                         return response;
604                 } catch (Exception e) {
605                         msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Exception while querying Catalog DB", e);
606                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
607                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
608                                         MsoException.ServiceException,
609                                         "Recipe could not be retrieved from catalog DB " + e.getMessage (),
610                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
611                                         null);
612                         alarmLogger.sendAlarm ("MsoDatabaseAccessError",
613                                         MsoAlarmLogger.CRITICAL,
614                                         Messages.errors.get (ErrorNumbers.ERROR_FROM_CATALOG_DB));
615                         msoRequest.createRequestRecord (Status.FAILED,action);
616                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while querying Catalog DB");
617                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
618                         db.close();
619                         return response;
620                 }
621
622                 if (recipeLookupResult == null) {
623                         msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "No recipe found in DB");
624                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
625                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
626                                         MsoException.ServiceException,
627                                         "Recipe does not exist in catalog DB",
628                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
629                                         null);
630                         msoRequest.createRequestRecord (Status.FAILED, action);
631                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No recipe found in DB");
632                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
633                         db.close();
634                         return response;
635                 }
636
637
638                 Boolean isBaseVfModule = false;
639                 
640                 if (msoRequest.getModelInfo() != null && (action == Action.applyUpdatedConfig ||
641                                 action == Action.inPlaceSoftwareUpdate)) {
642                         
643                 }
644                 ModelType modelType;
645                 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
646                         modelType = ModelType.vnf;
647                 }
648                 else {
649                         modelType = msoRequest.getModelInfo().getModelType();
650                 }
651                 
652                 if (modelType.equals(ModelType.vfModule)) {
653                         String asdcServiceModelVersion = msoRequest.getAsdcServiceModelVersion ();
654
655                         // Get VF Module-specific base module indicator
656                         VfModule vfm;
657
658                         String modelVersionId = msoRequest.getModelInfo().getModelVersionId();
659
660                         if(modelVersionId != null) {
661                                 vfm = db.getVfModuleByModelUuid(modelVersionId);
662                         } else {
663                                 vfm = db.getVfModuleByModelInvariantUuidAndModelVersion(msoRequest.getModelInfo().getModelInvariantId(), msoRequest.getModelInfo().getModelVersion());
664                         }
665
666                         if (vfm != null) {
667                                 if (vfm.getIsBase() == 1) {
668                                         isBaseVfModule = true;
669                                 }
670                         }
671                         else if (action == Action.createInstance || action == Action.updateInstance){
672                                 // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
673                                 // This request cannot proceed
674                                 msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "VF Module Type", "", MsoLogger.ErrorCode.DataError, "No VfModuleType found in DB");
675                                 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
676                                 String serviceVersionText = "";
677                                 if (asdcServiceModelVersion != null && !asdcServiceModelVersion.isEmpty ()) {
678                                         serviceVersionText = " with version " + asdcServiceModelVersion;
679                                 }
680                                 Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
681                                                 MsoException.ServiceException,
682                                                 "VnfType " + msoRequest.getVnfType () + " and VF Module Model Name " + msoRequest.getVfModuleModelName() + serviceVersionText + " not found in MSO Catalog DB",
683                                                 ErrorNumbers.SVC_BAD_PARAMETER,
684                                                 null);
685                                 msoRequest.createRequestRecord (Status.FAILED, action);
686                                 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, "No matching vfModuleType found in DB");
687                                 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
688                                 db.close();
689                                 return response;
690                         }
691                 }
692
693                 db.close();
694
695                 String serviceInstanceId = "";
696                 String vnfId = "";
697                 String vfModuleId = "";
698                 String volumeGroupId = "";
699                 String networkId = "";
700                 ServiceInstancesRequest siReq = msoRequest.getServiceInstancesRequest();
701
702                 if(siReq.getServiceInstanceId () != null){
703                         serviceInstanceId = siReq.getServiceInstanceId ();
704                 }
705
706                 if(siReq.getVnfInstanceId () != null){
707                         vnfId = siReq.getVnfInstanceId ();
708                 }
709
710                 if(siReq.getVfModuleInstanceId () != null){
711                         vfModuleId = siReq.getVfModuleInstanceId ();
712                 }
713
714                 if(siReq.getVolumeGroupInstanceId () != null){
715                         volumeGroupId = siReq.getVolumeGroupInstanceId ();
716                 }
717
718                 if(siReq.getNetworkInstanceId () != null){
719                         networkId = siReq.getNetworkInstanceId ();
720                 }
721
722
723                 requestId = msoRequest.getRequestId ();
724                 msoLogger.debug ("requestId is: " + requestId);
725                 msoLogger.debug ("About to insert a record");
726
727                 try {
728                         createRequestRecord(action, startTime, msoRequest);
729                 } catch(Exception e) {
730                         msoLogger.debug("Exception occurred while creating record in DB", e);
731                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
732                                                                                                                                         MsoException.ServiceException,
733                                                                                                                                         "Exception while creating record in DB " + e.getMessage(),
734                                                                                                                                         ErrorNumbers.SVC_BAD_PARAMETER,
735                                                                                                                                         null);
736                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
737                         return response;
738                 }
739                 
740                 return postBPELRequest(action, requestId, startTime, msoRequest, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(), 
741                                                                 isBaseVfModule, serviceInstanceId, vnfId, vfModuleId, volumeGroupId, networkId, null,
742                                                                 msoRequest.getServiceInstanceType(), msoRequest.getVnfType(), msoRequest.getVfModuleType(), msoRequest.getNetworkType());
743         }
744
745         private Response postBPELRequest(Action action, String requestId, long startTime, MsoRequest msoRequest,
746                                                                         String orchestrationUri, int timeOut, Boolean isBaseVfModule,
747                                                                         String serviceInstanceId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
748                                                                         String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType) {
749                 RequestClient requestClient = null;
750                 HttpResponse response = null;
751                 long subStartTime = System.currentTimeMillis();
752                 try {
753                         requestClient = RequestClientFactory.getRequestClient (orchestrationUri, MsoPropertiesUtils.loadMsoProperties ());
754                         msoLogger.debug ("MSO API Handler Posting call to BPEL engine for url: " + requestClient.getUrl ());
755
756                         System.out.println("URL : " + requestClient.getUrl ());
757
758                         response = requestClient.post(requestId, isBaseVfModule, timeOut, action.name (),
759                                         serviceInstanceId, vnfId, vfModuleId, volumeGroupId, networkId, configurationId,
760                                         msoRequest.getServiceInstanceType (),
761                                         msoRequest.getVnfType (), msoRequest.getVfModuleType (),
762                                         msoRequest.getNetworkType (), msoRequest.getRequestJSON(), null);
763
764                         msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "Successfully received response from BPMN engine", "BPMN", orchestrationUri, null);
765                 } catch (Exception e) {
766                         msoLogger.recordMetricEvent (subStartTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine", "BPMN", orchestrationUri, null);
767                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
768                         Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
769                                         MsoException.ServiceException,
770                                         "Failed calling bpmn " + e.getMessage (),
771                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES,
772                                         null);
773                         alarmLogger.sendAlarm ("MsoConfigurationError",
774                                         MsoAlarmLogger.CRITICAL,
775                                         Messages.errors.get (ErrorNumbers.NO_COMMUNICATION_TO_BPEL));
776                         msoRequest.updateFinalStatus (Status.FAILED);
777                         msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.AvailabilityError, "Exception while communicate with BPMN engine");
778                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.CommunicationError, "Exception while communicate with BPMN engine");
779                         msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity (),e);
780                         return resp;
781                 }
782
783                 if (response == null) {
784                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
785                         Response resp = msoRequest.buildServiceErrorResponse (HttpStatus.SC_BAD_GATEWAY,
786                                         MsoException.ServiceException,
787                                         "bpelResponse is null",
788                                         ErrorNumbers.SVC_NO_SERVER_RESOURCES,
789                                         null);
790                         msoRequest.updateFinalStatus (Status.FAILED);
791                         msoLogger.error (MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Null response from BPEL");
792                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Null response from BPMN");
793                         msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
794                         return resp;
795                 }
796
797                 ResponseHandler respHandler = new ResponseHandler (response, requestClient.getType ());
798                 int bpelStatus = respHandler.getStatus ();
799
800                 // BPEL accepted the request, the request is in progress
801                 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
802                         String camundaJSONResponseBody = respHandler.getResponseBody ();
803                         msoLogger.debug ("Received from Camunda: " + camundaJSONResponseBody);
804                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.IN_PROGRESS);
805                         (RequestsDatabase.getInstance()).updateInfraStatus (msoRequest.getRequestId (),
806                                         Status.IN_PROGRESS.toString (),
807                                         Constants.PROGRESS_REQUEST_IN_PROGRESS,
808                                         Constants.MODIFIED_BY_APIHANDLER);
809                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, "BPMN accepted the request, the request is in progress");
810                         msoLogger.debug ("End of the transaction, the final response is: " + (String) camundaJSONResponseBody);
811                         return Response.status (HttpStatus.SC_ACCEPTED).entity (camundaJSONResponseBody).build ();
812                 } else {
813                         List<String> variables = new ArrayList<>();
814                         variables.add(bpelStatus + "");
815                         String camundaJSONResponseBody = respHandler.getResponseBody ();
816                         if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
817                                 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
818                                 Response resp =  msoRequest.buildServiceErrorResponse(bpelStatus,
819                                                 MsoException.ServiceException,
820                                                 "Request Failed due to BPEL error with HTTP Status= %1 " + '\n' + camundaJSONResponseBody,
821                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
822                                                 variables);
823                                 msoRequest.updateFinalStatus (Status.FAILED);
824                                 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is failed with HTTP Status=" + bpelStatus);
825                                 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPMN engine is failed");
826                                 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
827                                 return resp;
828                         } else {
829                                 msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
830                                 Response resp = msoRequest.buildServiceErrorResponse(bpelStatus,
831                                                 MsoException.ServiceException,
832                                                 "Request Failed due to BPEL error with HTTP Status= %1" ,
833                                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
834                                                 variables);
835                                 msoRequest.updateFinalStatus (Status.FAILED);
836                                 msoLogger.error (MessageEnum.APIH_BPEL_RESPONSE_ERROR, requestClient.getUrl (), "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Response from BPEL engine is empty");
837                                 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.InternalError, "Response from BPEL engine is empty");
838                                 msoLogger.debug ("End of the transaction, the final response is: " + (String) resp.getEntity ());
839                                 return resp;
840                         }
841                 }
842         }
843
844         private void createRequestRecord(Action action, long startTime, MsoRequest msoRequest) throws Exception {
845                 try {
846                         msoRequest.createRequestRecord (Status.PENDING, action);
847                 } catch (Exception e) {
848                         msoLogger.error (MessageEnum.APIH_DB_ACCESS_EXC_REASON, "Exception while creating record in DB", "", "", MsoLogger.ErrorCode.SchemaError, "Exception while creating record in DB", e);
849                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
850                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Exception while creating record in DB");
851                         throw new Exception(e);
852                 }
853         }
854
855         private Response buildErrorOnDuplicateRecord(Action action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest, 
856                                                                                         String instanceName, String requestScope, InfraActiveRequests dup) {
857
858                 // Found the duplicate record. Return the appropriate error.
859                 String instance = null;
860                 if(instanceName != null){
861                         instance = instanceName;
862                 }else{
863                         instance = instanceIdMap.get(requestScope + "InstanceId");
864                 }
865                 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.";
866                 //List<String> variables = new ArrayList<String>();
867                 //variables.add(dup.getRequestStatus());
868
869                 Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_CONFLICT, MsoException.ServiceException,
870                                 dupMessage,
871                                 ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
872                                 null) ;
873
874
875                 msoLogger.warn (MessageEnum.APIH_DUPLICATE_FOUND, dupMessage, "", "", MsoLogger.ErrorCode.SchemaError, "Duplicate request - Subscriber already has a request for this service");
876                 msoRequest.createRequestRecord (Status.FAILED, action);
877                 msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.Conflict, dupMessage);
878                 msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
879                 return response;
880         }
881
882         private InfraActiveRequests duplicateCheck(Action action, HashMap<String, String> instanceIdMap, long startTime,
883                                                                                                 MsoRequest msoRequest, String instanceName, String requestScope) throws Exception {
884                 InfraActiveRequests dup = null;
885                 try {
886                         if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance))){
887                                 dup = (RequestsDatabase.getInstance()).checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
888                         }
889                 } catch (Exception e) {
890                         msoLogger.error (MessageEnum.APIH_DUPLICATE_CHECK_EXC, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.DataError, "Error during duplicate check ", e);
891                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DBAccessError, "Error during duplicate check");
892                         throw new Exception(e);
893                 }
894                 return dup;
895         }
896
897         private void parseRequest(String originalRequestJSON, Action action, HashMap<String, String> instanceIdMap, String version,
898                                                                 long startTime, ServiceInstancesRequest sir, MsoRequest msoRequest) throws Exception {
899                 try{
900                         msoRequest.parse(sir, instanceIdMap, action, version, originalRequestJSON);
901                 } catch (Exception e) {
902                         msoLogger.debug ("Validation failed: ", e);
903                         msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, originalRequestJSON, e);
904                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Validation of the input request failed");
905                         throw new Exception(e);
906                 }
907         }
908
909         private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Action action, long startTime,
910                                                                                                                                                 ServiceInstancesRequest sir, MsoRequest msoRequest) throws Exception {
911                 try{
912                         ObjectMapper mapper = new ObjectMapper();
913                         sir = mapper.readValue(requestJSON, ServiceInstancesRequest.class);
914
915                 } catch(Exception e){
916                         msoLogger.debug ("Mapping of request to JSON object failed : ", e);
917                         if (msoRequest.getRequestId () != null) {
918                                 msoLogger.debug ("Mapping of request to JSON object failed");
919                                 msoRequest.createRequestRecord (Status.FAILED, action);
920                         }
921                         msoLogger.error (MessageEnum.APIH_REQUEST_VALIDATION_ERROR, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", MsoLogger.ErrorCode.SchemaError, requestJSON, e);
922                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.SchemaError, "Mapping of request to JSON object failed");
923                         throw new Exception(e);
924                 }
925                 return sir;
926         }
927
928         private RecipeLookupResult getServiceInstanceOrchestrationURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
929                 RecipeLookupResult recipeLookupResult = null;
930                 //if the aLaCarte flag is set to TRUE, the API-H should choose the Ã¢â‚¬Å“VID_DEFAULTâ€\9d recipe for the requested action
931
932                 msoLogger.debug("aLaCarteFlag is " + msoRequest.getALaCarteFlag());
933                 // Query MSO Catalog DB
934                 
935                 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
936                         recipeLookupResult = getDefaultVnfUri(db, msoRequest, action);
937                 }
938                 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.service)) {
939                         recipeLookupResult = getServiceURI(db, msoRequest, action);
940                 }
941                 else if (msoRequest.getModelInfo().getModelType().equals(ModelType.vfModule) ||
942                                 msoRequest.getModelInfo().getModelType().equals(ModelType.volumeGroup) || msoRequest.getModelInfo().getModelType().equals(ModelType.vnf)) {
943
944                         recipeLookupResult = getVnfOrVfModuleUri(db, msoRequest, action);
945
946                 }else if (msoRequest.getModelInfo().getModelType().equals(ModelType.network)) {
947
948                         recipeLookupResult = getNetworkUri(db, msoRequest, action);
949                 }
950
951                 if (recipeLookupResult != null) {
952                         msoLogger.debug ("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: " + Integer.toString(recipeLookupResult.getRecipeTimeout ()));
953                 }
954                 else {
955                         msoLogger.debug("No matching recipe record found");
956                 }
957                 return recipeLookupResult;
958         }
959
960
961         private RecipeLookupResult getServiceURI (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
962                 // SERVICE REQUEST
963                 // Construct the default service name
964                 // TODO need to make this a configurable property
965                 String defaultServiceModelName = "*";
966                 String defaultSourceServiceModelName = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
967
968                 Service serviceRecord;
969                 ModelInfo modelInfo = msoRequest.getModelInfo();
970                 if(msoRequest.getALaCarteFlag()){
971                         serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
972                         if (serviceRecord == null) {
973                                 serviceRecord = db.getServiceByModelName(defaultServiceModelName);
974                         }
975                 }else{
976                         serviceRecord = db.getServiceByModelUUID(modelInfo.getModelVersionId()); // ModelVersionId is not required in v3
977                         if(serviceRecord == null) {
978                                 serviceRecord = db.getServiceByVersionAndInvariantId(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
979                         }
980                 }
981
982                 ServiceRecipe recipe = null;
983                 if(serviceRecord !=null){
984                         recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
985                 }
986                 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
987                 RequestParameters reqParam = msoRequest.getServiceInstancesRequest().getRequestDetails().getRequestParameters();
988                 if(reqParam!=null && reqParam.isaLaCarte() && recipe==null){
989                         return null;
990                 }
991
992                 //aLaCarte wasn't sent, so we'll try the default
993                 serviceRecord = db.getServiceByModelName(defaultSourceServiceModelName);
994                 if (serviceRecord == null) {
995                         serviceRecord = db.getServiceByModelName(defaultServiceModelName);
996                 }
997
998                 recipe = db.getServiceRecipeByModelUUID(serviceRecord.getModelUUID(), action.name());
999                 if(modelInfo.getModelVersionId() == null) {
1000                         modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1001                 }
1002                 if(recipe==null){
1003                         return null;
1004                 }
1005                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1006         }
1007
1008
1009         private RecipeLookupResult getVnfOrVfModuleUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1010
1011                 ModelInfo modelInfo = msoRequest.getModelInfo();
1012                 String vnfComponentType = modelInfo.getModelType().name();
1013
1014                 RelatedInstanceList[] instanceList = null;
1015                 if (msoRequest.getServiceInstancesRequest().getRequestDetails() != null) {
1016                         instanceList = msoRequest.getServiceInstancesRequest().getRequestDetails().getRelatedInstanceList();
1017                 }
1018
1019                 Recipe recipe = null;
1020                 String defaultSource = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1021                 String modelCustomizationId = modelInfo.getModelCustomizationId();
1022                 String modelCustomizationName = modelInfo.getModelCustomizationName();
1023                 String relatedInstanceModelVersionId = null;
1024                 String relatedInstanceModelInvariantId = null;
1025                 String relatedInstanceVersion = null;
1026                 String relatedInstanceModelCustomizationName = null;
1027
1028                 if (instanceList != null) {
1029
1030                         for(RelatedInstanceList relatedInstanceList : instanceList){
1031
1032                                 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1033                                 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1034                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1035                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1036                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1037                                 }
1038
1039                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1040                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1041                                         relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1042                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1043                                         relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1044                                 }
1045                         }
1046
1047                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1048                                 //                      a.      For a vnf request (only create, no update currently): 
1049                                 //                              i.      (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1050                                 //                              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 
1051                                 //                                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName 
1052                                 //                                      to Ã¢â‚¬Å“joinâ€\9d service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid  record exists. 
1053                                 //                              **If relatedInstance.modelInfo[service].modelVersionId  was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId 
1054                                 //                                      (MODEL_UUID) in SERVICE table.
1055                                 //                              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 
1056                                 //                                      during 1707 data migration if VID did not provide it originally on request.
1057                                 //                              iv.     Note: continue to construct the Ã¢â‚¬Å“vnf-typeâ€\9d value and pass to BPMN (must still be populated in A&AI).  
1058                                 //                              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.
1059
1060                                 VnfResource vnfResource = null;
1061                                 VnfResourceCustomization vrc;
1062                                 // Validation for vnfResource
1063
1064                                 if(modelCustomizationId!=null) {
1065                                         vnfResource = db.getVnfResourceByModelCustomizationId(modelCustomizationId);
1066                                 } else {
1067                                         Service service = db.getServiceByModelUUID(relatedInstanceModelVersionId);
1068                                         if(service == null) {
1069                                                 service = db.getServiceByVersionAndInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion);
1070                                         }
1071
1072                                 if(service == null) {
1073                                         throw new ValidationException("service in relatedInstance");
1074                                 }
1075
1076                                         vrc = db.getVnfResourceCustomizationByModelCustomizationName(modelCustomizationName, service.getModelUUID());
1077                                         if(vrc != null) {
1078                                                 vnfResource = vrc.getVnfResource();
1079                                                 modelInfo.setModelCustomizationId(vrc.getModelCustomizationUuid());
1080                                                 modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUuid());
1081                                         }
1082                                 }
1083
1084                                 if(vnfResource==null){
1085                                         throw new ValidationException("catalog entry");
1086                                 } else {
1087                                         if(modelInfo.getModelVersionId() == null) {
1088                                                 modelInfo.setModelVersionId(vnfResource.getModelUuid());
1089                                         }
1090                                 }
1091
1092                                 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultSource, action.name());
1093
1094                                 if (vnfRecipe == null) {
1095                                         return null;
1096                                 }
1097
1098                                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1099                         } else {
1100                                 //                      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 
1101                                 //                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[vnf].modelVersionId** + modelInfo[vnf].modelCustomizationName 
1102                                 //                      to Ã¢â‚¬Å“joinâ€\9d vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid  record exists. 
1103                                 //                      **If relatedInstance.modelInfo[vnf].modelVersionId  was not provided, use relatedInstance.modelInfo[vnf].modelInvariantId + modelVersion instead 
1104                                 //                      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 
1105                                 //                      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, 
1106                                 //                      use that UUID to query vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId** to confirm record matches request data 
1107                                 //                      (and to identify the modelCustomizationId associated with the vfModule in the request). **If modelInfo[vfModule|volumeGroup].modelVersionId was not 
1108                                 //                      provided (potentially in v2/v3), use modelInfo[vfModule|volumeGroup].modelInvariantId + modelVersion instead. This means taking each record found 
1109                                 //                      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) 
1110                                 //                      and MODEL_VERSION (modelVersion).
1111
1112                                 VfModuleCustomization vfmc = null;
1113                                         VnfResourceCustomization vnfrc;
1114                                 VfModule vfModule = null;
1115
1116                                 if( modelInfo.getModelCustomizationId() != null) {
1117                                         vfmc = db.getVfModuleCustomizationByModelCustomizationId(modelInfo.getModelCustomizationId());
1118                                 } else {
1119                                         vnfrc =db.getVnfResourceCustomizationByVnfModelCustomizationNameAndModelVersionId(relatedInstanceModelCustomizationName, relatedInstanceModelVersionId);
1120                                         if(vnfrc == null) {
1121                                                 vnfrc = db.getVnfResourceCustomizationByModelInvariantId(relatedInstanceModelInvariantId, relatedInstanceVersion, relatedInstanceModelCustomizationName);
1122                                         } 
1123
1124                                         List<VfModuleCustomization> list = db.getVfModuleCustomizationByVnfModuleCustomizationUuid(vnfrc.getModelCustomizationUuid());
1125
1126                                         String vfModuleModelUUID = modelInfo.getModelVersionId();
1127                                         for(VfModuleCustomization vf : list) {
1128                                                 if(vfModuleModelUUID != null) {
1129                                                         vfModule = db.getVfModuleByModelCustomizationIdAndVersion(vf.getModelCustomizationUuid(), vfModuleModelUUID);
1130                                                 } else {
1131                                                         vfModule = db.getVfModuleByModelCustomizationIdModelVersionAndModelInvariantId(vf.getModelCustomizationUuid(), modelInfo.getModelVersion(), modelInfo.getModelInvariantId());
1132                                                 }
1133
1134                                                 if(vfModule != null) {
1135                                                         modelInfo.setModelCustomizationId(vf.getModelCustomizationUuid());
1136                                                         modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUuid());
1137                                                         break;
1138                                                 }
1139                                         }
1140                                 }
1141
1142                                 if(vfmc == null && vfModule == null) {
1143                                         throw new ValidationException("no catalog entry found");
1144                                 } else if (vfModule == null && vfmc != null) {
1145                                         vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1146                                 }
1147
1148                                 if(modelInfo.getModelVersionId() == null) {
1149                                         modelInfo.setModelVersionId(vfModule.getModelUUID());
1150                                 }
1151                                 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(vfModule.getModelUUID(), vnfComponentType, action.name());
1152
1153                                 if(recipe == null) {
1154                                         recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultSource, vnfComponentType, action.name());
1155                                         if (recipe == null) { 
1156                                                 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId("*", vnfComponentType, action.name());
1157                                         }
1158
1159                                         if(recipe == null) {
1160                                                 return null;
1161                                         }
1162                                 }
1163                         }
1164                 } else {
1165                         msoLogger.debug("recipe is null, getting default");
1166
1167                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1168                                 recipe = db.getVnfRecipe(defaultSource, action.name());
1169                                 if (recipe == null) {
1170                                         return null;
1171                                 }
1172                         } else {
1173                                 recipe = db.getVnfComponentsRecipeByVfModuleModelUUId(defaultSource, vnfComponentType, action.name());
1174
1175                                 if (recipe == null) {
1176                                         return null;
1177                                 }
1178                         }
1179                 }
1180
1181                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1182         }
1183         
1184         private RecipeLookupResult getDefaultVnfUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1185
1186                 String defaultSource = msoRequest.getRequestInfo().getSource() + "_DEFAULT";            
1187
1188                 VnfRecipe vnfRecipe = db.getVnfRecipe(defaultSource, action.name());
1189
1190                 if (vnfRecipe == null) {
1191                         return null;
1192                 }
1193
1194                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());          
1195         }
1196
1197
1198         private RecipeLookupResult getNetworkUri (CatalogDatabase db, MsoRequest msoRequest, Action action) throws Exception {
1199
1200                 String defaultNetworkType = msoRequest.getRequestInfo().getSource() + "_DEFAULT";
1201
1202                 ModelInfo modelInfo = msoRequest.getModelInfo();
1203                 String modelName = modelInfo.getModelName();
1204                 Recipe recipe = null;
1205
1206                 if(modelInfo.getModelCustomizationId()!=null){
1207                         NetworkResource networkResource = db.getNetworkResourceByModelCustUuid(modelInfo.getModelCustomizationId());
1208                         if(networkResource!=null){
1209                                 if(modelInfo.getModelVersionId() == null) {
1210                                         modelInfo.setModelVersionId(networkResource.getModelUUID());
1211                                 }
1212                                 recipe = db.getNetworkRecipe(networkResource.getModelName(), action.name());
1213                         }else{
1214                                 throw new ValidationException("no catalog entry found");
1215                         }
1216                 }else{
1217                         //ok for version < 3 and action delete
1218                         recipe = db.getNetworkRecipe(modelName, action.name());
1219                 }
1220
1221                 if(recipe == null){
1222                         recipe = db.getNetworkRecipe(defaultNetworkType, action.name());
1223                 }
1224                 
1225                 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1226         }
1227         
1228         private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String,String> instanceIdMap, String version) {
1229                 String requestId = UUIDChecker.generateUUID(msoLogger);
1230                 long startTime = System.currentTimeMillis ();
1231                 msoLogger.debug ("requestId is: " + requestId);
1232                 ServiceInstancesRequest sir = null;
1233                 MsoRequest msoRequest = new MsoRequest (requestId);
1234
1235                 try {
1236                         sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest);
1237                 } catch(Exception e) {
1238                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
1239                                         "Mapping of request to JSON object failed.  " + e.getMessage(),
1240                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
1241                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1242                         return response;
1243                 }
1244
1245                 try {
1246                         parseRequest(requestJSON, action, instanceIdMap, version, startTime, sir, msoRequest);
1247                 } catch(Exception e) {
1248                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_BAD_REQUEST, MsoException.ServiceException,
1249                                         "Error parsing request.  " + e.getMessage(),
1250                                         ErrorNumbers.SVC_BAD_PARAMETER, null);
1251                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1252                         return response;
1253                 }
1254
1255                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1256                 String requestScope;
1257                 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
1258                         requestScope = (ModelType.vnf.name());
1259                 }else{
1260                         requestScope = sir.getRequestDetails().getModelInfo().getModelType().name();
1261                 }
1262                 InfraActiveRequests dup = null;
1263                 
1264                 try {
1265                         dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope);
1266                 } catch(Exception e) {
1267                         Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, MsoException.ServiceException,
1268                                         e.getMessage(),
1269                                         ErrorNumbers.SVC_DETAILED_SERVICE_ERROR,
1270                                         null) ;
1271                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1272                         return response;
1273                 }
1274
1275                 if (dup != null) {
1276                         return buildErrorOnDuplicateRecord(action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1277                 }
1278
1279                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1280                 RequestReferences referencesResponse = new RequestReferences();
1281                 referencesResponse.setRequestId(requestId);
1282                 serviceResponse.setRequestReferences(referencesResponse);
1283                 
1284                 MsoJavaProperties props = MsoPropertiesUtils.loadMsoProperties ();
1285                 String orchestrationUri = props.getProperty(CommonConstants.ALACARTE_ORCHESTRATION, null);
1286                 String timeOut = props.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT, null);
1287                 
1288                 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1289                         String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1290                         
1291                         msoLogger.error (MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, Constants.MSO_PROP_APIHANDLER_INFRA, "", "", 
1292                         MsoLogger.ErrorCode.DataError, error);
1293                         msoRequest.setStatus (org.openecomp.mso.apihandlerinfra.vnfbeans.RequestStatusType.FAILED);
1294                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_NOT_FOUND,
1295                                                                                                                                         MsoException.ServiceException,
1296                                                                                                                                         error,
1297                                                                                                                                         ErrorNumbers.SVC_GENERAL_SERVICE_ERROR,
1298                                                                                                                                         null);
1299                         msoRequest.createRequestRecord (Status.FAILED, action);
1300                         msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.ERROR, MsoLogger.ResponseCode.DataNotFound, error);
1301                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1302                         return response;
1303                         
1304                 }
1305                 
1306                 String serviceInstanceId = "";
1307                 String configurationId = "";
1308                 ServiceInstancesRequest siReq = msoRequest.getServiceInstancesRequest();
1309
1310                 if(siReq.getServiceInstanceId () != null){
1311                         serviceInstanceId = siReq.getServiceInstanceId ();
1312                 }
1313
1314                 if(siReq.getConfigurationId() != null){
1315                         configurationId = siReq.getConfigurationId();
1316                 }
1317
1318                 requestId = msoRequest.getRequestId ();
1319                 msoLogger.debug ("requestId is: " + requestId);
1320                 msoLogger.debug ("About to insert a record");
1321
1322                 try {
1323                         createRequestRecord(action, startTime, msoRequest);
1324                 } catch(Exception e) {
1325                         Response response = msoRequest.buildServiceErrorResponse (HttpStatus.SC_INTERNAL_SERVER_ERROR,
1326                                         MsoException.ServiceException,
1327                                         "Exception while creating record in DB " + e.getMessage(),
1328                                         ErrorNumbers.SVC_BAD_PARAMETER,
1329                                         null);
1330                         msoLogger.debug ("End of the transaction, the final response is: " + (String) response.getEntity ());
1331                         return response;
1332                 }
1333
1334                 return postBPELRequest(action, requestId, startTime, msoRequest, orchestrationUri, Integer.parseInt(timeOut), false, 
1335                                                                 serviceInstanceId, null, null, null, null, configurationId, null, null, null, null);
1336         }
1337 }