Merge "Added quriedVolumeGroupId to createvfModule"
[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 serviceInstanceType = msoRequest.getServiceInstanceType(sir,requestScope);
709                 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
710                 
711                 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
712                         currentActiveReq.setVnfType(vnfType);
713                 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
714                         currentActiveReq.setNetworkType(networkType);
715                 }
716                 
717                 InfraActiveRequests dup = null;
718                                 
719
720                 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
721
722                 if (dup != null) {
723             buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
724                 }
725                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
726
727                 RequestReferences referencesResponse = new RequestReferences();
728
729                 referencesResponse.setRequestId(requestId);
730
731                 serviceResponse.setRequestReferences(referencesResponse);
732                 Boolean isBaseVfModule = false;
733
734         RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
735                                                                 
736                         ModelType modelType;
737                         ModelInfo modelInfo =  sir.getRequestDetails().getModelInfo();
738                         if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
739                                 modelType = ModelType.vnf;
740                         }else if(action == Action.addMembers || action == Action.removeMembers){
741                                 modelType = ModelType.instanceGroup;
742                         }else {
743                                 modelType =modelInfo.getModelType();
744                         }
745
746                         if (modelType.equals(ModelType.vfModule)) {
747                                 
748
749                                 // Get VF Module-specific base module indicator
750                                 VfModule vfm = null;
751
752                                 String modelVersionId = modelInfo.getModelVersionId();
753
754                                 if(modelVersionId != null) {
755                                         vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
756                                 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
757                                         vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
758                                 }
759
760                                 if (vfm != null) {
761                                         if (vfm.getIsBase()) {
762                                                 isBaseVfModule = true;
763                                         }
764             } else if (action == Action.createInstance || action == Action.updateInstance) {
765                                         // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
766                                         // This request cannot proceed
767                                         
768                                         String serviceVersionText = "";
769                                         if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
770                                                 serviceVersionText = " with version " + sdcServiceModelVersion;
771                                         }
772
773                 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
774                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
775                 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
776                 updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
777
778                 throw vfModuleException;
779                 }
780                 }
781                 
782                 
783                 serviceInstanceId = "";
784                 String vnfId = "";
785                 String vfModuleId = "";
786                 String volumeGroupId = "";
787                 String networkId = "";
788                 String correlationId = "";
789                 String instanceGroupId = null;
790                 if(sir.getServiceInstanceId () != null){
791                         serviceInstanceId = sir.getServiceInstanceId ();
792                 }
793
794                 if(sir.getVnfInstanceId () != null){
795                         vnfId = sir.getVnfInstanceId ();
796                 }
797
798                 if(sir.getVfModuleInstanceId () != null){
799                         vfModuleId = sir.getVfModuleInstanceId ();
800                 }
801
802                 if(sir.getVolumeGroupInstanceId () != null){
803                         volumeGroupId = sir.getVolumeGroupInstanceId ();
804                 }
805
806                 if(sir.getNetworkInstanceId () != null){
807                         networkId = sir.getNetworkInstanceId ();
808                 }
809                 if(sir.getInstanceGroupId() != null){
810                         instanceGroupId = sir.getInstanceGroupId();
811                 }
812
813         correlationId = getCorrelationId(sir);
814
815         try{
816             infraActiveRequestsClient.save(currentActiveReq);
817         }catch(Exception e){
818             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
819             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
820                     .errorInfo(errorLoggerInfo).build();
821         }
822                 
823                 if(!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance){
824                         aLaCarte = true;
825                 }else if(aLaCarte == null){
826                         aLaCarte = false;
827                 }
828                 
829                 RequestClientParameter requestClientParameter = null;
830                 try {
831                         requestClientParameter = new RequestClientParameter.Builder()
832                                                 .setRequestId(requestId)
833                                                 .setBaseVfModule(isBaseVfModule)
834                                                 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
835                                                 .setRequestAction(action.toString())
836                                                 .setServiceInstanceId(serviceInstanceId)
837                                                 .setCorrelationId(correlationId)
838                                                 .setVnfId(vnfId)
839                                                 .setVfModuleId(vfModuleId)
840                                                 .setVolumeGroupId(volumeGroupId)
841                                                 .setNetworkId(networkId)
842                                                 .setServiceType(serviceInstanceType)
843                                                 .setVnfType(vnfType)
844                                                 .setVfModuleType(vfModuleType)
845                                                 .setNetworkType(networkType)
846                                                 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
847                                                 .setApiVersion(apiVersion)
848                                                 .setALaCarte(aLaCarte)
849                                                 .setRequestUri(requestUri)
850                                                 .setInstanceGroupId(instanceGroupId).build();
851                 } catch (IOException e) {
852                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
853                         throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
854                           .errorInfo(errorLoggerInfo).build();
855                 }
856                 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
857         }
858         public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
859                 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_ID);
860                 Boolean aLaCarte = true;
861                 long startTime = System.currentTimeMillis ();
862                 String apiVersion = version.substring(1);
863                 ServiceInstancesRequest sir = new ServiceInstancesRequest();
864                 sir.setInstanceGroupId(instanceGroupId);
865         
866                 String requestScope = ModelType.instanceGroup.toString();
867                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject (sir,  action, requestId, Status.IN_PROGRESS, null, requestScope);
868                 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
869                 try {
870                         validateHeaders(requestContext);
871                 } catch (ValidationException e) {
872                         msoLogger.error(e);
873             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
874             ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
875                         .errorInfo(errorLoggerInfo).build();
876             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
877             throw validateException;
878                 }
879                 
880                 InfraActiveRequests dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, null, requestScope, currentActiveReq);
881
882                 if (dup != null) {
883             buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, null, requestScope, dup);
884                 }
885                 
886                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
887
888                 RequestReferences referencesResponse = new RequestReferences();
889
890                 referencesResponse.setRequestId(requestId);
891
892                 serviceResponse.setRequestReferences(referencesResponse);
893                 Boolean isBaseVfModule = false;
894
895         RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
896                                                                 
897         try{
898             infraActiveRequestsClient.save(currentActiveReq);
899         }catch(Exception e){
900             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
901             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
902                     .errorInfo(errorLoggerInfo).build();
903         }
904         
905                 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder()
906                                         .setRequestId(requestId)
907                                         .setBaseVfModule(isBaseVfModule)
908                                         .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
909                                         .setRequestAction(action.toString())
910                                         .setApiVersion(apiVersion)
911                                         .setALaCarte(aLaCarte)
912                                         .setRequestUri(requestUri)
913                                         .setInstanceGroupId(instanceGroupId).build();
914                 
915                 return postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
916         }
917
918         private String getCorrelationId(ServiceInstancesRequest sir) {
919                 return Optional.of(sir)
920                                 .map(ServiceInstancesRequest::getRequestDetails)
921                                 .map(RequestDetails::getRequestParameters)
922                                 .map(parameters -> parameters.getUserParamValue("pnfId"))
923                                 .orElse("");
924         }
925
926         private String deriveRequestScope(Actions action, ServiceInstancesRequest sir, String requestUri) {
927                 if(action == Action.inPlaceSoftwareUpdate || action == Action.applyUpdatedConfig){
928                         return (ModelType.vnf.name());
929                 }else if(action == Action.addMembers || action == Action.removeMembers){
930                         return(ModelType.instanceGroup.toString());
931                 }else{
932                         String requestScope;
933                         if(sir.getRequestDetails().getModelInfo().getModelType() == null){
934                                 requestScope = requestScopeFromUri(requestUri);
935                         }else{
936                                 requestScope = sir.getRequestDetails().getModelInfo().getModelType().name(); 
937                         }
938                         return requestScope; 
939                 }
940         }
941         private String requestScopeFromUri(String requestUri){
942                 String requestScope;
943                 if(requestUri.contains(ModelType.network.name())){
944                         requestScope = ModelType.network.name();
945                 }else if(requestUri.contains(ModelType.vfModule.name())){
946                         requestScope = ModelType.vfModule.name();
947                 }else if(requestUri.contains(ModelType.volumeGroup.name())){
948                         requestScope = ModelType.volumeGroup.name();
949                 }else if(requestUri.contains(ModelType.configuration.name())){
950                         requestScope = ModelType.configuration.name();
951                 }else if(requestUri.contains(ModelType.vnf.name())){
952                         requestScope = ModelType.vnf.name();
953                 }else{
954                         requestScope = ModelType.service.name();
955                 }
956                 return requestScope;
957         }
958         private Response postBPELRequest(InfraActiveRequests currentActiveReq, RequestClientParameter requestClientParameter, String orchestrationUri, String requestScope)throws ApiException {
959                 RequestClient requestClient = null;
960                 HttpResponse response = null;
961                 try {
962                         requestClient = reqClientFactory.getRequestClient (orchestrationUri);
963                         response = requestClient.post(requestClientParameter);
964                 } catch (Exception e) {
965                         
966             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.AvailabilityError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
967             String url = requestClient != null ? requestClient.getUrl() : "";
968             ClientConnectionException clientException = new ClientConnectionException.Builder(url, HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).cause(e).errorInfo(errorLoggerInfo).build();
969             updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
970
971             throw clientException;
972                 }
973
974                 if (response == null) {
975                         
976             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_COMMUNICATE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
977             ClientConnectionException clientException = new ClientConnectionException.Builder(requestClient.getUrl(), HttpStatus.SC_BAD_GATEWAY, ErrorNumbers.SVC_NO_SERVER_RESOURCES).errorInfo(errorLoggerInfo).build();
978
979             updateStatus(currentActiveReq, Status.FAILED, clientException.getMessage());
980
981             throw clientException;
982                 }
983
984                 ResponseHandler respHandler = null;
985         int bpelStatus = 500;
986         try {
987             respHandler = new ResponseHandler (response, requestClient.getType ());
988             bpelStatus = respHandler.getStatus ();
989         } catch (ApiException e) {
990             msoLogger.error(e);
991             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
992             ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
993                         .errorInfo(errorLoggerInfo).build();
994             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
995             throw validateException;
996         }
997
998                 // BPEL accepted the request, the request is in progress
999                 if (bpelStatus == HttpStatus.SC_ACCEPTED) {
1000                         ServiceInstancesResponse jsonResponse;
1001                         CamundaResponse camundaResp = respHandler.getResponse();
1002                         
1003                         if("Success".equalsIgnoreCase(camundaResp.getMessage())) {
1004                                 try {
1005                                         ObjectMapper mapper = new ObjectMapper();
1006                                         jsonResponse = mapper.readValue(camundaResp.getResponse(), ServiceInstancesResponse.class);
1007                                         jsonResponse.getRequestReferences().setRequestId(requestClientParameter.getRequestId());
1008                                         Optional<URL> selfLinkUrl = msoRequest.buildSelfLinkUrl(currentActiveReq.getRequestUrl(), requestClientParameter.getRequestId());
1009                                         if(selfLinkUrl.isPresent()){
1010                                                 jsonResponse.getRequestReferences().setRequestSelfLink(selfLinkUrl.get());
1011                                         } else {
1012                                             jsonResponse.getRequestReferences().setRequestSelfLink(null);
1013                                         }    
1014                                 } catch (IOException e) {
1015                                         msoLogger.error(e);
1016                                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1017                                         ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1018                                             .errorInfo(errorLoggerInfo).build();
1019                                         updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1020                                         throw validateException;
1021                                 }       
1022                                 return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestClientParameter.getRequestId(), jsonResponse, requestClientParameter.getApiVersion());
1023                         } 
1024                 }
1025                         
1026                 List<String> variables = new ArrayList<>();
1027                 variables.add(bpelStatus + "");
1028                 String camundaJSONResponseBody = respHandler.getResponseBody ();
1029                 if (camundaJSONResponseBody != null && !camundaJSONResponseBody.isEmpty ()) {
1030                         
1031                     ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1032                     BPMNFailureException bpmnException = new BPMNFailureException.Builder(String.valueOf(bpelStatus) + camundaJSONResponseBody, bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1033                             .errorInfo(errorLoggerInfo).build();
1034
1035                     updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
1036
1037                     throw bpmnException;
1038                 } else {
1039                 
1040                     ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.BusinessProcesssError).errorSource(requestClient.getUrl()).build();
1041
1042
1043                     BPMNFailureException servException = new BPMNFailureException.Builder(String.valueOf(bpelStatus), bpelStatus, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1044                             .errorInfo(errorLoggerInfo).build();
1045                     updateStatus(currentActiveReq, Status.FAILED, servException.getMessage());
1046
1047                     throw servException;
1048                 }
1049         }
1050
1051         private void setInstanceId(InfraActiveRequests currentActiveReq, String requestScope, String instanceId, Map<String, String> instanceIdMap) {
1052                 if(StringUtils.isNotBlank(instanceId)) {
1053                         if(ModelType.service.name().equalsIgnoreCase(requestScope)) {
1054                                 currentActiveReq.setServiceInstanceId(instanceId);
1055                         } else if(ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
1056                                 currentActiveReq.setVnfId(instanceId);
1057                         } else if(ModelType.vfModule.name().equalsIgnoreCase(requestScope)) {
1058                                 currentActiveReq.setVfModuleId(instanceId);
1059                         } else if(ModelType.volumeGroup.name().equalsIgnoreCase(requestScope)) {
1060                                 currentActiveReq.setVolumeGroupId(instanceId);
1061                         } else if(ModelType.network.name().equalsIgnoreCase(requestScope)) {
1062                                 currentActiveReq.setNetworkId(instanceId);
1063                         } else if(ModelType.configuration.name().equalsIgnoreCase(requestScope)) {
1064                                 currentActiveReq.setConfigurationId(instanceId);
1065                         }else if(ModelType.instanceGroup.toString().equalsIgnoreCase(requestScope)){
1066                                 currentActiveReq.setInstanceGroupId(instanceId);
1067                         }
1068                 } else if(instanceIdMap != null && !instanceIdMap.isEmpty()) {
1069                         if(instanceIdMap.get("serviceInstanceId") != null){
1070                                 currentActiveReq.setServiceInstanceId(instanceIdMap.get("serviceInstanceId"));
1071                 }
1072                 if(instanceIdMap.get("vnfInstanceId") != null){
1073                         currentActiveReq.setVnfId(instanceIdMap.get("vnfInstanceId"));
1074                 }
1075                 if(instanceIdMap.get("vfModuleInstanceId") != null){
1076                         currentActiveReq.setVfModuleId(instanceIdMap.get("vfModuleInstanceId"));
1077                 }
1078                 if(instanceIdMap.get("volumeGroupInstanceId") != null){
1079                         currentActiveReq.setVolumeGroupId(instanceIdMap.get("volumeGroupInstanceId"));
1080                 }
1081                 if(instanceIdMap.get("networkInstanceId") != null){
1082                         currentActiveReq.setNetworkId(instanceIdMap.get("networkInstanceId"));
1083                 }
1084                 if(instanceIdMap.get("configurationInstanceId") != null){
1085                         currentActiveReq.setConfigurationId(instanceIdMap.get("configurationInstanceId"));
1086                 }
1087                 if(instanceIdMap.get("InstanceGroupInstanceId") != null){
1088                         currentActiveReq.setInstanceGroupId(instanceIdMap.get("InstanceGroupInstanceId"));
1089                 }
1090                 }
1091         }
1092
1093     protected String mapJSONtoMSOStyle(String msoRawRequest, ServiceInstancesRequest serviceInstRequest, boolean isAlaCarte, Actions action) throws IOException {
1094         ObjectMapper mapper = new ObjectMapper();       
1095         mapper.setSerializationInclusion(Include.NON_NULL);     
1096         if(msoRawRequest != null){
1097                 ServiceInstancesRequest sir = mapper.readValue(msoRawRequest, ServiceInstancesRequest.class);           
1098                 if(     !isAlaCarte && Action.createInstance.equals(action) && serviceInstRequest != null && 
1099                         serviceInstRequest.getRequestDetails() != null && 
1100                         serviceInstRequest.getRequestDetails().getRequestParameters() != null) {
1101                         sir.getRequestDetails().setCloudConfiguration(serviceInstRequest.getRequestDetails().getCloudConfiguration());
1102                         sir.getRequestDetails().getRequestParameters().setUserParams(serviceInstRequest.getRequestDetails().getRequestParameters().getUserParams());
1103                 }
1104                 msoLogger.debug("Value as string: " + mapper.writeValueAsString(sir));
1105                 return mapper.writeValueAsString(sir);
1106         }
1107         return null;
1108         }
1109
1110     private void buildErrorOnDuplicateRecord(InfraActiveRequests currentActiveReq, Actions action, HashMap<String, String> instanceIdMap, long startTime, MsoRequest msoRequest,
1111                                              String instanceName, String requestScope, InfraActiveRequests dup) throws ApiException {
1112
1113                 // Found the duplicate record. Return the appropriate error.
1114                 String instance = null;
1115                 if(instanceName != null){
1116                         instance = instanceName;
1117                 }else{
1118                         instance = instanceIdMap.get(requestScope + "InstanceId");
1119                 }
1120                 //List<String> variables = new ArrayList<String>();
1121                 //variables.add(dup.getRequestStatus());
1122         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_FOUND, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1123
1124
1125         DuplicateRequestException dupException = new DuplicateRequestException.Builder(requestScope,instance,dup.getRequestStatus(),dup.getRequestId(), HttpStatus.SC_CONFLICT, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR)
1126             .errorInfo(errorLoggerInfo).build();
1127
1128         updateStatus(currentActiveReq, Status.FAILED, dupException.getMessage());
1129
1130         throw dupException;
1131         }
1132
1133         private InfraActiveRequests duplicateCheck(Actions action, HashMap<String, String> instanceIdMap, long startTime,
1134                                                MsoRequest msoRequest, String instanceName, String requestScope, InfraActiveRequests currentActiveReq) throws ApiException {
1135                 InfraActiveRequests dup = null;
1136                 try {
1137                         if(!(instanceName==null && requestScope.equals("service") && (action == Action.createInstance || action == Action.activateInstance || action == Action.assignInstance))){
1138                                 dup = infraActiveRequestsClient.checkInstanceNameDuplicate (instanceIdMap, instanceName, requestScope);
1139                         }
1140                 } catch (Exception e) {
1141             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1142             RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1143                     .errorInfo(errorLoggerInfo).build();
1144             updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
1145             throw requestDbFailureException;
1146                 }
1147                 return dup;
1148         }
1149
1150         private ServiceInstancesRequest convertJsonToServiceInstanceRequest(String requestJSON, Actions action, long startTime,
1151                                                                         ServiceInstancesRequest sir, MsoRequest msoRequest, String requestId, String requestUri) throws ApiException {
1152                 try{
1153                         ObjectMapper mapper = new ObjectMapper();
1154                         return mapper.readValue(requestJSON, ServiceInstancesRequest.class);
1155
1156         } catch (IOException e) {
1157
1158             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1159
1160             ValidateException validateException = new ValidateException.Builder("Error mapping request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1161                     .errorInfo(errorLoggerInfo).build();
1162             String requestScope = requestScopeFromUri(requestUri);
1163
1164             msoRequest.createErrorRequestRecord(Status.FAILED, requestId, validateException.getMessage(), action, requestScope, requestJSON);
1165
1166             throw validateException;
1167                 }
1168         }
1169         
1170         private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version, 
1171                                                                 String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
1172                 int reqVersion = Integer.parseInt(version.substring(1));
1173                 try {
1174                         msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
1175                 } catch (Exception e) {
1176                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1177                 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1178                  .errorInfo(errorLoggerInfo).build();
1179
1180                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1181
1182                 throw validateException;
1183                 }
1184         }
1185
1186     private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag, 
1187                                                                                                                                 InfraActiveRequests currentActiveReq) throws ApiException {
1188                 RecipeLookupResult recipeLookupResult = null;
1189         //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1190                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1191                 // Query MSO Catalog DB
1192                 
1193                 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1194                         recipeLookupResult = getDefaultVnfUri(sir, action);
1195         }else if(action == Action.addMembers || action == Action.removeMembers){
1196                 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1197         }else if (modelInfo.getModelType().equals(ModelType.service)) {
1198                         try {
1199                         recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1200                         } catch (IOException e) {
1201                                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1202
1203
1204                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1205                         .errorInfo(errorLoggerInfo).build();
1206
1207                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1208
1209                 throw validateException;
1210                         }
1211         } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1212                                 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1213             try {
1214                         recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1215             } catch (ValidationException e) {
1216                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1217
1218
1219                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1220                         .errorInfo(errorLoggerInfo).build();
1221
1222                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1223
1224                 throw validateException;
1225             }
1226                 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1227             try {
1228                         recipeLookupResult = getNetworkUri( sir, action);
1229             } catch (ValidationException e) {
1230
1231                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1232
1233
1234                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1235                         .errorInfo(errorLoggerInfo).build();
1236                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1237
1238                 throw validateException;
1239             }
1240         }else if(modelInfo.getModelType().equals(ModelType.instanceGroup)){
1241                 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1242         }
1243
1244         if (recipeLookupResult == null) {
1245             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1246
1247
1248             RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1249                     .errorInfo(errorLoggerInfo).build();
1250
1251             updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1252             throw recipeNotFoundExceptionException;
1253                 }
1254                 return recipeLookupResult;
1255         }
1256         
1257     private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1258                 // SERVICE REQUEST
1259                 // Construct the default service name
1260                 // TODO need to make this a configurable property
1261                 String defaultServiceModelName = getDefaultModel(servInstReq);
1262                 RequestDetails requestDetails = servInstReq.getRequestDetails();
1263                 ModelInfo modelInfo = requestDetails.getModelInfo();
1264                 org.onap.so.db.catalog.beans.Service serviceRecord;
1265                 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1266                 ServiceRecipe recipe = null;
1267                 
1268                 if(alaCarteFlag){
1269                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1270                         if(serviceRecord !=null){                                       
1271                                 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1272                         }
1273                 }else{
1274                         serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1275                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1276                         if (recipe == null){
1277                                 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1278                                 if(!serviceRecordList.isEmpty()){
1279                                         for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1280                                                 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1281                                                 if(recipe != null){
1282                                                         break;
1283                                                 }
1284                                         }
1285                                 }
1286                         }
1287                 }
1288                 
1289                 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1290                 RequestParameters reqParam = requestDetails.getRequestParameters();
1291                 if(reqParam!=null && alaCarteFlag && recipe==null){
1292                         return null;
1293                 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1294                         mapToLegacyRequest(requestDetails);
1295                 }else if (recipe == null) {  //aLaCarte wasn't sent, so we'll try the default
1296                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1297                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1298                 }
1299                 if(modelInfo.getModelVersionId() == null) {
1300                         modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1301                 }
1302                 if(recipe==null){
1303                         return null;
1304                 }
1305                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1306         }
1307
1308         protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1309                 RequestParameters reqParam;
1310                 if (requestDetails.getRequestParameters() == null) {
1311                         reqParam = new RequestParameters();
1312                 } else {
1313                         reqParam = requestDetails.getRequestParameters();
1314                 }
1315                 if(requestDetails.getCloudConfiguration() == null) {
1316                         CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1317                         if(cloudConfig != null) {
1318                                 requestDetails.setCloudConfiguration(cloudConfig);
1319                         }
1320                 }
1321                 
1322                 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1323                 if(!userParams.isEmpty()) {
1324                         if (reqParam == null) {
1325                                 requestDetails.setRequestParameters(new RequestParameters());
1326                         }
1327                         requestDetails.getRequestParameters().setUserParams(userParams);
1328                 }
1329         }
1330
1331         protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1332
1333                 for(Map<String, Object> params : reqParams.getUserParams()){
1334                         if(params.containsKey("service")){
1335                                 Service service = serviceMapper(params);
1336                                 
1337                                 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1338                                 
1339                                 if (targetConfiguration.isPresent()) {
1340                                         return targetConfiguration.get();
1341                                 } else {
1342                                         for(Networks network : service.getResources().getNetworks()) {
1343                                                 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1344                                                 if(targetConfiguration.isPresent()) {
1345                                                         return targetConfiguration.get();
1346                                                 }
1347                                         }
1348                                 
1349                                         for(Vnfs vnf : service.getResources().getVnfs()) {
1350                                                 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1351                                                 
1352                                                 if(targetConfiguration.isPresent()) {
1353                                                         return targetConfiguration.get();
1354                                                 }
1355                                                 
1356                                                 for(VfModules vfModule : vnf.getVfModules()) {
1357                                                         targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1358                                                         
1359                                                         if(targetConfiguration.isPresent()) {
1360                                                                 return targetConfiguration.get();
1361                                                         }
1362                                                 }
1363                                         }
1364                                 }
1365                         }
1366         }
1367         
1368         return null;
1369         }
1370
1371         private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1372                 CloudConfiguration targetConfiguration = new CloudConfiguration();
1373                 if(sourceCloudConfiguration != null) {
1374                         targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1375                         targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1376                         targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1377                         targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1378                         return Optional.of(targetConfiguration);
1379                 }
1380                 return Optional.empty();
1381         }
1382
1383         protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1384         msoLogger.debug("Configuring UserParams for Macro Request");
1385         Map<String, Object> userParams = new HashMap<>();
1386         
1387         for(Map<String, Object> params : reqParams.getUserParams()){
1388                 if(params.containsKey("service")){
1389                         Service service = serviceMapper(params);
1390                                 
1391                                 addUserParams(userParams, service.getInstanceParams());
1392                                 
1393                                 for(Networks network : service.getResources().getNetworks()) {
1394                                         addUserParams(userParams, network.getInstanceParams());
1395                                 }
1396                                 
1397                                 for(Vnfs vnf: service.getResources().getVnfs()) {
1398                                         addUserParams(userParams, vnf.getInstanceParams());
1399                                         
1400                                         for(VfModules vfModule: vnf.getVfModules()) {
1401                                                 addUserParams(userParams, vfModule.getInstanceParams());
1402                                         }
1403                                 }
1404                 }
1405         }
1406         
1407         return mapFlatMapToNameValue(userParams);
1408     }
1409
1410         private Service serviceMapper(Map<String, Object> params)
1411                         throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1412                 ObjectMapper obj = new ObjectMapper();
1413                 String input = obj.writeValueAsString(params.get("service"));
1414                 return obj.readValue(input, Service.class);
1415         }
1416
1417         private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1418                 for(Map<String, String> map : sourceUserParams) {
1419                         for (Map.Entry<String, String> entry : map.entrySet()) {
1420                                 targetUserParams.put(entry.getKey(), entry.getValue());
1421                         }
1422                 }
1423         }
1424         
1425         protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1426                 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1427                 
1428                 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1429                         Map<String, Object> targetMap = new HashMap<>();
1430                         targetMap.put(NAME, map.getKey());
1431                         targetMap.put(VALUE, map.getValue());
1432                         targetUserParams.add(targetMap);
1433                 }
1434                 return targetUserParams;
1435         }
1436
1437     private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1438
1439                 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1440                 String vnfComponentType = modelInfo.getModelType().name();
1441
1442                 RelatedInstanceList[] instanceList = null;
1443                 if (servInstReq.getRequestDetails() != null) {
1444                         instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1445                 }
1446
1447                 Recipe recipe = null;
1448                 String defaultSource = getDefaultModel(servInstReq);
1449                 String modelCustomizationId = modelInfo.getModelCustomizationId();
1450                 String modelCustomizationName = modelInfo.getModelCustomizationName();
1451                 String relatedInstanceModelVersionId = null;
1452                 String relatedInstanceModelInvariantId = null;
1453                 String relatedInstanceVersion = null;
1454                 String relatedInstanceModelCustomizationName = null;
1455
1456                 if (instanceList != null) {
1457
1458                         for(RelatedInstanceList relatedInstanceList : instanceList){
1459
1460                                 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1461                                 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1462                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1463                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1464                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1465                                 }
1466
1467                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1468                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1469                                         relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1470                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1471                                         relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1472                                 }
1473                         }
1474
1475                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1476                                 //                      a.      For a vnf request (only create, no update currently): 
1477                                 //                              i.      (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1478                                 //                              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 
1479                                 //                                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName 
1480                 //                                      to Ã¢â‚¬Å“join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid  record exists.
1481                                 //                              **If relatedInstance.modelInfo[service].modelVersionId  was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId 
1482                                 //                                      (MODEL_UUID) in SERVICE table.
1483                                 //                              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 
1484                                 //                                      during 1707 data migration if VID did not provide it originally on request.
1485                 //                              iv.     Note: continue to construct the Ã¢â‚¬Å“vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1486                                 //                              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.
1487
1488                                 VnfResource vnfResource = null;
1489                                 VnfResourceCustomization vrc=null;
1490                                 // Validation for vnfResource
1491
1492                                 if(modelCustomizationId!=null) {
1493                     vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1494                     if(vrc != null){
1495                         vnfResource = vrc.getVnfResources();
1496                     }
1497                                 } else {
1498                                         org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1499                                         if(service == null) {
1500                                                 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1501                                         }
1502
1503                                 if(service == null) {
1504                                         throw new ValidationException("service in relatedInstance");
1505                                 }
1506                     for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1507                         if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1508                                                 vrc=vnfResourceCustom;
1509                         }
1510                     }
1511                                         
1512                                         if(vrc != null) {
1513                                                 vnfResource = vrc.getVnfResources();
1514                         modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1515                         modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1516                                         }
1517                                 }
1518
1519                                 if(vnfResource==null){
1520                                         throw new ValidationException("vnfResource");
1521                                 } else {
1522                                         if(modelInfo.getModelVersionId() == null) {
1523                         modelInfo.setModelVersionId(vnfResource.getModelUUID());
1524                                         }
1525                                 }
1526
1527                                 VnfRecipe vnfRecipe = null;
1528                                 
1529                                 if(vrc != null) {
1530                                         String nfRole = vrc.getNfRole();
1531                                         if(nfRole != null) {
1532                                                 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1533                                         }
1534                                 }
1535
1536                                 if(vnfRecipe == null) {
1537                                         vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1538                                 }
1539
1540                                 if (vnfRecipe == null) {
1541                                         return null;
1542                                 }
1543
1544                                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1545                         } else {
1546                                 /*                              (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have 
1547                                 //                              been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName 
1548                                 //                              to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid  record exists.
1549                                 //                              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. 
1550                                 //                              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 
1551                                 //                              confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found 
1552                                 //                      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) 
1553                                 //                              and MODEL_VERSION (modelVersion).
1554                                 */
1555                                 VfModuleCustomization vfmc = null;
1556                                 VnfResource vnfr;
1557                                 VnfResourceCustomization vnfrc;
1558                                 VfModule vfModule = null;
1559
1560                                 if(modelInfo.getModelCustomizationId() != null) {
1561                                         vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1562                                 } else {
1563                                         vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1564                                         if(vnfr == null){
1565                                                 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1566                                         }
1567                                         vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1568                                         
1569                                         List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1570                                                         
1571                                         String vfModuleModelUUID = modelInfo.getModelVersionId();
1572                                         for(VfModuleCustomization vf : list) {
1573                                                 VfModuleCustomization vfmCustom;
1574                                                 if(vfModuleModelUUID != null){
1575                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1576                                                         if(vfmCustom != null){
1577                                                                 vfModule = vfmCustom.getVfModule();
1578                                                         }
1579                                                 }else{ 
1580                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1581                                                         if(vfmCustom != null){
1582                                                                 vfModule = vfmCustom.getVfModule();
1583                                                         }else{
1584                                                                 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1585                                                         }
1586                                                 }
1587                                                 
1588                                                 if(vfModule != null) {
1589                                                         modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1590                                                         modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1591                                                         break;
1592                                                 }
1593                                         }
1594                                 }
1595
1596                                 if(vfmc == null && vfModule == null) {
1597                                         throw new ValidationException("vfModuleCustomization");
1598                                 } else if (vfModule == null && vfmc != null) {
1599                                         vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1600                                 }
1601
1602                                 if(modelInfo.getModelVersionId() == null) {
1603                                         modelInfo.setModelVersionId(vfModule.getModelUUID());
1604                                 }
1605                                 
1606                                 
1607                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1608                                 if(recipe == null){
1609                                         List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1610                                         if(!vfModuleRecords.isEmpty()){
1611                                                 for(VfModule record : vfModuleRecords){
1612                                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1613                                                         if(recipe != null){
1614                                                                 break;
1615                                                         }
1616                                                 }
1617                                         }
1618                                 }
1619                                 if(recipe == null) {
1620                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1621                                         if (recipe == null) { 
1622                                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1623                                         }
1624
1625                                         if(recipe == null) {
1626                                                 return null;
1627                                         }
1628                                 }
1629                         }
1630                 } else {
1631
1632                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1633                                 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1634                                 if (recipe == null) {
1635                                         return null;
1636                                 }
1637                         } else {
1638                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1639
1640                                 if (recipe == null) {
1641                                         return null;
1642                                 }
1643                         }
1644                 }
1645
1646                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1647         }
1648         
1649     private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1650         
1651                 String defaultSource = getDefaultModel(sir);
1652
1653                 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1654
1655                 if (vnfRecipe == null) {
1656                         return null;
1657                 }
1658
1659                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());          
1660         }
1661
1662
1663     private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1664
1665                 String defaultNetworkType = getDefaultModel(sir);
1666
1667                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1668                 String modelName = modelInfo.getModelName();
1669                 Recipe recipe = null;
1670
1671                 if(modelInfo.getModelCustomizationId()!=null){
1672             NetworkResource networkResource = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
1673                         if(networkResource!=null){
1674                                 if(modelInfo.getModelVersionId() == null) {
1675                                         modelInfo.setModelVersionId(networkResource.getModelUUID());
1676                                 }
1677                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1678                         }else{
1679                                 throw new ValidationException("no catalog entry found");
1680                         }
1681                 }else{
1682                         //ok for version < 3 and action delete
1683                         if(modelName != null){
1684                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1685                         }
1686                 }
1687
1688                 if(recipe == null){
1689                         recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1690                 }
1691                 
1692                 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1693         }
1694     
1695     private Optional<String> retrieveModelName(RequestParameters requestParams) {
1696         String requestTestApi = null;
1697         TestApi testApi = null;
1698         
1699         if (requestParams != null) {
1700                 requestTestApi = requestParams.getTestApi();
1701         }
1702         
1703         if (requestTestApi == null) {
1704                 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1705                         requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1706                 } else {
1707                         requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1708                 }
1709         }
1710         
1711                 try {
1712                         testApi = TestApi.valueOf(requestTestApi);
1713                         return Optional.of(testApi.getModelName());
1714                 } catch (Exception e) {
1715                         msoLogger.warnSimple("Catching the exception on the valueOf enum call and continuing", e);
1716                         throw new IllegalArgumentException("Invalid TestApi is provided", e);
1717                 }
1718     }
1719     
1720     private String getDefaultModel(ServiceInstancesRequest sir) {
1721         String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1722         Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1723                 if (oModelName.isPresent()) {
1724                         defaultModel = oModelName.get();
1725                 }
1726                 return defaultModel;
1727     }
1728         
1729     private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1730                 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1731                 Boolean aLaCarte = null;
1732                 String apiVersion = version.substring(1);
1733                 
1734                 long startTime = System.currentTimeMillis ();
1735                 ServiceInstancesRequest sir = null;             
1736
1737                 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1738                 String requestScope = deriveRequestScope(action,sir, requestUri);
1739                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject ( sir,  action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1740                 if(sir.getRequestDetails().getRequestParameters() != null){
1741                         aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1742                 }
1743                 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1744                 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1745                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1746
1747                 InfraActiveRequests dup = null;
1748                 
1749                 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1750
1751                 if (instanceIdMap != null && dup != null) {
1752             buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1753                 }
1754                 
1755                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1756                 RequestReferences referencesResponse = new RequestReferences();
1757                 referencesResponse.setRequestId(requestId);
1758                 serviceResponse.setRequestReferences(referencesResponse);
1759                 
1760                 
1761                 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1762                 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1763                 
1764                 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1765                         String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1766                         
1767             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1768
1769
1770             ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1771                     .errorInfo(errorLoggerInfo).build();
1772
1773             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1774
1775             throw validateException;
1776                         
1777                 }
1778                 
1779                 serviceInstanceId = "";
1780                 String configurationId = "";
1781                 String correlationId = "";
1782
1783                 if(sir.getServiceInstanceId () != null){
1784                         serviceInstanceId = sir.getServiceInstanceId ();
1785                 }
1786
1787                 if(sir.getConfigurationId() != null){
1788             configurationId = sir.getConfigurationId();
1789         }
1790
1791         correlationId = getCorrelationId(sir);
1792
1793                 try{
1794                         infraActiveRequestsClient.save(currentActiveReq);
1795                 }catch(Exception e){
1796                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1797             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1798                     .errorInfo(errorLoggerInfo).build();
1799                 }
1800                 
1801                 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1802                         aLaCarte = true;
1803                 }else if(aLaCarte == null){
1804                         aLaCarte = false;
1805                 }
1806                 RequestClientParameter requestClientParameter = null;
1807                 try {
1808                         requestClientParameter = new RequestClientParameter.Builder()
1809                                 .setRequestId(requestId)
1810                                 .setBaseVfModule(false)
1811                                 .setRecipeTimeout(Integer.parseInt(timeOut))
1812                                 .setRequestAction(action.toString())
1813                                 .setServiceInstanceId(serviceInstanceId)
1814                                 .setCorrelationId(correlationId)
1815                                 .setConfigurationId(configurationId)
1816                                 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1817                                 .setApiVersion(apiVersion)
1818                                 .setALaCarte(aLaCarte)
1819                                 .setRequestUri(requestUri).build();
1820                 } catch (IOException e) {
1821                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1822                         throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1823                             .errorInfo(errorLoggerInfo).build();
1824                 }
1825                                 
1826                         return postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri, requestScope);
1827         }
1828
1829     public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1830         String requestId = null;
1831         if (requestContext.getProperty("requestId") != null) {
1832                 requestId = requestContext.getProperty("requestId").toString();
1833         }
1834         if (UUIDChecker.isValidUUID(requestId)) {
1835                 return requestId;
1836         } else {
1837                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1838                         ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1839                             .errorInfo(errorLoggerInfo).build();
1840                         
1841                         throw validateException;
1842         }
1843     }
1844         public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1845                 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1846                         aq.setStatusMessage (errorMessage);
1847                         aq.setProgress(new Long(100));
1848                         aq.setRequestStatus(status.toString());
1849                         Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1850                         aq.setEndTime (endTimeStamp);
1851                         try{
1852                                 infraActiveRequestsClient.save(aq);
1853                         }catch(Exception e){
1854                                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1855                     throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1856                             .errorInfo(errorLoggerInfo).build();
1857                         }
1858                 }
1859         }
1860 }