[SO] Create changes for SO-API and BPMN-INFRA to support CNF's through ASD
[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     @POST
406     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/upgrade")
407     @Consumes(MediaType.APPLICATION_JSON)
408     @Produces(MediaType.APPLICATION_JSON)
409     @Operation(description = "Upgrade a Service Instance to newer model", responses = @ApiResponse(
410             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
411     @Transactional
412     public Response upgradeServiceInstance(String request, @PathParam("version") String version,
413             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
414             throws ApiException {
415         String requestId = requestHandlerUtils.getRequestId(requestContext);
416         HashMap<String, String> instanceIdMap = new HashMap<>();
417         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
418
419         return serviceInstances(request, Action.upgradeInstance, instanceIdMap, version, requestId,
420                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
421     }
422
423     @POST
424     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
425     @Consumes(MediaType.APPLICATION_JSON)
426     @Produces(MediaType.APPLICATION_JSON)
427     @Operation(description = "Replace provided VNF instance", responses = @ApiResponse(
428             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
429     @Transactional
430     public Response replaceVnfInstance(String request, @PathParam("version") String version,
431             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
432             @Context ContainerRequestContext requestContext) throws ApiException {
433         String requestId = requestHandlerUtils.getRequestId(requestContext);
434         HashMap<String, String> instanceIdMap = new HashMap<>();
435         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
436         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
437         return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId,
438                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
439     }
440
441     @POST
442     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/healthcheck")
443     @Consumes(MediaType.APPLICATION_JSON)
444     @Produces(MediaType.APPLICATION_JSON)
445     @Operation(description = "HealthCheck for provided VNF instance", responses = @ApiResponse(
446             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
447     @Transactional
448     public Response cnfHealthCheck(String request, @PathParam("version") String version,
449             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
450             @Context ContainerRequestContext requestContext) throws ApiException {
451         String requestId = requestHandlerUtils.getRequestId(requestContext);
452         HashMap<String, String> instanceIdMap = new HashMap<>();
453         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
454         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
455         return serviceInstances(request, Action.healthCheck, instanceIdMap, version, requestId,
456                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
457     }
458
459     @POST
460     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/upgradeCnf")
461     @Consumes(MediaType.APPLICATION_JSON)
462     @Produces(MediaType.APPLICATION_JSON)
463     @Operation(description = "Upgrade CNF instance", responses = @ApiResponse(
464             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
465     @Transactional
466     public Response cnfUpgrade(String request, @PathParam("version") String version,
467             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
468             @Context ContainerRequestContext requestContext) throws ApiException {
469         String requestId = requestHandlerUtils.getRequestId(requestContext);
470         HashMap<String, String> instanceIdMap = new HashMap<>();
471         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
472         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
473         return serviceInstances(request, Action.upgradeCnf, instanceIdMap, version, requestId,
474                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
475     }
476
477     @PUT
478     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
479     @Consumes(MediaType.APPLICATION_JSON)
480     @Produces(MediaType.APPLICATION_JSON)
481     @Operation(description = "Update VNF on a specified version, serviceInstance and vnfInstance",
482             responses = @ApiResponse(
483                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
484     @Transactional
485     public Response updateVnfInstance(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.updateInstance, instanceIdMap, version, requestId,
493                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
494     }
495
496     @POST
497     @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
498     @Consumes(MediaType.APPLICATION_JSON)
499     @Produces(MediaType.APPLICATION_JSON)
500     @Operation(description = "Apply updated configuration", responses = @ApiResponse(
501             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
502     public Response applyUpdatedConfig(String request, @PathParam("version") String version,
503             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
504             @Context ContainerRequestContext requestContext) throws ApiException {
505         String requestId = requestHandlerUtils.getRequestId(requestContext);
506         HashMap<String, String> instanceIdMap = new HashMap<>();
507         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
508         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
509         return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId,
510                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
511     }
512
513     @POST
514     @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
515     @Consumes(MediaType.APPLICATION_JSON)
516     @Produces(MediaType.APPLICATION_JSON)
517     @Operation(description = "Recreate VNF Instance", responses = @ApiResponse(
518             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
519     public Response recreateVnfInstance(String request, @PathParam("version") String version,
520             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
521             @Context ContainerRequestContext requestContext) throws ApiException {
522         String requestId = requestHandlerUtils.getRequestId(requestContext);
523         HashMap<String, String> instanceIdMap = new HashMap<>();
524         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
525         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
526         return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId,
527                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
528     }
529
530     @DELETE
531     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
532     @Consumes(MediaType.APPLICATION_JSON)
533     @Produces(MediaType.APPLICATION_JSON)
534     @Operation(description = "Delete provided VNF instance", responses = @ApiResponse(
535             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
536     @Transactional
537     public Response deleteVnfInstance(String request, @PathParam("version") String version,
538             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
539             @Context ContainerRequestContext requestContext) throws ApiException {
540         String requestId = requestHandlerUtils.getRequestId(requestContext);
541         HashMap<String, String> instanceIdMap = new HashMap<>();
542         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
543         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
544         return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
545                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
546     }
547
548     @POST
549     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
550     @Consumes(MediaType.APPLICATION_JSON)
551     @Produces(MediaType.APPLICATION_JSON)
552     @Operation(description = "Create VfModule on a specified version, serviceInstance and vnfInstance",
553             responses = @ApiResponse(
554                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
555     @Transactional
556     public Response createVfModuleInstance(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.createInstance, instanceIdMap, version, requestId,
564                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
565     }
566
567     @POST
568     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
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 replaceVfModuleInstance(String request, @PathParam("version") String version,
576             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
577             @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
578             throws ApiException {
579         String requestId = requestHandlerUtils.getRequestId(requestContext);
580         HashMap<String, String> instanceIdMap = new HashMap<>();
581         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
582         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
583         instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
584         return serviceInstances(request, Action.replaceInstance, instanceIdMap, version, requestId,
585                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
586     }
587
588     @PUT
589     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
590     @Consumes(MediaType.APPLICATION_JSON)
591     @Produces(MediaType.APPLICATION_JSON)
592     @Operation(description = "Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",
593             responses = @ApiResponse(
594                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
595     @Transactional
596     public Response updateVfModuleInstance(String request, @PathParam("version") String version,
597             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
598             @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
599             throws ApiException {
600         String requestId = requestHandlerUtils.getRequestId(requestContext);
601         HashMap<String, String> instanceIdMap = new HashMap<>();
602         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
603         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
604         instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
605         return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
606                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
607     }
608
609     @POST
610     @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
611     @Consumes(MediaType.APPLICATION_JSON)
612     @Produces(MediaType.APPLICATION_JSON)
613     @Operation(description = "Perform VNF software update", responses = @ApiResponse(
614             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
615     @Transactional
616     public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version,
617             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
618             @Context ContainerRequestContext requestContext) 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         return serviceInstances(request, Action.inPlaceSoftwareUpdate, instanceIdMap, version, requestId,
624                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
625     }
626
627     @DELETE
628     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
629     @Consumes(MediaType.APPLICATION_JSON)
630     @Produces(MediaType.APPLICATION_JSON)
631     @Operation(description = "Delete provided VfModule instance", responses = @ApiResponse(
632             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
633     @Transactional
634     public Response deleteVfModuleInstance(String request, @PathParam("version") String version,
635             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
636             @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
637             throws ApiException {
638         String requestId = requestHandlerUtils.getRequestId(requestContext);
639         HashMap<String, String> instanceIdMap = new HashMap<>();
640         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
641         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
642         instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
643         return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
644                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
645     }
646
647     @POST
648     @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
649     @Consumes(MediaType.APPLICATION_JSON)
650     @Produces(MediaType.APPLICATION_JSON)
651     @Operation(description = "Deactivate and Cloud Delete VfModule instance", responses = @ApiResponse(
652             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
653     @Transactional
654     public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version,
655             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
656             @PathParam("vfmoduleInstanceId") String vfmoduleInstanceId, @Context ContainerRequestContext requestContext)
657             throws ApiException {
658         String requestId = requestHandlerUtils.getRequestId(requestContext);
659         HashMap<String, String> instanceIdMap = new HashMap<>();
660         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
661         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
662         instanceIdMap.put("vfModuleInstanceId", vfmoduleInstanceId);
663         Response response = serviceInstances(request, Action.deactivateAndCloudDelete, instanceIdMap, version,
664                 requestId, requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
665         return response;
666     }
667
668     @POST
669     @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
670     @Consumes(MediaType.APPLICATION_JSON)
671     @Produces(MediaType.APPLICATION_JSON)
672     @Operation(description = "VF Auto Scale Out", responses = @ApiResponse(
673             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
674     @Transactional
675     public Response scaleOutVfModule(String request, @PathParam("version") String version,
676             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
677             @Context ContainerRequestContext requestContext) throws ApiException {
678         String requestId = requestHandlerUtils.getRequestId(requestContext);
679         HashMap<String, String> instanceIdMap = new HashMap<>();
680         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
681         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
682         return serviceInstances(request, Action.scaleOut, instanceIdMap, version, requestId,
683                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
684     }
685
686     @POST
687     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
688     @Consumes(MediaType.APPLICATION_JSON)
689     @Produces(MediaType.APPLICATION_JSON)
690     @Operation(description = "Create VolumeGroup on a specified version, serviceInstance, vnfInstance",
691             responses = @ApiResponse(
692                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
693     @Transactional
694     public Response createVolumeGroupInstance(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.createInstance, instanceIdMap, version, requestId,
702                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
703     }
704
705     @PUT
706     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
707     @Consumes(MediaType.APPLICATION_JSON)
708     @Produces(MediaType.APPLICATION_JSON)
709     @Operation(description = "Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",
710             responses = @ApiResponse(
711                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
712     @Transactional
713     public Response updateVolumeGroupInstance(String request, @PathParam("version") String version,
714             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
715             @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId,
716             @Context ContainerRequestContext requestContext) throws ApiException {
717         String requestId = requestHandlerUtils.getRequestId(requestContext);
718         HashMap<String, String> instanceIdMap = new HashMap<>();
719         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
720         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
721         instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
722         return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
723                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
724     }
725
726     @DELETE
727     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
728     @Consumes(MediaType.APPLICATION_JSON)
729     @Produces(MediaType.APPLICATION_JSON)
730     @Operation(description = "Delete provided VolumeGroup instance", responses = @ApiResponse(
731             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
732     @Transactional
733     public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version,
734             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
735             @PathParam("volumeGroupInstanceId") String volumeGroupInstanceId,
736             @Context ContainerRequestContext requestContext) throws ApiException {
737         String requestId = requestHandlerUtils.getRequestId(requestContext);
738         HashMap<String, String> instanceIdMap = new HashMap<>();
739         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
740         instanceIdMap.put("vnfInstanceId", vnfInstanceId);
741         instanceIdMap.put("volumeGroupInstanceId", volumeGroupInstanceId);
742         return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
743                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
744     }
745
746
747     @POST
748     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/pnfs")
749     @Consumes(MediaType.APPLICATION_JSON)
750     @Produces(MediaType.APPLICATION_JSON)
751     @Operation(description = "Create VNF on a specified version and serviceInstance", responses = @ApiResponse(
752             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
753     @Transactional
754     public Response createPnfInstance(String request, @PathParam("version") String version,
755             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
756             throws ApiException {
757         String requestId = requestHandlerUtils.getRequestId(requestContext);
758         HashMap<String, String> instanceIdMap = new HashMap<>();
759         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
760         try {
761             return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
762                     requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
763         } catch (Exception e) {
764             logger.error("Error in pnf", e);
765             throw e;
766         }
767     }
768
769
770     @DELETE
771     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/pnfs/{pnfInstanceId}")
772     @Consumes(MediaType.APPLICATION_JSON)
773     @Produces(MediaType.APPLICATION_JSON)
774     @Operation(description = "Create PNF on a specified version and serviceInstance", responses = @ApiResponse(
775             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
776     @Transactional
777     public Response deletePnfInstance(String request, @PathParam("version") String version,
778             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("pnfInstanceId") String pnfInstanceId,
779             @Context ContainerRequestContext requestContext) throws ApiException {
780         String requestId = requestHandlerUtils.getRequestId(requestContext);
781         HashMap<String, String> instanceIdMap = new HashMap<>();
782         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
783         instanceIdMap.put("pnfInstanceId", pnfInstanceId);
784         try {
785             return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
786                     requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
787         } catch (Exception e) {
788             logger.error("Error in pnf", e);
789             throw e;
790         }
791     }
792
793     @POST
794     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
795     @Consumes(MediaType.APPLICATION_JSON)
796     @Produces(MediaType.APPLICATION_JSON)
797     @Operation(description = "Create NetworkInstance on a specified version and serviceInstance ",
798             responses = @ApiResponse(
799                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
800     @Transactional
801     public Response createNetworkInstance(String request, @PathParam("version") String version,
802             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
803             throws ApiException {
804         String requestId = requestHandlerUtils.getRequestId(requestContext);
805         HashMap<String, String> instanceIdMap = new HashMap<>();
806         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
807         return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
808                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
809     }
810
811     @PUT
812     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
813     @Consumes(MediaType.APPLICATION_JSON)
814     @Produces(MediaType.APPLICATION_JSON)
815     @Operation(description = "Update VolumeGroup on a specified version, serviceInstance, networkInstance",
816             responses = @ApiResponse(
817                     content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
818     @Transactional
819     public Response updateNetworkInstance(String request, @PathParam("version") String version,
820             @PathParam("serviceInstanceId") String serviceInstanceId,
821             @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext)
822             throws ApiException {
823         String requestId = requestHandlerUtils.getRequestId(requestContext);
824         HashMap<String, String> instanceIdMap = new HashMap<>();
825         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
826         instanceIdMap.put("networkInstanceId", networkInstanceId);
827         return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
828                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
829     }
830
831     @DELETE
832     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
833     @Consumes(MediaType.APPLICATION_JSON)
834     @Produces(MediaType.APPLICATION_JSON)
835     @Operation(description = "Delete provided Network instance", responses = @ApiResponse(
836             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
837     @Transactional
838     public Response deleteNetworkInstance(String request, @PathParam("version") String version,
839             @PathParam("serviceInstanceId") String serviceInstanceId,
840             @PathParam("networkInstanceId") String networkInstanceId, @Context ContainerRequestContext requestContext)
841             throws ApiException {
842         String requestId = requestHandlerUtils.getRequestId(requestContext);
843         HashMap<String, String> instanceIdMap = new HashMap<>();
844         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
845         instanceIdMap.put("networkInstanceId", networkInstanceId);
846         return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
847                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
848     }
849
850     @POST
851     @Path("/{version:[vV][7]}/instanceGroups")
852     @Consumes(MediaType.APPLICATION_JSON)
853     @Produces(MediaType.APPLICATION_JSON)
854     @Operation(description = "Create instanceGroups", responses = @ApiResponse(
855             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
856     @Transactional
857     public Response createInstanceGroups(String request, @PathParam("version") String version,
858             @Context ContainerRequestContext requestContext) throws ApiException {
859         String requestId = requestHandlerUtils.getRequestId(requestContext);
860         return serviceInstances(request, Action.createInstance, null, version, requestId,
861                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
862     }
863
864     @DELETE
865     @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
866     @Consumes(MediaType.APPLICATION_JSON)
867     @Produces(MediaType.APPLICATION_JSON)
868     @Operation(description = "Delete instanceGroup", responses = @ApiResponse(
869             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
870     @Transactional
871     public Response deleteInstanceGroups(@PathParam("version") String version,
872             @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
873             throws ApiException {
874         String requestId = requestHandlerUtils.getRequestId(requestContext);
875         HashMap<String, String> instanceIdMap = new HashMap<>();
876         instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
877         return deleteInstanceGroups(Action.deleteInstance, instanceIdMap, version, requestId,
878                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix), requestContext);
879     }
880
881     @POST
882     @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
883     @Consumes(MediaType.APPLICATION_JSON)
884     @Produces(MediaType.APPLICATION_JSON)
885     @Operation(description = "Add instanceGroup members", responses = @ApiResponse(
886             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
887     @Transactional
888     public Response addInstanceGroupMembers(String request, @PathParam("version") String version,
889             @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
890             throws ApiException {
891         String requestId = requestHandlerUtils.getRequestId(requestContext);
892         HashMap<String, String> instanceIdMap = new HashMap<>();
893         instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
894         return serviceInstances(request, Action.addMembers, instanceIdMap, version, requestId,
895                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
896     }
897
898     @POST
899     @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
900     @Consumes(MediaType.APPLICATION_JSON)
901     @Produces(MediaType.APPLICATION_JSON)
902     @Operation(description = "Remove instanceGroup members", responses = @ApiResponse(
903             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
904     @Transactional
905     public Response removeInstanceGroupMembers(String request, @PathParam("version") String version,
906             @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
907             throws ApiException {
908         String requestId = requestHandlerUtils.getRequestId(requestContext);
909         HashMap<String, String> instanceIdMap = new HashMap<>();
910         instanceIdMap.put(CommonConstants.INSTANCE_GROUP_INSTANCE_ID, instanceGroupId);
911         return serviceInstances(request, Action.removeMembers, instanceIdMap, version, requestId,
912                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
913     }
914
915     /**
916      * This method is used for POST a request to the BPEL client (BPMN).
917      *
918      * Convert the requestJson to ServiceInstanceRequest(sir), create the msoRequest object, check whether this request
919      * is already being processed in requestdb for duplicate check.
920      *
921      * Based on the alacarte flag, sir and msoRequest will do the recipe lookup from the service and servicerecipe table
922      * of catalogdb, and get the OrchestrationURI.
923      *
924      * If the present request is not the duplicate request then this request will be saved in the requestdb. and will
925      * POST a request to the BPMN engine at the OrchestrationURI fetched.
926      *
927      * @param requestJSON Json fetched as body in the API call
928      * @param action Type of action to be performed
929      * @param instanceIdMap Map of instance ids of service/vnf/vf/configuration etc..
930      * @param version Supported version of API
931      * @param requestId Unique id for the request
932      * @param requestUri
933      * @return response object
934      * @throws ApiException
935      */
936     public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap,
937             String version, String requestId, String requestUri) throws ApiException {
938         return serviceInstances(requestJSON, action, instanceIdMap, version, requestId, requestUri, null);
939
940     }
941
942     public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap,
943             String version, String requestId, String requestUri, HashMap<String, String> queryParams)
944             throws ApiException {
945         String serviceInstanceId;
946         Boolean aLaCarte = null;
947         ServiceInstancesRequest sir;
948         String apiVersion = version.substring(1);
949
950         sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
951         action = handleReplaceInstance(action, sir);
952
953         String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
954         try {
955             requestValidatorListenerRunner.runValidations(requestUri, instanceIdMap, sir, queryParams, action);
956         } catch (ApiException e) {
957             msoRequest.createErrorRequestRecord(Status.FAILED, requestId, e.getMessage(), action, requestScope,
958                     requestJSON, requestHandlerUtils
959                             .getServiceInstanceIdForValidationError(sir, instanceIdMap, requestScope).orElse(null),
960                     sir);
961             throw e;
962         }
963
964         InfraActiveRequests currentActiveReq =
965                 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
966         if (sir.getRequestDetails().getRequestParameters() != null) {
967             aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
968         }
969
970         requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
971                 currentActiveReq);
972         if ((action == Action.replaceInstance || action == Action.replaceInstanceRetainAssignments)
973                 && (requestScope.equals(ModelType.vnf.toString()) || requestScope.equals(ModelType.vfModule.toString())
974                         || requestScope.equals(ModelType.cnf.toString()))
975                 && sir.getRequestDetails().getCloudConfiguration() == null) {
976             CloudConfiguration cloudConfiguration =
977                     getCloudConfigurationOnReplace(requestScope, instanceIdMap, currentActiveReq);
978             sir.getRequestDetails().setCloudConfiguration(cloudConfiguration);
979             setCloudConfigurationCurrentActiveRequest(cloudConfiguration, currentActiveReq);
980         }
981         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
982
983         String instanceName = null;
984         if (sir.getRequestDetails().getRequestInfo() != null) {
985             instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
986         }
987         boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
988         String vnfType = msoRequest.getVnfType(sir, requestScope);
989         String networkType = msoRequest.getNetworkType(sir, requestScope);
990         String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
991         String vfModuleType = msoRequest.getVfModuleType(sir, requestScope);
992
993         if (requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null) {
994             currentActiveReq.setVnfType(vnfType);
995         } else if (requestScope.equalsIgnoreCase(ModelType.network.name()) && networkType != null) {
996             currentActiveReq.setNetworkType(networkType);
997         }
998
999         requestHandlerUtils.checkForDuplicateRequests(action, instanceIdMap, requestScope, currentActiveReq,
1000                 instanceName);
1001
1002         ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1003
1004         RequestReferences referencesResponse = new RequestReferences();
1005
1006         referencesResponse.setRequestId(requestId);
1007
1008         serviceResponse.setRequestReferences(referencesResponse);
1009         RecipeLookupResult recipeLookupResult =
1010                 requestHandlerUtils.getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
1011         String serviceInstanceType = requestHandlerUtils.getServiceType(requestScope, sir, alaCarteFlag);
1012
1013         ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
1014         ModelType modelType = requestHandlerUtils.getModelType(action, modelInfo);
1015
1016         Boolean isBaseVfModule = false;
1017
1018         if (modelType.equals(ModelType.vfModule)) {
1019             isBaseVfModule = requestHandlerUtils.getIsBaseVfModule(modelInfo, action, vnfType, sdcServiceModelVersion,
1020                     currentActiveReq);
1021         }
1022
1023         serviceInstanceId = requestHandlerUtils.setServiceInstanceId(requestScope, sir);
1024         String vnfId = "";
1025         String vfModuleId = "";
1026         String volumeGroupId = "";
1027         String networkId = "";
1028         String pnfCorrelationId = "";
1029         String instanceGroupId = null;
1030
1031         if (sir.getVnfInstanceId() != null) {
1032             vnfId = sir.getVnfInstanceId();
1033         }
1034
1035         if (sir.getVfModuleInstanceId() != null) {
1036             vfModuleId = sir.getVfModuleInstanceId();
1037         }
1038
1039         if (sir.getVolumeGroupInstanceId() != null) {
1040             volumeGroupId = sir.getVolumeGroupInstanceId();
1041         }
1042
1043         if (sir.getNetworkInstanceId() != null) {
1044             networkId = sir.getNetworkInstanceId();
1045         }
1046         if (sir.getInstanceGroupId() != null) {
1047             instanceGroupId = sir.getInstanceGroupId();
1048         }
1049
1050         pnfCorrelationId = getPnfCorrelationId(sir);
1051
1052         try {
1053             infraActiveRequestsClient.save(currentActiveReq);
1054         } catch (Exception e) {
1055             logger.error("Exception occurred", e);
1056             ErrorLoggerInfo errorLoggerInfo =
1057                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1058                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1059             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1060                     ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1061         }
1062
1063         if (!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance
1064                 && !requestScope.equalsIgnoreCase(ModelType.vnf.name())
1065                 && !requestScope.equalsIgnoreCase(ModelType.pnf.name())) {
1066             aLaCarte = true;
1067         } else if (aLaCarte == null) {
1068             aLaCarte = false;
1069         }
1070
1071
1072         RequestClientParameter requestClientParameter;
1073         try {
1074             requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
1075                     .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
1076                     .setRequestAction(action.toString()).setServiceInstanceId(serviceInstanceId)
1077                     .setPnfCorrelationId(pnfCorrelationId).setVnfId(vnfId).setVfModuleId(vfModuleId)
1078                     .setVolumeGroupId(volumeGroupId).setNetworkId(networkId).setServiceType(serviceInstanceType)
1079                     .setVnfType(vnfType).setVfModuleType(vfModuleType).setNetworkType(networkType)
1080                     .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1081                     .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri)
1082                     .setInstanceGroupId(instanceGroupId).build();
1083         } catch (IOException e) {
1084             logger.error("Exception occurred", e);
1085             ErrorLoggerInfo errorLoggerInfo =
1086                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
1087                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1088             throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
1089                     HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
1090                             .build();
1091         }
1092         return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
1093                 recipeLookupResult.getOrchestrationURI(), requestScope);
1094     }
1095
1096     /**
1097      * @param action
1098      * @param sir
1099      * @return
1100      */
1101     protected Actions handleReplaceInstance(Actions action, ServiceInstancesRequest sir) {
1102         if (action != null && action.equals(Action.replaceInstance)
1103                 && sir.getRequestDetails().getRequestParameters().getRetainAssignments() != null
1104                 && sir.getRequestDetails().getRequestParameters().getRetainAssignments()) {
1105             action = Action.replaceInstanceRetainAssignments;
1106         }
1107         return action;
1108     }
1109
1110     /**
1111      * This method deletes the Instance Groups.
1112      *
1113      * This method will check whether the request is not duplicate in requestdb. if its not then will save as a new
1114      * request. And will send a POST request to BEPL client to delete the Insatnce Groups.
1115      *
1116      * @param action
1117      * @param instanceIdMap
1118      * @param version
1119      * @param requestId
1120      * @param requestUri
1121      * @param requestContext
1122      * @return
1123      * @throws ApiException
1124      */
1125     public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version,
1126             String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
1127         String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
1128         Boolean aLaCarte = true;
1129         String apiVersion = version.substring(1);
1130         ServiceInstancesRequest sir = new ServiceInstancesRequest();
1131         sir.setInstanceGroupId(instanceGroupId);
1132
1133         String requestScope = ModelType.instanceGroup.toString();
1134         InfraActiveRequests currentActiveReq =
1135                 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, null, requestScope);
1136         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1137         try {
1138             requestHandlerUtils.validateHeaders(requestContext);
1139         } catch (ValidationException e) {
1140             logger.error("Exception occurred", e);
1141             ErrorLoggerInfo errorLoggerInfo =
1142                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_VALIDATION_ERROR, ErrorCode.SchemaError)
1143                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1144             ValidateException validateException =
1145                     new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
1146                             ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
1147             requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1148             throw validateException;
1149         }
1150
1151         requestHandlerUtils.checkForDuplicateRequests(action, instanceIdMap, requestScope, currentActiveReq, null);
1152
1153         ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1154
1155         RequestReferences referencesResponse = new RequestReferences();
1156
1157         referencesResponse.setRequestId(requestId);
1158
1159         serviceResponse.setRequestReferences(referencesResponse);
1160         Boolean isBaseVfModule = false;
1161
1162         RecipeLookupResult recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
1163
1164         try {
1165             infraActiveRequestsClient.save(currentActiveReq);
1166         } catch (Exception e) {
1167             logger.error("Exception occurred", e);
1168             ErrorLoggerInfo errorLoggerInfo =
1169                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1170                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1171             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1172                     ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1173         }
1174
1175         RequestClientParameter requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
1176                 .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
1177                 .setRequestAction(action.toString()).setApiVersion(apiVersion).setALaCarte(aLaCarte)
1178                 .setRequestUri(requestUri).setInstanceGroupId(instanceGroupId).build();
1179
1180
1181         return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
1182                 recipeLookupResult.getOrchestrationURI(), requestScope);
1183     }
1184
1185     protected String getPnfCorrelationId(ServiceInstancesRequest sir) {
1186         return Optional.of(sir).map(ServiceInstancesRequest::getRequestDetails)
1187                 .map(RequestDetails::getRequestParameters).map(parameters -> parameters.getUserParamValue("pnfId"))
1188                 .orElse("");
1189     }
1190
1191     private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap,
1192             String version, String requestId, String requestUri) throws ApiException {
1193         String serviceInstanceId;
1194         Boolean aLaCarte = null;
1195         String apiVersion = version.substring(1);
1196         ServiceInstancesRequest sir;
1197
1198         sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
1199         String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
1200         InfraActiveRequests currentActiveReq =
1201                 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
1202         if (sir.getRequestDetails().getRequestParameters() != null) {
1203             aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
1204         }
1205
1206         requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
1207                 currentActiveReq);
1208         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
1209         String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
1210
1211         requestHandlerUtils.checkForDuplicateRequests(action, instanceIdMap, requestScope, currentActiveReq,
1212                 instanceName);
1213
1214         ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
1215         RequestReferences referencesResponse = new RequestReferences();
1216         referencesResponse.setRequestId(requestId);
1217         serviceResponse.setRequestReferences(referencesResponse);
1218
1219         String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
1220         String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
1221
1222         if (StringUtils.isBlank(orchestrationUri) || StringUtils.isBlank(timeOut)) {
1223             String error = StringUtils.isBlank(orchestrationUri) ? "ALaCarte Orchestration URI not found in properties"
1224                     : "ALaCarte Recipe Timeout not found in properties";
1225
1226             ErrorLoggerInfo errorLoggerInfo =
1227                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError)
1228                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1229
1230             ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND,
1231                     ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
1232
1233             requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
1234
1235             throw validateException;
1236
1237         }
1238
1239         serviceInstanceId = "";
1240         String configurationId = "";
1241         String pnfCorrelationId = "";
1242
1243         if (sir.getServiceInstanceId() != null) {
1244             serviceInstanceId = sir.getServiceInstanceId();
1245         }
1246
1247         if (sir.getConfigurationId() != null) {
1248             configurationId = sir.getConfigurationId();
1249         }
1250
1251         pnfCorrelationId = getPnfCorrelationId(sir);
1252
1253         try {
1254             infraActiveRequestsClient.save(currentActiveReq);
1255         } catch (Exception e) {
1256             ErrorLoggerInfo errorLoggerInfo =
1257                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
1258                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1259             throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR,
1260                     ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
1261         }
1262
1263         if (!requestScope.equalsIgnoreCase(ModelType.service.name())) {
1264             aLaCarte = true;
1265         } else if (aLaCarte == null) {
1266             aLaCarte = false;
1267         }
1268         RequestClientParameter requestClientParameter = null;
1269         try {
1270             requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId).setBaseVfModule(false)
1271                     .setRecipeTimeout(Integer.parseInt(timeOut)).setRequestAction(action.toString())
1272                     .setServiceInstanceId(serviceInstanceId).setPnfCorrelationId(pnfCorrelationId)
1273                     .setConfigurationId(configurationId)
1274                     .setRequestDetails(requestHandlerUtils.mapJSONtoMSOStyle(requestJSON, sir, aLaCarte, action))
1275                     .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri).build();
1276         } catch (IOException e) {
1277             ErrorLoggerInfo errorLoggerInfo =
1278                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
1279                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
1280             throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
1281                     HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
1282                             .build();
1283         }
1284
1285         return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter, orchestrationUri,
1286                 requestScope);
1287     }
1288
1289     protected CloudConfiguration getCloudConfigurationOnReplace(String requestScope,
1290             HashMap<String, String> instanceIdMap, InfraActiveRequests currentActiveReq) throws ApiException {
1291         logger.debug("Replace request is missing cloudConfiguration, autofilling from create.");
1292         CloudConfiguration cloudConfiguration = null;
1293         if (requestScope.equals(ModelType.vfModule.toString())) {
1294             cloudConfiguration = bpmnRequestBuilder.getCloudConfigurationVfModuleReplace(
1295                     instanceIdMap.get("vnfInstanceId"), instanceIdMap.get("vfModuleInstanceId"));
1296         } else {
1297             cloudConfiguration = bpmnRequestBuilder.mapCloudConfigurationVnf(instanceIdMap.get("vnfInstanceId"));
1298         }
1299
1300         if (cloudConfiguration == null) {
1301             String errorMessage = "CloudConfiguration not found during autofill for replace request.";
1302             logger.error(errorMessage);
1303             updateStatus(currentActiveReq, Status.FAILED, errorMessage);
1304             throw new CloudConfigurationNotFoundException(
1305                     "CloudConfiguration not found during autofill for replace request.");
1306         }
1307         return cloudConfiguration;
1308     }
1309
1310     protected void setCloudConfigurationCurrentActiveRequest(CloudConfiguration cloudConfiguration,
1311             InfraActiveRequests currentActiveRequest) {
1312         if (cloudConfiguration.getLcpCloudRegionId() != null) {
1313             currentActiveRequest.setCloudRegion(cloudConfiguration.getLcpCloudRegionId());
1314         }
1315
1316         if (cloudConfiguration.getTenantId() != null) {
1317             currentActiveRequest.setTenantId(cloudConfiguration.getTenantId());
1318         }
1319     }
1320 }