You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2013/04/26 22:59:06 UTC

svn commit: r1476403 - in /incubator/ambari/trunk: CHANGES.txt ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java

Author: ncole
Date: Fri Apr 26 20:59:05 2013
New Revision: 1476403

URL: http://svn.apache.org/r1476403
Log:
AMBARI-2036. Fix to send global configs with status_commands

Modified:
    incubator/ambari/trunk/CHANGES.txt
    incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java
    incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java

Modified: incubator/ambari/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/CHANGES.txt?rev=1476403&r1=1476402&r2=1476403&view=diff
==============================================================================
--- incubator/ambari/trunk/CHANGES.txt (original)
+++ incubator/ambari/trunk/CHANGES.txt Fri Apr 26 20:59:05 2013
@@ -1298,6 +1298,8 @@ Trunk (unreleased changes):
  AMBARI-1657. User directories on HDFS do not get created with custom names 
  provided from Ambari UI. (swagle)
 
+ AMBARI-2036. Fix to send global configs with status_commands to agents. (ncole)
+
  AMBARI-2025. Fix to restrict how UNKNOWN is assigned to a host-component. (ncole)
 
  AMBARI-2013. Fix to delete cluster with components in unknown state. (ncole)

Modified: incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java?rev=1476403&r1=1476402&r2=1476403&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java (original)
+++ incubator/ambari/trunk/ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java Fri Apr 26 20:59:05 2013
@@ -21,12 +21,14 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
+import java.util.HashMap;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.actionmanager.ActionManager;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
+import org.apache.ambari.server.state.DesiredConfig;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.HostState;
 import org.apache.ambari.server.state.Service;
@@ -174,25 +176,53 @@ public class HeartbeatMonitor implements
    */
   public List<StatusCommand> generateStatusCommands(String hostname) throws AmbariException {
     List<StatusCommand> cmds = new ArrayList<StatusCommand>();
+    
     for (Cluster cl : fsm.getClustersForHost(hostname)) {
-      List<ServiceComponentHost> roleList = cl
-              .getServiceComponentHosts(hostname);
-      for (ServiceComponentHost sch : roleList) {
+      
+      for (ServiceComponentHost sch : cl.getServiceComponentHosts(hostname)) {
         String serviceName = sch.getServiceName();
         if (LOG.isDebugEnabled()) {
-          LOG.debug("Live status will include status of service " + serviceName +
-                " of cluster " + cl.getClusterName());
+          LOG.debug("Live status will include status of service " + serviceName + " of cluster " + cl.getClusterName());
         }
         
-        Map<String, Config> configs = sch.getDesiredConfigs();
+        Map<String, Map<String, String>> configurations = new TreeMap<String, Map<String, String>>();
         
-        Map<String, Map<String, String>> configurations =
-            new TreeMap<String, Map<String, String>>();
+        // get the cluster config for type 'global'
+        // apply service overrides, if the tag is not the same
+        // apply host overrides, if any
+        
+        Config clusterConfig = cl.getDesiredConfigByType("global");
+        if (null != clusterConfig) {
+          // cluster config for 'global'
+          Map<String,String> props = new HashMap<String, String>(clusterConfig.getProperties());
+
+          // apply service overrides, only if the tag is not the same (for when service configs are overrides)
+          Service service = cl.getService(sch.getServiceName());
+          Config svcConfig = service.getDesiredConfigs().get("global");
+          if (null != svcConfig && !svcConfig.getVersionTag().equals(clusterConfig.getVersionTag())) {
+            props.putAll(svcConfig.getProperties());
+          }
+          
+          // apply host overrides, if any
+          Host host = fsm.getHost(hostname);
+          DesiredConfig dc = host.getDesiredConfigs(cl.getClusterId()).get("global");
+          if (null != dc) {
+            Config hostConfig = cl.getConfig("global", dc.getVersion());
+            if (null != hostConfig) {
+              props.putAll(hostConfig.getProperties());
+            }
+          }
+          
+          configurations.put("global", props);
+        }
         
-        for (Config config : configs.values()) {
-          if (config.getType().equals("global"))
-            configurations.put(config.getType(),
-              config.getProperties());
+        // HACK - if any service exists with global tag, and we have none, use
+        // that instead
+        if (configurations.isEmpty()) {
+          Service service = cl.getService(sch.getServiceName());
+          Config config = service.getDesiredConfigs().get("global");
+          if (null != config)
+            configurations.put("global", new HashMap<String,String>(config.getProperties()));
         }
         
         StatusCommand statusCmd = new StatusCommand();

Modified: incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java
URL: http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java?rev=1476403&r1=1476402&r2=1476403&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java (original)
+++ incubator/ambari/trunk/ambari-server/src/test/java/org/apache/ambari/server/agent/TestHeartbeatMonitor.java Fri Apr 26 20:59:05 2013
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.atLeas
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -37,6 +38,8 @@ import org.apache.ambari.server.orm.Guic
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.Config;
+import org.apache.ambari.server.state.ConfigFactory;
 import org.apache.ambari.server.state.HostState;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
@@ -103,6 +106,15 @@ public class TestHeartbeatMonitor {
       add(hostname1);
       add(hostname2);
     }};
+    
+    ConfigFactory configFactory = injector.getInstance(ConfigFactory.class);
+    Config config = configFactory.createNew(cluster, "global",
+        new HashMap<String,String>() {{ put("a", "b"); }});
+    config.setVersionTag("version1");
+    cluster.addConfig(config);
+    cluster.addDesiredConfig(config);
+    
+    
     clusters.mapHostsToCluster(hostNames, clusterName);
     Service hdfs = cluster.addService(serviceName);
     hdfs.persist();
@@ -144,10 +156,12 @@ public class TestHeartbeatMonitor {
       containsDATANODEStatus |= cmd.getComponentName().equals("DATANODE");
       containsNAMENODEStatus |= cmd.getComponentName().equals("NAMENODE");
       containsSECONDARY_NAMENODEStatus |= cmd.getComponentName().equals("SECONDARY_NAMENODE");
+      assertTrue(cmd.getConfigurations().size() > 0);
     }
     assertEquals(true, containsDATANODEStatus);
     assertEquals(true, containsNAMENODEStatus);
     assertEquals(true, containsSECONDARY_NAMENODEStatus);
+    
     cmds = hm.generateStatusCommands(hostname2);
     assertTrue("HeartbeatMonitor should not generate StatusCommands for host2 because it has no services", cmds.isEmpty());
   }