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