Provider implementation of connectivity attachment
[sdnc/northbound.git] / generic-resource-api / provider / src / main / java / org / onap / sdnc / northbound / GenericResourceApiProvider.java
index 1c437a5..fc0d90a 100644 (file)
@@ -1,5 +1,8 @@
 package org.onap.sdnc.northbound;
 
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.Futures;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -9,7 +12,6 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
-
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
@@ -23,6 +25,10 @@ import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.re
 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationInputBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationOutput;
 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.BrgTopologyOperationOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationInput;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationInputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationOutput;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ConnectionAttachmentTopologyOperationOutputBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInput;
 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationInputBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.ContrailRouteTopologyOperationOutput;
@@ -65,6 +71,7 @@ import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.re
 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationOutput;
 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.VnfTopologyOperationOutputBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.brg.response.information.BrgResponseInformationBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.connection.attachment.response.information.ConnectionAttachmentResponseInformationBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.contrail.route.response.information.ContrailRouteResponseInformationBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.network.response.information.NetworkResponseInformationBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.sdnc.northbound.generic.resource.rev170824.preload.data.PreloadData;
@@ -93,10 +100,6 @@ import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.CheckedFuture;
-import com.google.common.util.concurrent.Futures;
-
 /**
  * Defines a base implementation for your provider. This class extends from a helper class which provides storage for
  * the most commonly used components of the MD-SAL. Additionally the base class provides some basic logging and
@@ -134,14 +137,14 @@ import com.google.common.util.concurrent.Futures;
 
 public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURCEAPIService {
 
-    private static final String APP_NAME = "generic-resource-api";
+    protected static final String APP_NAME = "generic-resource-api";
     private static final String CALLED_STR = "{} called.";
     private static final String NULL_OR_EMPTY_ERROR_MESSAGE = "exiting {} because of null or empty service-instance-id";
-    private static final String NULL_OR_EMPTY_ERROR_PARAM = "invalid input, null or empty service-instance-id";
+    protected static final String NULL_OR_EMPTY_ERROR_PARAM = "invalid input, null or empty service-instance-id";
     private static final String ADDING_INPUT_DATA_LOG = "Adding INPUT data for {} [{}] input: {}";
     private static final String ADDING_OPERATIONAL_DATA_LOG = "Adding OPERATIONAL data for {} [{}] operational-data: {}";
     private static final String OPERATIONAL_DATA_PARAM = "operational-data";
-    private static final String NO_SERVICE_LOGIC_ACTIVE = "No service logic active for ";
+    protected static final String NO_SERVICE_LOGIC_ACTIVE = "No service logic active for ";
     private static final String SERVICE_LOGIC_SEARCH_ERROR_MESSAGE = "Caught exception looking for service logic";
     private static final String ERROR_CODE_PARAM = "error-code";
     private static final String ERROR_MESSAGE_PARAM = "error-message";
@@ -158,7 +161,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
     private static final String SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE = "Caught exception executing service logic for {} ";
     private static final String UPDATING_TREE_INFO_MESSAGE = "Updating OPERATIONAL tree.";
     private static final String EMPTY_SERVICE_INSTANCE_MESSAGE = "exiting {} because the service-instance does not have any service data in SDNC";
-    private static final String INVALID_INPUT_ERROR_MESSAGE = "invalid input: the service-instance does not have any service data in SDNC";
+    protected static final String INVALID_INPUT_ERROR_MESSAGE = "invalid input: the service-instance does not have any service data in SDNC";
     private static final String ALLOTTED_RESOURCE_ID_PARAM = "allotted-resource-id";
     private static final String ERROR_NETWORK_ID = "error";
 
@@ -502,24 +505,24 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // create a new response object
         ServiceTopologyOperationOutputBuilder responseBuilder = new ServiceTopologyOperationOutputBuilder();
 
-        if (input == null || input.getServiceInformation() == null
-            || input.getServiceInformation().getServiceInstanceId() == null
-            || input.getServiceInformation().getServiceInstanceId().length() == 0) {
+        if (hasInvalidServiceId(input)) {
             log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
             responseBuilder.setResponseCode("404");
             responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
             responseBuilder.setAckFinalIndicator("Y");
+
             RpcResult<ServiceTopologyOperationOutput> rpcResult = RpcResultBuilder
-                .<ServiceTopologyOperationOutput>status(true).withResult(responseBuilder.build()).build();
+                .<ServiceTopologyOperationOutput>status(true)
+                .withResult(responseBuilder.build())
+                .build();
+
             return Futures.immediateFuture(rpcResult);
         }
 
         // Grab the service instance ID from the input buffer
         String siid = input.getServiceInformation().getServiceInstanceId();
 
-        if (input.getSdncRequestHeader() != null) {
-            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
-        }
+        trySetSvcRequestId(input, responseBuilder);
 
         ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
         getServiceData(siid, serviceDataBuilder);
@@ -548,25 +551,25 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // Call SLI sync method
         // Get SvcLogicService reference
 
-        ErrorObject error = new ErrorObject("200", "");
+        ResponseObject responseObject = new ResponseObject("200", "");
         String ackFinal = "Y";
         String serviceObjectPath = null;
-        Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, error);
+        Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
 
         if (respProps != null) {
-            error.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
-            error.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
+            responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
+            responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
             ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
             serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
         }
 
-        setServiceStatus(serviceStatusBuilder, error.getStatusCode(), error.getMessage(), ackFinal);
+        setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
         serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
         serviceStatusBuilder.setRpcName(svcOperation);
 
-        if (validateErrorObject(error)) {
-            responseBuilder.setResponseCode(error.getStatusCode());
-            responseBuilder.setResponseMessage(error.getMessage());
+        if (failed(responseObject)) {
+            responseBuilder.setResponseCode(responseObject.getStatusCode());
+            responseBuilder.setResponseMessage(responseObject.getMessage());
             responseBuilder.setAckFinalIndicator(ackFinal);
 
             ServiceBuilder serviceBuilder = new ServiceBuilder();
@@ -599,12 +602,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
             saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
 
-            if (isValidRequest(input) && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)) {
-                // Only update operational tree on delete
-                log.info("Delete from both CONFIGURATION and OPERATIONAL tree.");
-                deleteService(serviceBuilder.build(), LogicalDatastoreType.OPERATIONAL);
-                deleteService(serviceBuilder.build(), LogicalDatastoreType.CONFIGURATION);
-            }
+            tryDeleteService(input, serviceBuilder);
 
             ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
             serviceResponseInformationBuilder.setInstanceId(siid);
@@ -614,7 +612,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         } catch (Exception e) {
             log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
             responseBuilder.setResponseCode("500");
-            responseBuilder.setResponseMessage(e.toString());
+            responseBuilder.setResponseMessage(e.getMessage());
             responseBuilder.setAckFinalIndicator("Y");
             log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -627,11 +625,9 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         }
 
         // Update succeeded
-        responseBuilder.setResponseCode(error.getStatusCode());
+        responseBuilder.setResponseCode(responseObject.getStatusCode());
         responseBuilder.setAckFinalIndicator(ackFinal);
-        if (!error.getMessage().isEmpty()) {
-            responseBuilder.setResponseMessage(error.getMessage());
-        }
+        trySetResponseMessage(responseBuilder, responseObject);
         log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
         log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -643,31 +639,59 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         return Futures.immediateFuture(rpcResult);
     }
 
+    private void trySetResponseMessage(ServiceTopologyOperationOutputBuilder responseBuilder, ResponseObject error) {
+        if (!error.getMessage().isEmpty()) {
+            responseBuilder.setResponseMessage(error.getMessage());
+        }
+    }
+
+    private boolean hasInvalidServiceId(ServiceTopologyOperationInput input) {
+        return input == null || input.getServiceInformation() == null
+            || input.getServiceInformation().getServiceInstanceId() == null
+            || input.getServiceInformation().getServiceInstanceId().length() == 0;
+    }
+
+    private void trySetSvcRequestId(ServiceTopologyOperationInput input,
+        ServiceTopologyOperationOutputBuilder responseBuilder) {
+        if (input.getSdncRequestHeader() != null) {
+            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
+        }
+    }
+
+    private void tryDeleteService(ServiceTopologyOperationInput input, ServiceBuilder serviceBuilder) {
+        if (isValidRequest(input) && input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete)) {
+            // Only update operational tree on delete
+            log.info("Delete from both CONFIGURATION and OPERATIONAL tree.");
+            deleteService(serviceBuilder.build(), LogicalDatastoreType.OPERATIONAL);
+            deleteService(serviceBuilder.build(), LogicalDatastoreType.CONFIGURATION);
+        }
+    }
+
     private Properties tryGetProperties(String svcOperation, Properties parms, ServiceDataBuilder serviceDataBuilder,
-        ErrorObject error) {
+        ResponseObject responseObject) {
         try {
             if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
                 try {
                     return svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", serviceDataBuilder, parms);
                 } catch (Exception e) {
                     log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
-                    error.setMessage(e.getMessage());
-                    error.setStatusCode("500");
+                    responseObject.setMessage(e.getMessage());
+                    responseObject.setStatusCode("500");
                 }
             } else {
-                error.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
-                error.setStatusCode("503");
+                responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
+                responseObject.setStatusCode("503");
             }
         } catch (Exception e) {
-            error.setMessage(e.getMessage());
-            error.setStatusCode("500");
+            responseObject.setMessage(e.getMessage());
+            responseObject.setStatusCode("500");
             log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
         }
 
         return null;
     }
 
-    private boolean validateErrorObject(ErrorObject error) {
+    private boolean failed(ResponseObject error) {
         return
             !error.getStatusCode().isEmpty() && !("0".equals(error.getStatusCode()) || "200"
                 .equals(error.getStatusCode()));
@@ -683,15 +707,13 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         final String svcOperation = "vnf-topology-operation";
         ServiceData serviceData;
         ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
-        Properties parms = new Properties();
+        Properties properties = new Properties();
 
         log.info(CALLED_STR, svcOperation);
         // create a new response object
         VnfTopologyOperationOutputBuilder responseBuilder = new VnfTopologyOperationOutputBuilder();
 
-        if (input == null || input.getServiceInformation() == null
-            || input.getServiceInformation().getServiceInstanceId() == null
-            || input.getServiceInformation().getServiceInstanceId().length() == 0) {
+        if (hasInvalidServiceId(input)) {
 
             log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
             responseBuilder.setResponseCode("404");
@@ -706,12 +728,9 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // Grab the service instance ID from the input buffer
         String siid = input.getServiceInformation().getServiceInstanceId();
 
-        if (input.getSdncRequestHeader() != null) {
-            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
-        }
+        trySetSvcRequestId(input, responseBuilder);
 
-        if (input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
-            || input.getVnfInformation().getVnfId().length() == 0) {
+        if (hasInvalidVnfId(input)) {
             log.debug("exiting {} because of null or empty vnf-id", svcOperation);
             responseBuilder.setResponseCode("404");
             responseBuilder.setResponseMessage("invalid input, null or empty vnf-id");
@@ -754,34 +773,38 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
 
         log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
         VnfTopologyOperationInputBuilder inputBuilder = new VnfTopologyOperationInputBuilder(input);
-        GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
+        GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
 
         log.info(ADDING_OPERATIONAL_DATA_LOG, svcOperation, siid,
             operDataBuilder.build());
-        GenericResourceApiUtil.toProperties(parms, OPERATIONAL_DATA_PARAM, operDataBuilder);
+        GenericResourceApiUtil.toProperties(properties, OPERATIONAL_DATA_PARAM, operDataBuilder);
 
         // Call SLI sync method
         // Get SvcLogicService reference
 
-        ErrorObject error = new ErrorObject("200", "");
+        ResponseObject responseObject = new ResponseObject("200", "");
         String ackFinal = "Y";
         String serviceObjectPath = null;
-        Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, error);
+        Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
 
         if (respProps != null) {
-            error.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
-            error.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
+            responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
+            responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
             ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
-            serviceObjectPath = respProps.getProperty("vnf-object-path");
+
+            //FIXME if needed
+            /*before was "vfn-object-path", but it didn't make sense, since everywhere else,
+              when extracting service object path the "service-object-path" property is used*/
+            serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
         }
 
