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