You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2017/05/31 20:12:55 UTC

[24/50] [abbrv] ambari git commit: AMBARI-21047 - Iterative Fixes For Patch/Service Upgrade Development (jonathanhurley)

AMBARI-21047 - Iterative Fixes For Patch/Service Upgrade Development (jonathanhurley)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/c4132783
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/c4132783
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/c4132783

Branch: refs/heads/trunk
Commit: c4132783225b541f0425526f7d1edaa822553229
Parents: 1427d81
Author: Jonathan Hurley <jh...@hortonworks.com>
Authored: Wed May 17 13:46:08 2017 -0400
Committer: Jonathan Hurley <jh...@hortonworks.com>
Committed: Thu May 18 09:45:03 2017 -0400

----------------------------------------------------------------------
 .../libraries/functions/decorator.py            |  22 +-
 .../upgrades/upgrade_nonrolling_new_stack.xml   |   2 +-
 .../actionmanager/ExecutionCommandWrapper.java  |  46 +++--
 .../AmbariManagementControllerImpl.java         |   2 +-
 .../ClusterStackVersionResourceProvider.java    |   6 +-
 .../internal/UpgradeResourceProvider.java       | 141 +++++++------
 .../upgrades/AbstractUpgradeServerAction.java   |   4 -
 .../upgrades/FinalizeUpgradeAction.java         |   3 +-
 .../upgrades/UpdateDesiredStackAction.java      |  19 --
 .../org/apache/ambari/server/state/Cluster.java |   7 -
 .../ambari/server/state/UpgradeContext.java     | 206 +++++++++----------
 .../server/state/cluster/ClusterImpl.java       |  15 --
 .../custom_actions/scripts/ru_set_all.py        |  49 +----
 .../AmbariManagementControllerImplTest.java     |   2 +-
 .../ComponentVersionCheckActionTest.java        |   6 -
 .../upgrades/UpgradeActionTest.java             |  22 +-
 .../stack/upgrade/StageWrapperBuilderTest.java  |   2 +-
 .../server/upgrade/UpgradeCatalog200Test.java   |   2 +-
 .../server/upgrade/UpgradeCatalog210Test.java   |   7 +
 .../server/upgrade/UpgradeCatalogHelper.java    |   5 +-
 .../python/custom_actions/test_ru_set_all.py    | 124 +----------
 .../src/test/python/stacks/utils/RMFTestCase.py |  12 +-
 .../upgrades/upgrade_nonrolling_new_stack.xml   |   2 +-
 23 files changed, 248 insertions(+), 458 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-common/src/main/python/resource_management/libraries/functions/decorator.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/decorator.py b/ambari-common/src/main/python/resource_management/libraries/functions/decorator.py
