Include impacted changes for APPC-346,APPC-348
[appc.git] / appc-provider / appc-provider-bundle / src / main / java / org / onap / appc / provider / AppcProviderLcm.java
index 66e8909..7d755cd 100644 (file)
@@ -26,13 +26,19 @@ package org.onap.appc.provider;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
-import com.att.eelf.i18n.EELFResourceManager;
 import com.google.common.util.concurrent.Futures;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ActionStatusInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ActionStatusOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ActionStatusOutputBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AttachVolumeInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AttachVolumeOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AttachVolumeOutputBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AuditInput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AuditOutput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AuditOutputBuilder;
@@ -60,6 +66,9 @@ import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ConfigScaleoutOu
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ConfigureInput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ConfigureOutput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ConfigureOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.DetachVolumeInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.DetachVolumeOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.DetachVolumeOutputBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.EvacuateInput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.EvacuateOutput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.EvacuateOutputBuilder;
@@ -75,6 +84,18 @@ import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.LockOutputBuilde
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.MigrateInput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.MigrateOutput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.MigrateOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QueryInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QueryOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QueryOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QuiesceTrafficInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QuiesceTrafficOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.QuiesceTrafficOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ResumeTrafficInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ResumeTrafficOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.ResumeTrafficOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebootInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebootOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebootOutputBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebuildInput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebuildOutput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.RebuildOutputBuilder;
@@ -90,9 +111,15 @@ import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.SnapshotOutputBu
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.SoftwareUploadInput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.SoftwareUploadOutput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.SoftwareUploadOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartApplicationInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartApplicationOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartApplicationOutputBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartInput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartOutput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopApplicationInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopApplicationOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopApplicationOutputBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopInput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopOutput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopOutputBuilder;
@@ -108,53 +135,59 @@ import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.TestOutputBuilde
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UnlockInput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UnlockOutput;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UnlockOutputBuilder;
-import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartApplicationOutput;
-import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartApplicationOutputBuilder;
-import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StartApplicationInput;
-import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopApplicationOutput;
-import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopApplicationOutputBuilder;
-import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.StopApplicationInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePreCheckInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePreCheckOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePreCheckOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeSoftwareInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeSoftwareOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeSoftwareOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePostCheckInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePostCheckOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradePostCheckOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackupInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackupOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackupOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackoutInput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackoutOutput;
+import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.UpgradeBackoutOutputBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.Status;
-import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.status.StatusBuilder;
-import org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.Action;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.onap.appc.Constants;
 import org.onap.appc.configuration.Configuration;
 import org.onap.appc.configuration.ConfigurationFactory;
-import org.onap.appc.domainmodel.lcm.ActionLevel;
-import org.onap.appc.domainmodel.lcm.ResponseContext;
-import org.onap.appc.exceptions.APPCException;
-import org.onap.appc.executor.objects.LCMCommandStatus;
-import org.onap.appc.executor.objects.Params;
 import org.onap.appc.i18n.Msg;
 import org.onap.appc.logging.LoggingConstants;
 import org.onap.appc.logging.LoggingUtils;
+import org.onap.appc.provider.lcm.service.AbstractBaseUtils;
+import org.onap.appc.provider.lcm.service.ActionStatusService;
+import org.onap.appc.provider.lcm.service.QueryService;
+import org.onap.appc.provider.lcm.service.QuiesceTrafficService;
+import org.onap.appc.provider.lcm.service.ResumeTrafficService;
+import org.onap.appc.provider.lcm.service.UpgradeService;
+import org.onap.appc.provider.lcm.service.RebootService;
+import org.onap.appc.provider.lcm.service.RequestExecutor;
+import org.onap.appc.provider.lcm.service.VolumeService;
 import org.onap.appc.provider.lcm.util.RequestInputBuilder;
 import org.onap.appc.provider.lcm.util.ValidationService;
-import org.onap.appc.requesthandler.RequestHandler;
 import org.onap.appc.requesthandler.objects.RequestHandlerInput;
 import org.onap.appc.requesthandler.objects.RequestHandlerOutput;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
 
 import java.text.ParseException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
-import java.util.Collection;
 
