Dynamic Cloud Owner Support
[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                 if (sir.getCorrelationId() != null) {
743                         correlationId = sir.getCorrelationId();
744                 }
745                 try{
746                         infraActiveRequestsClient.save(currentActiveReq);
747                 }catch(Exception e){
748                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
749             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
750                     .errorInfo(errorLoggerInfo).build();
751                 }
752                 
753                 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
754                         aLaCarte = true;
755                 }else if(aLaCarte == null){
756                         aLaCarte = false;
757                 }
758                 
759                 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(), 
760                                                                 isBaseVfModule, serviceInstanceId, correlationId, vnfId, vfModuleId, volumeGroupId, networkId, null,
761                                                                 serviceInstanceType,vnfType, vfModuleType,networkType, apiVersion, aLaCarte, requestUri, null, requestScope, sir);
762         }
763
764         private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
765                 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
766                         return (ModelType.vnf.name());
767                 }else{
768                         String requestScope;
769                         if(sir.getRequestDetails().getModelInfo().getModelType() == null){
770                                 requestScope = requestScopeFromUri(requestUri);
771                         }else{
772                                 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name(); 
773                         }
774                         return requestScope; 
775                 }
776         }
777         private String requestScopeFromUri(String requestUri){
778                 String requestScope;
779                 if(requestUri.contains(ModelType.network.name())){
780                         requestScope = ModelType.network.name();
781                 }else if(requestUri.contains(ModelType.vfModule.name())){
782                         requestScope = ModelType.vfModule.name();
783                 }else if(requestUri.contains(ModelType.volumeGroup.name())){
784                         requestScope = ModelType.volumeGroup.name();
785                 }else if(requestUri.contains(ModelType.configuration.name())){
786                         requestScope = ModelType.configuration.name();
787                 }else if(requestUri.contains(ModelType.vnf.name())){
788                         requestScope = ModelType.vnf.name();
789                 }else{
790                         requestScope = ModelType.service.name();
791                 }
792                 return requestScope;
793         }
794         private Response postBPELRequest(InfraActiveRequests currentActiveReq, Actions action, String requestId, long startTime, String msoRawRequest,
795                                                                         String orchestrationUri, int timeOut, Boolean isBaseVfModule,
796                                                                         String serviceInstanceId, String correlationId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
797                                      String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType, 
798                                      String apiVersion, boolean aLaCarte, String requestUri, String paramXsd, String requestScope, ServiceInstancesRequest sir) throws ApiException {
799                 RequestClient requestClient = null;
800                 HttpResponse response = null;
801                 try {
802                         requestClient = reqClientFactory.getRequestClient (orchestrationUri);
803                         response = requestClient.post(new RequestClientParameter.Builder()
804                                         .setRequestId(requestId)
805                                         .setBaseVfModule(isBaseVfModule)
806                                         .setRecipeTimeout(timeOut)
807                                         .setRequestAction(action.toString())
808                                         .setServiceInstanceId(serviceInstanceId)
809                                         .setCorrelationId(correlationId)
810                                         .setVnfId(vnfId)
811                                         .setVfModuleId(vfModuleId)
812                                         .setVolumeGroupId(volumeGroupId)
813                                         .setNetworkId(networkId)
814                                         .setConfigurationId(configurationId)
815                                         .setServiceType(serviceInstanceType)
816                                         .setVnfType(vnfType)
817                                         .setVfModuleType(vfModuleType)
818                                         .setNetworkType(networkType)
819                                         .setRequestDetails(mapJSONtoMSOStyle(msoRawRequest, sir, aLaCarte, action))
820                                         .setApiVersion(apiVersion)
821                                         .setALaCarte(aLaCarte)
822                                         .setRecipeParamXsd(paramXsd)
823                                         .setRequestUri(requestUri).build());
824                         
825                         
826                 } catch (Exception e) {
827                         
828             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
829             String url = requestClient != null ? requestClient.getUrl() : "";
830             ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
831             updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
832
833             throw clientException;
834                 }
835
836                 if (response == null) {
837                         
838             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
839             ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
840
841             updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
842
843             throw clientException;
844                 }
845
846                 ResponseHandler respHandler = null;
847         int bpelStatus = 500;
848         try {
849             respHandler = new ResponseHandler (response, requestClient.getType ());
850             bpelStatus = respHandler.getStatus ();
851         } catch (ApiException e) {
852             msoLogger.error(e);
853             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
854             ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
855                         .errorInfo(errorLoggerInfo).build();
856             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
857             throw validateException;
858         }
859
860                 // BPEL accepted the request, the request is in progress
861                 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
862                         ServiceInstancesResponse jsonResponse;
863                         CamundaResponse camundaResp = respHandler.getResponse();
864                         
865                         if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
866                                 try {
867                                         ObjectMapper mapper = new ObjectMapper();
868                                         jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
869                                 } catch (IOException e) {
870                                         msoLogger.error(e);
871                                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
872                                         ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
873                                             .errorInfo(errorLoggerInfo).build();
874                                         updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
875                                         throw validateException;
876                                 }
877                         
878                                 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
879                                 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
880                                 
881                                 try{
882                                         infraActiveRequestsClient.save(currentActiveReq);
883                                 }catch(Exception e){
884                                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
885                             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
886                                     .errorInfo(errorLoggerInfo).build();
887                                 }
888                                 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
889                         } 
890                 }
891                         
892                 List<String> variables = new ArrayList<>();
893                 variables.add(bpelStatus + "");
894                 String camundaJSONResponseBody = respHandler.getResponseBody ();
895                 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
896                         
897                     ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
898                     BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
899                             .errorInfo(errorLoggerInfo).build();
900
901                     updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
902
903                     throw bpmnException;
904                 } else {
905                 
906                     ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
907
908
909                     BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
910                             .errorInfo(errorLoggerInfo).build();
911                     updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
912
913                     throw servException;
914                 }
915         }
916
917         private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
918                 if(StringUtils.isNotBlank(instanceId)) {
919                         if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
920                                 currentActiveReq.setServiceInstanceId(instanceId);
921                         } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
922                                 currentActiveReq.setVnfId(instanceId);
923                         } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
924                                 currentActiveReq.setVfModuleId(instanceId);
925                         } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
926                                 currentActiveReq.setVolumeGroupId(instanceId);
927                         } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
928                                 currentActiveReq.setNetworkId(instanceId);
929                         } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
930                                 currentActiveReq.setConfigurationId(instanceId);
931                         }
932                 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
933                         if(instanceIdMap.get("serviceInstanceId") != null){
934                                 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
935                 }
936                 if(instanceIdMap.get("vnfInstanceId") != null){
937                         currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
938                 }
939                 if(instanceIdMap.get("vfModuleInstanceId") != null){
940                         currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
941                 }
942                 if(instanceIdMap.get("volumeGroupInstanceId") != null){
943                         currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
944                 }
945                 if(instanceIdMap.get("networkInstanceId") != null){
946                         currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
947                 }
948                 if(instanceIdMap.get("configurationInstanceId") != null){
949                         currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
950                 }
951                 }
952         }
953
954     protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
955         ObjectMapper mapper = new ObjectMapper();       
956         mapper.setSerializationInclusion(Include.NON_NULL);     
957         ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);           
958         if(     !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null && 
959                 serviceInstRequest.getRequestDetails() != null && 
960                 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
961                 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
962                 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
963         }
964         msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
965         return mapper.writeValueAsString(sir);
966         }
967
968     private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
969                                              String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
970
971                 // Found the duplicate record. Return the appropriate error.
972                 String instance = null;
973                 if(instanceName != null){
974                         instance = instanceName;
975                 }else{
976                         instance = instanceIdMap.get(requestScope + "InstanceId");
977                 }
978                 //List<String> variables = new ArrayList<String>();
979                 //variables.add(dup.getRequestStatus());
980         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
981
982
983         DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
984             .errorInfo(errorLoggerInfo).build();
985
986         updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
987
988         throw dupException;
989         }
990
991         private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
992                                                MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
993                 InfraActiveRequests dup = null;
994                 try {
995                         if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
996                                 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
997                         }
998                 } catch (Exception e) {
999             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1000             RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1001                     .errorInfo(errorLoggerInfo).build();
1002             updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
1003             throw requestDbFailureException;
1004                 }
1005                 return dup;
1006         }
1007
1008         private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1009                                                                         ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1010                 try{
1011                         ObjectMapper mapper = new ObjectMapper();
1012                         return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1013
1014         } catch (IOException e) {
1015
1016             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1017
1018             ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1019                     .errorInfo(errorLoggerInfo).build();
1020             String requestScope = requestScopeFromUri(requestUri);
1021
1022             msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1023
1024             throw validateException;
1025                 }
1026         }
1027         
1028         private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version, 
1029                                                                 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
1030                 int reqVersion = Integer.parseInt(version.substring(1));
1031                 try {
1032                         msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1033                 } catch (Exception e) {
1034                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1035                 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1036                  .errorInfo(errorLoggerInfo).build();
1037
1038                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1039
1040                 throw validateException;
1041                 }
1042         }
1043
1044     private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag, 
1045                                                                                                                                 InfraActiveRequests currentActiveReq) throws ApiException {
1046                 RecipeLookupResult recipeLookupResult = null;
1047         //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1048                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1049                 // Query MSO Catalog DB
1050                 
1051                 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1052                         recipeLookupResult = getDefaultVnfUri(sir, action);
1053         } else if (modelInfo.getModelType().equals(ModelType.service)) {
1054                         try {
1055                         recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1056                         } catch (IOException e) {
1057                                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1058
1059
1060                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1061                         .errorInfo(errorLoggerInfo).build();
1062
1063                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1064
1065                 throw validateException;
1066                         }
1067         } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1068                                 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1069             try {
1070                         recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1071             } catch (ValidationException e) {
1072                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1073
1074
1075                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1076                         .errorInfo(errorLoggerInfo).build();
1077
1078                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1079
1080                 throw validateException;
1081             }
1082                 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1083             try {
1084                         recipeLookupResult = getNetworkUri( sir, action);
1085             } catch (ValidationException e) {
1086
1087                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1088
1089
1090                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1091                         .errorInfo(errorLoggerInfo).build();
1092                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1093
1094                 throw validateException;
1095                 }
1096         }
1097
1098         if (recipeLookupResult == null) {
1099             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1100
1101
1102             RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1103                     .errorInfo(errorLoggerInfo).build();
1104
1105             updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1106             throw recipeNotFoundExceptionException;
1107                 }
1108                 return recipeLookupResult;
1109         }
1110         
1111     private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1112                 // SERVICE REQUEST
1113                 // Construct the default service name
1114                 // TODO need to make this a configurable property
1115                 String defaultServiceModelName = getDefaultModel(servInstReq);
1116                 RequestDetails requestDetails = servInstReq.getRequestDetails();
1117                 ModelInfo modelInfo = requestDetails.getModelInfo();
1118                 org.onap.so.db.catalog.beans.Service serviceRecord;
1119                 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1120                 ServiceRecipe recipe = null;
1121                 
1122                 if(alaCarteFlag){
1123                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1124                         if(serviceRecord !=null){                                       
1125                                 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1126                         }
1127                 }else{
1128                         serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1129                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1130                         if (recipe == null){
1131                                 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1132                                 if(!serviceRecordList.isEmpty()){
1133                                         for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1134                                                 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1135                                                 if(recipe != null){
1136                                                         break;
1137                                                 }
1138                                         }
1139                                 }
1140                         }
1141                 }
1142                 
1143                 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1144                 RequestParameters reqParam = requestDetails.getRequestParameters();
1145                 if(reqParam!=null && alaCarteFlag && recipe==null){
1146                         return null;
1147                 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1148                         mapToLegacyRequest(requestDetails);
1149                 }else if (recipe == null) {  //aLaCarte wasn't sent, so we'll try the default
1150                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1151                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1152                 }
1153                 if(modelInfo.getModelVersionId() == null) {
1154                         modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1155                 }
1156                 if(recipe==null){
1157                         return null;
1158                 }
1159                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1160         }
1161
1162         protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1163                 RequestParameters reqParam;
1164                 if (requestDetails.getRequestParameters() == null) {
1165                         reqParam = new RequestParameters();
1166                 } else {
1167                         reqParam = requestDetails.getRequestParameters();
1168                 }
1169                 if(requestDetails.getCloudConfiguration() == null) {
1170                         CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1171                         if(cloudConfig != null) {
1172                                 requestDetails.setCloudConfiguration(cloudConfig);
1173                         }
1174                 }
1175                 
1176                 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1177                 if(!userParams.isEmpty()) {
1178                         if (reqParam == null) {
1179                                 requestDetails.setRequestParameters(new RequestParameters());
1180                         }
1181                         requestDetails.getRequestParameters().setUserParams(userParams);
1182                 }
1183         }
1184
1185         protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1186
1187                 for(Map<String, Object> params : reqParams.getUserParams()){
1188                         if(params.containsKey("service")){
1189                                 Service service = serviceMapper(params);
1190                                 
1191                                 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1192                                 
1193                                 if (targetConfiguration.isPresent()) {
1194                                         return targetConfiguration.get();
1195                                 } else {
1196                                         for(Networks network : service.getResources().getNetworks()) {
1197                                                 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1198                                                 if(targetConfiguration.isPresent()) {
1199                                                         return targetConfiguration.get();
1200                                                 }
1201                                         }
1202                                 
1203                                         for(Vnfs vnf : service.getResources().getVnfs()) {
1204                                                 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1205                                                 
1206                                                 if(targetConfiguration.isPresent()) {
1207                                                         return targetConfiguration.get();
1208                                                 }
1209                                                 
1210                                                 for(VfModules vfModule : vnf.getVfModules()) {
1211                                                         targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1212                                                         
1213                                                         if(targetConfiguration.isPresent()) {
1214                                                                 return targetConfiguration.get();
1215                                                         }
1216                                                 }
1217                                         }
1218                                 }
1219                         }
1220         }
1221         
1222         return null;
1223         }
1224
1225         private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1226                 CloudConfiguration targetConfiguration = new CloudConfiguration();
1227                 if(sourceCloudConfiguration != null) {
1228                         targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1229                         targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1230                         targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1231                         targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1232                         return Optional.of(targetConfiguration);
1233                 }
1234                 return Optional.empty();
1235         }
1236
1237         protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1238         msoLogger.debug("Configuring UserParams for Macro Request");
1239         Map<String, Object> userParams = new HashMap<>();
1240         
1241         for(Map<String, Object> params : reqParams.getUserParams()){
1242                 if(params.containsKey("service")){
1243                         Service service = serviceMapper(params);
1244                                 
1245                                 addUserParams(userParams, service.getInstanceParams());
1246                                 
1247                                 for(Networks network : service.getResources().getNetworks()) {
1248                                         addUserParams(userParams, network.getInstanceParams());
1249                                 }
1250                                 
1251                                 for(Vnfs vnf: service.getResources().getVnfs()) {
1252                                         addUserParams(userParams, vnf.getInstanceParams());
1253                                         
1254                                         for(VfModules vfModule: vnf.getVfModules()) {
1255                                                 addUserParams(userParams, vfModule.getInstanceParams());
1256                                         }
1257                                 }
1258                 }
1259         }
1260         
1261         return mapFlatMapToNameValue(userParams);
1262     }
1263
1264         private Service serviceMapper(Map<String, Object> params)
1265                         throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1266                 ObjectMapper obj = new ObjectMapper();
1267                 String input = obj.writeValueAsString(params.get("service"));
1268                 return obj.readValue(input, Service.class);
1269         }
1270
1271         private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1272                 for(Map<String, String> map : sourceUserParams) {
1273                         for (Map.Entry<String, String> entry : map.entrySet()) {
1274                                 targetUserParams.put(entry.getKey(), entry.getValue());
1275                         }
1276                 }
1277         }
1278         
1279         protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1280                 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1281                 
1282                 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1283                         Map<String, Object> targetMap = new HashMap<>();
1284                         targetMap.put(NAME, map.getKey());
1285                         targetMap.put(VALUE, map.getValue());
1286                         targetUserParams.add(targetMap);
1287                 }
1288                 return targetUserParams;
1289         }
1290
1291     private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1292
1293                 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1294                 String vnfComponentType = modelInfo.getModelType().name();
1295
1296                 RelatedInstanceList[] instanceList = null;
1297                 if (servInstReq.getRequestDetails() != null) {
1298                         instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1299                 }
1300
1301                 Recipe recipe = null;
1302                 String defaultSource = getDefaultModel(servInstReq);
1303                 String modelCustomizationId = modelInfo.getModelCustomizationId();
1304                 String modelCustomizationName = modelInfo.getModelCustomizationName();
1305                 String relatedInstanceModelVersionId = null;
1306                 String relatedInstanceModelInvariantId = null;
1307                 String relatedInstanceVersion = null;
1308                 String relatedInstanceModelCustomizationName = null;
1309
1310                 if (instanceList != null) {
1311
1312                         for(RelatedInstanceList relatedInstanceList : instanceList){
1313
1314                                 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1315                                 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1316                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1317                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1318                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1319                                 }
1320
1321                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1322                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1323                                         relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1324                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1325                                         relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1326                                 }
1327                         }
1328
1329                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1330                                 //                      a.      For a vnf request (only create, no update currently): 
1331                                 //                              i.      (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1332                                 //                              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 
1333                                 //                                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName 
1334                 //                                      to Ã¢â‚¬Å“join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid  record exists.
1335                                 //                              **If relatedInstance.modelInfo[service].modelVersionId  was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId 
1336                                 //                                      (MODEL_UUID) in SERVICE table.
1337                                 //                              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 
1338                                 //                                      during 1707 data migration if VID did not provide it originally on request.
1339                 //                              iv.     Note: continue to construct the Ã¢â‚¬Å“vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1340                                 //                              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.
1341
1342                                 VnfResource vnfResource = null;
1343                                 VnfResourceCustomization vrc=null;
1344                                 // Validation for vnfResource
1345
1346                                 if(modelCustomizationId!=null) {
1347                     vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1348                     if(vrc != null){
1349                         vnfResource = vrc.getVnfResources();
1350                     }
1351                                 } else {
1352                                         org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1353                                         if(service == null) {
1354                                                 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1355                                         }
1356
1357                                 if(service == null) {
1358                                         throw new ValidationException("service in relatedInstance");
1359                                 }
1360                     for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1361                         if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1362                                                 vrc=vnfResourceCustom;
1363                         }
1364                     }
1365                                         
1366                                         if(vrc != null) {
1367                                                 vnfResource = vrc.getVnfResources();
1368                         modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1369                         modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1370                                         }
1371                                 }
1372
1373                                 if(vnfResource==null){
1374                                         throw new ValidationException("vnfResource");
1375                                 } else {
1376                                         if(modelInfo.getModelVersionId() == null) {
1377                         modelInfo.setModelVersionId(vnfResource.getModelUUID());
1378                                         }
1379                                 }
1380
1381                                 VnfRecipe vnfRecipe = null;
1382                                 
1383                                 if(vrc != null) {
1384                                         String nfRole = vrc.getNfRole();
1385                                         if(nfRole != null) {
1386                                                 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1387                                         }
1388                                 }
1389
1390                                 if(vnfRecipe == null) {
1391                                         vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1392                                 }
1393
1394                                 if (vnfRecipe == null) {
1395                                         return null;
1396                                 }
1397
1398                                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1399                         } else {
1400                                 /*                              (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have 
1401                                 //                              been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName 
1402                                 //                              to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid  record exists.
1403                                 //                              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. 
1404                                 //                              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 
1405                                 //                              confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found 
1406                                 //                      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) 
1407                                 //                              and MODEL_VERSION (modelVersion).
1408                                 */
1409                                 VfModuleCustomization vfmc = null;
1410                                 VnfResource vnfr;
1411                                 VnfResourceCustomization vnfrc;
1412                                 VfModule vfModule = null;
1413
1414                                 if(modelInfo.getModelCustomizationId() != null) {
1415                                         vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1416                                 } else {
1417                                         vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1418                                         if(vnfr == null){
1419                                                 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1420                                         }
1421                                         vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1422                                         
1423                                         List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1424                                                         
1425                                         String vfModuleModelUUID = modelInfo.getModelVersionId();
1426                                         for(VfModuleCustomization vf : list) {
1427                                                 VfModuleCustomization vfmCustom;
1428                                                 if(vfModuleModelUUID != null){
1429                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1430                                                         if(vfmCustom != null){
1431                                                                 vfModule = vfmCustom.getVfModule();
1432                                                         }
1433                                                 }else{ 
1434                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1435                                                         if(vfmCustom != null){
1436                                                                 vfModule = vfmCustom.getVfModule();
1437                                                         }else{
1438                                                                 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1439                                                         }
1440                                                 }
1441                                                 
1442                                                 if(vfModule != null) {
1443                                                         modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1444                                                         modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1445                                                         break;
1446                                                 }
1447                                         }
1448                                 }
1449
1450                                 if(vfmc == null && vfModule == null) {
1451                                         throw new ValidationException("vfModuleCustomization");
1452                                 } else if (vfModule == null && vfmc != null) {
1453                                         vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1454                                 }
1455
1456                                 if(modelInfo.getModelVersionId() == null) {
1457                                         modelInfo.setModelVersionId(vfModule.getModelUUID());
1458                                 }
1459                                 
1460                                 
1461                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1462                                 if(recipe == null){
1463                                         List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1464                                         if(!vfModuleRecords.isEmpty()){
1465                                                 for(VfModule record : vfModuleRecords){
1466                                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1467                                                         if(recipe != null){
1468                                                                 break;
1469                                                         }
1470                                                 }
1471                                         }
1472                                 }
1473                                 if(recipe == null) {
1474                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1475                                         if (recipe == null) { 
1476                                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1477                                         }
1478
1479                                         if(recipe == null) {
1480                                                 return null;
1481                                         }
1482                                 }
1483                         }
1484                 } else {
1485
1486                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1487                                 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1488                                 if (recipe == null) {
1489                                         return null;
1490                                 }
1491                         } else {
1492                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1493
1494                                 if (recipe == null) {
1495                                         return null;
1496                                 }
1497                         }
1498                 }
1499
1500                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1501         }
1502         
1503     private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1504         
1505                 String defaultSource = getDefaultModel(sir);
1506
1507                 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1508
1509                 if (vnfRecipe == null) {
1510                         return null;
1511                 }
1512
1513                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());          
1514         }
1515
1516
1517     private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1518
1519                 String defaultNetworkType = getDefaultModel(sir);
1520
1521                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1522                 String modelName = modelInfo.getModelName();
1523                 Recipe recipe = null;
1524
1525                 if(modelInfo.getModelCustomizationId()!=null){
1526             NetworkResource networkResource = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1527                         if(networkResource!=null){
1528                                 if(modelInfo.getModelVersionId() == null) {
1529                                         modelInfo.setModelVersionId(networkResource.getModelUUID());
1530                                 }
1531                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1532                         }else{
1533                                 throw new ValidationException("no catalog entry found");
1534                         }
1535                 }else{
1536                         //ok for version < 3 and action delete
1537                         if(modelName != null){
1538                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1539                         }
1540                 }
1541
1542                 if(recipe == null){
1543                         recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1544                 }
1545                 
1546                 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1547         }
1548     
1549     private Optional<String> retrieveModelName(RequestParameters requestParams) {
1550         String requestTestApi = null;
1551         TestApi testApi = null;
1552         
1553         if (requestParams != null) {
1554                 requestTestApi = requestParams.getTestApi();
1555         }
1556         
1557         if (requestTestApi == null) {
1558                 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1559                         requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1560                 } else {
1561                         requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1562                 }
1563         }
1564         
1565                 try {
1566                         testApi = TestApi.valueOf(requestTestApi);
1567                         return Optional.of(testApi.getModelName());
1568                 } catch (Exception e) {
1569                         msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1570                         throw new IllegalArgumentException("Invalid TestApi is provided", e);
1571                 }
1572     }
1573     
1574     private String getDefaultModel(ServiceInstancesRequest sir) {
1575         String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1576         Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1577                 if (oModelName.isPresent()) {
1578                         defaultModel = oModelName.get();
1579                 }
1580                 return defaultModel;
1581     }
1582         
1583     private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1584                 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1585                 Boolean aLaCarte = null;
1586                 String apiVersion = version.substring(1);
1587                 
1588                 long startTime = System.currentTimeMillis ();
1589                 ServiceInstancesRequest sir = null;             
1590
1591                 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1592                 String requestScope = deriveRequestScope(action,sir, requestUri);
1593                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject ( sir,  action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1594                 if(sir.getRequestDetails().getRequestParameters() != null){
1595                         aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1596                 }
1597                 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1598                 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1599                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1600
1601                 InfraActiveRequests dup = null;
1602                 
1603                 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1604
1605                 if (instanceIdMap != null && dup != null) {
1606             buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1607                 }
1608                 
1609                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1610                 RequestReferences referencesResponse = new RequestReferences();
1611                 referencesResponse.setRequestId(requestId);
1612                 serviceResponse.setRequestReferences(referencesResponse);
1613                 
1614                 
1615                 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1616                 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1617                 
1618                 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1619                         String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1620                         
1621             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1622
1623
1624             ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1625                     .errorInfo(errorLoggerInfo).build();
1626
1627             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1628
1629             throw validateException;
1630                         
1631                 }
1632                 
1633                 serviceInstanceId = "";
1634                 String configurationId = "";
1635                 String correlationId = "";
1636
1637                 if(sir.getServiceInstanceId () != null){
1638                         serviceInstanceId = sir.getServiceInstanceId ();
1639                 }
1640
1641                 if(sir.getConfigurationId() != null){
1642             configurationId = sir.getConfigurationId();
1643         }
1644                 if (sir.getCorrelationId() != null) {
1645                         correlationId = sir.getCorrelationId();
1646                 }
1647                 try{
1648                         infraActiveRequestsClient.save(currentActiveReq);
1649                 }catch(Exception e){
1650                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1651             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1652                     .errorInfo(errorLoggerInfo).build();
1653                 }
1654                 
1655                 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1656                         aLaCarte = true;
1657                 }else if(aLaCarte == null){
1658                         aLaCarte = false;
1659                 }
1660         
1661                 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, orchestrationUri, Integer.parseInt(timeOut), false, 
1662                                                                 serviceInstanceId, correlationId, null, null, null, null, configurationId, null, null, null, null, apiVersion, aLaCarte, requestUri, null, requestScope, null);
1663         }
1664
1665     public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1666         String requestId = null;
1667         if (requestContext.getProperty("requestId") != null) {
1668                 requestId = requestContext.getProperty("requestId").toString();
1669         }
1670         if (UUIDChecker.isValidUUID(requestId)) {
1671                 return requestId;
1672         } else {
1673                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1674                         ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1675                             .errorInfo(errorLoggerInfo).build();
1676                         
1677                         throw validateException;
1678         }
1679     }
1680         public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1681                 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1682                         aq.setStatusMessage (errorMessage);
1683                         aq.setProgress(new Long(100));
1684                         aq.setRequestStatus(status.toString());
1685                         Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1686                         aq.setEndTime (endTimeStamp);
1687                         try{
1688                                 infraActiveRequestsClient.save(aq);
1689                         }catch(Exception e){
1690                                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1691                     throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1692                             .errorInfo(errorLoggerInfo).build();
1693                         }
1694                 }
1695         }
1696 }