Merge "Bug fix for Multi-result row data order"
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / ServiceInstances.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7  * ================================================================================
8  * Modifications Copyright (c) 2019 Samsung
9  * ================================================================================
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  * 
14  *      http://www.apache.org/licenses/LICENSE-2.0
15  * 
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  * ============LICENSE_END=========================================================
22  */
23
24 package org.onap.so.apihandlerinfra;
25
26 import java.io.IOException;
27 import java.util.HashMap;
28 import java.util.Optional;
29 import javax.transaction.Transactional;
30 import javax.ws.rs.Consumes;
31 import javax.ws.rs.DELETE;
32 import javax.ws.rs.POST;
33 import javax.ws.rs.PUT;
34 import javax.ws.rs.Path;
35 import javax.ws.rs.PathParam;
36 import javax.ws.rs.Produces;
37 import javax.ws.rs.container.ContainerRequestContext;
38 import javax.ws.rs.core.Context;
39 import javax.ws.rs.core.MediaType;
40 import javax.ws.rs.core.Response;
41 import org.apache.commons.lang.StringUtils;
42 import org.apache.http.HttpStatus;
43 import org.onap.so.apihandler.common.CommonConstants;
44 import org.onap.so.apihandler.common.ErrorNumbers;
45 import org.onap.so.apihandler.common.RequestClientParameter;
46 import org.onap.so.apihandlerinfra.exceptions.ApiException;
47 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
48 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
49 import org.onap.so.apihandlerinfra.infra.rest.BpmnRequestBuilder;
50 import org.onap.so.apihandlerinfra.infra.rest.exception.CloudConfigurationNotFoundException;
51 import org.onap.so.apihandlerinfra.infra.rest.handler.AbstractRestHandler;
52 import org.onap.so.apihandlerinfra.infra.rest.validators.RequestValidatorListenerRunner;
53 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
54 import org.onap.so.constants.Status;
55 import org.onap.so.db.catalog.client.CatalogDbClient;
56 import org.onap.so.db.request.beans.InfraActiveRequests;
57 import org.onap.so.db.request.client.RequestsDbClient;
58 import org.onap.so.exceptions.ValidationException;
59 import org.onap.so.logger.ErrorCode;
60 import org.onap.so.logger.MessageEnum;
61 import org.onap.so.serviceinstancebeans.CloudConfiguration;
62 import org.onap.so.serviceinstancebeans.ModelInfo;
63 import org.onap.so.serviceinstancebeans.ModelType;
64 import org.onap.so.serviceinstancebeans.RequestDetails;
65 import org.onap.so.serviceinstancebeans.RequestReferences;
66 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
67 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
68 import org.slf4j.Logger;
69 import org.slf4j.LoggerFactory;
70 import org.springframework.beans.factory.annotation.Autowired;
71 import org.springframework.core.env.Environment;
72 import org.springframework.stereotype.Component;
73 import org.springframework.web.client.RestTemplate;
74 import io.swagger.v3.oas.annotations.OpenAPIDefinition;
75 import io.swagger.v3.oas.annotations.Operation;
76 import io.swagger.v3.oas.annotations.info.Info;
77 import io.swagger.v3.oas.annotations.media.ArraySchema;
78 import io.swagger.v3.oas.annotations.media.Content;
79 import io.swagger.v3.oas.annotations.media.Schema;
80 import io.swagger.v3.oas.annotations.responses.ApiResponse;
81
82 @Component
83 @Path("/onap/so/infra/serviceInstantiation")
84 @OpenAPIDefinition(info = @Info(title = "/onap/so/infra/serviceInstantiation",
85         description = "Infrastructure API Requests for Service Instances"))
86 public class ServiceInstances extends AbstractRestHandler {
87
88     private static Logger logger = LoggerFactory.getLogger(MsoRequest.class);
89     private static String uriPrefix = "/serviceInstantiation/";
90     private static final String SAVE_TO_DB = "save instance to db";
91
92     @Autowired
93     private Environment env;
94
95     @Autowired
96     private RestTemplate restTemplate;
97
98     @Autowired
99     private CatalogDbClient catalogDbClient;
100
101     @Autowired
102     private RequestsDbClient infraActiveRequestsClient;
103
104     @Autowired
105     private MsoRequest msoRequest;
106
107     @Autowired
108     private RequestHandlerUtils requestHandlerUtils;
109
110     @Autowired
111     private RequestValidatorListenerRunner requestValidatorListenerRunner;
112
113     @Autowired
114     private BpmnRequestBuilder bpmnRequestBuilder;
115
116     @POST
117     @Path("/{version:[vV][5-7]}/serviceInstances")
118     @Consumes(MediaType.APPLICATION_JSON)
119     @Produces(MediaType.APPLICATION_JSON)
120     @Operation(description = "Create a Service Instance on a version provided", responses = @ApiResponse(
121             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
122     @Transactional
123     public Response createServiceInstance(String request, @PathParam("version") String version,
124             @Context ContainerRequestContext requestContext) throws ApiException {
125         String requestId = requestHandlerUtils.getRequestId(requestContext);
126         return serviceInstances(request, Action.createInstance, null, version, requestId,
127                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
128     }
129
130     @POST
131     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
132     @Consumes(MediaType.APPLICATION_JSON)
133     @Produces(MediaType.APPLICATION_JSON)
134     @Operation(description = "Activate provided Service Instance", responses = @ApiResponse(
135             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
136     @Transactional
137     public Response activateServiceInstance(String request, @PathParam("version") String version,
138             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
139             throws ApiException {
140         String requestId = requestHandlerUtils.getRequestId(requestContext);
141         HashMap<String, String> instanceIdMap = new HashMap<>();
142         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
143         return serviceInstances(request, Action.activateInstance, instanceIdMap, version, requestId,
144                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
145     }
146
147     @POST
148     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
149     @Consumes(MediaType.APPLICATION_JSON)
150     @Produces(MediaType.APPLICATION_JSON)
151     @Operation(description = "Deactivate provided Service Instance", responses = @ApiResponse(
152             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
153     @Transactional
154     public Response deactivateServiceInstance(String request, @PathParam("version") String version,
155             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
156             throws ApiException {
157         String requestId = requestHandlerUtils.getRequestId(requestContext);
158         HashMap<String, String> instanceIdMap = new HashMap<>();
159         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
160         return serviceInstances(request, Action.deactivateInstance, instanceIdMap, version, requestId,
161                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
162     }
163
164     @DELETE
165     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
166     @Consumes(MediaType.APPLICATION_JSON)
167     @Produces(MediaType.APPLICATION_JSON)
168     @Operation(description = "Delete provided Service Instance", responses = @ApiResponse(
169             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
170     @Transactional
171     public Response deleteServiceInstance(String request, @PathParam("version") String version,
172             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
173             throws ApiException {
174         String requestId = requestHandlerUtils.getRequestId(requestContext);
175         HashMap<String, String> instanceIdMap = new HashMap<>();
176         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
177         return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
178                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
179     }
180
181     @POST
182     @Path("/{version:[vV][7]}/serviceInstances/assign")
183     @Consumes(MediaType.APPLICATION_JSON)
184     @Produces(MediaType.APPLICATION_JSON)
185     @Operation(description = "Assign Service Instance", responses = @ApiResponse(
186             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
187     @Transactional
188     public Response assignServiceInstance(String request, @PathParam("version") String version,
189             @Context ContainerRequestContext requestContext) throws ApiException {
190         String requestId = requestHandlerUtils.getRequestId(requestContext);
191         return serviceInstances(request, Action.assignInstance, null, version, requestId,
192                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
193     }
194
195     @POST
196     @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
197     @Consumes(MediaType.APPLICATION_JSON)
198     @Produces(MediaType.APPLICATION_JSON)
199     @Operation(description = "Unassign Service Instance", responses = @ApiResponse(
200             content = @Content(array = @ArraySchema(schema = @Schema(implementation = 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<>();
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     @Operation(description = "Create Port Mirroring Configuration", responses = @ApiResponse(
217             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
218     @Transactional
219     public Response createPortConfiguration(String request, @PathParam("version") String version,
220             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
221             throws ApiException {
222         String requestId = requestHandlerUtils.getRequestId(requestContext);
223         HashMap<String, String> instanceIdMap = new HashMap<>();
224         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
225         return configurationRecipeLookup(request, Action.createInstance, instanceIdMap, version, requestId,
226                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
227     }
228
229     @DELETE
230     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
231     @Consumes(MediaType.APPLICATION_JSON)
232     @Produces(MediaType.APPLICATION_JSON)
233     @Operation(description = "Delete provided Port", responses = @ApiResponse(
234             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
235     @Transactional
236     public Response deletePortConfiguration(String request, @PathParam("version") String version,
237             @PathParam("serviceInstanceId") String serviceInstanceId,
238             @PathParam("configurationInstanceId") String configurationInstanceId,
239             @Context ContainerRequestContext requestContext) throws ApiException {
240         String requestId = requestHandlerUtils.getRequestId(requestContext);
241         HashMap<String, String> instanceIdMap = new HashMap<>();
242         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
243         instanceIdMap.put("configurationInstanceId", configurationInstanceId);
244         return configurationRecipeLookup(request, Action.deleteInstance, instanceIdMap, version, requestId,
245                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
246     }
247
248     @POST
249     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
250     @Consumes(MediaType.APPLICATION_JSON)
251     @Produces(MediaType.APPLICATION_JSON)
252     @Operation(description = "Enable Port Mirroring", responses = @ApiResponse(
253             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
254     @Transactional
255     public Response enablePort(String request, @PathParam("version") String version,
256             @PathParam("serviceInstanceId") String serviceInstanceId,
257             @PathParam("configurationInstanceId") String configurationInstanceId,
258             @Context ContainerRequestContext requestContext) throws ApiException {
259         String requestId = requestHandlerUtils.getRequestId(requestContext);
260         HashMap<String, String> instanceIdMap = new HashMap<>();
261         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
262         instanceIdMap.put("configurationInstanceId", configurationInstanceId);
263         return configurationRecipeLookup(request, Action.enablePort, instanceIdMap, version, requestId,
264                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
265     }
266
267     @POST
268     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
269     @Consumes(MediaType.APPLICATION_JSON)
270     @Produces(MediaType.APPLICATION_JSON)
271     @Operation(description = "Disable Port Mirroring", responses = @ApiResponse(
272             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
273     @Transactional
274     public Response disablePort(String request, @PathParam("version") String version,
275             @PathParam("serviceInstanceId") String serviceInstanceId,
276             @PathParam("configurationInstanceId") String configurationInstanceId,
277             @Context ContainerRequestContext requestContext) throws ApiException {
278         String requestId = requestHandlerUtils.getRequestId(requestContext);
279         HashMap<String, String> instanceIdMap = new HashMap<>();
280         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
281         instanceIdMap.put("configurationInstanceId", configurationInstanceId);
282         return configurationRecipeLookup(request, Action.disablePort, instanceIdMap, version, requestId,
283                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
284     }
285
286     @POST
287     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
288     @Consumes(MediaType.APPLICATION_JSON)
289     @Produces(MediaType.APPLICATION_JSON)
290     @Operation(description = "Activate Port Mirroring", responses = @ApiResponse(
291             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
292     @Transactional
293     public Response activatePort(String request, @PathParam("version") String version,
294             @PathParam("serviceInstanceId") String serviceInstanceId,
295             @PathParam("configurationInstanceId") String configurationInstanceId,
296             @Context ContainerRequestContext requestContext) throws ApiException {
297         String requestId = requestHandlerUtils.getRequestId(requestContext);
298         HashMap<String, String> instanceIdMap = new HashMap<>();
299         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
300         instanceIdMap.put("configurationInstanceId", configurationInstanceId);
301         return configurationRecipeLookup(request, Action.activateInstance, instanceIdMap, version, requestId,
302                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
303     }
304
305     @POST
306     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
307     @Consumes(MediaType.APPLICATION_JSON)
308     @Produces(MediaType.APPLICATION_JSON)
309     @Operation(description = "Deactivate Port Mirroring", responses = @ApiResponse(
310             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
311     @Transactional
312     public Response deactivatePort(String request, @PathParam("version") String version,
313             @PathParam("serviceInstanceId") String serviceInstanceId,
314             @PathParam("configurationInstanceId") String configurationInstanceId,
315             @Context ContainerRequestContext requestContext) throws ApiException {
316         String requestId = requestHandlerUtils.getRequestId(requestContext);
317         HashMap<String, String> instanceIdMap = new HashMap<>();
318         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
319         instanceIdMap.put("configurationInstanceId", configurationInstanceId);
320         return configurationRecipeLookup(request, Action.deactivateInstance, instanceIdMap, version, requestId,
321                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
322     }
323
324     @POST
325     @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
326     @Consumes(MediaType.APPLICATION_JSON)
327     @Produces(MediaType.APPLICATION_JSON)
328     @Operation(description = "Add Relationships to a Service Instance", responses = @ApiResponse(
329             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
330     @Transactional
331     public Response addRelationships(String request, @PathParam("version") String version,
332             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
333             throws ApiException {
334         String requestId = requestHandlerUtils.getRequestId(requestContext);
335         HashMap<String, String> instanceIdMap = new HashMap<>();
336         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
337         return configurationRecipeLookup(request, Action.addRelationships, instanceIdMap, version, requestId,
338                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
339     }
340
341     @POST
342     @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
343     @Consumes(MediaType.APPLICATION_JSON)
344     @Produces(MediaType.APPLICATION_JSON)
345     @Operation(description = "Remove Relationships from Service Instance", responses = @ApiResponse(
346             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
347     @Transactional
348     public Response removeRelationships(String request, @PathParam("version") String version,
349             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
350             throws ApiException {
351         String requestId = requestHandlerUtils.getRequestId(requestContext);
352         HashMap<String, String> instanceIdMap = new HashMap<>();
353         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
354         return configurationRecipeLookup(request, Action.removeRelationships, instanceIdMap, version, requestId,
355                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
356     }
357
358     @POST
359     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
360     @Consumes(MediaType.APPLICATION_JSON)
361     @Produces(MediaType.APPLICATION_JSON)
362     @Operation(description = "Create VNF on a specified version and serviceInstance", responses = @ApiResponse(
363             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
364     @Transactional
365     public Response createVnfInstance(String request, @PathParam("version") String version,
366             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
367             throws ApiException {
368         String requestId = requestHandlerUtils.getRequestId(requestContext);
369         HashMap<String, String> instanceIdMap = new HashMap<>();
370         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
371         try {
372             return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
373                     requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
374         } catch (Exception e) {
375             logger.error("Error in vnf", e);
376             throw e;
377         }
378     }
379
380     @POST
381     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
382     @Consumes(MediaType.APPLICATION_JSON)
383     @Produces(MediaType.APPLICATION_JSON)
384     @Operation(description = "Replace provided VNF instance", responses = @ApiResponse(
385             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
386     @Transactional
387     public Response replaceVnfInstance(String request, @PathParam("version") String version,
388             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
389             @Context ContainerRequestContext requestContext) throws ApiException {
390         String requestId = requestHandlerUtils.getRequestId(requestContext);
391         HashMap<String, String> instanceIdMap = new HashMap<>();
392         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
393         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
394         return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId,
395                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
396     }
397
398     @PUT
399     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
400     @Consumes(MediaType.APPLICATION_JSON)
401     @Produces(MediaType.APPLICATION_JSON)
402     @Operation(description = "Update VNF on a specified version, serviceInstance and vnfInstance",
403             responses = @ApiResponse(
404                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
405     @Transactional
406     public Response updateVnfInstance(String request, @PathParam("version") String version,
407             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
408             @Context ContainerRequestContext requestContext) throws ApiException {
409         String requestId = requestHandlerUtils.getRequestId(requestContext);
410         HashMap<String, String> instanceIdMap = new HashMap<>();
411         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
412         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
413         return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
414                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
415     }
416
417     @POST
418     @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
419     @Consumes(MediaType.APPLICATION_JSON)
420     @Produces(MediaType.APPLICATION_JSON)
421     @Operation(description = "Apply updated configuration", responses = @ApiResponse(
422             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
423     public Response applyUpdatedConfig(String request, @PathParam("version") String version,
424             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
425             @Context ContainerRequestContext requestContext) throws ApiException {
426         String requestId = requestHandlerUtils.getRequestId(requestContext);
427         HashMap<String, String> instanceIdMap = new HashMap<>();
428         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
429         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
430         return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId,
431                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
432     }
433
434     @POST
435     @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
436     @Consumes(MediaType.APPLICATION_JSON)
437     @Produces(MediaType.APPLICATION_JSON)
438     @Operation(description = "Recreate VNF Instance", responses = @ApiResponse(
439             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
440     public Response recreateVnfInstance(String request, @PathParam("version") String version,
441             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
442             @Context ContainerRequestContext requestContext) throws ApiException {
443         String requestId = requestHandlerUtils.getRequestId(requestContext);
444         HashMap<String, String> instanceIdMap = new HashMap<>();
445         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
446         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
447         return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId,
448                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
449     }
450
451     @DELETE
452     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
453     @Consumes(MediaType.APPLICATION_JSON)
454     @Produces(MediaType.APPLICATION_JSON)
455     @Operation(description = "Delete provided VNF instance", responses = @ApiResponse(
456             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
457     @Transactional
458     public Response deleteVnfInstance(String request, @PathParam("version") String version,
459             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
460             @Context ContainerRequestContext requestContext) throws ApiException {
461         String requestId = requestHandlerUtils.getRequestId(requestContext);
462         HashMap<String, String> instanceIdMap = new HashMap<>();
463         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
464         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
465         return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
466                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
467     }
468
469     @POST
470     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
471     @Consumes(MediaType.APPLICATION_JSON)
472     @Produces(MediaType.APPLICATION_JSON)
473     @Operation(description = "Create VfModule on a specified version, serviceInstance and vnfInstance",
474             responses = @ApiResponse(
475                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
476     @Transactional
477     public Response createVfModuleInstance(String request, @PathParam("version") String version,
478             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
479             @Context ContainerRequestContext requestContext) throws ApiException {
480         String requestId = requestHandlerUtils.getRequestId(requestContext);
481         HashMap<String, String> instanceIdMap = new HashMap<>();
482         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
483         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
484         return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
485                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
486     }
487
488     @POST
489     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
490     @Consumes(MediaType.APPLICATION_JSON)
491     @Produces(MediaType.APPLICATION_JSON)
492     @Operation(description = "Create VfModule on a specified version, serviceInstance and vnfInstance",
493             responses = @ApiResponse(
494                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
495     @Transactional
496     public Response replaceVfModuleInstance(String request, @PathParam("version") String version,
497             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
498             @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
499             throws ApiException {
500         String requestId = requestHandlerUtils.getRequestId(requestContext);
501         HashMap<String, String> instanceIdMap = new HashMap<>();
502         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
503         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
504         instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
505         return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId,
506                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
507     }
508
509     @PUT
510     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
511     @Consumes(MediaType.APPLICATION_JSON)
512     @Produces(MediaType.APPLICATION_JSON)
513     @Operation(description = "Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",
514             responses = @ApiResponse(
515                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
516     @Transactional
517     public Response updateVfModuleInstance(String request, @PathParam("version") String version,
518             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
519             @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
520             throws ApiException {
521         String requestId = requestHandlerUtils.getRequestId(requestContext);
522         HashMap<String, String> instanceIdMap = new HashMap<>();
523         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
524         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
525         instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
526         return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
527                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
528     }
529
530     @POST
531     @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
532     @Consumes(MediaType.APPLICATION_JSON)
533     @Produces(MediaType.APPLICATION_JSON)
534     @Operation(description = "Perform VNF software update", responses = @ApiResponse(
535             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
536     @Transactional
537     public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version,
538             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
539             @Context ContainerRequestContext requestContext) throws ApiException {
540         String requestId = requestHandlerUtils.getRequestId(requestContext);
541         HashMap<String, String> instanceIdMap = new HashMap<>();
542         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
543         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
544         return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId,
545                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
546     }
547
548     @DELETE
549     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
550     @Consumes(MediaType.APPLICATION_JSON)
551     @Produces(MediaType.APPLICATION_JSON)
552     @Operation(description = "Delete provided VfModule instance", responses = @ApiResponse(
553             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
554     @Transactional
555     public Response deleteVfModuleInstance(String request, @PathParam("version") String version,
556             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
557             @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
558             throws ApiException {
559         String requestId = requestHandlerUtils.getRequestId(requestContext);
560         HashMap<String, String> instanceIdMap = new HashMap<>();
561         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
562         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
563         instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
564         return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
565                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
566     }
567
568     @POST
569     @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
570     @Consumes(MediaType.APPLICATION_JSON)
571     @Produces(MediaType.APPLICATION_JSON)
572     @Operation(description = "Deactivate and Cloud Delete VfModule instance", responses = @ApiResponse(
573             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
574     @Transactional
575     public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version,
576             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
577             @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
578             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         instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
584         Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version,
585                 requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
586         return response;
587     }
588
589     @POST
590     @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
591     @Consumes(MediaType.APPLICATION_JSON)
592     @Produces(MediaType.APPLICATION_JSON)
593     @Operation(description = "VF Auto Scale Out", responses = @ApiResponse(
594             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
595     @Transactional
596     public Response scaleOutVfModule(String request, @PathParam("version") String version,
597             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
598             @Context ContainerRequestContext requestContext) throws ApiException {
599         String requestId = requestHandlerUtils.getRequestId(requestContext);
600         HashMap<String, String> instanceIdMap = new HashMap<>();
601         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
602         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
603         return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId,
604                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
605     }
606
607     @POST
608     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
609     @Consumes(MediaType.APPLICATION_JSON)
610     @Produces(MediaType.APPLICATION_JSON)
611     @Operation(description = "Create VolumeGroup on a specified version, serviceInstance, vnfInstance",
612             responses = @ApiResponse(
613                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
614     @Transactional
615     public Response createVolumeGroupInstance(String request, @PathParam("version") String version,
616             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
617             @Context ContainerRequestContext requestContext) throws ApiException {
618         String requestId = requestHandlerUtils.getRequestId(requestContext);
619         HashMap<String, String> instanceIdMap = new HashMap<>();
620         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
621         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
622         return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
623                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
624     }
625
626     @PUT
627     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
628     @Consumes(MediaType.APPLICATION_JSON)
629     @Produces(MediaType.APPLICATION_JSON)
630     @Operation(description = "Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",
631             responses = @ApiResponse(
632                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
633     @Transactional
634     public Response updateVolumeGroupInstance(String request, @PathParam("version") String version,
635             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
636             @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId,
637             @Context ContainerRequestContext requestContext) throws ApiException {
638         String requestId = requestHandlerUtils.getRequestId(requestContext);
639         HashMap<String, String> instanceIdMap = new HashMap<>();
640         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
641         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
642         instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
643         return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
644                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
645     }
646
647     @DELETE
648     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
649     @Consumes(MediaType.APPLICATION_JSON)
650     @Produces(MediaType.APPLICATION_JSON)
651     @Operation(description = "Delete provided VolumeGroup instance", responses = @ApiResponse(
652             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
653     @Transactional
654     public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version,
655             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
656             @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId,
657             @Context ContainerRequestContext requestContext) throws ApiException {
658         String requestId = requestHandlerUtils.getRequestId(requestContext);
659         HashMap<String, String> instanceIdMap = new HashMap<>();
660         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
661         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
662         instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
663         return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
664                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
665     }
666
667     @POST
668     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
669     @Consumes(MediaType.APPLICATION_JSON)
670     @Produces(MediaType.APPLICATION_JSON)
671     @Operation(description = "Create NetworkInstance on a specified version and serviceInstance ",
672             responses = @ApiResponse(
673                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
674     @Transactional
675     public Response createNetworkInstance(String request, @PathParam("version") String version,
676             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
677             throws ApiException {
678         String requestId = requestHandlerUtils.getRequestId(requestContext);
679         HashMap<String, String> instanceIdMap = new HashMap<>();
680         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
681         return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
682                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
683     }
684
685     @PUT
686     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
687     @Consumes(MediaType.APPLICATION_JSON)
688     @Produces(MediaType.APPLICATION_JSON)
689     @Operation(description = "Update VolumeGroup on a specified version, serviceInstance, networkInstance",
690             responses = @ApiResponse(
691                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
692     @Transactional
693     public Response updateNetworkInstance(String request, @PathParam("version") String version,
694             @PathParam("serviceInstanceId") String serviceInstanceId,
695             @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext)
696             throws ApiException {
697         String requestId = requestHandlerUtils.getRequestId(requestContext);
698         HashMap<String, String> instanceIdMap = new HashMap<>();
699         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
700         instanceIdMap.put("networkInstanceId", networkInstanceId);
701         return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
702                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
703     }
704
705     @DELETE
706     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
707     @Consumes(MediaType.APPLICATION_JSON)
708     @Produces(MediaType.APPLICATION_JSON)
709     @Operation(description = "Delete provided Network instance", responses = @ApiResponse(
710             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
711     @Transactional
712     public Response deleteNetworkInstance(String request, @PathParam("version") String version,
713             @PathParam("serviceInstanceId") String serviceInstanceId,
714             @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext)
715             throws ApiException {
716         String requestId = requestHandlerUtils.getRequestId(requestContext);
717         HashMap<String, String> instanceIdMap = new HashMap<>();
718         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
719         instanceIdMap.put("networkInstanceId", networkInstanceId);
720         return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
721                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
722     }
723
724     @POST
725     @Path("/{version:[vV][7]}/instanceGroups")
726     @Consumes(MediaType.APPLICATION_JSON)
727     @Produces(MediaType.APPLICATION_JSON)
728     @Operation(description = "Create instanceGroups", responses = @ApiResponse(
729             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
730     @Transactional
731     public Response createInstanceGroups(String request, @PathParam("version") String version,
732             @Context ContainerRequestContext requestContext) throws ApiException {
733         String requestId = requestHandlerUtils.getRequestId(requestContext);
734         return serviceInstances(request, Action.createInstance, null, version, requestId,
735                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
736     }
737
738     @DELETE
739     @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
740     @Consumes(MediaType.APPLICATION_JSON)
741     @Produces(MediaType.APPLICATION_JSON)
742     @Operation(description = "Delete instanceGroup", responses = @ApiResponse(
743             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
744     @Transactional
745     public Response deleteInstanceGroups(@PathParam("version") String version,
746             @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
747             throws ApiException {
748         String requestId = requestHandlerUtils.getRequestId(requestContext);
749         HashMap<String, String> instanceIdMap = new HashMap<>();
750         instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
751         return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId,
752                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix), requestContext);
753     }
754
755     @POST
756     @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
757     @Consumes(MediaType.APPLICATION_JSON)
758     @Produces(MediaType.APPLICATION_JSON)
759     @Operation(description = "Add instanceGroup members", responses = @ApiResponse(
760             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
761     @Transactional
762     public Response addInstanceGroupMembers(String request, @PathParam("version") String version,
763             @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
764             throws ApiException {
765         String requestId = requestHandlerUtils.getRequestId(requestContext);
766         HashMap<String, String> instanceIdMap = new HashMap<>();
767         instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
768         return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId,
769                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
770     }
771
772     @POST
773     @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
774     @Consumes(MediaType.APPLICATION_JSON)
775     @Produces(MediaType.APPLICATION_JSON)
776     @Operation(description = "Remove instanceGroup members", responses = @ApiResponse(
777             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
778     @Transactional
779     public Response removeInstanceGroupMembers(String request, @PathParam("version") String version,
780             @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
781             throws ApiException {
782         String requestId = requestHandlerUtils.getRequestId(requestContext);
783         HashMap<String, String> instanceIdMap = new HashMap<>();
784         instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
785         return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId,
786                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
787     }
788
789     /**
790      * This method is used for POST a request to the BPEL client (BPMN).
791      *
792      * Convert the requestJson to ServiceInstanceRequest(sir), create the msoRequest object, check whether this request
793      * is already being processed in requestdb for duplicate check.
794      *
795      * Based on the alacarte flag, sir and msoRequest will do the recipe lookup from the service and servicerecipe table
796      * of catalogdb, and get the OrchestrationURI.
797      *
798      * If the present request is not the duplicate request then this request will be saved in the requestdb. and will
799      * POST a request to the BPMN engine at the OrchestrationURI fetched.
800      *
801      * @param requestJSON Json fetched as body in the API call
802      * @param action Type of action to be performed
803      * @param instanceIdMap Map of instance ids of service/vnf/vf/configuration etc..
804      * @param version Supported version of API
805      * @param requestId Unique id for the request
806      * @param requestUri
807      * @return response object
808      * @throws ApiException
809      */
810     public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap,
811             String version, String requestId, String requestUri) throws ApiException {
812         return serviceInstances(requestJSON, action, instanceIdMap, version, requestId, requestUri, null);
813
814     }
815
816     public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap,
817             String version, String requestId, String requestUri, HashMap<String, String> queryParams)
818             throws ApiException {
819         String serviceInstanceId;
820         Boolean aLaCarte = null;
821         ServiceInstancesRequest sir;
822         String apiVersion = version.substring(1);
823
824         sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
825         action = handleReplaceInstance(action, sir);
826         requestValidatorListenerRunner.runValidations(requestUri, instanceIdMap, sir, queryParams);
827
828         String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
829         InfraActiveRequests currentActiveReq =
830                 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
831         if (sir.getRequestDetails().getRequestParameters() != null) {
832             aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
833         }
834
835         requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
836                 currentActiveReq);
837         if ((action == Action.replaceInstance || action == Action.replaceInstanceRetainAssignments)
838                 && (requestScope.equals(ModelType.vnf.toString()) || requestScope.equals(ModelType.vfModule.toString()))
839                 && sir.getRequestDetails().getCloudConfiguration() == null) {
840             CloudConfiguration cloudConfiguration =
841                     getCloudConfigurationOnReplace(requestScope, instanceIdMap, currentActiveReq);
842             sir.getRequestDetails().setCloudConfiguration(cloudConfiguration);
843             setCloudConfigurationCurrentActiveRequest(cloudConfiguration, currentActiveReq);
844         }
845         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
846
847
848         int requestVersion = Integer.parseInt(version.substring(1));
849         String instanceName = null;
850         if (sir.getRequestDetails().getRequestInfo() != null) {
851             instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
852         }
853         boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
854         String vnfType = msoRequest.getVnfType(sir, requestScope, action, requestVersion);
855         String networkType = msoRequest.getNetworkType(sir, requestScope);
856         String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
857         String vfModuleType = msoRequest.getVfModuleType(sir, requestScope, action, requestVersion);
858
859         if (requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null) {
860             currentActiveReq.setVnfType(vnfType);
861         } else if (requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null) {
862             currentActiveReq.setNetworkType(networkType);
863         }
864
865         requestHandlerUtils.checkForDuplicateRequests(action, instanceIdMap, requestScope, currentActiveReq,
866                 instanceName);
867
868         ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
869
870         RequestReferences referencesResponse = new RequestReferences();
871
872         referencesResponse.setRequestId(requestId);
873
874         serviceResponse.setRequestReferences(referencesResponse);
875         RecipeLookupResult recipeLookupResult =
876                 requestHandlerUtils.getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
877         String serviceInstanceType = requestHandlerUtils.getServiceType(requestScope, sir, alaCarteFlag);
878
879         ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
880         ModelType modelType = requestHandlerUtils.getModelType(action, modelInfo);
881
882         Boolean isBaseVfModule = false;
883
884         if (modelType.equals(ModelType.vfModule)) {
885             isBaseVfModule = requestHandlerUtils.getIsBaseVfModule(modelInfo, action, vnfType, sdcServiceModelVersion,
886                     currentActiveReq);
887         }
888
889         serviceInstanceId = requestHandlerUtils.setServiceInstanceId(requestScope, sir);
890         String vnfId = "";
891         String vfModuleId = "";
892         String volumeGroupId = "";
893         String networkId = "";
894         String pnfCorrelationId = "";
895         String instanceGroupId = null;
896
897         if (sir.getVnfInstanceId() != null) {
898             vnfId = sir.getVnfInstanceId();
899         }
900
901         if (sir.getVfModuleInstanceId() != null) {
902             vfModuleId = sir.getVfModuleInstanceId();
903         }
904
905         if (sir.getVolumeGroupInstanceId() != null) {
906             volumeGroupId = sir.getVolumeGroupInstanceId();
907         }
908
909         if (sir.getNetworkInstanceId() != null) {
910             networkId = sir.getNetworkInstanceId();
911         }
912         if (sir.getInstanceGroupId() != null) {
913             instanceGroupId = sir.getInstanceGroupId();
914         }
915
916         pnfCorrelationId = getPnfCorrelationId(sir);
917
918         try {
919             infraActiveRequestsClient.save(currentActiveReq);
920         } catch (Exception e) {
921             logger.error("Exception occurred", e);
922             ErrorLoggerInfo errorLoggerInfo =
923                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
924                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
925             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
926                     ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
927         }
928
929         if (!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance
930                 && !(requestScope.equalsIgnoreCase(ModelType.vnf.name())
931                         && (action == Action.replaceInstance || action == Action.replaceInstanceRetainAssignments))) {
932             aLaCarte = true;
933         } else if (aLaCarte == null) {
934             aLaCarte = false;
935         }
936
937
938         RequestClientParameter requestClientParameter = null;
939         try {
940             requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
941                     .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
942                     .setRequestAction(action.toString()).setServiceInstanceId(serviceInstanceId)
943                     .setPnfCorrelationId(pnfCorrelationId).setVnfId(vnfId).setVfModuleId(vfModuleId)
944                     .setVolumeGroupId(volumeGroupId).setNetworkId(networkId).setServiceType(serviceInstanceType)
945                     .setVnfType(vnfType).setVfModuleType(vfModuleType).setNetworkType(networkType)
946                     .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
947                     .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri)
948                     .setInstanceGroupId(instanceGroupId).build();
949         } catch (IOException e) {
950             logger.error("Exception occurred", e);
951             ErrorLoggerInfo errorLoggerInfo =
952                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
953                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
954             throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
955                     HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
956                             .build();
957         }
958         return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
959                 recipeLookupResult.getOrchestrationURI(), requestScope);
960     }
961
962     /**
963      * @param action
964      * @param sir
965      * @return
966      */
967     protected Actions handleReplaceInstance(Actions action, ServiceInstancesRequest sir) {
968         if (action != null && action.equals(Action.replaceInstance)
969                 && sir.getRequestDetails().getRequestParameters().getRetainAssignments() != null
970                 && sir.getRequestDetails().getRequestParameters().getRetainAssignments()) {
971             action = Action.replaceInstanceRetainAssignments;
972         }
973         return action;
974     }
975
976     /**
977      * This method deletes the Instance Groups.
978      *
979      * This method will check whether the request is not duplicate in requestdb. if its not then will save as a new
980      * request. And will send a POST request to BEPL client to delete the Insatnce Groups.
981      *
982      * @param action
983      * @param instanceIdMap
984      * @param version
985      * @param requestId
986      * @param requestUri
987      * @param requestContext
988      * @return
989      * @throws ApiException
990      */
991     public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version,
992             String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
993         String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
994         Boolean aLaCarte = true;
995         String apiVersion = version.substring(1);
996         ServiceInstancesRequest sir = new ServiceInstancesRequest();
997         sir.setInstanceGroupId(instanceGroupId);
998
999         String requestScope = ModelType.instanceGroup.toString();
1000         InfraActiveRequests currentActiveReq =
1001                 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
1002         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1003         try {
1004             requestHandlerUtils.validateHeaders(requestContext);
1005         } catch (ValidationException e) {
1006             logger.error("Exception occurred", e);
1007             ErrorLoggerInfo errorLoggerInfo =
1008                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError)
1009                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1010             ValidateException validateException =
1011                     new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1012                             ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1013             requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1014             throw validateException;
1015         }
1016
1017         requestHandlerUtils.checkForDuplicateRequests(action, instanceIdMap, requestScope, currentActiveReq, null);
1018
1019         ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1020
1021         RequestReferences referencesResponse = new RequestReferences();
1022
1023         referencesResponse.setRequestId(requestId);
1024
1025         serviceResponse.setRequestReferences(referencesResponse);
1026         Boolean isBaseVfModule = false;
1027
1028         RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1029
1030         try {
1031             infraActiveRequestsClient.save(currentActiveReq);
1032         } catch (Exception e) {
1033             logger.error("Exception occurred", e);
1034             ErrorLoggerInfo errorLoggerInfo =
1035                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1036                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1037             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1038                     ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1039         }
1040
1041         RequestClientParameter requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
1042                 .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
1043                 .setRequestAction(action.toString()).setApiVersion(apiVersion).setALaCarte(aLaCarte)
1044                 .setRequestUri(requestUri).setInstanceGroupId(instanceGroupId).build();
1045
1046
1047         return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
1048                 recipeLookupResult.getOrchestrationURI(), requestScope);
1049     }
1050
1051     protected String getPnfCorrelationId(ServiceInstancesRequest sir) {
1052         return Optional.of(sir).map(ServiceInstancesRequest::getRequestDetails)
1053                 .map(RequestDetails::getRequestParameters).map(parameters -> parameters.getUserParamValue("pnfId"))
1054                 .orElse("");
1055     }
1056
1057     private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap,
1058             String version, String requestId, String requestUri) throws ApiException {
1059         String serviceInstanceId;
1060         Boolean aLaCarte = null;
1061         String apiVersion = version.substring(1);
1062         ServiceInstancesRequest sir;
1063
1064         sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
1065         String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
1066         InfraActiveRequests currentActiveReq =
1067                 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1068         if (sir.getRequestDetails().getRequestParameters() != null) {
1069             aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1070         }
1071
1072         requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
1073                 currentActiveReq);
1074         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1075         String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1076
1077         requestHandlerUtils.checkForDuplicateRequests(action, instanceIdMap, requestScope, currentActiveReq,
1078                 instanceName);
1079
1080         ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1081         RequestReferences referencesResponse = new RequestReferences();
1082         referencesResponse.setRequestId(requestId);
1083         serviceResponse.setRequestReferences(referencesResponse);
1084
1085         String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1086         String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1087
1088         if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1089             String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties"
1090                     : "ALaCarte Recipe Timeout not found in properties";
1091
1092             ErrorLoggerInfo errorLoggerInfo =
1093                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError)
1094                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1095
1096             ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND,
1097                     ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
1098
1099             requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1100
1101             throw validateException;
1102
1103         }
1104
1105         serviceInstanceId = "";
1106         String configurationId = "";
1107         String pnfCorrelationId = "";
1108
1109         if (sir.getServiceInstanceId() != null) {
1110             serviceInstanceId = sir.getServiceInstanceId();
1111         }
1112
1113         if (sir.getConfigurationId() != null) {
1114             configurationId = sir.getConfigurationId();
1115         }
1116
1117         pnfCorrelationId = getPnfCorrelationId(sir);
1118
1119         try {
1120             infraActiveRequestsClient.save(currentActiveReq);
1121         } catch (Exception e) {
1122             ErrorLoggerInfo errorLoggerInfo =
1123                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1124                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1125             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1126                     ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1127         }
1128
1129         if (!requestScope.equalsIgnoreCase(ModelType.service.name())) {
1130             aLaCarte = true;
1131         } else if (aLaCarte == null) {
1132             aLaCarte = false;
1133         }
1134         RequestClientParameter requestClientParameter = null;
1135         try {
1136             requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId).setBaseVfModule(false)
1137                     .setRecipeTimeout(Integer.parseInt(timeOut)).setRequestAction(action.toString())
1138                     .setServiceInstanceId(serviceInstanceId).setPnfCorrelationId(pnfCorrelationId)
1139                     .setConfigurationId(configurationId)
1140                     .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1141                     .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri).build();
1142         } catch (IOException e) {
1143             ErrorLoggerInfo errorLoggerInfo =
1144                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
1145                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1146             throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
1147                     HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
1148                             .build();
1149         }
1150
1151         return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri,
1152                 requestScope);
1153     }
1154
1155     protected CloudConfiguration getCloudConfigurationOnReplace(String requestScope,
1156             HashMap<String, String> instanceIdMap, InfraActiveRequests currentActiveReq) throws ApiException {
1157         logger.debug("Replace request is missing cloudConfiguration, autofilling from create.");
1158         CloudConfiguration cloudConfiguration = null;
1159         if (requestScope.equals(ModelType.vfModule.toString())) {
1160             cloudConfiguration = bpmnRequestBuilder.getCloudConfigurationVfModuleReplace(
1161                     instanceIdMap.get("vnfInstanceId"), instanceIdMap.get("vfModuleInstanceId"));
1162         } else {
1163             cloudConfiguration = bpmnRequestBuilder.mapCloudConfigurationVnf(instanceIdMap.get("vnfInstanceId"));
1164         }
1165
1166         if (cloudConfiguration == null) {
1167             String errorMessage = "CloudConfiguration not found during autofill for replace request.";
1168             logger.error(errorMessage);
1169             updateStatus(currentActiveReq, Status.FAILED, errorMessage);
1170             throw new CloudConfigurationNotFoundException(
1171                     "CloudConfiguration not found during autofill for replace request.");
1172         }
1173         return cloudConfiguration;
1174     }
1175
1176     protected void setCloudConfigurationCurrentActiveRequest(CloudConfiguration cloudConfiguration,
1177             InfraActiveRequests currentActiveRequest) {
1178         if (cloudConfiguration.getLcpCloudRegionId() != null) {
1179             currentActiveRequest.setCloudRegion(cloudConfiguration.getLcpCloudRegionId());
1180         }
1181
1182         if (cloudConfiguration.getTenantId() != null) {
1183             currentActiveRequest.setTenantId(cloudConfiguration.getTenantId());
1184         }
1185     }
1186 }