-public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
+
+public class AppcProviderLcm
+    extends AbstractBaseUtils
+    implements AutoCloseable, AppcProviderLcmService {
 
     private Configuration configuration = ConfigurationFactory.getConfiguration();
     private final EELFLogger logger = EELFManager.getInstance().getLogger(AppcProviderLcm.class);
 
     private final ExecutorService executor;
 
-    private final String COMMON_ERROR_MESSAGE_TEMPLATE =  "Error processing %s input : %s";
-
     /**
      * The ODL data store broker. Provides access to a conceptual data tree store and also provides the ability to
      * subscribe for changes to data under a given branch of the tree.
@@ -224,7 +257,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     /**
      * Rebuilds a specific VNF
      *
-     * @see AppcProviderLcmService#rebuild(RebuildInput)
+     * @see org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService#rebuild(RebuildInput)
      */
     @Override
     public Future<RpcResult<RebuildOutput>> rebuild(RebuildInput input) {
@@ -233,19 +266,14 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         RebuildOutputBuilder outputBuilder = new RebuildOutputBuilder();
         String action = Action.Rebuild.toString() ;
         String rpcName = Action.Rebuild.name().toLowerCase();
-        Status status =
-                ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
+        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
-                RequestHandlerInput request = new RequestInputBuilder().requestContext()
-                        .commonHeader(input.getCommonHeader())
-                        .actionIdentifiers(input.getActionIdentifiers())
-                        .payload(input.getPayload()).action(action).rpcName(rpcName).build();
+                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
-                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
-                        input.getActionIdentifiers(), status.getCode(), status.getMessage()));
+                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -258,8 +286,10 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         outputBuilder.setStatus(status);
         RpcResult<RebuildOutput> result = RpcResultBuilder.<RebuildOutput> status(true).withResult(outputBuilder.build()).build();
         return Futures.immediateFuture(result);
+
     }
 
+
     /**
      * Restarts a specific VNF
      *
@@ -272,8 +302,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         RestartOutputBuilder outputBuilder = new RestartOutputBuilder();
         String action = Action.Restart.toString() ;
         String rpcName = Action.Restart.name().toLowerCase();
-        Status status =
-                ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
+        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
                 RequestHandlerInput request = new RequestInputBuilder().requestContext()
@@ -285,10 +314,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
                         .build();
 
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
-                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
-                        input.getActionIdentifiers(), status.getCode(), status.getMessage()));
+                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -303,10 +331,51 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         return Futures.immediateFuture(result);
     }
 
+    /**
+     * Start Application
+     *
+     * @see org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService#startApplication(StartApplicationInput)
+     */
+    @Override
+    public Future<RpcResult<StartApplicationOutput>> startApplication(StartApplicationInput input) {
+        logger.debug("Input received : " + input.toString());
+
+        StartApplicationOutputBuilder outputBuilder = new StartApplicationOutputBuilder();
+        String action = Action.StartApplication.toString() ;
+        String rpcName = Action.StartApplication.name().toLowerCase();
+        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
+        if(null == status) {
+            try {
+                RequestHandlerInput request = new RequestInputBuilder().requestContext()
+                        .commonHeader(input.getCommonHeader())
+                        .actionIdentifiers(input.getActionIdentifiers())
+                        .payload(input.getPayload())
+                        .action(action)
+                        .rpcName(rpcName)
+                        .build();
+
+                status = buildStatusWithDispatcherOutput(executeRequest(request));
+                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
+            } catch (ParseException e) {
+                status = buildStatusWithParseException(e);
+
+                LoggingUtils.logErrorMessage(
+                        LoggingConstants.TargetNames.APPC_PROVIDER,
+                        String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
+                        this.getClass().getName());
+
+            }
+        }
+        outputBuilder.setCommonHeader(input.getCommonHeader());
+        outputBuilder.setStatus(status);
+        RpcResult<StartApplicationOutput> result = RpcResultBuilder.<StartApplicationOutput> status(true).withResult(outputBuilder.build()).build();
+        return Futures.immediateFuture(result);
+    }
+
     /**
      * Migrates a specific VNF
      *
-     * @see AppcProviderLcmService#migrate(MigrateInput)
+     * @see org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService#migrate(MigrateInput)
      */
     @Override
     public Future<RpcResult<MigrateOutput>> migrate(MigrateInput input) {
@@ -315,19 +384,14 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         MigrateOutputBuilder outputBuilder = new MigrateOutputBuilder();
         String action = Action.Migrate.toString() ;
         String rpcName = Action.Migrate.name().toLowerCase();
-        Status status =
-                ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
+        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
-                RequestHandlerInput request = new RequestInputBuilder().requestContext()
-                        .commonHeader(input.getCommonHeader())
-                        .actionIdentifiers(input.getActionIdentifiers())
-                        .payload(input.getPayload()).action(action).rpcName(rpcName).build();
+                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
-                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
-                        input.getActionIdentifiers(), status.getCode(), status.getMessage()));
+                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -342,10 +406,11 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         return Futures.immediateFuture(result);
     }
 
