ad97918a03df9b6df7d1e7bc46821ec3db46b08d
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / ServiceInstances.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7  * ================================================================================
8  * Modifications Copyright (c) 2019 Samsung
9  * ================================================================================
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  * 
14  *      http://www.apache.org/licenses/LICENSE-2.0
15  * 
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  * ============LICENSE_END=========================================================
22  */
23
24 package org.onap.so.apihandlerinfra;
25
26 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.HttpStatus;
34 import org.onap.so.apihandler.common.CommonConstants;
35 import org.onap.so.apihandler.common.ErrorNumbers;
36 import org.onap.so.apihandler.common.RequestClientParameter;
37 import org.onap.so.apihandlerinfra.exceptions.ApiException;
38 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
39 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
40 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
41 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
42 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
43 import org.onap.so.db.catalog.beans.NetworkResource;
44 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
45 import org.onap.so.db.catalog.beans.Recipe;
46 import org.onap.so.db.catalog.beans.ServiceRecipe;
47 import org.onap.so.db.catalog.beans.VfModule;
48 import org.onap.so.db.catalog.beans.VfModuleCustomization;
49 import org.onap.so.db.catalog.beans.VnfRecipe;
50 import org.onap.so.db.catalog.beans.VnfResource;
51 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
52 import org.onap.so.db.catalog.client.CatalogDbClient;
53 import org.onap.so.db.request.beans.InfraActiveRequests;
54 import org.onap.so.db.request.client.RequestsDbClient;
55 import org.onap.so.exceptions.ValidationException;
56 import org.onap.so.logger.ErrorCode;
57 import org.onap.so.logger.MessageEnum;
58 import org.onap.so.serviceinstancebeans.CloudConfiguration;
59 import org.onap.so.serviceinstancebeans.ModelInfo;
60 import org.onap.so.serviceinstancebeans.ModelType;
61 import org.onap.so.serviceinstancebeans.Networks;
62 import org.onap.so.serviceinstancebeans.RelatedInstance;
63 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
64 import org.onap.so.serviceinstancebeans.RequestDetails;
65 import org.onap.so.serviceinstancebeans.RequestParameters;
66 import org.onap.so.serviceinstancebeans.RequestReferences;
67 import org.onap.so.serviceinstancebeans.Service;
68 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
69 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
70 import org.onap.so.serviceinstancebeans.VfModules;
71 import org.onap.so.serviceinstancebeans.Vnfs;
72 import org.slf4j.Logger;
73 import org.slf4j.LoggerFactory;
74 import org.springframework.beans.factory.annotation.Autowired;
75 import org.springframework.core.env.Environment;
76 import org.springframework.stereotype.Component;
77
78 import javax.transaction.Transactional;
79 import javax.ws.rs.Consumes;
80 import javax.ws.rs.DELETE;
81 import javax.ws.rs.POST;
82 import javax.ws.rs.PUT;
83 import javax.ws.rs.Path;
84 import javax.ws.rs.PathParam;
85 import javax.ws.rs.Produces;
86 import javax.ws.rs.container.ContainerRequestContext;
87 import javax.ws.rs.core.Context;
88 import javax.ws.rs.core.MediaType;
89 import javax.ws.rs.core.Response;
90 import java.io.IOException;
91 import java.util.ArrayList;
92 import java.util.HashMap;
93 import java.util.List;
94 import java.util.Map;
95 import java.util.Optional;
96
97 @Component
98 @Path("/onap/so/infra/serviceInstantiation")
99 @Api(value="/onap/so/infra/serviceInstantiation",description="Infrastructure API Requests for Service Instances")
100 public class ServiceInstances {
101
102         private static Logger logger = LoggerFactory.getLogger(MsoRequest.class);
103         private static String NAME = "name";
104         private static String VALUE = "value";
105         private static String uriPrefix = "/serviceInstantiation/";
106         private static final String SAVE_TO_DB = "save instance to db";
107
108         @Autowired
109         private Environment env;
110         
111         @Autowired
112         private CatalogDbClient catalogDbClient;
113
114         @Autowired
115         private RequestsDbClient infraActiveRequestsClient;
116         
117         @Autowired
118         private MsoRequest msoRequest;
119         
120         @Autowired
121         private RequestHandlerUtils requestHandlerUtils;
122         
123         @POST
124     @Path("/{version:[vV][5-7]}/serviceInstances")
125         @Consumes(MediaType.APPLICATION_JSON)
126         @Produces(MediaType.APPLICATION_JSON)
127         @ApiOperation(value="Create a Service Instance on a version provided",response=Response.class)
128         @Transactional
129     public Response createServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
130                 String requestId = requestHandlerUtils.getRequestId(requestContext);
131                 return serviceInstances(request, Action.createInstance, null, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
132         }
133         
134         @POST
135         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
136         @Consumes(MediaType.APPLICATION_JSON)
137         @Produces(MediaType.APPLICATION_JSON)
138         @ApiOperation(value="Activate provided Service Instance",response=Response.class)
139         @Transactional
140     public Response activateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
141                 String requestId = requestHandlerUtils.getRequestId(requestContext);
142                 HashMap<String, String> instanceIdMap = new HashMap<>();
143                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
144                 return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
145         }
146         
147         @POST
148         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
149         @Consumes(MediaType.APPLICATION_JSON)
150         @Produces(MediaType.APPLICATION_JSON)
151         @ApiOperation(value="Deactivate provided Service Instance",response=Response.class)
152         @Transactional
153     public Response deactivateServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
154                 String requestId = requestHandlerUtils.getRequestId(requestContext);
155                 HashMap<String, String> instanceIdMap = new HashMap<>();
156                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
157                 return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
158         }
159         
160         @DELETE
161         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
162         @Consumes(MediaType.APPLICATION_JSON)
163         @Produces(MediaType.APPLICATION_JSON)
164         @ApiOperation(value="Delete provided Service Instance",response=Response.class)
165         @Transactional
166     public Response deleteServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
167                 String requestId = requestHandlerUtils.getRequestId(requestContext);
168                 HashMap<String, String> instanceIdMap = new HashMap<>();
169                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
170                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
171         }
172         
173         @POST
174         @Path("/{version:[vV][7]}/serviceInstances/assign")
175         @Consumes(MediaType.APPLICATION_JSON)
176         @Produces(MediaType.APPLICATION_JSON)
177         @ApiOperation(value="Assign Service Instance", response=Response.class)
178         @Transactional
179         public Response assignServiceInstance(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
180                 String requestId = requestHandlerUtils.getRequestId(requestContext);
181                 return serviceInstances(request, Action.assignInstance, null, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
182         }
183
184         @POST
185         @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
186         @Consumes(MediaType.APPLICATION_JSON)
187         @Produces(MediaType.APPLICATION_JSON)
188         @ApiOperation(value="Unassign Service Instance", response=Response.class)
189         @Transactional
190         public Response unassignServiceInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
191                 String requestId = requestHandlerUtils.getRequestId(requestContext);
192                 HashMap<String, String> instanceIdMap = new HashMap<String,String>();
193                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
194                 return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
195         }
196         
197         @POST
198         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
199         @Consumes(MediaType.APPLICATION_JSON)
200         @Produces(MediaType.APPLICATION_JSON)
201         @ApiOperation(value="Create Port Mirroring Configuration",response=Response.class)
202         @Transactional
203     public Response createPortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
204                 String requestId = requestHandlerUtils.getRequestId(requestContext);
205                 HashMap<String, String> instanceIdMap = new HashMap<>();
206                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
207                 return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
208         }
209         
210         @DELETE
211         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
212         @Consumes(MediaType.APPLICATION_JSON)
213         @Produces(MediaType.APPLICATION_JSON)
214         @ApiOperation(value="Delete provided Port",response=Response.class)
215         @Transactional
216         public Response deletePortConfiguration(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
217                                             @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
218                 String requestId = requestHandlerUtils.getRequestId(requestContext);
219                 HashMap<String, String> instanceIdMap = new HashMap<>();
220                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
221                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
222                 return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
223         }
224         
225         @POST
226         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
227         @Consumes(MediaType.APPLICATION_JSON)
228         @Produces(MediaType.APPLICATION_JSON)
229         @ApiOperation(value="Enable Port Mirroring",response=Response.class)
230         @Transactional
231         public Response enablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
232                                @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
233                 String requestId = requestHandlerUtils.getRequestId(requestContext);
234                 HashMap<String, String> instanceIdMap = new HashMap<>();
235                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
236                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
237                 return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
238         }
239         
240         @POST
241         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
242         @Consumes(MediaType.APPLICATION_JSON)
243         @Produces(MediaType.APPLICATION_JSON)
244         @ApiOperation(value="Disable Port Mirroring",response=Response.class)
245         @Transactional
246         public Response disablePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
247                                 @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
248                 String requestId = requestHandlerUtils.getRequestId(requestContext);
249                 HashMap<String, String> instanceIdMap = new HashMap<>();
250                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
251                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
252                 return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
253         }
254         
255         @POST
256         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
257         @Consumes(MediaType.APPLICATION_JSON)
258         @Produces(MediaType.APPLICATION_JSON)
259         @ApiOperation(value="Activate Port Mirroring",response=Response.class)
260         @Transactional
261         public Response activatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
262                                  @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
263                 String requestId = requestHandlerUtils.getRequestId(requestContext);
264                 HashMap<String, String> instanceIdMap = new HashMap<>();
265                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
266                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
267                 return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
268         }
269         
270         @POST
271         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
272         @Consumes(MediaType.APPLICATION_JSON)
273         @Produces(MediaType.APPLICATION_JSON)
274         @ApiOperation(value="Deactivate Port Mirroring",response=Response.class)
275         @Transactional
276         public Response deactivatePort(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
277                                    @PathParam("configurationInstanceId") String configurationInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
278                 String requestId = requestHandlerUtils.getRequestId(requestContext);
279                 HashMap<String, String> instanceIdMap = new HashMap<>();
280                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
281                 instanceIdMap.put("configurationInstanceId", configurationInstanceId);
282                 return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
283         }
284
285         @POST
286         @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
287         @Consumes(MediaType.APPLICATION_JSON)
288         @Produces(MediaType.APPLICATION_JSON)
289         @ApiOperation(value="Add Relationships to a Service Instance",response=Response.class)
290         @Transactional
291     public Response addRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
292                 String requestId = requestHandlerUtils.getRequestId(requestContext);
293                 HashMap<String, String> instanceIdMap = new HashMap<>();
294                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
295                 return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
296         }
297         
298         @POST
299         @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
300         @Consumes(MediaType.APPLICATION_JSON)
301         @Produces(MediaType.APPLICATION_JSON)
302         @ApiOperation(value="Remove Relationships from Service Instance",response=Response.class)
303         @Transactional
304     public Response removeRelationships(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
305                 String requestId = requestHandlerUtils.getRequestId(requestContext);
306                 HashMap<String, String> instanceIdMap = new HashMap<>();
307                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
308                 return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
309         }
310         
311         @POST
312         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
313         @Consumes(MediaType.APPLICATION_JSON)
314         @Produces(MediaType.APPLICATION_JSON)
315         @ApiOperation(value="Create VNF on a specified version and serviceInstance",response=Response.class)
316         @Transactional
317     public Response createVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
318                 String requestId = requestHandlerUtils.getRequestId(requestContext);
319                 HashMap<String, String> instanceIdMap = new HashMap<>();
320                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
321                 try{
322                         return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
323                 }catch (Exception e){
324                         logger.error("Error in vnf", e);
325                         throw e;
326                 }
327         }
328         
329         @POST
330         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
331         @Consumes(MediaType.APPLICATION_JSON)
332         @Produces(MediaType.APPLICATION_JSON)
333         @ApiOperation(value="Replace provided VNF instance",response=Response.class)
334         @Transactional
335         public Response replaceVnfInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
336                                        @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
337                 String requestId = requestHandlerUtils.getRequestId(requestContext);
338                 HashMap<String, String> instanceIdMap = new HashMap<>();
339                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
340                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
341                 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
342         }
343         
344         @PUT
345         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
346         @Consumes(MediaType.APPLICATION_JSON)
347         @Produces(MediaType.APPLICATION_JSON)
348         @ApiOperation(value="Update VNF on a specified version, serviceInstance and vnfInstance",response=Response.class)
349         @Transactional
350         public Response updateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
351                                       @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
352                 String requestId = requestHandlerUtils.getRequestId(requestContext);
353                 HashMap<String, String> instanceIdMap = new HashMap<>();
354                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
355                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
356                 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
357         }
358         
359         @POST
360         @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
361         @Consumes(MediaType.APPLICATION_JSON)
362         @Produces(MediaType.APPLICATION_JSON)
363         @ApiOperation(value="Apply updated configuration",response=Response.class)
364         public Response applyUpdatedConfig(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
365                                        @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
366                 String requestId = requestHandlerUtils.getRequestId(requestContext);
367                 HashMap<String, String> instanceIdMap = new HashMap<>();
368                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
369                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
370                 return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
371         }
372         
373         @POST
374         @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
375         @Consumes(MediaType.APPLICATION_JSON)
376         @Produces(MediaType.APPLICATION_JSON)
377         @ApiOperation(value="Recreate VNF Instance",response=Response.class)
378         public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
379                                        @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
380                 String requestId = requestHandlerUtils.getRequestId(requestContext);
381                 HashMap<String, String> instanceIdMap = new HashMap<>();
382                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
383                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
384                 return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
385         }
386
387
388         @DELETE
389         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
390         @Consumes(MediaType.APPLICATION_JSON)
391         @Produces(MediaType.APPLICATION_JSON)
392         @ApiOperation(value="Delete provided VNF instance",response=Response.class)
393         @Transactional
394         public Response deleteVnfInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
395                                       @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
396                 String requestId = requestHandlerUtils.getRequestId(requestContext);
397                 HashMap<String, String> instanceIdMap = new HashMap<>();
398                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
399                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
400                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
401         }
402
403         @POST
404         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
405         @Consumes(MediaType.APPLICATION_JSON)
406         @Produces(MediaType.APPLICATION_JSON)
407         @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
408         @Transactional
409         public Response createVfModuleInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
410                                            @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
411                 String requestId = requestHandlerUtils.getRequestId(requestContext);
412                 HashMap<String, String> instanceIdMap = new HashMap<>();
413                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
414                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
415                 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
416         }
417         
418         @POST
419         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
420         @Consumes(MediaType.APPLICATION_JSON)
421         @Produces(MediaType.APPLICATION_JSON)
422         @ApiOperation(value="Create VfModule on a specified version, serviceInstance and vnfInstance",response=Response.class)
423         @Transactional
424         public Response replaceVfModuleInstance(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
425                         @PathParam("vnfInstanceId") String vnfInstanceId,
426                                             @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
427                 String requestId = requestHandlerUtils.getRequestId(requestContext);
428                 HashMap<String, String> instanceIdMap = new HashMap<>();
429                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
430                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
431                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
432                 return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
433         }
434
435         @PUT
436         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
437         @Consumes(MediaType.APPLICATION_JSON)
438         @Produces(MediaType.APPLICATION_JSON)
439         @ApiOperation(value="Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",response=Response.class)
440         @Transactional
441         public Response updateVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
442                         @PathParam("vnfInstanceId") String vnfInstanceId,
443                                            @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
444                 String requestId = requestHandlerUtils.getRequestId(requestContext);
445                 HashMap<String, String> instanceIdMap = new HashMap<>();
446                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
447                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
448                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
449                 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
450         }
451         
452         @POST
453         @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
454         @Consumes(MediaType.APPLICATION_JSON)
455         @Produces(MediaType.APPLICATION_JSON)
456         @ApiOperation(value="Perform VNF software update",response=Response.class)
457         @Transactional
458         public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
459                                           @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
460                 String requestId = requestHandlerUtils.getRequestId(requestContext);
461                 HashMap<String, String> instanceIdMap = new HashMap<>();
462                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
463                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
464                 return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
465         }
466         
467         @DELETE
468         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
469         @Consumes(MediaType.APPLICATION_JSON)
470         @Produces(MediaType.APPLICATION_JSON)
471         @ApiOperation(value="Delete provided VfModule instance",response=Response.class)
472         @Transactional
473         public Response deleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
474                         @PathParam("vnfInstanceId") String vnfInstanceId,
475                                            @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
476                 String requestId = requestHandlerUtils.getRequestId(requestContext);
477                 HashMap<String, String> instanceIdMap = new HashMap<>();
478                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
479                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
480                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
481                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
482         }
483         
484         @POST
485         @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
486         @Consumes(MediaType.APPLICATION_JSON)
487         @Produces(MediaType.APPLICATION_JSON)
488         @ApiOperation(value="Deactivate and Cloud Delete VfModule instance",response=Response.class)
489         @Transactional
490         public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
491                         @PathParam("vnfInstanceId") String vnfInstanceId, @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
492                 String requestId = requestHandlerUtils.getRequestId(requestContext);
493                 HashMap<String, String> instanceIdMap = new HashMap<>();
494                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
495                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
496                 instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
497                 Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
498                 return response;
499         }
500         
501         @POST
502         @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
503         @Consumes(MediaType.APPLICATION_JSON)
504         @Produces(MediaType.APPLICATION_JSON)
505         @ApiOperation(value="VF Auto Scale Out",response=Response.class)
506         @Transactional
507         public Response scaleOutVfModule(String request,  @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
508                                            @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
509                 String requestId = requestHandlerUtils.getRequestId(requestContext);
510                 HashMap<String, String> instanceIdMap = new HashMap<>();
511                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
512                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
513                 return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
514         }
515
516
517         @POST
518         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
519         @Consumes(MediaType.APPLICATION_JSON)
520         @Produces(MediaType.APPLICATION_JSON)
521         @ApiOperation(value="Create VolumeGroup on a specified version, serviceInstance, vnfInstance",response=Response.class)
522         @Transactional
523         public Response createVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
524                                               @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
525                 String requestId = requestHandlerUtils.getRequestId(requestContext);
526                 HashMap<String, String> instanceIdMap = new HashMap<>();
527                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
528                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
529                 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
530         }
531
532         @PUT
533         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
534         @Consumes(MediaType.APPLICATION_JSON)
535         @Produces(MediaType.APPLICATION_JSON)
536         @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",response=Response.class)
537         @Transactional
538         public Response updateVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
539                         @PathParam("vnfInstanceId") String vnfInstanceId,
540                                               @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
541                 String requestId = requestHandlerUtils.getRequestId(requestContext);
542                 HashMap<String, String> instanceIdMap = new HashMap<>();
543                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
544                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
545                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
546                 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
547         }
548
549         @DELETE
550         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
551         @Consumes(MediaType.APPLICATION_JSON)
552         @Produces(MediaType.APPLICATION_JSON)
553         @ApiOperation(value="Delete provided VolumeGroup instance",response=Response.class)
554         @Transactional
555         public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
556                         @PathParam("vnfInstanceId") String vnfInstanceId,
557                                               @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
558                 String requestId = requestHandlerUtils.getRequestId(requestContext);
559                 HashMap<String, String> instanceIdMap = new HashMap<>();
560                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
561                 instanceIdMap.put("vnfInstanceId", vnfInstanceId);
562                 instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
563                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
564         }
565
566         @POST
567         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
568         @Consumes(MediaType.APPLICATION_JSON)
569         @Produces(MediaType.APPLICATION_JSON)
570         @ApiOperation(value="Create NetworkInstance on a specified version and serviceInstance ",response=Response.class)
571         @Transactional
572     public Response createNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
573                 String requestId = requestHandlerUtils.getRequestId(requestContext);
574                 HashMap<String, String> instanceIdMap = new HashMap<>();
575                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
576                 return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
577         }
578
579         @PUT
580         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
581         @Consumes(MediaType.APPLICATION_JSON)
582         @Produces(MediaType.APPLICATION_JSON)
583         @ApiOperation(value="Update VolumeGroup on a specified version, serviceInstance, networkInstance",response=Response.class)
584         @Transactional
585         public Response updateNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
586                                           @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
587                 String requestId = requestHandlerUtils.getRequestId(requestContext);
588                 HashMap<String, String> instanceIdMap = new HashMap<>();
589                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
590                 instanceIdMap.put("networkInstanceId", networkInstanceId);
591                 return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
592         }
593
594         @DELETE
595         @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
596         @Consumes(MediaType.APPLICATION_JSON)
597         @Produces(MediaType.APPLICATION_JSON)
598         @ApiOperation(value="Delete provided Network instance",response=Response.class)
599         @Transactional
600         public Response deleteNetworkInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
601                                           @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
602                 String requestId = requestHandlerUtils.getRequestId(requestContext);
603                 HashMap<String, String> instanceIdMap = new HashMap<>();
604                 instanceIdMap.put("serviceInstanceId", serviceInstanceId);
605                 instanceIdMap.put("networkInstanceId", networkInstanceId);
606                 return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
607         }
608         
609         @POST
610     @Path("/{version:[vV][7]}/instanceGroups")
611         @Consumes(MediaType.APPLICATION_JSON)
612         @Produces(MediaType.APPLICATION_JSON)
613         @ApiOperation(value="Create instanceGroups",response=Response.class)
614         @Transactional
615     public Response createInstanceGroups(String request, @PathParam("version") String version, @Context ContainerRequestContext requestContext) throws ApiException {
616                 String requestId = requestHandlerUtils.getRequestId(requestContext);
617                 return serviceInstances(request, Action.createInstance, null, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
618         }
619         
620         @DELETE
621         @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
622         @Consumes(MediaType.APPLICATION_JSON)
623         @Produces(MediaType.APPLICATION_JSON)
624         @ApiOperation(value="Delete instanceGroup",response=Response.class)
625         @Transactional
626         public Response deleteInstanceGroups(@PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
627                 String requestId = requestHandlerUtils.getRequestId(requestContext);
628                 HashMap<String, String> instanceIdMap = new HashMap<>();
629                 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
630                 return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix), requestContext);
631         }
632         
633         @POST
634     @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
635         @Consumes(MediaType.APPLICATION_JSON)
636         @Produces(MediaType.APPLICATION_JSON)
637         @ApiOperation(value="Add instanceGroup members",response=Response.class)
638         @Transactional
639     public Response addInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
640                 String requestId = requestHandlerUtils.getRequestId(requestContext);
641                 HashMap<String, String> instanceIdMap = new HashMap<>();
642                 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
643                 return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
644         }
645         
646         @POST
647     @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
648         @Consumes(MediaType.APPLICATION_JSON)
649         @Produces(MediaType.APPLICATION_JSON)
650         @ApiOperation(value="Remove instanceGroup members",response=Response.class)
651         @Transactional
652     public Response removeInstanceGroupMembers(String request, @PathParam("version") String version, @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext) throws ApiException {
653                 String requestId = requestHandlerUtils.getRequestId(requestContext);
654                 HashMap<String, String> instanceIdMap = new HashMap<>();
655                 instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
656                 return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
657         }
658         
659         public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
660                 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
661                 Boolean aLaCarte = null;
662                 long startTime = System.currentTimeMillis ();
663                 ServiceInstancesRequest sir = null;
664                 String apiVersion = version.substring(1);
665                 
666                 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
667                 String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
668                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject (sir,  action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
669                 if(sir.getRequestDetails().getRequestParameters() != null){
670                         aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
671                 }
672                 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
673                 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
674                  
675                 int requestVersion = Integer.parseInt(version.substring(1));
676                 String instanceName = null;
677                 if (sir.getRequestDetails().getRequestInfo() != null) {
678                         instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
679                 }
680                 boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
681                 String vnfType = msoRequest.getVnfType(sir,requestScope,action,requestVersion);
682                 String networkType = msoRequest.getNetworkType(sir,requestScope);
683                 String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
684                 String vfModuleType = msoRequest.getVfModuleType(sir,requestScope,action,requestVersion);
685                 
686                 if(requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null){
687                         currentActiveReq.setVnfType(vnfType);
688                 }else if(requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null){
689                         currentActiveReq.setNetworkType(networkType);
690                 }
691                 
692                 InfraActiveRequests dup = null;
693                 boolean inProgress = false;             
694
695                 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
696
697                 if(dup != null){
698                         inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
699                 }
700                 
701                 if (dup != null && inProgress) {
702             requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
703                 }
704                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
705
706                 RequestReferences referencesResponse = new RequestReferences();
707
708                 referencesResponse.setRequestId(requestId);
709
710                 serviceResponse.setRequestReferences(referencesResponse);
711                 Boolean isBaseVfModule = false;
712                 
713         RecipeLookupResult recipeLookupResult = getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
714         String serviceInstanceType = requestHandlerUtils.getServiceType(requestScope, sir, alaCarteFlag);                                               
715                         ModelType modelType;
716                         ModelInfo modelInfo =  sir.getRequestDetails().getModelInfo();
717                         if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
718                                 modelType = ModelType.vnf;
719                         }else if(action == Action.addMembers || action == Action.removeMembers){
720                                 modelType = ModelType.instanceGroup;
721                         }else {
722                                 modelType =modelInfo.getModelType();
723                         }
724
725                         if (modelType.equals(ModelType.vfModule)) {
726                                 
727
728                                 // Get VF Module-specific base module indicator
729                                 VfModule vfm = null;
730
731                                 String modelVersionId = modelInfo.getModelVersionId();
732
733                                 if(modelVersionId != null) {
734                                         vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
735                                 } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
736                                         vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
737                                 }
738
739                                 if (vfm != null) {
740                                         if (vfm.getIsBase()) {
741                                                 isBaseVfModule = true;
742                                         }
743             } else if (action == Action.createInstance || action == Action.updateInstance) {
744                                         // There is no entry for this vfModuleType with this version, if specified, in VF_MODULE table in Catalog DB.
745                                         // This request cannot proceed
746                                         
747                                         String serviceVersionText = "";
748                                         if (sdcServiceModelVersion != null && !sdcServiceModelVersion.isEmpty ()) {
749                                                 serviceVersionText = " with version " + sdcServiceModelVersion;
750                                         }
751
752                 String errorMessage = "VnfType " + vnfType + " and VF Module Model Name " + modelInfo.getModelName() + serviceVersionText + " not found in MSO Catalog DB";
753                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
754                 VfModuleNotFoundException vfModuleException = new VfModuleNotFoundException.Builder(errorMessage, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo).build();
755                 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, vfModuleException.getMessage());
756
757                 throw vfModuleException;
758                 }
759                 }
760                 
761                 
762                 serviceInstanceId = requestHandlerUtils.setServiceInstanceId(requestScope, sir);
763                 String vnfId = "";
764                 String vfModuleId = "";
765                 String volumeGroupId = "";
766                 String networkId = "";
767                 String pnfCorrelationId = "";
768                 String instanceGroupId = null;
769
770                 if(sir.getVnfInstanceId () != null){
771                         vnfId = sir.getVnfInstanceId ();
772                 }
773
774                 if(sir.getVfModuleInstanceId () != null){
775                         vfModuleId = sir.getVfModuleInstanceId ();
776                 }
777
778                 if(sir.getVolumeGroupInstanceId () != null){
779                         volumeGroupId = sir.getVolumeGroupInstanceId ();
780                 }
781
782                 if(sir.getNetworkInstanceId () != null){
783                         networkId = sir.getNetworkInstanceId ();
784                 }
785                 if(sir.getInstanceGroupId() != null){
786                         instanceGroupId = sir.getInstanceGroupId();
787                 }
788
789         pnfCorrelationId = getPnfCorrelationId(sir);
790
791         try{
792             infraActiveRequestsClient.save(currentActiveReq);
793         }catch(Exception e){
794             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
795             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
796                     .errorInfo(errorLoggerInfo).build();
797         }
798                 
799                 if(!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance){
800                         aLaCarte = true;
801                 }else if(aLaCarte == null){
802                         aLaCarte = false;
803                 }
804                 
805                 RequestClientParameter requestClientParameter = null;
806                 try {
807                         requestClientParameter = new RequestClientParameter.Builder()
808                                                 .setRequestId(requestId)
809                                                 .setBaseVfModule(isBaseVfModule)
810                                                 .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
811                                                 .setRequestAction(action.toString())
812                                                 .setServiceInstanceId(serviceInstanceId)
813                                                 .setPnfCorrelationId(pnfCorrelationId)
814                                                 .setVnfId(vnfId)
815                                                 .setVfModuleId(vfModuleId)
816                                                 .setVolumeGroupId(volumeGroupId)
817                                                 .setNetworkId(networkId)
818                                                 .setServiceType(serviceInstanceType)
819                                                 .setVnfType(vnfType)
820                                                 .setVfModuleType(vfModuleType)
821                                                 .setNetworkType(networkType)
822                                                 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
823                                                 .setApiVersion(apiVersion)
824                                                 .setALaCarte(aLaCarte)
825                                                 .setRequestUri(requestUri)
826                                                 .setInstanceGroupId(instanceGroupId).build();
827                 } catch (IOException e) {
828                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
829                         throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
830                           .errorInfo(errorLoggerInfo).build();
831                 }
832                 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
833         }
834         public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
835                 String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
836                 Boolean aLaCarte = true;
837                 long startTime = System.currentTimeMillis ();
838                 String apiVersion = version.substring(1);
839                 ServiceInstancesRequest sir = new ServiceInstancesRequest();
840                 sir.setInstanceGroupId(instanceGroupId);
841         
842                 String requestScope = ModelType.instanceGroup.toString();
843                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject (sir,  action, requestId, Status.IN_PROGRESS, null, requestScope);
844                 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
845                 try {
846                         requestHandlerUtils.validateHeaders(requestContext);
847                 } catch (ValidationException e) {
848                         logger.error("Exception occurred", e);
849             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
850             ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
851                         .errorInfo(errorLoggerInfo).build();
852             requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
853             throw validateException;
854                 }
855                 
856                 InfraActiveRequests dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, startTime, msoRequest, null, requestScope, currentActiveReq);
857                 boolean inProgress = false;
858                 
859                 if(dup != null){
860                         inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
861                 }
862                 
863                 if (dup != null && inProgress) {
864             requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, null, requestScope, dup);
865                 }
866                 
867                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
868
869                 RequestReferences referencesResponse = new RequestReferences();
870
871                 referencesResponse.setRequestId(requestId);
872
873                 serviceResponse.setRequestReferences(referencesResponse);
874                 Boolean isBaseVfModule = false;
875
876         RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
877                                                                 
878         try{
879             infraActiveRequestsClient.save(currentActiveReq);
880         }catch(Exception e){
881             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
882             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
883                     .errorInfo(errorLoggerInfo).build();
884         }
885         
886                 RequestClientParameter requestClientParameter = new RequestClientParameter.Builder()
887                                         .setRequestId(requestId)
888                                         .setBaseVfModule(isBaseVfModule)
889                                         .setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
890                                         .setRequestAction(action.toString())
891                                         .setApiVersion(apiVersion)
892                                         .setALaCarte(aLaCarte)
893                                         .setRequestUri(requestUri)
894                                         .setInstanceGroupId(instanceGroupId).build();
895                 
896                 return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, recipeLookupResult.getOrchestrationURI(), requestScope);
897         }
898
899         private String getPnfCorrelationId(ServiceInstancesRequest sir) {
900                 return Optional.of(sir)
901                                 .map(ServiceInstancesRequest::getRequestDetails)
902                                 .map(RequestDetails::getRequestParameters)
903                                 .map(parameters -> parameters.getUserParamValue("pnfId"))
904                                 .orElse("");
905         }       
906
907     private RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action, boolean alaCarteFlag, 
908                                                                                                                                 InfraActiveRequests currentActiveReq) throws ApiException {
909                 RecipeLookupResult recipeLookupResult = null;
910         //if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
911                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
912                 // Query MSO Catalog DB
913                 
914                 if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
915                         recipeLookupResult = getDefaultVnfUri(sir, action);
916         }else if(action == Action.addMembers || action == Action.removeMembers){
917                 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
918         }else if (modelInfo.getModelType().equals(ModelType.service)) {
919                         try {
920                         recipeLookupResult = getServiceURI(sir, action,alaCarteFlag);
921                         } catch (IOException e) {
922                                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
923
924
925                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
926                         .errorInfo(errorLoggerInfo).build();
927
928                 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
929
930                 throw validateException;
931                         }
932         } else if (modelInfo.getModelType().equals(ModelType.vfModule) ||
933                                 modelInfo.getModelType().equals(ModelType.volumeGroup) || modelInfo.getModelType().equals(ModelType.vnf)) {
934             try {
935                         recipeLookupResult = getVnfOrVfModuleUri( sir, action);
936             } catch (ValidationException e) {
937                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
938
939
940                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
941                         .errorInfo(errorLoggerInfo).build();
942
943                 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
944
945                 throw validateException;
946             }
947                 }else if (modelInfo.getModelType().equals(ModelType.network)) {
948             try {
949                         recipeLookupResult = getNetworkUri( sir, action);
950             } catch (ValidationException e) {
951
952                 ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
953
954
955                 ValidateException validateException = new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
956                         .errorInfo(errorLoggerInfo).build();
957                 requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
958
959                 throw validateException;
960             }
961         }else if(modelInfo.getModelType().equals(ModelType.instanceGroup)){
962                 recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
963         }
964
965         if (recipeLookupResult == null) {
966             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
967
968
969             RecipeNotFoundException recipeNotFoundExceptionException = new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.", HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
970                     .errorInfo(errorLoggerInfo).build();
971
972             requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, recipeNotFoundExceptionException.getMessage());
973             throw recipeNotFoundExceptionException;
974                 }
975                 return recipeLookupResult;
976         }
977         
978     private RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action, boolean alaCarteFlag) throws IOException {
979                 // SERVICE REQUEST
980                 // Construct the default service name
981                 // TODO need to make this a configurable property
982                 String defaultServiceModelName = requestHandlerUtils.getDefaultModel(servInstReq);
983                 RequestDetails requestDetails = servInstReq.getRequestDetails();
984                 ModelInfo modelInfo = requestDetails.getModelInfo();
985                 org.onap.so.db.catalog.beans.Service serviceRecord;
986                 List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
987                 ServiceRecipe recipe = null;
988                 
989                 if(alaCarteFlag){
990                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
991                         if(serviceRecord !=null){                                       
992                                 recipe =catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
993                         }
994                 }else{
995                         serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
996                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(), action.toString());
997                         if (recipe == null){
998                                 serviceRecordList = catalogDbClient.getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
999                                 if(!serviceRecordList.isEmpty()){
1000                                         for(org.onap.so.db.catalog.beans.Service record : serviceRecordList){
1001                                                 recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),action.toString());
1002                                                 if(recipe != null){
1003                                                         break;
1004                                                 }
1005                                         }
1006                                 }
1007                         }
1008                 }
1009                 
1010                 //if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
1011                 RequestParameters reqParam = requestDetails.getRequestParameters();
1012                 if(reqParam!=null && alaCarteFlag && recipe==null){
1013                         return null;
1014                 } else if(!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
1015                         mapToLegacyRequest(requestDetails);
1016                 }else if (recipe == null) {  //aLaCarte wasn't sent, so we'll try the default
1017                         serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
1018                         recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),action.toString());
1019                 }
1020                 if(modelInfo.getModelVersionId() == null) {
1021                         modelInfo.setModelVersionId(serviceRecord.getModelUUID());
1022                 }
1023                 if(recipe==null){
1024                         return null;
1025                 }
1026                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1027         }
1028
1029         protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
1030                 RequestParameters reqParam;
1031                 if (requestDetails.getRequestParameters() == null) {
1032                         reqParam = new RequestParameters();
1033                 } else {
1034                         reqParam = requestDetails.getRequestParameters();
1035                 }
1036                 if(requestDetails.getCloudConfiguration() == null) {
1037                         CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
1038                         if(cloudConfig != null) {
1039                                 requestDetails.setCloudConfiguration(cloudConfig);
1040                         }
1041                 }
1042                 
1043                 List<Map<String, Object>> userParams = configureUserParams(reqParam);
1044                 if(!userParams.isEmpty()) {
1045                         if (reqParam == null) {
1046                                 requestDetails.setRequestParameters(new RequestParameters());
1047                         }
1048                         requestDetails.getRequestParameters().setUserParams(userParams);
1049                 }
1050         }
1051
1052         protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
1053
1054                 for(Map<String, Object> params : reqParams.getUserParams()){
1055                         if(params.containsKey("service")){
1056                                 Service service = serviceMapper(params);
1057                                 
1058                                 Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
1059                                 
1060                                 if (targetConfiguration.isPresent()) {
1061                                         return targetConfiguration.get();
1062                                 } else {
1063                                         for(Networks network : service.getResources().getNetworks()) {
1064                                                 targetConfiguration = addCloudConfig(network.getCloudConfiguration());
1065                                                 if(targetConfiguration.isPresent()) {
1066                                                         return targetConfiguration.get();
1067                                                 }
1068                                         }
1069                                 
1070                                         for(Vnfs vnf : service.getResources().getVnfs()) {
1071                                                 targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
1072                                                 
1073                                                 if(targetConfiguration.isPresent()) {
1074                                                         return targetConfiguration.get();
1075                                                 }
1076                                                 
1077                                                 for(VfModules vfModule : vnf.getVfModules()) {
1078                                                         targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
1079                                                         
1080                                                         if(targetConfiguration.isPresent()) {
1081                                                                 return targetConfiguration.get();
1082                                                         }
1083                                                 }
1084                                         }
1085                                 }
1086                         }
1087         }
1088         
1089         return null;
1090         }
1091
1092         private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
1093                 CloudConfiguration targetConfiguration = new CloudConfiguration();
1094                 if(sourceCloudConfiguration != null) {
1095                         targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
1096                         targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
1097                         targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
1098                         targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
1099                         return Optional.of(targetConfiguration);
1100                 }
1101                 return Optional.empty();
1102         }
1103
1104         protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
1105         logger.debug("Configuring UserParams for Macro Request");
1106         Map<String, Object> userParams = new HashMap<>();
1107         
1108         for(Map<String, Object> params : reqParams.getUserParams()){
1109                 if(params.containsKey("service")){
1110                         Service service = serviceMapper(params);
1111                                 
1112                                 addUserParams(userParams, service.getInstanceParams());
1113                                 
1114                                 for(Networks network : service.getResources().getNetworks()) {
1115                                         addUserParams(userParams, network.getInstanceParams());
1116                                 }
1117                                 
1118                                 for(Vnfs vnf: service.getResources().getVnfs()) {
1119                                         addUserParams(userParams, vnf.getInstanceParams());
1120                                         
1121                                         for(VfModules vfModule: vnf.getVfModules()) {
1122                                                 addUserParams(userParams, vfModule.getInstanceParams());
1123                                         }
1124                                 }
1125                 }
1126         }
1127         
1128         return mapFlatMapToNameValue(userParams);
1129     }
1130
1131         private Service serviceMapper(Map<String, Object> params)
1132                         throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
1133                 ObjectMapper obj = new ObjectMapper();
1134                 String input = obj.writeValueAsString(params.get("service"));
1135                 return obj.readValue(input, Service.class);
1136         }
1137
1138         private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
1139                 for(Map<String, String> map : sourceUserParams) {
1140                         for (Map.Entry<String, String> entry : map.entrySet()) {
1141                                 targetUserParams.put(entry.getKey(), entry.getValue());
1142                         }
1143                 }
1144         }
1145         
1146         protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
1147                 List<Map<String, Object>> targetUserParams = new ArrayList<>();
1148                 
1149                 for(Map.Entry<String, Object> map : flatMap.entrySet()) {
1150                         Map<String, Object> targetMap = new HashMap<>();
1151                         targetMap.put(NAME, map.getKey());
1152                         targetMap.put(VALUE, map.getValue());
1153                         targetUserParams.add(targetMap);
1154                 }
1155                 return targetUserParams;
1156         }
1157
1158     private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action) throws ValidationException {
1159
1160                 ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
1161                 String vnfComponentType = modelInfo.getModelType().name();
1162
1163                 RelatedInstanceList[] instanceList = null;
1164                 if (servInstReq.getRequestDetails() != null) {
1165                         instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
1166                 }
1167
1168                 Recipe recipe = null;
1169                 String defaultSource = requestHandlerUtils.getDefaultModel(servInstReq);
1170                 String modelCustomizationId = modelInfo.getModelCustomizationId();
1171                 String modelCustomizationName = modelInfo.getModelCustomizationName();
1172                 String relatedInstanceModelVersionId = null;
1173                 String relatedInstanceModelInvariantId = null;
1174                 String relatedInstanceVersion = null;
1175                 String relatedInstanceModelCustomizationName = null;
1176
1177                 if (instanceList != null) {
1178
1179                         for(RelatedInstanceList relatedInstanceList : instanceList){
1180
1181                                 RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
1182                                 ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
1183                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.service)){
1184                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1185                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1186                                 }
1187
1188                                 if(relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)){
1189                                         relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
1190                                         relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
1191                                         relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
1192                                         relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
1193                                 }
1194                         }
1195
1196                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1197                                 //                      a.      For a vnf request (only create, no update currently): 
1198                                 //                              i.      (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in vnf_resource_customization.model_customization_uuid.
1199                                 //                              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 
1200                                 //                                      been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName 
1201                 //                                      to Ã¢â‚¬Å“join�? service_to_resource_customizations with vnf_resource_customization to confirm a vnf_resource_customization.model_customization_uuid  record exists.
1202                                 //                              **If relatedInstance.modelInfo[service].modelVersionId  was not provided, use relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId 
1203                                 //                                      (MODEL_UUID) in SERVICE table.
1204                                 //                              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 
1205                                 //                                      during 1707 data migration if VID did not provide it originally on request.
1206                 //                              iv.     Note: continue to construct the Ã¢â‚¬Å“vnf-type�? value and pass to BPMN (must still be populated in A&AI).
1207                                 //                              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.
1208
1209                                 VnfResource vnfResource = null;
1210                                 VnfResourceCustomization vrc=null;
1211                                 // Validation for vnfResource
1212
1213                                 if(modelCustomizationId!=null) {
1214                     vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
1215                     if(vrc != null){
1216                         vnfResource = vrc.getVnfResources();
1217                     }
1218                                 } else {
1219                                         org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
1220                                         if(service == null) {
1221                                                 service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion, relatedInstanceModelInvariantId);
1222                                         }
1223
1224                                 if(service == null) {
1225                                         throw new ValidationException("service in relatedInstance");
1226                                 }
1227                     for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
1228                         if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
1229                                                 vrc=vnfResourceCustom;
1230                         }
1231                     }
1232                                         
1233                                         if(vrc != null) {
1234                                                 vnfResource = vrc.getVnfResources();
1235                         modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
1236                         modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
1237                                         }
1238                                 }
1239
1240                                 if(vnfResource==null){
1241                                         throw new ValidationException("vnfResource");
1242                                 } else {
1243                                         if(modelInfo.getModelVersionId() == null) {
1244                         modelInfo.setModelVersionId(vnfResource.getModelUUID());
1245                                         }
1246                                 }
1247
1248                                 VnfRecipe vnfRecipe = null;
1249                                 
1250                                 if(vrc != null) {
1251                                         String nfRole = vrc.getNfRole();
1252                                         if(nfRole != null) {
1253                                                 vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
1254                                         }
1255                                 }
1256
1257                                 if(vnfRecipe == null) {
1258                                         vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1259                                 }
1260
1261                                 if (vnfRecipe == null) {
1262                                         return null;
1263                                 }
1264
1265                                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
1266                         } else {
1267                                 /*                              (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or pre-v3), then modelInfo.modelCustomizationName must have 
1268                                 //                              been provided (else create request should be rejected).  APIH should use the relatedInstance.modelInfo[vnf].modelVersionId + modelInfo[vnf].modelCustomizationName 
1269                                 //                              to join vnf_to_resource_customizations with vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid  record exists.
1270                                 //                              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. 
1271                                 //                              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 
1272                                 //                              confirm record matches request data (and to identify the modelCustomizationId associated with the vfModule in the request). This means taking each record found 
1273                                 //                      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) 
1274                                 //                              and MODEL_VERSION (modelVersion).
1275                                 */
1276                                 VfModuleCustomization vfmc = null;
1277                                 VnfResource vnfr;
1278                                 VnfResourceCustomization vnfrc;
1279                                 VfModule vfModule = null;
1280
1281                                 if(modelInfo.getModelCustomizationId() != null) {
1282                                         vfmc = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
1283                                 } else {
1284                                         vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
1285                                         if(vnfr == null){
1286                                                 vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1287                                         }
1288                                         vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(relatedInstanceModelCustomizationName, vnfr);
1289                                         
1290                                         List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
1291                                                         
1292                                         String vfModuleModelUUID = modelInfo.getModelVersionId();
1293                                         for(VfModuleCustomization vf : list) {
1294                                                 VfModuleCustomization vfmCustom;
1295                                                 if(vfModuleModelUUID != null){
1296                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(vf.getModelCustomizationUUID(), vfModuleModelUUID);
1297                                                         if(vfmCustom != null){
1298                                                                 vfModule = vfmCustom.getVfModule();
1299                                                         }
1300                                                 }else{ 
1301                                                         vfmCustom = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
1302                                                         if(vfmCustom != null){
1303                                                                 vfModule = vfmCustom.getVfModule();
1304                                                         }else{
1305                                                                 vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(relatedInstanceModelInvariantId, relatedInstanceVersion);
1306                                                         }
1307                                                 }
1308                                                 
1309                                                 if(vfModule != null) {
1310                                                         modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
1311                                                         modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
1312                                                         break;
1313                                                 }
1314                                         }
1315                                 }
1316
1317                                 if(vfmc == null && vfModule == null) {
1318                                         throw new ValidationException("vfModuleCustomization");
1319                                 } else if (vfModule == null && vfmc != null) {
1320                                         vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in VfModuleCustomization table
1321                                 }
1322
1323                                 if(modelInfo.getModelVersionId() == null) {
1324                                         modelInfo.setModelVersionId(vfModule.getModelUUID());
1325                                 }
1326                                 
1327                                 
1328                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(vfModule.getModelUUID(), vnfComponentType, action.toString());
1329                                 if(recipe == null){
1330                                         List<VfModule> vfModuleRecords= catalogDbClient.getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
1331                                         if(!vfModuleRecords.isEmpty()){
1332                                                 for(VfModule record : vfModuleRecords){
1333                                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(record.getModelUUID(), vnfComponentType, action.toString());
1334                                                         if(recipe != null){
1335                                                                 break;
1336                                                         }
1337                                                 }
1338                                         }
1339                                 }
1340                                 if(recipe == null) {
1341                                         recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1342                                         if (recipe == null) { 
1343                                                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(vnfComponentType, action.toString());
1344                                         }
1345
1346                                         if(recipe == null) {
1347                                                 return null;
1348                                         }
1349                                 }
1350                         }
1351                 } else {
1352
1353                         if(modelInfo.getModelType().equals(ModelType.vnf)) {
1354                                 recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1355                                 if (recipe == null) {
1356                                         return null;
1357                                 }
1358                         } else {
1359                 recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(defaultSource, vnfComponentType, action.toString());
1360
1361                                 if (recipe == null) {
1362                                         return null;
1363                                 }
1364                         }
1365                 }
1366
1367                 return new RecipeLookupResult (recipe.getOrchestrationUri (), recipe.getRecipeTimeout ());
1368         }
1369         
1370     private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
1371         
1372                 String defaultSource = requestHandlerUtils.getDefaultModel(sir);
1373
1374                 VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
1375
1376                 if (vnfRecipe == null) {
1377                         return null;
1378                 }
1379
1380                 return new RecipeLookupResult (vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());          
1381         }
1382
1383
1384     private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
1385
1386                 String defaultNetworkType = requestHandlerUtils.getDefaultModel(sir);
1387
1388                 ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1389                 String modelName = modelInfo.getModelName();
1390                 Recipe recipe = null;
1391
1392                 if(modelInfo.getModelCustomizationId()!=null){
1393             NetworkResourceCustomization networkResourceCustomization = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
1394                         if(networkResourceCustomization != null){
1395                                 NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
1396                         if(networkResource!=null){
1397                                 if(modelInfo.getModelVersionId() == null) {
1398                                         modelInfo.setModelVersionId(networkResource.getModelUUID());
1399                                 }
1400                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
1401                         }else{
1402                                 throw new ValidationException("no catalog entry found");
1403                         }
1404                         }else if(action != Action.deleteInstance){
1405                                 throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
1406                         }
1407                 }else{
1408                         //ok for version < 3 and action delete
1409                         if(modelName != null){
1410                                 recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
1411                         }
1412                 }
1413
1414                 if(recipe == null){
1415                         recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
1416                 }
1417                 
1418                 return recipe !=null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
1419         }
1420     
1421     
1422     private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap, String version, String requestId, String requestUri) throws ApiException {
1423                 String serviceInstanceId = (instanceIdMap ==null)? null:instanceIdMap.get("serviceInstanceId");
1424                 Boolean aLaCarte = null;
1425                 String apiVersion = version.substring(1);
1426                 boolean inProgress = false;
1427                 
1428                 long startTime = System.currentTimeMillis ();
1429                 ServiceInstancesRequest sir = null;             
1430
1431                 sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, startTime, sir, msoRequest, requestId, requestUri);
1432                 String requestScope = requestHandlerUtils.deriveRequestScope(action,sir, requestUri);
1433                 InfraActiveRequests currentActiveReq =  msoRequest.createRequestObject ( sir,  action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1434                 if(sir.getRequestDetails().getRequestParameters() != null){
1435                         aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1436                 }
1437                 requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId, currentActiveReq);
1438                 requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1439                 String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1440
1441                 InfraActiveRequests dup = null;
1442                 
1443                 dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, startTime, msoRequest, instanceName,requestScope, currentActiveReq);
1444                 
1445                 if(dup != null){
1446                         inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
1447                 }
1448
1449                 if (instanceIdMap != null && dup != null && inProgress) {
1450             requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, startTime, msoRequest, instanceName, requestScope, dup);
1451                 }
1452                 
1453                 ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1454                 RequestReferences referencesResponse = new RequestReferences();
1455                 referencesResponse.setRequestId(requestId);
1456                 serviceResponse.setRequestReferences(referencesResponse);
1457                 
1458                 
1459                 String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1460                 String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1461                 
1462                 if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1463                         String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties" : "ALaCarte Recipe Timeout not found in properties";
1464                         
1465             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1466
1467
1468             ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR)
1469                     .errorInfo(errorLoggerInfo).build();
1470
1471             requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1472
1473             throw validateException;
1474                         
1475                 }
1476                 
1477                 serviceInstanceId = "";
1478                 String configurationId = "";
1479                 String pnfCorrelationId = "";
1480
1481                 if(sir.getServiceInstanceId () != null){
1482                         serviceInstanceId = sir.getServiceInstanceId ();
1483                 }
1484
1485                 if(sir.getConfigurationId() != null){
1486             configurationId = sir.getConfigurationId();
1487         }
1488
1489         pnfCorrelationId = getPnfCorrelationId(sir);
1490
1491                 try{
1492                         infraActiveRequestsClient.save(currentActiveReq);
1493                 }catch(Exception e){
1494                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1495             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
1496                     .errorInfo(errorLoggerInfo).build();
1497                 }
1498                 
1499                 if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
1500                         aLaCarte = true;
1501                 }else if(aLaCarte == null){
1502                         aLaCarte = false;
1503                 }
1504                 RequestClientParameter requestClientParameter = null;
1505                 try {
1506                         requestClientParameter = new RequestClientParameter.Builder()
1507                                 .setRequestId(requestId)
1508                                 .setBaseVfModule(false)
1509                                 .setRecipeTimeout(Integer.parseInt(timeOut))
1510                                 .setRequestAction(action.toString())
1511                                 .setServiceInstanceId(serviceInstanceId)
1512                                 .setPnfCorrelationId(pnfCorrelationId)
1513                                 .setConfigurationId(configurationId)
1514                                 .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1515                                 .setApiVersion(apiVersion)
1516                                 .setALaCarte(aLaCarte)
1517                                 .setRequestUri(requestUri).build();
1518                 } catch (IOException e) {
1519                         ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1520                         throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER)
1521                             .errorInfo(errorLoggerInfo).build();
1522                 }
1523                                 
1524                         return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri, requestScope);
1525         }    
1526    
1527 }