AMBARI-20957. Remove cluster_version use (ncole)

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

Branch: refs/heads/branch-feature-AMBARI-12556
Commit: aaa821cc2455a29b1e83caf5eab98272053d5aa5
Parents: 15c04ed
Author: Nate Cole <nc...@hortonworks.com>
Authored: Mon May 8 15:29:14 2017 -0400
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Tue May 9 10:31:50 2017 -0400

----------------------------------------------------------------------
 .../apache/ambari/annotations/Experimental.java |   5 +
 .../ambari/server/StateRecoveryManager.java     |  30 +-
 .../ambari/server/agent/ExecutionCommand.java   |   5 +
 .../server/checks/AbstractCheckDescriptor.java  |   4 -
 .../HardcodedStackVersionPropertiesCheck.java   |  55 +-
 .../server/checks/InstallPackagesCheck.java     |  16 +-
 .../YarnTimelineServerStatePreservingCheck.java |   6 +-
 .../controller/AmbariActionExecutionHelper.java |  54 +-
 .../AmbariCustomCommandExecutionHelper.java     |  88 +--
 .../AmbariManagementControllerImpl.java         |  68 +-
 .../server/controller/KerberosHelperImpl.java   |   4 +-
 .../ClusterStackVersionResourceProvider.java    | 215 +++---
 .../internal/HostResourceProvider.java          |  19 +-
 .../HostStackVersionResourceProvider.java       |   1 -
 .../RepositoryVersionResourceProvider.java      |  54 +-
 .../internal/ServiceResourceProvider.java       |  19 +-
 .../internal/UpgradeResourceProvider.java       |  10 +-
 .../DistributeRepositoriesActionListener.java   |   9 -
 .../upgrade/HostVersionOutOfSyncListener.java   |  91 +--
 .../listeners/upgrade/StackVersionListener.java |   9 +-
 .../server/orm/dao/ClusterVersionDAO.java       | 233 -------
 .../ambari/server/orm/dao/HostVersionDAO.java   |  22 +
 .../server/orm/entities/ClusterEntity.java      |  17 -
 .../orm/entities/ClusterVersionEntity.java      | 217 ------
 .../server/orm/entities/HostVersionEntity.java  |   5 +-
 .../orm/entities/RepositoryVersionEntity.java   |  11 -
 .../ServiceComponentDesiredStateEntity.java     |   2 +-
 .../upgrades/FinalizeUpgradeAction.java         |   3 -
 .../apache/ambari/server/stack/RepoUtil.java    |   6 +-
 .../stack/UpdateActiveRepoVersionOnStartup.java |  49 +-
 .../org/apache/ambari/server/state/Cluster.java |  82 +--
 .../server/state/cluster/ClusterImpl.java       | 658 +------------------
 .../server/state/cluster/ClustersImpl.java      |  13 -
 .../services/RetryUpgradeActionService.java     |   7 -
 .../server/upgrade/UpgradeCatalog220.java       |   5 +-
 .../main/resources/Ambari-DDL-Derby-CREATE.sql  |  13 -
 .../main/resources/Ambari-DDL-MySQL-CREATE.sql  |  12 -
 .../main/resources/Ambari-DDL-Oracle-CREATE.sql |  12 -
 .../resources/Ambari-DDL-Postgres-CREATE.sql    |  13 -
 .../resources/Ambari-DDL-SQLAnywhere-CREATE.sql |  13 -
 .../resources/Ambari-DDL-SQLServer-CREATE.sql   |  13 -
 .../src/main/resources/META-INF/persistence.xml |   2 -
 .../ambari/server/StateRecoveryManagerTest.java |  66 +-
 .../server/agent/HeartbeatProcessorTest.java    |  31 +-
 .../server/agent/HeartbeatTestHelper.java       |   4 -
 .../server/agent/TestHeartbeatHandler.java      |  31 +-
 .../server/agent/TestHeartbeatMonitor.java      |  14 +-
 .../server/checks/InstallPackagesCheckTest.java |  26 +-
 ...duce2JobHistoryStatePreservingCheckTest.java |   7 -
 ...nTimelineServerStatePreservingCheckTest.java |  11 -
 .../configuration/RecoveryConfigHelperTest.java |  23 +-
 .../AmbariManagementControllerImplTest.java     |  40 +-
 .../AmbariManagementControllerTest.java         |  37 --
 ...ClusterStackVersionResourceProviderTest.java | 136 ++--
 ...leRepositoryVersionResourceProviderTest.java |   3 -
 .../internal/HostResourceProviderTest.java      |   7 -
 .../RepositoryVersionResourceProviderTest.java  |  74 +--
 .../internal/ServiceResourceProviderTest.java   |  43 +-
 .../StackDefinedPropertyProviderTest.java       |   3 -
 .../UpgradeResourceProviderHDP22Test.java       | 318 ---------
 .../internal/UpgradeResourceProviderTest.java   |   8 +-
 .../UpgradeSummaryResourceProviderTest.java     |   2 -
 .../apache/ambari/server/events/EventsTest.java |   3 -
 .../HostVersionOutOfSyncListenerTest.java       |  95 ++-
 .../upgrade/StackVersionListenerTest.java       |   6 -
 .../apache/ambari/server/orm/OrmTestHelper.java |  47 +-
 .../server/orm/dao/ClusterVersionDAOTest.java   | 264 --------
 .../server/orm/dao/HostVersionDAOTest.java      |  34 +-
 .../orm/dao/RepositoryVersionDAOTest.java       |  35 -
 .../ComponentVersionCheckActionTest.java        |  60 +-
 .../upgrades/ConfigureActionTest.java           |   6 -
 .../upgrades/UpgradeActionTest.java             |  45 +-
 .../UpdateActiveRepoVersionOnStartupTest.java   |  60 +-
 .../ambari/server/state/CheckHelperTest.java    |   2 -
 .../server/state/ServiceComponentTest.java      |   3 -
 .../ambari/server/state/UpgradeHelperTest.java  |  21 +-
 .../state/cluster/ClusterDeadlockTest.java      |   3 -
 .../cluster/ClusterEffectiveVersionTest.java    | 305 ---------
 .../server/state/cluster/ClusterTest.java       | 514 ++-------------
 .../state/cluster/ClustersDeadlockTest.java     |   3 -
 .../server/state/cluster/ClustersTest.java      |  26 +-
 .../ConcurrentServiceConfigVersionTest.java     |   3 -
 ...omponentHostConcurrentWriteDeadlockTest.java |   2 -
 .../ambari/server/state/host/HostTest.java      |   6 +-
 .../services/RetryUpgradeActionServiceTest.java |   4 -
 .../svccomphost/ServiceComponentHostTest.java   |  26 +-
 .../server/upgrade/UpgradeCatalog220Test.java   | 106 +--
 .../server/upgrade/UpgradeCatalog242Test.java   |  22 +-
 88 files changed, 704 insertions(+), 4051 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/annotations/Experimental.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/annotations/Experimental.java 