+
     /**
      * Evacuates a specific VNF
      *
-     * @see AppcProviderLcmService#evacuate(EvacuateInput)
+     * @see org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService#evacuate(EvacuateInput)
      */
     @Override
     public Future<RpcResult<EvacuateOutput>> evacuate(EvacuateInput input) {
@@ -361,7 +426,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -380,7 +445,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     /**
      * Evacuates a specific VNF
      *
-     * @see AppcProviderLcmService#snapshot(SnapshotInput)
+     * @see org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService#snapshot(SnapshotInput)
      */
     @Override
     public Future<RpcResult<SnapshotOutput>> snapshot(SnapshotInput input) {
@@ -389,21 +454,15 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         SnapshotOutputBuilder outputBuilder = new SnapshotOutputBuilder();
         String action = Action.Snapshot.toString() ;
         String rpcName = Action.Snapshot.name().toLowerCase();
-        Status status =
-                ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
+        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         String identityUrl = input.getIdentityUrl();
         if(null == status) {
             try {
-                RequestHandlerInput request = new RequestInputBuilder().requestContext()
-                        .commonHeader(input.getCommonHeader())
-                        .actionIdentifiers(input.getActionIdentifiers())
-                        .payload(input.getPayload()).action(action).rpcName(rpcName)
-                        .additionalContext("identity-url", identityUrl).build();
+                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).additionalContext("identity-url", identityUrl).build();
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
-                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
-                        input.getActionIdentifiers(), status.getCode(), status.getMessage()));
+                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -423,22 +482,16 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
 
         RollbackOutputBuilder outputBuilder = new RollbackOutputBuilder();
         String rpcName = Action.Rollback.toString() ;
-        Status status =
-                ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), rpcName);
+        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), rpcName);
         String identityUrl =  input.getIdentityUrl();
         String snapshotId = input.getSnapshotId();
         if(null == status) {
             try {
-                RequestHandlerInput request = new RequestInputBuilder().requestContext()
-                        .commonHeader(input.getCommonHeader())
-                        .actionIdentifiers(input.getActionIdentifiers())
-                        .payload(input.getPayload()).additionalContext("identity-url", identityUrl)
-                        .additionalContext("snapshot-id", snapshotId).action(rpcName).build();
+                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).additionalContext("identity-url", identityUrl).additionalContext("snapshot-id", snapshotId).action(rpcName).build();
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
-                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
-                        input.getActionIdentifiers(), status.getCode(), status.getMessage()));
+                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -459,19 +512,14 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         SyncOutputBuilder outputBuilder = new SyncOutputBuilder();
         String action = Action.Sync.toString() ;
         String rpcName = Action.Sync.name().toLowerCase();
-        Status status =
-                ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
+        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
-                RequestHandlerInput request = new RequestInputBuilder().requestContext()
-                        .commonHeader(input.getCommonHeader())
-                        .actionIdentifiers(input.getActionIdentifiers())
-                        .payload(input.getPayload()).action(action).rpcName(rpcName).build();
+                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
-                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
-                        input.getActionIdentifiers(), status.getCode(), status.getMessage()));
+                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -486,92 +534,120 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         return Futures.immediateFuture(result);
     }
 
