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