You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jl...@apache.org on 2015/11/14 00:01:56 UTC

ambari git commit: AMBARI-9363: role_command_order.json should not be at stack level (Tim Thorpe via jluniya)

Repository: ambari
Updated Branches:
  refs/heads/trunk 46d715418 -> aeac887af


AMBARI-9363: role_command_order.json should not be at stack level (Tim Thorpe via jluniya)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/aeac887a
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/aeac887a
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/aeac887a

Branch: refs/heads/trunk
Commit: aeac887af133834553355ef803a8ac59827795d1
Parents: 46d7154
Author: Jayush Luniya <jl...@hortonworks.com>
Authored: Fri Nov 13 15:01:50 2015 -0800
Committer: Jayush Luniya <jl...@hortonworks.com>
Committed: Fri Nov 13 15:01:50 2015 -0800

----------------------------------------------------------------------
 .../ambari/server/stack/StackDirectory.java     | 42 +++++++++++++-
 .../state/stack/StackRoleCommandOrder.java      | 59 +++++++++++++++++++-
 .../ambari/server/stack/StackManagerTest.java   |  9 +++
 .../2.1.1/services/PIG/role_command_order.json  | 12 ++++
 4 files changed, 117 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/aeac887a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java
index 90b8f10..9cfeffe 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackDirectory.java
@@ -32,6 +32,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.xml.bind.JAXBException;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -39,7 +40,9 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Encapsulates IO operations on a stack definition stack directory.
@@ -474,13 +477,11 @@ public class StackDirectory extends StackDefinitionDirectory {
   /**
    * Parse role command order file
    */
-
   private void parseRoleCommandOrder() {
     HashMap<String, Object> result = null;
     ObjectMapper mapper = new ObjectMapper();
     try {
-      TypeReference<Map<String, Object>> rcoElementTypeReference = new TypeReference<Map<String, Object>>() {
-      };
+      TypeReference<Map<String, Object>> rcoElementTypeReference = new TypeReference<Map<String, Object>>() {};
       if (rcoFilePath != null) {
         File file = new File(rcoFilePath);
         result = mapper.readValue(file, rcoElementTypeReference);
@@ -492,8 +493,43 @@ public class StackDirectory extends StackDefinitionDirectory {
             ClassLoader.getSystemResource(ROLE_COMMAND_ORDER_FILE));
       }
       roleCommandOrder = new StackRoleCommandOrder(result);
+      parseRoleCommandOrdersForServices();
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Role Command Order for " + rcoFilePath);
+        roleCommandOrder.printRoleCommandOrder(LOG);
+      }
     } catch (IOException e) {
       LOG.error(String.format("Can not read role command order info %s", rcoFilePath), e);
     }
   }