-    private Status buildParsingErrorStatus(ParseException e){
-        LCMCommandStatus requestParsingFailure = LCMCommandStatus.REQUEST_PARSING_FAILED;
-        String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
-        Params params = new Params().addParam("errorMsg", errorMessage);
-        return buildStatus(requestParsingFailure.getResponseCode(), requestParsingFailure.getFormattedMessage(params));
+    @Override
+    public Future<RpcResult<QueryOutput>> query(QueryInput input) {
+        logger.debug(String.format("LCM query received input: %s", input.toString()));
+        QueryOutputBuilder outputBuilder = new QueryService().process(input);
+        RpcResult<QueryOutput> result =
+            RpcResultBuilder.<QueryOutput> status(true).withResult(outputBuilder.build()).build();
+        return Futures.immediateFuture(result);
     }
 
-    private Status buildStatus(Integer code,String message){
-        StatusBuilder status = new StatusBuilder();
-        status.setCode(code);
-        status.setMessage(message);
-        return status.build();
+    @Override
+    public Future<RpcResult<RebootOutput>> reboot(RebootInput input) {
+        logger.debug(String.format("LCM reboot received input: %s", input.toString()));
+        RebootOutputBuilder outputBuilder = new RebootService().process(input);
+        RpcResult<RebootOutput> result =
+            RpcResultBuilder.<RebootOutput>status(true).withResult(outputBuilder.build()).build();
+        return Futures.immediateFuture(result);
     }
 
-    private Status buildStatusWithDispatcherOutput(RequestHandlerOutput requestHandlerOutput){
-        Integer statusCode = requestHandlerOutput.getResponseContext().getStatus().getCode();
-        String statusMessage = requestHandlerOutput.getResponseContext().getStatus().getMessage();
-        return  buildStatus(statusCode, statusMessage);
+    @Override
+    public Future<RpcResult<AttachVolumeOutput>> attachVolume(AttachVolumeInput input) {
+        logger.debug(String.format("LCM attachVolume received input: %s", input.toString()));
+        AttachVolumeOutputBuilder outputBuilder = new VolumeService(true).attachVolume(input);
+        RpcResult<AttachVolumeOutput> result =
+            RpcResultBuilder.<AttachVolumeOutput> status(true).withResult(outputBuilder.build()).build();
+        return Futures.immediateFuture(result);
     }
 
-    private RequestHandlerOutput createErrorRequestHandlerObj(RequestHandlerInput request,
-                                                              LCMCommandStatus cmdStatus,
-                                                              Msg msg,
-                                                              Exception e) {
-        final String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME);
-        final String reason = EELFResourceManager.format(msg, e,
-                appName, e.getClass().getSimpleName(), "", e.getMessage());
-
-        RequestHandlerOutput requestHandlerOutput = new RequestHandlerOutput();
-        final ResponseContext responseContext = new ResponseContext();
-        requestHandlerOutput.setResponseContext(responseContext);
-        responseContext.setCommonHeader(request.getRequestContext().getCommonHeader());
-
-        String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
-        Params params = new Params().addParam("errorMsg", errorMessage);
-        responseContext.setStatus(cmdStatus.toStatus(params));
-
-        LoggingUtils.logErrorMessage(
-                LoggingConstants.TargetNames.APPC_PROVIDER,
-                reason,
-                this.getClass().getName());
-
-        return requestHandlerOutput;
+    @Override
+    public Future<RpcResult<DetachVolumeOutput>> detachVolume(DetachVolumeInput input) {
+        logger.debug(String.format("LCM detachVolume received input: %s", input.toString()));
+        DetachVolumeOutputBuilder outputBuilder = new VolumeService(false).detachVolume(input);
+        RpcResult<DetachVolumeOutput> result =
+            RpcResultBuilder.<DetachVolumeOutput>status(true).withResult(outputBuilder.build()).build();
+        return Futures.immediateFuture(result);
     }
 
-    private RequestHandler getRequestHandler(ActionLevel actionLevel){
-        final BundleContext context = FrameworkUtil.getBundle(RequestHandler.class).getBundleContext();
-        if (context != null) {
-            String filter = null;
-            try {
-                filter = "(level=" + actionLevel.name() + ")";
-                Collection<ServiceReference<RequestHandler>> serviceReferences = context.getServiceReferences(RequestHandler.class, filter);
-                if (serviceReferences.size() != 1) {
-                    logger.error("Cannot find service reference for " + RequestHandler.class.getName());
-                    throw new RuntimeException();
-                }
-                ServiceReference<RequestHandler> serviceReference = serviceReferences.iterator().next();
-                return context.getService(serviceReference);
-            } catch (InvalidSyntaxException e) {
-                logger.error("Cannot find service reference for " + RequestHandler.class.getName() + ": Invalid Syntax " + filter, e);
-                throw new RuntimeException(e);
-            }
-        }
-        return null;
+    @Override
+    public Future<RpcResult<QuiesceTrafficOutput>> quiesceTraffic(QuiesceTrafficInput input) {
+        logger.debug(String.format("LCM quiesce received input: %s", input.toString()));
+        QuiesceTrafficOutputBuilder outputBuilder = new QuiesceTrafficService().process(input);
+        RpcResult<QuiesceTrafficOutput> result =
+            RpcResultBuilder.<QuiesceTrafficOutput> status(true).withResult(outputBuilder.build()).build();
+        return Futures.immediateFuture(result);
     }
 
+    @Override
+    public Future<RpcResult<ResumeTrafficOutput>> resumeTraffic(ResumeTrafficInput input) {
+        logger.debug(String.format("LCM resume received input: %s", input.toString()));
+        ResumeTrafficOutputBuilder outputBuilder = new ResumeTrafficService().process(input);
+        RpcResult<ResumeTrafficOutput> result =
+            RpcResultBuilder.<ResumeTrafficOutput> status(true).withResult(outputBuilder.build()).build();
+        return Futures.immediateFuture(result);
+    }
+
+    @Override
+    public Future<RpcResult<UpgradePreCheckOutput>> upgradePreCheck(UpgradePreCheckInput input) {
+        logger.debug(String.format("LCM upgradeprecheck received input: %s", input.toString()));
+        UpgradePreCheckOutputBuilder outputBuilder = new UpgradeService("upgradePre").upgradePreCheck(input);
+        RpcResult<UpgradePreCheckOutput> result =
+            RpcResultBuilder.<UpgradePreCheckOutput> status(true).withResult(outputBuilder.build()).build();
+        return Futures.immediateFuture(result);
+    }
+
+    @Override
+    public Future<RpcResult<UpgradeSoftwareOutput>> upgradeSoftware(UpgradeSoftwareInput input) {
+        logger.debug(String.format("LCM upgradesoftware received input: %s", input.toString()));
+        UpgradeSoftwareOutputBuilder outputBuilder = new UpgradeService("upgradeSoft").upgradeSoftware(input);
+        RpcResult<UpgradeSoftwareOutput> result =
+            RpcResultBuilder.<UpgradeSoftwareOutput> status(true).withResult(outputBuilder.build()).build();
+            return Futures.immediateFuture(result);
+    }
+
+    @Override
+    public Future<RpcResult<UpgradePostCheckOutput>> upgradePostCheck(UpgradePostCheckInput input) {
+        logger.debug(String.format("LCM upgradepostcheck received input: %s", input.toString()));
+        UpgradePostCheckOutputBuilder outputBuilder = new UpgradeService("upgradePost").upgradePostCheck(input);
+        RpcResult<UpgradePostCheckOutput> result =
+            RpcResultBuilder.<UpgradePostCheckOutput> status(true).withResult(outputBuilder.build()).build();
+        return Futures.immediateFuture(result);
+    }
+
+    @Override
+    public Future<RpcResult<UpgradeBackupOutput>> upgradeBackup(UpgradeBackupInput input) {
+        logger.debug(String.format("LCM backup received input: %s", input.toString()));
+        UpgradeBackupOutputBuilder outputBuilder = new UpgradeService("upgradeBackup").upgradeBackup(input);
+        RpcResult<UpgradeBackupOutput> result =
+            RpcResultBuilder.<UpgradeBackupOutput> status(true).withResult(outputBuilder.build()).build();
+        return Futures.immediateFuture(result);
+    }
+
+    @Override
+    public Future<RpcResult<UpgradeBackoutOutput>> upgradeBackout(UpgradeBackoutInput input) {
+        logger.debug(String.format("LCM backout received input: %s", input.toString()));
+        UpgradeBackoutOutputBuilder outputBuilder = new UpgradeService("upgradeBackout").upgradeBackout(input);
+        RpcResult<UpgradeBackoutOutput> result =
+            RpcResultBuilder.<UpgradeBackoutOutput> status(true).withResult(outputBuilder.build()).build();
+        return Futures.immediateFuture(result);
+    }
     @Override
     public Future<RpcResult<TerminateOutput>> terminate(TerminateInput input) {
         logger.debug("Input received : " + input.toString());
         TerminateOutputBuilder outputBuilder = new TerminateOutputBuilder();
-        String action = Action.Terminate.toString() ;
-        String rpcName = Action.Terminate.name().toLowerCase();
-        Status status =
-                ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
+        Action myAction = Action.Terminate;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
+        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
-                RequestHandlerInput request = new RequestInputBuilder().requestContext()
-                        .commonHeader(input.getCommonHeader())
-                        .actionIdentifiers(input.getActionIdentifiers())
-                        .payload(input.getPayload()).action(action).rpcName(rpcName).build();
+                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
-                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
-                        input.getActionIdentifiers(), status.getCode(), status.getMessage()));
+                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
 
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -583,8 +659,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         }
         outputBuilder.setCommonHeader(input.getCommonHeader());
         outputBuilder.setStatus(status);
-        RpcResult<TerminateOutput> result =
-                RpcResultBuilder.<TerminateOutput> status(true).withResult(outputBuilder.build()).build();
+        RpcResult<TerminateOutput> result = RpcResultBuilder.<TerminateOutput> status(true).withResult(outputBuilder.build()).build();
         return Futures.immediateFuture(result);
     }
 
@@ -592,21 +667,17 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<ConfigureOutput>> configure(ConfigureInput input) {
         logger.debug("Input received : " + input.toString());
         ConfigureOutputBuilder outputBuilder = new ConfigureOutputBuilder();
-        String action = Action.Configure.toString() ;
-        String rpcName = "configure";
-        Status status =
-                ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
+        Action myAction = Action.Configure;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
+        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
-                RequestHandlerInput request = new RequestInputBuilder().requestContext()
-                        .commonHeader(input.getCommonHeader())
-                        .actionIdentifiers(input.getActionIdentifiers())
-                        .payload(input.getPayload()).action(action).rpcName(rpcName).build();
+                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
-                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
-                        input.getActionIdentifiers(), status.getCode(), status.getMessage()));
+                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -617,8 +688,15 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         }
         outputBuilder.setCommonHeader(input.getCommonHeader());
         outputBuilder.setStatus(status);
