ced69df55c39e1418304d8ec15b93b57b430b169
[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         @POST
530         @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
531         @Consumes(MediaType.APPLICATION_JSON)
532         @Produces(MediaType.APPLICATION_JSON)
533         @ApiOperation(value="VF Auto Scale Out",response=Response.class)
534         @Transactional
535         public Response scaleOutVfModule(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
536                                            @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
537                 String requestId = getRequestId(requestContext);
538                 HashMap<String, String> instanceIdMap = new HashMap<>();
539                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
540                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
541                 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, getRequestUri(requestContext));
542         }
543
544
545         @POST
546         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
547         @Consumes(MediaType.APPLICATION_JSON)
548         @Produces(MediaType.APPLICATION_JSON)
549         @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
550         @Transactional
551         public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
552                                               @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
553                 String requestId = getRequestId(requestContext);
554                 HashMap<String, String> instanceIdMap = new HashMap<>();
555                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
556                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
557                 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
558         }
559
560         @PUT
561         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
562         @Consumes(MediaType.APPLICATION_JSON)
563         @Produces(MediaType.APPLICATION_JSON)
564         @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
565         @Transactional
566         public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
567                         @PathParam("vnfInstanceId") String vnfInstanceId,
568                                               @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
569                 String requestId = getRequestId(requestContext);
570                 HashMap<String, String> instanceIdMap = new HashMap<>();
571                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
572                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
573                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
574                 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
575         }
576
577         @DELETE
578         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
579         @Consumes(MediaType.APPLICATION_JSON)
580         @Produces(MediaType.APPLICATION_JSON)
581         @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
582         @Transactional
583         public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
584                         @PathParam("vnfInstanceId") String vnfInstanceId,
585                                               @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
586                 String requestId = getRequestId(requestContext);
587                 HashMap<String, String> instanceIdMap = new HashMap<>();
588                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
589                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
590                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
591                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
592         }
593
594         @POST
595         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
596         @Consumes(MediaType.APPLICATION_JSON)
597         @Produces(MediaType.APPLICATION_JSON)
598         @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
599         @Transactional
600     public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
601                 String requestId = getRequestId(requestContext);
602                 HashMap<String, String> instanceIdMap = new HashMap<>();
603                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
604                 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
605         }
606
607         @PUT
608         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
609         @Consumes(MediaType.APPLICATION_JSON)
610         @Produces(MediaType.APPLICATION_JSON)
611         @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
612         @Transactional
613         public Response updateNetworkInstance(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.updateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
620         }
621
622         @DELETE
623         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
624         @Consumes(MediaType.APPLICATION_JSON)
625         @Produces(MediaType.APPLICATION_JSON)
626         @ApiOperation(value="Delete provided Network instance",response=Response.class)
627         @Transactional
628         public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
629                                           @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
630                 String requestId = getRequestId(requestContext);
631                 HashMap<String, String> instanceIdMap = new HashMap<>();
632                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
633                 instanceIdMap.put("networkInstanceId", networkInstanceId);
634                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
635         }
636
637         public String getRequestUri(ContainerRequestContext context){
638                 String requestUri = context.getUriInfo().getPath();
639                 requestUri = requestUri.substring(requestUri.indexOf("/serviceInstantiation/") + 22);
640                 return requestUri;
641         }
642     
643         public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
644                 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
645                 Boolean aLaCarte = null;
646                 long startTime = System.currentTimeMillis ();
647                 ServiceInstancesRequest sir = null;
648                 String apiVersion = version.substring(1);
649
650                 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
651                 String requestScope = deriveRequestScope(action, sir, requestUri);
652                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject (sir,  action, requestId, Status.PENDING, requestJSON, requestScope);
653                 if(sir.getRequestDetails().getRequestParameters() != null){
654                         aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
655                 }
656                 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
657                 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
658                  
659                 int requestVersion = Integer.parseInt(version.substring(1));
660                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
661                 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
662                 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
663                 String networkType = msoRequest.getNetworkType(sir,requestScope);
664                 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
665                 String serviceInstanceType = msoRequest.getServiceInstanceType(sir,requestScope);
666                 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
667                 
668                 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
669                         currentActiveReq.setVnfType(vnfType);
670                 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
671                         currentActiveReq.setNetworkType(networkType);
672                 }
673                 
674                 InfraActiveRequests dup = null;
675                                 
676
677                 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
678
679                 if (dup != null) {
680             buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
681                 }
682                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
683
684                 RequestReferences referencesResponse = new RequestReferences();
685
686                 referencesResponse.setRequestId(requestId);
687
688                 serviceResponse.setRequestReferences(referencesResponse);
689                 Boolean isBaseVfModule = false;
690
691         RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
692                                                                 
693                         ModelType modelType;
694                         ModelInfo modelInfo =  sir.getRequestDetails().getModelInfo();
695                         if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
696                                 modelType = ModelType.vnf;
697                         }else {
698                                 modelType =modelInfo.getModelType();
699                         }
700
701                         if (modelType.equals(ModelType.vfModule)) {
702                                 
703
704                                 // Get VF Module-specific base module indicator
705                                 VfModule vfm;
706
707                                 String modelVersionId = modelInfo.getModelVersionId();
708
709                                 if(modelVersionId != null) {
710                                         vfm = vfModuleRepo.findByModelUUID(modelVersionId);
711                                 } else {
712                                         vfm = vfModuleRepo.findByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());                                       
713                                 }
714
715                                 if (vfm != null) {
716                                         if (vfm.getIsBase()) {
717                                                 isBaseVfModule = true;
718                                         }
719             } else if (action == Action.createInstance || action == Action.updateInstance) {
720                                         // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
721                                         // This request cannot proceed
722                                         
723                                         String serviceVersionText = "";
724                                         if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
725                                                 serviceVersionText = " with version " + sdcServiceModelVersion;
726                                         }
727
728                 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
729                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
730                 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
731                 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
732
733                 throw vfModuleException;
734                 }
735                 }
736                 
737                 
738                 serviceInstanceId = "";
739                 String vnfId = "";
740                 String vfModuleId = "";
741                 String volumeGroupId = "";
742                 String networkId = "";
743                 String correlationId = "";
744
745                 if(sir.getServiceInstanceId () != null){
746                         serviceInstanceId = sir.getServiceInstanceId ();
747                 }
748
749                 if(sir.getVnfInstanceId () != null){
750                         vnfId = sir.getVnfInstanceId ();
751                 }
752
753                 if(sir.getVfModuleInstanceId () != null){
754                         vfModuleId = sir.getVfModuleInstanceId ();
755                 }
756
757                 if(sir.getVolumeGroupInstanceId () != null){
758                         volumeGroupId = sir.getVolumeGroupInstanceId ();
759                 }
760
761                 if(sir.getNetworkInstanceId () != null){
762                         networkId = sir.getNetworkInstanceId ();
763                 }
764                 
765                 if (sir.getCorrelationId() != null) {
766                         correlationId = sir.getCorrelationId();
767                 }
768                 iar.save(currentActiveReq);
769                 
770                 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
771                         aLaCarte = true;
772                 }else if(aLaCarte == null){
773                         aLaCarte = false;
774                 }
775                 
776                 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, recipeLookupResult.getOrchestrationURI(), recipeLookupResult.getRecipeTimeout(), 
777                                                                 isBaseVfModule, serviceInstanceId, correlationId, vnfId, vfModuleId, volumeGroupId, networkId, null,
778                                                                 serviceInstanceType,vnfType, vfModuleType,networkType, apiVersion, aLaCarte, requestUri, null, requestScope, sir);
779         }
780
781         private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
782                 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
783                         return (ModelType.vnf.name());
784                 }else{
785                         String requestScope;
786                         if(sir.getRequestDetails().getModelInfo().getModelType() == null){
787                                 requestScope = requestScopeFromUri(requestUri);
788                         }else{
789                                 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name(); 
790                         }
791                         return requestScope; 
792                 }
793         }
794         private String requestScopeFromUri(String requestUri){
795                 String requestScope;
796                 if(requestUri.contains(ModelType.network.name())){
797                         requestScope = ModelType.network.name();
798                 }else if(requestUri.contains(ModelType.vfModule.name())){
799                         requestScope = ModelType.vfModule.name();
800                 }else if(requestUri.contains(ModelType.volumeGroup.name())){
801                         requestScope = ModelType.volumeGroup.name();
802                 }else if(requestUri.contains(ModelType.configuration.name())){
803                         requestScope = ModelType.configuration.name();
804                 }else if(requestUri.contains(ModelType.vnf.name())){
805                         requestScope = ModelType.vnf.name();
806                 }else{
807                         requestScope = ModelType.service.name();
808                 }
809                 return requestScope;
810         }
811         private Response postBPELRequest(InfraActiveRequests currentActiveReq, Actions action, String requestId, long startTime, String msoRawRequest,
812                                                                         String orchestrationUri, int timeOut, Boolean isBaseVfModule,
813                                                                         String serviceInstanceId, String correlationId, String vnfId, String vfModuleId, String volumeGroupId, String networkId,
814                                      String configurationId, String serviceInstanceType, String vnfType, String vfModuleType, String networkType, 
815                                      String apiVersion, boolean aLaCarte, String requestUri, String paramXsd, String requestScope, ServiceInstancesRequest sir) throws ApiException {
816                 RequestClient requestClient = null;
817                 HttpResponse response = null;
818                 try {
819                         requestClient = reqClientFactory.getRequestClient (orchestrationUri);
820                         response = requestClient.post(new RequestClientParameter.Builder()
821                                         .setRequestId(requestId)
822                                         .setBaseVfModule(isBaseVfModule)
823                                         .setRecipeTimeout(timeOut)
824                                         .setRequestAction(action.toString())
825                                         .setServiceInstanceId(serviceInstanceId)
826                                         .setCorrelationId(correlationId)
827                                         .setVnfId(vnfId)
828                                         .setVfModuleId(vfModuleId)
829                                         .setVolumeGroupId(volumeGroupId)
830                                         .setNetworkId(networkId)
831                                         .setConfigurationId(configurationId)
832                                         .setServiceType(serviceInstanceType)
833                                         .setVnfType(vnfType)
834                                         .setVfModuleType(vfModuleType)
835                                         .setNetworkType(networkType)
836                                         .setRequestDetails(mapJSONtoMSOStyle(msoRawRequest, sir, aLaCarte, action))
837                                         .setApiVersion(apiVersion)
838                                         .setALaCarte(aLaCarte)
839                                         .setRecipeParamXsd(paramXsd)
840                                         .setRequestUri(requestUri).build());
841                         
842                         
843                 } catch (Exception e) {
844                         
845             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
846             String url = requestClient != null ? requestClient.getUrl() : "";
847             ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
848             updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
849
850             throw clientException;
851                 }
852
853                 if (response == null) {
854                         
855             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
856             ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
857
858             updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
859
860             throw clientException;
861                 }
862
863                 ResponseHandler respHandler = null;
864         int bpelStatus = 500;
865         try {
866             respHandler = new ResponseHandler (response, requestClient.getType ());
867             bpelStatus = respHandler.getStatus ();
868         } catch (ApiException e) {
869             msoLogger.error(e);
870             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
871             ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
872                         .errorInfo(errorLoggerInfo).build();
873             currentActiveReq.setRequestStatus(Status.FAILED.name());
874             currentActiveReq.setStatusMessage(validateException.getMessage());
875            throw validateException;
876         }
877
878                 // BPEL accepted the request, the request is in progress
879                 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
880                         ServiceInstancesResponse jsonResponse;
881                         CamundaResponse camundaResp = respHandler.getResponse();
882                         
883                         if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
884                                 try {
885                                         ObjectMapper mapper = new ObjectMapper();
886                                         jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
887                                 } catch (IOException e) {
888                                         msoLogger.error(e);
889                                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
890                                         ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
891                                             .errorInfo(errorLoggerInfo).build();
892                                         currentActiveReq.setRequestStatus(Status.FAILED.name());
893                                         currentActiveReq.setStatusMessage(validateException.getMessage());
894                                         throw validateException;
895                                 }
896                         
897                                 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
898                                 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
899                                 
900                                 iar.save(currentActiveReq);
901                                 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
902                         } 
903                 }
904                         
905                 List<String> variables = new ArrayList<>();
906                 variables.add(bpelStatus + "");
907                 String camundaJSONResponseBody = respHandler.getResponseBody ();
908                 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
909                         
910                     ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
911                     BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
912                             .errorInfo(errorLoggerInfo).build();
913
914                     updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
915
916                     throw bpmnException;
917                 } else {
918                 
919                     ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
920
921
922                     BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
923                             .errorInfo(errorLoggerInfo).build();
924                     updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
925
926                     throw servException;
927                 }
928         }
929
930         private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
931                 if(StringUtils.isNotBlank(instanceId)) {
932                         if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
933                                 currentActiveReq.setServiceInstanceId(instanceId);
934                         } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
935                                 currentActiveReq.setVnfId(instanceId);
936                         } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
937                                 currentActiveReq.setVfModuleId(instanceId);
938                         } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
939                                 currentActiveReq.setVolumeGroupId(instanceId);
940                         } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
941                                 currentActiveReq.setNetworkId(instanceId);
942                         } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
943                                 currentActiveReq.setConfigurationId(instanceId);
944                         }
945                 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
946                         if(instanceIdMap.get("serviceInstanceId") != null){
947                                 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
948                 }
949                 if(instanceIdMap.get("vnfInstanceId") != null){
950                         currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
951                 }
952                 if(instanceIdMap.get("vfModuleInstanceId") != null){
953                         currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
954                 }
955                 if(instanceIdMap.get("volumeGroupInstanceId") != null){
956                         currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
957                 }
958                 if(instanceIdMap.get("networkInstanceId") != null){
959                         currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
960                 }
961                 if(instanceIdMap.get("configurationInstanceId") != null){
962                         currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
963                 }
964                 }
965         }
966
967     protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
968         ObjectMapper mapper = new ObjectMapper();       
969         mapper.setSerializationInclusion(Include.NON_NULL);     
970         ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);           
971         if(     !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null && 
972                 serviceInstRequest.getRequestDetails() != null && 
973                 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
974                 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
975                 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
976         }
977         msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
978         return mapper.writeValueAsString(sir);
979         }
980
981     private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
982                                              String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
983
984                 // Found the duplicate record. Return the appropriate error.
985                 String instance = null;
986                 if(instanceName != null){
987                         instance = instanceName;
988                 }else{
989                         instance = instanceIdMap.get(requestScope + "InstanceId");
990                 }
991                 //List<String> variables = new ArrayList<String>();
992                 //variables.add(dup.getRequestStatus());
993         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
994
995
996         DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
997             .errorInfo(errorLoggerInfo).build();
998
999         updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
1000
1001         throw dupException;
1002         }
1003
1004         private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
1005                                                MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
1006                 InfraActiveRequests dup = null;
1007                 try {
1008                         if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
1009                                 dup = iar.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
1010                         }
1011                 } catch (Exception e) {
1012             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1013
1014
1015             ValidateException validateException = new ValidateException.Builder("Duplicate Check Request", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1016                     .errorInfo(errorLoggerInfo).build();
1017
1018             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1019
1020             throw validateException;
1021                 }
1022                 return dup;
1023         }
1024
1025         private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1026                                                                         ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1027                 try{
1028                         ObjectMapper mapper = new ObjectMapper();
1029                         return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1030
1031         } catch (IOException e) {
1032
1033             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1034
1035             ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1036                     .errorInfo(errorLoggerInfo).build();
1037             String requestScope = requestScopeFromUri(requestUri);
1038
1039             createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1040
1041             throw validateException;
1042                 }
1043         }
1044         //TODO MSO-4177 -- remove this and call the msoRequest instead
1045         public void createErrorRequestRecord (Status status, String requestId, String errorMessage, Actions action, String requestScope, String requestJSON) {
1046                 try {
1047                         InfraActiveRequests request = new InfraActiveRequests(requestId);
1048                         Timestamp startTimeStamp = new Timestamp (System.currentTimeMillis());
1049                         request.setStartTime (startTimeStamp);
1050                         request.setRequestStatus(status.toString());
1051                         request.setStatusMessage(errorMessage);
1052                         request.setProgress((long) 100);
1053                         request.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
1054                         request.setRequestAction(action.toString());
1055                         request.setRequestScope(requestScope);
1056                         request.setRequestBody(requestJSON);
1057                         Timestamp endTimeStamp = new Timestamp(System.currentTimeMillis());
1058                         request.setEndTime(endTimeStamp);
1059                         iar.save(request);
1060                 } catch (Exception e) {
1061                         msoLogger.error(MessageEnum.APIH_DB_UPDATE_EXC, e.getMessage(), "", "", MsoLogger.ErrorCode.DataError, "Exception when updating record in DB");
1062                         msoLogger.debug ("Exception: ", e);
1063                 }
1064         }
1065         private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version, 
1066                                                                 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException {
1067                 int reqVersion = Integer.parseInt(version.substring(1));
1068                 try {
1069                         msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1070                 } catch (Exception e) {
1071                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1072                 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1073                  .errorInfo(errorLoggerInfo).build();
1074
1075                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1076
1077                 throw validateException;
1078                 }
1079         }
1080
1081     private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag, 
1082                                                                                                                                 InfraActiveRequests currentActiveReq) throws ApiException {
1083                 RecipeLookupResult recipeLookupResult = null;
1084         //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1085                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1086                 // Query MSO Catalog DB
1087                 
1088                 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1089                         recipeLookupResult = getDefaultVnfUri(sir, action);
1090         } else if (modelInfo.getModelType().equals(ModelType.service)) {
1091                         try {
1092                         recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1093                         } catch (IOException 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.vfModule) ||
1105                                 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1106             try {
1107                         recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1108             } catch (ValidationException e) {
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
1115                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1116
1117                 throw validateException;
1118             }
1119                 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1120             try {
1121                         recipeLookupResult = getNetworkUri( sir, action);
1122             } catch (ValidationException e) {
1123
1124                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1125
1126
1127                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1128                         .errorInfo(errorLoggerInfo).build();
1129                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1130
1131                 throw validateException;
1132                 }
1133         }
1134
1135         if (recipeLookupResult == null) {
1136             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1137
1138
1139             RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1140                     .errorInfo(errorLoggerInfo).build();
1141
1142             updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1143             throw recipeNotFoundExceptionException;
1144                 }
1145                 return recipeLookupResult;
1146         }
1147
1148
1149     private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1150                 // SERVICE REQUEST
1151                 // Construct the default service name
1152                 // TODO need to make this a configurable property
1153                 String defaultServiceModelName = getDefaultModel(servInstReq);
1154                 RequestDetails requestDetails = servInstReq.getRequestDetails();
1155                 ModelInfo modelInfo = requestDetails.getModelInfo();
1156                 org.onap.so.db.catalog.beans.Service serviceRecord;
1157                 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1158                 ServiceRecipe recipe = null;
1159                 
1160                 if(alaCarteFlag){
1161                         serviceRecord = serviceRepo.findByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1162                         if(serviceRecord !=null){
1163                                 recipe = serviceRecord.getRecipes().get(action.toString());
1164                         }
1165                 }else{
1166                         serviceRecord = serviceRepo.findOneByModelUUID(modelInfo.getModelVersionId());
1167                         recipe = serviceRecipeRepo.findFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1168                         if (recipe == null){
1169                                 serviceRecordList = serviceRepo.findByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1170                                 if(!serviceRecordList.isEmpty()){
1171                                         for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1172                                                 recipe = record.getRecipes().get(action.toString());
1173                                                 if(recipe != null){
1174                                                         break;
1175                                                 }
1176                                         }
1177                                 }
1178                         }
1179                 }
1180                 
1181                 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1182                 RequestParameters reqParam = requestDetails.getRequestParameters();
1183                 if(reqParam!=null && alaCarteFlag && recipe==null){
1184                         return null;
1185                 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1186                         mapToLegacyRequest(requestDetails);
1187                 }else if (recipe == null) {  //aLaCarte wasn't sent, so we'll try the default
1188                         serviceRecord = serviceRepo.findByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1189                         recipe = serviceRecord.getRecipes().get( action.toString());
1190                 }
1191                 if(modelInfo.getModelVersionId() == null) {
1192                         modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1193                 }
1194                 if(recipe==null){
1195                         return null;
1196                 }
1197                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1198         }
1199
1200         protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1201                 RequestParameters reqParam;
1202                 if (requestDetails.getRequestParameters() == null) {
1203                         reqParam = new RequestParameters();
1204                 } else {
1205                         reqParam = requestDetails.getRequestParameters();
1206                 }
1207                 if(requestDetails.getCloudConfiguration() == null) {
1208                         CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1209                         if(cloudConfig != null) {
1210                                 requestDetails.setCloudConfiguration(cloudConfig);
1211                         }
1212                 }
1213                 
1214                 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1215                 if(!userParams.isEmpty()) {
1216                         if (reqParam == null) {
1217                                 requestDetails.setRequestParameters(new RequestParameters());
1218                         }
1219                         requestDetails.getRequestParameters().setUserParams(userParams);
1220                 }
1221         }
1222
1223         protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1224
1225                 for(Map<String, Object> params : reqParams.getUserParams()){
1226                         if(params.containsKey("service")){
1227                                 Service service = serviceMapper(params);
1228                                 
1229                                 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1230                                 
1231                                 if (targetConfiguration.isPresent()) {
1232                                         return targetConfiguration.get();
1233                                 } else {
1234                                         for(Networks network : service.getResources().getNetworks()) {
1235                                                 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1236                                                 if(targetConfiguration.isPresent()) {
1237                                                         return targetConfiguration.get();
1238                                                 }
1239                                         }
1240                                 
1241                                         for(Vnfs vnf : service.getResources().getVnfs()) {
1242                                                 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1243                                                 
1244                                                 if(targetConfiguration.isPresent()) {
1245                                                         return targetConfiguration.get();
1246                                                 }
1247                                                 
1248                                                 for(VfModules vfModule : vnf.getVfModules()) {
1249                                                         targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1250                                                         
1251                                                         if(targetConfiguration.isPresent()) {
1252                                                                 return targetConfiguration.get();
1253                                                         }
1254                                                 }
1255                                         }
1256                                 }
1257                         }
1258         }
1259         
1260         return null;
1261         }
1262
1263         private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1264                 CloudConfiguration targetConfiguration = new CloudConfiguration();
1265                 if(sourceCloudConfiguration != null) {
1266                         targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1267                         targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1268                         targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1269                         return Optional.of(targetConfiguration);
1270                 }
1271                 return Optional.empty();
1272         }
1273
1274         protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1275         msoLogger.debug("Configuring UserParams for Macro Request");
1276         Map<String, Object> userParams = new HashMap<>();
1277         
1278         for(Map<String, Object> params : reqParams.getUserParams()){
1279                 if(params.containsKey("service")){
1280                         Service service = serviceMapper(params);
1281                                 
1282                                 addUserParams(userParams, service.getInstanceParams());
1283                                 
1284                                 for(Networks network : service.getResources().getNetworks()) {
1285                                         addUserParams(userParams, network.getInstanceParams());
1286                                 }
1287                                 
1288                                 for(Vnfs vnf: service.getResources().getVnfs()) {
1289                                         addUserParams(userParams, vnf.getInstanceParams());
1290                                         
1291                                         for(VfModules vfModule: vnf.getVfModules()) {
1292                                                 addUserParams(userParams, vfModule.getInstanceParams());
1293                                         }
1294                                 }
1295                 }
1296         }
1297         
1298         return mapFlatMapToNameValue(userParams);
1299     }
1300
1301         private Service serviceMapper(Map<String, Object> params)
1302                         throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1303                 ObjectMapper obj = new ObjectMapper();
1304                 String input = obj.writeValueAsString(params.get("service"));
1305                 return obj.readValue(input, Service.class);
1306         }
1307
1308         private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1309                 for(Map<String, String> map : sourceUserParams) {
1310                         for (Map.Entry<String, String> entry : map.entrySet()) {
1311                                 targetUserParams.put(entry.getKey(), entry.getValue());
1312                         }
1313                 }
1314         }
1315         
1316         protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1317                 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1318                 
1319                 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1320                         Map<String, Object> targetMap = new HashMap<>();
1321                         targetMap.put(NAME, map.getKey());
1322                         targetMap.put(VALUE, map.getValue());
1323                         targetUserParams.add(targetMap);
1324                 }
1325                 return targetUserParams;
1326         }
1327
1328     private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1329
1330                 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1331                 String vnfComponentType = modelInfo.getModelType().name();
1332
1333                 RelatedInstanceList[] instanceList = null;
1334                 if (servInstReq.getRequestDetails() != null) {
1335                         instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1336                 }
1337
1338                 Recipe recipe = null;
1339                 String defaultSource = getDefaultModel(servInstReq);
1340                 String modelCustomizationId = modelInfo.getModelCustomizationId();
1341                 String modelCustomizationName = modelInfo.getModelCustomizationName();
1342                 String relatedInstanceModelVersionId = null;
1343                 String relatedInstanceModelInvariantId = null;
1344                 String relatedInstanceVersion = null;
1345                 String relatedInstanceModelCustomizationName = null;
1346
1347                 if (instanceList != null) {
1348
1349                         for(RelatedInstanceList relatedInstanceList : instanceList){
1350
1351                                 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1352                                 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1353                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1354                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1355                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1356                                 }
1357
1358                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1359                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1360                                         relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1361                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1362                                         relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1363                                 }
1364                         }
1365
1366                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1367                                 //                      a.      For a vnf request (only create, no update currently): 
1368                                 //                              i.      (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1369                                 //                              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 
1370                                 //                                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName 
1371                 //                                      to Ã¢â‚¬Å“join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid  record exists.
1372                                 //                              **If relatedInstance.modelInfo[service].modelVersionId  was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId 
1373                                 //                                      (MODEL_UUID) in SERVICE table.
1374                                 //                              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 
1375                                 //                                      during 1707 data migration if VID did not provide it originally on request.
1376                 //                              iv.     Note: continue to construct the Ã¢â‚¬Å“vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1377                                 //                              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.
1378
1379                                 VnfResource vnfResource = null;
1380                                 VnfResourceCustomization vrc=null;
1381                                 // Validation for vnfResource
1382
1383                                 if(modelCustomizationId!=null) {
1384                     vrc = vnfCustomRepo.findOneByModelCustomizationUUID(modelCustomizationId);
1385                     if(vrc != null){
1386                         vnfResource = vrc.getVnfResources();
1387                     }
1388                                 } else {
1389                                         org.onap.so.db.catalog.beans.Service service = serviceRepo.findOneByModelUUID(relatedInstanceModelVersionId);
1390                                         if(service == null) {
1391                                                 service = serviceRepo.findByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1392                                         }
1393
1394                                 if(service == null) {
1395                                         throw new ValidationException("service in relatedInstance");
1396                                 }
1397                     for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1398                         if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1399                                                 vrc=vnfResourceCustom;
1400                         }
1401                     }
1402                                         
1403                                         if(vrc != null) {
1404                                                 vnfResource = vrc.getVnfResources();
1405                         modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1406                         modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1407                                         }
1408                                 }
1409
1410                                 if(vnfResource==null){
1411                                         throw new ValidationException("vnfResource");
1412                                 } else {
1413                                         if(modelInfo.getModelVersionId() == null) {
1414                         modelInfo.setModelVersionId(vnfResource.getModelUUID());
1415                                         }
1416                                 }
1417
1418                                 VnfRecipe vnfRecipe = null;
1419                                 
1420                                 if(vrc != null) {
1421                                         String nfRole = vrc.getNfRole();
1422                                         if(nfRole != null) {
1423                                                 vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1424                                         }
1425                                 }
1426
1427                                 if(vnfRecipe == null) {
1428                                         vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1429                                 }
1430
1431                                 if (vnfRecipe == null) {
1432                                         return null;
1433                                 }
1434
1435                                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1436                         } else {
1437                                 /*                              (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have 
1438                                 //                              been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName 
1439                                 //                              to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid  record exists.
1440                                 //                              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. 
1441                                 //                              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 
1442                                 //                              confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found 
1443                                 //                      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) 
1444                                 //                              and MODEL_VERSION (modelVersion).
1445                                 */
1446                                 VfModuleCustomization vfmc = null;
1447                                 VnfResource vnfr;
1448                                 VnfResourceCustomization vnfrc;
1449                                 VfModule vfModule = null;
1450
1451                                 if(modelInfo.getModelCustomizationId() != null) {
1452                                         vfmc = vfModuleCustomRepo.findByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1453                                 } else {
1454                                         vnfr = vnfRepo.findResourceByModelUUID(relatedInstanceModelVersionId);
1455                                         if(vnfr == null){
1456                                                 vnfr = vnfRepo.findResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1457                                         }
1458                                         vnfrc = vnfCustomRepo.findByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1459                                         
1460                                         List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1461                                                         
1462                                         String vfModuleModelUUID = modelInfo.getModelVersionId();
1463                                         for(VfModuleCustomization vf : list) {
1464                                                 VfModuleCustomization vfmCustom;
1465                                                 if(vfModuleModelUUID != null){
1466                                                         vfmCustom = vfModuleCustomRepo.findByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1467                                                         if(vfmCustom != null){
1468                                                                 vfModule = vfmCustom.getVfModule();
1469                                                         }
1470                                                 }else{ 
1471                                                         vfmCustom = vfModuleCustomRepo.findByModelCustomizationUUID(vf.getModelCustomizationUUID());
1472                                                         if(vfmCustom != null){
1473                                                                 vfModule = vfmCustom.getVfModule();
1474                                                         }else{
1475                                                                 vfModule = vfModuleRepo.findByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1476                                                         }
1477                                                 }
1478                                                 
1479                                                 if(vfModule != null) {
1480                                                         modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1481                                                         modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1482                                                         break;
1483                                                 }
1484                                         }
1485                                 }
1486
1487                                 if(vfmc == null && vfModule == null) {
1488                                         throw new ValidationException("vfModuleCustomization");
1489                                 } else if (vfModule == null && vfmc != null) {
1490                                         vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1491                                 }
1492
1493                                 if(modelInfo.getModelVersionId() == null) {
1494                                         modelInfo.setModelVersionId(vfModule.getModelUUID());
1495                                 }
1496                                 
1497                                 
1498                                 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1499                                 if(recipe == null){
1500                                         List<VfModule> vfModuleRecords= vfModuleRepo.findByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1501                                         if(!vfModuleRecords.isEmpty()){
1502                                                 for(VfModule record : vfModuleRecords){
1503                                                         recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1504                                                         if(recipe != null){
1505                                                                 break;
1506                                                         }
1507                                                 }
1508                                         }
1509                                 }
1510                                 if(recipe == null) {
1511                                         recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1512                                         if (recipe == null) { 
1513                                                 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1514                                         }
1515
1516                                         if(recipe == null) {
1517                                                 return null;
1518                                         }
1519                                 }
1520                         }
1521                 } else {
1522
1523                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1524                                 recipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1525                                 if (recipe == null) {
1526                                         return null;
1527                                 }
1528                         } else {
1529                 recipe = vnfComponentRecipeRepo.findVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1530
1531                                 if (recipe == null) {
1532                                         return null;
1533                                 }
1534                         }
1535                 }
1536
1537                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1538         }
1539         
1540     private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1541         
1542                 String defaultSource = getDefaultModel(sir);
1543
1544                 VnfRecipe vnfRecipe = vnfRecipeRepo.findVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1545
1546                 if (vnfRecipe == null) {
1547                         return null;
1548                 }
1549
1550                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());          
1551         }
1552
1553
1554     private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1555
1556                 String defaultNetworkType = getDefaultModel(sir);
1557
1558                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1559                 String modelName = modelInfo.getModelName();
1560                 Recipe recipe = null;
1561
1562                 if(modelInfo.getModelCustomizationId()!=null){
1563             NetworkResource networkResource = networkCustomizationRepo.findOneByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1564                         if(networkResource!=null){
1565                                 if(modelInfo.getModelVersionId() == null) {
1566                                         modelInfo.setModelVersionId(networkResource.getModelUUID());
1567                                 }
1568                                 recipe = networkRecipeRepo.findByModelNameAndAction(networkResource.getModelName(), action.toString());
1569                         }else{
1570                                 throw new ValidationException("no catalog entry found");
1571                         }
1572                 }else{
1573                         //ok for version < 3 and action delete
1574                         recipe = networkRecipeRepo.findByModelNameAndAction(modelName, action.toString());
1575                 }
1576
1577                 if(recipe == null){
1578                         recipe = networkRecipeRepo.findByModelNameAndAction(defaultNetworkType, action.toString());
1579                 }
1580                 
1581                 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1582         }
1583     
1584     private Optional<String> retrieveModelName(RequestParameters requestParams) {
1585         String requestTestApi = null;
1586         TestApi testApi = null;
1587         
1588         if (requestParams != null) {
1589                 requestTestApi = requestParams.getTestApi();
1590         }
1591         
1592         if (requestTestApi == null) {
1593                 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1594                         requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1595                 } else {
1596                         requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1597                 }
1598         }
1599         
1600                 try {
1601                         testApi = TestApi.valueOf(requestTestApi);
1602                         return Optional.of(testApi.getModelName());
1603                 } catch (Exception e) {
1604                         msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1605                         throw new IllegalArgumentException("Invalid TestApi is provided", e);
1606                 }
1607     }
1608     
1609     private String getDefaultModel(ServiceInstancesRequest sir) {
1610         String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1611         Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1612                 if (oModelName.isPresent()) {
1613                         defaultModel = oModelName.get();
1614                 }
1615                 return defaultModel;
1616     }
1617         
1618     private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1619                 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1620                 Boolean aLaCarte = null;
1621                 String apiVersion = version.substring(1);
1622                 
1623                 long startTime = System.currentTimeMillis ();
1624                 ServiceInstancesRequest sir = null;             
1625
1626                 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1627                 String requestScope = deriveRequestScope(action,sir, requestUri);
1628                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject ( sir,  action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1629                 if(sir.getRequestDetails().getRequestParameters() != null){
1630                         aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1631                 }
1632                 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1633                 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1634                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1635
1636                 InfraActiveRequests dup = null;
1637                 
1638                 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1639
1640                 if (instanceIdMap != null && dup != null) {
1641             buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1642                 }
1643                 
1644                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1645                 RequestReferences referencesResponse = new RequestReferences();
1646                 referencesResponse.setRequestId(requestId);
1647                 serviceResponse.setRequestReferences(referencesResponse);
1648                 
1649                 
1650                 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1651                 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1652                 
1653                 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1654                         String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1655                         
1656             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1657
1658
1659             ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1660                     .errorInfo(errorLoggerInfo).build();
1661
1662             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1663
1664             throw validateException;
1665                         
1666                 }
1667                 
1668                 serviceInstanceId = "";
1669                 String configurationId = "";
1670                 String correlationId = "";
1671
1672                 if(sir.getServiceInstanceId () != null){
1673                         serviceInstanceId = sir.getServiceInstanceId ();
1674                 }
1675
1676                 if(sir.getConfigurationId() != null){
1677             configurationId = sir.getConfigurationId();
1678         }
1679                 if (sir.getCorrelationId() != null) {
1680                         correlationId = sir.getCorrelationId();
1681                 }
1682                 iar.save(currentActiveReq);
1683                 
1684                 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1685                         aLaCarte = true;
1686                 }else if(aLaCarte == null){
1687                         aLaCarte = false;
1688                 }
1689         
1690                 return postBPELRequest(currentActiveReq,action, requestId, startTime, requestJSON, orchestrationUri, Integer.parseInt(timeOut), false, 
1691                                                                 serviceInstanceId, correlationId, null, null, null, null, configurationId, null, null, null, null, apiVersion, aLaCarte, requestUri, null, requestScope, null);
1692         }
1693
1694     public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1695         String requestId = null;
1696         if (requestContext.getProperty("requestId") != null) {
1697                 requestId = requestContext.getProperty("requestId").toString();
1698         }
1699         if (UUIDChecker.isValidUUID(requestId)) {
1700                 return requestId;
1701         } else {
1702                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1703                         ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1704                             .errorInfo(errorLoggerInfo).build();
1705                         
1706                         throw validateException;
1707         }
1708     }
1709         //TODO MSO-4177 -- remove this and call the msoRequest instead
1710         public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage){
1711                 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1712                         aq.setStatusMessage (errorMessage);
1713                         aq.setProgress(new Long(100));
1714                         aq.setRequestStatus(status.toString());
1715                         Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1716                         aq.setEndTime (endTimeStamp);
1717                         iar.save(aq);
1718                 }
1719         }
1720 }