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