-        RpcResult<ConfigureOutput> result =
-                RpcResultBuilder.<ConfigureOutput> status(true).withResult(outputBuilder.build()).build();
+        RpcResult<ConfigureOutput> result = RpcResultBuilder.<ConfigureOutput> status(true).withResult(outputBuilder.build()).build();
+        return Futures.immediateFuture(result);
+    }
+
+    @Override
+    public Future<RpcResult<ActionStatusOutput>> actionStatus(ActionStatusInput input) {
+        logger.debug(String.format("Input received : %s", input.toString()));
+        ActionStatusOutputBuilder outputBuilder = (new ActionStatusService()).queryStatus(input);
+        RpcResult<ActionStatusOutput> result = RpcResultBuilder.<ActionStatusOutput> status(true).withResult(outputBuilder.build()).build();
         return Futures.immediateFuture(result);
     }
 
@@ -626,21 +704,17 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<ConfigModifyOutput>> configModify(ConfigModifyInput input) {
         logger.debug("Input received : " + input.toString());
         ConfigModifyOutputBuilder outputBuilder = new ConfigModifyOutputBuilder();
-        String action = Action.ConfigModify.toString() ;
-        String rpcName = "config-modify";
-        Status status =
-                ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
+        Action myAction = Action.ConfigModify;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
+        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
-                RequestHandlerInput request = new RequestInputBuilder().requestContext()
-                        .commonHeader(input.getCommonHeader())
-                        .actionIdentifiers(input.getActionIdentifiers())
-                        .payload(input.getPayload()).action(action).rpcName(rpcName).build();
+                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
-                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
-                        input.getActionIdentifiers(), status.getCode(), status.getMessage()));
+                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -651,8 +725,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         }
         outputBuilder.setCommonHeader(input.getCommonHeader());
         outputBuilder.setStatus(status);
