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