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