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