Add or Delete a PNF to an Active Service
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / ServiceInstances.java
index 68fa6e4..353daf8 100644 (file)
@@ -10,9 +10,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 package org.onap.so.apihandlerinfra;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Collectors;
 import javax.transaction.Transactional;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -43,70 +41,61 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import org.apache.commons.lang.StringUtils;
 import org.apache.http.HttpStatus;
+import org.onap.logging.filter.base.ErrorCode;
 import org.onap.so.apihandler.common.CommonConstants;
 import org.onap.so.apihandler.common.ErrorNumbers;
 import org.onap.so.apihandler.common.RequestClientParameter;
 import org.onap.so.apihandlerinfra.exceptions.ApiException;
-import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
 import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
-import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
+import org.onap.so.apihandlerinfra.infra.rest.BpmnRequestBuilder;
+import org.onap.so.apihandlerinfra.infra.rest.exception.CloudConfigurationNotFoundException;
+import org.onap.so.apihandlerinfra.infra.rest.handler.AbstractRestHandler;
+import org.onap.so.apihandlerinfra.infra.rest.validators.RequestValidatorListenerRunner;
 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
-import org.onap.so.db.catalog.beans.NetworkResource;
-import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
-import org.onap.so.db.catalog.beans.Recipe;
-import org.onap.so.db.catalog.beans.ServiceRecipe;
-import org.onap.so.db.catalog.beans.VfModule;
-import org.onap.so.db.catalog.beans.VfModuleCustomization;
-import org.onap.so.db.catalog.beans.VnfRecipe;
-import org.onap.so.db.catalog.beans.VnfResource;
-import org.onap.so.db.catalog.beans.VnfResourceCustomization;
+import org.onap.so.constants.Status;
 import org.onap.so.db.catalog.client.CatalogDbClient;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.client.RequestsDbClient;
 import org.onap.so.exceptions.ValidationException;
-import org.onap.so.logger.ErrorCode;
 import org.onap.so.logger.MessageEnum;
 import org.onap.so.serviceinstancebeans.CloudConfiguration;
 import org.onap.so.serviceinstancebeans.ModelInfo;
 import org.onap.so.serviceinstancebeans.ModelType;
-import org.onap.so.serviceinstancebeans.Networks;
-import org.onap.so.serviceinstancebeans.RelatedInstance;
-import org.onap.so.serviceinstancebeans.RelatedInstanceList;
 import org.onap.so.serviceinstancebeans.RequestDetails;
-import org.onap.so.serviceinstancebeans.RequestParameters;
 import org.onap.so.serviceinstancebeans.RequestReferences;
-import org.onap.so.serviceinstancebeans.Service;
 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
 import org.onap.so.serviceinstancebeans.ServiceInstancesResponse;
-import org.onap.so.serviceinstancebeans.VfModules;
-import org.onap.so.serviceinstancebeans.Vnfs;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import org.springframework.web.client.RestTemplate;
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.info.Info;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
 
 @Component
 @Path("/onap/so/infra/serviceInstantiation")
