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