Merge "improvements to audit inventory feature"
[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                         logger.error("failed to parse request", e);
1253                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1254                 ValidateException validateException = new ValidateException.Builder("Error parsing request: " + e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1255                  .errorInfo(errorLoggerInfo).build();
1256
1257                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1258
1259                 throw validateException;
1260                 }
1261         }
1262
1263     private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag, 
1264                                                                                                                                 InfraActiveRequests currentActiveReq) throws ApiException {
1265                 RecipeLookupResult recipeLookupResult = null;
1266         //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
1267                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1268                 // Query MSO Catalog DB
1269                 
1270                 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
1271                         recipeLookupResult = getDefaultVnfUri(sir, action);
1272         }else if(action == Action.addMembers || action == Action.removeMembers){
1273                 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1274         }else if (modelInfo.getModelType().equals(ModelType.service)) {
1275                         try {
1276                         recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
1277                         } catch (IOException e) {
1278                                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1279
1280
1281                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1282                         .errorInfo(errorLoggerInfo).build();
1283
1284                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1285
1286                 throw validateException;
1287                         }
1288         } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
1289                                 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
1290             try {
1291                         recipeLookupResult = getVnfOrVfModuleUri( sir, action);
1292             } catch (ValidationException e) {
1293                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1294
1295
1296                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1297                         .errorInfo(errorLoggerInfo).build();
1298
1299                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1300
1301                 throw validateException;
1302             }
1303                 }else if (modelInfo.getModelType().equals(ModelType.network)) {
1304             try {
1305                         recipeLookupResult = getNetworkUri( sir, action);
1306             } catch (ValidationException e) {
1307
1308                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1309
1310
1311                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
1312                         .errorInfo(errorLoggerInfo).build();
1313                 updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1314
1315                 throw validateException;
1316             }
1317         }else if(modelInfo.getModelType().equals(ModelType.instanceGroup)){
1318                 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1319         }
1320
1321         if (recipeLookupResult == null) {
1322             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1323
1324
1325             RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1326                     .errorInfo(errorLoggerInfo).build();
1327
1328             updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
1329             throw recipeNotFoundExceptionException;
1330                 }
1331                 return recipeLookupResult;
1332         }
1333         
1334     private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
1335                 // SERVICE REQUEST
1336                 // Construct the default service name
1337                 // TODO need to make this a configurable property
1338                 String defaultServiceModelName = getDefaultModel(servInstReq);
1339                 RequestDetails requestDetails = servInstReq.getRequestDetails();
1340                 ModelInfo modelInfo = requestDetails.getModelInfo();
1341                 org.onap.so.db.catalog.beans.Service serviceRecord;
1342                 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
1343                 ServiceRecipe recipe = null;
1344                 
1345                 if(alaCarteFlag){
1346                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1347                         if(serviceRecord !=null){                                       
1348                                 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1349                         }
1350                 }else{
1351                         serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
1352                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
1353                         if (recipe == null){
1354                                 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
1355                                 if(!serviceRecordList.isEmpty()){
1356                                         for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1357                                                 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1358                                                 if(recipe != null){
1359                                                         break;
1360                                                 }
1361                                         }
1362                                 }
1363                         }
1364                 }
1365                 
1366                 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1367                 RequestParameters reqParam = requestDetails.getRequestParameters();
1368                 if(reqParam!=null && alaCarteFlag && recipe==null){
1369                         return null;
1370                 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1371                         mapToLegacyRequest(requestDetails);
1372                 }else if (recipe == null) {  //aLaCarte wasn't sent, so we'll try the default
1373                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1374                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1375                 }
1376                 if(modelInfo.getModelVersionId() == null) {
1377                         modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1378                 }
1379                 if(recipe==null){
1380                         return null;
1381                 }
1382                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1383         }
1384
1385         protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1386                 RequestParameters reqParam;
1387                 if (requestDetails.getRequestParameters() == null) {
1388                         reqParam = new RequestParameters();
1389                 } else {
1390                         reqParam = requestDetails.getRequestParameters();
1391                 }
1392                 if(requestDetails.getCloudConfiguration() == null) {
1393                         CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1394                         if(cloudConfig != null) {
1395                                 requestDetails.setCloudConfiguration(cloudConfig);
1396                         }
1397                 }
1398                 
1399                 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1400                 if(!userParams.isEmpty()) {
1401                         if (reqParam == null) {
1402                                 requestDetails.setRequestParameters(new RequestParameters());
1403                         }
1404                         requestDetails.getRequestParameters().setUserParams(userParams);
1405                 }
1406         }
1407
1408         protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1409
1410                 for(Map<String, Object> params : reqParams.getUserParams()){
1411                         if(params.containsKey("service")){
1412                                 Service service = serviceMapper(params);
1413                                 
1414                                 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1415                                 
1416                                 if (targetConfiguration.isPresent()) {
1417                                         return targetConfiguration.get();
1418                                 } else {
1419                                         for(Networks network : service.getResources().getNetworks()) {
1420                                                 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1421                                                 if(targetConfiguration.isPresent()) {
1422                                                         return targetConfiguration.get();
1423                                                 }
1424                                         }
1425                                 
1426                                         for(Vnfs vnf : service.getResources().getVnfs()) {
1427                                                 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1428                                                 
1429                                                 if(targetConfiguration.isPresent()) {
1430                                                         return targetConfiguration.get();
1431                                                 }
1432                                                 
1433                                                 for(VfModules vfModule : vnf.getVfModules()) {
1434                                                         targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1435                                                         
1436                                                         if(targetConfiguration.isPresent()) {
1437                                                                 return targetConfiguration.get();
1438                                                         }
1439                                                 }
1440                                         }
1441                                 }
1442                         }
1443         }
1444         
1445         return null;
1446         }
1447
1448         private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1449                 CloudConfiguration targetConfiguration = new CloudConfiguration();
1450                 if(sourceCloudConfiguration != null) {
1451                         targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1452                         targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1453                         targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1454                         targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1455                         return Optional.of(targetConfiguration);
1456                 }
1457                 return Optional.empty();
1458         }
1459
1460         protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1461         logger.debug("Configuring UserParams for Macro Request");
1462         Map<String, Object> userParams = new HashMap<>();
1463         
1464         for(Map<String, Object> params : reqParams.getUserParams()){
1465                 if(params.containsKey("service")){
1466                         Service service = serviceMapper(params);
1467                                 
1468                                 addUserParams(userParams, service.getInstanceParams());
1469                                 
1470                                 for(Networks network : service.getResources().getNetworks()) {
1471                                         addUserParams(userParams, network.getInstanceParams());
1472                                 }
1473                                 
1474                                 for(Vnfs vnf: service.getResources().getVnfs()) {
1475                                         addUserParams(userParams, vnf.getInstanceParams());
1476                                         
1477                                         for(VfModules vfModule: vnf.getVfModules()) {
1478                                                 addUserParams(userParams, vfModule.getInstanceParams());
1479                                         }
1480                                 }
1481                 }
1482         }
1483         
1484         return mapFlatMapToNameValue(userParams);
1485     }
1486
1487         private Service serviceMapper(Map<String, Object> params)
1488                         throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1489                 ObjectMapper obj = new ObjectMapper();
1490                 String input = obj.writeValueAsString(params.get("service"));
1491                 return obj.readValue(input, Service.class);
1492         }
1493
1494         private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1495                 for(Map<String, String> map : sourceUserParams) {
1496                         for (Map.Entry<String, String> entry : map.entrySet()) {
1497                                 targetUserParams.put(entry.getKey(), entry.getValue());
1498                         }
1499                 }
1500         }
1501         
1502         protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1503                 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1504                 
1505                 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1506                         Map<String, Object> targetMap = new HashMap<>();
1507                         targetMap.put(NAME, map.getKey());
1508                         targetMap.put(VALUE, map.getValue());
1509                         targetUserParams.add(targetMap);
1510                 }
1511                 return targetUserParams;
1512         }
1513
1514     private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1515
1516                 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1517                 String vnfComponentType = modelInfo.getModelType().name();
1518
1519                 RelatedInstanceList[] instanceList = null;
1520                 if (servInstReq.getRequestDetails() != null) {
1521                         instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1522                 }
1523
1524                 Recipe recipe = null;
1525                 String defaultSource = getDefaultModel(servInstReq);
1526                 String modelCustomizationId = modelInfo.getModelCustomizationId();
1527                 String modelCustomizationName = modelInfo.getModelCustomizationName();
1528                 String relatedInstanceModelVersionId = null;
1529                 String relatedInstanceModelInvariantId = null;
1530                 String relatedInstanceVersion = null;
1531                 String relatedInstanceModelCustomizationName = null;
1532
1533                 if (instanceList != null) {
1534
1535                         for(RelatedInstanceList relatedInstanceList : instanceList){
1536
1537                                 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1538                                 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1539                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1540                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1541                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1542                                 }
1543
1544                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1545                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1546                                         relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1547                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1548                                         relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1549                                 }
1550                         }
1551
1552                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1553                                 //                      a.      For a vnf request (only create, no update currently): 
1554                                 //                              i.      (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1555                                 //                              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 
1556                                 //                                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName 
1557                 //                                      to Ã¢â‚¬Å“join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid  record exists.
1558                                 //                              **If relatedInstance.modelInfo[service].modelVersionId  was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId 
1559                                 //                                      (MODEL_UUID) in SERVICE table.
1560                                 //                              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 
1561                                 //                                      during 1707 data migration if VID did not provide it originally on request.
1562                 //                              iv.     Note: continue to construct the Ã¢â‚¬Å“vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1563                                 //                              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.
1564
1565                                 VnfResource vnfResource = null;
1566                                 VnfResourceCustomization vrc=null;
1567                                 // Validation for vnfResource
1568
1569                                 if(modelCustomizationId!=null) {
1570                     vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1571                     if(vrc != null){
1572                         vnfResource = vrc.getVnfResources();
1573                     }
1574                                 } else {
1575                                         org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1576                                         if(service == null) {
1577                                                 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1578                                         }
1579
1580                                 if(service == null) {
1581                                         throw new ValidationException("service in relatedInstance");
1582                                 }
1583                     for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1584                         if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1585                                                 vrc=vnfResourceCustom;
1586                         }
1587                     }
1588                                         
1589                                         if(vrc != null) {
1590                                                 vnfResource = vrc.getVnfResources();
1591                         modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1592                         modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1593                                         }
1594                                 }
1595
1596                                 if(vnfResource==null){
1597                                         throw new ValidationException("vnfResource");
1598                                 } else {
1599                                         if(modelInfo.getModelVersionId() == null) {
1600                         modelInfo.setModelVersionId(vnfResource.getModelUUID());
1601                                         }
1602                                 }
1603
1604                                 VnfRecipe vnfRecipe = null;
1605                                 
1606                                 if(vrc != null) {
1607                                         String nfRole = vrc.getNfRole();
1608                                         if(nfRole != null) {
1609                                                 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1610                                         }
1611                                 }
1612
1613                                 if(vnfRecipe == null) {
1614                                         vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1615                                 }
1616
1617                                 if (vnfRecipe == null) {
1618                                         return null;
1619                                 }
1620
1621                                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1622                         } else {
1623                                 /*                              (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have 
1624                                 //                              been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName 
1625                                 //                              to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid  record exists.
1626                                 //                              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. 
1627                                 //                              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 
1628                                 //                              confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found 
1629                                 //                      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) 
1630                                 //                              and MODEL_VERSION (modelVersion).
1631                                 */
1632                                 VfModuleCustomization vfmc = null;
1633                                 VnfResource vnfr;
1634                                 VnfResourceCustomization vnfrc;
1635                                 VfModule vfModule = null;
1636
1637                                 if(modelInfo.getModelCustomizationId() != null) {
1638                                         vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1639                                 } else {
1640                                         vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1641                                         if(vnfr == null){
1642                                                 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1643                                         }
1644                                         vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1645                                         
1646                                         List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1647                                                         
1648                                         String vfModuleModelUUID = modelInfo.getModelVersionId();
1649                                         for(VfModuleCustomization vf : list) {
1650                                                 VfModuleCustomization vfmCustom;
1651                                                 if(vfModuleModelUUID != null){
1652                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1653                                                         if(vfmCustom != null){
1654                                                                 vfModule = vfmCustom.getVfModule();
1655                                                         }
1656                                                 }else{ 
1657                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1658                                                         if(vfmCustom != null){
1659                                                                 vfModule = vfmCustom.getVfModule();
1660                                                         }else{
1661                                                                 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1662                                                         }
1663                                                 }
1664                                                 
1665                                                 if(vfModule != null) {
1666                                                         modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1667                                                         modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1668                                                         break;
1669                                                 }
1670                                         }
1671                                 }
1672
1673                                 if(vfmc == null && vfModule == null) {
1674                                         throw new ValidationException("vfModuleCustomization");
1675                                 } else if (vfModule == null && vfmc != null) {
1676                                         vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1677                                 }
1678
1679                                 if(modelInfo.getModelVersionId() == null) {
1680                                         modelInfo.setModelVersionId(vfModule.getModelUUID());
1681                                 }
1682                                 
1683                                 
1684                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1685                                 if(recipe == null){
1686                                         List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1687                                         if(!vfModuleRecords.isEmpty()){
1688                                                 for(VfModule record : vfModuleRecords){
1689                                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1690                                                         if(recipe != null){
1691                                                                 break;
1692                                                         }
1693                                                 }
1694                                         }
1695                                 }
1696                                 if(recipe == null) {
1697                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1698                                         if (recipe == null) { 
1699                                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1700                                         }
1701
1702                                         if(recipe == null) {
1703                                                 return null;
1704                                         }
1705                                 }
1706                         }
1707                 } else {
1708
1709                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1710                                 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1711                                 if (recipe == null) {
1712                                         return null;
1713                                 }
1714                         } else {
1715                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1716
1717                                 if (recipe == null) {
1718                                         return null;
1719                                 }
1720                         }
1721                 }
1722
1723                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1724         }
1725         
1726     private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1727         
1728                 String defaultSource = getDefaultModel(sir);
1729
1730                 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1731
1732                 if (vnfRecipe == null) {
1733                         return null;
1734                 }
1735
1736                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());          
1737         }
1738
1739
1740     private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1741
1742                 String defaultNetworkType = getDefaultModel(sir);
1743
1744                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1745                 String modelName = modelInfo.getModelName();
1746                 Recipe recipe = null;
1747
1748                 if(modelInfo.getModelCustomizationId()!=null){
1749             NetworkResourceCustomization networkResourceCustomization = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1750                         if(networkResourceCustomization != null){
1751                                 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1752                         if(networkResource!=null){
1753                                 if(modelInfo.getModelVersionId() == null) {
1754                                         modelInfo.setModelVersionId(networkResource.getModelUUID());
1755                                 }
1756                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1757                         }else{
1758                                 throw new ValidationException("no catalog entry found");
1759                         }
1760                         }else if(action != Action.deleteInstance){
1761                                 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1762                         }
1763                 }else{
1764                         //ok for version < 3 and action delete
1765                         if(modelName != null){
1766                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1767                         }
1768                 }
1769
1770                 if(recipe == null){
1771                         recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1772                 }
1773                 
1774                 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1775         }
1776     
1777     private Optional<String> retrieveModelName(RequestParameters requestParams) {
1778         String requestTestApi = null;
1779         TestApi testApi = null;
1780         
1781         if (requestParams != null) {
1782                 requestTestApi = requestParams.getTestApi();
1783         }
1784         
1785         if (requestTestApi == null) {
1786                 if(requestParams != null && requestParams.getALaCarte() != null && !requestParams.getALaCarte()) {
1787                         requestTestApi = env.getProperty(CommonConstants.MACRO_TEST_API);
1788                 } else {
1789                         requestTestApi = env.getProperty(CommonConstants.ALACARTE_TEST_API);
1790                 }
1791         }
1792         
1793                 try {
1794                         testApi = TestApi.valueOf(requestTestApi);
1795                         return Optional.of(testApi.getModelName());
1796                 } catch (Exception e) {
1797                         logger.warn("Catching the exception on the valueOf enum call and continuing", e);
1798                         throw new IllegalArgumentException("Invalid TestApi is provided", e);
1799                 }
1800     }
1801     
1802     private String getDefaultModel(ServiceInstancesRequest sir) {
1803         String defaultModel = sir.getRequestDetails().getRequestInfo().getSource() + "_DEFAULT";
1804         Optional<String> oModelName = retrieveModelName(sir.getRequestDetails().getRequestParameters());
1805                 if (oModelName.isPresent()) {
1806                         defaultModel = oModelName.get();
1807                 }
1808                 return defaultModel;
1809     }
1810         
1811     private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1812                 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1813                 Boolean aLaCarte = null;
1814                 String apiVersion = version.substring(1);
1815                 boolean inProgress = false;
1816                 
1817                 long startTime = System.currentTimeMillis ();
1818                 ServiceInstancesRequest sir = null;             
1819
1820                 sir = convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1821                 String requestScope = deriveRequestScope(action,sir, requestUri);
1822                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject ( sir,  action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1823                 if(sir.getRequestDetails().getRequestParameters() != null){
1824                         aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1825                 }
1826                 parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1827                 setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1828                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1829
1830                 InfraActiveRequests dup = null;
1831                 
1832                 dup = duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1833                 
1834                 if(dup != null){
1835                         inProgress = camundaHistoryCheck(dup, currentActiveReq);
1836                 }
1837
1838                 if (instanceIdMap != null && dup != null && inProgress) {
1839             buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1840                 }
1841                 
1842                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1843                 RequestReferences referencesResponse = new RequestReferences();
1844                 referencesResponse.setRequestId(requestId);
1845                 serviceResponse.setRequestReferences(referencesResponse);
1846                 
1847                 
1848                 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1849                 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1850                 
1851                 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1852                         String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1853                         
1854             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1855
1856
1857             ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1858                     .errorInfo(errorLoggerInfo).build();
1859
1860             updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1861
1862             throw validateException;
1863                         
1864                 }
1865                 
1866                 serviceInstanceId = "";
1867                 String configurationId = "";
1868                 String pnfCorrelationId = "";
1869
1870                 if(sir.getServiceInstanceId () != null){
1871                         serviceInstanceId = sir.getServiceInstanceId ();
1872                 }
1873
1874                 if(sir.getConfigurationId() != null){
1875             configurationId = sir.getConfigurationId();
1876         }
1877
1878         pnfCorrelationId = getPnfCorrelationId(sir);
1879
1880                 try{
1881                         infraActiveRequestsClient.save(currentActiveReq);
1882                 }catch(Exception e){
1883                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1884             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1885                     .errorInfo(errorLoggerInfo).build();
1886                 }
1887                 
1888                 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1889                         aLaCarte = true;
1890                 }else if(aLaCarte == null){
1891                         aLaCarte = false;
1892                 }
1893                 RequestClientParameter requestClientParameter = null;
1894                 try {
1895                         requestClientParameter = new RequestClientParameter.Builder()
1896                                 .setRequestId(requestId)
1897                                 .setBaseVfModule(false)
1898                                 .setRecipeTimeout(Integer.parseInt(timeOut))
1899                                 .setRequestAction(action.toString())
1900                                 .setServiceInstanceId(serviceInstanceId)
1901                                 .setPnfCorrelationId(pnfCorrelationId)
1902                                 .setConfigurationId(configurationId)
1903                                 .setRequestDetails(mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1904                                 .setApiVersion(apiVersion)
1905                                 .setALaCarte(aLaCarte)
1906                                 .setRequestUri(requestUri).build();
1907                 } catch (IOException e) {
1908                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1909                         throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1910                             .errorInfo(errorLoggerInfo).build();
1911                 }
1912                                 
1913                         return postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri, requestScope);
1914         }
1915
1916         public String getRequestId(ContainerRequestContext requestContext) throws ValidateException {
1917         String requestId = null;
1918         if (requestContext.getProperty("requestId") != null) {
1919                 requestId = requestContext.getProperty("requestId").toString();
1920         }
1921         if (UUIDChecker.isValidUUID(requestId)) {
1922                 return requestId;
1923         } else {
1924                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1925                         ValidateException validateException = new ValidateException.Builder("Request Id " + requestId + " is not a valid UUID", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1926                             .errorInfo(errorLoggerInfo).build();
1927                         
1928                         throw validateException;
1929         }
1930     }
1931         public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
1932                 if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
1933                         aq.setStatusMessage (errorMessage);
1934                         aq.setProgress(new Long(100));
1935                         aq.setRequestStatus(status.toString());
1936                         Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
1937                         aq.setEndTime (endTimeStamp);
1938                         try{
1939                                 infraActiveRequestsClient.save(aq);
1940                         }catch(Exception e){
1941                                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1942                     throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1943                             .errorInfo(errorLoggerInfo).build();
1944                         }
1945                 }
1946         }
1947         protected String getServiceType(String requestScope, ServiceInstancesRequest sir, Boolean aLaCarteFlag){
1948                 String serviceType = null;
1949                 if(requestScope.equalsIgnoreCase(ModelType.service.toString())){
1950                         String defaultServiceModelName = getDefaultModel(sir);
1951                         org.onap.so.db.catalog.beans.Service serviceRecord;
1952                         if(aLaCarteFlag){
1953                                  serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1954                                  if(serviceRecord != null){
1955                                          serviceType = serviceRecord.getServiceType();
1956                                  }
1957                         }else{
1958                                 serviceRecord = catalogDbClient.getServiceByID(sir.getRequestDetails().getModelInfo().getModelVersionId());
1959                                 if(serviceRecord != null){
1960                                          serviceType = serviceRecord.getServiceType();
1961                                  }else{
1962                                          serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1963                                          if(serviceRecord != null){
1964                                                  serviceType = serviceRecord.getServiceType();
1965                                          }
1966                                  }
1967                         }
1968                 }else{
1969                         serviceType = msoRequest.getServiceInstanceType(sir, requestScope);
1970                 }
1971                 return serviceType;
1972         }
1973 }