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