-        setServiceStatus(serviceStatusBuilder, error.getStatusCode(), error.getMessage(), ackFinal);
+        setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
         serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
         serviceStatusBuilder.setRpcName(svcOperation);
 
-        if (validateErrorObject(error)) {
-            responseBuilder.setResponseCode(error.getStatusCode());
-            responseBuilder.setResponseMessage(error.getMessage());
+        if (failed(responseObject)) {
+            responseBuilder.setResponseCode(responseObject.getStatusCode());
+            responseBuilder.setResponseMessage(responseObject.getMessage());
             responseBuilder.setAckFinalIndicator(ackFinal);
 
             ServiceBuilder serviceBuilder = new ServiceBuilder();
@@ -789,14 +812,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
             try {
                 saveService(serviceBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
-                if (isValidRequest(input) &&
-                    (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete) ||
-                        input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
-
-                    // Only update operational tree on activate or delete
-                    log.info(UPDATING_TREE_INFO_MESSAGE);
-                    saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
-                }
+                trySaveService(input, serviceBuilder);
             } catch (Exception e) {
                 log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
             }
@@ -838,7 +854,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         } catch (Exception e) {
             log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
             responseBuilder.setResponseCode("500");
-            responseBuilder.setResponseMessage(e.toString());
+            responseBuilder.setResponseMessage(e.getMessage());
             responseBuilder.setAckFinalIndicator("Y");
             log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -851,11 +867,9 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         }
 
         // Update succeeded
-        responseBuilder.setResponseCode(error.getStatusCode());
+        responseBuilder.setResponseCode(responseObject.getStatusCode());
         responseBuilder.setAckFinalIndicator(ackFinal);
-        if (!error.getMessage().isEmpty()) {
-            responseBuilder.setResponseMessage(error.getMessage());
-        }
+        trySetResponseMessage(responseBuilder, responseObject);
         log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
         log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -868,6 +882,41 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         return Futures.immediateFuture(rpcResult);
     }
 
+    private void trySetResponseMessage(VnfTopologyOperationOutputBuilder responseBuilder, ResponseObject error) {
+        if (!error.getMessage().isEmpty()) {
+            responseBuilder.setResponseMessage(error.getMessage());
+        }
+    }
+
+    private void trySaveService(VnfTopologyOperationInput input, ServiceBuilder serviceBuilder) {
+        if (isValidRequest(input) &&
+            (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Delete) ||
+                input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
+
+            // Only update operational tree on activate or delete
+            log.info(UPDATING_TREE_INFO_MESSAGE);
+            saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
+        }
+    }
+
+    private boolean hasInvalidVnfId(VnfTopologyOperationInput input) {
+        return input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
+            || input.getVnfInformation().getVnfId().length() == 0;
+    }
+
+    private boolean hasInvalidServiceId(VnfTopologyOperationInput input) {
+        return input == null || input.getServiceInformation() == null
+            || input.getServiceInformation().getServiceInstanceId() == null
+            || input.getServiceInformation().getServiceInstanceId().length() == 0;
+    }
+
+    private void trySetSvcRequestId(VnfTopologyOperationInput input,
+        VnfTopologyOperationOutputBuilder responseBuilder) {
+        if (input.getSdncRequestHeader() != null) {
+            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
+        }
+    }
+
     private boolean isValidRequest(VnfTopologyOperationInput input) {
         return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
     }
@@ -885,9 +934,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // create a new response object
         VfModuleTopologyOperationOutputBuilder responseBuilder = new VfModuleTopologyOperationOutputBuilder();
 
-        if (input == null || input.getServiceInformation() == null
-            || input.getServiceInformation().getServiceInstanceId() == null
-            || input.getServiceInformation().getServiceInstanceId().length() == 0) {
+        if (hasInvalidServiceId(input)) {
             log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
             responseBuilder.setResponseCode("403");
             responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
@@ -902,8 +949,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             return Futures.immediateFuture(rpcResult);
         }
 
-        if (input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
-            || input.getVnfInformation().getVnfId().length() == 0) {
+        if (hasInvalidVnfId(input)) {
             log.debug("exiting {} because of null or empty vnf-id", svcOperation);
             responseBuilder.setResponseCode("403");
             responseBuilder.setResponseMessage("invalid input, null or empty vnf-id");
@@ -913,8 +959,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             return Futures.immediateFuture(rpcResult);
         }
 
-        if (input.getVfModuleInformation() == null || input.getVfModuleInformation().getVfModuleId() == null
-            || input.getVfModuleInformation().getVfModuleId().length() == 0) {
+        if (hasInvalidVfModuleId(input)) {
             log.debug("exiting {} because of null or empty vf-module-id", svcOperation);
             responseBuilder.setResponseCode("403");
             responseBuilder.setResponseMessage("invalid input, vf-module-id is null or empty");
@@ -931,9 +976,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // Grab the service instance ID from the input buffer
         String siid = input.getServiceInformation().getServiceInstanceId();
 
-        if (input.getSdncRequestHeader() != null) {
-            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
-        }
+        trySetSvcRequestId(input, responseBuilder);
 
         ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
         getServiceData(siid, serviceDataBuilder);
@@ -973,25 +1016,30 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // Call SLI sync method
         // Get SvcLogicService reference
 
-        ErrorObject error = new ErrorObject("200", "");
+        ResponseObject responseObject = new ResponseObject("200", "");
         String ackFinal = "Y";
         String serviceObjectPath = null;
-        Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, error);
+        Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
 
         if (respProps != null) {
-            error.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
-            error.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
+            responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
+            responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
             ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
-            serviceObjectPath = respProps.getProperty("vf-module-object-path");
+
+
+            //FIXME if needed
+            /*before was "vf-module-object-path", but it didnt make sense, since everywhere else,
+              when extracting service object path the "service-object-path" property is used*/
+            serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
         }
 
-        setServiceStatus(serviceStatusBuilder, error.getStatusCode(), error.getMessage(), ackFinal);
+        setServiceStatus(serviceStatusBuilder, responseObject.getStatusCode(), responseObject.getMessage(), ackFinal);
         serviceStatusBuilder.setRequestStatus(RequestStatus.Synccomplete);
         serviceStatusBuilder.setRpcName(svcOperation);
 
-        if (validateErrorObject(error)) {
-            responseBuilder.setResponseCode(error.getStatusCode());
-            responseBuilder.setResponseMessage(error.getStatusCode());
+        if (failed(responseObject)) {
+            responseBuilder.setResponseCode(responseObject.getStatusCode());
+            responseBuilder.setResponseMessage(responseObject.getMessage());
             responseBuilder.setAckFinalIndicator(ackFinal);
 
             ServiceBuilder serviceBuilder = new ServiceBuilder();
@@ -1025,14 +1073,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
             saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
 
-            if (isValidRequest(input) &&
-                (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
-                    input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
-                // Only update operational tree on activate or delete
-
-                log.info(UPDATING_TREE_INFO_MESSAGE);
-                saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
-            }
+            trySaveService(input, serviceBuilder);
 
             ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
             serviceResponseInformationBuilder.setInstanceId(siid);
@@ -1042,7 +1083,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         } catch (Exception e) {
             log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
             responseBuilder.setResponseCode("500");
-            responseBuilder.setResponseMessage(e.toString());
+            responseBuilder.setResponseMessage(e.getMessage());
             responseBuilder.setAckFinalIndicator("Y");
             log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -1055,11 +1096,9 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         }
 
         // Update succeeded
-        responseBuilder.setResponseCode(error.getStatusCode());
+        responseBuilder.setResponseCode(responseObject.getStatusCode());
         responseBuilder.setAckFinalIndicator(ackFinal);
-        if (!error.getMessage().isEmpty()) {
-            responseBuilder.setResponseMessage(error.getMessage());
-        }
+        trySetResponseMessage(responseBuilder, responseObject);
         log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
         log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -1072,6 +1111,46 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         return Futures.immediateFuture(rpcResult);
     }
 
+    private void trySetResponseMessage(VfModuleTopologyOperationOutputBuilder responseBuilder, ResponseObject error) {
+        if (!error.getMessage().isEmpty()) {
+            responseBuilder.setResponseMessage(error.getMessage());
+        }
+    }
+
+    private void trySaveService(VfModuleTopologyOperationInput input, ServiceBuilder serviceBuilder) {
+        if (isValidRequest(input) &&
+            (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
+                input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
+            // Only update operational tree on activate or delete
+
+            log.info(UPDATING_TREE_INFO_MESSAGE);
+            saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
+        }
+    }
+
+    private void trySetSvcRequestId(VfModuleTopologyOperationInput input,
+        VfModuleTopologyOperationOutputBuilder responseBuilder) {
+        if (input.getSdncRequestHeader() != null) {
+            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
+        }
+    }
+
+    private boolean hasInvalidVfModuleId(VfModuleTopologyOperationInput input) {
+        return input.getVfModuleInformation() == null || input.getVfModuleInformation().getVfModuleId() == null
+            || input.getVfModuleInformation().getVfModuleId().length() == 0;
+    }
+
+    private boolean hasInvalidVnfId(VfModuleTopologyOperationInput input) {
+        return input.getVnfInformation() == null || input.getVnfInformation().getVnfId() == null
+            || input.getVnfInformation().getVnfId().length() == 0;
+    }
+
+    private boolean hasInvalidServiceId(VfModuleTopologyOperationInput input) {
+        return input == null || input.getServiceInformation() == null
+            || input.getServiceInformation().getServiceInstanceId() == null
+            || input.getServiceInformation().getServiceInstanceId().length() == 0;
+    }
+
     private boolean isValidRequest(VfModuleTopologyOperationInput input) {
         return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
     }
@@ -1089,9 +1168,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // create a new response object
         NetworkTopologyOperationOutputBuilder responseBuilder = new NetworkTopologyOperationOutputBuilder();
 
-        if (input == null || input.getServiceInformation() == null
-            || input.getServiceInformation().getServiceInstanceId() == null
-            || input.getServiceInformation().getServiceInstanceId().length() == 0) {
+        if (hasInvalidServiceId(input)) {
             log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
             return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
         }
@@ -1102,12 +1179,10 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
         getServiceData(siid, serviceDataBuilder);
 
-        if (input.getSdncRequestHeader() != null) {
-            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
-        }
+        this.trySetSvcRequestId(input, responseBuilder);
 
         ServiceData sd = serviceDataBuilder.build();
-        if (sd == null || sd.getServiceLevelOperStatus() == null) {
+        if (isInvalidServiceData(sd)) {
             log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
             return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
         }
@@ -1119,25 +1194,25 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // Call SLI sync method
         // Get SvcLogicService reference
 
-        ErrorObject error = new ErrorObject("200", "");
+        ResponseObject responseObject = new ResponseObject("200", "");
         String ackFinal = "Y";
         String networkId = ERROR_NETWORK_ID;
         String serviceObjectPath = null;
         String networkObjectPath = null;
-        Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, error);
+        Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, responseObject);
 
         if (respProps != null) {
-            error.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
-            error.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
+            responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
+            responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
             ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
             networkId = respProps.getProperty("networkId");
             serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
             networkObjectPath = respProps.getProperty("network-object-path");
         }
 
-        if (validateErrorObject(error)) {
-            responseBuilder.setResponseCode(error.getStatusCode());
-            responseBuilder.setResponseMessage(error.getMessage());
+        if (failed(responseObject)) {
+            responseBuilder.setResponseCode(responseObject.getStatusCode());
+            responseBuilder.setResponseMessage(responseObject.getMessage());
             responseBuilder.setAckFinalIndicator(ackFinal);
 
             log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
@@ -1163,13 +1238,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
             saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
 
-            if (isValidRequest(input) &&
-                (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate) ||
-                    input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Create))) {
-                // Only update operational tree on Activate
-                log.info(UPDATING_TREE_INFO_MESSAGE);
-                saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
-            }
+            trySaveService(input, serviceBuilder);
 
             NetworkResponseInformationBuilder networkResponseInformationBuilder = new NetworkResponseInformationBuilder();
             networkResponseInformationBuilder.setInstanceId(networkId);
@@ -1184,7 +1253,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         } catch (IllegalStateException e) {
             log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
             responseBuilder.setResponseCode("500");
-            responseBuilder.setResponseMessage(e.toString());
+            responseBuilder.setResponseMessage(e.getMessage());
             responseBuilder.setAckFinalIndicator("Y");
             log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -1197,11 +1266,9 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         }
 
         // Update succeeded
-        responseBuilder.setResponseCode(error.getStatusCode());
+        responseBuilder.setResponseCode(responseObject.getStatusCode());
         responseBuilder.setAckFinalIndicator(ackFinal);
-        if (!error.getMessage().isEmpty()) {
-            responseBuilder.setResponseMessage(error.getMessage());
-        }
+        trySetResponseMessage(responseBuilder, responseObject);
         log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
         log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -1213,6 +1280,35 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         return Futures.immediateFuture(rpcResult);
     }
 
+    private void trySetResponseMessage(NetworkTopologyOperationOutputBuilder responseBuilder, ResponseObject error) {
+        if (!error.getMessage().isEmpty()) {
+            responseBuilder.setResponseMessage(error.getMessage());
+        }
+    }
+
+    private void trySetSvcRequestId(NetworkTopologyOperationInput input,
+        NetworkTopologyOperationOutputBuilder responseBuilder) {
+        if (input.getSdncRequestHeader() != null) {
+            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
+        }
+    }
+
+    private void trySaveService(NetworkTopologyOperationInput input, ServiceBuilder serviceBuilder) {
+        if (isValidRequest(input) &&
+            (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate) ||
+                input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Create))) {
+            // Only update operational tree on Activate
+            log.info(UPDATING_TREE_INFO_MESSAGE);
+            saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
+        }
+    }
+
+    private boolean hasInvalidServiceId(NetworkTopologyOperationInput input) {
+        return input == null || input.getServiceInformation() == null
+            || input.getServiceInformation().getServiceInstanceId() == null
+            || input.getServiceInformation().getServiceInstanceId().length() == 0;
+    }
+
     private Future<RpcResult<NetworkTopologyOperationOutput>> buildRpcResultFuture(
         NetworkTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
 
@@ -1240,15 +1336,13 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         final String svcOperation = "contrail-route-topology-operation";
         ServiceData serviceData;
         ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
-        Properties parms = new Properties();
+        Properties properties = new Properties();
 
         log.info(CALLED_STR, svcOperation);
         // create a new response object
         ContrailRouteTopologyOperationOutputBuilder responseBuilder = new ContrailRouteTopologyOperationOutputBuilder();
 
-        if (input == null || input.getServiceInformation() == null
-            || input.getServiceInformation().getServiceInstanceId() == null
-            || input.getServiceInformation().getServiceInstanceId().length() == 0) {
+        if (hasInvalidServiceId(input)) {
             log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
             return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
         }
@@ -1259,28 +1353,26 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
         getServiceData(siid, serviceDataBuilder);
 
-        if (input.getSdncRequestHeader() != null) {
-            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
-        }
+        trySetSvcRequestId(input, responseBuilder);
 
         ServiceData sd = serviceDataBuilder.build();
-        if (sd == null || sd.getServiceLevelOperStatus() == null) {
+        if (isInvalidServiceData(sd)) {
             log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
             return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
         }
 
         log.info("Adding INPUT data for " + svcOperation + " [" + siid + "] input: " + input);
         ContrailRouteTopologyOperationInputBuilder inputBuilder = new ContrailRouteTopologyOperationInputBuilder(input);
-        GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
+        GenericResourceApiUtil.toProperties(properties, inputBuilder.build());
 
         // Call SLI sync method
         // Get SvcLogicService reference
-        ErrorObject error = new ErrorObject("200", "");
+        ResponseObject error = new ResponseObject("200", "");
         String ackFinal = "Y";
         String allottedResourceId = ERROR_NETWORK_ID;
         String serviceObjectPath = null;
         String contrailRouteObjectPath = null;
-        Properties respProps = tryGetProperties(svcOperation, parms, serviceDataBuilder, error);
+        Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, error);
 
         if (respProps != null) {
             error.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
@@ -1291,7 +1383,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             contrailRouteObjectPath = respProps.getProperty("contrail-route-object-path");
         }
 
-        if (validateErrorObject(error)) {
+        if (failed(error)) {
             responseBuilder.setResponseCode(error.getStatusCode());
             responseBuilder.setResponseMessage(error.getMessage());
             responseBuilder.setAckFinalIndicator(ackFinal);
@@ -1307,7 +1399,6 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
 
         // Got success from SLI
         try {
-
             serviceData = serviceDataBuilder.build();
             log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
 
@@ -1318,13 +1409,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
             saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
 
-            if (isValidRequest(input) &&
-                (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
-                    input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
-                // Only update operational tree on activate or delete
-                log.info(UPDATING_TREE_INFO_MESSAGE);
-                saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
-            }
+            trySaveService(input, serviceBuilder);
 
             ContrailRouteResponseInformationBuilder contrailRouteResponseInformationBuilder = new ContrailRouteResponseInformationBuilder();
             contrailRouteResponseInformationBuilder.setInstanceId(allottedResourceId);
@@ -1339,7 +1424,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         } catch (IllegalStateException e) {
             log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
             responseBuilder.setResponseCode("500");
-            responseBuilder.setResponseMessage(e.toString());
+            responseBuilder.setResponseMessage(e.getMessage());
             responseBuilder.setAckFinalIndicator("Y");
             log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -1354,9 +1439,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // Update succeeded
         responseBuilder.setResponseCode(error.getStatusCode());
         responseBuilder.setAckFinalIndicator(ackFinal);
-        if (!error.getMessage().isEmpty()) {
-            responseBuilder.setResponseMessage(error.getMessage());
-        }
+        trySetResponseMessage(responseBuilder, error);
         log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
         log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -1368,6 +1451,36 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         return Futures.immediateFuture(rpcResult);
     }
 
+    private void trySetResponseMessage(ContrailRouteTopologyOperationOutputBuilder responseBuilder,
+        ResponseObject error) {
+        if (!error.getMessage().isEmpty()) {
+            responseBuilder.setResponseMessage(error.getMessage());
+        }
+    }
+
+    private void trySaveService(ContrailRouteTopologyOperationInput input, ServiceBuilder serviceBuilder) {
+        if (isValidRequest(input) &&
+            (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
+                input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
+            // Only update operational tree on activate or delete
+            log.info(UPDATING_TREE_INFO_MESSAGE);
+            saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
+        }
+    }
+
+    private void trySetSvcRequestId(ContrailRouteTopologyOperationInput input,
+        ContrailRouteTopologyOperationOutputBuilder responseBuilder) {
+        if (input.getSdncRequestHeader() != null) {
+            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
+        }
+    }
+
+    private boolean hasInvalidServiceId(ContrailRouteTopologyOperationInput input) {
+        return input == null || input.getServiceInformation() == null
+            || input.getServiceInformation().getServiceInstanceId() == null
+            || input.getServiceInformation().getServiceInstanceId().length() == 0;
+    }
+
     private Future<RpcResult<ContrailRouteTopologyOperationOutput>>
     buildRpcResultFuture(ContrailRouteTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
 
@@ -1400,9 +1513,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // create a new response object
         SecurityZoneTopologyOperationOutputBuilder responseBuilder = new SecurityZoneTopologyOperationOutputBuilder();
 
-        if (input == null || input.getServiceInformation() == null
-            || input.getServiceInformation().getServiceInstanceId() == null
-            || input.getServiceInformation().getServiceInstanceId().length() == 0) {
+        if (this.hasInvalidServiceId(input)) {
             log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
             return buildRpcResultFuture(responseBuilder, NULL_OR_EMPTY_ERROR_PARAM);
         }
@@ -1412,13 +1523,10 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // Get the service-instance service data from MD-SAL
         ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
         getServiceData(siid, serviceDataBuilder);
-
-        if (input.getSdncRequestHeader() != null) {
-            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
-        }
+        trySetSvcRequestId(input, responseBuilder);
 
         ServiceData sd = serviceDataBuilder.build();
-        if (sd == null || sd.getServiceLevelOperStatus() == null) {
+        if (isInvalidServiceData(sd)) {
             log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
             return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
         }
@@ -1432,7 +1540,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
 
         Properties respProps = null;
 
-        ErrorObject error = new ErrorObject("200", "");
+        ResponseObject responseObject = new ResponseObject("200", "");
         String ackFinal = "Y";
         String allottedResourceId = ERROR_NETWORK_ID;
         String serviceObjectPath = null;
@@ -1445,31 +1553,31 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
                     respProps = svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", serviceDataBuilder, parms);
                 } catch (Exception e) {
                     log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
-                    error.setMessage(e.getMessage());
-                    error.setStatusCode("500");
+                    responseObject.setMessage(e.getMessage());
+                    responseObject.setStatusCode("500");
                 }
             } else {
-                error.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
-                error.setStatusCode("503");
+                responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
+                responseObject.setStatusCode("503");
             }
         } catch (Exception e) {
-            error.setStatusCode("500");
-            error.setMessage(e.getMessage());
+            responseObject.setStatusCode("500");
+            responseObject.setMessage(e.getMessage());
             log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
         }
 
         if (respProps != null) {
-            error.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
-            error.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
+            responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
+            responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
             ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
             allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
             serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
             securityZoneObjectPath = respProps.getProperty("security-zone-object-path");
         }
 
-        if (validateErrorObject(error)) {
-            responseBuilder.setResponseCode(error.getStatusCode());
-            responseBuilder.setResponseMessage(error.getMessage());
+        if (failed(responseObject)) {
+            responseBuilder.setResponseCode(responseObject.getStatusCode());
+            responseBuilder.setResponseMessage(responseObject.getMessage());
             responseBuilder.setAckFinalIndicator(ackFinal);
             log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -1494,13 +1602,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
             saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
 
-            if (isValidRequest(input) &&
-                (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
-                    input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
-                // Only update operational tree on activate or delete
-                log.info(UPDATING_TREE_INFO_MESSAGE);
-                saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
-            }
+            trySaveService(input, serviceBuilder);
 
             SecurityZoneResponseInformationBuilder securityZoneResponseInformationBuilder = new SecurityZoneResponseInformationBuilder();
             securityZoneResponseInformationBuilder.setInstanceId(allottedResourceId);
@@ -1515,7 +1617,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         } catch (IllegalStateException e) {
             log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
             responseBuilder.setResponseCode("500");
-            responseBuilder.setResponseMessage(e.toString());
+            responseBuilder.setResponseMessage(e.getMessage());
             responseBuilder.setAckFinalIndicator("Y");
             log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -1528,11 +1630,9 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         }
 
         // Update succeeded
-        responseBuilder.setResponseCode(error.getStatusCode());
+        responseBuilder.setResponseCode(responseObject.getStatusCode());
         responseBuilder.setAckFinalIndicator(ackFinal);
-        if (!error.getMessage().isEmpty()) {
-            responseBuilder.setResponseMessage(error.getMessage());
-        }
+        trySetResponseMessage(responseBuilder, responseObject);
         log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
         log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -1544,6 +1644,40 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         return Futures.immediateFuture(rpcResult);
     }
 
+    private void trySetResponseMessage(SecurityZoneTopologyOperationOutputBuilder responseBuilder,
+        ResponseObject error) {
+        if (!error.getMessage().isEmpty()) {
+            responseBuilder.setResponseMessage(error.getMessage());
+        }
+    }
+
+    private void trySaveService(SecurityZoneTopologyOperationInput input, ServiceBuilder serviceBuilder) {
+        if (isValidRequest(input) &&
+            (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
+                input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
+            // Only update operational tree on activate or delete
+            log.info(UPDATING_TREE_INFO_MESSAGE);
+            saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
+        }
+    }
+
+    private void trySetSvcRequestId(SecurityZoneTopologyOperationInput input,
+        SecurityZoneTopologyOperationOutputBuilder responseBuilder) {
+        if (input.getSdncRequestHeader() != null) {
+            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
+        }
+    }
+
+    private boolean isInvalidServiceData(ServiceData sd) {
+        return sd == null || sd.getServiceLevelOperStatus() == null;
+    }
+
+    private boolean hasInvalidServiceId(SecurityZoneTopologyOperationInput input) {
+        return input == null || input.getServiceInformation() == null
+            || input.getServiceInformation().getServiceInstanceId() == null
+            || input.getServiceInformation().getServiceInstanceId().length() == 0;
+    }
+
     private Future<RpcResult<SecurityZoneTopologyOperationOutput>>
     buildRpcResultFuture(SecurityZoneTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
 
@@ -1573,9 +1707,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
 
         // create a new response object
         TunnelxconnTopologyOperationOutputBuilder responseBuilder = new TunnelxconnTopologyOperationOutputBuilder();
-        if (input == null || input.getServiceInformation() == null
-            || input.getServiceInformation().getServiceInstanceId() == null
-            || input.getServiceInformation().getServiceInstanceId().length() == 0) {
+        if (hasInvalidServiceId(input)) {
             log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
             responseBuilder.setResponseCode("404");
             responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
@@ -1595,25 +1727,25 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
 
         // Call SLI sync method
         // Get SvcLogicService reference
-        ErrorObject error = new ErrorObject("200", "");
+        ResponseObject responseObject = new ResponseObject("200", "");
         String ackFinal = "Y";
         String allottedResourceId = ERROR_NETWORK_ID;
         String serviceObjectPath = null;
         String tunnelxconnObjectPath = null;
-        Properties respProps = tryGetProperties(svcOperation, parms, error);
+        Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
 
         if (respProps != null) {
-            error.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
-            error.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
+            responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
+            responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
             ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
             allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
             serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
             tunnelxconnObjectPath = respProps.getProperty("tunnelxconn-object-path");
         }
 
-        if (validateErrorObject(error)) {
-            responseBuilder.setResponseCode(error.getStatusCode());
-            responseBuilder.setResponseMessage(error.getMessage());
+        if (failed(responseObject)) {
+            responseBuilder.setResponseCode(responseObject.getStatusCode());
+            responseBuilder.setResponseMessage(responseObject.getMessage());
             responseBuilder.setAckFinalIndicator(ackFinal);
 
             log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
@@ -1654,23 +1786,216 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         }
 
         // Update succeeded
-        responseBuilder.setResponseCode(error.getStatusCode());
+        responseBuilder.setResponseCode(responseObject.getStatusCode());
         responseBuilder.setAckFinalIndicator(ackFinal);
+        trySetResponseMessage(responseBuilder, responseObject);
+        log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
+        log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
+
+        RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
+            .<TunnelxconnTopologyOperationOutput>status(true)
+            .withResult(responseBuilder.build())
+            .build();
+
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    private boolean hasInvalidServiceId(ConnectionAttachmentTopologyOperationInput input) {
+        return input == null || input.getServiceInformation() == null
+            || input.getServiceInformation().getServiceInstanceId() == null
+            || input.getServiceInformation().getServiceInstanceId().length() == 0;
+    }
+
+    private void trySetResponseMessage(ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder,
+        ResponseObject error) {
         if (!error.getMessage().isEmpty()) {
             responseBuilder.setResponseMessage(error.getMessage());
         }
+    }
+
+    private void trySetSvcRequestId(ConnectionAttachmentTopologyOperationInput input,
+        ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder) {
+        if (input.getSdncRequestHeader() != null) {
+            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
+        }
+    }
+
+    private Future<RpcResult<ConnectionAttachmentTopologyOperationOutput>>
+    buildRpcResultFuture(ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder, String responseMessage) {
+
+        responseBuilder.setResponseCode("404");
+        responseBuilder.setResponseMessage(responseMessage);
+        responseBuilder.setAckFinalIndicator("Y");
+
+        RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
+            .<ConnectionAttachmentTopologyOperationOutput>status(true)
+            .withResult(responseBuilder.build())
+            .build();
+
+        return Futures.immediateFuture(rpcResult);
+    }
+
+    private void trySaveService(ConnectionAttachmentTopologyOperationInput input, ServiceBuilder serviceBuilder) {
+        if (isValidRequest(input) &&
+            (input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Unassign) ||
+                input.getSdncRequestHeader().getSvcAction().equals(SvcAction.Activate))) {
+            // Only update operational tree on activate or delete
+            log.info(UPDATING_TREE_INFO_MESSAGE);
+            saveService(serviceBuilder.build(), false, LogicalDatastoreType.OPERATIONAL);
+        }
+    }
+
+    private boolean isValidRequest(ConnectionAttachmentTopologyOperationInput input) {
+        return input.getSdncRequestHeader() != null && input.getSdncRequestHeader().getSvcAction() != null;
+    }
+
+    @Override
+    public Future<RpcResult<ConnectionAttachmentTopologyOperationOutput>> connectionAttachmentTopologyOperation(ConnectionAttachmentTopologyOperationInput input) {
+        final String svcOperation = "connectionAttachment-topology-operation";
+        Properties parms = new Properties();
+        log.info(CALLED_STR, svcOperation);
+
+        // create a new response object
+        ConnectionAttachmentTopologyOperationOutputBuilder responseBuilder = new ConnectionAttachmentTopologyOperationOutputBuilder();
+        if (hasInvalidServiceId(input)) {
+            log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
+            responseBuilder.setResponseCode("404");
+            responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
+            responseBuilder.setAckFinalIndicator("Y");
+
+            RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
+                .<ConnectionAttachmentTopologyOperationOutput>status(true)
+                .withResult(responseBuilder.build())
+                .build();
+
+            return Futures.immediateFuture(rpcResult);
+        }
+
+        ServiceData serviceData;
+        ServiceStatusBuilder serviceStatusBuilder = new ServiceStatusBuilder();
+        Properties properties = new Properties();
+
+        String siid = input.getServiceInformation().getServiceInstanceId();
+        log.info(ADDING_INPUT_DATA_LOG, svcOperation, siid, input);
+
+        // Get the service-instance service data from MD-SAL
+        ServiceDataBuilder serviceDataBuilder = new ServiceDataBuilder();
+        getServiceData(siid, serviceDataBuilder);
+
+        trySetSvcRequestId(input, responseBuilder);
+
+        ServiceData sd = serviceDataBuilder.build();
+        if (isInvalidServiceData(sd)) {
+            log.debug(EMPTY_SERVICE_INSTANCE_MESSAGE, svcOperation);
+            return buildRpcResultFuture(responseBuilder, INVALID_INPUT_ERROR_MESSAGE);
+        }
+
+        ConnectionAttachmentTopologyOperationInputBuilder inputBuilder = new ConnectionAttachmentTopologyOperationInputBuilder(input);
+        GenericResourceApiUtil.toProperties(parms, inputBuilder.build());
+
+        // Call SLI sync method
+        // Get SvcLogicService reference
+        ResponseObject responseObject = new ResponseObject("200", "");
+        String ackFinal = "Y";
+        String allottedResourceId = ERROR_NETWORK_ID;
+        String serviceObjectPath = null;
+        String connectionAttachmentObjectPath = null;
+
+        Properties respProps = tryGetProperties(svcOperation, properties, serviceDataBuilder, responseObject);
+
+        if (respProps != null) {
+            responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
+            responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
+            ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
+            allottedResourceId = respProps.getProperty(ALLOTTED_RESOURCE_ID_PARAM);
+            serviceObjectPath = respProps.getProperty(SERVICE_OBJECT_PATH_PARAM);
+            connectionAttachmentObjectPath = respProps.getProperty("connectionAttachment-object-path");
+        }
+
+        if (failed(responseObject)) {
+            responseBuilder.setResponseCode(responseObject.getStatusCode());
+            responseBuilder.setResponseMessage(responseObject.getMessage());
+            responseBuilder.setAckFinalIndicator(ackFinal);
+
+            log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
+
+            RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
+                .<ConnectionAttachmentTopologyOperationOutput>status(true)
+                .withResult(responseBuilder.build())
+                .build();
+
+            return Futures.immediateFuture(rpcResult);
+        }
+
+        // Got success from SLI
+        try {
+
+            serviceData = serviceDataBuilder.build();
+            log.info(UPDATING_MDSAL_INFO_MESSAGE, svcOperation, siid, serviceData);
+
+            // service object
+            ServiceBuilder serviceBuilder = new ServiceBuilder();
+            serviceBuilder.setServiceData(serviceData);
+            serviceBuilder.setServiceInstanceId(siid);
+            serviceBuilder.setServiceStatus(serviceStatusBuilder.build());
+            saveService(serviceBuilder.build(), false, LogicalDatastoreType.CONFIGURATION);
+
+            trySaveService(input, serviceBuilder);
+
+            ConnectionAttachmentResponseInformationBuilder connectionAttachmentResponseInformationBuilder = new ConnectionAttachmentResponseInformationBuilder();
+            connectionAttachmentResponseInformationBuilder.setInstanceId(allottedResourceId);
+            connectionAttachmentResponseInformationBuilder.setObjectPath(connectionAttachmentObjectPath);
+            responseBuilder.setConnectionAttachmentResponseInformation(connectionAttachmentResponseInformationBuilder.build());
+
+            ServiceResponseInformationBuilder serviceResponseInformationBuilder = new ServiceResponseInformationBuilder();
+            serviceResponseInformationBuilder.setInstanceId(siid);
+            serviceResponseInformationBuilder.setObjectPath(serviceObjectPath);
+            responseBuilder.setServiceResponseInformation(serviceResponseInformationBuilder.build());
+
+        } catch (IllegalStateException e) {
+            log.error(UPDATING_MDSAL_ERROR_MESSAGE, svcOperation, siid, e);
+            responseBuilder.setResponseCode("500");
+            responseBuilder.setResponseMessage(e.toString());
+            responseBuilder.setAckFinalIndicator("Y");
+            log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
+
+            RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
+                .<ConnectionAttachmentTopologyOperationOutput>status(true)
+                .withResult(responseBuilder.build())
+                .build();
+
+            return Futures.immediateFuture(rpcResult);
+        }
+
+        // Update succeeded
+        responseBuilder.setResponseCode(responseObject.getStatusCode());
+        responseBuilder.setAckFinalIndicator(ackFinal);
+        trySetResponseMessage(responseBuilder, responseObject);
         log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
         log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
 
-        RpcResult<TunnelxconnTopologyOperationOutput> rpcResult = RpcResultBuilder
-            .<TunnelxconnTopologyOperationOutput>status(true)
+        RpcResult<ConnectionAttachmentTopologyOperationOutput> rpcResult = RpcResultBuilder
+            .<ConnectionAttachmentTopologyOperationOutput>status(true)
             .withResult(responseBuilder.build())
             .build();
 
         return Futures.immediateFuture(rpcResult);
     }
 
-    private Properties tryGetProperties(String svcOperation, Properties parms, ErrorObject error) {
+    private void trySetResponseMessage(TunnelxconnTopologyOperationOutputBuilder responseBuilder,
+        ResponseObject error) {
+        if (!error.getMessage().isEmpty()) {
+            responseBuilder.setResponseMessage(error.getMessage());
+        }
+    }
+
+    private boolean hasInvalidServiceId(TunnelxconnTopologyOperationInput input) {
+        return input == null || input.getServiceInformation() == null
+            || input.getServiceInformation().getServiceInstanceId() == null
+            || input.getServiceInformation().getServiceInstanceId().length() == 0;
+    }
+
+    private Properties tryGetProperties(String svcOperation, Properties parms, ResponseObject responseObject) {
         try {
             if (svcLogicClient.hasGraph(APP_NAME, svcOperation, null, "sync")) {
 
@@ -1678,16 +2003,16 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
                     return svcLogicClient.execute(APP_NAME, svcOperation, null, "sync", parms);
                 } catch (Exception e) {
                     log.error(SERVICE_LOGIC_EXECUTION_ERROR_MESSAGE, svcOperation, e);
-                    error.setMessage(e.getMessage());
-                    error.setStatusCode("500");
+                    responseObject.setMessage(e.getMessage());
+                    responseObject.setStatusCode("500");
                 }
             } else {
-                error.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
-                error.setStatusCode("503");
+                responseObject.setMessage(NO_SERVICE_LOGIC_ACTIVE + APP_NAME + ": '" + svcOperation + "'");
+                responseObject.setStatusCode("503");
             }
         } catch (Exception e) {
-            error.setMessage(e.getMessage());
-            error.setStatusCode("500");
+            responseObject.setMessage(e.getMessage());
+            responseObject.setStatusCode("500");
             log.error(SERVICE_LOGIC_SEARCH_ERROR_MESSAGE, e);
         }
         return null;
@@ -1702,15 +2027,18 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // create a new response object
         BrgTopologyOperationOutputBuilder responseBuilder = new BrgTopologyOperationOutputBuilder();
 
-        if (input == null || input.getServiceInformation() == null
-            || input.getServiceInformation().getServiceInstanceId() == null
-            || input.getServiceInformation().getServiceInstanceId().length() == 0) {
+        if (this.hasInvalidServiceId(input)) {
+
             log.debug(NULL_OR_EMPTY_ERROR_MESSAGE, svcOperation);
             responseBuilder.setResponseCode("404");
             responseBuilder.setResponseMessage(NULL_OR_EMPTY_ERROR_PARAM);
             responseBuilder.setAckFinalIndicator("Y");
-            RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder.<BrgTopologyOperationOutput>status(true)
-                .withResult(responseBuilder.build()).build();
+
+            RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder
+                .<BrgTopologyOperationOutput>status(true)
+                .withResult(responseBuilder.build())
+                .build();
+
             return Futures.immediateFuture(rpcResult);
         }
 
@@ -1722,7 +2050,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
 
         // Call SLI sync method
         // Get SvcLogicService reference
-        ErrorObject error = new ErrorObject("200", "");
+        ResponseObject error = new ResponseObject("200", "");
         String ackFinal = "Y";
         String allottedResourceId = ERROR_NETWORK_ID;
         String serviceObjectPath = null;
@@ -1738,12 +2066,12 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             brgObjectPath = respProps.getProperty("brg-object-path");
         }
 
-        if (validateErrorObject(error)) {
+        if (failed(error)) {
             responseBuilder.setResponseCode(error.getStatusCode());
             responseBuilder.setResponseMessage(error.getMessage());
             responseBuilder.setAckFinalIndicator(ackFinal);
-            log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
 
+            log.error(RETURNED_FAILED_MESSAGE, svcOperation, siid, responseBuilder.build());
             RpcResult<BrgTopologyOperationOutput> rpcResult = RpcResultBuilder
                 .<BrgTopologyOperationOutput>status(true)
                 .withResult(responseBuilder.build())
@@ -1783,9 +2111,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // Update succeeded
         responseBuilder.setResponseCode(error.getStatusCode());
         responseBuilder.setAckFinalIndicator(ackFinal);
-        if (!error.getMessage().isEmpty()) {
-            responseBuilder.setResponseMessage(error.getMessage());
-        }
+        trySetResponseMessage(responseBuilder, error);
         log.info(UPDATED_MDSAL_INFO_MESSAGE, svcOperation, siid);
         log.info(RETURNED_SUCCESS_MESSAGE, svcOperation, siid, responseBuilder.build());
 
@@ -1797,6 +2123,18 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         return Futures.immediateFuture(rpcResult);
     }
 
+    private void trySetResponseMessage(BrgTopologyOperationOutputBuilder responseBuilder, ResponseObject error) {
+        if (!error.getMessage().isEmpty()) {
+            responseBuilder.setResponseMessage(error.getMessage());
+        }
+    }
+
+    private boolean hasInvalidServiceId(BrgTopologyOperationInput input) {
+        return input == null || input.getServiceInformation() == null
+            || input.getServiceInformation().getServiceInstanceId() == null
+            || input.getServiceInformation().getServiceInstanceId().length() == 0;
+    }
+
     @Override
     public Future<RpcResult<PreloadVnfTopologyOperationOutput>> preloadVnfTopologyOperation(
         PreloadVnfTopologyOperationInput input) {
@@ -1808,8 +2146,8 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // create a new response object
         PreloadVnfTopologyOperationOutputBuilder responseBuilder = new PreloadVnfTopologyOperationOutputBuilder();
 
-        if (input == null || input.getVnfTopologyInformation() == null
-            || input.getVnfTopologyInformation().getVnfTopologyIdentifier() == null) {
+        if (hasInvalidVnfTopology(input)) {
+
             log.debug("exiting {} because of null input", svcOperation);
             responseBuilder.setResponseCode("403");
             responseBuilder.setResponseMessage("invalid input: input is null");
@@ -1828,7 +2166,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         String preloadType = input.getVnfTopologyInformation().getVnfTopologyIdentifier().getVnfType();
 
         // Make sure we have a preload_name and preload_type
-        if (preloadName == null || preloadName.length() == 0 || preloadType == null || preloadType.length() == 0) {
+        if (invalidPreloadData(preloadName, preloadType)) {
             log.debug("exiting {} vnf-name or vnf-type is null or empty", svcOperation);
             responseBuilder.setResponseCode("403");
             responseBuilder.setResponseMessage("invalid input: vnf-name or vnf-type is null or empty");
@@ -1842,9 +2180,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             return Futures.immediateFuture(rpcResult);
         }
 
-        if (input.getSdncRequestHeader() != null) {
-            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
-        }
+        trySetSvcRequestId(input, responseBuilder);
 
         PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder();
         getPreloadData(preloadName, preloadType, preloadDataBuilder);
@@ -1875,20 +2211,14 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
 
         // Call SLI sync method
         // Get SvcLogicService reference
-        ErrorObject error = new ErrorObject("200", "");
-        String ackFinal = "Y";
-        Properties respProps = tryGetProperties(svcOperation, parms, error);
-
-        if (respProps != null) {
-            error.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
-            error.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
-            ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
-        }
+        ResponseObject responseObject = new ResponseObject("200", "");
+        Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
+        String ackFinal = resolveAckFinal(responseObject, respProps);
 
-        if (validateErrorObject(error)) {
+        if (failed(responseObject)) {
 
-            responseBuilder.setResponseCode(error.getStatusCode());
-            responseBuilder.setResponseMessage(error.getMessage());
+            responseBuilder.setResponseCode(responseObject.getStatusCode());
+            responseBuilder.setResponseMessage(responseObject.getMessage());
             responseBuilder.setAckFinalIndicator(ackFinal);
 
             VnfPreloadListBuilder preloadVnfListBuilder = new VnfPreloadListBuilder();
@@ -1896,7 +2226,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             preloadVnfListBuilder.setVnfType(preloadType);
             preloadVnfListBuilder.setPreloadData(preloadDataBuilder.build());
             log.error("Returned FAILED for {} [{},{}] error code: '{}', Reason: '{}'", svcOperation, preloadName,
-                preloadType, error.getStatusCode(), error.getMessage());
+                preloadType, responseObject.getStatusCode(), responseObject.getMessage());
             try {
                 savePreloadList(preloadVnfListBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
             } catch (Exception e) {
@@ -1920,7 +2250,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             log.error(UPDATING_MDSAL_ERROR_MESSAGE_2, svcOperation, preloadName, preloadType,
                 e);
             responseBuilder.setResponseCode("500");
-            responseBuilder.setResponseMessage(e.toString());
+            responseBuilder.setResponseMessage(e.getMessage());
             responseBuilder.setAckFinalIndicator("Y");
             log.error("Returned FAILED for {} [{},{}] {}", svcOperation, preloadName, preloadType,
                 responseBuilder.build());
@@ -1934,11 +2264,10 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         }
 
         // Update succeeded
-        responseBuilder.setResponseCode(error.getStatusCode());
+        responseBuilder.setResponseCode(responseObject.getStatusCode());
         responseBuilder.setAckFinalIndicator(ackFinal);
-        if (!error.getMessage().isEmpty()) {
-            responseBuilder.setResponseMessage(error.getMessage());
-        }
+        trySetResponseMessage(responseBuilder, responseObject);
+
         log.info("Updated MD-SAL for {} [{},{}]", svcOperation, preloadName, preloadType);
         log.info("Returned SUCCESS for {} [{},{}] {}", svcOperation, preloadName, preloadType,
             responseBuilder.build());
@@ -1951,6 +2280,33 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         return Futures.immediateFuture(rpcResult);
     }
 
+    private String resolveAckFinal(ResponseObject responseObject, Properties respProps) {
+        if (respProps != null) {
+            responseObject.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
+            responseObject.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
+            return respProps.getProperty(ACK_FINAL_PARAM, "Y");
+        }
+        return "Y";
+    }
+
+    private void trySetResponseMessage(PreloadVnfTopologyOperationOutputBuilder responseBuilder, ResponseObject error) {
+        if (!error.getMessage().isEmpty()) {
+            responseBuilder.setResponseMessage(error.getMessage());
+        }
+    }
+
+    private void trySetSvcRequestId(PreloadVnfTopologyOperationInput input,
+        PreloadVnfTopologyOperationOutputBuilder responseBuilder) {
+        if (input.getSdncRequestHeader() != null) {
+            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
+        }
+    }
+
+    private boolean hasInvalidVnfTopology(PreloadVnfTopologyOperationInput input) {
+        return input == null || input.getVnfTopologyInformation() == null
+            || input.getVnfTopologyInformation().getVnfTopologyIdentifier() == null;
+    }
+
     private void updatePreloadData(String svcOperation, String preloadName, String preloadType,
         PreloadDataBuilder preloadDataBuilder) {
         PreloadData preloadData;
@@ -1980,8 +2336,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         // create a new response object
         PreloadNetworkTopologyOperationOutputBuilder responseBuilder = new PreloadNetworkTopologyOperationOutputBuilder();
 
-        if (input == null || input.getNetworkTopologyInformation() == null
-            || input.getNetworkTopologyInformation().getNetworkTopologyIdentifier() == null) {
+        if (hasInvalidNetworkTopology(input)) {
 
             log.debug("exiting {} because of null input", svcOperation);
             responseBuilder.setResponseCode("403");
@@ -2001,10 +2356,10 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         String preloadType = input.getNetworkTopologyInformation().getNetworkTopologyIdentifier().getNetworkType();
 
         // Make sure we have a preload_name and preload_type
-        if (preloadName == null || preloadName.length() == 0 || preloadType == null || preloadType.length() == 0) {
-            log.debug("exiting {} because of invalid preload-name", svcOperation);
+        if (invalidPreloadData(preloadName, preloadType)) {
+            log.debug("exiting {} because of invalid preload-name or preload-type", svcOperation);
             responseBuilder.setResponseCode("403");
-            responseBuilder.setResponseMessage("input, invalid preload-name");
+            responseBuilder.setResponseMessage("invalid input: network-name or network-type is null or empty");
             responseBuilder.setAckFinalIndicator("Y");
 
             RpcResult<PreloadNetworkTopologyOperationOutput> rpcResult = RpcResultBuilder
@@ -2015,9 +2370,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             return Futures.immediateFuture(rpcResult);
         }
 
-        if (input.getSdncRequestHeader() != null) {
-            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
-        }
+        trySetSvcRequestId(input, responseBuilder);
 
         PreloadDataBuilder preloadDataBuilder = new PreloadDataBuilder();
         getPreloadData(preloadName, preloadType, preloadDataBuilder);
@@ -2050,20 +2403,15 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
 
         // Call SLI sync method
         // Get SvcLogicService reference
-        ErrorObject error = new ErrorObject("200", "");
-        String ackFinal = "Y";
-        Properties respProps = tryGetProperties(svcOperation, parms, error);
+        ResponseObject responseObject = new ResponseObject("200", "");
+        Properties respProps = tryGetProperties(svcOperation, parms, responseObject);
 
-        if (respProps != null) {
-            error.setStatusCode(respProps.getProperty(ERROR_CODE_PARAM));
-            error.setMessage(respProps.getProperty(ERROR_MESSAGE_PARAM));
-            ackFinal = respProps.getProperty(ACK_FINAL_PARAM, "Y");
-        }
+        String ackFinal = resolveAckFinal(responseObject, respProps);
 
-        if (validateErrorObject(error)) {
+        if (failed(responseObject)) {
 
-            responseBuilder.setResponseCode(error.getStatusCode());
-            responseBuilder.setResponseMessage(error.getMessage());
+            responseBuilder.setResponseCode(responseObject.getStatusCode());
+            responseBuilder.setResponseMessage(responseObject.getMessage());
             responseBuilder.setAckFinalIndicator(ackFinal);
 
             VnfPreloadListBuilder preloadVnfListBuilder = new VnfPreloadListBuilder();
@@ -2071,7 +2419,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
             preloadVnfListBuilder.setVnfType(preloadType);
             preloadVnfListBuilder.setPreloadData(preloadDataBuilder.build());
             log.error("Returned FAILED for {} [{},{}] error code: '{}', Reason: '{}'", svcOperation, preloadName,
-                preloadType, error.getStatusCode(), error.getMessage());
+                preloadType, responseObject.getStatusCode(), responseObject.getMessage());
             try {
                 savePreloadList(preloadVnfListBuilder.build(), true, LogicalDatastoreType.CONFIGURATION);
             } catch (Exception e) {
@@ -2095,7 +2443,7 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         } catch (Exception e) {
             log.error(UPDATING_MDSAL_ERROR_MESSAGE_2, svcOperation, preloadName, preloadType, e);
             responseBuilder.setResponseCode("500");
-            responseBuilder.setResponseMessage(e.toString());
+            responseBuilder.setResponseMessage(e.getMessage());
             responseBuilder.setAckFinalIndicator("Y");
             log.error("Returned FAILED for {} [{},{}] {}", svcOperation, preloadName, preloadType,
                 responseBuilder.build());
@@ -2109,11 +2457,10 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         }
 
         // Update succeeded
-        responseBuilder.setResponseCode(error.getStatusCode());
+        responseBuilder.setResponseCode(responseObject.getStatusCode());
         responseBuilder.setAckFinalIndicator(ackFinal);
-        if (!error.getMessage().isEmpty()) {
-            responseBuilder.setResponseMessage(error.getMessage());
-        }
+        trySetResponseMessage(responseBuilder, responseObject);
+
         log.info("Updated MD-SAL for {} [{},{}]", svcOperation, preloadName, preloadType);
         log.info("Returned SUCCESS for {} [{},{}] {}", svcOperation, preloadName, preloadType,
             responseBuilder.build());
@@ -2126,4 +2473,27 @@ public class GenericResourceApiProvider implements AutoCloseable, GENERICRESOURC
         return Futures.immediateFuture(rpcResult);
     }
 
+    private void trySetResponseMessage(PreloadNetworkTopologyOperationOutputBuilder responseBuilder,
+        ResponseObject error) {
+        if (!error.getMessage().isEmpty()) {
+            responseBuilder.setResponseMessage(error.getMessage());
+        }
+    }
+
+    private void trySetSvcRequestId(PreloadNetworkTopologyOperationInput input,
+        PreloadNetworkTopologyOperationOutputBuilder responseBuilder) {
+        if (input.getSdncRequestHeader() != null) {
+            responseBuilder.setSvcRequestId(input.getSdncRequestHeader().getSvcRequestId());
+        }
+    }
+
+    private boolean invalidPreloadData(String preloadName, String preloadType) {
+        return preloadName == null || preloadName.length() == 0 || preloadType == null || preloadType.length() == 0;
+    }
+
+    private boolean hasInvalidNetworkTopology(PreloadNetworkTopologyOperationInput input) {
+        return input == null || input.getNetworkTopologyInformation() == null
+            || input.getNetworkTopologyInformation().getNetworkTopologyIdentifier() == null;
+    }
+
 }