+
+  private void parseRoleCommandOrdersForServices() {
+    if (rcoFilePath != null) {
+      File stack = new File(rcoFilePath).getParentFile();
+      File servicesDir = new File(stack, "services");
+      File[] services = servicesDir.listFiles();
+      for (File service : services) {
+        if (service.isDirectory()) {
+          File rcoFile = new File(service, ROLE_COMMAND_ORDER_FILE);
+          if (rcoFile.exists())
+            parseRoleCommandOrdersForService(rcoFile);
+        }
+      }
+    }
+  }
+
+  private void parseRoleCommandOrdersForService(File rcoFile) {
+    HashMap<String, Object> result = null;
+    ObjectMapper mapper = new ObjectMapper();
+    TypeReference<Map<String, Object>> rcoElementTypeReference = new TypeReference<Map<String, Object>>() {};
+    try {
+      result = mapper.readValue(rcoFile, rcoElementTypeReference);
+      LOG.info("Role command order info was loaded from file: {}", rcoFile.getAbsolutePath());
+      StackRoleCommandOrder serviceRoleCommandOrder = new StackRoleCommandOrder(result);
+      roleCommandOrder.merge(serviceRoleCommandOrder, true);
+    } catch (IOException e) {
+      LOG.error(String.format("Can not read role command order info %s", rcoFile), e);
+    }
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/aeac887a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/StackRoleCommandOrder.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/StackRoleCommandOrder.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/StackRoleCommandOrder.java
index e791859..75587c4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/StackRoleCommandOrder.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/StackRoleCommandOrder.java
@@ -19,8 +19,11 @@
 package org.apache.ambari.server.state.stack;
 
 import org.apache.commons.collections.map.MultiValueMap;
+import org.slf4j.Logger;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -81,7 +84,16 @@ public class StackRoleCommandOrder {
    */
 
   public void merge(StackRoleCommandOrder parent) {
+    merge(parent, false);
+  }
 
+  /**
+   * merge StackRoleCommandOrder content with parent
+   *
+   * @param parent parent StackRoleCommandOrder instance
+   */
+
+  public void merge(StackRoleCommandOrder parent, boolean mergeProperties) {
     HashMap<String, Object> mergedRoleCommandOrders = new HashMap<String, Object>();
     HashMap<String, Object> parentData = parent.getContent();
 
@@ -93,12 +105,27 @@ public class StackRoleCommandOrder {
         Map<String, Object> result = new HashMap<String, Object>();
         Map<String, Object> parentProperties = (Map<String, Object>) parentData.get(key);
         Map<String, Object> childProperties = (Map<String, Object>) content.get(key);
-        MultiValueMap childAndParentProperties = new MultiValueMap();
+        MultiValueMap childAndParentProperties = null;
+
+        childAndParentProperties = new MultiValueMap();
         childAndParentProperties.putAll(childProperties);
         childAndParentProperties.putAll(parentProperties);
+
         for (Object property : childAndParentProperties.keySet()) {
           List propertyValues = (List) childAndParentProperties.get(property);
-          result.put((String) property, propertyValues.get(0));
+          Object values = propertyValues.get(0);
+          if (mergeProperties) {
+            List<String> valueList = new ArrayList<String>();
+            for (Object value : propertyValues) {
+              if (value instanceof List)
+                valueList.addAll((List<String>) value);
+              else
+		valueList.add(value.toString());
+            }
+		values = valueList;
+          }
+
+          result.put((String) property, values);
         }
         mergedRoleCommandOrders.put(key, result);
       } else if (content.containsKey(key)) {
@@ -109,5 +136,33 @@ public class StackRoleCommandOrder {
     }
     this.content = mergedRoleCommandOrders;
   }
+
+  public void printRoleCommandOrder(Logger LOG) {
+    Map<String, Object> map = getContent();
+    List<String> keys = Arrays.asList(GENERAL_DEPS_KEY, GLUSTERFS_DEPS_KEY,
+      NO_GLUSTERFS_DEPS_KEY, NAMENODE_HA_DEPS_KEY, RESOURCEMANAGER_HA_DEPS_KEY);
+
+    for (String key : keys) {
+      LOG.debug(key);
+      Object value = map.get(key);
+      if (value instanceof Map) {
+		Map<String, Object> deps = (Map<String, Object>) map.get(key);
+		for (String depKey : deps.keySet()) {
+		  Object depValue = deps.get(depKey);
+		  if (depValue instanceof Collection) {
+			StringBuffer buffer = new StringBuffer();
+			for (Object o : ((Collection) depValue)) {
+				if (buffer.length() > 0)
+				  buffer.append(",");
+				buffer.append(o);
+			}
+			depValue = buffer.toString();
+		  }
+		  LOG.debug(depKey + " => " + depValue);
+		}
+      }
+    }
+  }
+
 }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/aeac887a/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerTest.java
index dd92bd5..7af4eb8 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerTest.java
@@ -620,6 +620,15 @@ public class StackManagerTest {
     ArrayList<String> hbaseMasterStartValues = (ArrayList<String>) generalDeps.get("HBASE_MASTER-START");
     assertTrue(hbaseMasterStartValues.get(0).equals("ZOOKEEPER_SERVER-START, ZOOKEEPER_SERVER-START"));
 
+    assertTrue(optionalNoGlusterfs.containsKey("NAMENODE-STOP"));
+    ArrayList<String> nameNodeStopValues = (ArrayList<String>) optionalNoGlusterfs.get("NAMENODE-STOP");
+    assertTrue(nameNodeStopValues.contains("JOBTRACKER-STOP"));
+    assertTrue(nameNodeStopValues.contains("CUSTOM_MASTER-STOP"));
+
+    assertTrue(generalDeps.containsKey("CUSTOM_MASTER-START"));
+    ArrayList<String> customMasterStartValues = (ArrayList<String>) generalDeps.get("CUSTOM_MASTER-START");
+    assertTrue(customMasterStartValues.contains("ZOOKEEPER_SERVER-START"));
+    assertTrue(customMasterStartValues.contains("NAMENODE-START"));
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/ambari/blob/aeac887a/ambari-server/src/test/resources/stacks/HDP/2.1.1/services/PIG/role_command_order.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/stacks/HDP/2.1.1/services/PIG/role_command_order.json b/ambari-server/src/test/resources/stacks/HDP/2.1.1/services/PIG/role_command_order.json
new file mode 100644
index 0000000..c0bc888
--- /dev/null
+++ b/ambari-server/src/test/resources/stacks/HDP/2.1.1/services/PIG/role_command_order.json
@@ -0,0 +1,12 @@
+{
+  "_comment" : "Record format:",
+  "_comment" : "blockedRole-blockedCommand: [blockerRole1-blockerCommand1, blockerRole2-blockerCommand2, ...]",
+  "general_deps" : {
+    "_comment" : "dependencies for all cases",
+    "CUSTOM_MASTER-START": ["ZOOKEEPER_SERVER-START", "NAMENODE-START"]
+  },
+  "_comment" : "Dependencies that are used when GLUSTERFS is not present in cluster",
+  "optional_no_glusterfs": {
+    "NAMENODE-STOP": ["CUSTOM_MASTER-STOP"]
+  }
+}