5d9ad767bfadf3f82d2883db8178824816fcdcfa
[so.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  * 
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  * 
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.so.apihandlerinfra;
23
24
25 import com.fasterxml.jackson.annotation.JsonInclude.Include;
26 import com.fasterxml.jackson.core.JsonParseException;
27 import com.fasterxml.jackson.core.JsonProcessingException;
28 import com.fasterxml.jackson.databind.JsonMappingException;
29 import com.fasterxml.jackson.databind.ObjectMapper;
30 import io.swagger.annotations.Api;
31 import io.swagger.annotations.ApiOperation;
32 import org.apache.commons.lang.StringUtils;
33 import org.apache.http.HttpResponse;
34 import org.apache.http.HttpStatus;
35 import org.onap.so.apihandler.camundabeans.CamundaResponse;
36 import org.onap.so.apihandler.common.CommonConstants;
37 import org.onap.so.apihandler.common.ErrorNumbers;
38 import org.onap.so.apihandler.common.RequestClient;
39 import org.onap.so.apihandler.common.RequestClientFactory;
40 import org.onap.so.apihandler.common.RequestClientParameter;
41 import org.onap.so.apihandler.common.ResponseBuilder;
42 import org.onap.so.apihandler.common.ResponseHandler;
43 import org.onap.so.apihandlerinfra.exceptions.ApiException;
44 import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException;
45 import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException;
46 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
47 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
48 import org.onap.so.apihandlerinfra.exceptions.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 = null;
667
668                                 String modelVersionId = modelInfo.getModelVersionId();
669
670                                 if(modelVersionId != null) {
671                                         vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
672                                 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
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             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
835             throw validateException;
836         }
837
838                 // BPEL accepted the request, the request is in progress
839                 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
840                         ServiceInstancesResponse jsonResponse;
841                         CamundaResponse camundaResp = respHandler.getResponse();
842                         
843                         if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
844                                 try {
845                                         ObjectMapper mapper = new ObjectMapper();
846                                         jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
847                                 } catch (IOException e) {
848                                         msoLogger.error(e);
849                                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
850                                         ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
851                                             .errorInfo(errorLoggerInfo).build();
852                                         updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
853                                         throw validateException;
854                                 }
855                         
856                                 currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
857                                 setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
858                                 
859                                 infraActiveRequestsClient.save(currentActiveReq);
860                                 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
861                         } 
862                 }
863                         
864                 List<String> variables = new ArrayList<>();
865                 variables.add(bpelStatus + "");
866                 String camundaJSONResponseBody = respHandler.getResponseBody ();
867                 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
868                         
869                     ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
870                     BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
871                             .errorInfo(errorLoggerInfo).build();
872
873                     updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
874
875                     throw bpmnException;
876                 } else {
877                 
878                     ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
879
880
881                     BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
882                             .errorInfo(errorLoggerInfo).build();
883                     updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
884
885                     throw servException;
886                 }
887         }
888
889         private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
890                 if(StringUtils.isNotBlank(instanceId)) {
891                         if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
892                                 currentActiveReq.setServiceInstanceId(instanceId);
893                         } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
894                                 currentActiveReq.setVnfId(instanceId);
895                         } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
896                                 currentActiveReq.setVfModuleId(instanceId);
897                         } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
898                                 currentActiveReq.setVolumeGroupId(instanceId);
899                         } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
900                                 currentActiveReq.setNetworkId(instanceId);
901                         } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
902                                 currentActiveReq.setConfigurationId(instanceId);
903                         }
904                 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
905                         if(instanceIdMap.get("serviceInstanceId") != null){
906                                 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
907                 }
908                 if(instanceIdMap.get("vnfInstanceId") != null){
909                         currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
910                 }
911                 if(instanceIdMap.get("vfModuleInstanceId") != null){
912                         currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
913                 }
914                 if(instanceIdMap.get("volumeGroupInstanceId") != null){
915                         currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
916                 }
917                 if(instanceIdMap.get("networkInstanceId") != null){
918                         currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
919                 }
920                 if(instanceIdMap.get("configurationInstanceId") != null){
921                         currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
922                 }
923                 }
924         }
925
926     protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
927         ObjectMapper mapper = new ObjectMapper();       
928         mapper.setSerializationInclusion(Include.NON_NULL);     
929         ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);           
930         if(     !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null && 
931                 serviceInstRequest.getRequestDetails() != null && 
932                 serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
933                 sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
934                 sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
935         }
936         msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
937         return mapper.writeValueAsString(sir);
938         }
939
940     private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
941                                              String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
942
943                 // Found the duplicate record. Return the appropriate error.
944                 String instance = null;
945                 if(instanceName != null){
946                         instance = instanceName;
947                 }else{
948                         instance = instanceIdMap.get(requestScope + "InstanceId");
949                 }
950                 //List<String> variables = new ArrayList<String>();
951                 //variables.add(dup.getRequestStatus());
952         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
953
954
955         DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
956             .errorInfo(errorLoggerInfo).build();
957
958         updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
959
960         throw dupException;
961         }
962
963         private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
964                                                MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
965                 InfraActiveRequests dup = null;
966                 try {
967                         if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
968                                 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
969                         }
970                 } catch (Exception e) {
971             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
972
973
974             ValidateException validateException = new ValidateException.Builder("Duplicate Check Request", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
975                     .errorInfo(errorLoggerInfo).build();
976
977             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
978
979             throw validateException;
980                 }
981                 return dup;
982         }
983
984         private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
985                                                                         ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
986                 try{
987                         ObjectMapper mapper = new ObjectMapper();
988                         return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
989
990         } catch (IOException e) {
991
992             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
993
994             ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
995                     .errorInfo(errorLoggerInfo).build();
996             String requestScope = requestScopeFromUri(requestUri);
997
998             msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
999
1000             throw validateException;
1001                 }
1002         }
1003         
1004         private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version, 
1005                                                                 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException {
1006                 int reqVersion = Integer.parseInt(version.substring(1));
1007                 try {
1008                         msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1009                 } catch (Exception e) {
1010                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1011                 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1012                  .errorInfo(errorLoggerInfo).build();
1013
1014                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1015
1016                 throw validateException;
1017                 }
1018         }
1019
1020     private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag, 
1021                                                                                                                                 InfraActiveRequests currentActiveReq) throws ApiException {
1022                 RecipeLookupResult recipeLookupResult = null;
1023         //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1024                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1025                 // Query MSO Catalog DB
1026                 
1027                 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1028                         recipeLookupResult = getDefaultVnfUri(sir, action);
1029         } else if (modelInfo.getModelType().equals(ModelType.service)) {
1030                         try {
1031                         recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1032                         } catch (IOException e) {
1033                                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1034
1035
1036                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1037                         .errorInfo(errorLoggerInfo).build();
1038
1039                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1040
1041                 throw validateException;
1042                         }
1043         } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1044                                 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1045             try {
1046                         recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1047             } catch (ValidationException e) {
1048                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1049
1050
1051                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1052                         .errorInfo(errorLoggerInfo).build();
1053
1054                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1055
1056                 throw validateException;
1057             }
1058                 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1059             try {
1060                         recipeLookupResult = getNetworkUri( sir, action);
1061             } catch (ValidationException e) {
1062
1063                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1064
1065
1066                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1067                         .errorInfo(errorLoggerInfo).build();
1068                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1069
1070                 throw validateException;
1071                 }
1072         }
1073
1074         if (recipeLookupResult == null) {
1075             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1076
1077
1078             RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1079                     .errorInfo(errorLoggerInfo).build();
1080
1081             updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1082             throw recipeNotFoundExceptionException;
1083                 }
1084                 return recipeLookupResult;
1085         }
1086         
1087     private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1088                 // SERVICE REQUEST
1089                 // Construct the default service name
1090                 // TODO need to make this a configurable property
1091                 String defaultServiceModelName = getDefaultModel(servInstReq);
1092                 RequestDetails requestDetails = servInstReq.getRequestDetails();
1093                 ModelInfo modelInfo = requestDetails.getModelInfo();
1094                 org.onap.so.db.catalog.beans.Service serviceRecord;
1095                 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1096                 ServiceRecipe recipe = null;
1097                 
1098                 if(alaCarteFlag){
1099                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1100                         if(serviceRecord !=null){                                       
1101                                 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1102                         }
1103                 }else{
1104                         serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1105                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1106                         if (recipe == null){
1107                                 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1108                                 if(!serviceRecordList.isEmpty()){
1109                                         for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1110                                                 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1111                                                 if(recipe != null){
1112                                                         break;
1113                                                 }
1114                                         }
1115                                 }
1116                         }
1117                 }
1118                 
1119                 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1120                 RequestParameters reqParam = requestDetails.getRequestParameters();
1121                 if(reqParam!=null && alaCarteFlag && recipe==null){
1122                         return null;
1123                 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1124                         mapToLegacyRequest(requestDetails);
1125                 }else if (recipe == null) {  //aLaCarte wasn't sent, so we'll try the default
1126                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1127                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1128                 }
1129                 if(modelInfo.getModelVersionId() == null) {
1130                         modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1131                 }
1132                 if(recipe==null){
1133                         return null;
1134                 }
1135                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1136         }
1137
1138         protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1139                 RequestParameters reqParam;
1140                 if (requestDetails.getRequestParameters() == null) {
1141                         reqParam = new RequestParameters();
1142                 } else {
1143                         reqParam = requestDetails.getRequestParameters();
1144                 }
1145                 if(requestDetails.getCloudConfiguration() == null) {
1146                         CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1147                         if(cloudConfig != null) {
1148                                 requestDetails.setCloudConfiguration(cloudConfig);
1149                         }
1150                 }
1151                 
1152                 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1153                 if(!userParams.isEmpty()) {
1154                         if (reqParam == null) {
1155                                 requestDetails.setRequestParameters(new RequestParameters());
1156                         }
1157                         requestDetails.getRequestParameters().setUserParams(userParams);
1158                 }
1159         }
1160
1161         protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1162
1163                 for(Map<String, Object> params : reqParams.getUserParams()){
1164                         if(params.containsKey("service")){
1165                                 Service service = serviceMapper(params);
1166                                 
1167                                 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1168                                 
1169                                 if (targetConfiguration.isPresent()) {
1170                                         return targetConfiguration.get();
1171                                 } else {
1172                                         for(Networks network : service.getResources().getNetworks()) {
1173                                                 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1174                                                 if(targetConfiguration.isPresent()) {
1175                                                         return targetConfiguration.get();
1176                                                 }
1177                                         }
1178                                 
1179                                         for(Vnfs vnf : service.getResources().getVnfs()) {
1180                                                 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1181                                                 
1182                                                 if(targetConfiguration.isPresent()) {
1183                                                         return targetConfiguration.get();
1184                                                 }
1185                                                 
1186                                                 for(VfModules vfModule : vnf.getVfModules()) {
1187                                                         targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1188                                                         
1189                                                         if(targetConfiguration.isPresent()) {
1190                                                                 return targetConfiguration.get();
1191                                                         }
1192                                                 }
1193                                         }
1194                                 }
1195                         }
1196         }
1197         
1198         return null;
1199         }
1200
1201         private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1202                 CloudConfiguration targetConfiguration = new CloudConfiguration();
1203                 if(sourceCloudConfiguration != null) {
1204                         targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1205                         targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1206                         targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1207                         return Optional.of(targetConfiguration);
1208                 }
1209                 return Optional.empty();
1210         }
1211
1212         protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1213         msoLogger.debug("Configuring UserParams for Macro Request");
1214         Map<String, Object> userParams = new HashMap<>();
1215         
1216         for(Map<String, Object> params : reqParams.getUserParams()){
1217                 if(params.containsKey("service")){
1218                         Service service = serviceMapper(params);
1219                                 
1220                                 addUserParams(userParams, service.getInstanceParams());
1221                                 
1222                                 for(Networks network : service.getResources().getNetworks()) {
1223                                         addUserParams(userParams, network.getInstanceParams());
1224                                 }
1225                                 
1226                                 for(Vnfs vnf: service.getResources().getVnfs()) {
1227                                         addUserParams(userParams, vnf.getInstanceParams());
1228                                         
1229                                         for(VfModules vfModule: vnf.getVfModules()) {
1230                                                 addUserParams(userParams, vfModule.getInstanceParams());
1231                                         }
1232                                 }
1233                 }
1234         }
1235         
1236         return mapFlatMapToNameValue(userParams);
1237     }
1238
1239         private Service serviceMapper(Map<String, Object> params)
1240                         throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1241                 ObjectMapper obj = new ObjectMapper();
1242                 String input = obj.writeValueAsString(params.get("service"));
1243                 return obj.readValue(input, Service.class);
1244         }
1245
1246         private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1247                 for(Map<String, String> map : sourceUserParams) {
1248                         for (Map.Entry<String, String> entry : map.entrySet()) {
1249                                 targetUserParams.put(entry.getKey(), entry.getValue());
1250                         }
1251                 }
1252         }
1253         
1254         protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1255                 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1256                 
1257                 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1258                         Map<String, Object> targetMap = new HashMap<>();
1259                         targetMap.put(NAME, map.getKey());
1260                         targetMap.put(VALUE, map.getValue());
1261                         targetUserParams.add(targetMap);
1262                 }
1263                 return targetUserParams;
1264         }
1265
1266     private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1267
1268                 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1269                 String vnfComponentType = modelInfo.getModelType().name();
1270
1271                 RelatedInstanceList[] instanceList = null;
1272                 if (servInstReq.getRequestDetails() != null) {
1273                         instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1274                 }
1275
1276                 Recipe recipe = null;
1277                 String defaultSource = getDefaultModel(servInstReq);
1278                 String modelCustomizationId = modelInfo.getModelCustomizationId();
1279                 String modelCustomizationName = modelInfo.getModelCustomizationName();
1280                 String relatedInstanceModelVersionId = null;
1281                 String relatedInstanceModelInvariantId = null;
1282                 String relatedInstanceVersion = null;
1283                 String relatedInstanceModelCustomizationName = null;
1284
1285                 if (instanceList != null) {
1286
1287                         for(RelatedInstanceList relatedInstanceList : instanceList){
1288
1289                                 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1290                                 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1291                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1292                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1293                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1294                                 }
1295
1296                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1297                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1298                                         relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1299                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1300                                         relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1301                                 }
1302                         }
1303
1304                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1305                                 //                      a.      For a vnf request (only create, no update currently): 
1306                                 //                              i.      (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1307                                 //                              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 
1308                                 //                                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName 
1309                 //                                      to Ã¢â‚¬Å“join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid  record exists.
1310                                 //                              **If relatedInstance.modelInfo[service].modelVersionId  was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId 
1311                                 //                                      (MODEL_UUID) in SERVICE table.
1312                                 //                              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 
1313                                 //                                      during 1707 data migration if VID did not provide it originally on request.
1314                 //                              iv.     Note: continue to construct the Ã¢â‚¬Å“vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1315                                 //                              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.
1316
1317                                 VnfResource vnfResource = null;
1318                                 VnfResourceCustomization vrc=null;
1319                                 // Validation for vnfResource
1320
1321                                 if(modelCustomizationId!=null) {
1322                     vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1323                     if(vrc != null){
1324                         vnfResource = vrc.getVnfResources();
1325                     }
1326                                 } else {
1327                                         org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1328                                         if(service == null) {
1329                                                 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1330                                         }
1331
1332                                 if(service == null) {
1333                                         throw new ValidationException("service in relatedInstance");
1334                                 }
1335                     for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1336                         if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1337                                                 vrc=vnfResourceCustom;
1338                         }
1339                     }
1340                                         
1341                                         if(vrc != null) {
1342                                                 vnfResource = vrc.getVnfResources();
1343                         modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1344                         modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1345                                         }
1346                                 }
1347
1348                                 if(vnfResource==null){
1349                                         throw new ValidationException("vnfResource");
1350                                 } else {
1351                                         if(modelInfo.getModelVersionId() == null) {
1352                         modelInfo.setModelVersionId(vnfResource.getModelUUID());
1353                                         }
1354                                 }
1355
1356                                 VnfRecipe vnfRecipe = null;
1357                                 
1358                                 if(vrc != null) {
1359                                         String nfRole = vrc.getNfRole();
1360                                         if(nfRole != null) {
1361                                                 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1362                                         }
1363                                 }
1364
1365                                 if(vnfRecipe == null) {
1366                                         vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1367                                 }
1368
1369                                 if (vnfRecipe == null) {
1370                                         return null;
1371                                 }
1372
1373                                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1374                         } else {
1375                                 /*                              (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have 
1376                                 //                              been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName 
1377                                 //                              to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid  record exists.
1378                                 //                              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. 
1379                                 //                              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 
1380                                 //                              confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found 
1381                                 //                      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) 
1382                                 //                              and MODEL_VERSION (modelVersion).
1383                                 */
1384                                 VfModuleCustomization vfmc = null;
1385                                 VnfResource vnfr;
1386                                 VnfResourceCustomization vnfrc;
1387                                 VfModule vfModule = null;
1388
1389                                 if(modelInfo.getModelCustomizationId() != null) {
1390                                         vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1391                                 } else {
1392                                         vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1393                                         if(vnfr == null){
1394                                                 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1395                                         }
1396                                         vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1397                                         
1398                                         List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1399                                                         
1400                                         String vfModuleModelUUID = modelInfo.getModelVersionId();
1401                                         for(VfModuleCustomization vf : list) {
1402                                                 VfModuleCustomization vfmCustom;
1403                                                 if(vfModuleModelUUID != null){
1404                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1405                                                         if(vfmCustom != null){
1406                                                                 vfModule = vfmCustom.getVfModule();
1407                                                         }
1408                                                 }else{ 
1409                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1410                                                         if(vfmCustom != null){
1411                                                                 vfModule = vfmCustom.getVfModule();
1412                                                         }else{
1413                                                                 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1414                                                         }
1415                                                 }
1416                                                 
1417                                                 if(vfModule != null) {
1418                                                         modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1419                                                         modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1420                                                         break;
1421                                                 }
1422                                         }
1423                                 }
1424
1425                                 if(vfmc == null && vfModule == null) {
1426                                         throw new ValidationException("vfModuleCustomization");
1427                                 } else if (vfModule == null && vfmc != null) {
1428                                         vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1429                                 }
1430
1431                                 if(modelInfo.getModelVersionId() == null) {
1432                                         modelInfo.setModelVersionId(vfModule.getModelUUID());
1433                                 }
1434                                 
1435                                 
1436                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1437                                 if(recipe == null){
1438                                         List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1439                                         if(!vfModuleRecords.isEmpty()){
1440                                                 for(VfModule record : vfModuleRecords){
1441                                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1442                                                         if(recipe != null){
1443                                                                 break;
1444                                                         }
1445                                                 }
1446                                         }
1447                                 }
1448                                 if(recipe == null) {
1449                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1450                                         if (recipe == null) { 
1451                                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1452                                         }
1453
1454                                         if(recipe == null) {
1455                                                 return null;
1456                                         }
1457                                 }
1458                         }
1459                 } else {
1460
1461                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1462                                 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1463                                 if (recipe == null) {
1464                                         return null;
1465                                 }
1466                         } else {
1467                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1468
1469                                 if (recipe == null) {
1470                                         return null;
1471                                 }
1472                         }
1473                 }
1474
1475                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1476         }
1477         
1478     private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1479         
1480                 String defaultSource = getDefaultModel(sir);
1481
1482                 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1483
1484                 if (vnfRecipe == null) {
1485                         return null;
1486                 }
1487
1488                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());          
1489         }
1490
1491
1492     private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1493
1494                 String defaultNetworkType = getDefaultModel(sir);
1495
1496                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1497                 String modelName = modelInfo.getModelName();
1498                 Recipe recipe = null;
1499
1500                 if(modelInfo.getModelCustomizationId()!=null){
1501             NetworkResource networkResource = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1502                         if(networkResource!=null){
1503                                 if(modelInfo.getModelVersionId() == null) {
1504                                         modelInfo.setModelVersionId(networkResource.getModelUUID());
1505                                 }
1506                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1507                         }else{
1508                                 throw new ValidationException("no catalog entry found");
1509                         }
1510                 }else{
1511                         //ok for version < 3 and action delete
1512                         if(modelName != null){
1513                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1514                         }
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 }