Merging in bug fixes
[appc.git] / appc-dispatcher / appc-request-handler / appc-request-handler-core / src / main / java / org / openecomp / appc / requesthandler / impl / RequestHandlerImpl.java
index 07a4306..65761e1 100644 (file)
@@ -1,10 +1,11 @@
 /*-
  * ============LICENSE_START=======================================================
- * openECOMP : APP-C
+ * ONAP : APPC
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
- *                                             reserved.
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
  * ============LICENSE_END=========================================================
  */
 
 package org.openecomp.appc.requesthandler.impl;
 
-import org.apache.commons.lang.ObjectUtils;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.att.eelf.i18n.EELFResourceManager;
 import org.openecomp.appc.common.constant.Constants;
-import org.openecomp.appc.configuration.Configuration;
-import org.openecomp.appc.configuration.ConfigurationFactory;
-import org.openecomp.appc.domainmodel.lcm.*;
-import org.openecomp.appc.exceptions.APPCException;
-import org.openecomp.appc.executor.CommandExecutor;
+import org.openecomp.appc.domainmodel.lcm.RuntimeContext;
+import org.openecomp.appc.domainmodel.lcm.Status;
+import org.openecomp.appc.domainmodel.lcm.VNFOperation;
 import org.openecomp.appc.executor.UnstableVNFException;
 import org.openecomp.appc.executor.objects.LCMCommandStatus;
 import org.openecomp.appc.executor.objects.Params;
 import org.openecomp.appc.executor.objects.UniqueRequestIdentifier;
 import org.openecomp.appc.i18n.Msg;
-import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;
-import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;
 import org.openecomp.appc.lockmanager.api.LockException;
 import org.openecomp.appc.lockmanager.api.LockManager;
 import org.openecomp.appc.logging.LoggingConstants;
-import org.openecomp.appc.logging.LoggingUtils;
-import org.openecomp.appc.messageadapter.MessageAdapter;
-import org.openecomp.appc.messageadapter.impl.MessageAdapterDmaapImpl;
-import org.openecomp.appc.metricservice.MetricRegistry;
-import org.openecomp.appc.metricservice.MetricService;
-import org.openecomp.appc.metricservice.metric.DispatchingFuntionMetric;
-import org.openecomp.appc.metricservice.metric.Metric;
-import org.openecomp.appc.metricservice.metric.MetricType;
-import org.openecomp.appc.metricservice.policy.PublishingPolicy;
-import org.openecomp.appc.metricservice.publisher.LogPublisher;
-import org.openecomp.appc.requesthandler.RequestHandler;
-import org.openecomp.appc.requesthandler.exceptions.*;
-import org.openecomp.appc.requesthandler.helper.RequestRegistry;
-import org.openecomp.appc.requesthandler.helper.RequestValidator;
-import org.openecomp.appc.requesthandler.objects.RequestHandlerInput;
-import org.openecomp.appc.requesthandler.objects.RequestHandlerOutput;
-import org.openecomp.appc.transactionrecorder.TransactionRecorder;
-import org.openecomp.appc.transactionrecorder.objects.TransactionRecord;
 import org.openecomp.appc.workingstatemanager.WorkingStateManager;
 import org.openecomp.appc.workingstatemanager.objects.VNFWorkingState;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.att.eelf.i18n.EELFResourceManager;
-import org.openecomp.sdnc.sli.SvcLogicContext;
-import org.openecomp.sdnc.sli.SvcLogicException;
-import org.openecomp.sdnc.sli.SvcLogicResource.QueryStatus;
-import org.openecomp.sdnc.sli.aai.AAIService;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.ServiceReference;
-import org.slf4j.MDC;
-
-import static com.att.eelf.configuration.Configuration.*;
-
-import java.net.InetAddress;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
 
 /**
  * This class provides application logic for the Request/Response Handler Component.
  *
  */
