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>

Reply via email to