Repository: ambari Updated Branches: refs/heads/trunk 1d4959442 -> 52f34cc7a
AMBARI-9755. After cluster install one host doesn't have any stack version (ncole) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/52f34cc7 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/52f34cc7 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/52f34cc7 Branch: refs/heads/trunk Commit: 52f34cc7a7f824caffbf54d8e61a23dd3406a45b Parents: 1d49594 Author: Nate Cole <nc...@hortonworks.com> Authored: Mon Feb 23 14:47:11 2015 -0500 Committer: Nate Cole <nc...@hortonworks.com> Committed: Mon Feb 23 17:43:22 2015 -0500 ---------------------------------------------------------------------- .../server/state/cluster/ClusterImpl.java | 74 ++++++++++++++++++ .../package/scripts/zookeeper_server.py | 5 +- .../server/state/cluster/ClusterTest.java | 79 ++++++++++++++++++-- .../HDP/2.0.5/services/ZOOKEEPER/metainfo.xml | 1 + 4 files changed, 149 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/52f34cc7/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java index c609b0a..b2ba43b 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java @@ -1500,6 +1500,53 @@ public class ClusterImpl implements Cluster { existingClusterVersion.setState(state); existingClusterVersion.setEndTime(System.currentTimeMillis()); clusterVersionDAO.merge(existingClusterVersion); + + if (RepositoryVersionState.CURRENT == state) { + for (HostEntity he : clusterEntity.getHostEntities()) { + if (hostHasReportables(existingClusterVersion.getRepositoryVersion(), he)) { + continue; + } + + Collection<HostVersionEntity> versions = hostVersionDAO.findByHost( + he.getHostName()); + + if (null == versions || versions.isEmpty()) { + // no versions whatsoever + HostVersionEntity hve = new HostVersionEntity(); + hve.setHostEntity(he); + hve.setHostName(he.getHostName()); + hve.setRepositoryVersion(existingClusterVersion.getRepositoryVersion()); + hve.setState(state); + hostVersionDAO.create(hve); + } else { + HostVersionEntity target = null; + // set anything that is marked current as installed + for (HostVersionEntity entity : versions) { + if (entity.getRepositoryVersion().getId().equals( + existingClusterVersion.getRepositoryVersion().getId())) { + target = entity; + target.setState(state); + hostVersionDAO.merge(target); + } else if (entity.getState() == state) { + entity.setState(RepositoryVersionState.INSTALLED); + hostVersionDAO.merge(entity); + } + } + if (null == target) { + // not found in existing list, make one + HostVersionEntity hve = new HostVersionEntity(); + hve.setHostEntity(he); + hve.setHostName(he.getHostName()); + hve.setRepositoryVersion(existingClusterVersion.getRepositoryVersion()); + hve.setState(state); + hostVersionDAO.create(hve); + } + + } + } + } + + } } catch (RollbackException e) { String message = "Unable to transition stack " + stack + " at version " @@ -1511,6 +1558,33 @@ public class ClusterImpl implements Cluster { } } + /** + * Checks if the host has any components reporting version information. + * @param repoVersion the repo version + * @param host the host entity + * @return {@code true} if the host has any component that report version + * @throws AmbariException + */ + private boolean hostHasReportables(RepositoryVersionEntity repoVersion, HostEntity host) + throws AmbariException { + + for (HostComponentStateEntity hcse : host.getHostComponentStateEntities()) { + ComponentInfo ci = ambariMetaInfo.getComponent( + repoVersion.getStackName(), + repoVersion.getStackVersion(), + hcse.getServiceName(), + hcse.getComponentName()); + + if (ci.isVersionAdvertised()) { + return true; + } + } + + + return false; + } + + @Override public void setCurrentStackVersion(StackId stackVersion) throws AmbariException { http://git-wip-us.apache.org/repos/asf/ambari/blob/52f34cc7/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5.2.0/package/scripts/zookeeper_server.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5.2.0/package/scripts/zookeeper_server.py b/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5.2.0/package/scripts/zookeeper_server.py index 92465a0..383a576 100644 --- a/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5.2.0/package/scripts/zookeeper_server.py +++ b/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5.2.0/package/scripts/zookeeper_server.py @@ -26,11 +26,12 @@ from resource_management.libraries.functions.version import compare_versions, fo from resource_management.libraries.functions.security_commons import build_expectations, \ cached_kinit_executor, get_params_from_filesystem, validate_security_config_properties, \ FILE_TYPE_JAAS_CONF -from resource_management.libraries.functions.format import format from resource_management.core.shell import call -from resource_management.libraries.functions.validate import call_and_match_output from resource_management.core.logger import Logger +from resource_management.core.resources.system import Execute from resource_management.libraries.functions.check_process_status import check_process_status +from resource_management.libraries.functions.format import format +from resource_management.libraries.functions.validate import call_and_match_output from zookeeper import zookeeper from zookeeper_service import zookeeper_service http://git-wip-us.apache.org/repos/asf/ambari/blob/52f34cc7/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 8865b26..7d5f734 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 @@ -40,10 +40,6 @@ import java.util.Set; import javax.persistence.EntityManager; import javax.persistence.RollbackException; -import com.google.inject.AbstractModule; -import com.google.inject.Singleton; -import com.google.inject.persist.Transactional; -import com.google.inject.util.Modules; import junit.framework.Assert; import org.apache.ambari.server.AmbariException; @@ -70,7 +66,6 @@ import org.apache.ambari.server.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntity; import org.apache.ambari.server.state.AgentVersion; import org.apache.ambari.server.state.Cluster; -import org.apache.ambari.server.state.RepositoryVersionState; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.Config; import org.apache.ambari.server.state.ConfigFactory; @@ -79,6 +74,7 @@ import org.apache.ambari.server.state.DesiredConfig; import org.apache.ambari.server.state.Host; import org.apache.ambari.server.state.HostHealthStatus; import org.apache.ambari.server.state.HostState; +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; @@ -95,16 +91,17 @@ import org.apache.ambari.server.state.host.HostRegistrationRequestEvent; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; 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.PersistService; +import com.google.inject.persist.Transactional; +import com.google.inject.util.Modules; public class ClusterTest { - private static final Logger LOG = LoggerFactory.getLogger(ClusterTest.class); private Clusters clusters; private Cluster c1; @@ -1160,4 +1157,70 @@ public class ClusterTest { checkStackVersionState(stackId.getStackId(), "1.0-1000", RepositoryVersionState.OUT_OF_SYNC); checkStackVersionState(stackId.getStackId(), "1.0-2086", RepositoryVersionState.CURRENT); } + + @Test + public void testTransitionNonReportableHost() throws Exception { + String clusterName = "c2"; + clusters.addCluster(clusterName); + Cluster c2 = clusters.getCluster(clusterName); + Assert.assertEquals(clusterName, c2.getClusterName()); + Assert.assertEquals(2, c2.getClusterId()); + + clusters.addHost("h-1"); + clusters.addHost("h-2"); + clusters.addHost("h-3"); + + for (String hostName : new String[] { "h-1", "h-2", "h-3" }) { + Host h = clusters.getHost(hostName); + h.setIPv4("ipv4"); + h.setIPv6("ipv6"); + + Map<String, String> hostAttributes = new HashMap<String, String>(); + hostAttributes.put("os_family", "redhat"); + hostAttributes.put("os_release_version", "5.9"); + h.setHostAttributes(hostAttributes); + h.persist(); + } + + + String v1 = "2.0.5-1"; + String v2 = "2.0.5-2"; + StackId stackId = new StackId("HDP-2.0.5"); + c2.setDesiredStackVersion(stackId); + RepositoryVersionEntity rve1 = helper.getOrCreateRepositoryVersion(stackId.getStackName(), v1); + RepositoryVersionEntity rve2 = helper.getOrCreateRepositoryVersion(stackId.getStackName(), v2); + + c2.setCurrentStackVersion(stackId); + c2.createClusterVersion(stackId.getStackName(), v1, "admin", RepositoryVersionState.UPGRADING); + c2.transitionClusterVersion(stackId.getStackName(), v1, RepositoryVersionState.CURRENT); + + clusters.mapHostToCluster("h-1", "c2"); + clusters.mapHostToCluster("h-2", "c2"); + clusters.mapHostToCluster("h-3", "c2"); + ClusterVersionDAOMock.failOnCurrentVersionState = false; + + Service service = c2.addService("ZOOKEEPER"); + ServiceComponent sc = service.addServiceComponent("ZOOKEEPER_SERVER"); + sc.addServiceComponentHost("h-1"); + sc.addServiceComponentHost("h-2"); + + service = c2.addService("SQOOP"); + sc = service.addServiceComponent("SQOOP"); + sc.addServiceComponentHost("h-3"); + + List<HostVersionEntity> entities = hostVersionDAO.findByClusterAndHost(clusterName, "h-3"); + assertTrue("Expected no host versions", null == entities || 0 == entities.size()); + + c2.createClusterVersion(stackId.getStackName(), v2, "admin", RepositoryVersionState.INSTALLING); + c2.transitionClusterVersion(stackId.getStackName(), v2, RepositoryVersionState.INSTALLED); + c2.transitionClusterVersion(stackId.getStackName(), v2, RepositoryVersionState.UPGRADING); + c2.transitionClusterVersion(stackId.getStackName(), v2, RepositoryVersionState.UPGRADED); + + c2.transitionClusterVersion(stackId.getStackName(), v2, RepositoryVersionState.CURRENT); + + entities = hostVersionDAO.findByClusterAndHost(clusterName, "h-3"); + + assertEquals(1, entities.size()); + } + } http://git-wip-us.apache.org/repos/asf/ambari/blob/52f34cc7/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/ZOOKEEPER/metainfo.xml ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/ZOOKEEPER/metainfo.xml b/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/ZOOKEEPER/metainfo.xml index e17bbd3..205b445 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/ZOOKEEPER/metainfo.xml +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.5/services/ZOOKEEPER/metainfo.xml @@ -29,6 +29,7 @@ <name>ZOOKEEPER_SERVER</name> <category>MASTER</category> <cardinality>1+</cardinality> + <versionAdvertised>true</versionAdvertised> <commandScript> <script>scripts/zookeeper_server.py</script> <scriptType>PYTHON</scriptType>