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