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