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