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