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