Add missing fields to the validation error record.
[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.logging.filter.base.ErrorCode;
44 import org.onap.so.apihandler.common.CommonConstants;
45 import org.onap.so.apihandler.common.ErrorNumbers;
46 import org.onap.so.apihandler.common.RequestClientParameter;
47 import org.onap.so.apihandlerinfra.exceptions.ApiException;
48 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
49 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
50 import org.onap.so.apihandlerinfra.infra.rest.BpmnRequestBuilder;
51 import org.onap.so.apihandlerinfra.infra.rest.exception.CloudConfigurationNotFoundException;
52 import org.onap.so.apihandlerinfra.infra.rest.handler.AbstractRestHandler;
53 import org.onap.so.apihandlerinfra.infra.rest.validators.RequestValidatorListenerRunner;
54 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
55 import org.onap.so.constants.Status;
56 import org.onap.so.db.catalog.client.CatalogDbClient;
57 import org.onap.so.db.request.beans.InfraActiveRequests;
58 import org.onap.so.db.request.client.RequestsDbClient;
59 import org.onap.so.exceptions.ValidationException;
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
827         String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
828         try {
829             requestValidatorListenerRunner.runValidations(requestUri, instanceIdMap, sir, queryParams, action);
830         } catch (ApiException e) {
831             msoRequest.createErrorRequestRecord(Status.FAILED, requestId, e.getMessage(), action, requestScope,
832                     requestJSON, requestHandlerUtils
833                             .getServiceInstanceIdForValidationError(sir, instanceIdMap, requestScope).orElse(null),
834                     sir);
835             throw e;
836         }
837
838         InfraActiveRequests currentActiveReq =
839                 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
840         if (sir.getRequestDetails().getRequestParameters() != null) {
841             aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
842         }
843
844         requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
845                 currentActiveReq);
846         if ((action == Action.replaceInstance || action == Action.replaceInstanceRetainAssignments)
847                 && (requestScope.equals(ModelType.vnf.toString()) || requestScope.equals(ModelType.vfModule.toString()))
848                 && sir.getRequestDetails().getCloudConfiguration() == null) {
849             CloudConfiguration cloudConfiguration =
850                     getCloudConfigurationOnReplace(requestScope, instanceIdMap, currentActiveReq);
851             sir.getRequestDetails().setCloudConfiguration(cloudConfiguration);
852             setCloudConfigurationCurrentActiveRequest(cloudConfiguration, currentActiveReq);
853         }
854         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
855
856         String instanceName = null;
857         if (sir.getRequestDetails().getRequestInfo() != null) {
858             instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
859         }
860         boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
861         String vnfType = msoRequest.getVnfType(sir, requestScope);
862         String networkType = msoRequest.getNetworkType(sir, requestScope);
863         String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
864         String vfModuleType = msoRequest.getVfModuleType(sir, requestScope);
865
866         if (requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null) {
867             currentActiveReq.setVnfType(vnfType);
868         } else if (requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null) {
869             currentActiveReq.setNetworkType(networkType);
870         }
871
872         requestHandlerUtils.checkForDuplicateRequests(action, instanceIdMap, requestScope, currentActiveReq,
873                 instanceName);
874
875         ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
876
877         RequestReferences referencesResponse = new RequestReferences();
878
879         referencesResponse.setRequestId(requestId);
880
881         serviceResponse.setRequestReferences(referencesResponse);
882         RecipeLookupResult recipeLookupResult =
883                 requestHandlerUtils.getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
884         String serviceInstanceType = requestHandlerUtils.getServiceType(requestScope, sir, alaCarteFlag);
885
886         ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
887         ModelType modelType = requestHandlerUtils.getModelType(action, modelInfo);
888
889         Boolean isBaseVfModule = false;
890
891         if (modelType.equals(ModelType.vfModule)) {
892             isBaseVfModule = requestHandlerUtils.getIsBaseVfModule(modelInfo, action, vnfType, sdcServiceModelVersion,
893                     currentActiveReq);
894         }
895
896         serviceInstanceId = requestHandlerUtils.setServiceInstanceId(requestScope, sir);
897         String vnfId = "";
898         String vfModuleId = "";
899         String volumeGroupId = "";
900         String networkId = "";
901         String pnfCorrelationId = "";
902         String instanceGroupId = null;
903
904         if (sir.getVnfInstanceId() != null) {
905             vnfId = sir.getVnfInstanceId();
906         }
907
908         if (sir.getVfModuleInstanceId() != null) {
909             vfModuleId = sir.getVfModuleInstanceId();
910         }
911
912         if (sir.getVolumeGroupInstanceId() != null) {
913             volumeGroupId = sir.getVolumeGroupInstanceId();
914         }
915
916         if (sir.getNetworkInstanceId() != null) {
917             networkId = sir.getNetworkInstanceId();
918         }
919         if (sir.getInstanceGroupId() != null) {
920             instanceGroupId = sir.getInstanceGroupId();
921         }
922
923         pnfCorrelationId = getPnfCorrelationId(sir);
924
925         try {
926             infraActiveRequestsClient.save(currentActiveReq);
927         } catch (Exception e) {
928             logger.error("Exception occurred", e);
929             ErrorLoggerInfo errorLoggerInfo =
930                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
931                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
932             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
933                     ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
934         }
935
936         if (!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance
937                 && !(requestScope.equalsIgnoreCase(ModelType.vnf.name())
938                         && (action == Action.replaceInstance || action == Action.replaceInstanceRetainAssignments))) {
939             aLaCarte = true;
940         } else if (aLaCarte == null) {
941             aLaCarte = false;
942         }
943
944
945         RequestClientParameter requestClientParameter;
946         try {
947             requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
948                     .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
949                     .setRequestAction(action.toString()).setServiceInstanceId(serviceInstanceId)
950                     .setPnfCorrelationId(pnfCorrelationId).setVnfId(vnfId).setVfModuleId(vfModuleId)
951                     .setVolumeGroupId(volumeGroupId).setNetworkId(networkId).setServiceType(serviceInstanceType)
952                     .setVnfType(vnfType).setVfModuleType(vfModuleType).setNetworkType(networkType)
953                     .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
954                     .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri)
955                     .setInstanceGroupId(instanceGroupId).build();
956         } catch (IOException e) {
957             logger.error("Exception occurred", e);
958             ErrorLoggerInfo errorLoggerInfo =
959                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
960                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
961             throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
962                     HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
963                             .build();
964         }
965         return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
966                 recipeLookupResult.getOrchestrationURI(), requestScope);
967     }
968
969     /**
970      * @param action
971      * @param sir
972      * @return
973      */
974     protected Actions handleReplaceInstance(Actions action, ServiceInstancesRequest sir) {
975         if (action != null && action.equals(Action.replaceInstance)
976                 && sir.getRequestDetails().getRequestParameters().getRetainAssignments() != null
977                 && sir.getRequestDetails().getRequestParameters().getRetainAssignments()) {
978             action = Action.replaceInstanceRetainAssignments;
979         }
980         return action;
981     }
982
983     /**
984      * This method deletes the Instance Groups.
985      *
986      * This method will check whether the request is not duplicate in requestdb. if its not then will save as a new
987      * request. And will send a POST request to BEPL client to delete the Insatnce Groups.
988      *
989      * @param action
990      * @param instanceIdMap
991      * @param version
992      * @param requestId
993      * @param requestUri
994      * @param requestContext
995      * @return
996      * @throws ApiException
997      */
998     public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version,
999             String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
1000         String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
1001         Boolean aLaCarte = true;
1002         String apiVersion = version.substring(1);
1003         ServiceInstancesRequest sir = new ServiceInstancesRequest();
1004         sir.setInstanceGroupId(instanceGroupId);
1005
1006         String requestScope = ModelType.instanceGroup.toString();
1007         InfraActiveRequests currentActiveReq =
1008                 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
1009         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1010         try {
1011             requestHandlerUtils.validateHeaders(requestContext);
1012         } catch (ValidationException e) {
1013             logger.error("Exception occurred", e);
1014             ErrorLoggerInfo errorLoggerInfo =
1015                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError)
1016                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1017             ValidateException validateException =
1018                     new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1019                             ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1020             requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1021             throw validateException;
1022         }
1023
1024         requestHandlerUtils.checkForDuplicateRequests(action, instanceIdMap, requestScope, currentActiveReq, null);
1025
1026         ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1027
1028         RequestReferences referencesResponse = new RequestReferences();
1029
1030         referencesResponse.setRequestId(requestId);
1031
1032         serviceResponse.setRequestReferences(referencesResponse);
1033         Boolean isBaseVfModule = false;
1034
1035         RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1036
1037         try {
1038             infraActiveRequestsClient.save(currentActiveReq);
1039         } catch (Exception e) {
1040             logger.error("Exception occurred", e);
1041             ErrorLoggerInfo errorLoggerInfo =
1042                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1043                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1044             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1045                     ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1046         }
1047
1048         RequestClientParameter requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
1049                 .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
1050                 .setRequestAction(action.toString()).setApiVersion(apiVersion).setALaCarte(aLaCarte)
1051                 .setRequestUri(requestUri).setInstanceGroupId(instanceGroupId).build();
1052
1053
1054         return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
1055                 recipeLookupResult.getOrchestrationURI(), requestScope);
1056     }
1057
1058     protected String getPnfCorrelationId(ServiceInstancesRequest sir) {
1059         return Optional.of(sir).map(ServiceInstancesRequest::getRequestDetails)
1060                 .map(RequestDetails::getRequestParameters).map(parameters -> parameters.getUserParamValue("pnfId"))
1061                 .orElse("");
1062     }
1063
1064     private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap,
1065             String version, String requestId, String requestUri) throws ApiException {
1066         String serviceInstanceId;
1067         Boolean aLaCarte = null;
1068         String apiVersion = version.substring(1);
1069         ServiceInstancesRequest sir;
1070
1071         sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
1072         String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
1073         InfraActiveRequests currentActiveReq =
1074                 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1075         if (sir.getRequestDetails().getRequestParameters() != null) {
1076             aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1077         }
1078
1079         requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
1080                 currentActiveReq);
1081         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1082         String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1083
1084         requestHandlerUtils.checkForDuplicateRequests(action, instanceIdMap, requestScope, currentActiveReq,
1085                 instanceName);
1086
1087         ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1088         RequestReferences referencesResponse = new RequestReferences();
1089         referencesResponse.setRequestId(requestId);
1090         serviceResponse.setRequestReferences(referencesResponse);
1091
1092         String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1093         String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1094
1095         if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1096             String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties"
1097                     : "ALaCarte Recipe Timeout not found in properties";
1098
1099             ErrorLoggerInfo errorLoggerInfo =
1100                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError)
1101                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1102
1103             ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND,
1104                     ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
1105
1106             requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1107
1108             throw validateException;
1109
1110         }
1111
1112         serviceInstanceId = "";
1113         String configurationId = "";
1114         String pnfCorrelationId = "";
1115
1116         if (sir.getServiceInstanceId() != null) {
1117             serviceInstanceId = sir.getServiceInstanceId();
1118         }
1119
1120         if (sir.getConfigurationId() != null) {
1121             configurationId = sir.getConfigurationId();
1122         }
1123
1124         pnfCorrelationId = getPnfCorrelationId(sir);
1125
1126         try {
1127             infraActiveRequestsClient.save(currentActiveReq);
1128         } catch (Exception e) {
1129             ErrorLoggerInfo errorLoggerInfo =
1130                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1131                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1132             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1133                     ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1134         }
1135
1136         if (!requestScope.equalsIgnoreCase(ModelType.service.name())) {
1137             aLaCarte = true;
1138         } else if (aLaCarte == null) {
1139             aLaCarte = false;
1140         }
1141         RequestClientParameter requestClientParameter = null;
1142         try {
1143             requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId).setBaseVfModule(false)
1144                     .setRecipeTimeout(Integer.parseInt(timeOut)).setRequestAction(action.toString())
1145                     .setServiceInstanceId(serviceInstanceId).setPnfCorrelationId(pnfCorrelationId)
1146                     .setConfigurationId(configurationId)
1147                     .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1148                     .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri).build();
1149         } catch (IOException e) {
1150             ErrorLoggerInfo errorLoggerInfo =
1151                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
1152                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1153             throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
1154                     HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
1155                             .build();
1156         }
1157
1158         return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri,
1159                 requestScope);
1160     }
1161
1162     protected CloudConfiguration getCloudConfigurationOnReplace(String requestScope,
1163             HashMap<String, String> instanceIdMap, InfraActiveRequests currentActiveReq) throws ApiException {
1164         logger.debug("Replace request is missing cloudConfiguration, autofilling from create.");
1165         CloudConfiguration cloudConfiguration = null;
1166         if (requestScope.equals(ModelType.vfModule.toString())) {
1167             cloudConfiguration = bpmnRequestBuilder.getCloudConfigurationVfModuleReplace(
1168                     instanceIdMap.get("vnfInstanceId"), instanceIdMap.get("vfModuleInstanceId"));
1169         } else {
1170             cloudConfiguration = bpmnRequestBuilder.mapCloudConfigurationVnf(instanceIdMap.get("vnfInstanceId"));
1171         }
1172
1173         if (cloudConfiguration == null) {
1174             String errorMessage = "CloudConfiguration not found during autofill for replace request.";
1175             logger.error(errorMessage);
1176             updateStatus(currentActiveReq, Status.FAILED, errorMessage);
1177             throw new CloudConfigurationNotFoundException(
1178                     "CloudConfiguration not found during autofill for replace request.");
1179         }
1180         return cloudConfiguration;
1181     }
1182
1183     protected void setCloudConfigurationCurrentActiveRequest(CloudConfiguration cloudConfiguration,
1184             InfraActiveRequests currentActiveRequest) {
1185         if (cloudConfiguration.getLcpCloudRegionId() != null) {
1186             currentActiveRequest.setCloudRegion(cloudConfiguration.getLcpCloudRegionId());
1187         }
1188
1189         if (cloudConfiguration.getTenantId() != null) {
1190             currentActiveRequest.setTenantId(cloudConfiguration.getTenantId());
1191         }
1192     }
1193 }