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