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