-@Api(value = "/onap/so/infra/serviceInstantiation", description = "Infrastructure API Requests for Service Instances")
-public class ServiceInstances {
+@OpenAPIDefinition(info = @Info(title = "/onap/so/infra/serviceInstantiation",
+        description = "Infrastructure API Requests for Service Instances"))
+public class ServiceInstances extends AbstractRestHandler {
 
     private static Logger logger = LoggerFactory.getLogger(MsoRequest.class);
-    private static String NAME = "name";
-    private static String VALUE = "value";
     private static String uriPrefix = "/serviceInstantiation/";
     private static final String SAVE_TO_DB = "save instance to db";
 
     @Autowired
     private Environment env;
 
+    @Autowired
+    private RestTemplate restTemplate;
+
     @Autowired
     private CatalogDbClient catalogDbClient;
 
@@ -119,11 +108,18 @@ public class ServiceInstances {
     @Autowired
     private RequestHandlerUtils requestHandlerUtils;
 
+    @Autowired
+    private RequestValidatorListenerRunner requestValidatorListenerRunner;
+
+    @Autowired
+    private BpmnRequestBuilder bpmnRequestBuilder;
+
     @POST
     @Path("/{version:[vV][5-7]}/serviceInstances")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Create a Service Instance on a version provided", response = Response.class)
+    @Operation(description = "Create a Service Instance on a version provided", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response createServiceInstance(String request, @PathParam("version") String version,
             @Context ContainerRequestContext requestContext) throws ApiException {
@@ -136,7 +132,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/activate")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Activate provided Service Instance", response = Response.class)
+    @Operation(description = "Activate provided Service Instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response activateServiceInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
@@ -152,7 +149,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/deactivate")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Deactivate provided Service Instance", response = Response.class)
+    @Operation(description = "Deactivate provided Service Instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response deactivateServiceInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
@@ -168,7 +166,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Delete provided Service Instance", response = Response.class)
+    @Operation(description = "Delete provided Service Instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response deleteServiceInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
@@ -184,7 +183,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][7]}/serviceInstances/assign")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Assign Service Instance", response = Response.class)
+    @Operation(description = "Assign Service Instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response assignServiceInstance(String request, @PathParam("version") String version,
             @Context ContainerRequestContext requestContext) throws ApiException {
@@ -197,13 +197,14 @@ public class ServiceInstances {
     @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/unassign")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Unassign Service Instance", response = Response.class)
+    @Operation(description = "Unassign Service Instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response unassignServiceInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
             throws ApiException {
         String requestId = requestHandlerUtils.getRequestId(requestContext);
-        HashMap<String, String> instanceIdMap = new HashMap<String, String>();
+        HashMap<String, String> instanceIdMap = new HashMap<>();
         instanceIdMap.put("serviceInstanceId", serviceInstanceId);
         return serviceInstances(request, Action.unassignInstance, instanceIdMap, version, requestId,
                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
@@ -213,7 +214,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Create Port Mirroring Configuration", response = Response.class)
+    @Operation(description = "Create Port Mirroring Configuration", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response createPortConfiguration(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
@@ -229,7 +231,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Delete provided Port", response = Response.class)
+    @Operation(description = "Delete provided Port", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response deletePortConfiguration(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId,
@@ -247,7 +250,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/enablePort")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Enable Port Mirroring", response = Response.class)
+    @Operation(description = "Enable Port Mirroring", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response enablePort(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId,
@@ -265,7 +269,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/disablePort")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Disable Port Mirroring", response = Response.class)
+    @Operation(description = "Disable Port Mirroring", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response disablePort(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId,
@@ -283,7 +288,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/activate")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Activate Port Mirroring", response = Response.class)
+    @Operation(description = "Activate Port Mirroring", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response activatePort(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId,
@@ -301,7 +307,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/configurations/{configurationInstanceId}/deactivate")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Deactivate Port Mirroring", response = Response.class)
+    @Operation(description = "Deactivate Port Mirroring", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response deactivatePort(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId,
@@ -319,7 +326,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/addRelationships")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Add Relationships to a Service Instance", response = Response.class)
+    @Operation(description = "Add Relationships to a Service Instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response addRelationships(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
@@ -335,7 +343,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/removeRelationships")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Remove Relationships from Service Instance", response = Response.class)
+    @Operation(description = "Remove Relationships from Service Instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response removeRelationships(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
@@ -351,7 +360,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Create VNF on a specified version and serviceInstance", response = Response.class)
+    @Operation(description = "Create VNF on a specified version and serviceInstance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response createVnfInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
@@ -368,11 +378,30 @@ public class ServiceInstances {
         }
     }
 
+    @POST
+    @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/upgrade")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "Upgrade a Service Instance to newer model", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Transactional
+    public Response upgradeServiceInstance(String request, @PathParam("version") String version,
+            @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
+            throws ApiException {
+        String requestId = requestHandlerUtils.getRequestId(requestContext);
+        HashMap<String, String> instanceIdMap = new HashMap<>();
+        instanceIdMap.put("serviceInstanceId", serviceInstanceId);
+
+        return serviceInstances(request, Action.upgradeInstance, instanceIdMap, version, requestId,
+                requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
+    }
+
     @POST
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/replace")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Replace provided VNF instance", response = Response.class)
+    @Operation(description = "Replace provided VNF instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response replaceVnfInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
@@ -385,12 +414,49 @@ public class ServiceInstances {
                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
     }
 
+    @POST
+    @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/healthcheck")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "HealthCheck for provided VNF instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Transactional
+    public Response cnfHealthCheck(String request, @PathParam("version") String version,
+            @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
+            @Context ContainerRequestContext requestContext) throws ApiException {
+        String requestId = requestHandlerUtils.getRequestId(requestContext);
+        HashMap<String, String> instanceIdMap = new HashMap<>();
+        instanceIdMap.put("serviceInstanceId", serviceInstanceId);
+        instanceIdMap.put("vnfInstanceId", vnfInstanceId);
+        return serviceInstances(request, Action.healthCheck, instanceIdMap, version, requestId,
+                requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
+    }
+
+    @POST
+    @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/upgradeCnf")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "Upgrade CNF instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Transactional
+    public Response cnfUpgrade(String request, @PathParam("version") String version,
+            @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
+            @Context ContainerRequestContext requestContext) throws ApiException {
+        String requestId = requestHandlerUtils.getRequestId(requestContext);
+        HashMap<String, String> instanceIdMap = new HashMap<>();
+        instanceIdMap.put("serviceInstanceId", serviceInstanceId);
+        instanceIdMap.put("vnfInstanceId", vnfInstanceId);
+        return serviceInstances(request, Action.upgradeCnf, instanceIdMap, version, requestId,
+                requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
+    }
+
     @PUT
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Update VNF on a specified version, serviceInstance and vnfInstance",
-            response = Response.class)
+    @Operation(description = "Update VNF on a specified version, serviceInstance and vnfInstance",
+            responses = @ApiResponse(
+                    content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response updateVnfInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
@@ -407,7 +473,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/applyUpdatedConfig")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Apply updated configuration", response = Response.class)
+    @Operation(description = "Apply updated configuration", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     public Response applyUpdatedConfig(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
             @Context ContainerRequestContext requestContext) throws ApiException {
@@ -423,7 +490,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Recreate VNF Instance", response = Response.class)
+    @Operation(description = "Recreate VNF Instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     public Response recreateVnfInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
             @Context ContainerRequestContext requestContext) throws ApiException {
@@ -435,12 +503,12 @@ public class ServiceInstances {
                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
     }
 
-
     @DELETE
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Delete provided VNF instance", response = Response.class)
+    @Operation(description = "Delete provided VNF instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response deleteVnfInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
@@ -457,8 +525,9 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Create VfModule on a specified version, serviceInstance and vnfInstance",
-            response = Response.class)
+    @Operation(description = "Create VfModule on a specified version, serviceInstance and vnfInstance",
+            responses = @ApiResponse(
+                    content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response createVfModuleInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
@@ -475,8 +544,9 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/replace")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Create VfModule on a specified version, serviceInstance and vnfInstance",
-            response = Response.class)
+    @Operation(description = "Create VfModule on a specified version, serviceInstance and vnfInstance",
+            responses = @ApiResponse(
+                    content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response replaceVfModuleInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
@@ -495,8 +565,9 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",
-            response = Response.class)
+    @Operation(description = "Update VfModule on a specified version, serviceInstance, vnfInstance and vfModule",
+            responses = @ApiResponse(
+                    content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response updateVfModuleInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
@@ -515,7 +586,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][6-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/inPlaceSoftwareUpdate")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Perform VNF software update", response = Response.class)
+    @Operation(description = "Perform VNF software update", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response inPlaceSoftwareUpdate(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
@@ -532,7 +604,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Delete provided VfModule instance", response = Response.class)
+    @Operation(description = "Delete provided VfModule instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response deleteVfModuleInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
@@ -551,7 +624,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/{vfmoduleInstanceId}/deactivateAndCloudDelete")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Deactivate and Cloud Delete VfModule instance", response = Response.class)
+    @Operation(description = "Deactivate and Cloud Delete VfModule instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response deactivateAndCloudDeleteVfModuleInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
@@ -571,7 +645,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/vfModules/scaleOut")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "VF Auto Scale Out", response = Response.class)
+    @Operation(description = "VF Auto Scale Out", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response scaleOutVfModule(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
@@ -584,13 +659,13 @@ public class ServiceInstances {
                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
     }
 
-
     @POST
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Create VolumeGroup on a specified version, serviceInstance, vnfInstance",
-            response = Response.class)
+    @Operation(description = "Create VolumeGroup on a specified version, serviceInstance, vnfInstance",
+            responses = @ApiResponse(
+                    content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response createVolumeGroupInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
@@ -607,8 +682,9 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",
-            response = Response.class)
+    @Operation(description = "Update VolumeGroup on a specified version, serviceInstance, vnfInstance and volumeGroup",
+            responses = @ApiResponse(
+                    content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response updateVolumeGroupInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
@@ -627,7 +703,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/volumeGroups/{volumeGroupInstanceId}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Delete provided VolumeGroup instance", response = Response.class)
+    @Operation(description = "Delete provided VolumeGroup instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response deleteVolumeGroupInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("vnfInstanceId") String vnfInstanceId,
@@ -642,12 +719,60 @@ public class ServiceInstances {
                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
     }
 
+
+    @POST
+    @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/pnfs")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "Create VNF on a specified version and serviceInstance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Transactional
+    public Response createPnfInstance(String request, @PathParam("version") String version,
+            @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
+            throws ApiException {
+        String requestId = requestHandlerUtils.getRequestId(requestContext);
+        HashMap<String, String> instanceIdMap = new HashMap<>();
+        instanceIdMap.put("serviceInstanceId", serviceInstanceId);
+        try {
+            return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
+                    requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
+        } catch (Exception e) {
+            logger.error("Error in pnf", e);
+            throw e;
+        }
+    }
+
+
+    @DELETE
+    @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/pnfs/{pnfInstanceId}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "Create PNF on a specified version and serviceInstance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Transactional
+    public Response deletePnfInstance(String request, @PathParam("version") String version,
+            @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("pnfInstanceId") String pnfInstanceId,
+            @Context ContainerRequestContext requestContext) throws ApiException {
+        String requestId = requestHandlerUtils.getRequestId(requestContext);
+        HashMap<String, String> instanceIdMap = new HashMap<>();
+        instanceIdMap.put("serviceInstanceId", serviceInstanceId);
+        instanceIdMap.put("pnfInstanceId", pnfInstanceId);
+        try {
+            return serviceInstances(request, Action.deleteInstance, instanceIdMap, version, requestId,
+                    requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
+        } catch (Exception e) {
+            logger.error("Error in pnf", e);
+            throw e;
+        }
+    }
+
     @POST
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Create NetworkInstance on a specified version and serviceInstance ",
-            response = Response.class)
+    @Operation(description = "Create NetworkInstance on a specified version and serviceInstance ",
+            responses = @ApiResponse(
+                    content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response createNetworkInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
@@ -663,8 +788,9 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Update VolumeGroup on a specified version, serviceInstance, networkInstance",
-            response = Response.class)
+    @Operation(description = "Update VolumeGroup on a specified version, serviceInstance, networkInstance",
+            responses = @ApiResponse(
+                    content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response updateNetworkInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId,
@@ -682,7 +808,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks/{networkInstanceId}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Delete provided Network instance", response = Response.class)
+    @Operation(description = "Delete provided Network instance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response deleteNetworkInstance(String request, @PathParam("version") String version,
             @PathParam("serviceInstanceId") String serviceInstanceId,
@@ -700,7 +827,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][7]}/instanceGroups")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Create instanceGroups", response = Response.class)
+    @Operation(description = "Create instanceGroups", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response createInstanceGroups(String request, @PathParam("version") String version,
             @Context ContainerRequestContext requestContext) throws ApiException {
@@ -713,7 +841,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Delete instanceGroup", response = Response.class)
+    @Operation(description = "Delete instanceGroup", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response deleteInstanceGroups(@PathParam("version") String version,
             @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
@@ -729,7 +858,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/addMembers")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Add instanceGroup members", response = Response.class)
+    @Operation(description = "Add instanceGroup members", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response addInstanceGroupMembers(String request, @PathParam("version") String version,
             @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
@@ -745,7 +875,8 @@ public class ServiceInstances {
     @Path("/{version:[vV][7]}/instanceGroups/{instanceGroupId}/removeMembers")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @ApiOperation(value = "Remove instanceGroup members", response = Response.class)
+    @Operation(description = "Remove instanceGroup members", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
     @Transactional
     public Response removeInstanceGroupMembers(String request, @PathParam("version") String version,
             @PathParam("instanceGroupId") String instanceGroupId, @Context ContainerRequestContext requestContext)
@@ -757,36 +888,82 @@ public class ServiceInstances {
                 requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
     }
 
+    /**
+     * This method is used for POST a request to the BPEL client (BPMN).
+     *
+     * Convert the requestJson to ServiceInstanceRequest(sir), create the msoRequest object, check whether this request
+     * is already being processed in requestdb for duplicate check.
+     *
+     * Based on the alacarte flag, sir and msoRequest will do the recipe lookup from the service and servicerecipe table
+     * of catalogdb, and get the OrchestrationURI.
+     *
+     * If the present request is not the duplicate request then this request will be saved in the requestdb. and will
+     * POST a request to the BPMN engine at the OrchestrationURI fetched.
+     *
+     * @param requestJSON Json fetched as body in the API call
+     * @param action Type of action to be performed
+     * @param instanceIdMap Map of instance ids of service/vnf/vf/configuration etc..
+     * @param version Supported version of API
+     * @param requestId Unique id for the request
+     * @param requestUri
+     * @return response object
+     * @throws ApiException
+     */
     public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap,
             String version, String requestId, String requestUri) throws ApiException {
-        String serviceInstanceId = (instanceIdMap == null) ? null : instanceIdMap.get("serviceInstanceId");
+        return serviceInstances(requestJSON, action, instanceIdMap, version, requestId, requestUri, null);
+
+    }
+
+    public Response serviceInstances(String requestJSON, Actions action, HashMap<String, String> instanceIdMap,
+            String version, String requestId, String requestUri, HashMap<String, String> queryParams)
+            throws ApiException {
+        String serviceInstanceId;
         Boolean aLaCarte = null;
-        long startTime = System.currentTimeMillis();
-        ServiceInstancesRequest sir = null;
+        ServiceInstancesRequest sir;
         String apiVersion = version.substring(1);
 
         sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
         action = handleReplaceInstance(action, sir);
+
         String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
+        try {
+            requestValidatorListenerRunner.runValidations(requestUri, instanceIdMap, sir, queryParams, action);
+        } catch (ApiException e) {
+            msoRequest.createErrorRequestRecord(Status.FAILED, requestId, e.getMessage(), action, requestScope,
+                    requestJSON, requestHandlerUtils
+                            .getServiceInstanceIdForValidationError(sir, instanceIdMap, requestScope).orElse(null),
+                    sir);
+            throw e;
+        }
+
         InfraActiveRequests currentActiveReq =
                 msoRequest.createRequestObject(sir, action, requestId, Status.IN_PROGRESS, requestJSON, requestScope);
         if (sir.getRequestDetails().getRequestParameters() != null) {
             aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
         }
+
         requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
                 currentActiveReq);
+        if ((action == Action.replaceInstance || action == Action.replaceInstanceRetainAssignments)
+                && (requestScope.equals(ModelType.vnf.toString()) || requestScope.equals(ModelType.vfModule.toString()))
+                && sir.getRequestDetails().getCloudConfiguration() == null) {
+            CloudConfiguration cloudConfiguration =
+                    getCloudConfigurationOnReplace(requestScope, instanceIdMap, currentActiveReq);
+            sir.getRequestDetails().setCloudConfiguration(cloudConfiguration);
+            setCloudConfigurationCurrentActiveRequest(cloudConfiguration, currentActiveReq);
+        }
         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
 
-        int requestVersion = Integer.parseInt(version.substring(1));
         String instanceName = null;
         if (sir.getRequestDetails().getRequestInfo() != null) {
             instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
         }
         boolean alaCarteFlag = msoRequest.getAlacarteFlag(sir);
-        String vnfType = msoRequest.getVnfType(sir, requestScope, action, requestVersion);
+        String vnfType = msoRequest.getVnfType(sir, requestScope);
         String networkType = msoRequest.getNetworkType(sir, requestScope);
         String sdcServiceModelVersion = msoRequest.getSDCServiceModelVersion(sir);
-        String vfModuleType = msoRequest.getVfModuleType(sir, requestScope, action, requestVersion);
+        String vfModuleType = msoRequest.getVfModuleType(sir, requestScope);
 
         if (requestScope.equalsIgnoreCase(ModelType.vnf.name()) && vnfType != null) {
             currentActiveReq.setVnfType(vnfType);
@@ -794,19 +971,9 @@ public class ServiceInstances {
             currentActiveReq.setNetworkType(networkType);
         }
 
-        InfraActiveRequests dup = null;
-        boolean inProgress = false;
+        requestHandlerUtils.checkForDuplicateRequests(action, instanceIdMap, requestScope, currentActiveReq,
+                instanceName);
 
-        dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, instanceName, requestScope, currentActiveReq);
-
-        if (dup != null) {
-            inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
-        }
-
-        if (dup != null && inProgress) {
-            requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, instanceName,
-                    requestScope, dup);
-        }
         ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
 
         RequestReferences referencesResponse = new RequestReferences();
@@ -815,7 +982,7 @@ public class ServiceInstances {
 
         serviceResponse.setRequestReferences(referencesResponse);
         RecipeLookupResult recipeLookupResult =
-                getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
+                requestHandlerUtils.getServiceInstanceOrchestrationURI(sir, action, alaCarteFlag, currentActiveReq);
         String serviceInstanceType = requestHandlerUtils.getServiceType(requestScope, sir, alaCarteFlag);
 
         ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
@@ -860,6 +1027,7 @@ public class ServiceInstances {
         try {
             infraActiveRequestsClient.save(currentActiveReq);
         } catch (Exception e) {
+            logger.error("Exception occurred", e);
             ErrorLoggerInfo errorLoggerInfo =
                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
@@ -867,13 +1035,16 @@ public class ServiceInstances {
                     ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e).errorInfo(errorLoggerInfo).build();
         }
 
-        if (!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance) {
+        if (!requestScope.equalsIgnoreCase(ModelType.service.name()) && action != Action.recreateInstance
+                && !requestScope.equalsIgnoreCase(ModelType.vnf.name())
+                && !requestScope.equalsIgnoreCase(ModelType.pnf.name())) {
             aLaCarte = true;
         } else if (aLaCarte == null) {
             aLaCarte = false;
         }
 
-        RequestClientParameter requestClientParameter = null;
+
+        RequestClientParameter requestClientParameter;
         try {
             requestClientParameter = new RequestClientParameter.Builder().setRequestId(requestId)
                     .setBaseVfModule(isBaseVfModule).setRecipeTimeout(recipeLookupResult.getRecipeTimeout())
@@ -885,6 +1056,7 @@ public class ServiceInstances {
                     .setApiVersion(apiVersion).setALaCarte(aLaCarte).setRequestUri(requestUri)
                     .setInstanceGroupId(instanceGroupId).build();
         } catch (IOException e) {
+            logger.error("Exception occurred", e);
             ErrorLoggerInfo errorLoggerInfo =
                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
@@ -910,11 +1082,25 @@ public class ServiceInstances {
         return action;
     }
 
+    /**
+     * This method deletes the Instance Groups.
+     *
+     * This method will check whether the request is not duplicate in requestdb. if its not then will save as a new
+     * request. And will send a POST request to BEPL client to delete the Insatnce Groups.
+     *
+     * @param action
+     * @param instanceIdMap
+     * @param version
+     * @param requestId
+     * @param requestUri
+     * @param requestContext
+     * @return
+     * @throws ApiException
+     */
     public Response deleteInstanceGroups(Actions action, HashMap<String, String> instanceIdMap, String version,
             String requestId, String requestUri, ContainerRequestContext requestContext) throws ApiException {
         String instanceGroupId = instanceIdMap.get(CommonConstants.INSTANCE_GROUP_INSTANCE_ID);
         Boolean aLaCarte = true;
-        long startTime = System.currentTimeMillis();
         String apiVersion = version.substring(1);
         ServiceInstancesRequest sir = new ServiceInstancesRequest();
         sir.setInstanceGroupId(instanceGroupId);
@@ -937,18 +1123,7 @@ public class ServiceInstances {
             throw validateException;
         }
 
-        InfraActiveRequests dup =
-                requestHandlerUtils.duplicateCheck(action, instanceIdMap, null, requestScope, currentActiveReq);
-        boolean inProgress = false;
-
-        if (dup != null) {
-            inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
-        }
-
-        if (dup != null && inProgress) {
-            requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, null, requestScope,
-                    dup);
-        }
+        requestHandlerUtils.checkForDuplicateRequests(action, instanceIdMap, requestScope, currentActiveReq, null);
 
         ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
 
@@ -964,6 +1139,7 @@ public class ServiceInstances {
         try {
             infraActiveRequestsClient.save(currentActiveReq);
         } catch (Exception e) {
+            logger.error("Exception occurred", e);
             ErrorLoggerInfo errorLoggerInfo =
                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
@@ -976,6 +1152,7 @@ public class ServiceInstances {
                 .setRequestAction(action.toString()).setApiVersion(apiVersion).setALaCarte(aLaCarte)
                 .setRequestUri(requestUri).setInstanceGroupId(instanceGroupId).build();
 
+
         return requestHandlerUtils.postBPELRequest(currentActiveReq, requestClientParameter,
                 recipeLookupResult.getOrchestrationURI(), requestScope);
     }
@@ -986,586 +1163,12 @@ public class ServiceInstances {
                 .orElse("");
     }
 
-    protected RecipeLookupResult getServiceInstanceOrchestrationURI(ServiceInstancesRequest sir, Actions action,
-            boolean alaCarteFlag, InfraActiveRequests currentActiveReq) throws ApiException {
-        RecipeLookupResult recipeLookupResult = null;
-        // if the aLaCarte flag is set to TRUE, the API-H should choose the VID_DEFAULT recipe for the requested action
-        ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
-        // Query MSO Catalog DB
-
-        if (action == Action.applyUpdatedConfig || action == Action.inPlaceSoftwareUpdate) {
-            recipeLookupResult = getDefaultVnfUri(sir, action);
-        } else if (action == Action.addMembers || action == Action.removeMembers) {
-            recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
-        } else if (modelInfo.getModelType().equals(ModelType.service)) {
-            try {
-                recipeLookupResult = getServiceURI(sir, action, alaCarteFlag);
-            } catch (IOException e) {
-                ErrorLoggerInfo errorLoggerInfo =
-                        new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
-                                .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-
-
-                ValidateException validateException =
-                        new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
-                                ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
-
-                requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
-
-                throw validateException;
-            }
-        } else if (modelInfo.getModelType().equals(ModelType.vfModule)
-                || modelInfo.getModelType().equals(ModelType.volumeGroup)
-                || modelInfo.getModelType().equals(ModelType.vnf)) {
-            try {
-                recipeLookupResult = getVnfOrVfModuleUri(sir, action);
-            } catch (ValidationException e) {
-                ErrorLoggerInfo errorLoggerInfo =
-                        new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
-                                .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-
-
-                ValidateException validateException =
-                        new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
-                                ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
-
-                requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
-
-                throw validateException;
-            }
-        } else if (modelInfo.getModelType().equals(ModelType.network)) {
-            try {
-                recipeLookupResult = getNetworkUri(sir, action);
-            } catch (ValidationException e) {
-
-                ErrorLoggerInfo errorLoggerInfo =
-                        new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
-                                .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-
-
-                ValidateException validateException =
-                        new ValidateException.Builder(e.getMessage(), HttpStatus.SC_BAD_REQUEST,
-                                ErrorNumbers.SVC_BAD_PARAMETER).cause(e).errorInfo(errorLoggerInfo).build();
-                requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
-
-                throw validateException;
-            }
-        } else if (modelInfo.getModelType().equals(ModelType.instanceGroup)) {
-            recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
-        }
-
-        if (recipeLookupResult == null) {
-            ErrorLoggerInfo errorLoggerInfo =
-                    new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
-                            .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-
-
-            RecipeNotFoundException recipeNotFoundExceptionException =
-                    new RecipeNotFoundException.Builder("Recipe could not be retrieved from catalog DB.",
-                            HttpStatus.SC_NOT_FOUND, ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo)
-                                    .build();
-
-            requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED,
-                    recipeNotFoundExceptionException.getMessage());
-            throw recipeNotFoundExceptionException;
-        }
-        return recipeLookupResult;
-    }
-
-    protected RecipeLookupResult getServiceURI(ServiceInstancesRequest servInstReq, Actions action,
-            boolean alaCarteFlag) throws IOException {
-        // SERVICE REQUEST
-        // Construct the default service name
-        // TODO need to make this a configurable property
-        String defaultServiceModelName = requestHandlerUtils.getDefaultModel(servInstReq);
-        RequestDetails requestDetails = servInstReq.getRequestDetails();
-        ModelInfo modelInfo = requestDetails.getModelInfo();
-        org.onap.so.db.catalog.beans.Service serviceRecord;
-        List<org.onap.so.db.catalog.beans.Service> serviceRecordList;
-        ServiceRecipe recipe = null;
-
-        if (alaCarteFlag) {
-            serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
-            if (serviceRecord != null) {
-                recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),
-                        action.toString());
-            }
-        } else {
-            serviceRecord = catalogDbClient.getServiceByID(modelInfo.getModelVersionId());
-            recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(modelInfo.getModelVersionId(),
-                    action.toString());
-            if (recipe == null) {
-                serviceRecordList = catalogDbClient
-                        .getServiceByModelInvariantUUIDOrderByModelVersionDesc(modelInfo.getModelInvariantId());
-                if (!serviceRecordList.isEmpty()) {
-                    for (org.onap.so.db.catalog.beans.Service record : serviceRecordList) {
-                        recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(record.getModelUUID(),
-                                action.toString());
-                        if (recipe != null) {
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-
-        // if an aLaCarte flag was sent in the request, throw an error if the recipe was not found
-        RequestParameters reqParam = requestDetails.getRequestParameters();
-        if (reqParam != null && alaCarteFlag && recipe == null) {
-            return null;
-        } else if (!alaCarteFlag && recipe != null && Action.createInstance.equals(action)) {
-            mapToLegacyRequest(requestDetails);
-        } else if (recipe == null) { // aLaCarte wasn't sent, so we'll try the default
-            serviceRecord = catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
-            recipe = catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceRecord.getModelUUID(),
-                    action.toString());
-        }
-        if (modelInfo.getModelVersionId() == null) {
-            modelInfo.setModelVersionId(serviceRecord.getModelUUID());
-        }
-        if (recipe == null) {
-            return null;
-        }
-        return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout());
-    }
-
-    protected void mapToLegacyRequest(RequestDetails requestDetails) throws IOException {
-        RequestParameters reqParam;
-        if (requestDetails.getRequestParameters() == null) {
-            reqParam = new RequestParameters();
-        } else {
-            reqParam = requestDetails.getRequestParameters();
-        }
-        if (requestDetails.getCloudConfiguration() == null) {
-            CloudConfiguration cloudConfig = configureCloudConfig(reqParam);
-            if (cloudConfig != null) {
-                requestDetails.setCloudConfiguration(cloudConfig);
-            }
-        }
-
-        List<Map<String, Object>> userParams = configureUserParams(reqParam);
-        if (!userParams.isEmpty()) {
-            if (reqParam == null) {
-                requestDetails.setRequestParameters(new RequestParameters());
-            }
-            requestDetails.getRequestParameters().setUserParams(userParams);
-        }
-    }
-
-    protected CloudConfiguration configureCloudConfig(RequestParameters reqParams) throws IOException {
-
-        for (Map<String, Object> params : reqParams.getUserParams()) {
-            if (params.containsKey("service")) {
-                Service service = serviceMapper(params);
-
-                Optional<CloudConfiguration> targetConfiguration = addCloudConfig(service.getCloudConfiguration());
-
-                if (targetConfiguration.isPresent()) {
-                    return targetConfiguration.get();
-                } else {
-                    for (Networks network : service.getResources().getNetworks()) {
-                        targetConfiguration = addCloudConfig(network.getCloudConfiguration());
-                        if (targetConfiguration.isPresent()) {
-                            return targetConfiguration.get();
-                        }
-                    }
-
-                    for (Vnfs vnf : service.getResources().getVnfs()) {
-                        targetConfiguration = addCloudConfig(vnf.getCloudConfiguration());
-
-                        if (targetConfiguration.isPresent()) {
-                            return targetConfiguration.get();
-                        }
-
-                        for (VfModules vfModule : vnf.getVfModules()) {
-                            targetConfiguration = addCloudConfig(vfModule.getCloudConfiguration());
-
-                            if (targetConfiguration.isPresent()) {
-                                return targetConfiguration.get();
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private Optional<CloudConfiguration> addCloudConfig(CloudConfiguration sourceCloudConfiguration) {
-        CloudConfiguration targetConfiguration = new CloudConfiguration();
-        if (sourceCloudConfiguration != null) {
-            targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
-            targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
-            targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
-            targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
-            return Optional.of(targetConfiguration);
-        }
-        return Optional.empty();
-    }
-
-    protected List<Map<String, Object>> configureUserParams(RequestParameters reqParams) throws IOException {
-        logger.debug("Configuring UserParams for Macro Request");
-        Map<String, Object> userParams = new HashMap<>();
-
-        for (Map<String, Object> params : reqParams.getUserParams()) {
-            if (params.containsKey("service")) {
-                Service service = serviceMapper(params);
-
-                addUserParams(userParams, service.getInstanceParams());
-
-                for (Networks network : service.getResources().getNetworks()) {
-                    addUserParams(userParams, network.getInstanceParams());
-                }
-
-                for (Vnfs vnf : service.getResources().getVnfs()) {
-                    addUserParams(userParams, vnf.getInstanceParams());
-
-                    for (VfModules vfModule : vnf.getVfModules()) {
-                        addUserParams(userParams, vfModule.getInstanceParams());
-                    }
-                }
-            }
-        }
-
-        return mapFlatMapToNameValue(userParams);
-    }
-
-    private Service serviceMapper(Map<String, Object> params)
-            throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
-        ObjectMapper obj = new ObjectMapper();
-        String input = obj.writeValueAsString(params.get("service"));
-        return obj.readValue(input, Service.class);
-    }
-
-    private void addUserParams(Map<String, Object> targetUserParams, List<Map<String, String>> sourceUserParams) {
-        for (Map<String, String> map : sourceUserParams) {
-            for (Map.Entry<String, String> entry : map.entrySet()) {
-                targetUserParams.put(entry.getKey(), entry.getValue());
-            }
-        }
-    }
-
-    protected List<Map<String, Object>> mapFlatMapToNameValue(Map<String, Object> flatMap) {
-        List<Map<String, Object>> targetUserParams = new ArrayList<>();
-
-        for (Map.Entry<String, Object> map : flatMap.entrySet()) {
-            Map<String, Object> targetMap = new HashMap<>();
-            targetMap.put(NAME, map.getKey());
-            targetMap.put(VALUE, map.getValue());
-            targetUserParams.add(targetMap);
-        }
-        return targetUserParams;
-    }
-
-    private RecipeLookupResult getVnfOrVfModuleUri(ServiceInstancesRequest servInstReq, Actions action)
-            throws ValidationException {
-
-        ModelInfo modelInfo = servInstReq.getRequestDetails().getModelInfo();
-        String vnfComponentType = modelInfo.getModelType().name();
-
-        RelatedInstanceList[] instanceList = null;
-        if (servInstReq.getRequestDetails() != null) {
-            instanceList = servInstReq.getRequestDetails().getRelatedInstanceList();
-        }
-
-        Recipe recipe = null;
-        String defaultSource = requestHandlerUtils.getDefaultModel(servInstReq);
-        String modelCustomizationId = modelInfo.getModelCustomizationId();
-        String modelCustomizationName = modelInfo.getModelCustomizationName();
-        String relatedInstanceModelVersionId = null;
-        String relatedInstanceModelInvariantId = null;
-        String relatedInstanceVersion = null;
-        String relatedInstanceModelCustomizationName = null;
-
-        if (instanceList != null) {
-
-            for (RelatedInstanceList relatedInstanceList : instanceList) {
-
-                RelatedInstance relatedInstance = relatedInstanceList.getRelatedInstance();
-                ModelInfo relatedInstanceModelInfo = relatedInstance.getModelInfo();
-                if (relatedInstanceModelInfo.getModelType().equals(ModelType.service)) {
-                    relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
-                    relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
-                }
-
-                if (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
-                    relatedInstanceModelVersionId = relatedInstanceModelInfo.getModelVersionId();
-                    relatedInstanceModelInvariantId = relatedInstanceModelInfo.getModelInvariantId();
-                    relatedInstanceVersion = relatedInstanceModelInfo.getModelVersion();
-                    relatedInstanceModelCustomizationName = relatedInstanceModelInfo.getModelCustomizationName();
-                }
-            }
-
-            if (modelInfo.getModelType().equals(ModelType.vnf)) {
-                // a. For a vnf request (only create, no update currently):
-                // i. (v3-v4) If modelInfo.modelCustomizationId is provided, use it to validate catalog DB has record in
-                // vnf_resource_customization.model_customization_uuid.
-                // ii. (v2-v4) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or
-                // pre-v3), then modelInfo.modelCustomizationName must have
-                // been provided (else create request should be rejected). APIH should use the
-                // relatedInstance.modelInfo[service].modelVersionId** + modelInfo[vnf].modelCustomizationName
-                // to â€œjoinâ€�? service_to_resource_customizations with vnf_resource_customization to confirm a
-                // vnf_resource_customization.model_customization_uuid record exists.
-                // **If relatedInstance.modelInfo[service].modelVersionId was not provided, use
-                // relatedInstance.modelInfo[service].modelInvariantId + modelVersion instead to lookup modelVersionId
-                // (MODEL_UUID) in SERVICE table.
-                // iii. Regardless of how the value was provided/obtained above, APIH must always populate
-                // vnfModelCustomizationId in bpmnRequest. It would be assumed it was MSO generated
-                // during 1707 data migration if VID did not provide it originally on request.
-                // iv. Note: continue to construct the â€œvnf-typeâ€�? value and pass to BPMN (must still be populated
-                // in A&AI).
-                // 1. If modelCustomizationName is NOT provided on a vnf/vfModule request, use modelCustomizationId to
-                // look it up in our catalog to construct vnf-type value to pass to BPMN.
-
-                VnfResource vnfResource = null;
-                VnfResourceCustomization vrc = null;
-                // Validation for vnfResource
-
-                if (modelCustomizationId != null) {
-                    vrc = catalogDbClient.getVnfResourceCustomizationByModelCustomizationUUID(modelCustomizationId);
-                    if (vrc != null) {
-                        vnfResource = vrc.getVnfResources();
-                    }
-                } else {
-                    org.onap.so.db.catalog.beans.Service service =
-                            catalogDbClient.getServiceByID(relatedInstanceModelVersionId);
-                    if (service == null) {
-                        service = catalogDbClient.getServiceByModelVersionAndModelInvariantUUID(relatedInstanceVersion,
-                                relatedInstanceModelInvariantId);
-                    }
-
-                    if (service == null) {
-                        throw new ValidationException("service in relatedInstance");
-                    }
-                    for (VnfResourceCustomization vnfResourceCustom : service.getVnfCustomizations()) {
-                        if (vnfResourceCustom.getModelInstanceName().equals(modelCustomizationName)) {
-                            vrc = vnfResourceCustom;
-                        }
-                    }
-
-                    if (vrc != null) {
-                        vnfResource = vrc.getVnfResources();
-                        modelInfo.setModelCustomizationId(vrc.getModelCustomizationUUID());
-                        modelInfo.setModelCustomizationUuid(vrc.getModelCustomizationUUID());
-                    }
-                }
-
-                if (vnfResource == null) {
-                    throw new ValidationException("vnfResource");
-                } else {
-                    if (modelInfo.getModelVersionId() == null) {
-                        modelInfo.setModelVersionId(vnfResource.getModelUUID());
-                    }
-                }
-
-                VnfRecipe vnfRecipe = null;
-
-                if (vrc != null) {
-                    String nfRole = vrc.getNfRole();
-                    if (nfRole != null) {
-                        vnfRecipe =
-                                catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(vrc.getNfRole(), action.toString());
-                    }
-                }
-
-                if (vnfRecipe == null) {
-                    vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
-                }
-
-                if (vnfRecipe == null) {
-                    return null;
-                }
-
-                return new RecipeLookupResult(vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
-            } else {
-                /*
-                 * (v5-v7) If modelInfo.modelCustomizationId is NOT provided (because it is a pre-1702 ASDC model or
-                 * pre-v3), then modelInfo.modelCustomizationName must have // been provided (else create request should
-                 * be rejected). APIH should use the relatedInstance.modelInfo[vnf].modelVersionId +
-                 * modelInfo[vnf].modelCustomizationName // to join vnf_to_resource_customizations with
-                 * vf_resource_customization to confirm a vf_resource_customization.model_customization_uuid record
-                 * exists. // Once the vnfs model_customization_uuid has been obtained, use it to find all vfModule
-                 * customizations for that vnf customization in the vnf_res_custom_to_vf_module_custom join table. //
-                 * For each vf_module_cust_model_customization_uuid value returned, use that UUID to query
-                 * vf_module_customization table along with modelInfo[vfModule|volumeGroup].modelVersionId to // confirm
-                 * record matches request data (and to identify the modelCustomizationId associated with the vfModule in
-                 * the request). This means taking each record found // in vf_module_customization and looking up in
-                 * vf_module (using vf_module_customization’s FK into vf_module) to find a match on
-                 * MODEL_INVARIANT_UUID (modelInvariantId) // and MODEL_VERSION (modelVersion).
-                 */
-                VfModuleCustomization vfmc = null;
-                VnfResource vnfr;
-                VnfResourceCustomization vnfrc;
-                VfModule vfModule = null;
-
-                if (modelInfo.getModelCustomizationId() != null) {
-                    vfmc = catalogDbClient
-                            .getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
-                } else {
-                    vnfr = catalogDbClient.getVnfResourceByModelUUID(relatedInstanceModelVersionId);
-                    if (vnfr == null) {
-                        vnfr = catalogDbClient.getFirstVnfResourceByModelInvariantUUIDAndModelVersion(
-                                relatedInstanceModelInvariantId, relatedInstanceVersion);
-                    }
-                    vnfrc = catalogDbClient.getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(
-                            relatedInstanceModelCustomizationName, vnfr);
-
-                    List<VfModuleCustomization> list = vnfrc.getVfModuleCustomizations();
-
-                    String vfModuleModelUUID = modelInfo.getModelVersionId();
-                    for (VfModuleCustomization vf : list) {
-                        VfModuleCustomization vfmCustom;
-                        if (vfModuleModelUUID != null) {
-                            vfmCustom = catalogDbClient
-                                    .getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(
-                                            vf.getModelCustomizationUUID(), vfModuleModelUUID);
-                            if (vfmCustom != null) {
-                                vfModule = vfmCustom.getVfModule();
-                            }
-                        } else {
-                            vfmCustom = catalogDbClient
-                                    .getVfModuleCustomizationByModelCuztomizationUUID(vf.getModelCustomizationUUID());
-                            if (vfmCustom != null) {
-                                vfModule = vfmCustom.getVfModule();
-                            } else {
-                                vfModule = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(
-                                        relatedInstanceModelInvariantId, relatedInstanceVersion);
-                            }
-                        }
-
-                        if (vfModule != null) {
-                            modelInfo.setModelCustomizationId(vf.getModelCustomizationUUID());
-                            modelInfo.setModelCustomizationUuid(vf.getModelCustomizationUUID());
-                            break;
-                        }
-                    }
-                }
-
-                if (vfmc == null && vfModule == null) {
-                    throw new ValidationException("vfModuleCustomization");
-                } else if (vfModule == null && vfmc != null) {
-                    vfModule = vfmc.getVfModule(); // can't be null as vfModuleModelUUID is not-null property in
-                                                   // VfModuleCustomization table
-                }
-
-                if (modelInfo.getModelVersionId() == null) {
-                    modelInfo.setModelVersionId(vfModule.getModelUUID());
-                }
-
-
-                recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
-                        vfModule.getModelUUID(), vnfComponentType, action.toString());
-                if (recipe == null) {
-                    List<VfModule> vfModuleRecords = catalogDbClient
-                            .getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(vfModule.getModelInvariantUUID());
-                    if (!vfModuleRecords.isEmpty()) {
-                        for (VfModule record : vfModuleRecords) {
-                            recipe = catalogDbClient
-                                    .getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
-                                            record.getModelUUID(), vnfComponentType, action.toString());
-                            if (recipe != null) {
-                                break;
-                            }
-                        }
-                    }
-                }
-                if (recipe == null) {
-                    recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
-                            defaultSource, vnfComponentType, action.toString());
-                    if (recipe == null) {
-                        recipe = catalogDbClient.getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(
-                                vnfComponentType, action.toString());
-                    }
-
-                    if (recipe == null) {
-                        return null;
-                    }
-                }
-            }
-        } else {
-
-            if (modelInfo.getModelType().equals(ModelType.vnf)) {
-                recipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
-                if (recipe == null) {
-                    return null;
-                }
-            } else {
-                recipe = catalogDbClient.getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(
-                        defaultSource, vnfComponentType, action.toString());
-
-                if (recipe == null) {
-                    return null;
-                }
-            }
-        }
-
-        return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout());
-    }
-
-    private RecipeLookupResult getDefaultVnfUri(ServiceInstancesRequest sir, Actions action) {
-
-        String defaultSource = requestHandlerUtils.getDefaultModel(sir);
-
-        VnfRecipe vnfRecipe = catalogDbClient.getFirstVnfRecipeByNfRoleAndAction(defaultSource, action.toString());
-
-        if (vnfRecipe == null) {
-            return null;
-        }
-
-        return new RecipeLookupResult(vnfRecipe.getOrchestrationUri(), vnfRecipe.getRecipeTimeout());
-    }
-
-
-    private RecipeLookupResult getNetworkUri(ServiceInstancesRequest sir, Actions action) throws ValidationException {
-
-        String defaultNetworkType = requestHandlerUtils.getDefaultModel(sir);
-
-        ModelInfo modelInfo = sir.getRequestDetails().getModelInfo();
-        String modelName = modelInfo.getModelName();
-        Recipe recipe = null;
-
-        if (modelInfo.getModelCustomizationId() != null) {
-            NetworkResourceCustomization networkResourceCustomization = catalogDbClient
-                    .getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
-            if (networkResourceCustomization != null) {
-                NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
-                if (networkResource != null) {
-                    if (modelInfo.getModelVersionId() == null) {
-                        modelInfo.setModelVersionId(networkResource.getModelUUID());
-                    }
-                    recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(),
-                            action.toString());
-                } else {
-                    throw new ValidationException("no catalog entry found");
-                }
-            } else if (action != Action.deleteInstance) {
-                throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
-            }
-        } else {
-            // ok for version < 3 and action delete
-            if (modelName != null) {
-                recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(modelName, action.toString());
-            }
-        }
-
-        if (recipe == null) {
-            recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(defaultNetworkType, action.toString());
-        }
-
-        return recipe != null ? new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout()) : null;
-    }
-
-
     private Response configurationRecipeLookup(String requestJSON, Action action, HashMap<String, String> instanceIdMap,
             String version, String requestId, String requestUri) throws ApiException {
-        String serviceInstanceId = (instanceIdMap == null) ? null : instanceIdMap.get("serviceInstanceId");
+        String serviceInstanceId;
         Boolean aLaCarte = null;
         String apiVersion = version.substring(1);
-        boolean inProgress = false;
-
-        long startTime = System.currentTimeMillis();
-        ServiceInstancesRequest sir = null;
+        ServiceInstancesRequest sir;
 
         sir = requestHandlerUtils.convertJsonToServiceInstanceRequest(requestJSON, action, requestId, requestUri);
         String requestScope = requestHandlerUtils.deriveRequestScope(action, sir, requestUri);
@@ -1574,30 +1177,20 @@ public class ServiceInstances {
         if (sir.getRequestDetails().getRequestParameters() != null) {
             aLaCarte = sir.getRequestDetails().getRequestParameters().getALaCarte();
         }
+
         requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
                 currentActiveReq);
         requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, null, instanceIdMap);
         String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
 
-        InfraActiveRequests dup = null;
-
-        dup = requestHandlerUtils.duplicateCheck(action, instanceIdMap, instanceName, requestScope, currentActiveReq);
-
-        if (dup != null) {
-            inProgress = requestHandlerUtils.camundaHistoryCheck(dup, currentActiveReq);
-        }
-
-        if (instanceIdMap != null && dup != null && inProgress) {
-            requestHandlerUtils.buildErrorOnDuplicateRecord(currentActiveReq, action, instanceIdMap, instanceName,
-                    requestScope, dup);
-        }
+        requestHandlerUtils.checkForDuplicateRequests(action, instanceIdMap, requestScope, currentActiveReq,
+                instanceName);
 
         ServiceInstancesResponse serviceResponse = new ServiceInstancesResponse();
         RequestReferences referencesResponse = new RequestReferences();
         referencesResponse.setRequestId(requestId);
         serviceResponse.setRequestReferences(referencesResponse);
 
-
         String orchestrationUri = env.getProperty(CommonConstants.ALACARTE_ORCHESTRATION);
         String timeOut = env.getProperty(CommonConstants.ALACARTE_RECIPE_TIMEOUT);
 
@@ -1609,7 +1202,6 @@ public class ServiceInstances {
                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND, ErrorCode.DataError)
                             .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
 
-
             ValidateException validateException = new ValidateException.Builder(error, HttpStatus.SC_NOT_FOUND,
                     ErrorNumbers.SVC_GENERAL_SERVICE_ERROR).errorInfo(errorLoggerInfo).build();
 
@@ -1669,4 +1261,35 @@ public class ServiceInstances {
                 requestScope);
     }
 
+    protected CloudConfiguration getCloudConfigurationOnReplace(String requestScope,
+            HashMap<String, String> instanceIdMap, InfraActiveRequests currentActiveReq) throws ApiException {
+        logger.debug("Replace request is missing cloudConfiguration, autofilling from create.");
+        CloudConfiguration cloudConfiguration = null;
+        if (requestScope.equals(ModelType.vfModule.toString())) {
+            cloudConfiguration = bpmnRequestBuilder.getCloudConfigurationVfModuleReplace(
+                    instanceIdMap.get("vnfInstanceId"), instanceIdMap.get("vfModuleInstanceId"));
+        } else {
+            cloudConfiguration = bpmnRequestBuilder.mapCloudConfigurationVnf(instanceIdMap.get("vnfInstanceId"));
+        }
+
+        if (cloudConfiguration == null) {
+            String errorMessage = "CloudConfiguration not found during autofill for replace request.";
+            logger.error(errorMessage);
+            updateStatus(currentActiveReq, Status.FAILED, errorMessage);
+            throw new CloudConfigurationNotFoundException(
+                    "CloudConfiguration not found during autofill for replace request.");
+        }
+        return cloudConfiguration;
+    }
+
+    protected void setCloudConfigurationCurrentActiveRequest(CloudConfiguration cloudConfiguration,
+            InfraActiveRequests currentActiveRequest) {
+        if (cloudConfiguration.getLcpCloudRegionId() != null) {
+            currentActiveRequest.setCloudRegion(cloudConfiguration.getLcpCloudRegionId());
+        }
+
+        if (cloudConfiguration.getTenantId() != null) {
+            currentActiveRequest.setTenantId(cloudConfiguration.getTenantId());
+        }
+    }
 }