-        RpcResult<ConfigModifyOutput> result =
-                RpcResultBuilder.<ConfigModifyOutput> status(true).withResult(outputBuilder.build()).build();
+        RpcResult<ConfigModifyOutput> result = RpcResultBuilder.<ConfigModifyOutput> status(true).withResult(outputBuilder.build()).build();
         return Futures.immediateFuture(result);
     }
 
@@ -660,21 +733,17 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<ConfigScaleoutOutput>> configScaleout(ConfigScaleoutInput input) {
         logger.debug("Input received : " + input.toString());
         ConfigScaleoutOutputBuilder outputBuilder = new ConfigScaleoutOutputBuilder();
-        String action = Action.ConfigScaleOut.toString() ;
-        String rpcName = "config-scaleout";
-        Status status =
-                ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
+        Action myAction = Action.ConfigScaleOut;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
+        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
-                RequestHandlerInput request = new RequestInputBuilder().requestContext()
-                        .commonHeader(input.getCommonHeader())
-                        .actionIdentifiers(input.getActionIdentifiers())
-                        .payload(input.getPayload()).action(action).rpcName(rpcName).build();
+                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
-                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
-                        input.getActionIdentifiers(), status.getCode(), status.getMessage()));
+                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -685,8 +754,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         }
         outputBuilder.setCommonHeader(input.getCommonHeader());
         outputBuilder.setStatus(status);
-        RpcResult<ConfigScaleoutOutput> result =
-                RpcResultBuilder.<ConfigScaleoutOutput> status(true).withResult(outputBuilder.build()).build();
+        RpcResult<ConfigScaleoutOutput> result = RpcResultBuilder.<ConfigScaleoutOutput> status(true).withResult(outputBuilder.build()).build();
         return Futures.immediateFuture(result);
     }
 
@@ -694,21 +762,17 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<ConfigRestoreOutput>> configRestore(ConfigRestoreInput input) {
         logger.debug("Input received : " + input.toString());
         ConfigRestoreOutputBuilder outputBuilder = new ConfigRestoreOutputBuilder();
-        String action = Action.ConfigRestore.toString() ;
-        String rpcName = "config-restore";
-        Status status =
-                ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
+        Action myAction = Action.ConfigRestore;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
+        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
-                RequestHandlerInput request = new RequestInputBuilder().requestContext()
-                        .commonHeader(input.getCommonHeader())
-                        .actionIdentifiers(input.getActionIdentifiers())
-                        .payload(input.getPayload()).action(action).rpcName(rpcName).build();
+                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
-                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
-                        input.getActionIdentifiers(), status.getCode(), status.getMessage()));
+                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -719,8 +783,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         }
         outputBuilder.setCommonHeader(input.getCommonHeader());
         outputBuilder.setStatus(status);
-        RpcResult<ConfigRestoreOutput> result =
-                RpcResultBuilder.<ConfigRestoreOutput> status(true).withResult(outputBuilder.build()).build();
+        RpcResult<ConfigRestoreOutput> result = RpcResultBuilder.<ConfigRestoreOutput> status(true).withResult(outputBuilder.build()).build();
         return Futures.immediateFuture(result);
     }
 
