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