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