index b5b804d..9446d56 100644
--- a/ambari-common/src/main/python/resource_management/libraries/functions/decorator.py
+++ b/ambari-common/src/main/python/resource_management/libraries/functions/decorator.py
@@ -21,7 +21,7 @@ Ambari Agent
 """
 
 import time
-__all__ = ['retry', 'safe_retry', ]
+__all__ = ['retry', 'safe_retry', 'experimental' ]
 
 from resource_management.core.logger import Logger
 
@@ -107,3 +107,23 @@ def safe_retry(times=3, sleep_time=1, max_sleep_time=8, backoff_factor=1, err_cl
 
     return wrapper
   return decorator
+
+
+def experimental(feature=None, comment=None, disable=False):
+  """
+  Annotates a function as being experiemental, optionally logging a comment.
+  :param feature:  the feature area that is experimental
+  :param comment:  the comment to log
+  :param disable  True to skip invocation of the method entirely, defaults to False.
+  :return: 
+  """
+  def decorator(function):
+    def wrapper(*args, **kwargs):
+      if comment:
+        Logger.info(comment)
+
+      if not disable:
+        return function(*args, **kwargs)
+    return wrapper
+  return decorator
+

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-funtest/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml b/ambari-funtest/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml
index ad6174c..d0f3e16 100644
--- a/ambari-funtest/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml
+++ b/ambari-funtest/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml
@@ -231,7 +231,7 @@
       <execute-stage title="Restore configuration directories and remove HDP 2.3 symlinks">
         <task xsi:type="execute">
           <script>scripts/ru_set_all.py</script>
-          <function>unlink_all_configs</function>
+          <function>foo_function</function>
         </task>
       </execute-stage>
     </group>

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
index f680c09..2ec09d9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
@@ -23,6 +23,7 @@ import java.util.TreeMap;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ClusterNotFoundException;
+import org.apache.ambari.server.ServiceNotFoundException;
 import org.apache.ambari.server.agent.AgentCommand.AgentCommandType;
 import org.apache.ambari.server.agent.ExecutionCommand;
 import org.apache.ambari.server.agent.ExecutionCommand.KeyNames;
@@ -184,30 +185,39 @@ public class ExecutionCommandWrapper {
 
         // set the repository version for the component this command is for -
         // always use the current desired version
-        RepositoryVersionEntity repositoryVersion = null;
-        String serviceName = executionCommand.getServiceName();
-        if (!StringUtils.isEmpty(serviceName)) {
-          Service service = cluster.getService(serviceName);
-          if (null != service) {
-            repositoryVersion = service.getDesiredRepositoryVersion();
-          }
+        try {
+          RepositoryVersionEntity repositoryVersion = null;
+          String serviceName = executionCommand.getServiceName();
+          if (!StringUtils.isEmpty(serviceName)) {
+            Service service = cluster.getService(serviceName);
+            if (null != service) {
+              repositoryVersion = service.getDesiredRepositoryVersion();
+            }
 
-          String componentName = executionCommand.getComponentName();
-          if (!StringUtils.isEmpty(componentName)) {
-            ServiceComponent serviceComponent = service.getServiceComponent(
-                executionCommand.getComponentName());
+            String componentName = executionCommand.getComponentName();
+            if (!StringUtils.isEmpty(componentName)) {
+              ServiceComponent serviceComponent = service.getServiceComponent(
+                  executionCommand.getComponentName());
 
-            if (null != serviceComponent) {
-              repositoryVersion = serviceComponent.getDesiredRepositoryVersion();
+              if (null != serviceComponent) {
+                repositoryVersion = serviceComponent.getDesiredRepositoryVersion();
+              }
             }
           }
-        }
 
-        if (null != repositoryVersion) {
-          executionCommand.getCommandParams().put(KeyNames.VERSION, repositoryVersion.getVersion());
-          executionCommand.getHostLevelParams().put(KeyNames.CURRENT_VERSION, repositoryVersion.getVersion());
+          if (null != repositoryVersion) {
+            executionCommand.getCommandParams().put(KeyNames.VERSION,
+                repositoryVersion.getVersion());
+            executionCommand.getHostLevelParams().put(KeyNames.CURRENT_VERSION,
+                repositoryVersion.getVersion());
+          }
+        } catch (ServiceNotFoundException serviceNotFoundException) {
+          // it's possible that there are commands specified for a service where
+          // the service doesn't exist yet
+          LOG.warn(
+              "The service {} is not installed in the cluster. No repository version will be sent for this command.",
+              executionCommand.getServiceName());
         }
-
       }
     } catch (ClusterNotFoundException cnfe) {
       // it's possible that there are commands without clusters; in such cases,

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index a4f59a5..e373f81 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -3991,7 +3991,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
     RepositoryVersionEntity desiredRepositoryVersion = null;
 
     RequestOperationLevel operationLevel = actionExecContext.getOperationLevel();
-    if (null != operationLevel) {
+    if (null != operationLevel && null != operationLevel.getServiceName()) {
       Service service = cluster.getService(operationLevel.getServiceName());
       if (null != service) {
         desiredRepositoryVersion = service.getDesiredRepositoryVersion();

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
index 9ca8ddc..6447888 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
@@ -55,7 +55,6 @@ import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
-import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
 import org.apache.ambari.server.orm.dao.HostVersionDAO;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.entities.HostVersionEntity;
@@ -169,9 +168,6 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
   private static Configuration configuration;
 
   @Inject
-  private static HostComponentStateDAO hostComponentStateDAO;
-
-  @Inject
   private static RepositoryVersionHelper repoVersionHelper;
 
 
@@ -222,7 +218,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
       requestedEntities.add(id);
     } else {
       cluster.getCurrentStackVersion();
-      List<RepositoryVersionEntity> entities = repositoryVersionDAO.findByStack(cluster.getCurrentStackVersion());
+      List<RepositoryVersionEntity> entities = repositoryVersionDAO.findAll();
 
       for (RepositoryVersionEntity entity : entities) {
         requestedEntities.add(entity.getId());

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
index c3691bf..6027ce7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
@@ -80,7 +80,6 @@ import org.apache.ambari.server.security.authorization.AuthorizationException;
 import org.apache.ambari.server.security.authorization.AuthorizationHelper;
 import org.apache.ambari.server.security.authorization.ResourceType;
 import org.apache.ambari.server.security.authorization.RoleAuthorization;
-import org.apache.ambari.server.serveraction.upgrades.UpdateDesiredStackAction;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
@@ -105,6 +104,7 @@ import org.apache.ambari.server.state.stack.upgrade.ServerSideActionTask;
 import org.apache.ambari.server.state.stack.upgrade.StageWrapper;
 import org.apache.ambari.server.state.stack.upgrade.Task;
 import org.apache.ambari.server.state.stack.upgrade.TaskWrapper;
+import org.apache.ambari.server.state.stack.upgrade.UpdateStackGrouping;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.ambari.server.state.svccomphost.ServiceComponentHostServerActionEvent;
 import org.apache.commons.collections.CollectionUtils;
@@ -144,17 +144,6 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
   public static final String UPGRADE_FAIL_ON_CHECK_WARNINGS = "Upgrade/fail_on_check_warnings";
 
   /**
-   * Names that appear in the Upgrade Packs that are used by
-   * {@link org.apache.ambari.server.state.cluster.ClusterImpl#isNonRollingUpgradePastUpgradingStack}
-   * to determine if an upgrade has already changed the version to use.
-   * For this reason, DO NOT CHANGE the name of these since they represent historic values.
-   */
-  public static final String CONST_UPGRADE_GROUP_NAME = "UPDATE_DESIRED_STACK_ID";
-  public static final String CONST_UPGRADE_ITEM_TEXT = "Update Target Stack";
-  public static final String CONST_CUSTOM_COMMAND_NAME = UpdateDesiredStackAction.class.getName();
-
-
-  /**
    * Skip slave/client component failures if the tasks are skippable.
    */
   public static final String UPGRADE_SKIP_FAILURES = "Upgrade/skip_failures";
@@ -208,11 +197,6 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
 
   private static final Set<String> PROPERTY_IDS = new HashSet<>();
 
-  /**
-   * The list of supported services put on a command.
-   */
-  public static final String COMMAND_PARAM_SUPPORTED_SERVICES = "supported_services";
-
   private static final String DEFAULT_REASON_TEMPLATE = "Aborting upgrade %s";
 
   private static final Map<Resource.Type, String> KEY_PROPERTY_IDS = new HashMap<>();
@@ -661,23 +645,38 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
     // Non Rolling Upgrades require a group with name "UPDATE_DESIRED_STACK_ID".
     // This is needed as a marker to indicate which version to use when an upgrade is paused.
     if (pack.getType() == UpgradeType.NON_ROLLING) {
-      boolean foundGroupWithNameUPDATE_DESIRED_STACK_ID = false;
+      boolean foundUpdateDesiredRepositoryIdGrouping = false;
       for (UpgradeGroupHolder group : groups) {
-        if (group.name.equalsIgnoreCase(CONST_UPGRADE_GROUP_NAME)) {
-          foundGroupWithNameUPDATE_DESIRED_STACK_ID = true;
+        if (group.groupClass == UpdateStackGrouping.class) {
+          foundUpdateDesiredRepositoryIdGrouping = true;
           break;
         }
       }
 
-      if (foundGroupWithNameUPDATE_DESIRED_STACK_ID == false) {
-        throw new AmbariException(String.format("NonRolling Upgrade Pack %s requires a Group with name %s",
-            pack.getName(), CONST_UPGRADE_GROUP_NAME));
+      if (!foundUpdateDesiredRepositoryIdGrouping) {
+        throw new AmbariException(String.format(
+            "Express upgrade packs are required to have a group of type %s. The upgrade pack %s is missing this grouping.",
+            "update-stack", pack.getName()));
       }
     }
 
     List<UpgradeGroupEntity> groupEntities = new ArrayList<>();
     RequestStageContainer req = createRequest(upgradeContext);
 
+    UpgradeEntity upgrade = new UpgradeEntity();
+    upgrade.setRepositoryVersion(upgradeContext.getRepositoryVersion());
+    upgrade.setClusterId(cluster.getClusterId());
+    upgrade.setDirection(direction);
+    upgrade.setUpgradePackage(pack.getName());
+    upgrade.setUpgradeType(pack.getType());
+    upgrade.setAutoSkipComponentFailures(upgradeContext.isComponentFailureAutoSkipped());
+    upgrade.setAutoSkipServiceCheckFailures(upgradeContext.isServiceCheckFailureAutoSkipped());
+    upgrade.setDowngradeAllowed(upgradeContext.isDowngradeAllowed());
+
+    // create to/from history for this upgrade - this should be done before any
+    // possible changes to the desired version for components
+    addComponentHistoryToUpgrade(cluster, upgrade, upgradeContext);
+
     /**
     During a Rolling Upgrade, change the desired Stack Id if jumping across
     major stack versions (e.g., HDP 2.2 -> 2.3), and then set config changes
@@ -761,56 +760,11 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
       }
     }
 
-    UpgradeEntity entity = new UpgradeEntity();
-    entity.setRepositoryVersion(upgradeContext.getRepositoryVersion());
-    entity.setUpgradeGroups(groupEntities);
-    entity.setClusterId(cluster.getClusterId());
-    entity.setDirection(direction);
-    entity.setUpgradePackage(pack.getName());
-    entity.setUpgradeType(pack.getType());
-    entity.setAutoSkipComponentFailures(upgradeContext.isComponentFailureAutoSkipped());
-    entity.setAutoSkipServiceCheckFailures(upgradeContext.isServiceCheckFailureAutoSkipped());
-
-    if (upgradeContext.getDirection().isDowngrade()) {
-      // !!! You can't downgrade a Downgrade, no matter what the upgrade pack says.
-      entity.setDowngradeAllowed(false);
-    } else {
-      entity.setDowngradeAllowed(pack.isDowngradeAllowed());
-    }
-
-    // set upgrade history for every component in the upgrade
-    Set<String> services = upgradeContext.getSupportedServices();
-    for (String serviceName : services) {
-      Service service = cluster.getService(serviceName);
-      Map<String, ServiceComponent> componentMap = service.getServiceComponents();
-      for (ServiceComponent component : componentMap.values()) {
-        UpgradeHistoryEntity history = new UpgradeHistoryEntity();
-        history.setUpgrade(entity);
-        history.setServiceName(serviceName);
-        history.setComponentName(component.getName());
-
-        // depending on whether this is an upgrade or a downgrade, the history
-        // will be different
-        if (upgradeContext.getDirection() == Direction.UPGRADE) {
-          history.setFromRepositoryVersion(component.getDesiredRepositoryVersion());
-          history.setTargetRepositoryVersion(upgradeContext.getRepositoryVersion());
-        } else {
-          // the target version on a downgrade is the original version that the
-          // service was on in the failed upgrade
-          RepositoryVersionEntity targetRepositoryVersion =
-              upgradeContext.getTargetRepositoryVersion(serviceName);
-
-          history.setFromRepositoryVersion(upgradeContext.getRepositoryVersion());
-          history.setTargetRepositoryVersion(targetRepositoryVersion);
-        }
-
-        // add the history
-        entity.addHistory(history);
-      }
-    }
+    // set all of the groups we just created
+    upgrade.setUpgradeGroups(groupEntities);
 
     req.getRequestStatusResponse();
-    return createUpgradeInsideTransaction(cluster, req, entity);
+    return createUpgradeInsideTransaction(cluster, req, upgrade);
   }
 
   /**
@@ -1418,7 +1372,6 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
 
     Map<String, String> commandParams = getNewParameterMap(request, context);
     commandParams.put(UpgradeContext.COMMAND_PARAM_UPGRADE_PACK, upgradePack.getName());
-    commandParams.put(COMMAND_PARAM_SUPPORTED_SERVICES, StringUtils.join(context.getSupportedServices(), ','));
 
     // Notice that this does not apply any params because the input does not specify a stage.
     // All of the other actions do use additional params.
@@ -1646,6 +1599,50 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
   }
 
   /**
+   * Creates the {@link UpgradeHistoryEntity} instances for this upgrade for
+   * every component participating.
+   *
+   * @param cluster
+   *          the cluster (not {@code null}).
+   * @param upgrade
+   *          the upgrade to add the entities to (not {@code null}).
+   * @param upgradeContext
+   *          the upgrade context for this upgrade (not {@code null}).
+   */
+  private void addComponentHistoryToUpgrade(Cluster cluster, UpgradeEntity upgrade,
+      UpgradeContext upgradeContext) throws AmbariException {
+    Set<String> services = upgradeContext.getSupportedServices();
+    for (String serviceName : services) {
+      Service service = cluster.getService(serviceName);
+      Map<String, ServiceComponent> componentMap = service.getServiceComponents();
+      for (ServiceComponent component : componentMap.values()) {
+        UpgradeHistoryEntity history = new UpgradeHistoryEntity();
+        history.setUpgrade(upgrade);
+        history.setServiceName(serviceName);
+        history.setComponentName(component.getName());
+
+        // depending on whether this is an upgrade or a downgrade, the history
+        // will be different
+        if (upgradeContext.getDirection() == Direction.UPGRADE) {
+          history.setFromRepositoryVersion(component.getDesiredRepositoryVersion());
+          history.setTargetRepositoryVersion(upgradeContext.getRepositoryVersion());
+        } else {
+          // the target version on a downgrade is the original version that the
+          // service was on in the failed upgrade
+          RepositoryVersionEntity targetRepositoryVersion = upgradeContext.getTargetRepositoryVersion(
+              serviceName);
+
+          history.setFromRepositoryVersion(upgradeContext.getRepositoryVersion());
+          history.setTargetRepositoryVersion(targetRepositoryVersion);
+        }
+
+        // add the history
+        upgrade.addHistory(history);
+      }
+    }
+  }
+
+  /**
    * Builds the correct {@link ConfigUpgradePack} based on the upgrade and
    * source stack.
    * <ul>

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/AbstractUpgradeServerAction.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/AbstractUpgradeServerAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/AbstractUpgradeServerAction.java
index 4942f27..be69311 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/AbstractUpgradeServerAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/AbstractUpgradeServerAction.java
@@ -32,10 +32,6 @@ import com.google.inject.Inject;
  */
 public abstract class AbstractUpgradeServerAction extends AbstractServerAction {
 
-  public static final String CLUSTER_NAME_KEY = UpgradeContext.COMMAND_PARAM_CLUSTER_NAME;
-  public static final String UPGRADE_DIRECTION_KEY = UpgradeContext.COMMAND_PARAM_DIRECTION;
-  protected static final String REQUEST_ID = UpgradeContext.COMMAND_PARAM_REQUEST_ID;
-
   @Inject
   protected Clusters m_clusters;
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
index c4e073c..55ec84b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/FinalizeUpgradeAction.java
@@ -75,7 +75,7 @@ public class FinalizeUpgradeAction extends AbstractUpgradeServerAction {
   private AmbariMetaInfo ambariMetaInfo;
 
   @Inject
-  VersionEventPublisher versionEventPublisher;
+  private VersionEventPublisher versionEventPublisher;
 
   @Override
   public CommandReport execute(ConcurrentMap<String, Object> requestSharedDataContext)
@@ -241,7 +241,6 @@ public class FinalizeUpgradeAction extends AbstractUpgradeServerAction {
       }
 
       outSB.append(message).append(System.lineSeparator());
-      outSB.append(message).append(System.lineSeparator());
 
       // iterate through all host components and make sure that they are on the
       // correct version; if they are not, then this will throw an exception

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/UpdateDesiredStackAction.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/UpdateDesiredStackAction.java b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/UpdateDesiredStackAction.java
index 657cb07..2eec581 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/UpdateDesiredStackAction.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/serveraction/upgrades/UpdateDesiredStackAction.java
@@ -61,22 +61,6 @@ public class UpdateDesiredStackAction extends AbstractUpgradeServerAction {
    */
   private static final Logger LOG = LoggerFactory.getLogger(UpdateDesiredStackAction.class);
 
-  public static final String COMMAND_PARAM_DIRECTION = "upgrade_direction";
-  public static final String COMMAND_PARAM_UPGRADE_PACK = "upgrade_pack";
-
-  /**
-   * The original "current" stack of the cluster before the upgrade started.
-   * This is the same regardless of whether the current direction is
-   * {@link Direction#UPGRADE} or {@link Direction#DOWNGRADE}.
-   */
-  public static final String COMMAND_PARAM_ORIGINAL_STACK = "original_stack";
-
-  /**
-   * The target upgrade stack before the upgrade started. This is the same
-   * regardless of whether the current direction is {@link Direction#UPGRADE} or
-   * {@link Direction#DOWNGRADE}.
-   */
-  public static final String COMMAND_PARAM_TARGET_STACK = "target_stack";
 
   /**
    * The Cluster that this ServerAction implementation is executing on.
@@ -118,9 +102,6 @@ public class UpdateDesiredStackAction extends AbstractUpgradeServerAction {
       LOG.warn(String.format("Did not receive role parameter %s, will save configs using anonymous username %s", ServerAction.ACTION_USER_NAME, userName));
     }
 
-    // invalidate any cached effective ID
-    cluster.invalidateUpgradeEffectiveVersion();
-
     return updateDesiredRepositoryVersion(cluster, upgradeContext, userName);
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
index 9098cf1..cf2844b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
@@ -675,11 +675,4 @@ public interface Cluster {
    */
   void addSuspendedUpgradeParameters(Map<String, String> commandParams,
       Map<String, String> roleParams);
-
-  /**
-   * Invalidates any cached effective cluster versions for upgrades.
-   *
-   * @see #getEffectiveClusterVersion()
-   */
-  void invalidateUpgradeEffectiveVersion();
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java
index db58d27..5c29fb5 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/UpgradeContext.java
@@ -17,7 +17,6 @@
  */
 package org.apache.ambari.server.state;
 
-import static org.apache.ambari.server.controller.internal.UpgradeResourceProvider.UPGRADE_CLUSTER_NAME;
 import static org.apache.ambari.server.controller.internal.UpgradeResourceProvider.UPGRADE_DIRECTION;
 import static org.apache.ambari.server.controller.internal.UpgradeResourceProvider.UPGRADE_FAIL_ON_CHECK_WARNINGS;
 import static org.apache.ambari.server.controller.internal.UpgradeResourceProvider.UPGRADE_HOST_ORDERED_HOSTS;
@@ -116,11 +115,6 @@ public class UpgradeContext {
   final private UpgradeType m_type;
 
   /**
-   * The request parameters from the REST API for creating this upgrade.
-   */
-  final private Map<String, Object> m_upgradeRequestMap;
-
-  /**
    * The upgrade pack for this upgrade.
    */
   private UpgradePack m_upgradePack;
@@ -247,10 +241,9 @@ public class UpgradeContext {
     m_repoVersionDAO = repoVersionDAO;
 
     m_cluster = cluster;
-    m_upgradeRequestMap = upgradeRequestMap;
 
     // determine direction
-    String directionProperty = (String) m_upgradeRequestMap.get(UPGRADE_DIRECTION);
+    String directionProperty = (String) upgradeRequestMap.get(UPGRADE_DIRECTION);
     if (StringUtils.isEmpty(directionProperty)) {
       throw new AmbariException(String.format("%s is required", UPGRADE_DIRECTION));
     }
@@ -258,10 +251,10 @@ public class UpgradeContext {
     m_direction = Direction.valueOf(directionProperty);
 
     // determine upgrade type (default is ROLLING)
-    String upgradeTypeProperty = (String) m_upgradeRequestMap.get(UPGRADE_TYPE);
+    String upgradeTypeProperty = (String) upgradeRequestMap.get(UPGRADE_TYPE);
     if (StringUtils.isNotBlank(upgradeTypeProperty)) {
       try {
-        m_type = UpgradeType.valueOf(m_upgradeRequestMap.get(UPGRADE_TYPE).toString());
+        m_type = UpgradeType.valueOf(upgradeRequestMap.get(UPGRADE_TYPE).toString());
       } catch (Exception e) {
         throw new AmbariException(String.format("Property %s has an incorrect value of %s.",
             UPGRADE_TYPE, upgradeTypeProperty));
@@ -274,7 +267,7 @@ public class UpgradeContext {
     // depending on the direction, we must either have a target repository or an upgrade we are downgrading from
     switch(m_direction){
       case UPGRADE:{
-        String repositoryVersionId = (String) m_upgradeRequestMap.get(UPGRADE_REPO_VERSION_ID);
+        String repositoryVersionId = (String) upgradeRequestMap.get(UPGRADE_REPO_VERSION_ID);
         if (null == repositoryVersionId) {
           throw new AmbariException(
               String.format("The property %s is required when the upgrade direction is %s",
@@ -340,7 +333,7 @@ public class UpgradeContext {
      * For the unit tests tests, there are multiple upgrade packs for the same
      * type, so allow picking one of them. In prod, this is empty.
      */
-    String preferredUpgradePackName = (String) m_upgradeRequestMap.get(UPGRADE_PACK);
+    String preferredUpgradePackName = (String) upgradeRequestMap.get(UPGRADE_PACK);
 
     @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES, comment="This is wrong")
     String upgradePackFromVersion = cluster.getService(
@@ -352,7 +345,8 @@ public class UpgradeContext {
 
     // the validator will throw an exception if the upgrade request is not valid
     UpgradeRequestValidator upgradeRequestValidator = buildValidator(m_type);
-    upgradeRequestValidator.validate(this);
+    upgradeRequestValidator.validate(cluster, m_direction, m_type, m_upgradePack,
+        upgradeRequestMap);
 
     // optionally skip failures - this can be supplied on either the request or
     // in the upgrade pack explicitely, however the request will always override
@@ -361,21 +355,21 @@ public class UpgradeContext {
     boolean skipServiceCheckFailures = m_upgradePack.isServiceCheckFailureAutoSkipped();
 
     // only override the upgrade pack if set on the request
-    if (m_upgradeRequestMap.containsKey(UPGRADE_SKIP_FAILURES)) {
+    if (upgradeRequestMap.containsKey(UPGRADE_SKIP_FAILURES)) {
       skipComponentFailures = Boolean.parseBoolean(
-          (String) m_upgradeRequestMap.get(UPGRADE_SKIP_FAILURES));
+          (String) upgradeRequestMap.get(UPGRADE_SKIP_FAILURES));
     }
 
     // only override the upgrade pack if set on the request
-    if (m_upgradeRequestMap.containsKey(UPGRADE_SKIP_SC_FAILURES)) {
+    if (upgradeRequestMap.containsKey(UPGRADE_SKIP_SC_FAILURES)) {
       skipServiceCheckFailures = Boolean.parseBoolean(
-          (String) m_upgradeRequestMap.get(UPGRADE_SKIP_SC_FAILURES));
+          (String) upgradeRequestMap.get(UPGRADE_SKIP_SC_FAILURES));
     }
 
     boolean skipManualVerification = false;
-    if (m_upgradeRequestMap.containsKey(UPGRADE_SKIP_MANUAL_VERIFICATION)) {
+    if (upgradeRequestMap.containsKey(UPGRADE_SKIP_MANUAL_VERIFICATION)) {
       skipManualVerification = Boolean.parseBoolean(
-          (String) m_upgradeRequestMap.get(UPGRADE_SKIP_MANUAL_VERIFICATION));
+          (String) upgradeRequestMap.get(UPGRADE_SKIP_MANUAL_VERIFICATION));
     }
 
     m_autoSkipComponentFailures = skipComponentFailures;
@@ -423,22 +417,6 @@ public class UpgradeContext {
     m_upgradePack = packs.get(upgradePackage);
 
     m_resolver = new MasterHostResolver(configHelper, this);
-
-    // since this constructor is initialized from an entity, then this map is
-    // not present
-    m_upgradeRequestMap = Collections.emptyMap();
-  }
-
-
-  /**
-   * Gets the original mapping of key/value pairs from the request which created
-   * the upgrade.
-   *
-   * @return the original mapping of key/value pairs from the request which
-   *         created the upgrade.
-   */
-  public Map<String, Object> getUpgradeRequest() {
-    return m_upgradeRequestMap;
   }
 
   /**
@@ -752,6 +730,22 @@ public class UpgradeContext {
   }
 
   /**
+   * Gets whether a downgrade is allowed for this upgrade. If the direction is
+   * {@link Direction#DOWNGRADE}, then this method always returns false.
+   * Otherwise it will consule {@link UpgradePack#isDowngradeAllowed()}.
+   *
+   * @return {@code true} of a downgrade is allowed for this upgrade,
+   *         {@code false} otherwise.
+   */
+  public boolean isDowngradeAllowed() {
+    if (m_direction == Direction.DOWNGRADE) {
+      return false;
+    }
+
+    return m_upgradePack.isDowngradeAllowed();
+  }
+
+  /**
    * Builds a chain of {@link UpgradeRequestValidator}s to ensure that the
    * incoming request to create a new upgrade is valid.
    *
@@ -805,19 +799,22 @@ public class UpgradeContext {
     /**
      * Validates the upgrade request from this point in the chain.
      *
-     * @param upgradeContext
+     * @param cluster
+     * @param direction
+     * @param type
      * @param upgradePack
+     * @param requestMap
      * @throws AmbariException
      */
-    final void validate(UpgradeContext upgradeContext)
-        throws AmbariException {
+    final void validate(Cluster cluster, Direction direction, UpgradeType type,
+        UpgradePack upgradePack, Map<String, Object> requestMap) throws AmbariException {
 
       // run this instance's check
-      check(upgradeContext, upgradeContext.getUpgradePack());
+      check(cluster, direction, type, upgradePack, requestMap);
 
       // pass along to the next
       if( null != m_nextValidator ) {
-        m_nextValidator.validate(upgradeContext);
+        m_nextValidator.validate(cluster, direction, type, upgradePack, requestMap);
       }
     }
 
@@ -825,13 +822,15 @@ public class UpgradeContext {
      * Checks to ensure that upgrade request is valid given the specific
      * arguments.
      *
-     * @param upgradeContext
+     * @param cluster
+     * @param direction
+     * @param type
      * @param upgradePack
-     *
+     * @param requestMap
      * @throws AmbariException
      */
-    abstract void check(UpgradeContext upgradeContext, UpgradePack upgradePack)
-        throws AmbariException;
+    abstract void check(Cluster cluster, Direction direction, UpgradeType type,
+        UpgradePack upgradePack, Map<String, Object> requestMap) throws AmbariException;
   }
 
   /**
@@ -844,22 +843,10 @@ public class UpgradeContext {
      * {@inheritDoc}
      */
     @Override
-    public void check(UpgradeContext upgradeContext, UpgradePack upgradePack)
-        throws AmbariException {
-      Map<String, Object> requestMap = upgradeContext.getUpgradeRequest();
-
-      String clusterName = (String) requestMap.get(UPGRADE_CLUSTER_NAME);
-      String direction = (String) requestMap.get(UPGRADE_DIRECTION);
-
-      if (StringUtils.isBlank(clusterName)) {
-        throw new AmbariException(String.format("%s is required", UPGRADE_CLUSTER_NAME));
-      }
-
-      if (StringUtils.isBlank(direction)) {
-        throw new AmbariException(String.format("%s is required", UPGRADE_DIRECTION));
-      }
+    public void check(Cluster cluster, Direction direction, UpgradeType type,
+        UpgradePack upgradePack, Map<String, Object> requestMap) throws AmbariException {
 
-      if (Direction.valueOf(direction) == Direction.UPGRADE) {
+      if (direction == Direction.UPGRADE) {
         String repositoryVersionId = (String) requestMap.get(UPGRADE_REPO_VERSION_ID);
         if (StringUtils.isBlank(repositoryVersionId)) {
           throw new AmbariException(
@@ -878,11 +865,8 @@ public class UpgradeContext {
      * {@inheritDoc}
      */
     @Override
-    void check(UpgradeContext upgradeContext, UpgradePack upgradePack) throws AmbariException {
-      Cluster cluster = upgradeContext.getCluster();
-      Direction direction = upgradeContext.getDirection();
-      Map<String, Object> requestMap = upgradeContext.getUpgradeRequest();
-      UpgradeType upgradeType = upgradeContext.getType();
+    void check(Cluster cluster, Direction direction, UpgradeType type, UpgradePack upgradePack,
+        Map<String, Object> requestMap) throws AmbariException {
 
       String repositoryVersionId = (String) requestMap.get(UPGRADE_REPO_VERSION_ID);
       boolean skipPrereqChecks = Boolean.parseBoolean((String) requestMap.get(UPGRADE_SKIP_PREREQUISITE_CHECKS));
@@ -913,7 +897,7 @@ public class UpgradeContext {
       Predicate preUpgradeCheckPredicate = new PredicateBuilder().property(
           PreUpgradeCheckResourceProvider.UPGRADE_CHECK_CLUSTER_NAME_PROPERTY_ID).equals(cluster.getClusterName()).and().property(
           PreUpgradeCheckResourceProvider.UPGRADE_CHECK_REPOSITORY_VERSION_PROPERTY_ID).equals(repositoryVersion.getVersion()).and().property(
-          PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID).equals(upgradeType).and().property(
+          PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_TYPE_PROPERTY_ID).equals(type).and().property(
           PreUpgradeCheckResourceProvider.UPGRADE_CHECK_UPGRADE_PACK_PROPERTY_ID).equals(preferredUpgradePack).toPredicate();
 
       Request preUpgradeCheckRequest = PropertyHelper.getReadRequest();
@@ -960,10 +944,8 @@ public class UpgradeContext {
      * {@inheritDoc}
      */
     @Override
-    void check(UpgradeContext upgradeContext, UpgradePack upgradePack) throws AmbariException {
-      Cluster cluster = upgradeContext.getCluster();
-      Direction direction = upgradeContext.getDirection();
-      Map<String, Object> requestMap = upgradeContext.getUpgradeRequest();
+    void check(Cluster cluster, Direction direction, UpgradeType type, UpgradePack upgradePack,
+        Map<String, Object> requestMap) throws AmbariException {
 
       String skipFailuresRequestProperty = (String) requestMap.get(UPGRADE_SKIP_FAILURES);
       if (Boolean.parseBoolean(skipFailuresRequestProperty)) {
@@ -1020,56 +1002,56 @@ public class UpgradeContext {
         }
       }
     }
-  }
 
-  /**
-   * Builds the list of {@link HostOrderItem}s from the upgrade request. If the
-   * upgrade request does not contain the hosts
-   *
-   * @param requestMap
-   *          the map of properties from the request (not {@code null}).
-   * @return the ordered list of actions to orchestrate for the
-   *         {@link UpgradeType#HOST_ORDERED} upgrade.
-   * @throws AmbariException
-   *           if the request properties are not valid.
-   */
-  @SuppressWarnings("unchecked")
-  private List<HostOrderItem> extractHostOrderItemsFromRequest(Map<String, Object> requestMap)
-      throws AmbariException {
-    // ewwww
-    Set<Map<String, List<String>>> hostsOrder = (Set<Map<String, List<String>>>) requestMap.get(
-        UPGRADE_HOST_ORDERED_HOSTS);
-
-    if (CollectionUtils.isEmpty(hostsOrder)) {
-      throw new AmbariException(
-          String.format("The %s property must be specified when using a %s upgrade type.",
-              UPGRADE_HOST_ORDERED_HOSTS, UpgradeType.HOST_ORDERED));
-    }
+    /**
+     * Builds the list of {@link HostOrderItem}s from the upgrade request. If
+     * the upgrade request does not contain the hosts
+     *
+     * @param requestMap
+     *          the map of properties from the request (not {@code null}).
+     * @return the ordered list of actions to orchestrate for the
+     *         {@link UpgradeType#HOST_ORDERED} upgrade.
+     * @throws AmbariException
+     *           if the request properties are not valid.
+     */
+    private List<HostOrderItem> extractHostOrderItemsFromRequest(Map<String, Object> requestMap)
+        throws AmbariException {
+      // ewwww
+      Set<Map<String, List<String>>> hostsOrder = (Set<Map<String, List<String>>>) requestMap.get(
+          UPGRADE_HOST_ORDERED_HOSTS);
 
-    List<HostOrderItem> hostOrderItems = new ArrayList<>();
+      if (CollectionUtils.isEmpty(hostsOrder)) {
+        throw new AmbariException(
+            String.format("The %s property must be specified when using a %s upgrade type.",
+                UPGRADE_HOST_ORDERED_HOSTS, UpgradeType.HOST_ORDERED));
+      }
 
-    // extract all of the hosts so that we can ensure they are all accounted for
-    Iterator<Map<String, List<String>>> iterator = hostsOrder.iterator();
-    while (iterator.hasNext()) {
-      Map<String, List<String>> grouping = iterator.next();
-      List<String> hosts = grouping.get("hosts");
-      List<String> serviceChecks = grouping.get("service_checks");
+      List<HostOrderItem> hostOrderItems = new ArrayList<>();
 
-      if (CollectionUtils.isEmpty(hosts) && CollectionUtils.isEmpty(serviceChecks)) {
-        throw new AmbariException(String.format(
-            "The %s property must contain at least one object with either a %s or %s key",
-            UPGRADE_HOST_ORDERED_HOSTS, "hosts", "service_checks"));
-      }
+      // extract all of the hosts so that we can ensure they are all accounted
+      // for
+      Iterator<Map<String, List<String>>> iterator = hostsOrder.iterator();
+      while (iterator.hasNext()) {
+        Map<String, List<String>> grouping = iterator.next();
+        List<String> hosts = grouping.get("hosts");
+        List<String> serviceChecks = grouping.get("service_checks");
 
-      if (CollectionUtils.isNotEmpty(hosts)) {
-        hostOrderItems.add(new HostOrderItem(HostOrderActionType.HOST_UPGRADE, hosts));
-      }
+        if (CollectionUtils.isEmpty(hosts) && CollectionUtils.isEmpty(serviceChecks)) {
+          throw new AmbariException(String.format(
+              "The %s property must contain at least one object with either a %s or %s key",
+              UPGRADE_HOST_ORDERED_HOSTS, "hosts", "service_checks"));
+        }
+
+        if (CollectionUtils.isNotEmpty(hosts)) {
+          hostOrderItems.add(new HostOrderItem(HostOrderActionType.HOST_UPGRADE, hosts));
+        }
 
-      if (CollectionUtils.isNotEmpty(serviceChecks)) {
-        hostOrderItems.add(new HostOrderItem(HostOrderActionType.SERVICE_CHECK, serviceChecks));
+        if (CollectionUtils.isNotEmpty(serviceChecks)) {
+          hostOrderItems.add(new HostOrderItem(HostOrderActionType.SERVICE_CHECK, serviceChecks));
+        }
       }
-    }
 
-    return hostOrderItems;
+      return hostOrderItems;
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index 281523a..e4ac23e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@ -304,13 +304,6 @@ public class ClusterImpl implements Cluster {
    */
   private Map<String, String> m_clusterPropertyCache = new ConcurrentHashMap<>();
 
-  /**
-   * A simple cache of the effective cluster version during an upgrade. Since
-   * calculation of this during an upgrade is not very quick or clean, it's good
-   * to cache it.
-   */
-  private final Map<Long, String> upgradeEffectiveVersionCache = new ConcurrentHashMap<>();
-
   @Inject
   public ClusterImpl(@Assisted ClusterEntity clusterEntity, Injector injector,
       AmbariEventPublisher eventPublisher)
@@ -969,14 +962,6 @@ public class ClusterImpl implements Cluster {
    * {@inheritDoc}
    */
   @Override
-  public void invalidateUpgradeEffectiveVersion() {
-    upgradeEffectiveVersionCache.clear();
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
   @Transactional
   public List<Host> transitionHostsToInstalling(RepositoryVersionEntity repoVersionEntity,
       VersionDefinitionXml versionDefinitionXml, boolean forceInstalled) throws AmbariException {

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/main/resources/custom_actions/scripts/ru_set_all.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/custom_actions/scripts/ru_set_all.py b/ambari-server/src/main/resources/custom_actions/scripts/ru_set_all.py
index a7732d9..7b44677 100644
--- a/ambari-server/src/main/resources/custom_actions/scripts/ru_set_all.py
+++ b/ambari-server/src/main/resources/custom_actions/scripts/ru_set_all.py
@@ -27,7 +27,6 @@ from ambari_commons.os_check import OSCheck
 from resource_management.libraries.script import Script
 from resource_management.libraries.functions import conf_select
 from resource_management.libraries.functions import stack_tools
-from resource_management.libraries.functions.constants import Direction
 from resource_management.libraries.functions.default import default
 from resource_management.libraries.functions.version import format_stack_version
 from resource_management.core import shell
@@ -36,13 +35,14 @@ from resource_management.core.logger import Logger
 from resource_management.core.resources.system import Execute, Link, Directory
 from resource_management.libraries.functions.stack_features import check_stack_feature
 from resource_management.libraries.functions import StackFeature
+from resource_management.libraries.functions.decorator import experimental
 
 class UpgradeSetAll(Script):
   """
   This script is a part of stack upgrade workflow and is used to set the
   all of the component versions as a final step in the upgrade process
   """
-
+  @experimental(feature="PATCH_UPGRADES", disable = True, comment = "Skipping stack-select set all")
   def actionexecute(self, env):
     version = default('/commandParams/version', None)
 
@@ -79,51 +79,6 @@ class UpgradeSetAll(Script):
           link_config(dir_def['conf_dir'], dir_def['current_dir'])
 
 
-  def unlink_all_configs(self, env):
-    """
-    Reverses the work performed in link_config. This should only be used when downgrading from
-    HDP 2.3 to 2.2 in order to under the symlink work required for 2.3.
-    """
-    stack_name = default('/hostLevelParams/stack_name', "").upper()
-    downgrade_to_version = default('/commandParams/version', None)
-    downgrade_from_version = default('/commandParams/downgrade_from_version', None)
-    upgrade_direction = default("/commandParams/upgrade_direction", Direction.UPGRADE)
-
-    # downgrade only
-    if upgrade_direction != Direction.DOWNGRADE:
-      Logger.warning("Unlinking configurations should only be performed on a downgrade.")
-      return
-
-    if downgrade_to_version is None or downgrade_from_version is None:
-      Logger.warning("Both 'commandParams/version' and 'commandParams/downgrade_from_version' must be specified to unlink configs on downgrade.")
-      return
-
-    Logger.info("Unlinking all configs when downgrading from {0} {1} to {2}".format(
-        stack_name, downgrade_from_version, downgrade_to_version))
-
-    # normalize the versions
-    downgrade_to_version = format_stack_version(downgrade_to_version)
-    downgrade_from_version = format_stack_version(downgrade_from_version)
-
-    # downgrade-to-version must be 2.2 (less than 2.3)
-    if downgrade_to_version and check_stack_feature(StackFeature.CONFIG_VERSIONING, downgrade_to_version):
-      Logger.warning("Unlinking configurations should not be performed when downgrading {0} {1} to {2}".format(
-          stack_name, downgrade_from_version, downgrade_to_version))
-      return
-
-    # downgrade-from-version must be 2.3+
-    if not( downgrade_from_version and check_stack_feature(StackFeature.CONFIG_VERSIONING, downgrade_from_version) ):
-      Logger.warning("Unlinking configurations should not be performed when downgrading {0} {1} to {2}".format(
-          stack_name, downgrade_from_version, downgrade_to_version))
-      return
-
-    # iterate through all directory conf mappings and undo the symlinks
-    for key, value in conf_select.get_package_dirs().iteritems():
-      for directory_mapping in value:
-        original_config_directory = directory_mapping['conf_dir']
-        self._unlink_config(original_config_directory)
-
-
   def _unlink_config(self, original_conf_directory):
     """
     Reverses the work performed in link_config. This should only be used when downgrading from

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
index 4170342..0735d5a 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
@@ -2117,7 +2117,7 @@ public class AmbariManagementControllerImplTest {
 
     Map<String, String> defaultHostParams = helper.createDefaultHostParams(cluster, repositoryVersionEntity);
 
-    assertEquals(defaultHostParams.size(), 16);
+    assertEquals(defaultHostParams.size(), 15);
     assertEquals(defaultHostParams.get(DB_DRIVER_FILENAME), MYSQL_JAR);
     assertEquals(defaultHostParams.get(STACK_NAME), SOME_STACK_NAME);
     assertEquals(defaultHostParams.get(STACK_VERSION), SOME_STACK_VERSION);

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java
index 738ad1f..b06117b 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/ComponentVersionCheckActionTest.java
@@ -299,8 +299,6 @@ public class ComponentVersionCheckActionTest {
 
     // Finalize the upgrade
     Map<String, String> commandParams = new HashMap<>();
-    commandParams.put(FinalizeUpgradeAction.UPGRADE_DIRECTION_KEY, "upgrade");
-
     ExecutionCommand executionCommand = new ExecutionCommand();
     executionCommand.setCommandParams(commandParams);
     executionCommand.setClusterName("c1");
@@ -367,8 +365,6 @@ public class ComponentVersionCheckActionTest {
     // now finalize and ensure we can transition from UPGRADING to UPGRADED
     // automatically before CURRENT
     Map<String, String> commandParams = new HashMap<>();
-    commandParams.put(FinalizeUpgradeAction.UPGRADE_DIRECTION_KEY, "upgrade");
-
     ExecutionCommand executionCommand = new ExecutionCommand();
     executionCommand.setCommandParams(commandParams);
     executionCommand.setClusterName("c1");
@@ -434,8 +430,6 @@ public class ComponentVersionCheckActionTest {
 
     // Finalize the upgrade
     Map<String, String> commandParams = new HashMap<>();
-    commandParams.put(FinalizeUpgradeAction.UPGRADE_DIRECTION_KEY, "upgrade");
-
     ExecutionCommand executionCommand = new ExecutionCommand();
     executionCommand.setCommandParams(commandParams);
     executionCommand.setClusterName("c1");

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java
index 2bc2c13..0aea8b3 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java
@@ -75,7 +75,6 @@ import org.apache.ambari.server.state.ServiceFactory;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
 import org.apache.ambari.server.state.stack.UpgradePack;
-import org.apache.ambari.server.state.stack.upgrade.Direction;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.ambari.server.utils.EventBusSynchronizer;
 import org.junit.After;
@@ -363,7 +362,8 @@ public class UpgradeActionTest {
     String urlInfo = "[{'repositories':["
         + "{'Repositories/base_url':'http://foo1','Repositories/repo_name':'HDP','Repositories/repo_id':'" + targetRepo + "'}"
         + "], 'OperatingSystems/os_type':'redhat6'}]";
-    repoVersionDAO.create(stackEntityTarget, targetRepo, String.valueOf(System.currentTimeMillis()), urlInfo);
+
+    m_helper.getOrCreateRepositoryVersion(new StackId(stackEntityTarget), targetRepo);
 
     // Start upgrading the newer repo
 
@@ -426,11 +426,6 @@ public class UpgradeActionTest {
     Assert.assertFalse(configs.isEmpty());
 
     Map<String, String> commandParams = new HashMap<>();
-    commandParams.put(UpdateDesiredStackAction.COMMAND_PARAM_ORIGINAL_STACK, sourceStack.getStackId());
-    commandParams.put(UpdateDesiredStackAction.COMMAND_PARAM_TARGET_STACK, targetStack.getStackId());
-    commandParams.put(UpdateDesiredStackAction.COMMAND_PARAM_DIRECTION, Direction.UPGRADE.toString());
-    commandParams.put(UpdateDesiredStackAction.COMMAND_PARAM_UPGRADE_PACK, upgradePackName);
-
     ExecutionCommand executionCommand = new ExecutionCommand();
     executionCommand.setCommandParams(commandParams);
     Map<String, String> roleParams = new HashMap<>();
@@ -476,8 +471,6 @@ public class UpgradeActionTest {
     createUpgrade(cluster, repositoryVersion2111);
 
     Map<String, String> commandParams = new HashMap<>();
-    commandParams.put(FinalizeUpgradeAction.UPGRADE_DIRECTION_KEY, "downgrade");
-
     ExecutionCommand executionCommand = new ExecutionCommand();
     executionCommand.setCommandParams(commandParams);
     executionCommand.setClusterName(clusterName);
@@ -527,8 +520,6 @@ public class UpgradeActionTest {
     createUpgrade(cluster, repositoryVersion2202);
 
     Map<String, String> commandParams = new HashMap<>();
-    commandParams.put(FinalizeUpgradeAction.UPGRADE_DIRECTION_KEY, "downgrade");
-
     ExecutionCommand executionCommand = new ExecutionCommand();
     executionCommand.setCommandParams(commandParams);
     executionCommand.setClusterName(clusterName);
@@ -565,8 +556,6 @@ public class UpgradeActionTest {
 
     // Finalize the upgrade
     Map<String, String> commandParams = new HashMap<>();
-    commandParams.put(FinalizeUpgradeAction.UPGRADE_DIRECTION_KEY, "upgrade");
-
     ExecutionCommand executionCommand = new ExecutionCommand();
     executionCommand.setCommandParams(commandParams);
     executionCommand.setClusterName(clusterName);
@@ -624,7 +613,6 @@ public class UpgradeActionTest {
 
     // Finalize the upgrade
     Map<String, String> commandParams = new HashMap<>();
-    commandParams.put(FinalizeUpgradeAction.UPGRADE_DIRECTION_KEY, "upgrade");
 
     ExecutionCommand executionCommand = new ExecutionCommand();
     executionCommand.setCommandParams(commandParams);
@@ -661,8 +649,6 @@ public class UpgradeActionTest {
     createUpgrade(cluster, repositoryVersion2201);
 
     Map<String, String> commandParams = new HashMap<>();
-    commandParams.put(FinalizeUpgradeAction.UPGRADE_DIRECTION_KEY, "upgrade");
-
     ExecutionCommand executionCommand = new ExecutionCommand();
     executionCommand.setCommandParams(commandParams);
     executionCommand.setClusterName(clusterName);
@@ -732,8 +718,6 @@ public class UpgradeActionTest {
     assertEquals(8, configs.size());
 
     Map<String, String> commandParams = new HashMap<>();
-    commandParams.put(FinalizeUpgradeAction.UPGRADE_DIRECTION_KEY, "downgrade");
-
     ExecutionCommand executionCommand = new ExecutionCommand();
     executionCommand.setCommandParams(commandParams);
     executionCommand.setClusterName(clusterName);
@@ -832,8 +816,6 @@ public class UpgradeActionTest {
     // now finalize and ensure we can transition from UPGRADING to UPGRADED
     // automatically before CURRENT
     Map<String, String> commandParams = new HashMap<>();
-    commandParams.put(FinalizeUpgradeAction.UPGRADE_DIRECTION_KEY, "upgrade");
-
     ExecutionCommand executionCommand = new ExecutionCommand();
     executionCommand.setCommandParams(commandParams);
     executionCommand.setClusterName(clusterName);

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilderTest.java
index 09fc5cd..2baf3fa 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/StageWrapperBuilderTest.java
@@ -100,7 +100,7 @@ public class StageWrapperBuilderTest extends EasyMockSupport {
     EasyMock.expect(repoVersionDAO.findByStackNameAndVersion(EasyMock.anyString(),
         EasyMock.anyString())).andReturn(repoVersionEntity).anyTimes();
 
-    UpgradeContext upgradeContext = EasyMock.createNiceMock(UpgradeContext.class);
+    UpgradeContext upgradeContext = createNiceMock(UpgradeContext.class);
     EasyMock.expect(upgradeContext.getCluster()).andReturn(cluster).anyTimes();
     EasyMock.expect(upgradeContext.getType()).andReturn(UpgradeType.ROLLING).anyTimes();
     EasyMock.expect(upgradeContext.getDirection()).andReturn(Direction.UPGRADE).anyTimes();

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java
index 3d1cdfc..1649078 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java
@@ -643,7 +643,7 @@ public class UpgradeCatalog200Test {
         clusterEntity, HOST_NAME);
 
     upgradeCatalogHelper.addComponent(injector, clusterEntity,
-        clusterServiceEntityNagios, hostEntity, "NAGIOS_SERVER", stackEntity);
+        clusterServiceEntityNagios, hostEntity, "NAGIOS_SERVER", repositoryVersion);
 
     ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity = serviceComponentDesiredStateDAO.findByName(
         clusterEntity.getClusterId(), "NAGIOS", "NAGIOS_SERVER");

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog210Test.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog210Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog210Test.java
index 4ed7685..6c2e9f7 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog210Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog210Test.java
@@ -65,6 +65,7 @@ import org.apache.ambari.server.orm.dao.ArtifactDAO;
 import org.apache.ambari.server.orm.dao.ClusterDAO;
 import org.apache.ambari.server.orm.dao.ClusterStateDAO;
 import org.apache.ambari.server.orm.dao.HostComponentDesiredStateDAO;
+import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO;
 import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.ArtifactEntity;
@@ -73,6 +74,7 @@ import org.apache.ambari.server.orm.entities.ClusterServiceEntity;
 import org.apache.ambari.server.orm.entities.ClusterStateEntity;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.state.Cluster;
@@ -825,11 +827,16 @@ public class UpgradeCatalog210Test {
     clusterEntity.setClusterStateEntity(clusterStateEntity);
     clusterDAO.merge(clusterEntity);
 
+    RepositoryVersionDAO repositoryVersionDAO = injector.getInstance(RepositoryVersionDAO.class);
+    RepositoryVersionEntity repositoryVersion = repositoryVersionDAO.findByStackAndVersion(
+        desiredStackEntity, desiredRepositoryVersion);
+
     ServiceComponentDesiredStateEntity componentDesiredStateEntity = new ServiceComponentDesiredStateEntity();
     componentDesiredStateEntity.setClusterId(clusterEntity.getClusterId());
     componentDesiredStateEntity.setServiceName(clusterServiceEntity.getServiceName());
     componentDesiredStateEntity.setClusterServiceEntity(clusterServiceEntity);
     componentDesiredStateEntity.setComponentName("STORM_REST_API");
+    componentDesiredStateEntity.setDesiredRepositoryVersion(repositoryVersion);
 
     ServiceComponentDesiredStateDAO componentDesiredStateDAO =
       injector.getInstance(ServiceComponentDesiredStateDAO.class);

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalogHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalogHelper.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalogHelper.java
index 2cf0321..6b28846 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalogHelper.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalogHelper.java
@@ -174,12 +174,12 @@ public class UpgradeCatalogHelper {
    * @param clusterServiceEntity
    * @param hostEntity
    * @param componentName
-   * @param desiredStackEntity
+   * @param repositoryversion
    */
   @Transactional
   protected void addComponent(Injector injector, ClusterEntity clusterEntity,
       ClusterServiceEntity clusterServiceEntity, HostEntity hostEntity,
-      String componentName, StackEntity desiredStackEntity) {
+      String componentName, RepositoryVersionEntity repositoryversion) {
     ServiceComponentDesiredStateDAO serviceComponentDesiredStateDAO = injector.getInstance(
         ServiceComponentDesiredStateDAO.class);
 
@@ -189,6 +189,7 @@ public class UpgradeCatalogHelper {
     componentDesiredStateEntity.setServiceName(clusterServiceEntity.getServiceName());
     componentDesiredStateEntity.setClusterServiceEntity(clusterServiceEntity);
     componentDesiredStateEntity.setClusterId(clusterServiceEntity.getClusterId());
+    componentDesiredStateEntity.setDesiredRepositoryVersion(repositoryversion);
     serviceComponentDesiredStateDAO.create(componentDesiredStateEntity);
 
     HostComponentDesiredStateDAO hostComponentDesiredStateDAO = injector.getInstance(HostComponentDesiredStateDAO.class);

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/test/python/custom_actions/test_ru_set_all.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/custom_actions/test_ru_set_all.py b/ambari-server/src/test/python/custom_actions/test_ru_set_all.py
index e1a89a8..29c99d8 100644
--- a/ambari-server/src/test/python/custom_actions/test_ru_set_all.py
+++ b/ambari-server/src/test/python/custom_actions/test_ru_set_all.py
@@ -25,17 +25,15 @@ import json
 from mock.mock import patch
 from mock.mock import MagicMock
 
+from stacks.utils.RMFTestCase import experimental_mock
+patch('resource_management.libraries.functions.decorator.experimental', experimental_mock).start()
+
 # Module imports
-import subprocess
 from stacks.utils.RMFTestCase import *
 from resource_management import Script, ConfigDictionary
 from resource_management.libraries.functions.default import default
-from resource_management.libraries.functions import conf_select
 from resource_management.core.logger import Logger
-from ambari_agent.AmbariConfig import AmbariConfig
-from ambari_agent.FileCache import FileCache
 from ambari_commons.os_check import OSCheck
-from resource_management.core import shell
 from resource_management.core.environment import Environment
 import pprint
 
@@ -48,7 +46,6 @@ def fake_call(command, **kwargs):
   """
   return (0, str(command))
 
-
 class TestRUSetAll(RMFTestCase):
   def get_custom_actions_dir(self):
     return os.path.join(self.get_src_folder(), "test/resources/custom_actions/")
@@ -198,121 +195,6 @@ class TestRUSetAll(RMFTestCase):
     self.assertEqual(call_mock.call_count, 1)
 
 
-  @patch("os.path.islink")
-  @patch("os.path.isdir")
-  @patch("resource_management.core.shell.call")
-  @patch.object(Script, 'get_config')
-  @patch.object(OSCheck, 'is_redhat_family')
-  def test_downgrade_unlink_configs(self, family_mock, get_config_mock, call_mock,
-                                    isdir_mock, islink_mock):
-    """
-    Tests downgrading from 2.3 to 2.2 to ensure that conf symlinks are removed and the backup
-    directories restored.
-    """
-
-    isdir_mock.return_value = True
-
-    # required for the test to run since the Execute calls need this
-    from resource_management.core.environment import Environment
-    env = Environment(test_mode=True)
-    with env:
-      # Mock the config objects
-      json_file_path = os.path.join(self.get_custom_actions_dir(), "ru_execute_tasks_namenode_prepare.json")
-      self.assertTrue(os.path.isfile(json_file_path))
-      with open(json_file_path, "r") as json_file:
-        json_payload = json.load(json_file)
-
-      # alter JSON for a downgrade from 2.3 to 2.2
-      json_payload['commandParams']['version'] = "2.2.0.0-1234"
-      json_payload['commandParams']['downgrade_from_version'] = "2.3.0.0-1234"
-      json_payload['commandParams']['original_stack'] = "HDP-2.2"
-      json_payload['commandParams']['target_stack'] = "HDP-2.3"
-      json_payload['commandParams']['upgrade_direction'] = "downgrade"
-      json_payload['hostLevelParams']['stack_version'] = "2.2"
-      json_payload["configurations"]["cluster-env"]["stack_tools"] = self.get_stack_tools()
-      json_payload["configurations"]["cluster-env"]["stack_features"] = self.get_stack_features()
-
-      config_dict = ConfigDictionary(json_payload)
-
-      family_mock.return_value = True
-      get_config_mock.return_value = config_dict
-      call_mock.side_effect = fake_call   # echo the command
-
-      # test the function
-      ru_execute = UpgradeSetAll()
-      ru_execute.unlink_all_configs(None)
-
-      # verify that os.path.islink was called for each conf
-      self.assertTrue(islink_mock.called)
-      for key, value in conf_select.get_package_dirs().iteritems():
-        for directory_mapping in value:
-          original_config_directory = directory_mapping['conf_dir']
-          is_link_called = False
-
-          for call in islink_mock.call_args_list:
-            call_tuple = call[0]
-            if original_config_directory in call_tuple:
-              is_link_called = True
-
-          if not is_link_called:
-            self.fail("os.path.islink({0}) was never called".format(original_config_directory))
-
-      # alter JSON for a downgrade from 2.3 to 2.3
-      with open(json_file_path, "r") as json_file:
-        json_payload = json.load(json_file)
-
-      json_payload['commandParams']['version'] = "2.3.0.0-1234"
-      json_payload['commandParams']['downgrade_from_version'] = "2.3.0.0-5678"
-      json_payload['commandParams']['original_stack'] = "HDP-2.3"
-      json_payload['commandParams']['target_stack'] = "HDP-2.3"
-      json_payload['commandParams']['upgrade_direction'] = "downgrade"
-      json_payload['hostLevelParams']['stack_version'] = "2.3"
-      json_payload["configurations"]["cluster-env"]["stack_tools"] = self.get_stack_tools()
-      json_payload["configurations"]["cluster-env"]["stack_features"] = self.get_stack_features()
-
-      # reset config
-      config_dict = ConfigDictionary(json_payload)
-      family_mock.return_value = True
-      get_config_mock.return_value = config_dict
-
-      # reset mock
-      islink_mock.reset_mock()
-
-      # test the function
-      ru_execute = UpgradeSetAll()
-      ru_execute.unlink_all_configs(None)
-
-      # ensure it wasn't called this time
-      self.assertFalse(islink_mock.called)
-
-      with open(json_file_path, "r") as json_file:
-        json_payload = json.load(json_file)
-
-      # alter JSON for a downgrade from 2.2 to 2.2
-      json_payload['commandParams']['version'] = "2.2.0.0-1234"
-      json_payload['commandParams']['downgrade_from_version'] = "2.2.0.0-5678"
-      json_payload['commandParams']['original_stack'] = "HDP-2.2"
-      json_payload['commandParams']['target_stack'] = "HDP-2.2"
-      json_payload['commandParams']['upgrade_direction'] = "downgrade"
-      json_payload['hostLevelParams']['stack_version'] = "2.2"
-      json_payload["configurations"]["cluster-env"]["stack_tools"] = self.get_stack_tools()
-      json_payload["configurations"]["cluster-env"]["stack_features"] = self.get_stack_features()
-
-      # reset config
-      config_dict = ConfigDictionary(json_payload)
-      family_mock.return_value = True
-      get_config_mock.return_value = config_dict
-
-      # reset mock
-      islink_mock.reset_mock()
-
-      # test the function
-      ru_execute = UpgradeSetAll()
-      ru_execute.unlink_all_configs(None)
-
-      # ensure it wasn't called this time
-      self.assertFalse(islink_mock.called)
-
   @patch("os.path.isdir")
   @patch("os.path.islink")
   def test_unlink_configs_missing_backup(self, islink_mock, isdir_mock):

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/test/python/stacks/utils/RMFTestCase.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/utils/RMFTestCase.py b/ambari-server/src/test/python/stacks/utils/RMFTestCase.py
index badaaef..282b542 100644
--- a/ambari-server/src/test/python/stacks/utils/RMFTestCase.py
+++ b/ambari-server/src/test/python/stacks/utils/RMFTestCase.py
@@ -381,5 +381,15 @@ class CallFunctionMock():
       result = other(*self.args, **self.kwargs)
       return self.call_result == result
     return False
-      
+
+def experimental_mock(*args, **kwargs):
+  """
+  Used to disable experimental mocks...
+  :return: 
+  """
+  def decorator(function):
+    def wrapper(*args, **kwargs):
+      return function(*args, **kwargs)
+    return wrapper
+  return decorator
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c4132783/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml
index 9d53714..a397be9 100644
--- a/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml
+++ b/ambari-server/src/test/resources/stacks/HDP/2.1.1/upgrades/upgrade_nonrolling_new_stack.xml
@@ -231,7 +231,7 @@
       <execute-stage title="Restore configuration directories and remove HDP 2.3 symlinks">
         <task xsi:type="execute">
           <script>scripts/ru_set_all.py</script>
-          <function>unlink_all_configs</function>
+          <function>foo_function</function>
         </task>
       </execute-stage>
     </group>