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/07/19 14:20:04 UTC

[02/13] ambari git commit: AMBARI-21450 - Fixing Unit Test Compilation Issues From trunk Merge (jonathanhurley)

http://git-wip-us.apache.org/repos/asf/ambari/blob/56362fd6/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
index 996812c..3a29298 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -26,10 +26,8 @@ import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.lang.reflect.Field;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -46,7 +44,6 @@ import java.util.Map;
 import java.util.Set;
 
 import javax.persistence.EntityManager;
-import javax.persistence.RollbackException;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.H2DatabaseCleaner;
@@ -64,22 +61,20 @@ import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
 import org.apache.ambari.server.orm.OrmTestHelper;
 import org.apache.ambari.server.orm.dao.ClusterDAO;
-import org.apache.ambari.server.orm.dao.ClusterVersionDAO;
 import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
 import org.apache.ambari.server.orm.dao.HostDAO;
 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.ClusterConfigEntity;
-import org.apache.ambari.server.orm.entities.ClusterConfigMappingEntity;
 import org.apache.ambari.server.orm.entities.ClusterEntity;
 import org.apache.ambari.server.orm.entities.ClusterServiceEntity;
-import org.apache.ambari.server.orm.entities.ClusterVersionEntity;
 import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.entities.HostStateEntity;
 import org.apache.ambari.server.orm.entities.HostVersionEntity;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
+import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.StackEntity;
 import org.apache.ambari.server.state.AgentVersion;
@@ -108,13 +103,11 @@ import org.apache.ambari.server.state.configgroup.ConfigGroupFactory;
 import org.apache.ambari.server.state.fsm.InvalidStateTransitionException;
 import org.apache.ambari.server.state.host.HostHealthyHeartbeatEvent;
 import org.apache.ambari.server.state.host.HostRegistrationRequestEvent;
-import org.apache.ambari.server.state.stack.upgrade.UpgradeType;
 import org.apache.ambari.server.utils.EventBusSynchronizer;
 import org.apache.commons.lang.StringUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.mockito.ArgumentCaptor;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -123,8 +116,6 @@ import com.google.gson.Gson;
 import com.google.inject.AbstractModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
-import com.google.inject.Singleton;
-import com.google.inject.persist.Transactional;
 import com.google.inject.persist.UnitOfWork;
 import com.google.inject.util.Modules;
 
