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