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