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