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