@@ -148,42 +139,15 @@ public class ClusterTest {
   private StackDAO stackDAO;
   private ClusterDAO clusterDAO;
   private HostDAO hostDAO;
-  private ClusterVersionDAO clusterVersionDAO;
+
   private HostVersionDAO hostVersionDAO;
   private HostComponentStateDAO hostComponentStateDAO;
   private RepositoryVersionDAO repositoryVersionDAO;
   private Gson gson;
 
-  @Singleton
-  static class ClusterVersionDAOMock extends ClusterVersionDAO {
-    static boolean failOnCurrentVersionState;
-    static List<ClusterVersionEntity> mockedClusterVersions;
-
-    @Override
-    @Transactional
-    public ClusterVersionEntity merge(ClusterVersionEntity entity) {
-      if (!failOnCurrentVersionState || entity.getState() != RepositoryVersionState.CURRENT) {
-        return super.merge(entity);
-      } else {
-        throw new RollbackException();
-      }
-    }
-
-    @Override
-    @Transactional
-    public List<ClusterVersionEntity> findByCluster(String clusterName) {
-      if (mockedClusterVersions == null) {
-        return super.findByCluster(clusterName);
-      } else {
-        return mockedClusterVersions;
-      }
-    }
-  }
-
   private static class MockModule extends AbstractModule {
     @Override
     protected void configure() {
-      bind(ClusterVersionDAO.class).to(ClusterVersionDAOMock.class);
       EventBusSynchronizer.synchronizeAmbariEventPublisher(binder());
     }
   }
@@ -205,7 +169,6 @@ public class ClusterTest {
     stackDAO = injector.getInstance(StackDAO.class);
     clusterDAO = injector.getInstance(ClusterDAO.class);
     hostDAO = injector.getInstance(HostDAO.class);
-    clusterVersionDAO = injector.getInstance(ClusterVersionDAO.class);
     hostVersionDAO = injector.getInstance(HostVersionDAO.class);
     hostComponentStateDAO = injector.getInstance(HostComponentStateDAO.class);
     repositoryVersionDAO = injector.getInstance(RepositoryVersionDAO.class);
@@ -224,8 +187,12 @@ public class ClusterTest {
   }
 
   private void createDefaultCluster(Set<String> hostNames) throws Exception {
-    // TODO, use common function
     StackId stackId = new StackId("HDP", "0.1");
+    createDefaultCluster(hostNames, stackId);
+  }
+
+  private void createDefaultCluster(Set<String> hostNames, StackId stackId) throws Exception {
+    // TODO, use common function
     StackEntity stackEntity = stackDAO.find(stackId.getStackName(), stackId.getStackVersion());
     org.junit.Assert.assertNotNull(stackEntity);
 
@@ -237,6 +204,8 @@ public class ClusterTest {
     hostAttributes.put("os_family", "redhat");
     hostAttributes.put("os_release_version", "5.9");
 
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(stackId, stackId.getStackVersion());
+
     for (String hostName : hostNames) {
       clusters.addHost(hostName);
 
@@ -244,19 +213,23 @@ public class ClusterTest {
       hostEntity.setIpv4("ipv4");
       hostEntity.setIpv6("ipv6");
       hostEntity.setHostAttributes(gson.toJson(hostAttributes));
+
+
+//      hostDAO.merge(hostEntity);
+
+      HostVersionEntity hostVersionEntity = new HostVersionEntity();
+      hostVersionEntity.setRepositoryVersion(repositoryVersion);
+      hostVersionEntity.setState(RepositoryVersionState.CURRENT);
+      hostVersionEntity.setHostEntity(hostEntity);
+      hostEntity.setHostVersionEntities(Collections.singletonList(hostVersionEntity));
+
       hostDAO.merge(hostEntity);
     }
 
     clusters.mapAndPublishHostsToCluster(hostNames, clusterName);
     c1 = clusters.getCluster(clusterName);
 
-    helper.getOrCreateRepositoryVersion(stackId, stackId.getStackVersion());
-    c1.createClusterVersion(stackId, stackId.getStackVersion(), "admin",
-        RepositoryVersionState.INSTALLING);
-    c1.transitionClusterVersion(stackId, stackId.getStackVersion(),
-        RepositoryVersionState.CURRENT);
 
-    ClusterVersionDAOMock.failOnCurrentVersionState = false;
   }
 
   public ClusterEntity createDummyData() {
@@ -286,7 +259,7 @@ public class ClusterTest {
     hostEntities.add(host2);
 
     clusterEntity.setHostEntities(hostEntities);
-    clusterEntity.setClusterConfigEntities(Collections.EMPTY_LIST);
+    clusterEntity.setClusterConfigEntities(Collections.<ClusterConfigEntity>emptyList());
     //both sides of relation should be set when modifying in runtime
     host1.setClusterEntities(Arrays.asList(clusterEntity));
     host2.setClusterEntities(Arrays.asList(clusterEntity));
@@ -304,7 +277,7 @@ public class ClusterTest {
     clusterServiceEntity.setServiceName("HDFS");
     clusterServiceEntity.setClusterEntity(clusterEntity);
     clusterServiceEntity.setServiceComponentDesiredStateEntities(
-        Collections.EMPTY_LIST);
+        Collections.<ServiceComponentDesiredStateEntity>emptyList());
 
     ServiceDesiredStateEntity stateEntity = mock(ServiceDesiredStateEntity.class);
 
@@ -317,43 +290,27 @@ public class ClusterTest {
     return clusterEntity;
   }
 
-  private void checkStackVersionState(StackId stackId, String version, RepositoryVersionState state) {
-    Collection<ClusterVersionEntity> allClusterVersions = c1.getAllClusterVersions();
-    for (ClusterVersionEntity entity : allClusterVersions) {
-      StackId repoVersionStackId = new StackId(entity.getRepositoryVersion().getStack());
-      if (repoVersionStackId.equals(stackId)
-          && repoVersionStackId.getStackVersion().equals(version)) {
-        assertEquals(state, entity.getState());
-      }
-    }
-  }
-
-  private void assertStateException(StackId stackId, String version,
-      RepositoryVersionState transitionState,
-                                    RepositoryVersionState stateAfter) {
-    try {
-      c1.transitionClusterVersion(stackId, version, transitionState);
-      Assert.fail();
-    } catch (AmbariException e) {}
-    checkStackVersionState(stackId, version, stateAfter);
-    assertNotNull(c1.getCurrentClusterVersion());
-  }
-
   /**
-   * For Rolling Upgrades, create a cluster with the following components
-   * HDFS: NameNode, DataNode, HDFS Client
-   * ZK: Zookeeper Server, Zookeeper Monitor
+   * For Rolling Upgrades, create a cluster with the following components HDFS:
+   * NameNode, DataNode, HDFS Client ZK: Zookeeper Server, Zookeeper Monitor
    * Ganglia: Ganglia Server, Ganglia Monitor
    *
-   * Further, 3 hosts will be added.
-   * Finally, verify that only the Ganglia components do not need to advertise a version.
-   * @param clusterName Cluster Name
-   * @param stackId Stack to set for the cluster
-   * @param hostAttributes Host attributes to use for 3 hosts (h-1, h-2, h-3)
+   * Further, 3 hosts will be added. Finally, verify that only the Ganglia
+   * components do not need to advertise a version.
+   *
+   * @param clusterName
+   *          Cluster Name
+   * @param repositoryVersion
+   *          the repository to use for new services being installed in the
+   *          cluster
+   * @param hostAttributes
+   *          Host attributes to use for 3 hosts (h-1, h-2, h-3)
    * @throws Exception
    * @return Cluster that was created
    */
-  private Cluster createClusterForRU(String clusterName, StackId stackId, Map<String, String> hostAttributes) throws Exception {
+  private Cluster createClusterForRU(String clusterName, RepositoryVersionEntity repositoryVersion,
+      Map<String, String> hostAttributes) throws Exception {
+    StackId stackId = repositoryVersion.getStackId();
     clusters.addCluster(clusterName, stackId);
     Cluster cluster = clusters.getCluster(clusterName);
     Assert.assertEquals(clusterName, cluster.getClusterName());
@@ -378,9 +335,9 @@ public class ClusterTest {
     }
 
     // Add Services
-    Service s1 = serviceFactory.createNew(cluster, "HDFS");
-    Service s2 = serviceFactory.createNew(cluster, "ZOOKEEPER");
-    Service s3 = serviceFactory.createNew(cluster, "GANGLIA");
+    Service s1 = serviceFactory.createNew(cluster, "HDFS", repositoryVersion);
+    Service s2 = serviceFactory.createNew(cluster, "ZOOKEEPER", repositoryVersion);
+    Service s3 = serviceFactory.createNew(cluster, "GANGLIA", repositoryVersion);
     cluster.addService(s1);
     cluster.addService(s2);
     cluster.addService(s3);
@@ -483,12 +440,14 @@ public class ClusterTest {
    * @param hostAttributes Host Attributes
    * @throws Exception
    */
-  private void addHost(String hostName, Map<String, String> hostAttributes) throws Exception {
+  private Host addHost(String hostName, Map<String, String> hostAttributes) throws Exception {
     clusters.addHost(hostName);
     Host host = clusters.getHost(hostName);
     host.setIPv4("ipv4");
     host.setIPv6("ipv6");
     host.setHostAttributes(hostAttributes);
+
+    return host;
   }
 
   /**
@@ -522,7 +481,6 @@ public class ClusterTest {
       ServiceComponentHost scHost = svcComp.getServiceComponentHost(hce.getHostName());
 
       scHost.recalculateHostVersionState();
-      cluster.recalculateClusterVersionState(rv);
     }
   }
 
@@ -644,8 +602,10 @@ public class ClusterTest {
     // public Service getService(String serviceName) throws AmbariException;
     // public Map<String, Service> getServices();
 
-    Service s1 = serviceFactory.createNew(c1, "HDFS");
-    Service s2 = serviceFactory.createNew(c1, "MAPREDUCE");
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+
+    Service s1 = serviceFactory.createNew(c1, "HDFS", repositoryVersion);
+    Service s2 = serviceFactory.createNew(c1, "MAPREDUCE", repositoryVersion);
 
     Service s = c1.getService("HDFS");
     Assert.assertNotNull(s);
@@ -672,7 +632,9 @@ public class ClusterTest {
     // TODO write unit tests
     // public List<ServiceComponentHost> getServiceComponentHosts(String hostname);
 
-    Service s = serviceFactory.createNew(c1, "HDFS");
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+
+    Service s = serviceFactory.createNew(c1, "HDFS", repositoryVersion);
     c1.addService(s);
     ServiceComponent sc = serviceComponentFactory.createNew(s, "NAMENODE");
     s.addServiceComponent(sc);
@@ -690,7 +652,7 @@ public class ClusterTest {
     try {
       while (iterator.hasNext()) {
         iterator.next();
-        Service s1 = serviceFactory.createNew(c1, "PIG");
+        Service s1 = serviceFactory.createNew(c1, "PIG", repositoryVersion);
         c1.addService(s1);
         ServiceComponent sc1 = serviceComponentFactory.createNew(s1, "PIG");
         s1.addServiceComponent(sc1);
@@ -709,7 +671,9 @@ public class ClusterTest {
   public void testGetServiceComponentHosts_ForService() throws Exception {
     createDefaultCluster();
 
-    Service s = serviceFactory.createNew(c1, "HDFS");
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+
+    Service s = serviceFactory.createNew(c1, "HDFS", repositoryVersion);
     c1.addService(s);
 
     ServiceComponent scNN = serviceComponentFactory.createNew(s, "NAMENODE");
@@ -737,7 +701,9 @@ public class ClusterTest {
   public void testGetServiceComponentHosts_ForServiceComponent() throws Exception {
     createDefaultCluster();
 
-    Service s = serviceFactory.createNew(c1, "HDFS");
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+
+    Service s = serviceFactory.createNew(c1, "HDFS", repositoryVersion);
     c1.addService(s);
 
     ServiceComponent scNN = serviceComponentFactory.createNew(s, "NAMENODE");
@@ -771,7 +737,9 @@ public class ClusterTest {
   public void testGetServiceComponentHostMap() throws Exception {
     createDefaultCluster();
 
-    Service s = serviceFactory.createNew(c1, "HDFS");
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+
+    Service s = serviceFactory.createNew(c1, "HDFS", repositoryVersion);
     c1.addService(s);
 
     ServiceComponent scNN = serviceComponentFactory.createNew(s, "NAMENODE");
@@ -803,10 +771,12 @@ public class ClusterTest {
   public void testGetServiceComponentHostMap_ForService() throws Exception {
     createDefaultCluster();
 
-    Service sfHDFS = serviceFactory.createNew(c1, "HDFS");
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+
+    Service sfHDFS = serviceFactory.createNew(c1, "HDFS", repositoryVersion);
     c1.addService(sfHDFS);
 
-    Service sfMR = serviceFactory.createNew(c1, "MAPREDUCE");
+    Service sfMR = serviceFactory.createNew(c1, "MAPREDUCE", repositoryVersion);
     c1.addService(sfMR);
 
     ServiceComponent scNN = serviceComponentFactory.createNew(sfHDFS, "NAMENODE");
@@ -859,10 +829,12 @@ public class ClusterTest {
   public void testGetServiceComponentHostMap_ForHost() throws Exception {
     createDefaultCluster();
 
-    Service sfHDFS = serviceFactory.createNew(c1, "HDFS");
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+
+    Service sfHDFS = serviceFactory.createNew(c1, "HDFS", repositoryVersion);
     c1.addService(sfHDFS);
 
-    Service sfMR = serviceFactory.createNew(c1, "MAPREDUCE");
+    Service sfMR = serviceFactory.createNew(c1, "MAPREDUCE", repositoryVersion);
     c1.addService(sfMR);
 
     ServiceComponent scNN = serviceComponentFactory.createNew(sfHDFS, "NAMENODE");
@@ -916,10 +888,12 @@ public class ClusterTest {
   public void testGetServiceComponentHostMap_ForHostAndService() throws Exception {
     createDefaultCluster();
 
-    Service sfHDFS = serviceFactory.createNew(c1, "HDFS");
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+
+    Service sfHDFS = serviceFactory.createNew(c1, "HDFS", repositoryVersion);
     c1.addService(sfHDFS);
 
-    Service sfMR = serviceFactory.createNew(c1, "MAPREDUCE");
+    Service sfMR = serviceFactory.createNew(c1, "MAPREDUCE", repositoryVersion);
     c1.addService(sfMR);
 
     ServiceComponent scNN = serviceComponentFactory.createNew(sfHDFS, "NAMENODE");
@@ -1022,15 +996,12 @@ public class ClusterTest {
     Assert.assertTrue("Expect desired config contain " + config3.getType(), desiredConfigs.containsKey("core-site"));
     Assert.assertEquals("Expect desired config for global should be " + config1.getTag(),
       config1.getTag(), desiredConfigs.get(config1.getType()).getTag());
-    Assert.assertEquals("_test1", desiredConfigs.get(config1.getType()).getUser());
-    Assert.assertEquals("_test3", desiredConfigs.get(config3.getType()).getUser());
     DesiredConfig dc = desiredConfigs.get(config1.getType());
     Assert.assertTrue("Expect no host-level overrides",
       (null == dc.getHostOverrides() || dc.getHostOverrides().size() == 0));
 
     Thread.sleep(1);
     c1.addDesiredConfig("_test2", Collections.singleton(config2));
-    Assert.assertEquals("_test2", c1.getDesiredConfigs().get(config2.getType()).getUser());
 
     Thread.sleep(1);
     c1.addDesiredConfig("_test1", Collections.singleton(config1));
@@ -1051,9 +1022,9 @@ public class ClusterTest {
     createDefaultCluster();
 
     ClusterResponse r = c1.convertToResponse();
-    Assert.assertEquals(c1.getClusterId(), r.getClusterId().longValue());
+    Assert.assertEquals(c1.getClusterId(), r.getClusterId());
     Assert.assertEquals(c1.getClusterName(), r.getClusterName());
-    Assert.assertEquals(Integer.valueOf(2), r.getTotalHosts());
+    Assert.assertEquals(2, r.getTotalHosts());
     Assert.assertEquals(0, r.getClusterHealthReport().getAlertStatusHosts());
     Assert.assertEquals(0, r.getClusterHealthReport().getHealthyStatusHosts());
     Assert.assertEquals(0, r.getClusterHealthReport().getUnhealthyStatusHosts());
@@ -1082,7 +1053,7 @@ public class ClusterTest {
 
     r = c1.convertToResponse();
 
-    Assert.assertEquals(Integer.valueOf(3), r.getTotalHosts());
+    Assert.assertEquals(3, r.getTotalHosts());
     Assert.assertEquals(0, r.getClusterHealthReport().getAlertStatusHosts());
     Assert.assertEquals(1, r.getClusterHealthReport().getHealthyStatusHosts());
     Assert.assertEquals(0, r.getClusterHealthReport().getUnhealthyStatusHosts());
@@ -1103,9 +1074,11 @@ public class ClusterTest {
   public void testDeleteService() throws Exception {
     createDefaultCluster();
 
-    c1.addService("MAPREDUCE");
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
 
-    Service hdfs = c1.addService("HDFS");
+    c1.addService("MAPREDUCE", repositoryVersion);
+
+    Service hdfs = c1.addService("HDFS", repositoryVersion);
     ServiceComponent nameNode = hdfs.addServiceComponent("NAMENODE");
 
     assertEquals(2, c1.getServices().size());
@@ -1123,7 +1096,9 @@ public class ClusterTest {
   public void testDeleteServiceWithConfigHistory() throws Exception {
     createDefaultCluster();
 
-    c1.addService("HDFS");
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+
+    c1.addService("HDFS", repositoryVersion);
 
     Config config1 = configFactory.createNew(c1, "hdfs-site", "version1",
       new HashMap<String, String>() {{ put("a", "b"); }}, new HashMap<String, Map<String,String>>());
@@ -1159,24 +1134,22 @@ public class ClusterTest {
     // ServiceConfig
     Assert.assertEquals(0,
       em.createQuery("SELECT serviceConfig from ServiceConfigEntity serviceConfig").getResultList().size());
+
     // ClusterConfig
-    Assert.assertEquals(2,
-      em.createQuery("SELECT config from ClusterConfigEntity config").getResultList().size());
-    // ClusterConfigMapping
-    List<ClusterConfigMappingEntity> configMappingEntities =
-        em.createQuery("SELECT configmapping from ClusterConfigMappingEntity configmapping",
-        ClusterConfigMappingEntity.class).getResultList();
+    List<ClusterConfigEntity> clusterConfigs = em.createQuery(
+        "SELECT config from ClusterConfigEntity config", ClusterConfigEntity.class).getResultList();
 
-    Assert.assertEquals(2, configMappingEntities.size());
+    Assert.assertEquals(2, clusterConfigs.size());
 
-    for (ClusterConfigMappingEntity configMappingEntity : configMappingEntities) {
-      if (StringUtils.equals(configMappingEntity.getType(), "core-site")) {
+    for (ClusterConfigEntity configEntity : clusterConfigs) {
+      if (StringUtils.equals(configEntity.getType(), "core-site")) {
         assertEquals("core-site is not part of HDFS in test stack, should remain mapped to cluster",
-            1, configMappingEntity.isSelected());
+            true, configEntity.isSelected());
       }
-      if (StringUtils.equals(configMappingEntity.getType(), "hdfs-site")) {
+
+      if (StringUtils.equals(configEntity.getType(), "hdfs-site")) {
         assertEquals("hdfs-site should be unmapped from cluster when HDFS service is removed",
-            0, configMappingEntity.isSelected());
+            false, configEntity.isSelected());
       }
     }
 
@@ -1320,6 +1293,9 @@ public class ClusterTest {
   public void testServiceConfigVersionsForGroups() throws Exception {
     createDefaultCluster();
 
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+    c1.addService("HDFS", repositoryVersion);
+
     Config config1 = configFactory.createNew(c1, "hdfs-site", "version1",
       new HashMap<String, String>() {{ put("a", "b"); }}, new HashMap<String, Map<String,String>>());
 
@@ -1537,144 +1513,32 @@ public class ClusterTest {
     assertEquals(false, allServiceConfigResponses.get(1).getIsCurrent());
     assertEquals(ServiceConfigVersionResponse.DELETED_CONFIG_GROUP_NAME, allServiceConfigResponses.get(1).getGroupName());
 
-
-
-  }
-
-  @Test
-  public void testTransitionClusterVersion() throws Exception {
-    createDefaultCluster();
-
-    String stack = "HDP";
-    String version = "0.2";
-
-    StackId stackId = new StackId(stack, version);
-
-    helper.getOrCreateRepositoryVersion(stackId, version);
-    c1.createClusterVersion(stackId, version, "admin",
-        RepositoryVersionState.INSTALLING);
-
-    assertStateException(stackId, version, RepositoryVersionState.CURRENT,
-        RepositoryVersionState.INSTALLING);
-
-    c1.transitionClusterVersion(stackId, version,
-        RepositoryVersionState.INSTALL_FAILED);
-    checkStackVersionState(stackId, version,
-        RepositoryVersionState.INSTALL_FAILED);
-
-    assertStateException(stackId, version, RepositoryVersionState.CURRENT,
-        RepositoryVersionState.INSTALL_FAILED);
-    assertStateException(stackId, version, RepositoryVersionState.INSTALLED,
-        RepositoryVersionState.INSTALL_FAILED);
-    assertStateException(stackId, version, RepositoryVersionState.OUT_OF_SYNC,
-        RepositoryVersionState.INSTALL_FAILED);
-
-    c1.transitionClusterVersion(stackId, version,
-        RepositoryVersionState.INSTALLING);
-    checkStackVersionState(stackId, version, RepositoryVersionState.INSTALLING);
-
-    c1.transitionClusterVersion(stackId, version,
-        RepositoryVersionState.INSTALLED);
-    checkStackVersionState(stackId, version, RepositoryVersionState.INSTALLED);
-
-    assertStateException(stackId, version,
-        RepositoryVersionState.INSTALL_FAILED, RepositoryVersionState.INSTALLED);
-
-    c1.transitionClusterVersion(stackId, version,
-        RepositoryVersionState.OUT_OF_SYNC);
-    checkStackVersionState(stackId, version, RepositoryVersionState.OUT_OF_SYNC);
-
-    assertStateException(stackId, version, RepositoryVersionState.CURRENT,
-        RepositoryVersionState.OUT_OF_SYNC);
-    assertStateException(stackId, version, RepositoryVersionState.INSTALLED,
-        RepositoryVersionState.OUT_OF_SYNC);
-    assertStateException(stackId, version,
-        RepositoryVersionState.INSTALL_FAILED,
-        RepositoryVersionState.OUT_OF_SYNC);
-
-    c1.transitionClusterVersion(stackId, version,
-        RepositoryVersionState.INSTALLING);
-    checkStackVersionState(stackId, version, RepositoryVersionState.INSTALLING);
-
-    c1.transitionClusterVersion(stackId, version,
-        RepositoryVersionState.INSTALLED);
-    checkStackVersionState(stackId, version, RepositoryVersionState.INSTALLED);
-
-    c1.setDesiredStackVersion(stackId);
-    c1.transitionClusterVersion(stackId, version,
-        RepositoryVersionState.CURRENT);
-
-    checkStackVersionState(stackId, version, RepositoryVersionState.CURRENT);
-
-    checkStackVersionState(new StackId("HDP", "0.1"), "0.1",
-        RepositoryVersionState.INSTALLED);
-
-    // The only CURRENT state should not be changed
-    assertStateException(stackId, version, RepositoryVersionState.INSTALLED,
-        RepositoryVersionState.CURRENT);
-  }
-
-  @Test
-  public void testTransitionClusterVersionTransactionFail() throws Exception {
-    createDefaultCluster();
-
-    StackId stackId = new StackId("HDP", "0.2");
-    helper.getOrCreateRepositoryVersion(stackId, stackId.getStackVersion());
-    c1.createClusterVersion(stackId, "0.2", "admin",
-        RepositoryVersionState.INSTALLING);
-    c1.transitionClusterVersion(stackId, "0.2",
-        RepositoryVersionState.INSTALLED);
-    try {
-      ClusterVersionDAOMock.failOnCurrentVersionState = true;
-      c1.transitionClusterVersion(stackId, "0.2",
-          RepositoryVersionState.CURRENT);
-      Assert.fail();
-    } catch (AmbariException e) {
-
-    } finally {
-      ClusterVersionDAOMock.failOnCurrentVersionState = false;
-    }
-
-    // There must be CURRENT state for cluster
-    assertNotNull(c1.getCurrentClusterVersion());
   }
 
   /**
    * Tests that hosts can be correctly transitioned into the "INSTALLING" state.
    * This method also tests that hosts in MM will not be transitioned, as per
    * the contract of
-   * {@link Cluster#transitionHostsToInstalling(ClusterVersionEntity)}.
+   * {@link Cluster#transitionHostsToInstalling(RepositoryVersionEntity, org.apache.ambari.server.state.repository.VersionDefinitionXml, boolean)}.
    *
    * @throws Exception
    */
   @Test
-  public void testTransitionHostVersions() throws Exception {
-    createDefaultCluster();
-
-    StackId stackId = new StackId("HDP", "0.2");
-    helper.getOrCreateRepositoryVersion(stackId, stackId.getStackVersion());
-
-    c1.createClusterVersion(stackId, "0.2", "admin",
-        RepositoryVersionState.INSTALLING);
-
-    ClusterVersionEntity entityHDP2 = null;
-    for (ClusterVersionEntity entity : c1.getAllClusterVersions()) {
-      StackEntity repoVersionStackEntity = entity.getRepositoryVersion().getStack();
-      StackId repoVersionStackId = new StackId(repoVersionStackEntity);
-
-      if (repoVersionStackId.getStackName().equals("HDP")
-          && repoVersionStackId.getStackVersion().equals("0.2")) {
-        entityHDP2 = entity;
-        break;
-      }
-    }
-
-    assertNotNull(entityHDP2);
+  public void testTransitionHostsToInstalling() throws Exception {
+    // this will create a cluster with a few hosts and no host components
+    StackId originalStackId = new StackId("HDP", "2.0.5");
+    createDefaultCluster(Sets.newHashSet("h1", "h2"), originalStackId);
 
     List<HostVersionEntity> hostVersionsH1Before = hostVersionDAO.findByClusterAndHost("c1", "h1");
     assertEquals(1, hostVersionsH1Before.size());
 
-    c1.transitionHosts(entityHDP2, RepositoryVersionState.INSTALLING);
+    StackId stackId = new StackId("HDP", "2.0.6");
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(stackId, stackId.getStackVersion());
+
+
+    // this should move both to NOT_REQUIRED since they have no versionable
+    // components
+    c1.transitionHostsToInstalling(repositoryVersion, null, false);
 
     List<HostVersionEntity> hostVersionsH1After = hostVersionDAO.findByClusterAndHost("c1", "h1");
     assertEquals(2, hostVersionsH1After.size());
@@ -1683,8 +1547,8 @@ public class ClusterTest {
     for (HostVersionEntity entity : hostVersionsH1After) {
       StackEntity repoVersionStackEntity = entity.getRepositoryVersion().getStack();
       if (repoVersionStackEntity.getStackName().equals("HDP")
-          && repoVersionStackEntity.getStackVersion().equals("0.2")) {
-        assertEquals(RepositoryVersionState.INSTALLING, entity.getState());
+          && repoVersionStackEntity.getStackVersion().equals("2.0.6")) {
+        assertEquals(RepositoryVersionState.NOT_REQUIRED, entity.getState());
         checked = true;
         break;
       }
@@ -1692,8 +1556,26 @@ public class ClusterTest {
 
     assertTrue(checked);
 
-    // Test for update of existing host stack version
-    c1.transitionHosts(entityHDP2, RepositoryVersionState.INSTALLING);
+    // add some host components
+    Service hdfs = serviceFactory.createNew(c1, "HDFS", repositoryVersion);
+    c1.addService(hdfs);
+
+    // Add HDFS components
+    ServiceComponent datanode = serviceComponentFactory.createNew(hdfs, "NAMENODE");
+    ServiceComponent namenode = serviceComponentFactory.createNew(hdfs, "DATANODE");
+    hdfs.addServiceComponent(datanode);
+    hdfs.addServiceComponent(namenode);
+
+    // add to hosts
+    ServiceComponentHost namenodeHost1 = serviceComponentHostFactory.createNew(namenode, "h1");
+    ServiceComponentHost datanodeHost2 = serviceComponentHostFactory.createNew(datanode, "h2");
+
+    assertNotNull(namenodeHost1);
+    assertNotNull(datanodeHost2);
+
+    // with hosts now having components which report versions, we should have
+    // two in the INSTALLING state
+    c1.transitionHostsToInstalling(repositoryVersion, null, false);
 
     hostVersionsH1After = hostVersionDAO.findByClusterAndHost("c1", "h1");
     assertEquals(2, hostVersionsH1After.size());
@@ -1702,7 +1584,7 @@ public class ClusterTest {
     for (HostVersionEntity entity : hostVersionsH1After) {
       StackEntity repoVersionStackEntity = entity.getRepositoryVersion().getStack();
       if (repoVersionStackEntity.getStackName().equals("HDP")
-          && repoVersionStackEntity.getStackVersion().equals("0.2")) {
+          && repoVersionStackEntity.getStackVersion().equals("2.0.6")) {
         assertEquals(RepositoryVersionState.INSTALLING, entity.getState());
         checked = true;
         break;
@@ -1732,7 +1614,7 @@ public class ClusterTest {
     hostInMaintenanceMode.setMaintenanceState(c1.getClusterId(), MaintenanceState.ON);
 
     // transition host versions to INSTALLING
-    c1.transitionHosts(entityHDP2, RepositoryVersionState.INSTALLING);
+    c1.transitionHostsToInstalling(repositoryVersion, null, false);
 
     List<HostVersionEntity> hostInMaintModeVersions = hostVersionDAO.findByClusterAndHost("c1",
         hostInMaintenanceMode.getHostName());
@@ -1744,7 +1626,7 @@ public class ClusterTest {
     for (HostVersionEntity hostVersionEntity : hostInMaintModeVersions) {
       StackEntity repoVersionStackEntity = hostVersionEntity.getRepositoryVersion().getStack();
       if (repoVersionStackEntity.getStackName().equals("HDP")
-          && repoVersionStackEntity.getStackVersion().equals("0.2")) {
+          && repoVersionStackEntity.getStackVersion().equals("2.0.6")) {
         assertEquals(RepositoryVersionState.OUT_OF_SYNC, hostVersionEntity.getState());
       }
     }
@@ -1753,213 +1635,23 @@ public class ClusterTest {
     for (HostVersionEntity hostVersionEntity : otherHostVersions) {
       StackEntity repoVersionStackEntity = hostVersionEntity.getRepositoryVersion().getStack();
       if (repoVersionStackEntity.getStackName().equals("HDP")
-          && repoVersionStackEntity.getStackVersion().equals("0.2")) {
+          && repoVersionStackEntity.getStackVersion().equals("2.0.6")) {
       assertEquals(RepositoryVersionState.INSTALLING, hostVersionEntity.getState());
       }
     }
   }
 
-  @Test
-  public void testRecalculateClusterVersionState() throws Exception {
-    createDefaultCluster();
-
-    Host h1 = clusters.getHost("h1");
-    h1.setState(HostState.HEALTHY);
-
-    Host h2 = clusters.getHost("h2");
-    h2.setState(HostState.HEALTHY);
-
-    // Phase 1: Install bits during distribution
-    StackId stackId = new StackId("HDP-0.1");
-    final String stackVersion = "0.1-1000";
-    RepositoryVersionEntity repositoryVersionEntity = helper.getOrCreateRepositoryVersion(
-        stackId,
-        stackVersion);
-    // Because the cluster already has a Cluster Version, an additional stack must init with INSTALLING
-    c1.createClusterVersion(stackId, stackVersion, "admin",
-        RepositoryVersionState.INSTALLING);
-    c1.setCurrentStackVersion(stackId);
-
-    HostVersionEntity hv1 = helper.createHostVersion("h1", repositoryVersionEntity, RepositoryVersionState.INSTALLING);
-    HostVersionEntity hv2 = helper.createHostVersion("h2", repositoryVersionEntity, RepositoryVersionState.INSTALLING);
-
-    c1.recalculateClusterVersionState(repositoryVersionEntity);
-    //Should remain in its current state
-    checkStackVersionState(stackId, stackVersion,
-        RepositoryVersionState.INSTALLING);
-
-    h2.setState(HostState.UNHEALTHY);
-    c1.recalculateClusterVersionState(repositoryVersionEntity);
-    // In order for the states to be accurately reflected, the host health status should not impact the status
-    // of the host_version.
-    checkStackVersionState(stackId, stackVersion,
-        RepositoryVersionState.INSTALLING);
-    // Retry by going back to INSTALLING
-    c1.transitionClusterVersion(stackId, stackVersion,
-        RepositoryVersionState.INSTALLING);
-
-    // Installation on one host fails (other is continuing)
-    hv1.setState(RepositoryVersionState.INSTALL_FAILED);
-    hostVersionDAO.merge(hv1);
-    // Check that cluster version is still in a non-final state
-    c1.recalculateClusterVersionState(repositoryVersionEntity);
-    checkStackVersionState(stackId, stackVersion,
-      RepositoryVersionState.INSTALLING);
-
-    h2.setState(HostState.HEALTHY);
-    hv2.setState(RepositoryVersionState.INSTALLED);
-    hostVersionDAO.merge(hv2);
-    // Now both cluster versions are in a final state, so
-    // cluster version state changes to final state
-    c1.recalculateClusterVersionState(repositoryVersionEntity);
-    checkStackVersionState(stackId, stackVersion,
-        RepositoryVersionState.INSTALL_FAILED);
-
-    // Retry by going back to INSTALLING
-    c1.transitionClusterVersion(stackId, stackVersion,
-      RepositoryVersionState.INSTALLING);
-
-    h2.setState(HostState.HEALTHY);
-    hv2.setState(RepositoryVersionState.INSTALLED);
-    hostVersionDAO.merge(hv2);
-    c1.recalculateClusterVersionState(repositoryVersionEntity);
-    checkStackVersionState(stackId, stackVersion,
-      RepositoryVersionState.INSTALLING);
-
-    // Make the last host fail
-    hv1.setState(RepositoryVersionState.INSTALL_FAILED);
-    hostVersionDAO.merge(hv1);
-    c1.recalculateClusterVersionState(repositoryVersionEntity);
-    checkStackVersionState(stackId, stackVersion,
-        RepositoryVersionState.INSTALL_FAILED);
-    // Retry by going back to INSTALLING
-    c1.transitionClusterVersion(stackId, stackVersion,
-        RepositoryVersionState.INSTALLING);
-
-    // Now, all hosts are in INSTALLED
-    hv1.setState(RepositoryVersionState.INSTALLED);
-    hostVersionDAO.merge(hv1);
-    c1.recalculateClusterVersionState(repositoryVersionEntity);
-    checkStackVersionState(stackId, stackVersion,
-        RepositoryVersionState.INSTALLED);
-
-    // Set both hosts to CURRENT
-    hv1.setState(RepositoryVersionState.CURRENT);
-    hostVersionDAO.merge(hv1);
-    hv2.setState(RepositoryVersionState.CURRENT);
-    hostVersionDAO.merge(hv2);
-    c1.recalculateClusterVersionState(repositoryVersionEntity);
-    checkStackVersionState(stackId, stackVersion,
-        RepositoryVersionState.CURRENT);
-  }
-
-  @Test
-  public void testRecalculateClusterVersionStateWithNotRequired() throws Exception {
-    createDefaultCluster(Sets.newHashSet("h1", "h2", "h3"));
-
-    Host h1 = clusters.getHost("h1");
-    h1.setState(HostState.HEALTHY);
-
-    Host h2 = clusters.getHost("h2");
-    h2.setState(HostState.HEALTHY);
-
-    Host h3 = clusters.getHost("h3");
-    h3.setState(HostState.HEALTHY);
-
-    // Phase 1: Install bits during distribution
-    StackId stackId = new StackId("HDP-0.1");
-    final String stackVersion = "0.1-1000";
-    RepositoryVersionEntity repositoryVersionEntity = helper.getOrCreateRepositoryVersion(
-        stackId,
-        stackVersion);
-    // Because the cluster already has a Cluster Version, an additional stack must init with INSTALLING
-    c1.createClusterVersion(stackId, stackVersion, "admin",
-        RepositoryVersionState.INSTALLING);
-    c1.setCurrentStackVersion(stackId);
-
-    HostVersionEntity hv1 = helper.createHostVersion("h1", repositoryVersionEntity, RepositoryVersionState.NOT_REQUIRED);
-    HostVersionEntity hv2 = helper.createHostVersion("h2", repositoryVersionEntity, RepositoryVersionState.INSTALLING);
-    HostVersionEntity hv3 = helper.createHostVersion("h3", repositoryVersionEntity, RepositoryVersionState.INSTALLED);
-
-    c1.recalculateClusterVersionState(repositoryVersionEntity);
-    ClusterVersionEntity cv = clusterVersionDAO.findByClusterAndStackAndVersion(c1.getClusterName(), stackId, stackVersion);
-    assertEquals(RepositoryVersionState.INSTALLING, cv.getState());
-
-    // 1 in NOT_REQUIRED, 1 in INSTALLED, 1 in CURRENT so should be INSTALLED
-    hv2.setState(RepositoryVersionState.CURRENT);
-    hostVersionDAO.merge(hv2);
-
-    c1.recalculateClusterVersionState(repositoryVersionEntity);
-    cv = clusterVersionDAO.findByClusterAndStackAndVersion(c1.getClusterName(), stackId, stackVersion);
-    assertEquals(RepositoryVersionState.INSTALLED, cv.getState());
-
-    // 1 in NOT_REQUIRED, and 2 in CURRENT, so cluster version should be CURRENT
-    hv3.setState(RepositoryVersionState.CURRENT);
-    hostVersionDAO.merge(hv3);
-
-    c1.recalculateClusterVersionState(repositoryVersionEntity);
-    cv = clusterVersionDAO.findByClusterAndStackAndVersion(c1.getClusterName(), stackId, stackVersion);
-    assertEquals(RepositoryVersionState.CURRENT, cv.getState());
-  }
-
-
-  @Test
-  public void testRecalculateAllClusterVersionStates() throws Exception {
-    createDefaultCluster();
-
-    Host h1 = clusters.getHost("h1");
-    h1.setState(HostState.HEALTHY);
-
-    Host h2 = clusters.getHost("h2");
-    h2.setState(HostState.HEALTHY);
-
-    StackId stackId = new StackId("HDP-0.1");
-    RepositoryVersionEntity repositoryVersionEntity = helper.getOrCreateRepositoryVersion(
-        stackId,
-        "0.1-1000");
-    c1.createClusterVersion(stackId, "0.1-1000", "admin",
-        RepositoryVersionState.INSTALLING);
-    c1.setCurrentStackVersion(stackId);
-    c1.recalculateAllClusterVersionStates();
-    checkStackVersionState(stackId, "0.1-1000",
-        RepositoryVersionState.INSTALLING);
-    checkStackVersionState(stackId, "0.1-2086", RepositoryVersionState.CURRENT);
-
-    HostVersionEntity hv1 = helper.createHostVersion("h1", repositoryVersionEntity, RepositoryVersionState.INSTALLING);
-    HostVersionEntity hv2 = helper.createHostVersion("h2", repositoryVersionEntity, RepositoryVersionState.INSTALLING);
-
-    c1.recalculateAllClusterVersionStates();
-    checkStackVersionState(stackId, "0.1-1000",
-        RepositoryVersionState.INSTALLING);
-    checkStackVersionState(stackId, "1.0-2086", RepositoryVersionState.CURRENT);
-
-    hv1.setState(RepositoryVersionState.INSTALL_FAILED);
-    hostVersionDAO.merge(hv1);
-    c1.recalculateAllClusterVersionStates();
-    checkStackVersionState(stackId, "0.1-1000",
-        RepositoryVersionState.INSTALL_FAILED);
-    checkStackVersionState(stackId, "0.1-2086", RepositoryVersionState.CURRENT);
-    // Retry by going back to INSTALLING
-    c1.transitionClusterVersion(stackId, "0.1-1000",
-        RepositoryVersionState.INSTALLING);
-
-    hv1.setState(RepositoryVersionState.CURRENT);
-    hostVersionDAO.merge(hv1);
-    c1.recalculateAllClusterVersionStates();
-    checkStackVersionState(stackId, "0.1-1000",
-        RepositoryVersionState.OUT_OF_SYNC);
-    checkStackVersionState(stackId, "0.1-2086", RepositoryVersionState.CURRENT);
-  }
-
   /**
-   * Comprehensive test for transitionHostVersion and recalculateClusterVersion.
-   * It creates a cluster with 3 hosts and 3 services, one of which does not advertise a version.
-   * It then verifies that all 3 hosts have a version of CURRENT, and so does the cluster.
-   * It then adds one more host with a component, so its HostVersion will initialize in CURRENT.
-   * Next, it distributes a repo so that it is INSTALLED on the 4 hosts.
-   * It then adds one more host, whose HostVersion will be OUT_OF_SYNC for the new repo.
-   * After redistributing bits again, it simulates an RU.
-   * Finally, some of the hosts will end up with a HostVersion in UPGRADED, and others still in INSTALLED.
+   * Comprehensive test for host versions. It creates a cluster with 3 hosts and
+   * 3 services, one of which does not advertise a version. It then verifies
+   * that all 3 hosts have a version of CURRENT, and so does the cluster. It
+   * then adds one more host with a component, so its HostVersion will
+   * initialize in CURRENT. Next, it distributes a repo so that it is INSTALLED
+   * on the 4 hosts. It then adds one more host, whose HostVersion will be
+   * OUT_OF_SYNC for the new repo. After redistributing bits again, it simulates
+   * an RU. Finally, some of the hosts will end up with a HostVersion in
+   * UPGRADED, and others still in INSTALLED.
+   *
    * @throws Exception
    */
   @Test
@@ -1974,7 +1666,7 @@ public class ClusterTest {
     hostAttributes.put("os_family", "redhat");
     hostAttributes.put("os_release_version", "6.4");
 
-    Cluster cluster = createClusterForRU(clusterName, stackId, hostAttributes);
+    Cluster cluster = createClusterForRU(clusterName, rv1, hostAttributes);
 
     // Begin install by starting to advertise versions
     // Set the version for the HostComponentState objects
@@ -1999,20 +1691,11 @@ public class ClusterTest {
       ServiceComponentHost scHost = svcComp.getServiceComponentHost(hce.getHostName());
 
       scHost.recalculateHostVersionState();
-      cluster.recalculateClusterVersionState(rv1);
-
-      Collection<ClusterVersionEntity> clusterVersions = cluster.getAllClusterVersions();
 
       if (versionedComponentCount > 0) {
         // On the first component with a version, a RepoVersion should have been created
         RepositoryVersionEntity repositoryVersion = repositoryVersionDAO.findByStackAndVersion(stackId, v1);
         Assert.assertNotNull(repositoryVersion);
-        Assert.assertTrue(clusterVersions != null && clusterVersions.size() == 1);
-
-        // Last component to report a version should cause the ClusterVersion to go to CURRENT
-        if (i == hostComponentStates.size() - 1) {
-          Assert.assertEquals(clusterVersions.iterator().next().getState(), RepositoryVersionState.CURRENT);
-        }
       }
     }
 
@@ -2038,7 +1721,10 @@ public class ClusterTest {
     simulateStackVersionListener(stackId, v1, cluster, hostComponentStateDAO.findByHost("h-4"));
 
     Collection<HostVersionEntity> hostVersions = hostVersionDAO.findAll();
+
+    // h-4 doesn't have a host version record yet
     Assert.assertEquals(hostVersions.size(), clusters.getHosts().size());
+
     HostVersionEntity h4Version1 = hostVersionDAO.findByClusterStackVersionAndHost(clusterName, stackId, v1, "h-4");
     Assert.assertNotNull(h4Version1);
     Assert.assertEquals(h4Version1.getState(), RepositoryVersionState.CURRENT);
@@ -2051,24 +1737,24 @@ public class ClusterTest {
       HostVersionEntity hve = new HostVersionEntity(host, rv2, RepositoryVersionState.INSTALLED);
       hostVersionDAO.create(hve);
     }
-    cluster.createClusterVersion(stackId, v2, "admin",
-        RepositoryVersionState.INSTALLING);
-    cluster.transitionClusterVersion(stackId, v2,
-        RepositoryVersionState.INSTALLED);
-
-    ClusterVersionEntity cv2 = clusterVersionDAO.findByClusterAndStackAndVersion(clusterName, stackId, v2);
-    Assert.assertNotNull(cv2);
-    Assert.assertEquals(cv2.getState(), RepositoryVersionState.INSTALLED);
 
     // Add one more Host, with only Ganglia on it. It should have a HostVersion in NOT_REQUIRED for v2,
     // as Ganglia isn't versionable
-    addHost("h-5", hostAttributes);
+    Host host5 = addHost("h-5", hostAttributes);
     clusters.mapAndPublishHostsToCluster(Collections.singleton("h-5"), clusterName);
+
+    // verify that the new host version was added for the existing repo
+    HostVersionEntity h5Version1 = hostVersionDAO.findHostVersionByHostAndRepository(host5.getHostEntity(), rv1);
+    HostVersionEntity h5Version2 = hostVersionDAO.findHostVersionByHostAndRepository(host5.getHostEntity(), rv2);
+
+    Assert.assertEquals(RepositoryVersionState.NOT_REQUIRED, h5Version1.getState());
+    Assert.assertEquals(RepositoryVersionState.NOT_REQUIRED, h5Version2.getState());
+
     ServiceComponentHost schHost5Serv3CompB = serviceComponentHostFactory.createNew(sc3CompB, "h-5");
     sc3CompB.addServiceComponentHost(schHost5Serv3CompB);
 
     // Host 5 will be in OUT_OF_SYNC, so redistribute bits to it so that it reaches a state of INSTALLED
-    HostVersionEntity h5Version2 = hostVersionDAO.findByClusterStackVersionAndHost(clusterName, stackId, v2, "h-5");
+    h5Version2 = hostVersionDAO.findByClusterStackVersionAndHost(clusterName, stackId, v2, "h-5");
     Assert.assertNotNull(h5Version2);
     Assert.assertEquals(RepositoryVersionState.NOT_REQUIRED, h5Version2.getState());
 
@@ -2100,15 +1786,11 @@ public class ClusterTest {
       ServiceComponentHost scHost = svcComp.getServiceComponentHost(hce.getHostName());
 
       scHost.recalculateHostVersionState();
-      cluster.recalculateClusterVersionState(rv2);
-
-      Collection<ClusterVersionEntity> clusterVersions = cluster.getAllClusterVersions();
 
       if (versionedComponentCount > 0) {
         // On the first component with a version, a RepoVersion should have been created
         RepositoryVersionEntity repositoryVersion = repositoryVersionDAO.findByStackAndVersion(stackId, v2);
         Assert.assertNotNull(repositoryVersion);
-        Assert.assertTrue(clusterVersions != null && clusterVersions.size() == 2);
       }
     }
 
@@ -2131,7 +1813,7 @@ public class ClusterTest {
     hostAttributes.put("os_family", "redhat");
     hostAttributes.put("os_release_version", "6.4");
 
-    Cluster cluster = createClusterForRU(clusterName, stackId, hostAttributes);
+    Cluster cluster = createClusterForRU(clusterName, rv1, hostAttributes);
 
     // Make one host unhealthy
     Host deadHost = cluster.getHosts().iterator().next();
@@ -2164,21 +1846,11 @@ public class ClusterTest {
       ServiceComponentHost scHost = svcComp.getServiceComponentHost(hce.getHostName());
 
       scHost.recalculateHostVersionState();
-      cluster.recalculateClusterVersionState(rv1);
-
-      Collection<ClusterVersionEntity> clusterVersions = cluster.getAllClusterVersions();
 
       if (versionedComponentCount > 0) {
         // On the first component with a version, a RepoVersion should have been created
         RepositoryVersionEntity repositoryVersion = repositoryVersionDAO.findByStackAndVersion(stackId, v1);
         Assert.assertNotNull(repositoryVersion);
-        Assert.assertTrue(clusterVersions != null && clusterVersions.size() == 1);
-
-        // Since host 2 is dead, and host 3 contains only components that dont report a version,
-        // cluster version transitions to CURRENT after first component on host 1 reports it's version
-        if (versionedComponentCount == 1 && i < (hostComponentStates.size() - 1)) {
-          Assert.assertEquals(clusterVersions.iterator().next().getState(), RepositoryVersionState.CURRENT);
-        }
       }
     }
   }
@@ -2205,134 +1877,50 @@ public class ClusterTest {
       hostAttributes.put("os_family", "redhat");
       hostAttributes.put("os_release_version", "5.9");
       h.setHostAttributes(hostAttributes);
+
     }
 
     String v1 = "2.0.5-1";
     String v2 = "2.0.5-2";
     c1.setDesiredStackVersion(stackId);
-    RepositoryVersionEntity rve1 = helper.getOrCreateRepositoryVersion(stackId,
-        v1);
-    RepositoryVersionEntity rve2 = helper.getOrCreateRepositoryVersion(stackId,
-        v2);
+    RepositoryVersionEntity rve1 = helper.getOrCreateRepositoryVersion(stackId, v1);
+    RepositoryVersionEntity rve2 = helper.getOrCreateRepositoryVersion(stackId, v2);
 
     c1.setCurrentStackVersion(stackId);
-    c1.createClusterVersion(stackId, v1, "admin",
-        RepositoryVersionState.INSTALLING);
-    c1.transitionClusterVersion(stackId, v1, RepositoryVersionState.CURRENT);
 
     clusters.mapHostToCluster("h-1", clusterName);
     clusters.mapHostToCluster("h-2", clusterName);
     clusters.mapHostToCluster("h-3", clusterName);
-    ClusterVersionDAOMock.failOnCurrentVersionState = false;
 
-    Service service = c1.addService("ZOOKEEPER");
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+
+    Service service = c1.addService("ZOOKEEPER", repositoryVersion);
     ServiceComponent sc = service.addServiceComponent("ZOOKEEPER_SERVER");
     sc.addServiceComponentHost("h-1");
     sc.addServiceComponentHost("h-2");
 
-    service = c1.addService("SQOOP");
+    service = c1.addService("SQOOP", repositoryVersion);
     sc = service.addServiceComponent("SQOOP");
     sc.addServiceComponentHost("h-3");
 
+    HostEntity hostEntity = hostDAO.findByName("h-3");
+    assertNotNull(hostEntity);
+
     List<HostVersionEntity> entities = hostVersionDAO.findByClusterAndHost(clusterName, "h-3");
     assertTrue("Expected no host versions", null == entities || 0 == entities.size());
 
-    c1.createClusterVersion(stackId, v2, "admin",
-        RepositoryVersionState.INSTALLING);
-    c1.transitionClusterVersion(stackId, v2, RepositoryVersionState.INSTALLED);
-    c1.transitionClusterVersion(stackId, v2, RepositoryVersionState.CURRENT);
+    List<ServiceComponentHost> componentsOnHost3 = c1.getServiceComponentHosts("h-3");
+    componentsOnHost3.iterator().next().recalculateHostVersionState();
 
     entities = hostVersionDAO.findByClusterAndHost(clusterName, "h-3");
-
     assertEquals(1, entities.size());
   }
 
-  @Test
-  public void testTransitionHostVersionState_OutOfSync_BlankCurrent() throws Exception {
-    /**
-     * Checks case when there are 2 cluster stack versions present (CURRENT and OUT_OF_SYNC),
-     * and we add a new host to cluster. On a new host, both CURRENT and OUT_OF_SYNC host
-     * versions should be present
-     */
-    StackId stackId = new StackId("HDP-2.0.5");
-    String clusterName = "c1";
-    clusters.addCluster(clusterName, stackId);
-    final Cluster c1 = clusters.getCluster(clusterName);
-    Assert.assertEquals(clusterName, c1.getClusterName());
-
-    clusters.addHost("h-1");
-    clusters.addHost("h-2");
-    String h3 = "h-3";
-    clusters.addHost(h3);
-
-    for (String hostName : new String[] { "h-1", "h-2", h3}) {
-      Host h = clusters.getHost(hostName);
-      h.setIPv4("ipv4");
-      h.setIPv6("ipv6");
-
-      Map<String, String> hostAttributes = new HashMap<>();
-      hostAttributes.put("os_family", "redhat");
-      hostAttributes.put("os_release_version", "5.9");
-      h.setHostAttributes(hostAttributes);
-    }
-
-    String v1 = "2.0.5-1";
-    String v2 = "2.0.5-2";
-    c1.setDesiredStackVersion(stackId);
-    RepositoryVersionEntity rve1 = helper.getOrCreateRepositoryVersion(stackId,
-        v1);
-    RepositoryVersionEntity rve2 = helper.getOrCreateRepositoryVersion(stackId,
-        v2);
-
-    c1.setCurrentStackVersion(stackId);
-    c1.createClusterVersion(stackId, v1, "admin",
-        RepositoryVersionState.INSTALLING);
-    c1.transitionClusterVersion(stackId, v1, RepositoryVersionState.CURRENT);
-
-    clusters.mapHostToCluster("h-1", clusterName);
-    clusters.mapHostToCluster("h-2", clusterName);
-
-    ClusterVersionDAOMock.failOnCurrentVersionState = false;
-
-    Service service = c1.addService("ZOOKEEPER");
-    ServiceComponent sc = service.addServiceComponent("ZOOKEEPER_SERVER");
-    sc.addServiceComponentHost("h-1");
-    sc.addServiceComponentHost("h-2");
-
-    c1.createClusterVersion(stackId, v2, "admin",
-        RepositoryVersionState.INSTALLING);
-    c1.transitionClusterVersion(stackId, v2, RepositoryVersionState.INSTALLED);
-    c1.transitionClusterVersion(stackId, v2, RepositoryVersionState.OUT_OF_SYNC);
-
-    clusters.mapHostToCluster(h3, clusterName);
-
-    // This method is usually called when we receive heartbeat from new host
-    HostEntity hostEntity3 = mock(HostEntity.class);
-    when(hostEntity3.getHostName()).thenReturn(h3);
-
-    // HACK: to workaround issue with NullPointerException at
-    // org.eclipse.persistence.internal.sessions.MergeManager.registerObjectForMergeCloneIntoWorkingCopy(MergeManager.java:1037)
-    // during hostVersionDAO.merge()
-    HostVersionDAO hostVersionDAOMock = mock(HostVersionDAO.class);
-    Field field = ClusterImpl.class.getDeclaredField("hostVersionDAO");
-    field.setAccessible(true);
-    field.set(c1, hostVersionDAOMock);
-
-    ArgumentCaptor<HostVersionEntity> hostVersionCaptor = ArgumentCaptor.forClass(HostVersionEntity.class);
-
-    ClusterVersionDAOMock.mockedClusterVersions = new ArrayList<ClusterVersionEntity>() {{
-      addAll(c1.getAllClusterVersions());
-    }};
-
-    c1.transitionHostVersionState(hostEntity3, rve1, stackId);
-
-    // Revert fields of static instance
-    ClusterVersionDAOMock.mockedClusterVersions = null;
-
-    verify(hostVersionDAOMock).merge(hostVersionCaptor.capture());
-    assertEquals(hostVersionCaptor.getValue().getState(), RepositoryVersionState.CURRENT);
-  }
-
+  /**
+   * Checks case when there are 2 cluster stack versions present (CURRENT and OUT_OF_SYNC),
+   * and we add a new host to cluster. On a new host, both CURRENT and OUT_OF_SYNC host
+   * versions should be present
+   */
   /**
    * Tests that an existing configuration can be successfully updated without
    * creating a new version.
@@ -2394,197 +1982,189 @@ public class ClusterTest {
   }
 
   /**
-   * Tests that {@link Cluster#applyLatestConfigurations(StackId)} sets the
+   * Tests that {@link Cluster#applyLatestConfigurations(StackId, String)} sets the
    * right configs to enabled.
    *
    * @throws Exception
    */
   @Test
   public void testApplyLatestConfigurations() throws Exception {
-    createDefaultCluster();
+    StackId stackId = new StackId("HDP-2.0.6");
+    StackId newStackId = new StackId("HDP-2.2.0");
+    createDefaultCluster(Sets.newHashSet("host-1"), stackId);
+
     Cluster cluster = clusters.getCluster("c1");
     ClusterEntity clusterEntity = clusterDAO.findByName("c1");
-    StackId stackId = cluster.getCurrentStackVersion();
-    StackId newStackId = new StackId("HDP-2.0.6");
+    RepositoryVersionEntity repoVersion220 = helper.getOrCreateRepositoryVersion(newStackId, "2.2.0-1234");
 
     StackEntity currentStack = stackDAO.find(stackId.getStackName(), stackId.getStackVersion());
     StackEntity newStack = stackDAO.find(newStackId.getStackName(), newStackId.getStackVersion());
 
-    Assert.assertFalse( stackId.equals(newStackId) );
-
-    String configType = "foo-type";
-
-    ClusterConfigEntity clusterConfig = new ClusterConfigEntity();
-    clusterConfig.setClusterEntity(clusterEntity);
-    clusterConfig.setConfigId(1L);
-    clusterConfig.setStack(currentStack);
-    clusterConfig.setTag("version-1");
-    clusterConfig.setData("{}");
-    clusterConfig.setType(configType);
-    clusterConfig.setTimestamp(1L);
-    clusterConfig.setVersion(1L);
-
-    clusterDAO.createConfig(clusterConfig);
-    clusterEntity.getClusterConfigEntities().add(clusterConfig);
-    clusterEntity = clusterDAO.merge(clusterEntity);
-
-    ClusterConfigEntity newClusterConfig = new ClusterConfigEntity();
-    newClusterConfig.setClusterEntity(clusterEntity);
-    newClusterConfig.setConfigId(2L);
-    newClusterConfig.setStack(newStack);
-    newClusterConfig.setTag("version-2");
-    newClusterConfig.setData("{}");
-    newClusterConfig.setType(configType);
-    newClusterConfig.setTimestamp(2L);
-    newClusterConfig.setVersion(2L);
+    Assert.assertFalse(stackId.equals(newStackId));
 
-    clusterDAO.createConfig(newClusterConfig);
-    clusterEntity.getClusterConfigEntities().add(newClusterConfig);
+    // add a service
+    String serviceName = "ZOOKEEPER";
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+    Service service = cluster.addService(serviceName, repositoryVersion);
+    String configType = "zoo.cfg";
+
+    ClusterConfigEntity clusterConfig1 = new ClusterConfigEntity();
+    clusterConfig1.setClusterEntity(clusterEntity);
+    clusterConfig1.setConfigId(1L);
+    clusterConfig1.setStack(currentStack);
+    clusterConfig1.setTag("version-1");
+    clusterConfig1.setData("{}");
+    clusterConfig1.setType(configType);
+    clusterConfig1.setTimestamp(1L);
+    clusterConfig1.setVersion(1L);
+    clusterConfig1.setSelected(true);
+
+    clusterDAO.createConfig(clusterConfig1);
+    clusterEntity.getClusterConfigEntities().add(clusterConfig1);
     clusterEntity = clusterDAO.merge(clusterEntity);
 
-    // config mapping set to 1
-    ClusterConfigMappingEntity configMapping = new ClusterConfigMappingEntity();
-    configMapping.setClusterEntity(clusterEntity);
-    configMapping.setCreateTimestamp(1L);
-    configMapping.setSelected(1);
-    configMapping.setTag("version-1");
-    configMapping.setType(configType);
-    configMapping.setUser("admin");
-
-    // new config mapping set to 0
-    ClusterConfigMappingEntity newConfigMapping = new ClusterConfigMappingEntity();
-    newConfigMapping.setClusterEntity(clusterEntity);
-    newConfigMapping.setCreateTimestamp(2L);
-    newConfigMapping.setSelected(0);
-    newConfigMapping.setTag("version-2");
-    newConfigMapping.setType(configType);
-    newConfigMapping.setUser("admin");
-
-    clusterDAO.persistConfigMapping(configMapping);
-    clusterDAO.persistConfigMapping(newConfigMapping);
-    clusterEntity.getConfigMappingEntities().add(configMapping);
-    clusterEntity.getConfigMappingEntities().add(newConfigMapping);
+    cluster.createServiceConfigVersion(serviceName, "", "version-1", null);
+
+    ClusterConfigEntity clusterConfig2 = new ClusterConfigEntity();
+    clusterConfig2.setClusterEntity(clusterEntity);
+    clusterConfig2.setConfigId(2L);
+    clusterConfig2.setStack(newStack);
+    clusterConfig2.setTag("version-2");
+    clusterConfig2.setData("{}");
+    clusterConfig2.setType(configType);
+    clusterConfig2.setTimestamp(2L);
+    clusterConfig2.setVersion(2L);
+    clusterConfig2.setSelected(false);
+
+    clusterDAO.createConfig(clusterConfig2);
+    clusterEntity.getClusterConfigEntities().add(clusterConfig2);
     clusterEntity = clusterDAO.merge(clusterEntity);
 
-    // check that the original mapping is enabled
-    Collection<ClusterConfigMappingEntity> clusterConfigMappings = clusterEntity.getConfigMappingEntities();
-    Assert.assertEquals(2, clusterConfigMappings.size());
-    for (ClusterConfigMappingEntity clusterConfigMapping : clusterConfigMappings) {
-      if (clusterConfigMapping.getTag().equals("version-1")) {
-        Assert.assertEquals(1, clusterConfigMapping.isSelected());
+    // before creating the new service config version, we need to push the
+    // service's desired repository forward
+    service.setDesiredRepositoryVersion(repoVersion220);
+    cluster.createServiceConfigVersion(serviceName, "", "version-2", null);
+
+    // check that the original config is enabled
+    Collection<ClusterConfigEntity> clusterConfigs = clusterEntity.getClusterConfigEntities();
+    Assert.assertEquals(2, clusterConfigs.size());
+    for (ClusterConfigEntity clusterConfig : clusterConfigs) {
+      if (clusterConfig.getTag().equals("version-1")) {
+        Assert.assertTrue(clusterConfig.isSelected());
       } else {
-        Assert.assertEquals(0, clusterConfigMapping.isSelected());
+        Assert.assertFalse(clusterConfig.isSelected());
       }
     }
 
-    cluster.applyLatestConfigurations(newStackId);
+    cluster.applyLatestConfigurations(newStackId, serviceName);
     clusterEntity = clusterDAO.findByName("c1");
 
-    // now check that the new config mapping is enabled
-    clusterConfigMappings = clusterEntity.getConfigMappingEntities();
-    Assert.assertEquals(2, clusterConfigMappings.size());
-    for (ClusterConfigMappingEntity clusterConfigMapping : clusterConfigMappings) {
-      if (clusterConfigMapping.getTag().equals("version-1")) {
-        Assert.assertEquals(0, clusterConfigMapping.isSelected());
+    // now check that the new config is enabled
+    clusterConfigs = clusterEntity.getClusterConfigEntities();
+    Assert.assertEquals(2, clusterConfigs.size());
+    for (ClusterConfigEntity clusterConfig : clusterConfigs) {
+      if (clusterConfig.getTag().equals("version-1")) {
+        Assert.assertFalse(clusterConfig.isSelected());
       } else {
-        Assert.assertEquals(1, clusterConfigMapping.isSelected());
+        Assert.assertTrue(clusterConfig.isSelected());
       }
     }
   }
 
   /**
-   * Tests that {@link Cluster#applyLatestConfigurations(StackId)} sets the
-   * right configs to enabled when there are duplicate mappings for type/tag.
-   * Only the most recent should be enabled.
+   * Tests that {@link Cluster#applyLatestConfigurations(StackId, String)} sets the
+   * right configs to enabled when setting them to a prior stack which has
+   * several configs.
    *
    * @throws Exception
    */
   @Test
-  public void testApplyLatestConfigurationsWithMultipleMappings() throws Exception {
-    createDefaultCluster();
+  public void testApplyLatestConfigurationsToPreviousStack() throws Exception {
+    StackId stackId = new StackId("HDP-2.0.6");
+    StackId newStackId = new StackId("HDP-2.2.0");
+    createDefaultCluster(Sets.newHashSet("host-1"), stackId);
+
     Cluster cluster = clusters.getCluster("c1");
     ClusterEntity clusterEntity = clusterDAO.findByName("c1");
-    StackId stackId = cluster.getCurrentStackVersion();
+    RepositoryVersionEntity repoVersion220 = helper.getOrCreateRepositoryVersion(newStackId, "2.2.0-1234");
 
     StackEntity currentStack = stackDAO.find(stackId.getStackName(), stackId.getStackVersion());
+    StackEntity newStack = stackDAO.find(newStackId.getStackName(), newStackId.getStackVersion());
 
-    String configType = "foo-type";
-    String configTag = "version-1";
+    Assert.assertFalse(stackId.equals(newStackId));
 
-    // create the config for the mappings
-    ClusterConfigEntity clusterConfig = new ClusterConfigEntity();
-    clusterConfig.setClusterEntity(clusterEntity);
-    clusterConfig.setConfigId(1L);
-    clusterConfig.setStack(currentStack);
-    clusterConfig.setTag(configTag);
-    clusterConfig.setData("{}");
-    clusterConfig.setType(configType);
-    clusterConfig.setTimestamp(1L);
-    clusterConfig.setVersion(1L);
+    // add a service
+    String serviceName = "ZOOKEEPER";
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+    Service service = cluster.addService(serviceName, repositoryVersion);
+    String configType = "zoo.cfg";
+
+    // create 5 configurations in the current stack
+    for (int i = 1; i <= 5; i++) {
+      ClusterConfigEntity clusterConfig = new ClusterConfigEntity();
+      clusterConfig.setClusterEntity(clusterEntity);
+      clusterConfig.setConfigId(Long.valueOf(i));
+      clusterConfig.setStack(currentStack);
+      clusterConfig.setTag("version-" + i);
+      clusterConfig.setData("{}");
+      clusterConfig.setType(configType);
+      clusterConfig.setTimestamp(System.currentTimeMillis());
+      clusterConfig.setVersion(Long.valueOf(i));
+
+      // set to true, then back to false to get a value populated in the
+      // selected timestamp
+      clusterConfig.setSelected(true);
+      clusterConfig.setSelected(false);
+
+      clusterDAO.createConfig(clusterConfig);
+      clusterEntity.getClusterConfigEntities().add(clusterConfig);
+
+      // ensure there is at least some pause between to ensure that the
+      // timestamps are different
+      Thread.sleep(5);
+    }
 
-    clusterDAO.createConfig(clusterConfig);
-    clusterEntity.getClusterConfigEntities().add(clusterConfig);
+    // save them all
     clusterEntity = clusterDAO.merge(clusterEntity);
 
-    // create 3 mappings for the same type/tag, each with a different time
-
-    // config mapping 1
-    ClusterConfigMappingEntity configMapping = new ClusterConfigMappingEntity();
-    configMapping.setClusterEntity(clusterEntity);
-    configMapping.setCreateTimestamp(1L);
-    configMapping.setSelected(0);
-    configMapping.setTag(configTag);
-    configMapping.setType(configType);
-    configMapping.setUser("admin");
-    clusterDAO.persistConfigMapping(configMapping);
-    clusterEntity.getConfigMappingEntities().add(configMapping);
-
-    // config mapping 2
-    configMapping = new ClusterConfigMappingEntity();
-    configMapping.setClusterEntity(clusterEntity);
-    configMapping.setCreateTimestamp(2L);
-    configMapping.setSelected(0);
-    configMapping.setTag(configTag);
-    configMapping.setType(configType);
-    configMapping.setUser("admin");
-    clusterDAO.persistConfigMapping(configMapping);
-    clusterEntity.getConfigMappingEntities().add(configMapping);
-
-    // config mapping 3
-    configMapping = new ClusterConfigMappingEntity();
-    configMapping.setClusterEntity(clusterEntity);
-    configMapping.setCreateTimestamp(3L);
-    configMapping.setSelected(0);
-    configMapping.setTag(configTag);
-    configMapping.setType(configType);
-    configMapping.setUser("admin");
-    clusterDAO.persistConfigMapping(configMapping);
-    clusterEntity.getConfigMappingEntities().add(configMapping);
-
+    // create a service configuration for them
+    cluster.createServiceConfigVersion(serviceName, "", "version-1", null);
+
+    // create a new configuration in the new stack and enable it
+    ClusterConfigEntity clusterConfigNewStack = new ClusterConfigEntity();
+    clusterConfigNewStack.setClusterEntity(clusterEntity);
+    clusterConfigNewStack.setConfigId(6L);
+    clusterConfigNewStack.setStack(newStack);
+    clusterConfigNewStack.setTag("version-6");
+    clusterConfigNewStack.setData("{}");
+    clusterConfigNewStack.setType(configType);
+    clusterConfigNewStack.setTimestamp(System.currentTimeMillis());
+    clusterConfigNewStack.setVersion(6L);
+    clusterConfigNewStack.setSelected(true);
+
+    clusterDAO.createConfig(clusterConfigNewStack);
+    clusterEntity.getClusterConfigEntities().add(clusterConfigNewStack);
     clusterEntity = clusterDAO.merge(clusterEntity);
 
-    // check all 3 mappings are disabled
-    Collection<ClusterConfigMappingEntity> clusterConfigMappings = clusterEntity.getConfigMappingEntities();
-    Assert.assertEquals(3, clusterConfigMappings.size());
-    for (ClusterConfigMappingEntity clusterConfigMapping : clusterConfigMappings) {
-      Assert.assertEquals(0, clusterConfigMapping.isSelected());
-    }
+    // before creating the new service config version, we need to push the
+    // service's desired repository forward
+    service.setDesiredRepositoryVersion(repoVersion220);
+    cluster.createServiceConfigVersion(serviceName, "", "version-2", null);
 
-    // apply configurations and check to see we've set the one with the latest
-    // timestamp ONLY
-    cluster.applyLatestConfigurations(cluster.getCurrentStackVersion());
+    // check that only the newest configuration is enabled
+    ClusterConfigEntity clusterConfig = clusterDAO.findEnabledConfigByType(
+        clusterEntity.getClusterId(), configType);
+    Assert.assertTrue(clusterConfig.isSelected());
+    Assert.assertEquals(clusterConfigNewStack.getTag(), clusterConfig.getTag());
+
+    // move back to the original stack
+    cluster.applyLatestConfigurations(stackId, serviceName);
     clusterEntity = clusterDAO.findByName("c1");
 
-    // now check that the new config mapping is enabled
-    clusterConfigMappings = clusterEntity.getConfigMappingEntities();
-    Assert.assertEquals(3, clusterConfigMappings.size());
-    for (ClusterConfigMappingEntity clusterConfigMapping : clusterConfigMappings) {
-      if (clusterConfigMapping.getCreateTimestamp() < 3) {
-        Assert.assertEquals(0, clusterConfigMapping.isSelected());
-      } else {
-        Assert.assertEquals(1, clusterConfigMapping.isSelected());
-      }
-    }
+    // now check that latest config from the original stack is enabled
+    clusterConfig = clusterDAO.findEnabledConfigByType(clusterEntity.getClusterId(), configType);
+    Assert.assertTrue(clusterConfig.isSelected());
+    Assert.assertEquals("version-5", clusterConfig.getTag());
   }
 
   /**
@@ -2593,65 +2173,73 @@ public class ClusterTest {
    */
   @Test
   public void testDesiredConfigurationsAfterApplyingLatestForStack() throws Exception {
-    createDefaultCluster();
-    Cluster cluster = clusters.getCluster("c1");
-    StackId stackId = cluster.getCurrentStackVersion();
+    StackId stackId = new StackId("HDP-2.0.6");
     StackId newStackId = new StackId("HDP-2.2.0");
+    createDefaultCluster(Sets.newHashSet("host-1"), stackId);
+
+    Cluster cluster = clusters.getCluster("c1");
+    RepositoryVersionEntity repoVersion220 = helper.getOrCreateRepositoryVersion(newStackId, "2.2.0-1234");
 
     ConfigHelper configHelper = injector.getInstance(ConfigHelper.class);
 
     // make sure the stacks are different
     Assert.assertFalse(stackId.equals(newStackId));
 
+    // add a service
+    String serviceName = "ZOOKEEPER";
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+    Service service = cluster.addService(serviceName, repositoryVersion);
+    String configType = "zoo.cfg";
+
     Map<String, String> properties = new HashMap<>();
     Map<String, Map<String, String>> propertiesAttributes = new HashMap<>();
 
-    // foo-type for v1 on current stack
+    // config for v1 on current stack
     properties.put("foo-property-1", "foo-value-1");
-    Config c1 = configFactory.createNew(cluster, "foo-type", "version-1", properties, propertiesAttributes);
+    Config c1 = configFactory.createNew(cluster, configType, "version-1", properties, propertiesAttributes);
 
     // make v1 "current"
     cluster.addDesiredConfig("admin", Sets.newHashSet(c1), "note-1");
 
-    // bump the stack
-    cluster.setDesiredStackVersion(newStackId);
+    // bump the repo version
+    service.setDesiredRepositoryVersion(repoVersion220);
 
     // save v2
-    // foo-type for v2 on new stack
+    // config for v2 on new stack
     properties.put("foo-property-2", "foo-value-2");
-    Config c2 = configFactory.createNew(cluster, "foo-type", "version-2", properties, propertiesAttributes);
+    Config c2 = configFactory.createNew(cluster, configType, "version-2", properties, propertiesAttributes);
 
     // make v2 "current"
     cluster.addDesiredConfig("admin", Sets.newHashSet(c2), "note-2");
 
     // check desired config
     Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs();
-    DesiredConfig desiredConfig = desiredConfigs.get("foo-type");
-    desiredConfig = desiredConfigs.get("foo-type");
+    DesiredConfig desiredConfig = desiredConfigs.get(configType);
+    desiredConfig = desiredConfigs.get(configType);
     assertNotNull(desiredConfig);
     assertEquals(Long.valueOf(2), desiredConfig.getVersion());
     assertEquals("version-2", desiredConfig.getTag());
 
     String hostName = cluster.getHosts().iterator().next().getHostName();
 
-    // {foo-type={tag=version-2}}
+    // {config-type={tag=version-2}}
     Map<String, Map<String, String>> effectiveDesiredTags = configHelper.getEffectiveDesiredTags(
         cluster, hostName);
 
-    assertEquals("version-2", effectiveDesiredTags.get("foo-type").get("tag"));
+    assertEquals("version-2", effectiveDesiredTags.get(configType).get("tag"));
 
-    // move the stack back to the old stack
-    cluster.setDesiredStackVersion(stackId);
+    // move the service back to the old repo version / stack
+    service.setDesiredRepositoryVersion(repositoryVersion);
 
     // apply the configs for the old stack
-    cluster.applyLatestConfigurations(stackId);
+    cluster.applyLatestConfigurations(stackId, serviceName);
 
-    // {foo-type={tag=version-1}}
+    // {config-type={tag=version-1}}
     effectiveDesiredTags = configHelper.getEffectiveDesiredTags(cluster, hostName);
-    assertEquals("version-1", effectiveDesiredTags.get("foo-type").get("tag"));
+    assertEquals("version-1", effectiveDesiredTags.get(configType).get("tag"));
 
     desiredConfigs = cluster.getDesiredConfigs();
-    desiredConfig = desiredConfigs.get("foo-type");
+    desiredConfig = desiredConfigs.get(configType);
     assertNotNull(desiredConfig);
     assertEquals(Long.valueOf(1), desiredConfig.getVersion());
     assertEquals("version-1", desiredConfig.getTag());
@@ -2664,18 +2252,24 @@ public class ClusterTest {
    */
   @Test
   public void testRemoveConfigurations() throws Exception {
-    createDefaultCluster();
+    StackId stackId = new StackId("HDP-2.0.6");
+    StackId newStackId = new StackId("HDP-2.2.0");
+    createDefaultCluster(Sets.newHashSet("host-1"), stackId);
+
     Cluster cluster = clusters.getCluster("c1");
     ClusterEntity clusterEntity = clusterDAO.findByName("c1");
-    StackId stackId = cluster.getCurrentStackVersion();
-    StackId newStackId = new StackId("HDP-2.0.6");
+    RepositoryVersionEntity repoVersion220 = helper.getOrCreateRepositoryVersion(newStackId, "2.2.0-1234");
 
     StackEntity currentStack = stackDAO.find(stackId.getStackName(), stackId.getStackVersion());
     StackEntity newStack = stackDAO.find(newStackId.getStackName(), newStackId.getStackVersion());
 
     Assert.assertFalse(stackId.equals(newStackId));
 
-    String configType = "foo-type";
+    // add a service
+    String serviceName = "ZOOKEEPER";
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(c1);
+    Service service = cluster.addService(serviceName, repositoryVersion);
+    String configType = "zoo.cfg";
 
     ClusterConfigEntity clusterConfig = new ClusterConfigEntity();
     clusterConfig.setClusterEntity(clusterEntity);
@@ -2686,11 +2280,19 @@ public class ClusterTest {
     clusterConfig.setType(configType);
     clusterConfig.setTimestamp(1L);
     clusterConfig.setVersion(1L);
+    clusterConfig.setSelected(true);
 
     clusterDAO.createConfig(clusterConfig);
     clusterEntity.getClusterConfigEntities().add(clusterConfig);
     clusterEntity = clusterDAO.merge(clusterEntity);
 
+    // create the service version association
+    cluster.createServiceConfigVersion(serviceName, "", "version-1", null);
+
+    // now un-select it and create a new config
+    clusterConfig.setSelected(false);
+    clusterConfig = clusterDAO.merge(clusterConfig);
+
     ClusterConfigEntity newClusterConfig = new ClusterConfigEntity();
     newClusterConfig.setClusterEntity(clusterEntity);
     newClusterConfig.setConfigId(2L);
@@ -2700,34 +2302,18 @@ public class ClusterTest {
     newClusterConfig.setType(configType);
     newClusterConfig.setTimestamp(2L);
     newClusterConfig.setVersion(2L);
+    newClusterConfig.setSelected(true);
 
     clusterDAO.createConfig(newClusterConfig);
     clusterEntity.getClusterConfigEntities().add(newClusterConfig);
     clusterEntity = clusterDAO.merge(clusterEntity);
 
-    // config mapping set to 1
-    ClusterConfigMappingEntity configMapping = new ClusterConfigMappingEntity();
-    configMapping.setClusterEntity(clusterEntity);
-    configMapping.setCreateTimestamp(1L);
-    configMapping.setSelected(1);
-    configMapping.setTag("version-1");
-    configMapping.setType(configType);
-    configMapping.setUser("admin");
-
-    // new config mapping set to 0
-    ClusterConfigMappingEntity newConfigMapping = new ClusterConfigMappingEntity();
-    newConfigMapping.setClusterEntity(clusterEntity);
-    newConfigMapping.setCreateTimestamp(2L);
-    newConfigMapping.setSelected(0);
-    newConfigMapping.setTag("version-2");
-    newConfigMapping.setType(configType);
-    newConfigMapping.setUser("admin");
-
-    clusterDAO.persistConfigMapping(configMapping);
-    clusterDAO.persistConfigMapping(newConfigMapping);
-    clusterEntity.getConfigMappingEntities().add(configMapping);
-    clusterEntity.getConfigMappingEntities().add(newConfigMapping);
-    clusterEntity = clusterDAO.merge(clusterEntity);
+    // before creating the new service config version, we need to push the
+    // service's desired repository forward
+    service.setDesiredRepositoryVersion(repoVersion220);
+    cluster.createServiceConfigVersion(serviceName, "", "version-2", null);
+
+    cluster.applyLatestConfigurations(newStackId, serviceName);
 
     // get back the cluster configs for the new stack
     List<ClusterConfigEntity> clusterConfigs = clusterDAO.getAllConfigurations(
@@ -2736,7 +2322,7 @@ public class ClusterTest {
     Assert.assertEquals(1, clusterConfigs.size());
 
     // remove the configs
-    cluster.removeConfigurations(newStackId);
+    cluster.removeConfigurations(newStackId, serviceName);
 
     clusterConfigs = clusterDAO.getAllConfigurations(cluster.getClusterId(), newStackId);
     Assert.assertEquals(0, clusterConfigs.size());
@@ -2771,27 +2357,4 @@ public class ClusterTest {
 
     assertFalse(((ClusterImpl) cluster).isClusterPropertyCached("foo"));
   }
-
-  /**
-   * Tests that the {@link ClusterVersionEntity} can be created initially with a
-   * state of {@link RepositoryVersionState#INSTALLED}. This state is needed for
-   * {@link UpgradeType#HOST_ORDERED}.
-   *
-   * @throws Exception
-   */
-  @Test
-  public void testClusterVersionCreationWithInstalledState() throws Exception {
-    StackId stackId = new StackId("HDP", "0.1");
-    StackEntity stackEntity = stackDAO.find(stackId.getStackName(), stackId.getStackVersion());
-    org.junit.Assert.assertNotNull(stackEntity);
-
-    String clusterName = "c1";
-    clusters.addCluster(clusterName, stackId);
-    c1 = clusters.getCluster(clusterName);
-
-    helper.getOrCreateRepositoryVersion(stackId, stackId.getStackVersion());
-
-    c1.createClusterVersion(stackId, stackId.getStackVersion(), "admin",
-        RepositoryVersionState.INSTALLED);
-  }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/56362fd6/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersDeadlockTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersDeadlockTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersDeadlockTest.java
index 2f289bb..a52c0c5 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersDeadlockTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersDeadlockTest.java
@@ -1,4 +1,4 @@
-/**
+/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
@@ -34,10 +34,10 @@ import org.apache.ambari.server.events.listeners.upgrade.HostVersionOutOfSyncLis
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
 import org.apache.ambari.server.orm.OrmTestHelper;
+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.Host;
-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.ServiceComponentFactory;
@@ -75,7 +75,8 @@ public class ClustersDeadlockTest {
   private CountDownLatch writerStoppedSignal;
   private CountDownLatch readerStoppedSignal;
 
-  private final StackId stackId = new StackId("HDP-0.1");
+  private StackId stackId = new StackId("HDP-0.1");
+  private String REPO_VERSION = "0.1-1234";
 
   @Inject
   private Injector injector;
@@ -106,12 +107,12 @@ public class ClustersDeadlockTest {
     injector.injectMembers(this);
 
     StackId stackId = new StackId("HDP-0.1");
+    helper.createStack(stackId);
+
     clusters.addCluster(CLUSTER_NAME, stackId);
 
     cluster = clusters.getCluster(CLUSTER_NAME);
     helper.getOrCreateRepositoryVersion(stackId, stackId.getStackVersion());
-    cluster.createClusterVersion(stackId, stackId.getStackVersion(), "admin",
-        RepositoryVersionState.INSTALLING);
 
     // install HDFS
     installService("HDFS");
@@ -139,7 +140,7 @@ public class ClustersDeadlockTest {
                           final int numberOfThreads,
                           CountDownLatch writerStoppedSignal,
                           CountDownLatch readerStoppedSignal) throws Exception {
-    List<Thread> writerThreads = new ArrayList<Thread>();
+    List<Thread> writerThreads = new ArrayList<>();
     for (int i = 0; i < numberOfThreads; i++) {
       Thread readerThread = readerProvider.get();
       Thread writerThread = writerProvider.get();
@@ -347,7 +348,7 @@ public class ClustersDeadlockTest {
      */
     @Override
     public void run() {
-      List<String> hostNames = new ArrayList<String>(100);
+      List<String> hostNames = new ArrayList<>(100);
       try {
         // pre-map the hosts
         for (int i = 0; i < NUMBER_OF_HOSTS; i++) {
@@ -372,7 +373,7 @@ public class ClustersDeadlockTest {
 
 
   private void setOsFamily(Host host, String osFamily, String osVersion) {
-    Map<String, String> hostAttributes = new HashMap<String, String>(2);
+    Map<String, String> hostAttributes = new HashMap<>(2);
     hostAttributes.put("os_family", osFamily);
     hostAttributes.put("os_release_version", osVersion);
     host.setHostAttributes(hostAttributes);
@@ -381,10 +382,13 @@ public class ClustersDeadlockTest {
   private Service installService(String serviceName) throws AmbariException {
     Service service = null;
 
+    RepositoryVersionEntity repositoryVersion = helper.getOrCreateRepositoryVersion(
+        stackId, REPO_VERSION);
+
     try {
       service = cluster.getService(serviceName);
     } catch (ServiceNotFoundException e) {
-      service = serviceFactory.createNew(cluster, serviceName);
+      service = serviceFactory.createNew(cluster, serviceName, repositoryVersion);
       cluster.addService(service);
     }
 
@@ -418,8 +422,6 @@ public class ClustersDeadlockTest {
     sc.addServiceComponentHost(sch);
     sch.setDesiredState(State.INSTALLED);
     sch.setState(State.INSTALLED);
-    sch.setDesiredStackVersion(stackId);
-    sch.setStackVersion(stackId);
 
     return sch;
   }
@@ -439,4 +441,4 @@ public class ClustersDeadlockTest {
           EasyMock.createNiceMock(HostVersionOutOfSyncListener.class));
     }
   }
-}
+}
\ No newline at end of file