bb7df4b7be7f4e24adf2ed500ffa9398cf9a0b65
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / 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
22 package org.onap.so.apihandlerinfra;
23
24
25 import com.fasterxml.jackson.annotation.JsonInclude.Include;
26 import com.fasterxml.jackson.core.JsonParseException;
27 import com.fasterxml.jackson.core.JsonProcessingException;
28 import com.fasterxml.jackson.databind.JsonMappingException;
29 import com.fasterxml.jackson.databind.ObjectMapper;
30 import io.swagger.annotations.Api;
31 import io.swagger.annotations.ApiOperation;
32 import org.apache.commons.lang.StringUtils;
33 import org.apache.http.HttpResponse;
34 import org.apache.http.HttpStatus;
35 import org.onap.so.apihandler.camundabeans.CamundaResponse;
36 import org.onap.so.apihandler.common.CommonConstants;
37 import org.onap.so.apihandler.common.ErrorNumbers;
38 import org.onap.so.apihandler.common.RequestClient;
39 import org.onap.so.apihandler.common.RequestClientFactory;
40 import org.onap.so.apihandler.common.RequestClientParameter;
41 import org.onap.so.apihandler.common.ResponseBuilder;
42 import org.onap.so.apihandler.common.ResponseHandler;
43 import org.onap.so.apihandlerinfra.exceptions.ApiException;
44 import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException;
45 import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException;
46 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
47 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
48 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
49 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
50 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
51 import org.onap.so.db.catalog.beans.NetworkResource;
52 import org.onap.so.db.catalog.beans.Recipe;
53 import org.onap.so.db.catalog.beans.ServiceRecipe;
54 import org.onap.so.db.catalog.beans.VfModule;
55 import org.onap.so.db.catalog.beans.VfModuleCustomization;
56 import org.onap.so.db.catalog.beans.VnfRecipe;
57 import org.onap.so.db.catalog.beans.VnfResource;
58 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
59 import org.onap.so.db.catalog.client.CatalogDbClient;
60 import org.onap.so.db.request.beans.InfraActiveRequests;
61 import org.onap.so.db.request.client.RequestsDbClient;
62 import org.onap.so.exceptions.ValidationException;
63 import org.onap.so.logger.MessageEnum;
64 import org.onap.so.logger.MsoLogger;
65 import org.onap.so.serviceinstancebeans.CloudConfiguration;
66 import org.onap.so.serviceinstancebeans.ModelInfo;
67 import org.onap.so.serviceinstancebeans.ModelType;
68 import org.onap.so.serviceinstancebeans.Networks;
69 import org.onap.so.serviceinstancebeans.RelatedInstance;
70 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
71 import org.onap.so.serviceinstancebeans.RequestDetails;
72 import org.onap.so.serviceinstancebeans.RequestParameters;
73 import org.onap.so.serviceinstancebeans.RequestReferences;
74 import org.onap.so.serviceinstancebeans.Service;
75 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
76 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
77 import org.onap.so.serviceinstancebeans.VfModules;
78 import org.onap.so.serviceinstancebeans.Vnfs;
79 import org.onap.so.utils.UUIDChecker;
80 import org.springframework.beans.factory.annotation.Autowired;
81 import org.springframework.core.env.Environment;
82 import org.springframework.stereotype.Component;
83
84 import javax.transaction.Transactional;
85 import javax.ws.rs.Consumes;
86 import javax.ws.rs.DELETE;
87 import javax.ws.rs.POST;
88 import javax.ws.rs.PUT;
89 import javax.ws.rs.Path;
90 import javax.ws.rs.PathParam;
91 import javax.ws.rs.Produces;
92 import javax.ws.rs.container.ContainerRequestContext;
93 import javax.ws.rs.core.Context;
94 import javax.ws.rs.core.MediaType;
95 import javax.ws.rs.core.Response;
96 import java.io.IOException;
97 import java.sql.Timestamp;
98 import java.util.ArrayList;
99 import java.util.HashMap;
100 import java.util.List;
101 import java.util.Map;
102 import java.util.Optional;
103
104 @Component
105 @Path("/onap/so/infra/serviceInstantiation")
106 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
107 public class ServiceInstances {
108
109         private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH,MsoRequest.class);
110         private static String NAME = "name";
111         private static String VALUE = "value";
112         
113         @Autowired
114         private Environment env;
115         
116         @Autowired
117         private RequestClientFactory reqClientFactory;
118         
119         @Autowired
120         private CatalogDbClient catalogDbClient;
121
122         @Autowired
123         private RequestsDbClient infraActiveRequestsClient;
124         
125         @Autowired
126         private ResponseBuilder builder;
127         
128         @Autowired
129         private MsoRequest msoRequest;
130         
131         @POST
132     @Path("/{version:[vV][5-7]}/serviceInstances")
133         @Consumes(MediaType.APPLICATION_JSON)
134         @Produces(MediaType.APPLICATION_JSON)
135         @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
136         @Transactional
137     public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
138                 String requestId = getRequestId(requestContext);
139                 return serviceInstances(request, Action.createInstance, null, version, requestId, getRequestUri(requestContext));
140         }
141         
142         @POST
143         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
144         @Consumes(MediaType.APPLICATION_JSON)
145         @Produces(MediaType.APPLICATION_JSON)
146         @ApiOperation(value="Activate provided Service Instance",response=Response.class)
147         @Transactional
148     public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
149                 String requestId = getRequestId(requestContext);
150                 HashMap<String, String> instanceIdMap = new HashMap<>();
151                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
152                 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
153         }
154         
155         @POST
156         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
157         @Consumes(MediaType.APPLICATION_JSON)
158         @Produces(MediaType.APPLICATION_JSON)
159         @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
160         @Transactional
161     public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
162                 String requestId = getRequestId(requestContext);
163                 HashMap<String, String> instanceIdMap = new HashMap<>();
164                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
165                 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
166         }
167         
168         @DELETE
169         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
170         @Consumes(MediaType.APPLICATION_JSON)
171         @Produces(MediaType.APPLICATION_JSON)
172         @ApiOperation(value="Delete provided Service Instance",response=Response.class)
173         @Transactional
174     public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
175                 String requestId = getRequestId(requestContext);
176                 HashMap<String, String> instanceIdMap = new HashMap<>();
177                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
178                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
179         }
180         
181         @POST
182         @Path("/{version:[vV][7]}/serviceInstances/assign")
183         @Consumes(MediaType.APPLICATION_JSON)
184         @Produces(MediaType.APPLICATION_JSON)
185         @ApiOperation(value="Assign Service Instance", response=Response.class)
186         @Transactional
187         public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
188                 String requestId = getRequestId(requestContext);
189                 return serviceInstances(request, Action.assignInstance, null, version, requestId, getRequestUri(requestContext));
190         }
191
192         @POST
193         @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
194         @Consumes(MediaType.APPLICATION_JSON)
195         @Produces(MediaType.APPLICATION_JSON)
196         @ApiOperation(value="Unassign Service Instance", response=Response.class)
197         @Transactional
198         public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
199                 String requestId = getRequestId(requestContext);
200                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
201                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
202                 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
203         }
204         
205         @POST
206         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
207         @Consumes(MediaType.APPLICATION_JSON)
208         @Produces(MediaType.APPLICATION_JSON)
209         @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
210         @Transactional
211     public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
212                 String requestId = getRequestId(requestContext);
213                 HashMap<String, String> instanceIdMap = new HashMap<>();
214                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
215                 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
216         }
217         
218         @DELETE
219         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
220         @Consumes(MediaType.APPLICATION_JSON)
221         @Produces(MediaType.APPLICATION_JSON)
222         @ApiOperation(value="Delete provided Port",response=Response.class)
223         @Transactional
224         public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
225                                             @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
226                 String requestId = getRequestId(requestContext);
227                 HashMap<String, String> instanceIdMap = new HashMap<>();
228                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
229                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
230                 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
231         }
232         
233         @POST
234         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
235         @Consumes(MediaType.APPLICATION_JSON)
236         @Produces(MediaType.APPLICATION_JSON)
237         @ApiOperation(value="Enable Port Mirroring",response=Response.class)
238         @Transactional
239         public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
240                                @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
241                 String requestId = getRequestId(requestContext);
242                 HashMap<String, String> instanceIdMap = new HashMap<>();
243                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
244                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
245                 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
246         }
247         
248         @POST
249         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
250         @Consumes(MediaType.APPLICATION_JSON)
251         @Produces(MediaType.APPLICATION_JSON)
252         @ApiOperation(value="Disable Port Mirroring",response=Response.class)
253         @Transactional
254         public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
255                                 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
256                 String requestId = getRequestId(requestContext);
257                 HashMap<String, String> instanceIdMap = new HashMap<>();
258                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
259                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
260                 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, getRequestUri(requestContext));
261         }
262         
263         @POST
264         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
265         @Consumes(MediaType.APPLICATION_JSON)
266         @Produces(MediaType.APPLICATION_JSON)
267         @ApiOperation(value="Activate Port Mirroring",response=Response.class)
268         @Transactional
269         public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
270                                  @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
271                 String requestId = getRequestId(requestContext);
272                 HashMap<String, String> instanceIdMap = new HashMap<>();
273                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
274                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
275                 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
276         }
277         
278         @POST
279         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
280         @Consumes(MediaType.APPLICATION_JSON)
281         @Produces(MediaType.APPLICATION_JSON)
282         @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
283         @Transactional
284         public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
285                                    @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
286                 String requestId = getRequestId(requestContext);
287                 HashMap<String, String> instanceIdMap = new HashMap<>();
288                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
289                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
290                 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
291         }
292
293         @POST
294         @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
295         @Consumes(MediaType.APPLICATION_JSON)
296         @Produces(MediaType.APPLICATION_JSON)
297         @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
298         @Transactional
299     public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
300                 String requestId = getRequestId(requestContext);
301                 HashMap<String, String> instanceIdMap = new HashMap<>();
302                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
303                 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
304         }
305         
306         @POST
307         @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
308         @Consumes(MediaType.APPLICATION_JSON)
309         @Produces(MediaType.APPLICATION_JSON)
310         @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
311         @Transactional
312     public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
313                 String requestId = getRequestId(requestContext);
314                 HashMap<String, String> instanceIdMap = new HashMap<>();
315                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
316                 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, getRequestUri(requestContext));
317         }
318         
319         @POST
320         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
321         @Consumes(MediaType.APPLICATION_JSON)
322         @Produces(MediaType.APPLICATION_JSON)
323         @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
324         @Transactional
325     public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
326                 String requestId = getRequestId(requestContext);
327                 HashMap<String, String> instanceIdMap = new HashMap<>();
328                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
329                 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
330         }
331         
332         @POST
333         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
334         @Consumes(MediaType.APPLICATION_JSON)
335         @Produces(MediaType.APPLICATION_JSON)
336         @ApiOperation(value="Replace provided VNF instance",response=Response.class)
337         @Transactional
338         public Response replaceVnfInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
339                                        @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
340                 String requestId = getRequestId(requestContext);
341                 HashMap<String, String> instanceIdMap = new HashMap<>();
342                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
343                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
344                 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
345         }
346         
347         @PUT
348         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
349         @Consumes(MediaType.APPLICATION_JSON)
350         @Produces(MediaType.APPLICATION_JSON)
351         @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
352         @Transactional
353         public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
354                                       @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
355                 String requestId = getRequestId(requestContext);
356                 HashMap<String, String> instanceIdMap = new HashMap<>();
357                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
358                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
359                 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
360         }
361         
362         @POST
363         @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
364         @Consumes(MediaType.APPLICATION_JSON)
365         @Produces(MediaType.APPLICATION_JSON)
366         @ApiOperation(value="Apply updated configuration",response=Response.class)
367         public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
368                                        @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
369                 String requestId = getRequestId(requestContext);
370                 HashMap<String, String> instanceIdMap = new HashMap<>();
371                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
372                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
373                 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
374         }
375         
376         @POST
377         @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
378         @Consumes(MediaType.APPLICATION_JSON)
379         @Produces(MediaType.APPLICATION_JSON)
380         @ApiOperation(value="Recreate VNF Instance",response=Response.class)
381         public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
382                                        @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
383                 String requestId = getRequestId(requestContext);
384                 HashMap<String, String> instanceIdMap = new HashMap<>();
385                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
386                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
387                 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
388         }
389
390
391         @DELETE
392         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
393         @Consumes(MediaType.APPLICATION_JSON)
394         @Produces(MediaType.APPLICATION_JSON)
395         @ApiOperation(value="Delete provided VNF instance",response=Response.class)
396         @Transactional
397         public Response deleteVnfInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
398                                       @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
399                 String requestId = getRequestId(requestContext);
400                 HashMap<String, String> instanceIdMap = new HashMap<>();
401                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
402                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
403                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
404         }
405
406         @POST
407         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
408         @Consumes(MediaType.APPLICATION_JSON)
409         @Produces(MediaType.APPLICATION_JSON)
410         @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
411         @Transactional
412         public Response createVfModuleInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
413                                            @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
414                 String requestId = getRequestId(requestContext);
415                 HashMap<String, String> instanceIdMap = new HashMap<>();
416                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
417                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
418                 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
419         }
420         
421         @POST
422         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
423         @Consumes(MediaType.APPLICATION_JSON)
424         @Produces(MediaType.APPLICATION_JSON)
425         @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
426         @Transactional
427         public Response replaceVfModuleInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
428                         @PathParam("vnfInstanceId") String vnfInstanceId,
429                                             @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
430                 String requestId = getRequestId(requestContext);
431                 HashMap<String, String> instanceIdMap = new HashMap<>();
432                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
433                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
434                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
435                 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
436         }
437
438         @PUT
439         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
440         @Consumes(MediaType.APPLICATION_JSON)
441         @Produces(MediaType.APPLICATION_JSON)
442         @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
443         @Transactional
444         public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
445                         @PathParam("vnfInstanceId") String vnfInstanceId,
446                                            @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
447                 String requestId = getRequestId(requestContext);
448                 HashMap<String, String> instanceIdMap = new HashMap<>();
449                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
450                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
451                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
452                 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
453         }
454         
455         @POST
456         @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
457         @Consumes(MediaType.APPLICATION_JSON)
458         @Produces(MediaType.APPLICATION_JSON)
459         @ApiOperation(value="Perform VNF software update",response=Response.class)
460         @Transactional
461         public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
462                                           @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
463                 String requestId = getRequestId(requestContext);
464                 HashMap<String, String> instanceIdMap = new HashMap<>();
465                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
466                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
467                 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, getRequestUri(requestContext));
468         }
469         
470         @DELETE
471         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
472         @Consumes(MediaType.APPLICATION_JSON)
473         @Produces(MediaType.APPLICATION_JSON)
474         @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
475         @Transactional
476         public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
477                         @PathParam("vnfInstanceId") String vnfInstanceId,
478                                            @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
479                 String requestId = getRequestId(requestContext);
480                 HashMap<String, String> instanceIdMap = new HashMap<>();
481                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
482                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
483                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
484                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
485         }
486         
487         @POST
488         @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
489         @Consumes(MediaType.APPLICATION_JSON)
490         @Produces(MediaType.APPLICATION_JSON)
491         @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
492         @Transactional
493         public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
494                         @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
495                 String requestId = getRequestId(requestContext);
496                 HashMap<String, String> instanceIdMap = new HashMap<>();
497                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
498                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
499                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
500                 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, getRequestUri(requestContext));
501                 return response;
502         }
503         
504         @POST
505         @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
506         @Consumes(MediaType.APPLICATION_JSON)
507         @Produces(MediaType.APPLICATION_JSON)
508         @ApiOperation(value="VF Auto Scale Out",response=Response.class)
509         @Transactional
510         public Response scaleOutVfModule(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
511                                            @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
512                 String requestId = getRequestId(requestContext);
513                 HashMap<String, String> instanceIdMap = new HashMap<>();
514                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
515                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
516                 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
517         }
518
519
520         @POST
521         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
522         @Consumes(MediaType.APPLICATION_JSON)
523         @Produces(MediaType.APPLICATION_JSON)
524         @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
525         @Transactional
526         public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
527                                               @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
528                 String requestId = getRequestId(requestContext);
529                 HashMap<String, String> instanceIdMap = new HashMap<>();
530                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
531                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
532                 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
533         }
534
535         @PUT
536         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
537         @Consumes(MediaType.APPLICATION_JSON)
538         @Produces(MediaType.APPLICATION_JSON)
539         @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
540         @Transactional
541         public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
542                         @PathParam("vnfInstanceId") String vnfInstanceId,
543                                               @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
544                 String requestId = getRequestId(requestContext);
545                 HashMap<String, String> instanceIdMap = new HashMap<>();
546                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
547                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
548                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
549                 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
550         }
551
552         @DELETE
553         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
554         @Consumes(MediaType.APPLICATION_JSON)
555         @Produces(MediaType.APPLICATION_JSON)
556         @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
557         @Transactional
558         public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
559                         @PathParam("vnfInstanceId") String vnfInstanceId,
560                                               @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
561                 String requestId = getRequestId(requestContext);
562                 HashMap<String, String> instanceIdMap = new HashMap<>();
563                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
564                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
565                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
566                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
567         }
568
569         @POST
570         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
571         @Consumes(MediaType.APPLICATION_JSON)
572         @Produces(MediaType.APPLICATION_JSON)
573         @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
574         @Transactional
575     public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
576                 String requestId = getRequestId(requestContext);
577                 HashMap<String, String> instanceIdMap = new HashMap<>();
578                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
579                 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
580         }
581
582         @PUT
583         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
584         @Consumes(MediaType.APPLICATION_JSON)
585         @Produces(MediaType.APPLICATION_JSON)
586         @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
587         @Transactional
588         public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
589                                           @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
590                 String requestId = getRequestId(requestContext);
591                 HashMap<String, String> instanceIdMap = new HashMap<>();
592                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
593                 instanceIdMap.put("networkInstanceId", networkInstanceId);
594                 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
595         }
596
597         @DELETE
598         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
599         @Consumes(MediaType.APPLICATION_JSON)
600         @Produces(MediaType.APPLICATION_JSON)
601         @ApiOperation(value="Delete provided Network instance",response=Response.class)
602         @Transactional
603         public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
604                                           @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
605                 String requestId = getRequestId(requestContext);
606                 HashMap<String, String> instanceIdMap = new HashMap<>();
607                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
608                 instanceIdMap.put("networkInstanceId", networkInstanceId);
609                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
610         }
611
612         public String getRequestUri(ContainerRequestContext context){
613                 String requestUri = context.getUriInfo().getPath();
614                 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
615                 return requestUri;
616         }
617     
618         public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
619                 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
620                 Boolean aLaCarte = null;
621                 long startTime = System.currentTimeMillis ();
622                 ServiceInstancesRequest sir = null;
623                 String apiVersion = version.substring(1);
624
625                 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
626                 String requestScope = deriveRequestScope(action, sir, requestUri);
627                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject (sir,  action, requestId, Status.PENDING, requestJSON, requestScope);
628                 if(sir.getRequestDetails().getRequestParameters() != null){
629                         aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
630                 }
631                 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
632                 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
633                  
634                 int requestVersion = Integer.parseInt(version.substring(1));
635                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
636                 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
637                 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
638                 String networkType = msoRequest.getNetworkType(sir,requestScope);
639                 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
640                 String serviceInstanceType = msoRequest.getServiceInstanceType(sir,requestScope);
641                 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
642                 
643                 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
644                         currentActiveReq.setVnfType(vnfType);
645                 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
646                         currentActiveReq.setNetworkType(networkType);
647                 }
648                 
649                 InfraActiveRequests dup = null;
650                                 
651
652                 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
653
654                 if (dup != null) {
655             buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
656                 }
657                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
658
659                 RequestReferences referencesResponse = new RequestReferences();
660
661                 referencesResponse.setRequestId(requestId);
662
663                 serviceResponse.setRequestReferences(referencesResponse);
664                 Boolean isBaseVfModule = false;
665
666         RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
667                                                                 
668                         ModelType modelType;
669                         ModelInfo modelInfo =  sir.getRequestDetails().getModelInfo();
670                         if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
671                                 modelType = ModelType.vnf;
672                         }else {
673                                 modelType =modelInfo.getModelType();
674                         }
675
676                         if (modelType.equals(ModelType.vfModule)) {
677                                 
678
679                                 // Get VF Module-specific base module indicator
680                                 VfModule vfm = null;
681
682                                 String modelVersionId = modelInfo.getModelVersionId();
683
684                                 if(modelVersionId != null) {
685                                         vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
686                                 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
687                                         vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
688                                 }
689
690                                 if (vfm != null) {
691                                         if (vfm.getIsBase()) {
692                                                 isBaseVfModule = true;
693                                         }
694             } else if (action == Action.createInstance || action == Action.updateInstance) {
695                                         // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
696                                         // This request cannot proceed
697                                         
698                                         String serviceVersionText = "";
699                                         if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
700                                                 serviceVersionText = " with version " + sdcServiceModelVersion;
701                                         }
702
703                 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
704                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
705                 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
706                 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
707
708                 throw vfModuleException;
709                 }
710                 }
711                 
712                 
713                 serviceInstanceId = "";
714                 String vnfId = "";
715                 String vfModuleId = "";
716                 String volumeGroupId = "";
717                 String networkId = "";
718                 String correlationId = "";
719
720                 if(sir.getServiceInstanceId () != null){
721                         serviceInstanceId = sir.getServiceInstanceId ();
722                 }
723
724                 if(sir.getVnfInstanceId () != null){
725                         vnfId = sir.getVnfInstanceId ();
726                 }
727
728                 if(sir.getVfModuleInstanceId () != null){
729                         vfModuleId = sir.getVfModuleInstanceId ();
730                 }
731
732                 if(sir.getVolumeGroupInstanceId () != null){
733                         volumeGroupId = sir.getVolumeGroupInstanceId ();
734                 }
735
736                 if(sir.getNetworkInstanceId () != null){
737                         networkId = sir.getNetworkInstanceId ();
738                 }
739                 
740                 if (sir.getCorrelationId() != null) {
741                         correlationId = sir.getCorrelationId();
742                 }
743                 infraActiveRequestsClient.save(currentActiveReq);
744                 
745                 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
746                         aLaCarte = true;
747                 }else if(aLaCarte == null){
748                         aLaCarte = false;
749                 }
750                 
751                 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(), 
752                                                                 isBaseVfModule, serviceInstanceId, correlationId, vnfId, vfModuleId, volumeGroupId, networkId, null,
753                                                                 serviceInstanceType,vnfType, vfModuleType,networkType, apiVersion, aLaCarte, requestUri, null, requestScope, sir);
754         }
755
756         private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
757                 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
758                         return (ModelType.vnf.name());
759                 }else{
760                         String requestScope;
761                         if(sir.getRequestDetails().getModelInfo().getModelType() == null){
762                                 requestScope = requestScopeFromUri(requestUri);
763                         }else{
764                                 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name(); 
765                         }
766                         return requestScope; 
767                 }
768         }
769         private String requestScopeFromUri(String requestUri){
770                 String requestScope;
771                 if(requestUri.contains(ModelType.network.name())){
772                         requestScope = ModelType.network.name();
773                 }else if(requestUri.contains(ModelType.vfModule.name())){
774                         requestScope = ModelType.vfModule.name();
775                 }else if(requestUri.contains(ModelType.volumeGroup.name())){
776                         requestScope = ModelType.volumeGroup.name();
777                 }else if(requestUri.contains(ModelType.configuration.name())){
778                         requestScope = ModelType.configuration.name();
779                 }else if(requestUri.contains(ModelType.vnf.name())){
780                         requestScope = ModelType.vnf.name();
781                 }else{
782                         requestScope = ModelType.service.name();
783                 }
784                 return requestScope;
785         }
786         private Response postBPELRequest(InfraActiveRequests currentActiveReq, Actions action, String requestId, long startTime, String msoRawRequest,
787                                                                         String orchestrationUri, int timeOut, Boolean isBaseVfModule,
788                                                                         String serviceInstanceId, String correlationId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
789                                      String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType, 
790                                      String apiVersion, boolean aLaCarte, String requestUri, String paramXsd, String requestScope, ServiceInstancesRequest sir) throws ApiException {
791                 RequestClient requestClient = null;
792                 HttpResponse response = null;
793                 try {
794                         requestClient = reqClientFactory.getRequestClient (orchestrationUri);
795                         response = requestClient.post(new RequestClientParameter.Builder()
796                                         .setRequestId(requestId)
797                                         .setBaseVfModule(isBaseVfModule)
798                                         .setRecipeTimeout(timeOut)
799                                         .setRequestAction(action.toString())
800                                         .setServiceInstanceId(serviceInstanceId)
801                                         .setCorrelationId(correlationId)
802                                         .setVnfId(vnfId)
803                                         .setVfModuleId(vfModuleId)
804                                         .setVolumeGroupId(volumeGroupId)
805                                         .setNetworkId(networkId)
806                                         .setConfigurationId(configurationId)
807                                         .setServiceType(serviceInstanceType)
808                                         .setVnfType(vnfType)
809                                         .setVfModuleType(vfModuleType)
810                                         .setNetworkType(networkType)
811                                         .setRequestDetails(mapJSONtoMSOStyle(msoRawRequest, sir, aLaCarte, action))
812                                         .setApiVersion(apiVersion)
813                                         .setALaCarte(aLaCarte)
814                                         .setRecipeParamXsd(paramXsd)
815                                         .setRequestUri(requestUri).build());
816                         
817                         
818                 } catch (Exception e) {
819                         
820             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
821             String url = requestClient != null ? requestClient.getUrl() : "";
822             ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
823             updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
824
825             throw clientException;
826                 }
827
828                 if (response == null) {
829                         
830             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
831             ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
832
833             updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
834
835             throw clientException;
836                 }
837
838                 ResponseHandler respHandler = null;
839         int bpelStatus = 500;
840         try {
841             respHandler = new ResponseHandler (response, requestClient.getType ());
842             bpelStatus = respHandler.getStatus ();
843         } catch (ApiException e) {
844             msoLogger.error(e);
845             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
846             ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
847                         .errorInfo(errorLoggerInfo).build();
848             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
849             throw validateException;
850         }
851
852                 // BPEL accepted the request, the request is in progress
853                 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
854                         ServiceInstancesResponse jsonResponse;
855                         CamundaResponse camundaResp = respHandler.getResponse();
856                         
857                         if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
858                                 try {
859                                         ObjectMapper mapper = new ObjectMapper();
860                                         jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
861                                 } catch (IOException e) {
862                                         msoLogger.error(e);
863                                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
864                                         ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
865                                             .errorInfo(errorLoggerInfo).build();
866                                         updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
867                                         throw validateException;
868                                 }
869                         
870                                 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
871                                 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
872                                 
873                                 infraActiveRequestsClient.save(currentActiveReq);
874                                 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
875                         } 
876                 }
877                         
878                 List<String> variables = new ArrayList<>();
879                 variables.add(bpelStatus + "");
880                 String camundaJSONResponseBody = respHandler.getResponseBody ();
881                 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
882                         
883                     ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
884                     BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
885                             .errorInfo(errorLoggerInfo).build();
886
887                     updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
888
889                     throw bpmnException;
890                 } else {
891                 
892                     ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
893
894
895                     BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
896                             .errorInfo(errorLoggerInfo).build();
897                     updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
898
899                     throw servException;
900                 }
901         }
902
903         private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
904                 if(StringUtils.isNotBlank(instanceId)) {
905                         if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
906                                 currentActiveReq.setServiceInstanceId(instanceId);
907                         } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
908                                 currentActiveReq.setVnfId(instanceId);
909                         } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
910                                 currentActiveReq.setVfModuleId(instanceId);
911                         } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
912                                 currentActiveReq.setVolumeGroupId(instanceId);
913                         } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
914                                 currentActiveReq.setNetworkId(instanceId);
915                         } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
916                                 currentActiveReq.setConfigurationId(instanceId);
917                         }
918                 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
919                         if(instanceIdMap.get("serviceInstanceId") != null){
920                                 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
921                 }
922                 if(instanceIdMap.get("vnfInstanceId") != null){
923                         currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
924                 }
925                 if(instanceIdMap.get("vfModuleInstanceId") != null){
926                         currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
927                 }
928                 if(instanceIdMap.get("volumeGroupInstanceId") != null){
929                         currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
930                 }
931                 if(instanceIdMap.get("networkInstanceId") != null){
932                         currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
933                 }
934                 if(instanceIdMap.get("configurationInstanceId") != null){
935                         currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
936                 }
937                 }
938         }
939
940     protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
941         ObjectMapper mapper = new ObjectMapper();       
942         mapper.setSerializationInclusion(Include.NON_NULL);     
943         ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);           
944         if(     !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null && 
945                 serviceInstRequest.getRequestDetails() != null && 
946                 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
947                 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
948                 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
949         }
950         msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
951         return mapper.writeValueAsString(sir);
952         }
953
954     private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
955                                              String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
956
957                 // Found the duplicate record. Return the appropriate error.
958                 String instance = null;
959                 if(instanceName != null){
960                         instance = instanceName;
961                 }else{
962                         instance = instanceIdMap.get(requestScope + "InstanceId");
963                 }
964                 //List<String> variables = new ArrayList<String>();
965                 //variables.add(dup.getRequestStatus());
966         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
967
968
969         DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
970             .errorInfo(errorLoggerInfo).build();
971
972         updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
973
974         throw dupException;
975         }
976
977         private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
978                                                MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
979                 InfraActiveRequests dup = null;
980                 try {
981                         if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
982                                 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
983                         }
984                 } catch (Exception e) {
985             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
986
987
988             ValidateException validateException = new ValidateException.Builder("Duplicate Check Request", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
989                     .errorInfo(errorLoggerInfo).build();
990
991             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
992
993             throw validateException;
994                 }
995                 return dup;
996         }
997
998         private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
999                                                                         ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1000                 try{
1001                         ObjectMapper mapper = new ObjectMapper();
1002                         return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1003
1004         } catch (IOException e) {
1005
1006             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1007
1008             ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1009                     .errorInfo(errorLoggerInfo).build();
1010             String requestScope = requestScopeFromUri(requestUri);
1011
1012             msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1013
1014             throw validateException;
1015                 }
1016         }
1017         
1018         private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version, 
1019                                                                 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException {
1020                 int reqVersion = Integer.parseInt(version.substring(1));
1021                 try {
1022                         msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1023                 } catch (Exception e) {
1024                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1025                 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1026                  .errorInfo(errorLoggerInfo).build();
1027
1028                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1029
1030                 throw validateException;
1031                 }
1032         }
1033
1034     private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag, 
1035                                                                                                                                 InfraActiveRequests currentActiveReq) throws ApiException {
1036                 RecipeLookupResult recipeLookupResult = null;
1037         //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1038                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1039                 // Query MSO Catalog DB
1040                 
1041                 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1042                         recipeLookupResult = getDefaultVnfUri(sir, action);
1043         } else if (modelInfo.getModelType().equals(ModelType.service)) {
1044                         try {
1045                         recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1046                         } catch (IOException e) {
1047                                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1048
1049
1050                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1051                         .errorInfo(errorLoggerInfo).build();
1052
1053                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1054
1055                 throw validateException;
1056                         }
1057         } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1058                                 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1059             try {
1060                         recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1061             } catch (ValidationException e) {
1062                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1063
1064
1065                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1066                         .errorInfo(errorLoggerInfo).build();
1067
1068                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1069
1070                 throw validateException;
1071             }
1072                 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1073             try {
1074                         recipeLookupResult = getNetworkUri( sir, action);
1075             } catch (ValidationException e) {
1076
1077                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1078
1079
1080                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1081                         .errorInfo(errorLoggerInfo).build();
1082                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1083
1084                 throw validateException;
1085                 }
1086         }
1087
1088         if (recipeLookupResult == null) {
1089             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1090
1091
1092             RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1093                     .errorInfo(errorLoggerInfo).build();
1094
1095             updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1096             throw recipeNotFoundExceptionException;
1097                 }
1098                 return recipeLookupResult;
1099         }
1100         
1101     private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1102                 // SERVICE REQUEST
1103                 // Construct the default service name
1104                 // TODO need to make this a configurable property
1105                 String defaultServiceModelName = getDefaultModel(servInstReq);
1106                 RequestDetails requestDetails = servInstReq.getRequestDetails();
1107                 ModelInfo modelInfo = requestDetails.getModelInfo();
1108                 org.onap.so.db.catalog.beans.Service serviceRecord;
1109                 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1110                 ServiceRecipe recipe = null;
1111                 
1112                 if(alaCarteFlag){
1113                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1114                         if(serviceRecord !=null){                                       
1115                                 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1116                         }
1117                 }else{
1118                         serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1119                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1120                         if (recipe == null){
1121                                 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1122                                 if(!serviceRecordList.isEmpty()){
1123                                         for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1124                                                 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1125                                                 if(recipe != null){
1126                                                         break;
1127                                                 }
1128                                         }
1129                                 }
1130                         }
1131                 }
1132                 
1133                 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1134                 RequestParameters reqParam = requestDetails.getRequestParameters();
1135                 if(reqParam!=null && alaCarteFlag && recipe==null){
1136                         return null;
1137                 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1138                         mapToLegacyRequest(requestDetails);
1139                 }else if (recipe == null) {  //aLaCarte wasn't sent, so we'll try the default
1140                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1141                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1142                 }
1143                 if(modelInfo.getModelVersionId() == null) {
1144                         modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1145                 }
1146                 if(recipe==null){
1147                         return null;
1148                 }
1149                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1150         }
1151
1152         protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1153                 RequestParameters reqParam;
1154                 if (requestDetails.getRequestParameters() == null) {
1155                         reqParam = new RequestParameters();
1156                 } else {
1157                         reqParam = requestDetails.getRequestParameters();
1158                 }
1159                 if(requestDetails.getCloudConfiguration() == null) {
1160                         CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1161                         if(cloudConfig != null) {
1162                                 requestDetails.setCloudConfiguration(cloudConfig);
1163                         }
1164                 }
1165                 
1166                 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1167                 if(!userParams.isEmpty()) {
1168                         if (reqParam == null) {
1169                                 requestDetails.setRequestParameters(new RequestParameters());
1170                         }
1171                         requestDetails.getRequestParameters().setUserParams(userParams);
1172                 }
1173         }
1174
1175         protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1176
1177                 for(Map<String, Object> params : reqParams.getUserParams()){
1178                         if(params.containsKey("service")){
1179                                 Service service = serviceMapper(params);
1180                                 
1181                                 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1182                                 
1183                                 if (targetConfiguration.isPresent()) {
1184                                         return targetConfiguration.get();
1185                                 } else {
1186                                         for(Networks network : service.getResources().getNetworks()) {
1187                                                 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1188                                                 if(targetConfiguration.isPresent()) {
1189                                                         return targetConfiguration.get();
1190                                                 }
1191                                         }
1192                                 
1193                                         for(Vnfs vnf : service.getResources().getVnfs()) {
1194                                                 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1195                                                 
1196                                                 if(targetConfiguration.isPresent()) {
1197                                                         return targetConfiguration.get();
1198                                                 }
1199                                                 
1200                                                 for(VfModules vfModule : vnf.getVfModules()) {
1201                                                         targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1202                                                         
1203                                                         if(targetConfiguration.isPresent()) {
1204                                                                 return targetConfiguration.get();
1205                                                         }
1206                                                 }
1207                                         }
1208                                 }
1209                         }
1210         }
1211         
1212         return null;
1213         }
1214
1215         private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1216                 CloudConfiguration targetConfiguration = new CloudConfiguration();
1217                 if(sourceCloudConfiguration != null) {
1218                         targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1219                         targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1220                         targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1221                         return Optional.of(targetConfiguration);
1222                 }
1223                 return Optional.empty();
1224         }
1225
1226         protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1227         msoLogger.debug("Configuring UserParams for Macro Request");
1228         Map<String, Object> userParams = new HashMap<>();
1229         
1230         for(Map<String, Object> params : reqParams.getUserParams()){
1231                 if(params.containsKey("service")){
1232                         Service service = serviceMapper(params);
1233                                 
1234                                 addUserParams(userParams, service.getInstanceParams());
1235                                 
1236                                 for(Networks network : service.getResources().getNetworks()) {
1237                                         addUserParams(userParams, network.getInstanceParams());
1238                                 }
1239                                 
1240                                 for(Vnfs vnf: service.getResources().getVnfs()) {
1241                                         addUserParams(userParams, vnf.getInstanceParams());
1242                                         
1243                                         for(VfModules vfModule: vnf.getVfModules()) {
1244                                                 addUserParams(userParams, vfModule.getInstanceParams());
1245                                         }
1246                                 }
1247                 }
1248         }
1249         
1250         return mapFlatMapToNameValue(userParams);
1251     }
1252
1253         private Service serviceMapper(Map<String, Object> params)
1254                         throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1255                 ObjectMapper obj = new ObjectMapper();
1256                 String input = obj.writeValueAsString(params.get("service"));
1257                 return obj.readValue(input, Service.class);
1258         }
1259
1260         private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1261                 for(Map<String, String> map : sourceUserParams) {
1262                         for (Map.Entry<String, String> entry : map.entrySet()) {
1263                                 targetUserParams.put(entry.getKey(), entry.getValue());
1264                         }
1265                 }
1266         }
1267         
1268         protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1269                 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1270                 
1271                 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1272                         Map<String, Object> targetMap = new HashMap<>();
1273                         targetMap.put(NAME, map.getKey());
1274                         targetMap.put(VALUE, map.getValue());
1275                         targetUserParams.add(targetMap);
1276                 }
1277                 return targetUserParams;
1278         }
1279
1280     private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1281
1282                 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1283                 String vnfComponentType = modelInfo.getModelType().name();
1284
1285                 RelatedInstanceList[] instanceList = null;
1286                 if (servInstReq.getRequestDetails() != null) {
1287                         instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1288                 }
1289
1290                 Recipe recipe = null;
1291                 String defaultSource = getDefaultModel(servInstReq);
1292                 String modelCustomizationId = modelInfo.getModelCustomizationId();
1293                 String modelCustomizationName = modelInfo.getModelCustomizationName();
1294                 String relatedInstanceModelVersionId = null;
1295                 String relatedInstanceModelInvariantId = null;
1296                 String relatedInstanceVersion = null;
1297                 String relatedInstanceModelCustomizationName = null;
1298
1299                 if (instanceList != null) {
1300
1301                         for(RelatedInstanceList relatedInstanceList : instanceList){
1302
1303                                 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1304                                 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1305                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1306                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1307                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1308                                 }
1309
1310                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1311                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1312                                         relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1313                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1314                                         relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1315                                 }
1316                         }
1317
1318                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1319                                 //                      a.      For a vnf request (only create, no update currently): 
1320                                 //                              i.      (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1321                                 //                              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 
1322                                 //                                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName 
1323                 //                                      to Ã¢â‚¬Å“join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid  record exists.
1324                                 //                              **If relatedInstance.modelInfo[service].modelVersionId  was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId 
1325                                 //                                      (MODEL_UUID) in SERVICE table.
1326                                 //                              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 
1327                                 //                                      during 1707 data migration if VID did not provide it originally on request.
1328                 //                              iv.     Note: continue to construct the Ã¢â‚¬Å“vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1329                                 //                              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.
1330
1331                                 VnfResource vnfResource = null;
1332                                 VnfResourceCustomization vrc=null;
1333                                 // Validation for vnfResource
1334
1335                                 if(modelCustomizationId!=null) {
1336                     vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1337                     if(vrc != null){
1338                         vnfResource = vrc.getVnfResources();
1339                     }
1340                                 } else {
1341                                         org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1342                                         if(service == null) {
1343                                                 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1344                                         }
1345
1346                                 if(service == null) {
1347                                         throw new ValidationException("service in relatedInstance");
1348                                 }
1349                     for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1350                         if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1351                                                 vrc=vnfResourceCustom;
1352                         }
1353                     }
1354                                         
1355                                         if(vrc != null) {
1356                                                 vnfResource = vrc.getVnfResources();
1357                         modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1358                         modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1359                                         }
1360                                 }
1361
1362                                 if(vnfResource==null){
1363                                         throw new ValidationException("vnfResource");
1364                                 } else {
1365                                         if(modelInfo.getModelVersionId() == null) {
1366                         modelInfo.setModelVersionId(vnfResource.getModelUUID());
1367                                         }
1368                                 }
1369
1370                                 VnfRecipe vnfRecipe = null;
1371                                 
1372                                 if(vrc != null) {
1373                                         String nfRole = vrc.getNfRole();
1374                                         if(nfRole != null) {
1375                                                 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1376                                         }
1377                                 }
1378
1379                                 if(vnfRecipe == null) {
1380                                         vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1381                                 }
1382
1383                                 if (vnfRecipe == null) {
1384                                         return null;
1385                                 }
1386
1387                                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1388                         } else {
1389                                 /*                              (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have 
1390                                 //                              been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName 
1391                                 //                              to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid  record exists.
1392                                 //                              Once the vnfs model_customization_uuid has been obtained, use it to find all vfModule customizations for that vnf customization in the vnf_res_custom_to_vf_module_custom join table. 
1393                                 //                              For each vf_module_cust_model_customization_uuid value returned, use that UUID to query vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId to 
1394                                 //                              confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found 
1395                                 //                      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) 
1396                                 //                              and MODEL_VERSION (modelVersion).
1397                                 */
1398                                 VfModuleCustomization vfmc = null;
1399                                 VnfResource vnfr;
1400                                 VnfResourceCustomization vnfrc;
1401                                 VfModule vfModule = null;
1402
1403                                 if(modelInfo.getModelCustomizationId() != null) {
1404                                         vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1405                                 } else {
1406                                         vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1407                                         if(vnfr == null){
1408                                                 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1409                                         }
1410                                         vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1411                                         
1412                                         List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1413                                                         
1414                                         String vfModuleModelUUID = modelInfo.getModelVersionId();
1415                                         for(VfModuleCustomization vf : list) {
1416                                                 VfModuleCustomization vfmCustom;
1417                                                 if(vfModuleModelUUID != null){
1418                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1419                                                         if(vfmCustom != null){
1420                                                                 vfModule = vfmCustom.getVfModule();
1421                                                         }
1422                                                 }else{ 
1423                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1424                                                         if(vfmCustom != null){
1425                                                                 vfModule = vfmCustom.getVfModule();
1426                                                         }else{
1427                                                                 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1428                                                         }
1429                                                 }
1430                                                 
1431                                                 if(vfModule != null) {
1432                                                         modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1433                                                         modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1434                                                         break;
1435                                                 }
1436                                         }
1437                                 }
1438
1439                                 if(vfmc == null && vfModule == null) {
1440                                         throw new ValidationException("vfModuleCustomization");
1441                                 } else if (vfModule == null && vfmc != null) {
1442                                         vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1443                                 }
1444
1445                                 if(modelInfo.getModelVersionId() == null) {
1446                                         modelInfo.setModelVersionId(vfModule.getModelUUID());
1447                                 }
1448                                 
1449                                 
1450                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1451                                 if(recipe == null){
1452                                         List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1453                                         if(!vfModuleRecords.isEmpty()){
1454                                                 for(VfModule record : vfModuleRecords){
1455                                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1456                                                         if(recipe != null){
1457                                                                 break;
1458                                                         }
1459                                                 }
1460                                         }
1461                                 }
1462                                 if(recipe == null) {
1463                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1464                                         if (recipe == null) { 
1465                                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1466                                         }
1467
1468                                         if(recipe == null) {
1469                                                 return null;
1470                                         }
1471                                 }
1472                         }
1473                 } else {
1474
1475                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1476                                 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1477                                 if (recipe == null) {
1478                                         return null;
1479                                 }
1480                         } else {
1481                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1482
1483                                 if (recipe == null) {
1484                                         return null;
1485                                 }
1486                         }
1487                 }
1488
1489                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1490         }
1491         
1492     private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1493         
1494                 String defaultSource = getDefaultModel(sir);
1495
1496                 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1497
1498                 if (vnfRecipe == null) {
1499                         return null;
1500                 }
1501
1502                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());          
1503         }
1504
1505
1506     private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1507
1508                 String defaultNetworkType = getDefaultModel(sir);
1509
1510                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1511                 String modelName = modelInfo.getModelName();
1512                 Recipe recipe = null;
1513
1514                 if(modelInfo.getModelCustomizationId()!=null){
1515             NetworkResource networkResource = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1516                         if(networkResource!=null){
1517                                 if(modelInfo.getModelVersionId() == null) {
1518                                         modelInfo.setModelVersionId(networkResource.getModelUUID());
1519                                 }
1520                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1521                         }else{
1522                                 throw new ValidationException("no catalog entry found");
1523                         }
1524                 }else{
1525                         //ok for version < 3 and action delete
1526                         if(modelName != null){
1527                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1528                         }
1529                 }
1530
1531                 if(recipe == null){
1532                         recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1533                 }
1534                 
1535                 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1536         }
1537     
1538     private Optional<String> retrieveModelName(RequestParameters requestParams) {
1539         String requestTestApi = null;
1540         TestApi testApi = null;
1541         
1542         if (requestParams != null) {
1543                 requestTestApi = requestParams.getTestApi();
1544         }
1545         
1546         if (requestTestApi == null) {
1547                 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1548                         requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1549                 } else {
1550                         requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1551                 }
1552         }
1553         
1554                 try {
1555                         testApi = TestApi.valueOf(requestTestApi);
1556                         return Optional.of(testApi.getModelName());
1557                 } catch (Exception e) {
1558                         msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1559                         throw new IllegalArgumentException("Invalid TestApi is provided", e);
1560                 }
1561     }
1562     
1563     private String getDefaultModel(ServiceInstancesRequest sir) {
1564         String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1565         Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1566                 if (oModelName.isPresent()) {
1567                         defaultModel = oModelName.get();
1568                 }
1569                 return defaultModel;
1570     }
1571         
1572     private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1573                 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1574                 Boolean aLaCarte = null;
1575                 String apiVersion = version.substring(1);
1576                 
1577                 long startTime = System.currentTimeMillis ();
1578                 ServiceInstancesRequest sir = null;             
1579
1580                 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1581                 String requestScope = deriveRequestScope(action,sir, requestUri);
1582                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject ( sir,  action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1583                 if(sir.getRequestDetails().getRequestParameters() != null){
1584                         aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1585                 }
1586                 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1587                 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1588                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1589
1590                 InfraActiveRequests dup = null;
1591                 
1592                 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1593
1594                 if (instanceIdMap != null && dup != null) {
1595             buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1596                 }
1597                 
1598                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1599                 RequestReferences referencesResponse = new RequestReferences();
1600                 referencesResponse.setRequestId(requestId);
1601                 serviceResponse.setRequestReferences(referencesResponse);
1602                 
1603                 
1604                 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1605                 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1606                 
1607                 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1608                         String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1609                         
1610             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1611
1612
1613             ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1614                     .errorInfo(errorLoggerInfo).build();
1615
1616             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1617
1618             throw validateException;
1619                         
1620                 }
1621                 
1622                 serviceInstanceId = "";
1623                 String configurationId = "";
1624                 String correlationId = "";
1625
1626                 if(sir.getServiceInstanceId () != null){
1627                         serviceInstanceId = sir.getServiceInstanceId ();
1628                 }
1629
1630                 if(sir.getConfigurationId() != null){
1631             configurationId = sir.getConfigurationId();
1632         }
1633                 if (sir.getCorrelationId() != null) {
1634                         correlationId = sir.getCorrelationId();
1635                 }
1636                 infraActiveRequestsClient.save(currentActiveReq);
1637                 
1638                 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1639                         aLaCarte = true;
1640                 }else if(aLaCarte == null){
1641                         aLaCarte = false;
1642                 }
1643         
1644                 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, orchestrationUri, Integer.parseInt(timeOut), false, 
1645                                                                 serviceInstanceId, correlationId, null, null, null, null, configurationId, null, null, null, null, apiVersion, aLaCarte, requestUri, null, requestScope, null);
1646         }
1647
1648     public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1649         String requestId = null;
1650         if (requestContext.getProperty("requestId") != null) {
1651                 requestId = requestContext.getProperty("requestId").toString();
1652         }
1653         if (UUIDChecker.isValidUUID(requestId)) {
1654                 return requestId;
1655         } else {
1656                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1657                         ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1658                             .errorInfo(errorLoggerInfo).build();
1659                         
1660                         throw validateException;
1661         }
1662     }
1663         public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage){
1664                 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1665                         aq.setStatusMessage (errorMessage);
1666                         aq.setProgress(new Long(100));
1667                         aq.setRequestStatus(status.toString());
1668                         Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1669                         aq.setEndTime (endTimeStamp);
1670                         infraActiveRequestsClient.save(aq);
1671                 }
1672         }
1673 }