-public class RequestHandlerImpl implements RequestHandler {
+public class RequestHandlerImpl extends AbstractRequestHandlerImpl {
 
     /**
      * APP-C VNF lock idle timeout in milliseconds. Applied only when locking VNF using northbound API "lock"
      */
     private static final String PROP_IDLE_TIMEOUT = "org.openecomp.appc.lock.idleTimeout";
 
-    private CommandExecutor commandExecutor;
-
-    private TransactionRecorder transactionRecorder;
-    private MessageAdapter messageAdapter;
-    private RequestValidator requestValidator;
-    private static MetricRegistry metricRegistry;
-    private boolean isMetricEnabled = false;
-    private RequestRegistry requestRegistry;
     private LockManager lockManager;
-    private WorkingStateManager workingStateManager;
-    private AAIService aaiService;
-
-    private static final EELFLogger logger = EELFManager.getInstance().getLogger(RequestHandlerImpl.class);
-
-    public void setAaiService(AAIService aaiService) {
-        this.aaiService = aaiService;
-    }
 
-    public void setTransactionRecorder(TransactionRecorder transactionRecorder) {
-        this.transactionRecorder = transactionRecorder;
-    }
+    private WorkingStateManager workingStateManager;
 
     public void setLockManager(LockManager lockManager) {
         this.lockManager = lockManager;
     }
 
-    public void setRequestValidator(RequestValidator requestValidator) {
-        this.requestValidator = requestValidator;
-    }
-
-    public void setMessageAdapter(MessageAdapter messageAdapter) {
-        this.messageAdapter = messageAdapter;
-    }
-
-    private static final Configuration configuration = ConfigurationFactory.getConfiguration();
-
     public void setWorkingStateManager(WorkingStateManager workingStateManager) {
         this.workingStateManager = workingStateManager;
     }
 
-    public RequestHandlerImpl() {
-        requestRegistry = new RequestRegistry();
-        messageAdapter = new MessageAdapterDmaapImpl();
-        messageAdapter.init();
-        Properties properties = configuration.getProperties();
-        if (properties != null && properties.getProperty("metric.enabled") != null) {
-            isMetricEnabled = Boolean.valueOf(properties.getProperty("metric.enabled"));
-        }
-        if (isMetricEnabled) {
-            initMetric();
-        }
-    }
-
-    public void setCommandExecutor(CommandExecutor commandExecutor) {
-        this.commandExecutor = commandExecutor;
-    }
-
-
-    /**
-     * It receives requests from the north-bound REST API (Communication) Layer and
-     * performs following validations.
-     * 1. VNF exists in A&AI for the given targetID (VnfID)
-     * 2. For the current VNF  Orchestration Status, the command can be executed
-     * 3. For the given VNF type and Operation, there exists work-flow definition in the APPC database
-     * If any of the validation fails, it returns appropriate response
-     *
-     * @param input RequestHandlerInput object which contains request header and  other request parameters like command , target Id , payload etc.
-     * @return response for request as enum with Return code and message.
-     */
-    @Override
-    public RequestHandlerOutput handleRequest(RequestHandlerInput input) {
-        if (logger.isTraceEnabled())
-            logger.trace("Entering to handleRequest with RequestHandlerInput = " + ObjectUtils.toString(input) + ")");
-        Params params = null;
-        String vnfId = null, vnfType = null, errorMessage = null;
-        Date startTime = new Date(System.currentTimeMillis());
-        RequestHandlerOutput output = null;
-        setInitialLogProperties(input.getRequestContext());
-
-        RuntimeContext runtimeContext = new RuntimeContext();
-        runtimeContext.setRequestContext(input.getRequestContext());
-        runtimeContext.setTimeStart(startTime);
-        runtimeContext.setRpcName(input.getRpcName());
-
-        final ResponseContext responseContext = new ResponseContext();
-        responseContext.setStatus(new Status(0, null));
-        responseContext.setAdditionalContext(new HashMap<String, String>(4));
-        responseContext.setCommonHeader(input.getRequestContext().getCommonHeader());
-        runtimeContext.setResponseContext(responseContext);
-        runtimeContext.getResponseContext().setStatus(new Status(0, null));
-
-        vnfId = runtimeContext.getRequestContext().getActionIdentifiers().getVnfId();
-
-        try {
-
-            requestValidator.validateRequest(runtimeContext);
-
-            handleRequest(runtimeContext);
-
-            final int statusCode = runtimeContext.getResponseContext().getStatus().getCode();
-            if (statusCode % 100 == 2 || statusCode % 100 == 3) {
-                createTransactionRecord(runtimeContext);
-            }
-            output = new RequestHandlerOutput();
-            output.setResponseContext(runtimeContext.getResponseContext());
-
-        } catch (VNFNotFoundException e) {
-            errorMessage = e.getMessage();
-            String logMessage = EELFResourceManager.format(Msg.APPC_NO_RESOURCE_FOUND, vnfId);
-            storeErrorMessageToLog(runtimeContext, LoggingConstants.TargetNames.AAI, "", logMessage);
-            params = new Params().addParam("vnfId", vnfId);
-            output = buildRequestHandlerOutput(LCMCommandStatus.VNF_NOT_FOUND, params);
-        } catch (NoTransitionDefinedException e) {
-            errorMessage = e.getMessage();
-            String logMessage = EELFResourceManager.format(Msg.VF_UNDEFINED_STATE, input.getRequestContext().getCommonHeader().getOriginatorId(), input.getRequestContext().getAction().name());
-            params = new Params().addParam("actionName", input.getRequestContext().getAction()).addParam("currentState", e.currentState);
-            output = buildRequestHandlerOutput(LCMCommandStatus.NO_TRANSITION_DEFINE, params);
-            storeErrorMessageToLog(runtimeContext,
-                    LoggingConstants.TargetNames.APPC,
-                    LoggingConstants.TargetNames.STATE_MACHINE,
-                    logMessage);
-        } catch (LifecycleException e) {
-            errorMessage = e.getMessage();
-            params = new Params().addParam("actionName", input.getRequestContext().getAction()).addParam("currentState", e.currentState);
-            output = buildRequestHandlerOutput(LCMCommandStatus.ACTION_NOT_SUPPORTED, params);
-        } catch (UnstableVNFException e) {
-            errorMessage = e.getMessage();
-            params = new Params().addParam("vnfId", vnfId);
-            output = buildRequestHandlerOutput(LCMCommandStatus.UNSTABLE_VNF, params);
-        } catch (WorkflowNotFoundException e) {
-            errorMessage = e.getMessage();
-            String vnfTypeVersion = e.vnfTypeVersion;
-            params = new Params().addParam("actionName", input.getRequestContext().getAction()).addParam("vnfTypeVersion", vnfTypeVersion);
-            output = buildRequestHandlerOutput(LCMCommandStatus.WORKFLOW_NOT_FOUND, params);
-        } catch (DGWorkflowNotFoundException e) {
-            errorMessage = e.getMessage();
-            String logMessage = EELFResourceManager.format(Msg.APPC_WORKFLOW_NOT_FOUND, vnfType, input.getRequestContext().getAction().name());
-            storeErrorMessageToLog(runtimeContext,
-                    LoggingConstants.TargetNames.APPC,
-                    LoggingConstants.TargetNames.WORKFLOW_MANAGER,
-                    logMessage);
-            params = new Params().addParam("actionName", input.getRequestContext().getAction().name())
-                    .addParam("dgModule", e.workflowModule).addParam("dgName", e.workflowName).addParam("dgVersion", e.workflowVersion);
-            output = buildRequestHandlerOutput(LCMCommandStatus.DG_WORKFLOW_NOT_FOUND, params);
-        } catch (RequestExpiredException e) {
-            errorMessage = e.getMessage();
-            params = new Params().addParam("actionName", input.getRequestContext().getAction().name());
-            output = buildRequestHandlerOutput(LCMCommandStatus.EXPIRED_REQUEST, params);
-        } catch (InvalidInputException e) {
-            errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
-            params = new Params().addParam("errorMsg", errorMessage);
-            output = buildRequestHandlerOutput(LCMCommandStatus.INVALID_INPUT_PARAMETER, params);
-        } catch (DuplicateRequestException e) {
-            errorMessage = e.getMessage();
-            output = buildRequestHandlerOutput(LCMCommandStatus.DUPLICATE_REQUEST, null);
-        } catch (Exception e) {
-            storeErrorMessageToLog(runtimeContext, "", "", "Exception = " + e.getMessage());
-            errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
-            params = new Params().addParam("errorMsg", errorMessage);
-            output = buildRequestHandlerOutput(LCMCommandStatus.UNEXPECTED_ERROR, params);
-        } finally {
-            try {
-                if (logger.isDebugEnabled() && errorMessage != null)
-                    logger.debug("error occurred in handleRequest " + errorMessage);
-                logger.debug("output.getResponse().getResponseCode().equals(LCMCommandStatus.ACCEPTED.getResponseCode():  " + (output.getResponseContext().getStatus().getCode() == LCMCommandStatus.ACCEPTED.getResponseCode()));
-                logger.debug("output.getResponse().getResponseCode().equals(LCMCommandStatus.SUCCESS.getResponseCode():  " + (output.getResponseContext().getStatus().getCode() == LCMCommandStatus.SUCCESS.getResponseCode()));
-
-                runtimeContext.setResponseContext(output.getResponseContext());
-                if ((null == output) || !(output.getResponseContext().getStatus().getCode() == LCMCommandStatus.ACCEPTED.getResponseCode())) {
-                    if (isMetricEnabled) {
-                        ((DispatchingFuntionMetric) metricRegistry.metric("DISPATCH_FUNCTION")).incrementRejectedRequest();
-                    }
-                    removeRequestFromRegistry(input.getRequestContext().getCommonHeader());
-                }
-            } finally {
-                storeAuditLogRecord(runtimeContext);
-                storeMetricLogRecord(runtimeContext);
-                clearRequestLogProperties();
-            }
-        }
-        if (logger.isTraceEnabled()) {
-            logger.trace("Exiting from handleRequest with (RequestHandlerOutput = " + ObjectUtils.toString(output.getResponseContext()) + ")");
-        }
-        return output;
-    }
-
-    private void storeErrorMessageToLog(RuntimeContext runtimeContext, String targetEntity, String targetServiceName, String additionalMessage) {
-        LoggingUtils.logErrorMessage(runtimeContext.getResponseContext().getStatus() != null ?
-                        String.valueOf(runtimeContext.getResponseContext().getStatus().getCode()) : "",
-                runtimeContext.getResponseContext().getStatus() != null ?
-                        String.valueOf(runtimeContext.getResponseContext().getStatus().getMessage()) : "",
-                targetEntity,
-                targetServiceName,
-                additionalMessage,
-                this.getClass().getCanonicalName());
-    }
-
-    private void createTransactionRecord(RuntimeContext runtimeContext) {
-        TransactionRecord transactionRecord = new TransactionRecord();
-        transactionRecord.setTimeStamp(runtimeContext.getResponseContext().getCommonHeader().getTimeStamp());
-        transactionRecord.setRequestID(runtimeContext.getResponseContext().getCommonHeader().getRequestId());
-        transactionRecord.setStartTime(runtimeContext.getTimeStart());
-        transactionRecord.setEndTime(new Date(System.currentTimeMillis()));
-        transactionRecord.setTargetID(runtimeContext.getVnfContext().getId());
-        transactionRecord.setTargetType(runtimeContext.getVnfContext().getType());
-        transactionRecord.setOperation(runtimeContext.getRequestContext().getAction().name());
-        transactionRecord.setResultCode(String.valueOf(runtimeContext.getResponseContext().getStatus().getCode()));
-        transactionRecord.setDescription(runtimeContext.getResponseContext().getStatus().getMessage());
-        transactionRecorder.store(transactionRecord);
-    }
+    private static final EELFLogger logger = EELFManager.getInstance().getLogger(RequestHandlerImpl.class);
 
-    private void handleRequest(RuntimeContext runtimeContext) {
+    protected void handleRequest(RuntimeContext runtimeContext) {
 
         switch (runtimeContext.getRequestContext().getAction()) {
             case Lock:
                 try {
                     lockWithTimeout(runtimeContext.getVnfContext().getId(), runtimeContext.getRequestContext().getCommonHeader().getRequestId());
-                    fillStatus(runtimeContext,LCMCommandStatus.SUCCESS, null);
+                    fillStatus(runtimeContext, LCMCommandStatus.SUCCESS, null);
                 } catch (LockException e) {
                     Params params = new Params().addParam("errorMsg", e.getMessage());
                     fillStatus(runtimeContext, LCMCommandStatus.LOCKING_FAILURE, params);
@@ -315,7 +82,6 @@ public class RequestHandlerImpl implements RequestHandler {
                             LoggingConstants.TargetNames.LOCK_MANAGER,
                             EELFResourceManager.format(Msg.VF_SERVER_BUSY, runtimeContext.getVnfContext().getId()));
                 }
-
                 break;
 
             case Unlock:
@@ -349,94 +115,23 @@ public class RequestHandlerImpl implements RequestHandler {
                         if (statusCode % 100 == 2 || statusCode % 100 == 3) {
                             try {
                                 releaseVNFLock(runtimeContext.getVnfContext().getId(), runtimeContext.getRequestContext().getCommonHeader().getRequestId());
-                                //TODO add logger call
                             } catch (LockException e) {
-                                //ignore
+                                logger.error("Error releasing the lock",e);
                             }
                         }
                     }
                 }
         }
-
     }
 
-    private void callWfOperation(RuntimeContext runtimeContext) {
-        int remainingTTL = calculateRemainingTTL(runtimeContext.getRequestContext().getCommonHeader());
-        if (remainingTTL > 0) {
-            if (logger.isDebugEnabled()) {
-                logger.debug("Calling command Executor with remaining TTL value: " + remainingTTL);
-            }
-
-            RuntimeContext commandExecutorInput = cloneContext(runtimeContext);
-
-            try {
-                commandExecutor.executeCommand(commandExecutorInput);
-                if(logger.isTraceEnabled()) {
-                    logger.trace("Command was added to queue successfully for vnfID = " + ObjectUtils.toString(runtimeContext.getRequestContext().getActionIdentifiers().getVnfId()));
-                }
-                fillStatus(runtimeContext, LCMCommandStatus.ACCEPTED, null);
-                if (isMetricEnabled) {
-                    ((DispatchingFuntionMetric) metricRegistry.metric("DISPATCH_FUNCTION")).incrementAcceptedRequest();
-                }
-            } catch (APPCException e) {
-                String errorMessage = e.getMessage() != null ? e.getMessage() : e.toString();
-                Params params = new Params().addParam("errorMsg", errorMessage);
-                fillStatus(runtimeContext, LCMCommandStatus.UNEXPECTED_ERROR, params);
-            }
-
-        } else {
-            fillStatus(runtimeContext, LCMCommandStatus.EXPIRED_REQUEST, null);
-            storeErrorMessageToLog(runtimeContext,
-                    LoggingConstants.TargetNames.APPC,
-                    LoggingConstants.TargetNames.REQUEST_HANDLER,
-                    EELFResourceManager.format(Msg.APPC_EXPIRED_REQUEST,
-                            runtimeContext.getRequestContext().getCommonHeader().getOriginatorId(),
-                            runtimeContext.getRequestContext().getActionIdentifiers().getVnfId(),
-                            String.valueOf(runtimeContext.getRequestContext().getCommonHeader().getFlags().getTtl())));
-        }
-    }
-
-    private void fillStatus(RuntimeContext runtimeContext, LCMCommandStatus lcmCommandStatus, Params params) {
-        runtimeContext.getResponseContext().setStatus(lcmCommandStatus.toStatus(params));
-    }
-
-    /*
-     * Workaround to clone context in order to prevent sharing of ResponseContext by two threads (one to set Accepted
-     * status code and other - depending on DG status). Other properties should not be a problem
-     */
-    private RuntimeContext cloneContext(RuntimeContext runtimeContext) {
-        RuntimeContext other = new RuntimeContext();
-        other.setRequestContext(runtimeContext.getRequestContext());
-        other.setResponseContext(new ResponseContext());
-        other.getResponseContext().setStatus(new Status(0, null));
-        other.getResponseContext().setCommonHeader(runtimeContext.getRequestContext().getCommonHeader());
-        other.setVnfContext(runtimeContext.getVnfContext());
-        other.setRpcName(runtimeContext.getRpcName());
-        other.setTimeStart(runtimeContext.getTimeStart());
-        other.setIsLockAcquired(runtimeContext.isLockAcquired());
-        return other;
-    }
-
-
-    private void clearRequestLogProperties() {
-        try {
-            MDC.remove(MDC_KEY_REQUEST_ID);
-            MDC.remove(MDC_SERVICE_INSTANCE_ID);
-            MDC.remove(MDC_SERVICE_NAME);
-            MDC.remove(LoggingConstants.MDCKeys.PARTNER_NAME);
-            MDC.remove(LoggingConstants.MDCKeys.TARGET_VIRTUAL_ENTITY);
-        } catch (Exception e) {
-
-        }
+    private void releaseVNFLock(String vnfId, String transactionId) throws LockException {
+        lockManager.releaseLock(vnfId, transactionId);
+        logger.info("Lock released for vnfID = " + vnfId);
     }
 
-    private void removeRequestFromRegistry(CommonHeader commonHeader) {
-        if (logger.isTraceEnabled())
-            logger.trace("Entering to removeRequestFromRegistry with RequestHeader = " + ObjectUtils.toString(commonHeader));
-        requestRegistry.removeRequest(
-                new UniqueRequestIdentifier(commonHeader.getOriginatorId(),
-                        commonHeader.getRequestId(),
-                        commonHeader.getSubRequestId()));
+    protected void lockWithTimeout(String vnfId, String requestId) throws LockException {
+        long timeout = configuration.getLongProperty(PROP_IDLE_TIMEOUT, Constants.DEFAULT_IDLE_TIMEOUT);
+        acquireVNFLock(vnfId, requestId, timeout);
     }
 
     private boolean acquireVNFLock(String vnfID, String requestId, long timeout) throws LockException {
@@ -451,172 +146,54 @@ public class RequestHandlerImpl implements RequestHandler {
         return lockAcquired;
     }
 
-    private void lockWithTimeout(String vnfId, String requestId) throws LockException {
-        long timeout = configuration.getLongProperty(PROP_IDLE_TIMEOUT, Constants.DEFAULT_IDLE_TIMEOUT);
-        acquireVNFLock(vnfId, requestId, timeout);
-    }
-
-    private void resetLock(String vnfId, String requestId, boolean lockAcquired, boolean resetLockTimeout) {
-        if (lockAcquired) {
-            try {
-                releaseVNFLock(vnfId, requestId);
-            } catch (LockException e) {
-                logger.error("Unlock VNF [" + vnfId + "] failed. Request id: [" + requestId + "]", e);
-
-
-            }
-        } else if (resetLockTimeout) {
-            try {
-                // reset timeout to previous value
-                lockWithTimeout(vnfId, requestId);
-            } catch (LockException e) {
-                logger.error("Reset lock idle timeout for VNF [" + vnfId + "] failed. Request id: [" + requestId + "]", e);
-            }
-        }
-    }
-
-    private void releaseVNFLock(String vnfId, String transactionId) throws LockException {
-        lockManager.releaseLock(vnfId, transactionId);
-        logger.info("Lock released for vnfID = " + vnfId);
-    }
-
-    private void setInitialLogProperties(RequestContext requestContext) {
-
-        try {
-            MDC.put(MDC_KEY_REQUEST_ID, requestContext.getCommonHeader().getRequestId());
-            if (requestContext.getActionIdentifiers().getServiceInstanceId() != null) {
-                MDC.put(MDC_SERVICE_INSTANCE_ID, requestContext.getActionIdentifiers().getServiceInstanceId());
-            }
-            MDC.put(LoggingConstants.MDCKeys.PARTNER_NAME, requestContext.getCommonHeader().getOriginatorId());
-            MDC.put(MDC_INSTANCE_UUID, ""); // value should be created in the future
-            try {
-                MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getCanonicalHostName()); //Don't change it to a .getHostName() again please. It's wrong!
-                MDC.put(MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress());
-                MDC.put(LoggingConstants.MDCKeys.SERVER_NAME, InetAddress.getLocalHost().getHostName());
-                MDC.put(MDC_SERVICE_NAME, requestContext.getAction().name());
-                MDC.put(LoggingConstants.MDCKeys.TARGET_VIRTUAL_ENTITY, requestContext.getActionIdentifiers().getVnfId());
-
-            } catch (Exception e) {
-                logger.debug(e.getMessage());
-            }
-        } catch (RuntimeException e) {
-            //ignore
-        }
-    }
-
-
-    private int calculateRemainingTTL(CommonHeader commonHeader) {
-        if (logger.isTraceEnabled()) {
-            logger.trace("Entering to calculateRemainingTTL with RequestHeader = " + ObjectUtils.toString(commonHeader));
-        }
-        long usedTimeInMillis = (System.currentTimeMillis() - commonHeader.getTimeStamp().getTime());
-        logger.debug("usedTimeInMillis = " + usedTimeInMillis);
-        int usedTimeInSeconds = Math.round(usedTimeInMillis / 1000);
-        logger.debug("usedTimeInSeconds = " + usedTimeInSeconds);
-        Integer inputTTL = this.getInputTTL(commonHeader);
-        logger.debug("inputTTL = " + inputTTL);
-        Integer remainingTTL = inputTTL - usedTimeInSeconds;
-        logger.debug("Remaining TTL = " + remainingTTL);
-        if (logger.isTraceEnabled())
-            logger.trace("Exiting from calculateRemainingTTL with (remainingTTL = " + ObjectUtils.toString(remainingTTL) + ")");
-        return remainingTTL;
-    }
-
-    private Integer getInputTTL(CommonHeader header) {
-        if (logger.isTraceEnabled())
-            logger.trace("Entering in getInputTTL with RequestHeader = " + ObjectUtils.toString(header));
-        if (!isValidTTL(String.valueOf(header.getFlags().getTtl()))) {
-            String defaultTTLStr = configuration.getProperty("org.openecomp.appc.workflow.default.ttl", String.valueOf(Constants.DEFAULT_TTL));
-            Integer defaultTTL = Integer.parseInt(defaultTTLStr);
-            if (logger.isTraceEnabled())
-                logger.trace("Exiting from getInputTTL with (defaultTTL = " + ObjectUtils.toString(defaultTTL) + ")");
-            return defaultTTL;
-        }
-        if (logger.isTraceEnabled())
-            logger.trace("Exiting from getInputTTL with (inputTTL = " + ObjectUtils.toString(header.getFlags().getTtl()) + ")");
-
-        return header.getFlags().getTtl();
-    }
-
-    private boolean isValidTTL(String ttl) {
-        if (ttl == null || ttl.length() == 0) {
-            if (logger.isTraceEnabled())
-                logger.trace("Exiting from getInputTTL with (result = false)");
-            return false;
-        }
-        try {
-            Integer i = Integer.parseInt(ttl);
-            return (i > 0);
-        } catch (NumberFormatException e) {
-            if (logger.isTraceEnabled())
-                logger.trace("Exiting from getInputTTL with (result = false)");
-            return false;
-        }
-    }
-
-    private Boolean isLoggingEnabled() {
-        String defaultFlagStr = configuration.getProperty("org.openecomp.appc.localTransactionRecorder.enable", String.valueOf(Constants.DEFAULT_LOGGING_FLAG));
-        Boolean defaultFlag = Boolean.parseBoolean(defaultFlagStr);
-        return defaultFlag;
-    }
-
-    private static RequestHandlerOutput buildRequestHandlerOutput(LCMCommandStatus response, Params params) {
-        RequestHandlerOutput output = new RequestHandlerOutput();
-        ResponseContext responseContext = new ResponseContext();
-        responseContext.setStatus(response.toStatus(params));
-        output.setResponseContext(responseContext);
-        return output;
-    }
-
     /**
      * This method perform operations required before execution of workflow starts. It retrieves next state for current operation from Lifecycle manager and update it in AAI.
      *
-     * @return true in case AAI updates are successful. false for any error or exception.
+     * @param vnfId String of VNF ID
+     * @param readOnlyActivity boolean indicator
+     * @param  requestIdentifierString - string contains id uniquely represents the request
+     * @param forceFlag boolean indicator
+     * @throws UnstableVNFException when failed
      */
     @Override
     public void onRequestExecutionStart(String vnfId, boolean readOnlyActivity, String requestIdentifierString, boolean forceFlag) throws UnstableVNFException {
         if (logger.isTraceEnabled()) {
             logger.trace("Entering to onRequestExecutionStart with vnfId = " + vnfId + "and requestIdentifierString = " + requestIdentifierString);
         }
-        try {
-            boolean updated = workingStateManager.setWorkingState(vnfId, VNFWorkingState.UNSTABLE, requestIdentifierString, forceFlag);
+
+        if(!readOnlyActivity || !forceFlag || workingStateManager.isVNFStable(vnfId)) {
+            boolean updated = false;
+            try {
+                updated = workingStateManager.setWorkingState(vnfId, VNFWorkingState.UNSTABLE, requestIdentifierString, forceFlag);
+            }  catch (Exception e) {
+                logger.error("Error updating working state for vnf " + vnfId + e);
+                throw new RuntimeException(e);
+            }
             if (!updated) {
                 throw new UnstableVNFException("VNF is not stable for vnfID = " + vnfId);
             }
-        } catch (Exception e) {
-            logger.error("Error updating working state for vnf " + vnfId + e);
-            throw new RuntimeException(e);
         }
 
         if (logger.isTraceEnabled())
             logger.trace("Exiting from onRequestExecutionStart ");
     }
 
-    /**
-     * This method perform following operations required after execution of workflow.
-     * It posts asynchronous response to message bus (DMaaP).
-     * Unlock VNF Id
-     * Removes request from request registry.
-     * Generate audit logs.
-     * Adds transaction record to database id if transaction logging is enabled.
-     *
-     * @param isAAIUpdated boolean flag which indicate AAI upodate status after request completion.
-     */
-    @Override
-    public void onRequestExecutionEnd(RuntimeContext runtimeContext, boolean isAAIUpdated) {
-        if (logger.isTraceEnabled()) {
-            logger.trace("Entering to onRequestExecutionEnd with runtimeContext = " + ObjectUtils.toString(runtimeContext));
+    private boolean isReadOnlyAction(VNFOperation action) {
+        if (VNFOperation.Sync.toString().equals(action) ||
+                VNFOperation.Audit.toString().equals(action) ||
+                VNFOperation.ConfigBackup.toString().equals(action) ||
+                VNFOperation.ConfigBackupDelete.toString().equals(action) ||
+                VNFOperation.ConfigExport.toString().equals(action)){
+            return true;
         }
+        return false;
+    }
 
-        postMessageToDMaaP(runtimeContext.getRequestContext().getAction(), runtimeContext.getRpcName(), runtimeContext.getResponseContext());
-        requestRegistry.removeRequest(
-                new UniqueRequestIdentifier(runtimeContext.getResponseContext().getCommonHeader().getOriginatorId(),
-                        runtimeContext.getResponseContext().getCommonHeader().getRequestId(),
-                        runtimeContext.getResponseContext().getCommonHeader().getSubRequestId()));
-        resetLock(runtimeContext.getVnfContext().getId(), runtimeContext.getResponseContext().getCommonHeader().getRequestId(), runtimeContext.isLockAcquired(), true);
-        Status status = runtimeContext.getResponseContext().getStatus();
-
+    @Override
+    public void onRequestExecutionEnd(RuntimeContext runtimeContext, boolean isAAIUpdated) {
+        super.onRequestExecutionEnd(runtimeContext,isAAIUpdated);
         VNFWorkingState workingState;
+        Status status = runtimeContext.getResponseContext().getStatus();
         if (status.getCode() == LCMCommandStatus.SUCCESS.getResponseCode() || isReadOnlyAction(runtimeContext.getRequestContext().getAction())) {
             workingState = VNFWorkingState.STABLE;
         } else {
@@ -629,202 +206,30 @@ public class RequestHandlerImpl implements RequestHandler {
 
         String requestIdentifierString = requestIdentifier.toIdentifierString();
         workingStateManager.setWorkingState(runtimeContext.getVnfContext().getId(), workingState, requestIdentifierString, false);
-
-
-        storeAuditLogRecord(runtimeContext);
-
-        if (isLoggingEnabled()) {
-            createTransactionRecord(runtimeContext);
-        }
-    }
-
-    private void storeAuditLogRecord(RuntimeContext runtimeContext) {
-        LoggingUtils.logAuditMessage(runtimeContext.getTimeStart(),
-                new Date(System.currentTimeMillis()),
-                String.valueOf(runtimeContext.getResponseContext().getStatus().getCode()),
-                runtimeContext.getResponseContext().getStatus().getMessage(),
-                this.getClass().getCanonicalName());
-    }
-
-    private void storeMetricLogRecord(RuntimeContext runtimeContext) {
-        LoggingUtils.logMetricsMessage(runtimeContext.getTimeStart(),
-                new Date(System.currentTimeMillis()),
-                LoggingConstants.TargetNames.APPC,
-                runtimeContext.getRequestContext().getAction().name(),
-                runtimeContext.getResponseContext().getStatus().getCode() == LCMCommandStatus.ACCEPTED.getResponseCode() ? LoggingConstants.StatusCodes.COMPLETE : LoggingConstants.StatusCodes.ERROR,
-                String.valueOf(runtimeContext.getResponseContext().getStatus().getCode()),
-                runtimeContext.getResponseContext().getStatus().getMessage(),
-                this.getClass().getCanonicalName());
-    }
-
-    private boolean isReadOnlyAction(VNFOperation action) {
-        return VNFOperation.Sync == action
-                || VNFOperation.Audit == action;
-    }
-
-
-    //returns null if asyncResponse was not modified otherwise reutrns the updated asyncResponse
-    private void postMessageToDMaaP(VNFOperation operation, String rpcName, ResponseContext responseContext/*, boolean isTTLEnd, boolean aaiUpdateSuccess*/) {
-        if (logger.isTraceEnabled()) {
-            logger.trace("Entering to postMessageToDMaaP with AsyncResponse = " + ObjectUtils.toString(responseContext));
-        }
-        /*boolean updated = updateAsyncResponseStatus(responseContext, isTTLEnd, aaiUpdateSuccess);
-         */
-        boolean callbackResponse = messageAdapter.post(operation, rpcName, responseContext);
-        if (!callbackResponse) {
-            logger.error("DMaaP posting status: " + callbackResponse, "dmaapMessage: " + responseContext);
-        }
-        if (logger.isTraceEnabled())
-            logger.trace("Exiting from postMessageToDMaaP with (callbackResponse = " + ObjectUtils.toString(callbackResponse) + ")");
-    }
-
-    //returns true if asyncResponse was modified
-    /*    private boolean updateAsyncResponseStatus(ResponseContext asyncResponse, boolean isTTLEnd, boolean aaiUpdateSuccess) {
-        boolean updated = false;
-        if (logger.isTraceEnabled())
-            logger.trace("Entering to updateAsyncResponseStatus with AsyncResponse = "+ObjectUtils.toString(asyncResponse)+ ", isTTLEnd = "+ ObjectUtils.toString(isTTLEnd)+ ", aaiUpdateSuccess = "+ ObjectUtils.toString(aaiUpdateSuccess));
-        if(!aaiUpdateSuccess){
-                if (asyncResponse.getStatus().getCode() == 0 || asyncResponse.getStatus().getCode() == LCMCommandStatus.SUCCESS.getResponseCode()) {
-                    asyncResponse.getStatus().setCode(LCMCommandStatus.UPDATE_AAI_FAILURE.getResponseCode());
-                    asyncResponse.getStatus().setMessage(LCMCommandStatus.UPDATE_AAI_FAILURE.getResponseMessage());
-                updated = true;
-            }
-        }else if(isTTLEnd){
-                asyncResponse.getStatus().setCode(LCMCommandStatus.EXPIRED_REQUEST_FAILURE.getResponseCode());
-                asyncResponse.getStatus().setMessage(LCMCommandStatus.EXPIRED_REQUEST_FAILURE.getResponseMessage());
-            updated = true;
-        }
-        if (logger.isTraceEnabled())
-            logger.trace("Exiting from updateAsyncResponseStatus with (asyncResponse = "+ ObjectUtils.toString(asyncResponse)+")");
-        return updated;
-    }*/
-
-
-    /**
-     * This method perform following operations required if TTL ends when request still waiting in execution queue .
-     * It posts asynchronous response to message bus (DMaaP).
-     * Unlock VNF Id
-     * Removes request from request registry.
-     *
-     * @param runtimeContext AsyncResponse object which contains VNF Id        , timestamp , apiVersion, responseId, executionSuccess, payload, isExpired, action, startTime, vnfType, originatorId, subResponseId;
-     * @param updateAAI      boolean flag which indicate AAI upodate status after request completion.
-     */
-    @Override
-    public void onRequestTTLEnd(RuntimeContext runtimeContext, boolean updateAAI) {
-        if (logger.isTraceEnabled()) {
-            logger.trace("Entering to onRequestTTLEnd with " +
-                    "AsyncResponse = " + ObjectUtils.toString(runtimeContext) +
-                    ", updateAAI = " + ObjectUtils.toString(updateAAI));
-        }
-        logger.error(LCMCommandStatus.EXPIRED_REQUEST_FAILURE.getResponseMessage());
-        fillStatus(runtimeContext, LCMCommandStatus.EXPIRED_REQUEST_FAILURE, null);
-        postMessageToDMaaP(runtimeContext.getRequestContext().getAction(), runtimeContext.getRpcName(), runtimeContext.getResponseContext());
+        logger.debug("Reset lock for vnfId " + runtimeContext.getVnfContext().getId());
         resetLock(runtimeContext.getVnfContext().getId(), runtimeContext.getResponseContext().getCommonHeader().getRequestId(), runtimeContext.isLockAcquired(), true);
-        requestRegistry.removeRequest(
-                new UniqueRequestIdentifier(runtimeContext.getResponseContext().getCommonHeader().getOriginatorId(),
-                        runtimeContext.getResponseContext().getCommonHeader().getRequestId(),
-                        runtimeContext.getResponseContext().getCommonHeader().getSubRequestId()));
-    }
-
-    private SvcLogicContext getVnfdata(String vnf_id, String prefix, SvcLogicContext ctx) throws VNFNotFoundException {
-        String key = "vnf-id = '" + vnf_id + "'";
-        if (logger.isTraceEnabled()) {
-            logger.trace("Entering to getVnfdata with " +
-                    "vnfId = " + vnf_id +
-                    ", prefix = " + prefix +
-                    ", SvcLogicContex = " + ObjectUtils.toString(ctx));
-        }
-        try {
-            QueryStatus response = aaiService.query("generic-vnf", false, null, key, prefix, null, ctx);
-            if (QueryStatus.NOT_FOUND.equals(response)) {
-                throw new VNFNotFoundException("VNF not found for vnf_id = " + vnf_id);
-            } else if (QueryStatus.FAILURE.equals(response)) {
-                throw new RuntimeException("Error Querying AAI with vnfID = " + vnf_id);
-            }
-            logger.info("AAIResponse: " + response.toString());
-        } catch (SvcLogicException e) {
-            logger.error("Error in getVnfdata " + e);
-            throw new RuntimeException(e);
-        }
-        if (logger.isTraceEnabled()) {
-            logger.trace("Exiting from getVnfdata with (SvcLogicContext = " + ObjectUtils.toString(ctx) + ")");
-        }
-        return ctx;
     }
 
-    private boolean postVnfdata(String vnf_id, String status, String prefix, SvcLogicContext ctx) throws VNFNotFoundException {
-        if (logger.isTraceEnabled()) {
-            logger.trace("Entering to postVnfdata with " +
-                    "vnfId = " + vnf_id +
-                    ", status = " + status +
-                    ", prefix = " + prefix +
-                    ", SvcLogicContext = " + ObjectUtils.toString(ctx));
-        }
-        String key = "vnf-id = '" + vnf_id + "'";
-        Map<String, String> data = new HashMap<>();
-        data.put("orchestration-status", status);
-        try {
-            QueryStatus response = aaiService.update("generic-vnf", key, data, prefix, ctx);
-            if (QueryStatus.NOT_FOUND.equals(response)) {
-                throw new VNFNotFoundException("VNF not found for vnf_id = " + vnf_id);
+    private void resetLock(String vnfId, String requestId, boolean lockAcquired, boolean resetLockTimeout) {
+        if (lockAcquired) {
+            try {
+                releaseVNFLock(vnfId, requestId);
+            } catch (LockException e) {
+                logger.error("Unlock VNF [" + vnfId + "] failed. Request id: [" + requestId + "]", e);
             }
-            logger.info("AAIResponse: " + response.toString());
-            if (response.toString().equals("SUCCESS")) {
-                if (logger.isTraceEnabled()) {
-                    logger.trace("Exiting from postVnfdata with (Result = " + ObjectUtils.toString(true) + ")");
-                }
-                return true;
+        } else if (resetLockTimeout) {
+            try {
+                // reset timeout to previous value
+                lockWithTimeout(vnfId, requestId);
+            } catch (LockException e) {
+                logger.error("Reset lock idle timeout for VNF [" + vnfId + "] failed. Request id: [" + requestId + "]", e);
             }
-
-        } catch (SvcLogicException e) {
-            logger.error("Error in postVnfdata " + e);
-            throw new RuntimeException(e);
-        }
-        if (logger.isTraceEnabled()) {
-            logger.trace("Exiting from postVnfdata with (Result = " + ObjectUtils.toString(false) + ")");
-        }
-        return false;
-    }
-
-    private void initMetric() {
-        if (logger.isDebugEnabled())
-            logger.debug("Metric getting initialized");
-        MetricService metricService = getMetricservice();
-        metricRegistry = metricService.createRegistry("APPC");
-        DispatchingFuntionMetric dispatchingFuntionMetric = metricRegistry.metricBuilderFactory().
-                dispatchingFunctionCounterBuilder().
-                withName("DISPATCH_FUNCTION").withType(MetricType.COUNTER).
-                withAcceptRequestValue(0)
-                .withRejectRequestValue(0)
-                .build();
-        if (metricRegistry.register(dispatchingFuntionMetric)) {
-            Metric[] metrics = new Metric[]{dispatchingFuntionMetric};
-            LogPublisher logPublisher = new LogPublisher(metricRegistry, metrics);
-            LogPublisher[] logPublishers = new LogPublisher[1];
-            logPublishers[0] = logPublisher;
-            PublishingPolicy manuallyScheduledPublishingPolicy = metricRegistry.policyBuilderFactory().
-                    scheduledPolicyBuilder().withPublishers(logPublishers).
-                    withMetrics(metrics).
-                    build();
-            if (logger.isDebugEnabled())
-                logger.debug("Policy getting initialized");
-            manuallyScheduledPublishingPolicy.init();
-            if (logger.isDebugEnabled())
-                logger.debug("Metric initialized");
         }
     }
 
-
-    private MetricService getMetricservice() {
-        BundleContext bctx = FrameworkUtil.getBundle(MetricService.class).getBundleContext();
-        ServiceReference sref = bctx.getServiceReference(MetricService.class.getName());
-        if (sref != null) {
-            logger.info("Metric Service from bundlecontext");
-            return (MetricService) bctx.getService(sref);
-        } else {
-            logger.info("Metric Service error from bundlecontext");
-            logger.warn("Cannot find service reference for org.openecomp.appc.metricservice.MetricService");
-            return null;
-        }
+    @Override
+    public void onRequestTTLEnd(RuntimeContext runtimeContext, boolean updateAAI) {
+        super.onRequestTTLEnd(runtimeContext,updateAAI);
+        resetLock(runtimeContext.getVnfContext().getId(), runtimeContext.getResponseContext().getCommonHeader().getRequestId(), runtimeContext.isLockAcquired(), true);
     }
 }