You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ao...@apache.org on 2014/12/08 17:10:19 UTC

ambari git commit: AMBARI-4504. role_command_order is not inherited from the parent stack (aonishuk)

Repository: ambari
Updated Branches:
  refs/heads/trunk 4ae267ce2 -> 438326f69


AMBARI-4504. role_command_order is not inherited from the parent stack (aonishuk)


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

Branch: refs/heads/trunk
Commit: 438326f69de353b92331e6df4c59739afd22fa66
Parents: 4ae267c
Author: Andrew Onishuk <ao...@hortonworks.com>
Authored: Mon Dec 8 18:09:57 2014 +0200
Committer: Andrew Onishuk <ao...@hortonworks.com>
Committed: Mon Dec 8 18:09:57 2014 +0200

----------------------------------------------------------------------
 .../server/metadata/RoleCommandOrder.java       |  44 +-------
 .../ambari/server/stack/StackDirectory.java     |  52 +++++++++
 .../apache/ambari/server/stack/StackModule.java |  14 +++
 .../apache/ambari/server/state/StackInfo.java   |  10 ++
 .../state/stack/StackRoleCommandOrder.java      | 113 +++++++++++++++++++
 .../stacks/HDP/2.1/role_command_order.json      |  53 +--------
 .../stacks/HDP/2.2/role_command_order.json      |  67 +----------
 .../ambari/server/stack/StackManagerTest.java   |  26 ++++-
 .../stacks/HDP/2.0.8/role_command_order.json    |  15 +--
 .../stacks/HDP/2.1.1/role_command_order.json    |  13 +--
 10 files changed, 220 insertions(+), 187 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/438326f6/ambari-server/src/main/java/org/apache/ambari/server/metadata/RoleCommandOrder.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/metadata/RoleCommandOrder.java b/ambari-server/src/main/java/org/apache/ambari/server/metadata/RoleCommandOrder.java
