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