b/ambari-server/src/main/java/org/apache/ambari/annotations/Experimental.java
index f51991c..18e5db7 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/annotations/Experimental.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/annotations/Experimental.java
@@ -39,4 +39,9 @@ public @interface Experimental {
    * @return
    */
   ExperimentalFeature feature();
+
+  /**
+   * Any notes to why the annotation is used or any other action that may be 
useful.
+   */
+  String comment() default "";
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java
index 26e5be8..5a13fb3 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/StateRecoveryManager.java
@@ -20,10 +20,10 @@ package org.apache.ambari.server;
 
 import java.util.List;
 
-import org.apache.ambari.server.orm.dao.ClusterVersionDAO;
 import org.apache.ambari.server.orm.dao.HostVersionDAO;
-import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
+import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO;
 import org.apache.ambari.server.orm.entities.HostVersionEntity;
+import 
org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
 import org.apache.ambari.server.state.RepositoryVersionState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,14 +42,12 @@ public class StateRecoveryManager {
   private HostVersionDAO hostVersionDAO;
 
   @Inject
-  private ClusterVersionDAO clusterVersionDAO;
-
+  private ServiceComponentDesiredStateDAO serviceComponentDAO;
 
   public void doWork() {
     checkHostAndClusterVersions();
   }
 
-
   void checkHostAndClusterVersions() {
     List<HostVersionEntity> hostVersions = hostVersionDAO.findAll();
     for (HostVersionEntity hostVersion : hostVersions) {
@@ -66,18 +64,20 @@ public class StateRecoveryManager {
       }
     }
 
-    List<ClusterVersionEntity> clusterVersions = clusterVersionDAO.findAll();
-    for (ClusterVersionEntity clusterVersion : clusterVersions) {
-      if (clusterVersion.getState().equals(RepositoryVersionState.INSTALLING)) 
{
-        clusterVersion.setState(RepositoryVersionState.INSTALL_FAILED);
+    List<ServiceComponentDesiredStateEntity> components = 
serviceComponentDAO.findAll();
+    for (ServiceComponentDesiredStateEntity component : components) {
+      if (RepositoryVersionState.INSTALLING == component.getRepositoryState()) 
{
+        component.setRepositoryState(RepositoryVersionState.INSTALL_FAILED);
+        serviceComponentDAO.merge(component);
         String msg = String.format(
-                "Recovered state of cluster version %s for cluster %s from %s 
to %s",
-                clusterVersion.getRepositoryVersion().getDisplayName(),
-                clusterVersion.getClusterEntity().getClusterName(),
-                RepositoryVersionState.INSTALLING,
-                RepositoryVersionState.INSTALL_FAILED);
+            "Recovered state of cluster %s of component %s/%s for version %s 
from %s to %s",
+            component.getClusterId(),
+            component.getServiceName(),
+            component.getComponentName(),
+            component.getDesiredRepositoryVersion().getDisplayName(),
+            RepositoryVersionState.INSTALLING,
+            RepositoryVersionState.INSTALL_FAILED);
         LOG.warn(msg);
-        clusterVersionDAO.merge(clusterVersion);
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
index 63eb660..4ab50ea 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
@@ -502,5 +502,10 @@ public class ExecutionCommand extends AgentCommand {
     @Deprecated
     @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES)
     String REPO_VERSION_ID = "repository_version_id";
+
+    /**
+     * Put on hostLevelParams to indicate the version that the component 
should be.
+     */
+    String CURRENT_VERSION = "current_version";
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
index 707c756..2fc1787 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/AbstractCheckDescriptor.java
@@ -28,7 +28,6 @@ import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
-import org.apache.ambari.server.orm.dao.ClusterVersionDAO;
 import org.apache.ambari.server.orm.dao.HostVersionDAO;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.dao.UpgradeDAO;
@@ -65,9 +64,6 @@ public abstract class AbstractCheckDescriptor {
   Provider<Clusters> clustersProvider;
 
   @Inject
-  Provider<ClusterVersionDAO> clusterVersionDAOProvider;
-
-  @Inject
   Provider<HostVersionDAO> hostVersionDaoProvider;
 
   @Inject

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java
index 314d1a7..bec7c9f 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/HardcodedStackVersionPropertiesCheck.java
@@ -27,18 +27,14 @@ import java.util.regex.Pattern;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
-import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
-import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
-import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.state.DesiredConfig;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
+import org.apache.commons.lang.StringUtils;
 
-import com.google.inject.Inject;
-import com.google.inject.Provider;
 import com.google.inject.Singleton;
 
 /**
@@ -53,12 +49,6 @@ import com.google.inject.Singleton;
     required = { UpgradeType.ROLLING, UpgradeType.NON_ROLLING, 
UpgradeType.HOST_ORDERED })
 public class HardcodedStackVersionPropertiesCheck extends 
AbstractCheckDescriptor {
 
-  @Inject
-  private Provider<Clusters> m_clusters;
-
-  @Inject
-  private Provider<ConfigHelper> m_config_helper_provider;
-
   public HardcodedStackVersionPropertiesCheck() {
     super(CheckDescription.HARDCODED_STACK_VERSION_PROPERTIES_CHECK);
   }
@@ -67,18 +57,13 @@ public class HardcodedStackVersionPropertiesCheck extends 
AbstractCheckDescripto
   public void perform(PrerequisiteCheck prerequisiteCheck, PrereqCheckRequest 
request)
       throws AmbariException {
 
-    String stackName = request.getTargetStackId().getStackName();
-    RepositoryVersionEntity rve = repositoryVersionDaoProvider.get().
-      findByStackNameAndVersion(stackName, request.getRepositoryVersion());
-
-    Cluster cluster = m_clusters.get().getCluster(request.getClusterName());
+    Cluster cluster = 
clustersProvider.get().getCluster(request.getClusterName());
 
-    String currentHdpVersion = 
cluster.getCurrentClusterVersion().getRepositoryVersion().getVersion();
-
-    Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs();
+    Set<String> versions = new HashSet<>();
     Set<String> failures = new HashSet<>();
+    Set<String> failedVersions = new HashSet<>();
 
-    Pattern searchPattern = getHardcodeSearchPattern(currentHdpVersion);
+    Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs();
     for (Entry<String, DesiredConfig> configEntry : desiredConfigs.entrySet()) 
{
       String configType = configEntry.getKey();
       DesiredConfig desiredConfig = configEntry.getValue();
@@ -86,23 +71,31 @@ public class HardcodedStackVersionPropertiesCheck extends 
AbstractCheckDescripto
 
       Map<String, String> properties = config.getProperties();
       for (Entry<String, String> property : properties.entrySet()) {
-        if (stringContainsVersionHardcode(property.getValue(), searchPattern)) 
{
-          failures.add(String.format(" %s/%s",
-            configType, property.getKey()));
+
+        // !!! this code is already iterating every config property, so an 
extra loop for the small-ish
+        // numbers of repository versions won't add that much more overhead
+        for (String version : versions) {
+          Pattern searchPattern = getHardcodeSearchPattern(version);
+          if (stringContainsVersionHardcode(property.getValue(), 
searchPattern)) {
+            failedVersions.add(version);
+            failures.add(String.format("%s/%s found a hardcoded value %s",
+              configType, property.getKey(), version));
+          }
         }
       }
+    }
 
-      if (failures.size() > 0) {
-        prerequisiteCheck.setStatus(PrereqCheckStatus.WARNING);
-        String failReason = getFailReason(prerequisiteCheck, request);
+    if (failures.size() > 0) {
+      prerequisiteCheck.setStatus(PrereqCheckStatus.WARNING);
+      String failReason = getFailReason(prerequisiteCheck, request);
 
-        prerequisiteCheck.setFailReason(String.format(failReason, 
currentHdpVersion));
-        prerequisiteCheck.setFailedOn(new LinkedHashSet<>(failures));
+      prerequisiteCheck.setFailReason(String.format(failReason, 
StringUtils.join(failedVersions, ',')));
+      prerequisiteCheck.setFailedOn(new LinkedHashSet<>(failures));
 
-      } else {
-        prerequisiteCheck.setStatus(PrereqCheckStatus.PASS);
-      }
+    } else {
+      prerequisiteCheck.setStatus(PrereqCheckStatus.PASS);
     }
+
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
index 2c20762..ac2116f 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/InstallPackagesCheck.java
@@ -24,7 +24,6 @@ import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
-import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
 import org.apache.ambari.server.orm.entities.HostVersionEntity;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
@@ -75,8 +74,6 @@ public class InstallPackagesCheck extends 
AbstractCheckDescriptor {
       return;
     }
 
-    final ClusterVersionEntity clusterVersion = 
clusterVersionDAOProvider.get().findByClusterAndStackAndVersion(
-        clusterName, targetStackId, repoVersion);
     final Set<String> failedHosts = new HashSet<>();
 
     for (Host host : cluster.getHosts()) {
@@ -98,16 +95,9 @@ public class InstallPackagesCheck extends 
AbstractCheckDescriptor {
       prerequisiteCheck.setFailedOn(new LinkedHashSet<>(failedHosts));
       prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
       prerequisiteCheck.setFailReason(message);
-    } else if (clusterVersion.getState() == 
RepositoryVersionState.INSTALL_FAILED) {
-      String message = MessageFormat.format("Cluster [{0},{1},{2},{3}] is in 
INSTALL_FAILED state because " +
-              "Install Packages failed. Please re-run Install Packages even if 
you placed the failed hosts " +
-              "in Maintenance mode.", cluster.getClusterName(), 
targetStackId.getStackName(),
-          targetStackId.getStackVersion(), repoVersion);
-      LinkedHashSet<String> failedOn = new LinkedHashSet<>();
-      failedOn.add(cluster.getClusterName());
-      prerequisiteCheck.setFailedOn(failedOn);
-      prerequisiteCheck.setStatus(PrereqCheckStatus.FAIL);
-      prerequisiteCheck.setFailReason(message);
+      return;
     }
+
+    prerequisiteCheck.setStatus(PrereqCheckStatus.PASS);
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
index 2200a45..d8dba96 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/checks/YarnTimelineServerStatePreservingCheck.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.controller.PrereqCheckRequest;
 import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.stack.PrereqCheckStatus;
 import org.apache.ambari.server.state.stack.PrerequisiteCheck;
 import 
org.apache.ambari.server.state.stack.UpgradePack.PrerequisiteCheckConfig;
@@ -83,8 +84,9 @@ public class YarnTimelineServerStatePreservingCheck extends 
AbstractCheckDescrip
         String minStackVersion = minStack[1];
         String stackName = cluster.getCurrentStackVersion().getStackName();
         if (minStackName.equals(stackName)) {
-          String currentClusterRepositoryVersion = 
cluster.getCurrentClusterVersion().getRepositoryVersion().getVersion();
-          return VersionUtils.compareVersions(currentClusterRepositoryVersion, 
minStackVersion) >= 0;
+          Service yarnService = cluster.getService("YARN");
+          String currentRepositoryVersion = 
yarnService.getDesiredRepositoryVersion().getVersion();
+          return VersionUtils.compareVersions(currentRepositoryVersion, 
minStackVersion) >= 0;
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java
index 835d607..9fb77e8 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java
@@ -47,13 +47,13 @@ import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.internal.RequestResourceFilter;
 import org.apache.ambari.server.customactions.ActionDefinition;
-import org.apache.ambari.server.orm.dao.ClusterVersionDAO;
-import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
 import org.apache.ambari.server.orm.entities.OperatingSystemEntity;
 import org.apache.ambari.server.orm.entities.RepositoryEntity;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.ComponentInfo;
+import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponentHost;
 import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.state.StackId;
@@ -91,8 +91,6 @@ public class AmbariActionExecutionHelper {
   private MaintenanceStateHelper maintenanceStateHelper;
   @Inject
   private Configuration configs;
-  @Inject
-  private ClusterVersionDAO clusterVersionDAO;
 
   /**
    * Validates the request to execute an action.
@@ -457,7 +455,12 @@ public class AmbariActionExecutionHelper {
       for (Map.Entry<String, String> previousDBConnectorName : 
configs.getPreviousDatabaseConnectorNames().entrySet()) {
         hostLevelParams.put(previousDBConnectorName.getKey(), 
previousDBConnectorName.getValue());
       }
-      addRepoInfoToHostLevelParams(cluster, hostLevelParams, hostName);
+
+      if (StringUtils.isNotBlank(serviceName)) {
+        Service service = cluster.getService(serviceName);
+        addRepoInfoToHostLevelParams(service.getDesiredRepositoryVersion(), 
hostLevelParams, hostName);
+      }
+
 
       Map<String, String> roleParams = execCmd.getRoleParams();
       if (roleParams == null) {
@@ -519,38 +522,35 @@ public class AmbariActionExecutionHelper {
   *
   * */
 
-  private void addRepoInfoToHostLevelParams(Cluster cluster, Map<String, 
String> hostLevelParams, String hostName) throws AmbariException {
-    if (null == cluster) {
+  private void addRepoInfoToHostLevelParams(RepositoryVersionEntity 
repositoryVersion,
+      Map<String, String> hostLevelParams, String hostName) throws 
AmbariException {
+    if (null == repositoryVersion) {
       return;
     }
 
     JsonObject rootJsonObject = new JsonObject();
     JsonArray repositories = new JsonArray();
-    ClusterVersionEntity clusterVersionEntity = 
clusterVersionDAO.findByClusterAndStateCurrent(
-        cluster.getClusterName());
-    if (clusterVersionEntity != null && 
clusterVersionEntity.getRepositoryVersion() != null) {
-      String hostOsFamily = clusters.getHost(hostName).getOsFamily();
-      for (OperatingSystemEntity operatingSystemEntity : 
clusterVersionEntity.getRepositoryVersion().getOperatingSystems()) {
-        // ostype in OperatingSystemEntity it's os family. That should be fixed
-        // in OperatingSystemEntity.
-        if (operatingSystemEntity.getOsType().equals(hostOsFamily)) {
-          for (RepositoryEntity repositoryEntity : 
operatingSystemEntity.getRepositories()) {
-            JsonObject repositoryInfo = new JsonObject();
-            repositoryInfo.addProperty("base_url", 
repositoryEntity.getBaseUrl());
-            repositoryInfo.addProperty("repo_name", 
repositoryEntity.getName());
-            repositoryInfo.addProperty("repo_id", 
repositoryEntity.getRepositoryId());
-
-            repositories.add(repositoryInfo);
-          }
-          rootJsonObject.add("repositories", repositories);
+
+    String hostOsFamily = clusters.getHost(hostName).getOsFamily();
+    for (OperatingSystemEntity operatingSystemEntity : 
repositoryVersion.getOperatingSystems()) {
+      // ostype in OperatingSystemEntity it's os family. That should be fixed
+      // in OperatingSystemEntity.
+      if (operatingSystemEntity.getOsType().equals(hostOsFamily)) {
+        for (RepositoryEntity repositoryEntity : 
operatingSystemEntity.getRepositories()) {
+          JsonObject repositoryInfo = new JsonObject();
+          repositoryInfo.addProperty("base_url", 
repositoryEntity.getBaseUrl());
+          repositoryInfo.addProperty("repo_name", repositoryEntity.getName());
+          repositoryInfo.addProperty("repo_id", 
repositoryEntity.getRepositoryId());
+
+          repositories.add(repositoryInfo);
         }
+        rootJsonObject.add("repositories", repositories);
       }
     }
 
     hostLevelParams.put(REPO_INFO, rootJsonObject.toString());
 
-    StackId stackId = cluster.getCurrentStackVersion();
-    hostLevelParams.put(STACK_NAME, stackId.getStackName());
-    hostLevelParams.put(STACK_VERSION, stackId.getStackVersion());
+    hostLevelParams.put(STACK_NAME, repositoryVersion.getStackName());
+    hostLevelParams.put(STACK_VERSION, repositoryVersion.getStackVersion());
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
index 1d43093..617d7c0 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
@@ -76,10 +76,7 @@ import 
org.apache.ambari.server.controller.internal.RequestOperationLevel;
 import org.apache.ambari.server.controller.internal.RequestResourceFilter;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.metadata.ActionMetadata;
-import org.apache.ambari.server.orm.dao.ClusterVersionDAO;
 import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
-import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO;
-import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
 import org.apache.ambari.server.orm.entities.OperatingSystemEntity;
 import org.apache.ambari.server.orm.entities.RepositoryEntity;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
@@ -96,7 +93,6 @@ import org.apache.ambari.server.state.HostState;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.PropertyInfo.PropertyType;
 import org.apache.ambari.server.state.RepositoryInfo;
-import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentHost;
@@ -178,15 +174,8 @@ public class AmbariCustomCommandExecutionHelper {
   private OsFamily os_family;
 
   @Inject
-  private ClusterVersionDAO clusterVersionDAO;
-
-  @Inject
   private HostRoleCommandDAO hostRoleCommandDAO;
 
-  @Inject
-  private ServiceComponentDesiredStateDAO serviceComponentDAO;
-
-
   private Map<String, Map<String, Map<String, String>>> 
configCredentialsForService = new HashMap<>();
 
   protected static final String SERVICE_CHECK_COMMAND_NAME = "SERVICE_CHECK";
@@ -338,8 +327,6 @@ public class AmbariCustomCommandExecutionHelper {
     StackInfo stackInfo = ambariMetaInfo.getStack
        (stackId.getStackName(), stackId.getStackVersion());
 
-    ClusterVersionEntity effectiveClusterVersion = 
cluster.getEffectiveClusterVersion();
-
     CustomCommandDefinition customCommandDefinition = null;
     ComponentInfo ci = serviceInfo.getComponentByName(componentName);
     if(ci != null){
@@ -493,8 +480,17 @@ public class AmbariCustomCommandExecutionHelper {
       commandParams.put(SERVICE_PACKAGE_FOLDER, 
serviceInfo.getServicePackageFolder());
       commandParams.put(HOOKS_FOLDER, stackInfo.getStackHooksFolder());
 
-      if (effectiveClusterVersion != null) {
-       commandParams.put(KeyNames.VERSION, 
effectiveClusterVersion.getRepositoryVersion().getVersion());
+      RepositoryVersionEntity repoVersion = null;
+      if (null != component) {
+        repoVersion = component.getDesiredRepositoryVersion();
+      }
+
+      if (null == repoVersion && null != clusterService) {
+        repoVersion = clusterService.getDesiredRepositoryVersion();
+      }
+
+      if (repoVersion != null) {
+       commandParams.put(KeyNames.VERSION, repoVersion.getVersion());
       }
 
       Map<String, String> roleParams = execCmd.getRoleParams();
@@ -1370,36 +1366,15 @@ public class AmbariCustomCommandExecutionHelper {
     // !!! try to find the component repo first
     if (null != component) {
       repositoryEntity = component.getDesiredRepositoryVersion();
-    }
-
-    if (null == component) {
+    } else {
       LOG.info("Service component not passed in, attempt to resolve the 
repository for cluster {}",
           cluster.getClusterName());
     }
 
-    if (null == repositoryEntity) {
-
-      ClusterVersionEntity cve = cluster.getCurrentClusterVersion();
-
-      if (null == cve) {
-        List<ClusterVersionEntity> list = 
clusterVersionDAO.findByClusterAndState(cluster.getClusterName(),
-            RepositoryVersionState.INIT);
+    if (null == repositoryEntity && null != component) {
+      Service service = cluster.getService(component.getServiceName());
 
-        if (!list.isEmpty()) {
-          if (list.size() > 1) {
-            throw new AmbariException(String.format("The cluster can only be 
initialized by one version: %s found",
-                list.size()));
-          } else {
-            cve = list.get(0);
-          }
-        }
-      }
-
-      if (null != cve && null != cve.getRepositoryVersion()) {
-        repositoryEntity = cve.getRepositoryVersion();
-      } else {
-        LOG.info("Cluster {} has no specific Repository Versions.  Using 
stack-defined values", cluster.getClusterName());
-      }
+      repositoryEntity = service.getDesiredRepositoryVersion();
     }
 
     if (null == repositoryEntity) {
@@ -1429,16 +1404,18 @@ public class AmbariCustomCommandExecutionHelper {
     String clusterHostInfoJson = "{}";
 
     if (null != cluster) {
-      clusterHostInfo = StageUtils.getClusterHostInfo(
-          cluster);
+      clusterHostInfo = StageUtils.getClusterHostInfo(cluster);
+
       // Important, because this runs during Stack Uprade, it needs to use the 
effective Stack Id.
-      hostParamsStage = createDefaultHostParams(cluster, stackId);
+      hostParamsStage = createDefaultHostParams(cluster, null);
+
       String componentName = null;
       String serviceName = null;
       if (actionExecContext.getOperationLevel() != null) {
         componentName = 
actionExecContext.getOperationLevel().getHostComponentName();
         serviceName = actionExecContext.getOperationLevel().getServiceName();
       }
+
       if (serviceName != null && componentName != null) {
         ComponentInfo componentInfo = ambariMetaInfo.getComponent(
                 stackId.getStackName(), stackId.getStackVersion(),
@@ -1473,12 +1450,16 @@ public class AmbariCustomCommandExecutionHelper {
         hostParamsStageJson);
   }
 
-  Map<String, String> createDefaultHostParams(Cluster cluster) throws 
AmbariException {
+  Map<String, String> createDefaultHostParams(Cluster cluster, 
RepositoryVersionEntity repositoryVersion) throws AmbariException {
     StackId stackId = cluster.getDesiredStackVersion();
-    return createDefaultHostParams(cluster, stackId);
-  }
+    if (null == stackId && null != repositoryVersion) {
+      stackId = repositoryVersion.getStackId();
+    }
+
+    if (null == stackId) {
+      throw new AmbariException(String.format("Could not find desired stack id 
for cluster %s", cluster.getClusterName()));
+    }
 
-  Map<String, String> createDefaultHostParams(Cluster cluster, StackId 
stackId) throws AmbariException{
     TreeMap<String, String> hostLevelParams = new TreeMap<>();
     hostLevelParams.put(JDK_LOCATION, 
managementController.getJdkResourceUrl());
     hostLevelParams.put(JAVA_HOME, managementController.getJavaHome());
@@ -1501,14 +1482,10 @@ public class AmbariCustomCommandExecutionHelper {
     String notManagedHdfsPathList = gson.toJson(notManagedHdfsPathSet);
     hostLevelParams.put(NOT_MANAGED_HDFS_PATH_LIST, notManagedHdfsPathList);
 
-    ClusterVersionEntity clusterVersionEntity = 
clusterVersionDAO.findByClusterAndStateCurrent(cluster.getClusterName());
-    if (clusterVersionEntity == null) {
-      List<ClusterVersionEntity> clusterVersionEntityList = clusterVersionDAO
-              .findByClusterAndState(cluster.getClusterName(), 
RepositoryVersionState.INSTALLING);
-      if (!clusterVersionEntityList.isEmpty()) {
-        clusterVersionEntity = clusterVersionEntityList.iterator().next();
-      }
+    if (null != repositoryVersion) {
+      hostLevelParams.put(KeyNames.CURRENT_VERSION, 
repositoryVersion.getVersion());
     }
+
     for (Map.Entry<String, String> dbConnectorName : 
configs.getDatabaseConnectorNames().entrySet()) {
       hostLevelParams.put(dbConnectorName.getKey(), 
dbConnectorName.getValue());
     }
@@ -1516,9 +1493,6 @@ public class AmbariCustomCommandExecutionHelper {
       hostLevelParams.put(previousDBConnectorName.getKey(), 
previousDBConnectorName.getValue());
     }
 
-    if (clusterVersionEntity != null) {
-      hostLevelParams.put("current_version", 
clusterVersionEntity.getRepositoryVersion().getVersion());
-    }
 
     return hostLevelParams;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/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 e2bd50f..ab9b879 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
@@ -110,7 +110,6 @@ import org.apache.ambari.server.metadata.ActionMetadata;
 import org.apache.ambari.server.metadata.RoleCommandOrder;
 import org.apache.ambari.server.metadata.RoleCommandOrderProvider;
 import org.apache.ambari.server.orm.dao.ClusterDAO;
-import org.apache.ambari.server.orm.dao.ClusterVersionDAO;
 import org.apache.ambari.server.orm.dao.ExtensionDAO;
 import org.apache.ambari.server.orm.dao.ExtensionLinkDAO;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
@@ -119,7 +118,6 @@ import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.dao.WidgetDAO;
 import org.apache.ambari.server.orm.dao.WidgetLayoutDAO;
 import org.apache.ambari.server.orm.entities.ClusterEntity;
-import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
 import org.apache.ambari.server.orm.entities.ExtensionEntity;
 import org.apache.ambari.server.orm.entities.ExtensionLinkEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
@@ -171,7 +169,6 @@ import 
org.apache.ambari.server.state.PropertyDependencyInfo;
 import org.apache.ambari.server.state.PropertyInfo;
 import org.apache.ambari.server.state.PropertyInfo.PropertyType;
 import org.apache.ambari.server.state.RepositoryInfo;
-import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.SecurityType;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
@@ -303,8 +300,6 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
   @Inject
   private CredentialStoreService credentialStoreService;
   @Inject
-  private ClusterVersionDAO clusterVersionDAO;
-  @Inject
   private SettingDAO settingDAO;
 
   private MaintenanceStateHelper maintenanceStateHelper;
@@ -495,17 +490,6 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
     }
     // Create cluster widgets and layouts
     initializeWidgetsAndLayouts(c, null);
-
-    if (null != versionEntity) {
-      ClusterVersionDAO clusterVersionDAO = 
injector.getInstance(ClusterVersionDAO.class);
-
-      ClusterVersionEntity clusterVersion = 
clusterVersionDAO.findByClusterAndStackAndVersion(request.getClusterName(), 
stackId,
-          request.getRepositoryVersion());
-
-      if (null == clusterVersion) {
-        c.createClusterVersion(stackId, versionEntity.getVersion(), 
getAuthName(), RepositoryVersionState.INIT);
-      }
-    }
   }
 
   @Override
@@ -1719,8 +1703,6 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
 
       cluster.setCurrentStackVersion(desiredVersion);
     }
-    // Stack Upgrade: unlike the workflow for creating a cluster, updating a 
cluster via the API will not
-    // create any ClusterVersionEntity changes because those have to go 
through the Stack Upgrade process.
 
     boolean requiresHostListUpdate =
         request.getHostNames() != null && !request.getHostNames().isEmpty();
@@ -2193,7 +2175,7 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
                                 Map<String, String> commandParamsInp,
                                 ServiceComponentHostEvent event,
                                 boolean skipFailure,
-                                ClusterVersionEntity effectiveClusterVersion,
+                                RepositoryVersionEntity repoVersion,
                                 boolean isUpgradeSuspended,
                                 DatabaseType databaseType,
                                 Map<String, DesiredConfig> 
clusterDesiredConfigs
@@ -2316,8 +2298,8 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
         commandParams.put(MAX_DURATION_OF_RETRIES, 
Integer.toString(retryMaxTime));
         commandParams.put(COMMAND_RETRY_ENABLED, 
Boolean.toString(retryEnabled));
 
-        if (effectiveClusterVersion != null) {
-         commandParams.put(VERSION, 
effectiveClusterVersion.getRepositoryVersion().getVersion());
+        if (repoVersion != null) {
+         commandParams.put(VERSION, repoVersion.getVersion());
         }
         if (script.getTimeout() > 0) {
           scriptCommandTimeout = String.valueOf(script.getTimeout());
@@ -2369,20 +2351,6 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
     hostParams.put(REPO_INFO, repoInfo);
     hostParams.putAll(getRcaParameters());
 
-    // use the effective cluster version here since this command might happen
-    // in the context of an upgrade and we should send the repo ID which 
matches
-    // the version being send down
-    RepositoryVersionEntity repoVersion = null;
-    if (null != effectiveClusterVersion) {
-      repoVersion = effectiveClusterVersion.getRepositoryVersion();
-    } else {
-      List<ClusterVersionEntity> list = 
clusterVersionDAO.findByClusterAndState(cluster.getClusterName(),
-          RepositoryVersionState.INIT);
-      if (1 == list.size()) {
-        repoVersion = list.get(0).getRepositoryVersion();
-      }
-    }
-
     if (null != repoVersion) {
       try {
         VersionDefinitionXml xml = repoVersion.getRepositoryXml();
@@ -2473,6 +2441,7 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
 
     
execCmd.setAvailableServicesFromServiceInfoMap(ambariMetaInfo.getServices(stackId.getStackName(),
 stackId.getStackVersion()));
     
execCmd.setRepositoryFile(customCommandExecutionHelper.getCommandRepository(cluster,
 component, host));
+    hostParams.put(KeyNames.CURRENT_VERSION, repoVersion.getVersion());
 
     if ((execCmd != null) && 
(execCmd.getConfigurationTags().containsKey("cluster-env"))) {
       LOG.debug("AmbariManagementControllerImpl.createHostAction: created 
ExecutionCommand for host {}, role {}, roleCommand {}, and command ID {}, with 
cluster-env tags {}",
@@ -2598,9 +2567,6 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
       return requestStages;
     }
 
-    // caching effective cluster version
-    ClusterVersionEntity effectiveClusterVersion = 
cluster.getEffectiveClusterVersion();
-
     // caching upgrade suspended
     boolean isUpgradeSuspended = cluster.isUpgradeSuspended();
 
@@ -2627,7 +2593,7 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
 
       String clusterHostInfoJson = 
StageUtils.getGson().toJson(clusterHostInfo);
       String hostParamsJson = StageUtils.getGson().toJson(
-          customCommandExecutionHelper.createDefaultHostParams(cluster));
+          customCommandExecutionHelper.createDefaultHostParams(cluster, null));
 
       Stage stage = createNewStage(requestStages.getLastStageId(), cluster,
           requestStages.getId(), 
requestProperties.get(REQUEST_CONTEXT_PROPERTY),
@@ -2924,6 +2890,7 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
                 requestParameters = new HashMap<>();
               }
               requestParameters.put(CLUSTER_PHASE_PROPERTY, 
requestProperties.get(CLUSTER_PHASE_PROPERTY));
+
             }
 
             Map<String, Map<String, String>> configurations = new TreeMap<>();
@@ -2943,8 +2910,11 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
               LOG.info("Skipping create of INSTALL task for {} on {}.", 
scHost.getServiceComponentName(), scHost.getHostName());
               scHost.setState(State.INSTALLED);
             } else {
+              // !!! can never be null
+              RepositoryVersionEntity repoVersion = 
serviceComponent.getDesiredRepositoryVersion();
+
               createHostAction(cluster, stage, scHost, configurations, 
configurationAttributes, configTags,
-                roleCommand, requestParameters, event, skipFailure, 
effectiveClusterVersion, isUpgradeSuspended,
+                roleCommand, requestParameters, event, skipFailure, 
repoVersion, isUpgradeSuspended,
                 databaseType, clusterDesiredConfigs);
             }
 
@@ -3068,7 +3038,11 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
                                               RoleCommand roleCommand) throws 
AmbariException {
     Map<String, Set<String>> clusterHostInfo = 
StageUtils.getClusterHostInfo(cluster);
     String clusterHostInfoJson = StageUtils.getGson().toJson(clusterHostInfo);
-    Map<String, String> hostParamsCmd = 
customCommandExecutionHelper.createDefaultHostParams(cluster);
+
+
+    Map<String, String> hostParamsCmd = 
customCommandExecutionHelper.createDefaultHostParams(
+        cluster, scHost.getServiceComponent().getDesiredRepositoryVersion());
+
     Stage stage = createNewStage(0, cluster,
                                  1, "",
                                  clusterHostInfoJson, "{}", "");
@@ -3081,12 +3055,19 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
         configurationAttributes =
         new TreeMap<>();
 
-    ClusterVersionEntity effectiveClusterVersion = 
cluster.getEffectiveClusterVersion();
+    RepositoryVersionEntity repoVersion = null;
+    if (null != scHost.getServiceComponent().getDesiredRepositoryVersion()) {
+      repoVersion = scHost.getServiceComponent().getDesiredRepositoryVersion();
+    } else {
+      Service service = cluster.getService(scHost.getServiceName());
+      repoVersion = service.getDesiredRepositoryVersion();
+    }
+
     boolean isUpgradeSuspended = cluster.isUpgradeSuspended();
     DatabaseType databaseType = configs.getDatabaseType();
     Map<String, DesiredConfig> clusterDesiredConfigs = 
cluster.getDesiredConfigs();
     createHostAction(cluster, stage, scHost, configurations, 
configurationAttributes, configTags,
-                     roleCommand, null, null, false, effectiveClusterVersion, 
isUpgradeSuspended, databaseType,
+                     roleCommand, null, null, false, repoVersion, 
isUpgradeSuspended, databaseType,
                      clusterDesiredConfigs);
     ExecutionCommand ec = 
stage.getExecutionCommands().get(scHost.getHostName()).get(0).getExecutionCommand();
 
@@ -4010,6 +3991,7 @@ public class AmbariManagementControllerImpl implements 
AmbariManagementControlle
     if (null != cluster) {
       stackId = cluster.getDesiredStackVersion();
     }
+
     ExecuteCommandJson jsons = 
customCommandExecutionHelper.getCommandJson(actionExecContext, cluster, 
stackId);
     String commandParamsForStage = jsons.getCommandParamsForStage();
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
index 6687942..8a5731b 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
@@ -1689,7 +1689,7 @@ public class KerberosHelperImpl implements KerberosHelper 
{
     // Gather data needed to create stages and tasks...
     Map<String, Set<String>> clusterHostInfo = 
StageUtils.getClusterHostInfo(cluster);
     String clusterHostInfoJson = StageUtils.getGson().toJson(clusterHostInfo);
-    Map<String, String> hostParams = 
customCommandExecutionHelper.createDefaultHostParams(cluster);
+    Map<String, String> hostParams = 
customCommandExecutionHelper.createDefaultHostParams(cluster, null);
     String hostParamsJson = StageUtils.getGson().toJson(hostParams);
     String ambariServerHostname = StageUtils.getHostName();
     ServiceComponentHostServerActionEvent event = new 
ServiceComponentHostServerActionEvent(
@@ -1889,7 +1889,7 @@ public class KerberosHelperImpl implements KerberosHelper 
{
       // Gather data needed to create stages and tasks...
       Map<String, Set<String>> clusterHostInfo = 
StageUtils.getClusterHostInfo(cluster);
       String clusterHostInfoJson = 
StageUtils.getGson().toJson(clusterHostInfo);
-      Map<String, String> hostParams = 
customCommandExecutionHelper.createDefaultHostParams(cluster);
+      Map<String, String> hostParams = 
customCommandExecutionHelper.createDefaultHostParams(cluster, null);
       String hostParamsJson = StageUtils.getGson().toJson(hostParams);
       String ambariServerHostname = StageUtils.getHostName();
       ServiceComponentHostServerActionEvent event = new 
ServiceComponentHostServerActionEvent(

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/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 fd52a3f..774ba0c 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
@@ -35,7 +35,6 @@ import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.StaticallyInject;
 import org.apache.ambari.server.actionmanager.ActionManager;
-import org.apache.ambari.server.actionmanager.HostRoleCommandFactory;
 import org.apache.ambari.server.actionmanager.RequestFactory;
 import org.apache.ambari.server.actionmanager.Stage;
 import org.apache.ambari.server.actionmanager.StageFactory;
@@ -56,11 +55,9 @@ 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.ClusterVersionDAO;
 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.ClusterVersionEntity;
 import org.apache.ambari.server.orm.entities.HostVersionEntity;
 import org.apache.ambari.server.orm.entities.OperatingSystemEntity;
 import org.apache.ambari.server.orm.entities.RepositoryEntity;
@@ -68,7 +65,6 @@ import 
org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.orm.entities.UpgradeEntity;
 import org.apache.ambari.server.security.authorization.RoleAuthorization;
-import org.apache.ambari.server.serveraction.upgrades.FinalizeUpgradeAction;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.ComponentInfo;
@@ -81,6 +77,7 @@ import 
org.apache.ambari.server.state.repository.VersionDefinitionXml;
 import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
 import org.apache.ambari.server.utils.StageUtils;
 import org.apache.ambari.server.utils.VersionUtils;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.math.NumberUtils;
 
@@ -88,7 +85,6 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
-import com.google.inject.Injector;
 import com.google.inject.Provider;
 import com.google.inject.persist.Transactional;
 
@@ -156,18 +152,12 @@ public class ClusterStackVersionResourceProvider extends 
AbstractControllerResou
       .build();
 
   @Inject
-  private static ClusterVersionDAO clusterVersionDAO;
-
-  @Inject
   private static HostVersionDAO hostVersionDAO;
 
   @Inject
   private static RepositoryVersionDAO repositoryVersionDAO;
 
   @Inject
-  private static HostRoleCommandFactory hostRoleCommandFactory;
-
-  @Inject
   private static Provider<AmbariActionExecutionHelper> actionExecutionHelper;
 
   @Inject
@@ -180,20 +170,15 @@ public class ClusterStackVersionResourceProvider extends 
AbstractControllerResou
   private static Configuration configuration;
 
   @Inject
-  private static Injector injector;
-
-  @Inject
   private static HostComponentStateDAO hostComponentStateDAO;
 
   @Inject
   private static RepositoryVersionHelper repoVersionHelper;
 
-  /**
-   * We have to include such a hack here, because if we
-   * make finalizeUpgradeAction field static and request injection
-   * for it, there will be a circle dependency error
-   */
-  private FinalizeUpgradeAction finalizeUpgradeAction = 
injector.getInstance(FinalizeUpgradeAction.class);
+
+
+  @Inject
+  private static Provider<Clusters> clusters;
 
   /**
    * Constructor.
@@ -208,70 +193,107 @@ public class ClusterStackVersionResourceProvider extends 
AbstractControllerResou
   }
 
   @Override
+  @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES,
+    comment = "this is a fake response until the UI no longer uses the 
endpoint")
   public Set<Resource> getResourcesAuthorized(Request request, Predicate 
predicate) throws
       SystemException, UnsupportedPropertyException, NoSuchResourceException, 
NoSuchParentResourceException {
     final Set<Resource> resources = new HashSet<>();
+
     final Set<String> requestedIds = getRequestPropertyIds(request, predicate);
     final Set<Map<String, Object>> propertyMaps = getPropertyMaps(predicate);
 
-    List<ClusterVersionEntity> requestedEntities = new ArrayList<>();
-    for (Map<String, Object> propertyMap: propertyMaps) {
-      final String clusterName = 
propertyMap.get(CLUSTER_STACK_VERSION_CLUSTER_NAME_PROPERTY_ID).toString();
-      final Long id;
-      if (propertyMap.get(CLUSTER_STACK_VERSION_ID_PROPERTY_ID) == null && 
propertyMaps.size() == 1) {
-        requestedEntities = clusterVersionDAO.findByCluster(clusterName);
-      } else {
-        try {
-          id = 
Long.parseLong(propertyMap.get(CLUSTER_STACK_VERSION_ID_PROPERTY_ID).toString());
-        } catch (Exception ex) {
-          throw new SystemException("Stack version should have numerical id");
-        }
-        final ClusterVersionEntity entity = clusterVersionDAO.findByPK(id);
-        if (entity == null) {
-          throw new NoSuchResourceException("There is no stack version with id 
" + id);
-        } else {
-          requestedEntities.add(entity);
-        }
+    if (1 != propertyMaps.size()) {
+      throw new SystemException("Cannot request more than one resource");
+    }
+
+    Map<String, Object> propertyMap = propertyMaps.iterator().next();
+
+    String clusterName = 
propertyMap.get(CLUSTER_STACK_VERSION_CLUSTER_NAME_PROPERTY_ID).toString();
+    final Cluster cluster;
+    try {
+      cluster = clusters.get().getCluster(clusterName);
+    } catch (AmbariException e) {
+      throw new SystemException(e.getMessage(), e);
+    }
+
+    Set<Long> requestedEntities = new HashSet<>();
+
+    if (propertyMap.containsKey(CLUSTER_STACK_VERSION_ID_PROPERTY_ID)) {
+      Long id = 
Long.parseLong(propertyMap.get(CLUSTER_STACK_VERSION_ID_PROPERTY_ID).toString());
+      requestedEntities.add(id);
+    } else {
+      cluster.getCurrentStackVersion();
+      List<RepositoryVersionEntity> entities = 
repositoryVersionDAO.findByStack(cluster.getCurrentStackVersion());
+
+      for (RepositoryVersionEntity entity : entities) {
+        requestedEntities.add(entity.getId());
       }
     }
 
-    for (ClusterVersionEntity entity: requestedEntities) {
+    if (requestedEntities.isEmpty()) {
+      throw new SystemException("Could not find any repositories to show");
+    }
+
+
+    for (Long repositoryVersionId : requestedEntities) {
       final Resource resource = new 
ResourceImpl(Resource.Type.ClusterStackVersion);
 
-      final Map<String, List<String>> hostStates = new HashMap<>();
+      RepositoryVersionEntity repositoryVersion = 
repositoryVersionDAO.findByPK(repositoryVersionId);
+
+      final Map<RepositoryVersionState, List<String>> hostStates = new 
HashMap<>();
       for (RepositoryVersionState state: RepositoryVersionState.values()) {
-        hostStates.put(state.name(), new ArrayList<String>());
+        hostStates.put(state, new ArrayList<String>());
       }
 
-      StackEntity repoVersionStackEntity = 
entity.getRepositoryVersion().getStack();
+      StackEntity repoVersionStackEntity = repositoryVersion.getStack();
       StackId repoVersionStackId = new StackId(repoVersionStackEntity);
 
       for (HostVersionEntity hostVersionEntity : 
hostVersionDAO.findByClusterStackAndVersion(
-          entity.getClusterEntity().getClusterName(), repoVersionStackId,
-          entity.getRepositoryVersion().getVersion())) {
+          clusterName, repoVersionStackId, repositoryVersion.getVersion())) {
 
-        
hostStates.get(hostVersionEntity.getState().name()).add(hostVersionEntity.getHostName());
+        
hostStates.get(hostVersionEntity.getState()).add(hostVersionEntity.getHostName());
       }
 
-      StackId stackId = new StackId(entity.getRepositoryVersion().getStack());
-      RepositoryVersionEntity repoVerEntity = 
repositoryVersionDAO.findByStackAndVersion(
-          stackId, entity.getRepositoryVersion().getVersion());
-
-      setResourceProperty(resource, 
CLUSTER_STACK_VERSION_CLUSTER_NAME_PROPERTY_ID, 
entity.getClusterEntity().getClusterName(), requestedIds);
+      setResourceProperty(resource, 
CLUSTER_STACK_VERSION_CLUSTER_NAME_PROPERTY_ID, clusterName, requestedIds);
       setResourceProperty(resource, 
CLUSTER_STACK_VERSION_HOST_STATES_PROPERTY_ID, hostStates, requestedIds);
-      setResourceProperty(resource, CLUSTER_STACK_VERSION_ID_PROPERTY_ID, 
entity.getId(), requestedIds);
-      setResourceProperty(resource, CLUSTER_STACK_VERSION_STACK_PROPERTY_ID, 
stackId.getStackName(), requestedIds);
-      setResourceProperty(resource, CLUSTER_STACK_VERSION_STATE_PROPERTY_ID, 
entity.getState().name(), requestedIds);
-      setResourceProperty(resource, CLUSTER_STACK_VERSION_VERSION_PROPERTY_ID, 
stackId.getStackVersion(), requestedIds);
-      if (repoVerEntity!=null) {
-        Long repoVersionId = repoVerEntity.getId();
-        setResourceProperty(resource, 
CLUSTER_STACK_VERSION_REPOSITORY_VERSION_PROPERTY_ID, repoVersionId, 
requestedIds);
+      setResourceProperty(resource, CLUSTER_STACK_VERSION_ID_PROPERTY_ID, 
repositoryVersion.getId(), requestedIds);
+      setResourceProperty(resource, CLUSTER_STACK_VERSION_STACK_PROPERTY_ID, 
repoVersionStackId.getStackName(), requestedIds);
+      setResourceProperty(resource, CLUSTER_STACK_VERSION_VERSION_PROPERTY_ID, 
repoVersionStackId.getStackVersion(), requestedIds);
+
+
+      @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES,
+          comment = "this is a fake status until the UI can handle services 
that are on their own")
+      RepositoryVersionState finalState = null;
+
+      for (RepositoryVersionState state : 
EnumSet.of(RepositoryVersionState.INSTALLING,
+          RepositoryVersionState.INSTALL_FAILED, 
RepositoryVersionState.OUT_OF_SYNC)) {
+
+        if (CollectionUtils.isNotEmpty(hostStates.get(state))) {
+          finalState = state;
+          break;
+        }
       }
 
+      if (null == finalState) {
+        int count = cluster.getClusterSize();
+
+        for (RepositoryVersionState state : 
EnumSet.of(RepositoryVersionState.INSTALLED, RepositoryVersionState.CURRENT)) {
+          if (count == CollectionUtils.size(hostStates.get(state))) {
+            finalState = state;
+            break;
+          }
+        }
+      }
+      // !!! end ExperimentalFeature
+
+      setResourceProperty(resource, CLUSTER_STACK_VERSION_STATE_PROPERTY_ID, 
finalState, requestedIds);
+      setResourceProperty(resource, 
CLUSTER_STACK_VERSION_REPOSITORY_VERSION_PROPERTY_ID, 
repositoryVersion.getId(), requestedIds);
+
       if (predicate == null || predicate.evaluate(resource)) {
         resources.add(resource);
       }
     }
+
     return resources;
   }
 
@@ -380,86 +402,47 @@ public class ClusterStackVersionResourceProvider extends 
AbstractControllerResou
       StackId stackId, boolean forceInstalled, Map<String, Object> propertyMap)
       throws AmbariException, SystemException {
 
-    final String clusterName = cluster.getClusterName();
-    final String authName = getManagementController().getAuthName();
     final String desiredRepoVersion = repoVersionEntity.getVersion();
 
-    ClusterVersionEntity clusterVersionEntity = 
clusterVersionDAO.findByClusterAndStackAndVersion(
-        clusterName, stackId, desiredRepoVersion);
-
     // get all of the hosts eligible for stack distribution
     List<Host> hosts = Lists.newArrayList(cluster.getHosts());
 
-    /*
-    If there is a repository that is already ATTEMPTED to be installed and the 
version
-    is GREATER than the one trying to install, we must fail (until we can 
support that via Patch Upgrades)
 
-    For example:
+    for (Host host : hosts) {
+      for (HostVersionEntity hostVersion : host.getAllHostVersions()) {
+        RepositoryVersionEntity hostRepoVersion = 
hostVersion.getRepositoryVersion();
 
-    1. Install 2.3.0.0
-    2. Register and Install 2.5.0.0 (with or without package-version; it gets 
computed correctly)
-    3. Register 2.4 (without package-version)
-
-    Installation of 2.4 will fail because the way agents invoke installation 
is to
-    install by name.  if the package-version is not known, then the 'newest' 
is ALWAYS installed.
-    In this case, 2.5.0.0.  2.4 is never picked up.
-    */
-    for (ClusterVersionEntity clusterVersion : 
clusterVersionDAO.findByCluster(cluster.getClusterName())) {
-      RepositoryVersionEntity clusterRepoVersion = 
clusterVersion.getRepositoryVersion();
-
-      int compare = compareVersions(clusterRepoVersion.getVersion(), 
desiredRepoVersion);
+        // !!! ignore stack differences
+        if 
(!hostRepoVersion.getStackName().equals(repoVersionEntity.getStackName())) {
+          continue;
+        }
 
-      // ignore earlier versions
-      if (compare <= 0) {
-        continue;
-      }
+        int compare = compareVersions(hostRepoVersion.getVersion(), 
desiredRepoVersion);
 
-      // !!! the version is greater to the one to install
+        // ignore earlier versions
+        if (compare <= 0) {
+          continue;
+        }
 
-      // if the stacks are different, then don't fail (further check 
same-stack version strings)
-      if (!StringUtils.equals(clusterRepoVersion.getStackName(), 
repoVersionEntity.getStackName())) {
-        continue;
-      }
+        // !!! the version is greater to the one to install
 
-      // if there is no backing VDF for the desired version, allow the 
operation (legacy behavior)
-      if (null == versionDefinitionXml) {
-        continue;
-      }
+        // if there is no backing VDF for the desired version, allow the 
operation (legacy behavior)
+        if (null == versionDefinitionXml) {
+          continue;
+        }
 
-      // backing VDF does not define the package version for any of the hosts, 
cannot install (allows a VDF with package-version)
-      for (Host host : hosts) {
         if 
(StringUtils.isBlank(versionDefinitionXml.getPackageVersion(host.getOsFamily())))
 {
           String msg = String.format("Ambari cannot install version %s.  
Version %s is already installed.",
-            desiredRepoVersion, clusterRepoVersion.getVersion());
+            desiredRepoVersion, hostRepoVersion.getVersion());
           throw new IllegalArgumentException(msg);
         }
       }
     }
 
-    RepositoryVersionState repositoryVersionState = 
RepositoryVersionState.INSTALLING;
-    if (forceInstalled) {
-      repositoryVersionState = RepositoryVersionState.INSTALLED;
-    }
-
-    // if there is no cluster version entity, then create one
-    if (clusterVersionEntity == null) {
-      try {
-        // Create/persist new cluster stack version
-        clusterVersionEntity = cluster.createClusterVersion(stackId, 
desiredRepoVersion, authName,
-            repositoryVersionState);
-      } catch (AmbariException e) {
-        throw new SystemException(
-            String.format("Can not create cluster stack version %s for cluster 
%s",
-                desiredRepoVersion, clusterName), e);
-      }
-    } else {
-      // Move cluster version into the specified state (retry installation)
-      cluster.transitionClusterVersion(stackId, desiredRepoVersion, 
repositoryVersionState);
-    }
 
     // the cluster will create/update all of the host versions to the correct 
state
     List<Host> hostsNeedingInstallCommands = 
cluster.transitionHostsToInstalling(
-        clusterVersionEntity, repoVersionEntity, versionDefinitionXml, 
forceInstalled);
+        repoVersionEntity, versionDefinitionXml, forceInstalled);
 
     RequestStatusResponse response = null;
     if (!forceInstalled) {
@@ -709,7 +692,7 @@ public class ClusterStackVersionResourceProvider extends 
AbstractControllerResou
 
     hostComponentStateDAO.updateVersions(target.getVersion());
     hostVersionDAO.updateVersions(target, current);
-    clusterVersionDAO.updateVersions(clusterId, target, current);
+//    clusterVersionDAO.updateVersions(clusterId, target, current);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
index c244107..7014f08 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
@@ -39,7 +39,6 @@ import 
org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.ConfigurationRequest;
 import org.apache.ambari.server.controller.HostRequest;
 import org.apache.ambari.server.controller.HostResponse;
-import org.apache.ambari.server.controller.MaintenanceStateHelper;
 import org.apache.ambari.server.controller.RequestStatusResponse;
 import org.apache.ambari.server.controller.ServiceComponentHostRequest;
 import org.apache.ambari.server.controller.spi.NoSuchParentResourceException;
@@ -159,9 +158,6 @@ public class HostResourceProvider extends 
AbstractControllerResourceProvider {
       HOST_NAME_PROPERTY_ID}));
 
   @Inject
-  private MaintenanceStateHelper maintenanceStateHelper;
-
-  @Inject
   private OsFamily osFamily;
 
   @Inject
@@ -525,9 +521,6 @@ public class HostResourceProvider extends 
AbstractControllerResourceProvider {
     }
     clusters.updateHostWithClusterAndAttributes(hostClustersMap, 
hostAttributes);
 
-    for (String clusterName : allClusterSet) {
-      clusters.getCluster(clusterName).recalculateAllClusterVersionStates();
-    }
   }
 
   private void createHostResource(Clusters clusters, Set<String> duplicates,
@@ -803,12 +796,9 @@ public class HostResourceProvider extends 
AbstractControllerResourceProvider {
         }
       }
 
-      if (clusterName != null && !clusterName.isEmpty()) {
-        clusters.getCluster(clusterName).recalculateAllClusterVersionStates();
-        if (rackChange) {
-          // Authorization check for this update was performed before we got 
to this point.
-          controller.registerRackChange(clusterName);
-        }
+      if (StringUtils.isNotBlank(clusterName) && rackChange) {
+        // Authorization check for this update was performed before we got to 
this point.
+        controller.registerRackChange(clusterName);
       }
 
       //todo: if attempt was made to update a property other than those
@@ -931,9 +921,6 @@ public class HostResourceProvider extends 
AbstractControllerResourceProvider {
       }
     }
     clusters.publishHostsDeletion(allClustersWithHosts, hostNames);
-    for (String clustername : hostsClusters) {
-      clusters.getCluster(clustername).recalculateAllClusterVersionStates();
-    }
   }
 
   private void validateHostInDeleteFriendlyState(HostRequest hostRequest, 
Clusters clusters, boolean forceDelete) throws AmbariException {

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java
index 71b9b6b..2e03a22 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java
@@ -489,7 +489,6 @@ public class HostStackVersionResourceProvider extends 
AbstractControllerResource
       if (!forceInstallOnNonMemberHost) {
         hostVersEntity.setState(RepositoryVersionState.INSTALLING);
         hostVersionDAO.merge(hostVersEntity);
-        cluster.recalculateClusterVersionState(repoVersionEnt);
       }
       req.persist();
     } catch (AmbariException e) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
index d2f3f8d..a0a3666 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RepositoryVersionResourceProvider.java
@@ -25,6 +25,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
@@ -43,10 +44,10 @@ 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.ClusterVersionDAO;
+import org.apache.ambari.server.orm.dao.HostVersionDAO;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.dao.StackDAO;
-import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
+import org.apache.ambari.server.orm.entities.HostVersionEntity;
 import org.apache.ambari.server.orm.entities.OperatingSystemEntity;
 import org.apache.ambari.server.orm.entities.RepositoryEntity;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
@@ -55,7 +56,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.state.Clusters;
 import org.apache.ambari.server.state.OperatingSystemInfo;
 import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.ServiceInfo;
@@ -64,14 +64,13 @@ import org.apache.ambari.server.state.StackInfo;
 import org.apache.ambari.server.state.repository.ManifestServiceInfo;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
 import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.StringUtils;
 
-import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.gson.Gson;
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 import com.google.inject.persist.Transactional;
 
 /**
@@ -141,23 +140,20 @@ public class RepositoryVersionResourceProvider extends 
AbstractAuthorizedResourc
   private RepositoryVersionDAO repositoryVersionDAO;
 
   @Inject
-  private ClusterVersionDAO clusterVersionDAO;
-
-  @Inject
   private AmbariMetaInfo ambariMetaInfo;
 
   @Inject
   private RepositoryVersionHelper repositoryVersionHelper;
 
-  @Inject
-  private Provider<Clusters> clusters;
-
   /**
    * Data access object used for lookup up stacks.
    */
   @Inject
   private StackDAO stackDAO;
 
+  @Inject
+  HostVersionDAO hostVersionDAO;
+
   /**
    * Create a new resource provider.
    *
@@ -398,22 +394,34 @@ public class RepositoryVersionResourceProvider extends 
AbstractAuthorizedResourc
         throw new NoSuchResourceException("There is no repository version with 
id " + id);
       }
 
-      StackEntity stackEntity = entity.getStack();
-      String stackName = stackEntity.getStackName();
-      String stackVersion = stackEntity.getStackVersion();
-
-      final List<ClusterVersionEntity> clusterVersionEntities = 
clusterVersionDAO.findByStackAndVersion(
-          stackName, stackVersion, entity.getVersion());
-
-      final List<RepositoryVersionState> forbiddenToDeleteStates = 
Lists.newArrayList(
+      final Set<RepositoryVersionState> forbiddenToDeleteStates = 
Sets.newHashSet(
           RepositoryVersionState.CURRENT,
           RepositoryVersionState.INSTALLED,
           RepositoryVersionState.INSTALLING);
-      for (ClusterVersionEntity clusterVersionEntity : clusterVersionEntities) 
{
-        if (clusterVersionEntity.getRepositoryVersion().getId().equals(id) && 
forbiddenToDeleteStates.contains(clusterVersionEntity.getState())) {
-          throw new SystemException("Repository version can't be deleted as it 
is " +
-              clusterVersionEntity.getState().name() + " on cluster " + 
clusterVersionEntity.getClusterEntity().getClusterName());
+
+      List<HostVersionEntity> hostVersions = 
hostVersionDAO.findByRepositoryAndStates(
+          entity, forbiddenToDeleteStates);
+
+      if (CollectionUtils.isNotEmpty(hostVersions)) {
+        Map<RepositoryVersionState, Set<String>> hostsInUse = new HashMap<>();
+
+        for (HostVersionEntity hostVersion : hostVersions) {
+          if (!hostsInUse.containsKey(hostVersion.getState())) {
+            hostsInUse.put(hostVersion.getState(), new HashSet<String>());
+          }
+
+          
hostsInUse.get(hostVersion.getState()).add(hostVersion.getHostName());
         }
+
+        Set<String> errors = new HashSet<>();
+        for (Entry<RepositoryVersionState, Set<String>> entry : 
hostsInUse.entrySet()) {
+          errors.add(String.format("%s on %s", entry.getKey(), 
StringUtils.join(entry.getValue(), ", ")));
+        }
+
+
+        throw new SystemException(
+            String.format("Repository version can't be deleted as it is used 
by the following hosts: %s",
+                StringUtils.join(errors, ';')));
       }
 
       entitiesToBeRemoved.add(entity);

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
index c611037..664ba42 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceResourceProvider.java
@@ -74,6 +74,7 @@ import org.apache.ambari.server.state.ServiceComponentHost;
 import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.Validate;
 
@@ -423,13 +424,25 @@ public class ServiceResourceProvider extends 
AbstractControllerResourceProvider
       String desiredStack = request.getDesiredStack();
       String desiredRepositoryVersion = request.getDesiredRepositoryVersion();
       RepositoryVersionEntity repositoryVersion = null;
-      if( StringUtils.isNotBlank(desiredStack) && 
StringUtils.isNotBlank(desiredRepositoryVersion)){
+      if (StringUtils.isNotBlank(desiredStack) && 
StringUtils.isNotBlank(desiredRepositoryVersion)){
         repositoryVersion = repositoryVersionDAO.findByStackAndVersion(new 
StackId(desiredStack),
             desiredRepositoryVersion);
       }
 
+      if (null == desiredStack) {
+        desiredStack = cluster.getDesiredStackVersion().toString();
+      }
+
+      if (null == repositoryVersion) {
+        List<RepositoryVersionEntity> allVersions = 
repositoryVersionDAO.findByStack(new StackId(desiredStack));
+
+        if (CollectionUtils.isNotEmpty(allVersions)) {
+          repositoryVersion = allVersions.get(0);
+        }
+      }
+
       if (null == repositoryVersion) {
-        repositoryVersion = 
cluster.getCurrentClusterVersion().getRepositoryVersion();
+        throw new AmbariException(String.format("Could not find any 
repositories defined by %s", desiredStack));
       }
 
       Service s = cluster.addService(request.getServiceName(), 
repositoryVersion);
@@ -630,7 +643,7 @@ public class ServiceResourceProvider extends 
AbstractControllerResourceProvider
 
       // Setting Maintenance state for service
       if (null != request.getMaintenanceState()) {
-        if(!AuthorizationHelper.isAuthorized(ResourceType.CLUSTER, 
cluster.getResourceId(), RoleAuthorization.SERVICE_TOGGLE_MAINTENANCE)) {
+        if (!AuthorizationHelper.isAuthorized(ResourceType.CLUSTER, 
cluster.getResourceId(), RoleAuthorization.SERVICE_TOGGLE_MAINTENANCE)) {
           throw new AuthorizationException("The authenticated user is not 
authorized to toggle the maintainence state of services");
         }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/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 b49b66e..7ca6164 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
@@ -36,6 +36,8 @@ import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.ambari.annotations.Experimental;
+import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.RoleCommand;
@@ -755,6 +757,8 @@ public class UpgradeResourceProvider extends 
AbstractControllerResourceProvider
     upgradeContext.setSupportedServices(supportedServices);
     upgradeContext.setScope(scope);
 
+    @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES,
+        comment = "Check for any other way downgrade to get set, if required")
     String downgradeFromVersion = null;
 
     if (direction.isDowngrade()) {
@@ -767,6 +771,10 @@ public class UpgradeResourceProvider extends 
AbstractControllerResourceProvider
         downgradeFromVersion = lastUpgradeItemForCluster.getToVersion();
       }
 
+      if (null == downgradeFromVersion) {
+        throw new AmbariException("When downgrading, the downgrade version 
must be specified");
+      }
+
       upgradeContext.setDowngradeFromVersion(downgradeFromVersion);
     }
 
@@ -919,7 +927,7 @@ public class UpgradeResourceProvider extends 
AbstractControllerResourceProvider
     if (null != downgradeFromVersion) {
       entity.setFromVersion(downgradeFromVersion);
     } else {
-      
entity.setFromVersion(cluster.getCurrentClusterVersion().getRepositoryVersion().getVersion());
+      entity.setFromVersion("");
     }
 
     entity.setToVersion(version);

http://git-wip-us.apache.org/repos/asf/ambari/blob/aaa821cc/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
index 3fda160..5199787 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/upgrade/DistributeRepositoriesActionListener.java
@@ -19,7 +19,6 @@ package org.apache.ambari.server.events.listeners.upgrade;
 
 import java.util.List;
 
-import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.EagerSingleton;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import 
org.apache.ambari.server.bootstrap.DistributeRepositoriesStructuredOutput;
@@ -29,7 +28,6 @@ import org.apache.ambari.server.orm.dao.HostVersionDAO;
 import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.entities.HostVersionEntity;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
-import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.StackId;
@@ -178,13 +176,6 @@ public class DistributeRepositoriesActionListener {
       if (hostVersion.getState() == RepositoryVersionState.INSTALLING) {
         hostVersion.setState(newHostState);
         hostVersionDAO.get().merge(hostVersion);
-        // Update state of a cluster stack version
-        try {
-          Cluster cluster = clusters.get().getClusterById(clusterId);
-          
cluster.recalculateClusterVersionState(hostVersion.getRepositoryVersion());
-        } catch (AmbariException e) {
-          LOG.error("Cannot get cluster with Id " + clusterId.toString() + " 
to recalculate its ClusterVersion.", e);
-        }
       }
     }
   }

Reply via email to