index 32668fa..f424f81 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/metadata/RoleCommandOrder.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/metadata/RoleCommandOrder.java
@@ -55,7 +55,6 @@ public class RoleCommandOrder {
   private final static String NAMENODE_HA_DEPS_KEY = "namenode_optional_ha";
   private final static String RESOURCEMANAGER_HA_DEPS_KEY = "resourcemanager_optional_ha";
   private final static String COMMENT_STR = "_comment";
-  private static final String ROLE_COMMAND_ORDER_FILE = "role_command_order.json";
 
   /**
    * Commands that are independent, role order matters
@@ -137,19 +136,6 @@ public class RoleCommandOrder {
     this.dependencies.get(rcp1).add(rcp2);
   }
 
-  private File getRCOFile(String stackName, String stackVersion) {
-    StackInfo stackInfo;
-    String rcoFileLocation = null;
-    try {
-      stackInfo = ambariMetaInfo.getStack(stackName, stackVersion);
-      rcoFileLocation = stackInfo.getRcoFileLocation();
-    } catch (AmbariException e) {
-      LOG.warn("Error getting stack info for :" + stackName + "-" + stackVersion);
-    }
-
-    return rcoFileLocation == null ? null : new File(rcoFileLocation);
-  }
-
   void addDependencies(Map<String, Object> jsonSection) {
     for (Object blockedObj : jsonSection.keySet()) {
       String blocked = (String) blockedObj;
@@ -203,33 +189,15 @@ public class RoleCommandOrder {
     } catch (AmbariException e) {
     }
 
-    // Read data from JSON
-    ObjectMapper mapper = new ObjectMapper();
-    StackId currentStackVersion = cluster.getCurrentStackVersion();
-    String stackName = currentStackVersion.getStackName();
-    String stackVersion = currentStackVersion.getStackVersion();
-    File rcoFile = getRCOFile(stackName, stackVersion);
-    Map<String,Object> userData;
-    
+    StackId stackId = cluster.getCurrentStackVersion();
+    StackInfo stack = null;
     try {
-      
-      TypeReference<Map<String,Object>> rcoElementTypeReference = new TypeReference<Map<String,Object>>() {};
-      
-      if (rcoFile != null) {
-        userData = mapper.readValue(rcoFile, rcoElementTypeReference);
-        LOG.info("Role command order info was loaded from file: " + rcoFile.getAbsolutePath());
-      } else {
-        InputStream rcoInputStream = ClassLoader.getSystemResourceAsStream(ROLE_COMMAND_ORDER_FILE);
-        userData = mapper.readValue(rcoInputStream, rcoElementTypeReference);
-        LOG.info("Role command order info was loaded from classpath: " +
-          ClassLoader.getSystemResource(ROLE_COMMAND_ORDER_FILE));
-      }
-
-    } catch (IOException e) {
-      LOG.error("Can not read role command order info", e);
-      return;
+      stack = ambariMetaInfo.getStack(stackId.getStackName(),
+            stackId.getStackVersion());
+    } catch (AmbariException e) {
     }
 
+    Map<String,Object> userData = stack.getRoleCommandOrder().getContent();
     Map<String,Object> generalSection =
       (Map<String, Object>) userData.get(GENERAL_DEPS_KEY);
     addDependencies(generalSection);

http://git-wip-us.apache.org/repos/asf/ambari/blob/438326f6/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 2a30e40..1e1e3a0 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
@@ -22,13 +22,18 @@ import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.state.stack.RepositoryXml;
 import org.apache.ambari.server.state.stack.StackMetainfoXml;
+import org.apache.ambari.server.state.stack.StackRoleCommandOrder;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.apache.commons.io.FilenameUtils;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.type.TypeReference;
 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;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -63,6 +68,11 @@ public class StackDirectory extends StackDefinitionDirectory {
   private RepositoryXml repoFile;
 
   /**
+   * role command order
+   */
+  private StackRoleCommandOrder roleCommandOrder;
+
+  /**
    * repository directory
    */
   private String repoDir;
@@ -114,6 +124,11 @@ public class StackDirectory extends StackDefinitionDirectory {
   private static final String UPGRADE_PACK_FOLDER_NAME = "upgrades";
 
   /**
+   * role command order file name
+   */
+  private static final String ROLE_COMMAND_ORDER_FILE = "role_command_order.json";
+
+  /**
    * logger instance
    */
   private final static Logger LOG = LoggerFactory.getLogger(StackDirectory.class);
@@ -212,6 +227,16 @@ public class StackDirectory extends StackDefinitionDirectory {
   }
 
   /**
+   * Obtain the object representation of the stack role_command_order.json file
+   *
+   * @return object representation of the stack role_command_order.json file
+   */
+
+  public StackRoleCommandOrder getRoleCommandOrder() {
+    return roleCommandOrder;
+  }
+
+  /**
    * Parse the stack directory.
    *
    * @throws AmbariException if unable to parse the directory
@@ -236,6 +261,7 @@ public class StackDirectory extends StackDefinitionDirectory {
     parseServiceDirectories(subDirs);
     parseRepoFile(subDirs);
     parseMetaInfoFile();
+    parseRoleCommandOrder();
   }
 
   /**
@@ -362,4 +388,30 @@ public class StackDirectory extends StackDefinitionDirectory {
       upgradePacks = upgradeMap;
     }
   }
+
+  /**
+   * 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>>() {
+      };
+      if (rcoFilePath != null) {
+        File file = new File(rcoFilePath);
+        result = mapper.readValue(file, rcoElementTypeReference);
+        LOG.info("Role command order info was loaded from file: {}", file.getAbsolutePath());
+      } else {
+        InputStream rcoInputStream = ClassLoader.getSystemResourceAsStream(ROLE_COMMAND_ORDER_FILE);
+        result = mapper.readValue(rcoInputStream, rcoElementTypeReference);
+        LOG.info("Role command order info was loaded from classpath: " +
+            ClassLoader.getSystemResource(ROLE_COMMAND_ORDER_FILE));
+      }
+      roleCommandOrder = new StackRoleCommandOrder(result);
+    } catch (IOException e) {
+      LOG.error(String.format("Can not read role command order info %s", rcoFilePath), e);
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/438326f6/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java
index 3629b36..ea355c8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackModule.java
@@ -218,6 +218,7 @@ public class StackModule extends BaseModule<StackModule, StackInfo> {
 
     resolveStack(parentStack, allStacks);
     mergeConfigurations(parentStack, allStacks);
+    mergeRoleCommandOrder(parentStack);
 
     if (stackInfo.getStackHooksFolder() == null) {
       stackInfo.setStackHooksFolder(parentStack.getModuleInfo().getStackHooksFolder());
@@ -314,6 +315,7 @@ public class StackModule extends BaseModule<StackModule, StackInfo> {
       stackInfo.setRcoFileLocation(stackDirectory.getRcoFilePath());
       stackInfo.setUpgradesFolder(stackDirectory.getUpgradesDir());
       stackInfo.setUpgradePacks(stackDirectory.getUpgradePacks());
+      stackInfo.setRoleCommandOrder(stackDirectory.getRoleCommandOrder());
       populateConfigurationModules();
     }
 
@@ -495,4 +497,16 @@ public class StackModule extends BaseModule<StackModule, StackInfo> {
     }
     return ri;
   }
+
+  /**
+   * Merge role command order with the parent stack
+   *
+   * @param parentStack parent stack
+   */
+
+  private void mergeRoleCommandOrder(StackModule parentStack) {
+
+    stackInfo.getRoleCommandOrder().merge(parentStack.stackInfo.getRoleCommandOrder());
+
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/438326f6/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
index f19cf81..b99dcd6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/StackInfo.java
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.ambari.server.controller.StackVersionResponse;
+import org.apache.ambari.server.state.stack.StackRoleCommandOrder;
 import org.apache.ambari.server.state.stack.UpgradePack;
 
 public class StackInfo implements Comparable<StackInfo>{
@@ -41,6 +42,7 @@ public class StackInfo implements Comparable<StackInfo>{
   private List<PropertyInfo> properties;
   private Map<String, Map<String, Map<String, String>>> configTypes;
   private Map<String, UpgradePack> upgradePacks;
+  private StackRoleCommandOrder roleCommandOrder;
 
   /**
    * Meaning: stores subpath from stack root to exact hooks folder for stack. These hooks are
@@ -214,6 +216,14 @@ public class StackInfo implements Comparable<StackInfo>{
     this.parentStackVersion = parentStackVersion;
   }
 
+  public StackRoleCommandOrder getRoleCommandOrder() {
+    return roleCommandOrder;
+  }
+
+  public void setRoleCommandOrder(StackRoleCommandOrder roleCommandOrder) {
+    this.roleCommandOrder = roleCommandOrder;
+  }
+
   public String getRcoFileLocation() {
     return rcoFileLocation;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/438326f6/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
new file mode 100644
index 0000000..e791859
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/StackRoleCommandOrder.java
@@ -0,0 +1,113 @@
+/**
+ * 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
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.state.stack;
+
+import org.apache.commons.collections.map.MultiValueMap;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Represents the stack <code>role_command_order.json</code> file.
+ */
+
+public class StackRoleCommandOrder {
+
+  private final static String GENERAL_DEPS_KEY = "general_deps";
+  private final static String GLUSTERFS_DEPS_KEY = "optional_glusterfs";
+  private final static String NO_GLUSTERFS_DEPS_KEY = "optional_no_glusterfs";
+  private final static String NAMENODE_HA_DEPS_KEY = "namenode_optional_ha";
+  private final static String RESOURCEMANAGER_HA_DEPS_KEY = "resourcemanager_optional_ha";
+
+  private HashMap<String, Object> content;
+
+  /**
+   * Initialize object
+   */
+  public StackRoleCommandOrder() {
+  }
+
+  /**
+   * Initialize object
+   *
+   * @param content role command order content
+   */
+  public StackRoleCommandOrder(HashMap<String, Object> content) {
+    this.content = content;
+  }
+
+  /**
+   * Get role command order content
+   *
+   * @return role command order content
+   */
+
+  public HashMap<String, Object> getContent() {
+    return content;
+  }
+
+  /**
+   * Set role command order content
+   *
+   * @param content role command order content
+   */
+
+  public void setContent(HashMap<String, Object> content) {
+    this.content = content;
+  }
+
+  /**
+   * merge StackRoleCommandOrder content with parent
+   *
+   * @param parent parent StackRoleCommandOrder instance
+   */
+
+  public void merge(StackRoleCommandOrder parent) {
+
+    HashMap<String, Object> mergedRoleCommandOrders = new HashMap<String, Object>();
+    HashMap<String, Object> parentData = parent.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) {
+      if (parentData.containsKey(key) && content.containsKey(key)) {
+        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();
+        childAndParentProperties.putAll(childProperties);
+        childAndParentProperties.putAll(parentProperties);
+        for (Object property : childAndParentProperties.keySet()) {
+          List propertyValues = (List) childAndParentProperties.get(property);
+          result.put((String) property, propertyValues.get(0));
+        }
+        mergedRoleCommandOrders.put(key, result);
+      } else if (content.containsKey(key)) {
+        mergedRoleCommandOrders.put(key, content.get(key));
+      } else if (parentData.containsKey(key)) {
+        mergedRoleCommandOrders.put(key, parentData.get(key));
+      }
+    }
+    this.content = mergedRoleCommandOrders;
+  }
+}
+

http://git-wip-us.apache.org/repos/asf/ambari/blob/438326f6/ambari-server/src/main/resources/stacks/HDP/2.1/role_command_order.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.1/role_command_order.json b/ambari-server/src/main/resources/stacks/HDP/2.1/role_command_order.json
index 2d152ba..50505c9 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.1/role_command_order.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.1/role_command_order.json
@@ -8,65 +8,14 @@
     "STORM_UI_SERVER-START" : ["NIMBUS-START"],
     "DRPC_SERVER-START" : ["NIMBUS-START"],
     "STORM_REST_API-START" : ["NIMBUS-START", "STORM_UI_SERVER-START", "SUPERVISOR-START", "DRPC_SERVER-START"],
-    "HBASE_MASTER-START": ["ZOOKEEPER_SERVER-START"],
-    "HBASE_REGIONSERVER-START": ["HBASE_MASTER-START"],
-    "OOZIE_SERVER-START": ["NODEMANAGER-START", "RESOURCEMANAGER-START"],
-    "WEBHCAT_SERVER-START": ["NODEMANAGER-START", "HIVE_SERVER-START"],
-    "HIVE_METASTORE-START": ["MYSQL_SERVER-START"],
-    "HIVE_SERVER-START": ["NODEMANAGER-START", "MYSQL_SERVER-START"],
-    "HUE_SERVER-START": ["HIVE_SERVER-START", "HCAT-START", "OOZIE_SERVER-START"],
-    "FLUME_HANDLER-START": ["OOZIE_SERVER-START"],
-    "MAPREDUCE_SERVICE_CHECK-SERVICE_CHECK": ["NODEMANAGER-START", "RESOURCEMANAGER-START"],
-    "OOZIE_SERVICE_CHECK-SERVICE_CHECK": ["OOZIE_SERVER-START"],
-    "HBASE_SERVICE_CHECK-SERVICE_CHECK": ["HBASE_MASTER-START", "HBASE_REGIONSERVER-START"],
-    "HIVE_SERVICE_CHECK-SERVICE_CHECK": ["HIVE_SERVER-START", "HIVE_METASTORE-START", "WEBHCAT_SERVER-START"],
-    "HCAT_SERVICE_CHECK-SERVICE_CHECK": ["HIVE_SERVER-START"],
-    "PIG_SERVICE_CHECK-SERVICE_CHECK": ["NODEMANAGER-START", "RESOURCEMANAGER-START"],
-    "SQOOP_SERVICE_CHECK-SERVICE_CHECK": ["NODEMANAGER-START", "RESOURCEMANAGER-START"],
-    "ZOOKEEPER_SERVICE_CHECK-SERVICE_CHECK": ["ZOOKEEPER_SERVER-START"],
-    "ZOOKEEPER_QUORUM_SERVICE_CHECK-SERVICE_CHECK": ["ZOOKEEPER_SERVER-START"],
     "STORM_SERVICE_CHECK-SERVICE_CHECK": ["NIMBUS-START", "SUPERVISOR-START", "STORM_UI_SERVER-START",
         "DRPC_SERVER-START"],
-    "ZOOKEEPER_SERVER-STOP" : ["HBASE_MASTER-STOP", "HBASE_REGIONSERVER-STOP"],
-    "HBASE_MASTER-STOP": ["HBASE_REGIONSERVER-STOP"],
     "NIMBUS-STOP" : ["SUPERVISOR-STOP", "STORM_UI_SERVER-STOP", "DRPC_SERVER-STOP"]
   },
-  "_comment" : "GLUSTERFS-specific dependencies",
-  "optional_glusterfs": {
-    "HBASE_MASTER-START": ["PEERSTATUS-START"],
-    "GLUSTERFS_SERVICE_CHECK-SERVICE_CHECK": ["PEERSTATUS-START"]
-  },
   "_comment" : "Dependencies that are used when GLUSTERFS is not present in cluster",
   "optional_no_glusterfs": {
-    "SECONDARY_NAMENODE-START": ["NAMENODE-START"],
-    "RESOURCEMANAGER-START": ["NAMENODE-START", "DATANODE-START"],
-    "NODEMANAGER-START": ["NAMENODE-START", "DATANODE-START", "RESOURCEMANAGER-START"],
-    "HISTORYSERVER-START": ["NAMENODE-START", "DATANODE-START"],
-    "HBASE_MASTER-START": ["NAMENODE-START", "DATANODE-START"],
     "APP_TIMELINE_SERVER-START": ["NAMENODE-START", "DATANODE-START"],
     "FALCON_SERVER-START": ["NAMENODE-START", "DATANODE-START"],
-    "FALCON_SERVICE_CHECK-SERVICE_CHECK": ["FALCON_SERVER-START"],
-    "HIVE_SERVER-START": ["DATANODE-START"],
-    "WEBHCAT_SERVER-START": ["DATANODE-START"],
-    "HDFS_SERVICE_CHECK-SERVICE_CHECK": ["NAMENODE-START", "DATANODE-START",
-        "SECONDARY_NAMENODE-START"],
-    "MAPREDUCE2_SERVICE_CHECK-SERVICE_CHECK": ["NODEMANAGER-START",
-        "RESOURCEMANAGER-START", "HISTORYSERVER-START", "YARN_SERVICE_CHECK-SERVICE_CHECK"],
-    "YARN_SERVICE_CHECK-SERVICE_CHECK": ["NODEMANAGER-START", "RESOURCEMANAGER-START"],
-    "RESOURCEMANAGER_SERVICE_CHECK-SERVICE_CHECK": ["RESOURCEMANAGER-START"],
-    "PIG_SERVICE_CHECK-SERVICE_CHECK": ["RESOURCEMANAGER-START", "NODEMANAGER-START"],
-    "NAMENODE-STOP": ["RESOURCEMANAGER-STOP", "NODEMANAGER-STOP",
-        "HISTORYSERVER-STOP", "HBASE_MASTER-STOP", "FALCON_SERVER-STOP"],
-    "DATANODE-STOP": ["RESOURCEMANAGER-STOP", "NODEMANAGER-STOP",
-        "HISTORYSERVER-STOP", "HBASE_MASTER-STOP", "FALCON_SERVER-STOP"]
-  },
-  "_comment" : "Dependencies that are used in HA NameNode cluster",
-  "namenode_optional_ha": {
-    "NAMENODE-START": ["ZKFC-START", "JOURNALNODE-START", "ZOOKEEPER_SERVER-START"],
-    "ZKFC-START": ["ZOOKEEPER_SERVER-START"]
-  },
-  "_comment" : "Dependencies that are used in ResourceManager HA cluster",
-  "resourcemanager_optional_ha" : {
-    "RESOURCEMANAGER-START": ["ZOOKEEPER_SERVER-START"]
+    "FALCON_SERVICE_CHECK-SERVICE_CHECK": ["FALCON_SERVER-START"]
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/438326f6/ambari-server/src/main/resources/stacks/HDP/2.2/role_command_order.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.2/role_command_order.json b/ambari-server/src/main/resources/stacks/HDP/2.2/role_command_order.json
index 72b49fa..e8bbe32 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.2/role_command_order.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.2/role_command_order.json
@@ -3,77 +3,12 @@
   "_comment" : "blockedRole-blockedCommand: [blockerRole1-blockerCommand1, blockerRole2-blockerCommand2, ...]",
   "general_deps" : {
     "_comment" : "dependencies for all cases",
-    "NIMBUS-START" : ["ZOOKEEPER_SERVER-START", "NODEMANAGER-START", "RESOURCEMANAGER-START"],
-    "SUPERVISOR-START" : ["NIMBUS-START"],
-    "STORM_UI_SERVER-START" : ["NIMBUS-START"],
-    "DRPC_SERVER-START" : ["NIMBUS-START"],
-    "STORM_REST_API-START" : ["NIMBUS-START", "STORM_UI_SERVER-START", "SUPERVISOR-START", "DRPC_SERVER-START"],
-    "HBASE_MASTER-START": ["ZOOKEEPER_SERVER-START"],
-    "HBASE_REGIONSERVER-START": ["HBASE_MASTER-START"],
-    "OOZIE_SERVER-START": ["NODEMANAGER-START", "RESOURCEMANAGER-START"],
-    "WEBHCAT_SERVER-START": ["NODEMANAGER-START", "HIVE_SERVER-START"],
-    "HIVE_METASTORE-START": ["MYSQL_SERVER-START"],
-    "HIVE_SERVER-START": ["NODEMANAGER-START", "MYSQL_SERVER-START"],
-    "HUE_SERVER-START": ["HIVE_SERVER-START", "HCAT-START", "OOZIE_SERVER-START"],
-    "FLUME_HANDLER-START": ["OOZIE_SERVER-START"],
     "FALCON_SERVER-START": ["NAMENODE-START", "DATANODE-START", "OOZIE_SERVER-START"],
-    "MAPREDUCE_SERVICE_CHECK-SERVICE_CHECK": ["NODEMANAGER-START", "RESOURCEMANAGER-START"],
-    "OOZIE_SERVICE_CHECK-SERVICE_CHECK": ["OOZIE_SERVER-START"],
     "WEBHCAT_SERVICE_CHECK-SERVICE_CHECK": ["WEBHCAT_SERVER-START"],
-    "HBASE_SERVICE_CHECK-SERVICE_CHECK": ["HBASE_MASTER-START", "HBASE_REGIONSERVER-START"],
-    "HIVE_SERVICE_CHECK-SERVICE_CHECK": ["HIVE_SERVER-START", "HIVE_METASTORE-START", "WEBHCAT_SERVER-START"],
-    "HCAT_SERVICE_CHECK-SERVICE_CHECK": ["HIVE_SERVER-START"],
-    "PIG_SERVICE_CHECK-SERVICE_CHECK": ["NODEMANAGER-START", "RESOURCEMANAGER-START"],
-    "SQOOP_SERVICE_CHECK-SERVICE_CHECK": ["NODEMANAGER-START", "RESOURCEMANAGER-START"],
-    "ZOOKEEPER_SERVICE_CHECK-SERVICE_CHECK": ["ZOOKEEPER_SERVER-START"],
-    "ZOOKEEPER_QUORUM_SERVICE_CHECK-SERVICE_CHECK": ["ZOOKEEPER_SERVER-START"],
-    "STORM_SERVICE_CHECK-SERVICE_CHECK": ["NIMBUS-START", "SUPERVISOR-START", "STORM_UI_SERVER-START",
-        "DRPC_SERVER-START"],
     "FLUME_SERVICE_CHECK-SERVICE_CHECK": ["FLUME_HANDLER-START"],
     "FALCON_SERVICE_CHECK-SERVICE_CHECK": ["FALCON_SERVER-START"],
     "SLIDER_SERVICE_CHECK-SERVICE_CHECK" : ["NODEMANAGER-START", "RESOURCEMANAGER-START"],
     "KAFKA_BROKER-START" : ["ZOOKEEPER_SERVER-START"],
-    "KAFKA_SERVICE_CHECK-SERVICE_CHECK": ["KAFKA_BROKER-START"],
-    "ZOOKEEPER_SERVER-STOP" : ["HBASE_MASTER-STOP", "HBASE_REGIONSERVER-STOP"],
-    "HBASE_MASTER-STOP": ["HBASE_REGIONSERVER-STOP"],
-    "NIMBUS-STOP" : ["SUPERVISOR-STOP", "STORM_UI_SERVER-STOP", "DRPC_SERVER-STOP"]
-  },
-  "_comment" : "GLUSTERFS-specific dependencies",
-  "optional_glusterfs": {
-    "HBASE_MASTER-START": ["PEERSTATUS-START"],
-    "GLUSTERFS_SERVICE_CHECK-SERVICE_CHECK": ["PEERSTATUS-START"]
-  },
-  "_comment" : "Dependencies that are used when GLUSTERFS is not present in cluster",
-  "optional_no_glusterfs": {
-    "SECONDARY_NAMENODE-START": ["NAMENODE-START"],
-    "RESOURCEMANAGER-START": ["NAMENODE-START", "DATANODE-START"],
-    "NODEMANAGER-START": ["NAMENODE-START", "DATANODE-START", "RESOURCEMANAGER-START"],
-    "HISTORYSERVER-START": ["NAMENODE-START", "DATANODE-START"],
-    "HBASE_MASTER-START": ["NAMENODE-START", "DATANODE-START"],
-    "APP_TIMELINE_SERVER-START": ["NAMENODE-START", "DATANODE-START"],
-    "FALCON_SERVER-START": ["NAMENODE-START", "DATANODE-START"],
-    "FALCON_SERVICE_CHECK-SERVICE_CHECK": ["FALCON_SERVER-START"],
-    "HIVE_SERVER-START": ["DATANODE-START"],
-    "WEBHCAT_SERVER-START": ["DATANODE-START"],
-    "HDFS_SERVICE_CHECK-SERVICE_CHECK": ["NAMENODE-START", "DATANODE-START",
-        "SECONDARY_NAMENODE-START"],
-    "MAPREDUCE2_SERVICE_CHECK-SERVICE_CHECK": ["NODEMANAGER-START",
-        "RESOURCEMANAGER-START", "HISTORYSERVER-START", "YARN_SERVICE_CHECK-SERVICE_CHECK"],
-    "YARN_SERVICE_CHECK-SERVICE_CHECK": ["NODEMANAGER-START", "RESOURCEMANAGER-START"],
-    "RESOURCEMANAGER_SERVICE_CHECK-SERVICE_CHECK": ["RESOURCEMANAGER-START"],
-    "PIG_SERVICE_CHECK-SERVICE_CHECK": ["RESOURCEMANAGER-START", "NODEMANAGER-START"],
-    "NAMENODE-STOP": ["RESOURCEMANAGER-STOP", "NODEMANAGER-STOP",
-        "HISTORYSERVER-STOP", "HBASE_MASTER-STOP", "FALCON_SERVER-STOP"],
-    "DATANODE-STOP": ["RESOURCEMANAGER-STOP", "NODEMANAGER-STOP",
-        "HISTORYSERVER-STOP", "HBASE_MASTER-STOP", "FALCON_SERVER-STOP"]
-  },
-  "_comment" : "Dependencies that are used in HA NameNode cluster",
-  "namenode_optional_ha": {
-    "NAMENODE-START": ["ZKFC-START", "JOURNALNODE-START", "ZOOKEEPER_SERVER-START"],
-    "ZKFC-START": ["ZOOKEEPER_SERVER-START"]
-  },
-  "_comment" : "Dependencies that are used in ResourceManager HA cluster",
-  "resourcemanager_optional_ha" : {
-    "RESOURCEMANAGER-START": ["ZOOKEEPER_SERVER-START"]
+    "KAFKA_SERVICE_CHECK-SERVICE_CHECK": ["KAFKA_BROKER-START"]
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/438326f6/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 940c65a..9d75643 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
@@ -30,11 +30,7 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.io.File;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.configuration.Configuration;
@@ -621,5 +617,25 @@ public class StackManagerTest {
     verify(dao, actionMetadata, osFamily);
   }
 
+  @Test
+  public void testMergeRoleCommandOrder() throws Exception {
+    StackInfo stack = stackManager.getStack("HDP", "2.1.1");
+    // merged role command order with parent stacks
+    Map<String, Object> roleCommandOrder = stack.getRoleCommandOrder().getContent();
+    assertTrue(roleCommandOrder.containsKey("optional_glusterfs"));
+    assertTrue(roleCommandOrder.containsKey("general_deps"));
+    assertTrue(roleCommandOrder.containsKey("optional_no_glusterfs"));
+    assertTrue(roleCommandOrder.containsKey("namenode_optional_ha"));
+    assertTrue(roleCommandOrder.containsKey("resourcemanager_optional_ha"));
+    Map<String, Object>  generalDeps = (Map<String, Object>) roleCommandOrder.get("general_deps");
+    assertTrue(generalDeps.containsKey("HBASE_MASTER-START"));
+    assertTrue(generalDeps.containsKey("HBASE_REGIONSERVER-START"));
+    Map<String, Object>  optionalNoGlusterfs  = (Map<String, Object>) roleCommandOrder.get("optional_no_glusterfs");
+    assertTrue(optionalNoGlusterfs.containsKey("SECONDARY_NAMENODE-START"));
+    ArrayList<String> hbaseMasterStartValues = (ArrayList<String>) generalDeps.get("HBASE_MASTER-START");
+    assertTrue(hbaseMasterStartValues.get(0).equals("ZOOKEEPER_SERVER-START, ZOOKEEPER_SERVER-START"));
+
+  }
+
   //todo: component override assertions
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/438326f6/ambari-server/src/test/resources/stacks/HDP/2.0.8/role_command_order.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.8/role_command_order.json b/ambari-server/src/test/resources/stacks/HDP/2.0.8/role_command_order.json
index 1404ef6..70d7802 100644
--- a/ambari-server/src/test/resources/stacks/HDP/2.0.8/role_command_order.json
+++ b/ambari-server/src/test/resources/stacks/HDP/2.0.8/role_command_order.json
@@ -3,7 +3,6 @@
   "_comment" : "blockedRole-blockedCommand: [blockerRole1-blockerCommand1, blockerRole2-blockerCommand2, ...]",
   "general_deps" : {
     "_comment" : "dependencies for all cases",
-    "HBASE_MASTER-START": ["ZOOKEEPER_SERVER-START"],
     "HBASE_REGIONSERVER-START": ["HBASE_MASTER-START"],
     "OOZIE_SERVER-START": ["JOBTRACKER-START", "TASKTRACKER-START"],
     "WEBHCAT_SERVER-START": ["TASKTRACKER-START", "HIVE_SERVER-START"],
@@ -43,17 +42,9 @@
     "GANGLIA_SERVER-UPGRADE" : ["SQOOP-UPGRADE"],
     "GANGLIA_MONITOR-UPGRADE" : ["GANGLIA_SERVER-UPGRADE"]
   },
-  "_comment" : "GLUSTERFS-specific dependencies",
-  "optional_glusterfs": {
-    "HBASE_MASTER-START": ["PEERSTATUS-START"],
-    "JOBTRACKER-START": ["PEERSTATUS-START"],
-    "TASKTRACKER-START": ["PEERSTATUS-START"],
-    "GLUSTERFS_SERVICE_CHECK-SERVICE_CHECK": ["PEERSTATUS-START"],
-    "JOBTRACKER-UPGRADE": ["GLUSTERFS_CLIENT-UPGRADE"]
-  },
   "_comment" : "Dependencies that are used when GLUSTERFS is not present in cluster",
   "optional_no_glusterfs": {
-    "SECONDARY_NAMENODE-START": ["NAMENODE-START"],
+
     "RESOURCEMANAGER-START": ["NAMENODE-START", "DATANODE-START"],
     "NODEMANAGER-START": ["NAMENODE-START", "DATANODE-START", "RESOURCEMANAGER-START"],
     "HISTORYSERVER-START": ["NAMENODE-START", "DATANODE-START"],
@@ -83,10 +74,6 @@
     "NAMENODE-START": ["JOURNALNODE-START", "ZOOKEEPER_SERVER-START"],
     "ZKFC-START": ["NAMENODE-START"],
     "HDFS_SERVICE_CHECK-SERVICE_CHECK": ["ZKFC-START"]
-  },
-  "_comment" : "Dependencies that are used in ResourceManager HA cluster",
-  "resourcemanager_optional_ha" : {
-    "RESOURCEMANAGER-START": ["ZOOKEEPER_SERVER-START"]
   }
 }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/438326f6/ambari-server/src/test/resources/stacks/HDP/2.1.1/role_command_order.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/stacks/HDP/2.1.1/role_command_order.json b/ambari-server/src/test/resources/stacks/HDP/2.1.1/role_command_order.json
index 1404ef6..656bb63 100644
--- a/ambari-server/src/test/resources/stacks/HDP/2.1.1/role_command_order.json
+++ b/ambari-server/src/test/resources/stacks/HDP/2.1.1/role_command_order.json
@@ -3,8 +3,7 @@
   "_comment" : "blockedRole-blockedCommand: [blockerRole1-blockerCommand1, blockerRole2-blockerCommand2, ...]",
   "general_deps" : {
     "_comment" : "dependencies for all cases",
-    "HBASE_MASTER-START": ["ZOOKEEPER_SERVER-START"],
-    "HBASE_REGIONSERVER-START": ["HBASE_MASTER-START"],
+    "HBASE_MASTER-START": ["ZOOKEEPER_SERVER-START, ZOOKEEPER_SERVER-START"],
     "OOZIE_SERVER-START": ["JOBTRACKER-START", "TASKTRACKER-START"],
     "WEBHCAT_SERVER-START": ["TASKTRACKER-START", "HIVE_SERVER-START"],
     "HIVE_METASTORE-START": ["MYSQL_SERVER-START"],
@@ -77,16 +76,6 @@
     "DATANODE-UPGRADE": ["SECONDARY_NAMENODE-UPGRADE"],
     "HDFS_CLIENT-UPGRADE": ["DATANODE-UPGRADE"],
     "JOBTRACKER-UPGRADE": ["HDFS_CLIENT-UPGRADE"]
-  },
-  "_comment" : "Dependencies that are used in HA NameNode cluster",
-  "namenode_optional_ha": {
-    "NAMENODE-START": ["JOURNALNODE-START", "ZOOKEEPER_SERVER-START"],
-    "ZKFC-START": ["NAMENODE-START"],
-    "HDFS_SERVICE_CHECK-SERVICE_CHECK": ["ZKFC-START"]
-  },
-  "_comment" : "Dependencies that are used in ResourceManager HA cluster",
-  "resourcemanager_optional_ha" : {
-    "RESOURCEMANAGER-START": ["ZOOKEEPER_SERVER-START"]
   }
 }