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