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