@@ -728,8 +791,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<TestOutput>> test(TestInput input) {
         logger.debug("Input received : " + input.toString());
         TestOutputBuilder outputBuilder = new TestOutputBuilder();
-        String action = Action.Test.toString() ;
-        String rpcName = Action.Test.name().toLowerCase();
+        Action myAction = Action.Test;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
@@ -737,7 +801,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -757,8 +821,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<StopOutput>> stop(StopInput input) {
         logger.debug("Input received : " + input.toString());
         StopOutputBuilder outputBuilder = new StopOutputBuilder();
-        String action = Action.Stop.toString() ;
-        String rpcName = Action.Stop.name().toLowerCase();
+        Action myAction = Action.Stop;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
@@ -766,7 +831,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -784,15 +849,16 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     /**
      * Starts a specific VNF
      *
-     * @see AppcProviderLcmService#start(StartInput)
+     * @see org.opendaylight.yang.gen.v1.org.onap.appc.lcm.rev160108.AppcProviderLcmService#start(StartInput)
      */
     @Override
     public Future<RpcResult<StartOutput>> start(StartInput input) {
         logger.debug("Input received : " + input.toString());
 
         StartOutputBuilder outputBuilder = new StartOutputBuilder();
-        String action = Action.Start.toString() ;
-        String rpcName = Action.Start.name().toLowerCase();
+        Action myAction = Action.Start;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
@@ -805,7 +871,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -825,8 +891,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<AuditOutput>> audit(AuditInput input) {
         logger.debug("Input received : " + input.toString());
         AuditOutputBuilder outputBuilder = new AuditOutputBuilder();
-        String action = Action.Audit.toString();
-        String rpcName = Action.Audit.name().toLowerCase();
+        Action myAction = Action.Audit;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
@@ -834,7 +901,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -853,8 +920,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<SoftwareUploadOutput>> softwareUpload(SoftwareUploadInput input) {
         logger.debug("Input received : " + input.toString());
         SoftwareUploadOutputBuilder outputBuilder = new SoftwareUploadOutputBuilder();
-        String action = Action.SoftwareUpload.toString() ;
-        String rpcName = convertActionNameToUrl(action);
+        Action myAction = Action.SoftwareUpload;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
@@ -863,7 +931,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -882,8 +950,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<HealthCheckOutput>> healthCheck(HealthCheckInput input) {
         logger.debug("Input received : " + input.toString());
         HealthCheckOutputBuilder outputBuilder = new HealthCheckOutputBuilder();
-        String action = Action.HealthCheck.toString() ;
-        String rpcName = convertActionNameToUrl(action);
+        Action myAction = Action.HealthCheck;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
@@ -891,7 +960,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -910,8 +979,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<LiveUpgradeOutput>> liveUpgrade(LiveUpgradeInput input) {
         logger.debug("Input received : " + input.toString());
         LiveUpgradeOutputBuilder outputBuilder = new LiveUpgradeOutputBuilder();
-        String action = Action.LiveUpgrade.toString() ;
-        String rpcName = convertActionNameToUrl(action);
+        Action myAction = Action.LiveUpgrade;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
@@ -919,7 +989,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -939,8 +1009,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<LockOutput>> lock(LockInput input) {
         logger.debug("Input received : " + input.toString());
         LockOutputBuilder outputBuilder = new LockOutputBuilder();
-        String action = Action.Lock.toString() ;
-        String rpcName = Action.Lock.name().toLowerCase();
+        Action myAction = Action.Lock;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
@@ -948,7 +1019,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -968,8 +1039,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<UnlockOutput>> unlock(UnlockInput input) {
         logger.debug("Input received : " + input.toString());
         UnlockOutputBuilder outputBuilder = new UnlockOutputBuilder();
-        String action = Action.Unlock.toString() ;
-        String rpcName = Action.Unlock.name().toLowerCase();
+        Action myAction = Action.Unlock;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
@@ -977,7 +1049,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -996,23 +1068,24 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<CheckLockOutput>> checkLock(CheckLockInput input) {
         logger.debug("Input received : " + input.toString());
         CheckLockOutputBuilder outputBuilder = new CheckLockOutputBuilder();
-        String action = Action.CheckLock.toString();
-        String rpcName = Action.CheckLock.name().toLowerCase();
+        Action myAction = Action.CheckLock;
+        String action = myAction.toString();
+        String rpcName = getRpcName(myAction);
         RequestHandlerOutput requestHandlerOutput = null;
-        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(),
-            input.getAction(), action);
+        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(),
+            action);
         if (null == status) {
             try {
                 RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input
-                    .getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action)
-                    .rpcName(rpcName).build();
+                    .getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName
+                    (rpcName).build();
                 requestHandlerOutput = executeRequest(request);
 
                 status = buildStatusWithDispatcherOutput(requestHandlerOutput);
-                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s",
-                    input.getActionIdentifiers(), status.getCode(), status.getMessage()));
+                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input
+                    .getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                     LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -1021,14 +1094,15 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
 
             }
         }
+
         outputBuilder.setCommonHeader(input.getCommonHeader());
         outputBuilder.setStatus(status);
         if (requestHandlerOutput != null && requestHandlerOutput.getResponseContext().getStatus().getCode() == 400) {
             outputBuilder.setLocked(CheckLockOutput.Locked.valueOf(requestHandlerOutput.getResponseContext()
                 .getAdditionalContext().get("locked").toUpperCase()));
         }
-        RpcResult<CheckLockOutput> result = RpcResultBuilder.<CheckLockOutput>status(true)
-            .withResult(outputBuilder.build()).build();
+        RpcResult<CheckLockOutput> result = RpcResultBuilder.<CheckLockOutput>status(true).withResult(outputBuilder
+            .build()).build();
         return Futures.immediateFuture(result);
     }
 
@@ -1036,16 +1110,17 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<ConfigBackupOutput>> configBackup(ConfigBackupInput input) {
         logger.debug("Input received : " + input.toString());
         ConfigBackupOutputBuilder outputBuilder = new ConfigBackupOutputBuilder();
-        String action = Action.ConfigBackup.toString() ;
-        String rpcName = Action.ConfigBackup.name().toLowerCase();
+        Action myAction = Action.ConfigBackup;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
-                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
+                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -1065,8 +1140,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<ConfigBackupDeleteOutput>> configBackupDelete(ConfigBackupDeleteInput input) {
         logger.debug("Input received : " + input.toString());
         ConfigBackupDeleteOutputBuilder outputBuilder = new ConfigBackupDeleteOutputBuilder();
-        String action = Action.ConfigBackupDelete.toString() ;
-        String rpcName = Action.ConfigBackupDelete.name().toLowerCase();
+        Action myAction = Action.ConfigBackupDelete;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
@@ -1074,7 +1150,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -1094,8 +1170,9 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
     public Future<RpcResult<ConfigExportOutput>> configExport(ConfigExportInput input) {
         logger.debug("Input received : " + input.toString());
         ConfigExportOutputBuilder outputBuilder = new ConfigExportOutputBuilder();
-        String action = Action.ConfigExport.toString() ;
-        String rpcName = Action.ConfigExport.name().toLowerCase();
+        Action myAction = Action.ConfigExport;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
@@ -1103,7 +1180,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -1117,55 +1194,22 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         RpcResult<ConfigExportOutput> result = RpcResultBuilder.<ConfigExportOutput> status(true).withResult(outputBuilder.build()).build();
         return Futures.immediateFuture(result);
     }
-    @Override
-    public Future<RpcResult<StartApplicationOutput>> startApplication(StartApplicationInput input) {
-        logger.debug("Input received : " + input.toString());
 
-        StartApplicationOutputBuilder outputBuilder = new StartApplicationOutputBuilder();
-        String action = Action.StartApplication.toString() ;
-        String rpcName = Action.StartApplication.name().toLowerCase();
-        Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
-        if(null == status) {
-            try {
-                RequestHandlerInput request = new RequestInputBuilder().requestContext()
-                        .commonHeader(input.getCommonHeader())
-                        .actionIdentifiers(input.getActionIdentifiers())
-                        .payload(input.getPayload())
-                        .action(action)
-                        .rpcName(rpcName)
-                        .build();
 
-                status = buildStatusWithDispatcherOutput(executeRequest(request));
-                logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
-            } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
-
-                LoggingUtils.logErrorMessage(
-                        LoggingConstants.TargetNames.APPC_PROVIDER,
-                        String.format(COMMON_ERROR_MESSAGE_TEMPLATE, action, e.getMessage()),
-                        this.getClass().getName());
-
-            }
-        }
-        outputBuilder.setCommonHeader(input.getCommonHeader());
-        outputBuilder.setStatus(status);
-        RpcResult<StartApplicationOutput> result = RpcResultBuilder.<StartApplicationOutput> status(true).withResult(outputBuilder.build()).build();
-        return Futures.immediateFuture(result);
-    }
-    @Override
     public Future<RpcResult<StopApplicationOutput>> stopApplication(StopApplicationInput input){
         logger.debug("Input received : " + input.toString());
         StopApplicationOutputBuilder outputBuilder = new StopApplicationOutputBuilder();
-        String action = Action.StopApplication.toString() ;
-        String rpcName = Action.StopApplication.name().toLowerCase();
+        Action myAction = Action.StopApplication;
+        String action = myAction.toString() ;
+        String rpcName = getRpcName(myAction);
         Status status = ValidationService.getInstance().validateInput(input.getCommonHeader(), input.getAction(), action);
         if(null == status) {
             try {
-                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).payload(input.getPayload()).action(action).rpcName(rpcName).build();
+                RequestHandlerInput request = new RequestInputBuilder().requestContext().commonHeader(input.getCommonHeader()).actionIdentifiers(input.getActionIdentifiers()).action(action).rpcName(rpcName).build();
                 status = buildStatusWithDispatcherOutput(executeRequest(request));
                 logger.info(String.format("Execute of '%s' finished with status %s. Reason: %s", input.getActionIdentifiers(), status.getCode(), status.getMessage()));
             } catch (ParseException e) {
-                status = buildParsingErrorStatus(e);
+                status = buildStatusWithParseException(e);
 
                 LoggingUtils.logErrorMessage(
                         LoggingConstants.TargetNames.APPC_PROVIDER,
@@ -1180,29 +1224,7 @@ public class AppcProviderLcm implements AutoCloseable, AppcProviderLcmService {
         return Futures.immediateFuture(result);
     }
 
-    private String convertActionNameToUrl(String action) {
-        String regex = "([a-z])([A-Z]+)";
-        String replacement = "$1-$2";
-        return action.replaceAll(regex, replacement)
-                .toLowerCase();
-    }
-
     RequestHandlerOutput executeRequest(RequestHandlerInput request){
-        RequestHandler handler = getRequestHandler(request.getRequestContext().getActionLevel());
-        RequestHandlerOutput requestHandlerOutput;
-        if (handler != null) {
-            try {
-                requestHandlerOutput = handler.handleRequest(request);
-            } catch (Exception e) {
-                logger.info("UNEXPECTED FAILURE while executing " + request.getRequestContext().getAction().name());
-                requestHandlerOutput = createErrorRequestHandlerObj(request,
-                    LCMCommandStatus.UNEXPECTED_ERROR, Msg.EXCEPTION_CALLING_DG, e);
-            }
-        } else {
-            String errorMsg = "LCM request cannot be processed at the moment because APPC isn't running";
-            requestHandlerOutput = createErrorRequestHandlerObj(request,
-                LCMCommandStatus.REJECTED, Msg.REQUEST_HANDLER_UNAVAILABLE, new APPCException(errorMsg));
-        }
-        return requestHandlerOutput;
+        return new RequestExecutor().executeRequest(request);
     }
 }