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