Browse Source

AMBARI-6531. Config attributes should be propagated to and persisted by Ambari agents.

Srimanth Gunturi 11 years ago
parent
commit
a1e9fa9a24
93 changed files with 1433 additions and 65 deletions
  1. 11 1
      ambari-agent/src/main/python/resource_management/libraries/providers/xml_config.py
  2. 1 0
      ambari-agent/src/main/python/resource_management/libraries/resources/xml_config.py
  3. 29 8
      ambari-agent/src/test/python/resource_management/TestXmlConfigResource.py
  4. 16 0
      ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java
  5. 13 0
      ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
  6. 12 1
      ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java
  7. 13 0
      ambari-server/src/main/java/org/apache/ambari/server/agent/StatusCommand.java
  8. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java
  9. 6 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
  10. 4 1
      ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
  11. 65 1
      ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
  12. 8 0
      ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java
  13. 1 0
      ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/after-INSTALL/scripts/shared_initialization.py
  14. 4 0
      ambari-server/src/main/resources/stacks/HDP/1.3.2/services/HBASE/package/scripts/hbase.py
  15. 2 0
      ambari-server/src/main/resources/stacks/HDP/1.3.2/services/HDFS/package/scripts/hdfs.py
  16. 1 0
      ambari-server/src/main/resources/stacks/HDP/1.3.2/services/HIVE/package/scripts/hcat.py
  17. 1 0
      ambari-server/src/main/resources/stacks/HDP/1.3.2/services/HIVE/package/scripts/hive.py
  18. 3 0
      ambari-server/src/main/resources/stacks/HDP/1.3.2/services/MAPREDUCE/package/scripts/mapreduce.py
  19. 1 0
      ambari-server/src/main/resources/stacks/HDP/1.3.2/services/OOZIE/package/scripts/oozie.py
  20. 1 0
      ambari-server/src/main/resources/stacks/HDP/1.3.2/services/WEBHCAT/package/scripts/webhcat.py
  21. 1 0
      ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/after-INSTALL/scripts/shared_initialization.py
  22. 4 0
      ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HBASE/package/scripts/hbase.py
  23. 2 0
      ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HDFS/package/scripts/hdfs.py
  24. 1 0
      ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HIVE/package/scripts/hcat.py
  25. 2 0
      ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HIVE/package/scripts/hive.py
  26. 1 0
      ambari-server/src/main/resources/stacks/HDP/2.0.6/services/OOZIE/package/scripts/oozie.py
  27. 1 0
      ambari-server/src/main/resources/stacks/HDP/2.0.6/services/WEBHCAT/package/scripts/webhcat.py
  28. 7 0
      ambari-server/src/main/resources/stacks/HDP/2.0.6/services/YARN/package/scripts/yarn.py
  29. 1 0
      ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/TEZ/package/scripts/tez.py
  30. 4 0
      ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/yarn.py
  31. 1 0
      ambari-server/src/main/resources/stacks/HDP/2.1/services/TEZ/package/scripts/tez.py
  32. 2 0
      ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
  33. 173 0
      ambari-server/src/test/java/org/apache/ambari/server/state/ConfigHelperTest.java
  34. 1 1
      ambari-server/src/test/python/TestResourceFilesKeeper.py
  35. 12 6
      ambari-server/src/test/python/stacks/1.3.2/HBASE/test_hbase_client.py
  36. 12 6
      ambari-server/src/test/python/stacks/1.3.2/HBASE/test_hbase_master.py
  37. 12 6
      ambari-server/src/test/python/stacks/1.3.2/HBASE/test_hbase_regionserver.py
  38. 2 0
      ambari-server/src/test/python/stacks/1.3.2/HDFS/test_datanode.py
  39. 2 0
      ambari-server/src/test/python/stacks/1.3.2/HDFS/test_namenode.py
  40. 2 0
      ambari-server/src/test/python/stacks/1.3.2/HDFS/test_snamenode.py
  41. 2 0
      ambari-server/src/test/python/stacks/1.3.2/HIVE/test_hcat_client.py
  42. 2 0
      ambari-server/src/test/python/stacks/1.3.2/HIVE/test_hive_client.py
  43. 2 0
      ambari-server/src/test/python/stacks/1.3.2/HIVE/test_hive_metastore.py
  44. 2 0
      ambari-server/src/test/python/stacks/1.3.2/HIVE/test_hive_server.py
  45. 2 0
      ambari-server/src/test/python/stacks/1.3.2/MAPREDUCE/test_mapreduce_client.py
  46. 2 0
      ambari-server/src/test/python/stacks/1.3.2/MAPREDUCE/test_mapreduce_historyserver.py
  47. 2 0
      ambari-server/src/test/python/stacks/1.3.2/MAPREDUCE/test_mapreduce_jobtracker.py
  48. 2 0
      ambari-server/src/test/python/stacks/1.3.2/MAPREDUCE/test_mapreduce_tasktracker.py
  49. 2 0
      ambari-server/src/test/python/stacks/1.3.2/OOZIE/test_oozie_client.py
  50. 4 0
      ambari-server/src/test/python/stacks/1.3.2/OOZIE/test_oozie_server.py
  51. 4 2
      ambari-server/src/test/python/stacks/1.3.2/WEBHCAT/test_webhcat_server.py
  52. 49 0
      ambari-server/src/test/python/stacks/1.3.2/configs/default.hbasedecom.json
  53. 49 0
      ambari-server/src/test/python/stacks/1.3.2/configs/default.json
  54. 50 1
      ambari-server/src/test/python/stacks/1.3.2/configs/default.non_gmetad_host.json
  55. 50 1
      ambari-server/src/test/python/stacks/1.3.2/configs/secured.json
  56. 50 1
      ambari-server/src/test/python/stacks/1.3.2/configs/secured_no_jce_name.json
  57. 1 0
      ambari-server/src/test/python/stacks/1.3.2/hooks/after-INSTALL/test_after_install.py
  58. 12 6
      ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py
  59. 12 6
      ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py
  60. 12 6
      ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py
  61. 2 0
      ambari-server/src/test/python/stacks/2.0.6/HDFS/test_datanode.py
  62. 2 0
      ambari-server/src/test/python/stacks/2.0.6/HDFS/test_journalnode.py
  63. 2 0
      ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py
  64. 2 0
      ambari-server/src/test/python/stacks/2.0.6/HDFS/test_snamenode.py
  65. 2 0
      ambari-server/src/test/python/stacks/2.0.6/HDFS/test_zkfc.py
  66. 2 0
      ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hcat_client.py
  67. 4 0
      ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_client.py
  68. 4 0
      ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_metastore.py
  69. 4 0
      ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py
  70. 4 0
      ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_client.py
  71. 4 0
      ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_server.py
  72. 4 2
      ambari-server/src/test/python/stacks/2.0.6/WEBHCAT/test_webhcat_server.py
  73. 12 0
      ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py
  74. 12 0
      ambari-server/src/test/python/stacks/2.0.6/YARN/test_mapreduce2_client.py
  75. 12 0
      ambari-server/src/test/python/stacks/2.0.6/YARN/test_nodemanager.py
  76. 12 0
      ambari-server/src/test/python/stacks/2.0.6/YARN/test_resourcemanager.py
  77. 18 0
      ambari-server/src/test/python/stacks/2.0.6/YARN/test_yarn_client.py
  78. 50 1
      ambari-server/src/test/python/stacks/2.0.6/configs/default.hbasedecom.json
  79. 66 0
      ambari-server/src/test/python/stacks/2.0.6/configs/default.json
  80. 49 0
      ambari-server/src/test/python/stacks/2.0.6/configs/default.non_gmetad_host.json
  81. 49 0
      ambari-server/src/test/python/stacks/2.0.6/configs/flume_target.json
  82. 50 1
      ambari-server/src/test/python/stacks/2.0.6/configs/ha_default.json
  83. 50 2
      ambari-server/src/test/python/stacks/2.0.6/configs/ha_secured.json
  84. 67 1
      ambari-server/src/test/python/stacks/2.0.6/configs/secured.json
  85. 50 1
      ambari-server/src/test/python/stacks/2.0.6/configs/secured_no_jce_name.json
  86. 1 0
      ambari-server/src/test/python/stacks/2.0.6/hooks/after-INSTALL/test_after_install.py
  87. 4 0
      ambari-server/src/test/python/stacks/2.1/HIVE/test_hive_metastore.py
  88. 1 0
      ambari-server/src/test/python/stacks/2.1/TEZ/test_tez_client.py
  89. 6 0
      ambari-server/src/test/python/stacks/2.1/YARN/test_apptimelineserver.py
  90. 66 0
      ambari-server/src/test/python/stacks/2.1/configs/default.json
  91. 72 3
      ambari-server/src/test/python/stacks/2.1/configs/secured.json
  92. 1 0
      ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive.py
  93. 1 0
      ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py

+ 11 - 1
ambari-agent/src/main/python/resource_management/libraries/providers/xml_config.py

@@ -35,9 +35,19 @@ class XmlConfigProvider(Provider):
     <property>
       <name>{{ key|e }}</name>
       <value>{{ value|e }}</value>
+      {%- if not configuration_attrs is none -%}
+      {%- for attrib_name, attrib_occurances in  configuration_attrs.items() -%}
+      {%- for property_name, attrib_value in  attrib_occurances.items() -%}
+      {% if property_name == key and attrib_name %}
+      <{{attrib_name|e}}>{{attrib_value|e}}</{{attrib_name|e}}>
+      {%- endif -%}
+      {%- endfor -%}
+      {%- endfor -%}
+      {%- endif %}
     </property>
     {% endfor %}
-  </configuration>''', extra_imports=[time], configurations_dict=self.resource.configurations)
+  </configuration>''', extra_imports=[time], configurations_dict=self.resource.configurations,
+                                    configuration_attrs=self.resource.configuration_attributes)
    
   
     Logger.info(format("Generating config: {conf_dir}/{filename}"))

+ 1 - 0
ambari-agent/src/main/python/resource_management/libraries/resources/xml_config.py

@@ -28,6 +28,7 @@ class XmlConfig(Resource):
   filename = ResourceArgument(default=lambda obj: obj.name)
   
   configurations = ResourceArgument()
+  configuration_attributes = ResourceArgument()
   conf_dir = ResourceArgument()
   
   mode = ResourceArgument()

+ 29 - 8
ambari-agent/src/test/python/resource_management/TestXmlConfigResource.py

@@ -61,8 +61,9 @@ class TestXmlConfigResource(TestCase):
     with Environment('/') as env:
       XmlConfig('file.xml',
                 conf_dir='/dir/conf',
-                configurations={}
-      )
+                configurations={},
+                configuration_attributes={}
+                )
 
     open_mock.assert_called_with('/dir/conf/file.xml', 'wb')
     result_file.__enter__().write.assert_called_with(u'<!--Wed 2014-02-->\n    <configuration>\n    \n  </configuration>\n')
@@ -93,11 +94,12 @@ class TestXmlConfigResource(TestCase):
     with Environment('/') as env:
       XmlConfig('file.xml',
                 conf_dir='/dir/conf',
-                configurations={'property1': 'value1'}
-      )
+                configurations={'property1': 'value1'},
+                configuration_attributes={'attr': {'property1': 'attr_value'}}
+                )
 
     open_mock.assert_called_with('/dir/conf/file.xml', 'wb')
-    result_file.__enter__().write.assert_called_with(u'<!--Wed 2014-02-->\n    <configuration>\n    \n    <property>\n      <name>property1</name>\n      <value>value1</value>\n    </property>\n    \n  </configuration>\n')
+    result_file.__enter__().write.assert_called_with(u'<!--Wed 2014-02-->\n    <configuration>\n    \n    <property>\n      <name>property1</name>\n      <value>value1</value>\n      <attr>attr_value</attr>\n    </property>\n    \n  </configuration>\n')
 
 
   @patch("resource_management.core.providers.system._ensure_metadata")
@@ -131,8 +133,27 @@ class TestXmlConfigResource(TestCase):
                                 "prop.2": "INFO, openjpa",
                                 "prop.4": "${oozie.log.dir}/oozie.log",
                                 "prop.empty": "",
-                },
-      )
+                                },
+                configuration_attributes={
+                    "": {
+                        "prop.1": "should_not_be_printed",
+                        "prop.2": "should_not_be_printed",
+                    },
+                    "attr1": {
+                        "prop.1": "x",
+                        "prop.8": "not_existed",
+                    },
+                    "attr2": {
+                        "prop.4": "value4",
+                        "prop.3": "value3"
+                    },
+                    "attr_empty": {
+                    },
+                    "attr_value_empty": {
+                        "prop.4": "",
+                        "prop.empty": ""
+                    }
+                })
 
     open_mock.assert_called_with('/dir/conf/file.xml', 'wb')
-    result_file.__enter__().write.assert_called_with(u'<!--Wed 2014-02-->\n    <configuration>\n    \n    <property>\n      <name></name>\n      <value></value>\n    </property>\n    \n    <property>\n      <name>prop.empty</name>\n      <value></value>\n    </property>\n    \n    <property>\n      <name>prop.3</name>\n      <value>%d{ISO8601} %5p %c{1}:%L - %m%n</value>\n    </property>\n    \n    <property>\n      <name>prop.2</name>\n      <value>INFO, openjpa</value>\n    </property>\n    \n    <property>\n      <name>prop.1</name>\n      <value>&#39;.&#39;yyyy-MM-dd-HH</value>\n    </property>\n    \n    <property>\n      <name>prop.4</name>\n      <value>${oozie.log.dir}/oozie.log</value>\n    </property>\n    \n  </configuration>\n')
+    result_file.__enter__().write.assert_called_with(u'<!--Wed 2014-02-->\n    <configuration>\n    \n    <property>\n      <name></name>\n      <value></value>\n    </property>\n    \n    <property>\n      <name>prop.empty</name>\n      <value></value>\n      <attr_value_empty></attr_value_empty>\n    </property>\n    \n    <property>\n      <name>prop.3</name>\n      <value>%d{ISO8601} %5p %c{1}:%L - %m%n</value>\n      <attr2>value3</attr2>\n    </property>\n    \n    <property>\n      <name>prop.2</name>\n      <value>INFO, openjpa</value>\n    </property>\n    \n    <property>\n      <name>prop.1</name>\n      <value>&#39;.&#39;yyyy-MM-dd-HH</value>\n      <attr1>x</attr1>\n    </property>\n    \n    <property>\n      <name>prop.4</name>\n      <value>${oozie.log.dir}/oozie.log</value>\n      <attr_value_empty></attr_value_empty>\n      <attr2>value4</attr2>\n    </property>\n    \n  </configuration>\n')

+ 16 - 0
ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ExecutionCommandWrapper.java

@@ -32,6 +32,7 @@ import org.apache.commons.logging.LogFactory;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.TreeMap;
 
 public class ExecutionCommandWrapper {
   @Inject
@@ -96,6 +97,21 @@ public class ExecutionCommandWrapper {
             }
           }
 
+          Map<String, Map<String, Map<String, String>>> configAttributes = configHelper.getEffectiveConfigAttributes(cluster,
+              executionCommand.getConfigurationTags());
+
+          for (Map.Entry<String, Map<String, Map<String, String>>> attributesOccurance : configAttributes.entrySet()) {
+            String type = attributesOccurance.getKey();
+            Map<String, Map<String, String>> attributes = attributesOccurance.getValue();
+
+            if (executionCommand.getConfigurationAttributes() != null) {
+              if (!executionCommand.getConfigurationAttributes().containsKey(type)) {
+                executionCommand.getConfigurationAttributes().put(type, new TreeMap<String, Map<String, String>>());
+              }
+              configHelper.cloneAttributesMap(attributes, executionCommand.getConfigurationAttributes().get(type));
+            }
+          }
+
         } catch (AmbariException e) {
           throw new RuntimeException(e);
         }

+ 13 - 0
ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java

@@ -21,6 +21,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
+import com.google.gson.annotations.SerializedName;
 import org.apache.ambari.server.RoleCommand;
 import org.apache.ambari.server.utils.StageUtils;
 import org.apache.commons.logging.Log;
@@ -51,6 +52,8 @@ public class ExecutionCommand extends AgentCommand {
   private Map<String, Set<String>> clusterHostInfo = 
       new HashMap<String, Set<String>>();
   private Map<String, Map<String, String>> configurations;
+  @SerializedName("configuration_attributes")
+  private Map<String, Map<String, Map<String, String>>> configurationAttributes;
   private Map<String, Map<String, String>> configurationTags;
   private Map<String, String> commandParams;
   private String serviceName;
@@ -188,6 +191,16 @@ public class ExecutionCommand extends AgentCommand {
     this.configurations = configurations;
   }
 
+  @JsonProperty("configuration_attributes")
+  public Map<String, Map<String, Map<String, String>>> getConfigurationAttributes() {
+    return configurationAttributes;
+  }
+
+  @JsonProperty("configuration_attributes")
+  public void setConfigurationAttributes(Map<String, Map<String, Map<String, String>>> configurationAttributes) {
+    this.configurationAttributes = configurationAttributes;
+  }
+
   @JsonProperty("commandParams")
   public Map<String, String> getCommandParams() {
     return commandParams;

+ 12 - 1
ambari-server/src/main/java/org/apache/ambari/server/agent/HeartbeatMonitor.java

@@ -239,10 +239,10 @@ public class HeartbeatMonitor implements Runnable {
             stackId.getStackVersion());
 
     Map<String, Map<String, String>> configurations = new TreeMap<String, Map<String, String>>();
+    Map<String, Map<String,  Map<String, String>>> configurationAttributes = new TreeMap<String, Map<String, Map<String, String>>>();
 
     // get the cluster config for type '*-env'
     // apply config group overrides
-
     //Config clusterConfig = cluster.getDesiredConfigByType(GLOBAL);
     Collection<Config> clusterConfigs = cluster.getAllConfigs();
     
@@ -277,6 +277,16 @@ public class HeartbeatMonitor implements Runnable {
         }
   
         configurations.put(clusterConfig.getType(), props);
+
+        Map<String, Map<String, String>> attrs = new TreeMap<String, Map<String, String>>();
+        configHelper.cloneAttributesMap(clusterConfig.getPropertiesAttributes(), attrs);
+
+        Map<String, Map<String, Map<String, String>>> attributes = configHelper
+            .getEffectiveConfigAttributes(cluster, configTags);
+        for (Map<String, Map<String, String>> attributesMap : attributes.values()) {
+          configHelper.cloneAttributesMap(attributesMap, attrs);
+        }
+        configurationAttributes.put(clusterConfig.getType(), attrs);
       }
     }
 
@@ -295,6 +305,7 @@ public class HeartbeatMonitor implements Runnable {
     statusCmd.setServiceName(serviceName);
     statusCmd.setComponentName(componentName);
     statusCmd.setConfigurations(configurations);
+    statusCmd.setConfigurationAttributes(configurationAttributes);
 
     // Fill command params
     Map<String, String> commandParams = statusCmd.getCommandParams();

+ 13 - 0
ambari-server/src/main/java/org/apache/ambari/server/agent/StatusCommand.java

@@ -21,6 +21,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.google.gson.annotations.SerializedName;
 import org.codehaus.jackson.annotate.JsonProperty;
 
 /**
@@ -36,6 +37,8 @@ public class StatusCommand extends AgentCommand {
   private String serviceName;
   private String componentName;
   private Map<String, Map<String, String>> configurations;
+  @SerializedName("configuration_attributes")
+  private Map<String, Map<String, Map<String, String>>> configurationAttributes;
   private Map<String, String> commandParams = new HashMap<String, String>();
   private Map<String, String> hostLevelParams = new HashMap<String, String>();
 
@@ -79,6 +82,16 @@ public class StatusCommand extends AgentCommand {
     this.configurations = configurations;
   }
 
+  @JsonProperty("configuration_attributes")
+  public Map<String, Map<String, Map<String, String>>> getConfigurationAttributes() {
+    return configurationAttributes;
+  }
+
+  @JsonProperty("configuration_attributes")
+  public void setConfigurationAttributes(Map<String, Map<String, Map<String, String>>> configurationAttributes) {
+    this.configurationAttributes = configurationAttributes;
+  }
+
   @JsonProperty("hostLevelParams")
   public Map<String, String> getHostLevelParams() {
     return hostLevelParams;

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java

@@ -331,6 +331,7 @@ public class AmbariActionExecutionHelper {
               serviceName);
 
       Map<String, Map<String, String>> configurations = new TreeMap<String, Map<String, String>>();
+      Map<String, Map<String, Map<String, String>>> configurationAttributes = new TreeMap<String, Map<String, Map<String, String>>>();
       Map<String, Map<String, String>> configTags = null;
       if (!serviceName.isEmpty() && null != cluster) {
         configTags = managementController.findConfigurationTagsWithOverrides(cluster, hostName);
@@ -350,6 +351,7 @@ public class AmbariActionExecutionHelper {
         * combined with the same code at createHostAction()
         */
       execCmd.setConfigurations(configurations);
+      execCmd.setConfigurationAttributes(configurationAttributes);
       execCmd.setConfigurationTags(configTags);
       execCmd.setHostLevelParams(hostLevelParams);
       execCmd.setCommandParams(commandParams);

+ 6 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java

@@ -256,6 +256,8 @@ public class AmbariCustomCommandExecutionHelper {
 
       Map<String, Map<String, String>> configurations =
           new TreeMap<String, Map<String, String>>();
+      Map<String, Map<String, Map<String, String>>> configurationAttributes =
+          new TreeMap<String, Map<String, Map<String, String>>>();
       Map<String, Map<String, String>> configTags =
           managementController.findConfigurationTagsWithOverrides(cluster, hostName);
 
@@ -269,6 +271,7 @@ public class AmbariCustomCommandExecutionHelper {
           componentName).getExecutionCommand();
 
       execCmd.setConfigurations(configurations);
+      execCmd.setConfigurationAttributes(configurationAttributes);
       execCmd.setConfigurationTags(configTags);
 
 
@@ -447,6 +450,8 @@ public class AmbariCustomCommandExecutionHelper {
     // [ type -> [ key, value ] ]
     Map<String, Map<String, String>> configurations =
         new TreeMap<String, Map<String, String>>();
+    Map<String, Map<String, Map<String, String>>> configurationAttributes =
+        new TreeMap<String, Map<String, Map<String, String>>>();
     Map<String, Map<String, String>> configTags =
         managementController.findConfigurationTagsWithOverrides(cluster, hostname);
 
@@ -454,6 +459,7 @@ public class AmbariCustomCommandExecutionHelper {
         smokeTestRole).getExecutionCommand();
 
     execCmd.setConfigurations(configurations);
+    execCmd.setConfigurationAttributes(configurationAttributes);
     execCmd.setConfigurationTags(configTags);
 
     // Generate cluster host info

+ 4 - 1
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java

@@ -1357,6 +1357,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
   private void createHostAction(Cluster cluster,
                                 Stage stage, ServiceComponentHost scHost,
                                 Map<String, Map<String, String>> configurations,
+                                Map<String, Map<String, Map<String, String>>> configurationAttributes,
                                 Map<String, Map<String, String>> configTags,
                                 RoleCommand roleCommand,
                                 Map<String, String> commandParams,
@@ -1402,6 +1403,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
     }
 
     execCmd.setConfigurations(configurations);
+    execCmd.setConfigurationAttributes(configurationAttributes);
     execCmd.setConfigurationTags(configTags);
     if (commandParams == null) { // if not defined
       commandParams = new TreeMap<String, String>();
@@ -1741,6 +1743,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
 
             // [ type -> [ key, value ] ]
             Map<String, Map<String, String>> configurations = new TreeMap<String, Map<String, String>>();
+            Map<String, Map<String, Map<String, String>>> configurationAttributes = new TreeMap<String, Map<String, Map<String, String>>>();
             Host host = clusters.getHost(scHost.getHostName());
 
             Map<String, Map<String, String>> configTags =
@@ -1763,7 +1766,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
               requestParameters.put(keyName, requestProperties.get(keyName));
             }
 
-            createHostAction(cluster, stage, scHost, configurations, configTags,
+            createHostAction(cluster, stage, scHost, configurations, configurationAttributes, configTags,
               roleCommand, requestParameters, event);
           }
         }

+ 65 - 1
ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java

@@ -181,6 +181,55 @@ public class ConfigHelper {
     return properties;
   }
 
+  /**
+   * Get all config attributes for a cluster given a set of configType to
+   * versionTags map. This helper method merges all the override tags with a
+   * the attributes from parent cluster config properties
+   *
+   * @param cluster
+   * @param desiredTags
+   * @return {type : {attribute : {property, attributeValue}}
+   */
+  public Map<String, Map<String, Map<String, String>>> getEffectiveConfigAttributes(
+      Cluster cluster, Map<String, Map<String, String>> desiredTags) {
+
+    Map<String, Map<String, Map<String, String>>> attributes = new HashMap<String, Map<String, Map<String, String>>>();
+
+    if (desiredTags != null) {
+      for (Entry<String, Map<String, String>> entry : desiredTags.entrySet()) {
+
+        String type = entry.getKey();
+        Map<String, Map<String, String>> attributesMap = null;
+
+        Map<String, String> tags = new HashMap<String, String>(entry.getValue());
+        String clusterTag = tags.get(CLUSTER_DEFAULT_TAG);
+
+        if (clusterTag != null) {
+          Config config = cluster.getConfig(type, clusterTag);
+          if (config != null) {
+            attributesMap = new TreeMap<String, Map<String, String>>();
+            cloneAttributesMap(config.getPropertiesAttributes(), attributesMap);
+          }
+          tags.remove(CLUSTER_DEFAULT_TAG);
+        }
+        for (Entry<String, String> overrideEntry : tags.entrySet()) {
+          Config overrideConfig = cluster.getConfig(type,
+              overrideEntry.getValue());
+
+          // TODO clarify correct behavior for attributes overriding
+          if (overrideConfig != null) {
+            cloneAttributesMap(overrideConfig.getPropertiesAttributes(), attributesMap);
+          }
+        }
+        if (attributesMap != null) {
+          attributes.put(type, attributesMap);
+        }
+      }
+    }
+
+    return attributes;
+  }
+
   /**
    * Merge override with original, if original property doesn't exist,
    * add it to the properties
@@ -198,7 +247,7 @@ public class ConfigHelper {
       for (Entry<String, String> entry : override.entrySet()) {
         Boolean deleted = 0 == entry.getKey().indexOf(DELETED);
         String nameToUse = deleted ?
-          entry.getKey().substring(DELETED.length()) : entry.getKey();
+            entry.getKey().substring(DELETED.length()) : entry.getKey();
         if (finalConfig.containsKey(nameToUse)) {
           finalConfig.remove(nameToUse);
         }
@@ -211,6 +260,21 @@ public class ConfigHelper {
     return finalConfig;
   }
 
+  public void cloneAttributesMap(Map<String, Map<String, String>> sourceAttributesMap,
+                                 Map<String, Map<String, String>> targetAttributesMap) {
+    if (sourceAttributesMap != null && targetAttributesMap != null) {
+      for (Entry<String, Map<String, String>> attributesEntry : sourceAttributesMap.entrySet()) {
+        String attributeName = attributesEntry.getKey();
+        if (!targetAttributesMap.containsKey(attributeName)) {
+          targetAttributesMap.put(attributeName, new TreeMap<String, String>());
+        }
+        for (Entry<String, String> attributesValue : attributesEntry.getValue().entrySet()) {
+          targetAttributesMap.get(attributeName).put(attributesValue.getKey(), attributesValue.getValue());
+        }
+      }
+    }
+  }
+
   public void applyCustomConfig(Map<String, Map<String, String>> configurations,
       String type, String name, String value, Boolean deleted) {
     if (!configurations.containsKey(type)) {

+ 8 - 0
ambari-server/src/main/java/org/apache/ambari/server/utils/StageUtils.java

@@ -178,6 +178,14 @@ public class StageUtils {
         new TreeMap<String, Map<String, String>>();
     configurations.put("hdfs-site", hdfsSite);
     execCmd.setConfigurations(configurations);
+    Map<String, Map<String, Map<String, String>>> configurationAttributes =
+        new TreeMap<String, Map<String, Map<String, String>>>();
+    Map<String, Map<String, String>> hdfsSiteAttributes = new TreeMap<String, Map<String, String>>();
+    Map<String, String> finalAttribute = new TreeMap<String, String>();
+    finalAttribute.put("dfs.block.size", "true");
+    hdfsSiteAttributes.put("final", finalAttribute);
+    configurationAttributes.put("hdfsSite", hdfsSiteAttributes);
+    execCmd.setConfigurationAttributes(configurationAttributes);
     Map<String, String> params = new TreeMap<String, String>();
     params.put("jdklocation", "/x/y/z");
     params.put("stack_version", "1.2.0");

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/1.3.2/hooks/after-INSTALL/scripts/shared_initialization.py

@@ -46,6 +46,7 @@ def setup_config():
   XmlConfig("core-site.xml",
             conf_dir=params.hadoop_conf_dir,
             configurations=params.config['configurations']['core-site'],
+            configuration_attributes=params.config['configuration_attributes']['core-site'],
             owner=params.hdfs_user,
             group=params.user_group
   )

+ 4 - 0
ambari-server/src/main/resources/stacks/HDP/1.3.2/services/HBASE/package/scripts/hbase.py

@@ -41,6 +41,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client'
   XmlConfig( "hbase-site.xml",
             conf_dir = params.hbase_conf_dir,
             configurations = params.config['configurations']['hbase-site'],
+            configuration_attributes=params.config['configuration_attributes']['hbase-site'],
             owner = params.hbase_user,
             group = params.user_group
   )
@@ -48,6 +49,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client'
   XmlConfig( "hdfs-site.xml",
             conf_dir = params.hbase_conf_dir,
             configurations = params.config['configurations']['hdfs-site'],
+            configuration_attributes=params.config['configuration_attributes']['hdfs-site'],
             owner = params.hbase_user,
             group = params.user_group
   )
@@ -55,6 +57,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client'
   XmlConfig("hdfs-site.xml",
             conf_dir=params.hadoop_conf_dir,
             configurations=params.config['configurations']['hdfs-site'],
+            configuration_attributes=params.config['configuration_attributes']['hdfs-site'],
             owner=params.hdfs_user,
             group=params.user_group
   )
@@ -63,6 +66,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client'
     XmlConfig( "hbase-policy.xml",
       conf_dir = params.hbase_conf_dir,
       configurations = params.config['configurations']['hbase-policy'],
+      configuration_attributes=params.config['configuration_attributes']['hbase-policy'],
       owner = params.hbase_user,
       group = params.user_group
     )

+ 2 - 0
ambari-server/src/main/resources/stacks/HDP/1.3.2/services/HDFS/package/scripts/hdfs.py

@@ -45,6 +45,7 @@ def hdfs(name=None):
     XmlConfig("hadoop-policy.xml",
               conf_dir=params.hadoop_conf_dir,
               configurations=params.config['configurations']['hadoop-policy'],
+              configuration_attributes=params.config['configuration_attributes']['hadoop_policy'],
               owner=params.hdfs_user,
               group=params.user_group
     )
@@ -52,6 +53,7 @@ def hdfs(name=None):
   XmlConfig("hdfs-site.xml",
             conf_dir=params.hadoop_conf_dir,
             configurations=params.config['configurations']['hdfs-site'],
+            configuration_attributes=params.config['configuration_attributes']['hdfs-site'],
             owner=params.hdfs_user,
             group=params.user_group
   )

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/1.3.2/services/HIVE/package/scripts/hcat.py

@@ -38,6 +38,7 @@ def hcat():
   XmlConfig("hive-site.xml",
             conf_dir=params.hive_conf_dir,
             configurations=params.config['configurations']['hive-site'],
+            configuration_attributes=params.config['configuration_attributes']['hive-site'],
             owner=params.hive_user,
             group=params.user_group,
             mode=0644)

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/1.3.2/services/HIVE/package/scripts/hive.py

@@ -56,6 +56,7 @@ def hive(name=None):
   XmlConfig("hive-site.xml",
             conf_dir=hive_config_dir,
             configurations=params.config['configurations']['hive-site'],
+            configuration_attributes=params.config['configuration_attributes']['hive-site'],
             owner=params.hive_user,
             group=params.user_group,
             mode=config_file_mode

+ 3 - 0
ambari-server/src/main/resources/stacks/HDP/1.3.2/services/MAPREDUCE/package/scripts/mapreduce.py

@@ -127,6 +127,7 @@ def mapreduce(name=None):
               conf_dir=params.hadoop_conf_dir,
               configurations=params.config['configurations'][
                 'capacity-scheduler'],
+              configuration_attributes=params.config['configuration_attributes']['capacity-scheduler'],
               owner=params.hdfs_user,
               group=params.user_group
     )
@@ -136,6 +137,7 @@ def mapreduce(name=None):
               conf_dir=params.hadoop_conf_dir,
               configurations=params.config['configurations'][
                 'mapred-queue-acls'],
+              configuration_attributes=params.config['configuration_attributes']['mapred-queue-acls'],
               owner=params.mapred_user,
               group=params.user_group
     )
@@ -150,6 +152,7 @@ def mapreduce(name=None):
     XmlConfig("mapred-site.xml",
               conf_dir=params.hadoop_conf_dir,
               configurations=params.config['configurations']['mapred-site'],
+              configuration_attributes=params.config['configuration_attributes']['mapred-site'],
               owner=params.mapred_user,
               group=params.user_group
     )

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/1.3.2/services/OOZIE/package/scripts/oozie.py

@@ -34,6 +34,7 @@ def oozie(is_server=False
   XmlConfig( "oozie-site.xml",
     conf_dir = params.conf_dir, 
     configurations = params.config['configurations']['oozie-site'],
+    configuration_attributes=params.config['configuration_attributes']['oozie-site'],
     owner = params.oozie_user,
     group = params.user_group,
     mode = 0664

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/1.3.2/services/WEBHCAT/package/scripts/webhcat.py

@@ -60,6 +60,7 @@ def webhcat():
   XmlConfig("webhcat-site.xml",
             conf_dir=params.config_dir,
             configurations=params.config['configurations']['webhcat-site'],
+            configuration_attributes=params.config['configuration_attributes']['webhcat-site'],
             owner=params.webhcat_user,
             group=params.user_group,
   )

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/after-INSTALL/scripts/shared_initialization.py

@@ -44,6 +44,7 @@ def setup_config():
   XmlConfig("core-site.xml",
             conf_dir=params.hadoop_conf_dir,
             configurations=params.config['configurations']['core-site'],
+            configuration_attributes=params.config['configuration_attributes']['core-site'],
             owner=params.hdfs_user,
             group=params.user_group
   )

+ 4 - 0
ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HBASE/package/scripts/hbase.py

@@ -47,6 +47,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client'
   XmlConfig( "hbase-site.xml",
             conf_dir = params.hbase_conf_dir,
             configurations = params.config['configurations']['hbase-site'],
+            configuration_attributes=params.config['configuration_attributes']['hbase-site'],
             owner = params.hbase_user,
             group = params.user_group
   )
@@ -54,6 +55,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client'
   XmlConfig( "hdfs-site.xml",
             conf_dir = params.hbase_conf_dir,
             configurations = params.config['configurations']['hdfs-site'],
+            configuration_attributes=params.config['configuration_attributes']['hdfs-site'],
             owner = params.hbase_user,
             group = params.user_group
   )
@@ -61,6 +63,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client'
   XmlConfig("hdfs-site.xml",
             conf_dir=params.hadoop_conf_dir,
             configurations=params.config['configurations']['hdfs-site'],
+            configuration_attributes=params.config['configuration_attributes']['hdfs-site'],
             owner=params.hdfs_user,
             group=params.user_group
   )
@@ -69,6 +72,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client'
     XmlConfig( "hbase-policy.xml",
             conf_dir = params.hbase_conf_dir,
             configurations = params.config['configurations']['hbase-policy'],
+            configuration_attributes=params.config['configuration_attributes']['hbase-policy'],
             owner = params.hbase_user,
             group = params.user_group
     )

+ 2 - 0
ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HDFS/package/scripts/hdfs.py

@@ -45,6 +45,7 @@ def hdfs(name=None):
     XmlConfig("hadoop-policy.xml",
               conf_dir=params.hadoop_conf_dir,
               configurations=params.config['configurations']['hadoop-policy'],
+              configuration_attributes=params.config['configuration_attributes']['hadoop-policy'],
               owner=params.hdfs_user,
               group=params.user_group
     )
@@ -52,6 +53,7 @@ def hdfs(name=None):
   XmlConfig("hdfs-site.xml",
             conf_dir=params.hadoop_conf_dir,
             configurations=params.config['configurations']['hdfs-site'],
+            configuration_attributes=params.config['configuration_attributes']['hdfs-site'],
             owner=params.hdfs_user,
             group=params.user_group
   )

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HIVE/package/scripts/hcat.py

@@ -38,6 +38,7 @@ def hcat():
   XmlConfig("hive-site.xml",
             conf_dir=params.hive_conf_dir,
             configurations=params.config['configurations']['hive-site'],
+            configuration_attributes=params.config['configuration_attributes']['hive-site'],
             owner=params.hive_user,
             group=params.user_group,
             mode=0644)

+ 2 - 0
ambari-server/src/main/resources/stacks/HDP/2.0.6/services/HIVE/package/scripts/hive.py

@@ -56,6 +56,7 @@ def hive(name=None):
   XmlConfig("mapred-site.xml",
             conf_dir=hive_config_dir,
             configurations=params.config['configurations']['mapred-site'],
+            configuration_attributes=params.config['configuration_attributes']['mapred-site'],
             owner=params.hive_user,
             group=params.user_group,
             mode=config_file_mode)
@@ -63,6 +64,7 @@ def hive(name=None):
   XmlConfig("hive-site.xml",
             conf_dir=hive_config_dir,
             configurations=params.config['configurations']['hive-site'],
+            configuration_attributes=params.config['configuration_attributes']['hive-site'],
             owner=params.hive_user,
             group=params.user_group,
             mode=config_file_mode)

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/2.0.6/services/OOZIE/package/scripts/oozie.py

@@ -37,6 +37,7 @@ def oozie(is_server=False # TODO: see if see can remove this
   XmlConfig( "oozie-site.xml",
     conf_dir = params.conf_dir, 
     configurations = oozie_site,
+    configuration_attributes=params.config['configuration_attributes']['oozie-site'],
     owner = params.oozie_user,
     group = params.user_group,
     mode = 0664

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/2.0.6/services/WEBHCAT/package/scripts/webhcat.py

@@ -62,6 +62,7 @@ def webhcat():
   XmlConfig("webhcat-site.xml",
             conf_dir=params.config_dir,
             configurations=params.config['configurations']['webhcat-site'],
+            configuration_attributes=params.config['configuration_attributes']['webhcat-site'],
             owner=params.webhcat_user,
             group=params.user_group,
   )

+ 7 - 0
ambari-server/src/main/resources/stacks/HDP/2.0.6/services/YARN/package/scripts/yarn.py

@@ -80,6 +80,7 @@ def yarn(name = None):
   XmlConfig("core-site.xml",
             conf_dir=params.config_dir,
             configurations=params.config['configurations']['core-site'],
+            configuration_attributes=params.config['configuration_attributes']['core-site'],
             owner=params.hdfs_user,
             group=params.user_group,
             mode=0644
@@ -88,6 +89,7 @@ def yarn(name = None):
   XmlConfig("mapred-site.xml",
             conf_dir=params.config_dir,
             configurations=params.config['configurations']['mapred-site'],
+            configuration_attributes=params.config['configuration_attributes']['mapred-site'],
             owner=params.yarn_user,
             group=params.user_group,
             mode=0644
@@ -96,6 +98,7 @@ def yarn(name = None):
   XmlConfig("yarn-site.xml",
             conf_dir=params.config_dir,
             configurations=params.config['configurations']['yarn-site'],
+            configuration_attributes=params.config['configuration_attributes']['yarn-site'],
             owner=params.yarn_user,
             group=params.user_group,
             mode=0644
@@ -104,6 +107,7 @@ def yarn(name = None):
   XmlConfig("capacity-scheduler.xml",
             conf_dir=params.config_dir,
             configurations=params.config['configurations']['capacity-scheduler'],
+            configuration_attributes=params.config['configuration_attributes']['capacity-scheduler'],
             owner=params.yarn_user,
             group=params.user_group,
             mode=0644
@@ -191,6 +195,7 @@ def yarn(name = None):
     XmlConfig("mapred-site.xml",
               conf_dir=params.hadoop_conf_dir,
               configurations=params.config['configurations']['mapred-site'],
+              configuration_attributes=params.config['configuration_attributes']['mapred-site'],
               owner=params.mapred_user,
               group=params.user_group
     )
@@ -200,6 +205,7 @@ def yarn(name = None):
               conf_dir=params.hadoop_conf_dir,
               configurations=params.config['configurations'][
                 'mapred-queue-acls'],
+              configuration_attributes=params.config['configuration_attributes']['mapred-queue-acls'],
               owner=params.mapred_user,
               group=params.user_group
     )
@@ -215,6 +221,7 @@ def yarn(name = None):
               conf_dir=params.hadoop_conf_dir,
               configurations=params.config['configurations'][
                 'capacity-scheduler'],
+              configuration_attributes=params.config['configuration_attributes']['capacity-scheduler'],
               owner=params.hdfs_user,
               group=params.user_group
     )

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/TEZ/package/scripts/tez.py

@@ -33,6 +33,7 @@ def tez():
   XmlConfig( "tez-site.xml",
             conf_dir = params.config_dir,
             configurations = params.config['configurations']['tez-site'],
+            configuration_attributes=params.config['configuration_attributes']['tez-site'],
             owner = params.tez_user,
             group = params.user_group,
             mode = 0664

+ 4 - 0
ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/yarn.py

@@ -86,6 +86,7 @@ def yarn(name = None):
   XmlConfig("core-site.xml",
             conf_dir=params.config_dir,
             configurations=params.config['configurations']['core-site'],
+            configuration_attributes=params.config['configuration_attributes']['core-site'],
             owner=params.hdfs_user,
             group=params.user_group,
             mode=0644
@@ -94,6 +95,7 @@ def yarn(name = None):
   XmlConfig("mapred-site.xml",
             conf_dir=params.config_dir,
             configurations=params.config['configurations']['mapred-site'],
+            configuration_attributes=params.config['configuration_attributes']['mapred-site'],
             owner=params.yarn_user,
             group=params.user_group,
             mode=0644
@@ -102,6 +104,7 @@ def yarn(name = None):
   XmlConfig("yarn-site.xml",
             conf_dir=params.config_dir,
             configurations=params.config['configurations']['yarn-site'],
+            configuration_attributes=params.config['configuration_attributes']['yarn-site'],
             owner=params.yarn_user,
             group=params.user_group,
             mode=0644
@@ -110,6 +113,7 @@ def yarn(name = None):
   XmlConfig("capacity-scheduler.xml",
             conf_dir=params.config_dir,
             configurations=params.config['configurations']['capacity-scheduler'],
+            configuration_attributes=params.config['configuration_attributes']['capacity-scheduler'],
             owner=params.yarn_user,
             group=params.user_group,
             mode=0644

+ 1 - 0
ambari-server/src/main/resources/stacks/HDP/2.1/services/TEZ/package/scripts/tez.py

@@ -33,6 +33,7 @@ def tez():
   XmlConfig( "tez-site.xml",
             conf_dir = params.config_dir,
             configurations = params.config['configurations']['tez-site'],
+            configuration_attributes=params.config['configuration_attributes']['tez-site'],
             owner = params.tez_user,
             group = params.user_group,
             mode = 0664

+ 2 - 0
ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java

@@ -4413,10 +4413,12 @@ public class AmbariManagementControllerTest {
     Config config1 = cf.createNew(cluster, "global",
         new HashMap<String, String>(){{ put("key1", "value1"); }}, new HashMap<String, Map<String,String>>());
     config1.setVersionTag("version1");
+    config1.setPropertiesAttributes(new HashMap<String, Map<String, String>>(){{ put("attr1", new HashMap<String, String>()); }});
 
     Config config2 = cf.createNew(cluster, "core-site",
         new HashMap<String, String>(){{ put("key1", "value1"); }}, new HashMap<String, Map<String,String>>());
     config2.setVersionTag("version1");
+    config2.setPropertiesAttributes(new HashMap<String, Map<String, String>>(){{ put("attr2", new HashMap<String, String>()); }});
 
     cluster.addConfig(config1);
     cluster.addConfig(config2);

+ 173 - 0
ambari-server/src/test/java/org/apache/ambari/server/state/ConfigHelperTest.java

@@ -86,6 +86,12 @@ public class ConfigHelperTest {
       put("ipc.client.connect.max.retries", "30");
       put("fs.trash.interval", "30");
     }});
+    cr.setPropertiesAttributes(new HashMap<String, Map<String, String>>() {{
+      Map<String, String> attrs = new HashMap<String, String>();
+      attrs.put("ipc.client.connect.max.retries", "1");
+      attrs.put("fs.trash.interval", "2");
+      put("attribute1", attrs);
+    }});
 
     final ClusterRequest clusterRequest1 =
       new ClusterRequest(cluster.getClusterId(), clusterName,
@@ -102,6 +108,12 @@ public class ConfigHelperTest {
       put("dfs_namenode_name_dir", "/hadoop/hdfs/namenode");
       put("namenode_heapsize", "1024");
     }});
+    cr.setPropertiesAttributes(new HashMap<String, Map<String, String>>() {{
+      Map<String, String> attrs = new HashMap<String, String>();
+      attrs.put("dfs_namenode_name_dir", "3");
+      attrs.put("namenode_heapsize", "4");
+      put("attribute2", attrs);
+    }});
 
     final ClusterRequest clusterRequest2 =
       new ClusterRequest(cluster.getClusterId(), clusterName,
@@ -206,4 +218,165 @@ public class ConfigHelperTest {
     Assert.assertTrue(coreProps.containsKey("c"));
     Assert.assertEquals("30", coreProps.get("ipc.client.connect.max.retries"));
   }
+
+  @Test
+  public void testEffectivePropertiesAttributesWithOverrides() throws Exception {
+    final Config config1 = new ConfigImpl("core-site");
+    config1.setVersionTag("version122");
+
+    Map<String, String> attributes = new HashMap<String, String>();
+    attributes.put("fs.trash.interval", "11");
+    attributes.put("b", "y");
+    Map<String, Map<String, String>> config1Attributes = new HashMap<String, Map<String, String>>();
+    config1Attributes.put("attribute1", attributes);
+    config1.setPropertiesAttributes(config1Attributes);
+
+    final Config config2 = new ConfigImpl("global");
+    config2.setVersionTag("version122");
+    attributes = new HashMap<String, String>();
+    attributes.put("namenode_heapsize", "z");
+    attributes.put("c", "q");
+    Map<String, Map<String, String>> config2Attributes = new HashMap<String, Map<String, String>>();
+    config2Attributes.put("attribute2", attributes);
+    config2.setPropertiesAttributes(config2Attributes);
+
+    Long groupId = addConfigGroup("g1", "t1", new ArrayList<String>() {{
+      add("h1");}}, new ArrayList<Config>() {{ add(config1); add(config2);
+    }});
+
+    Assert.assertNotNull(groupId);
+
+    Map<String, Map<String, Map<String, String>>> effectiveAttributes = configHelper
+        .getEffectiveConfigAttributes(cluster,
+            configHelper.getEffectiveDesiredTags(cluster, "h1"));
+
+    Assert.assertNotNull(effectiveAttributes);
+    Assert.assertEquals(2, effectiveAttributes.size());
+
+    Assert.assertTrue(effectiveAttributes.containsKey("global"));
+    Map<String, Map<String, String>> globalAttrs = effectiveAttributes.get("global");
+    Assert.assertEquals(1, globalAttrs.size());
+    Assert.assertTrue(globalAttrs.containsKey("attribute2"));
+    Map<String, String> attribute2Occurances = globalAttrs.get("attribute2");
+    Assert.assertEquals(3, attribute2Occurances.size());
+    Assert.assertTrue(attribute2Occurances.containsKey("namenode_heapsize"));
+    Assert.assertEquals("z", attribute2Occurances.get("namenode_heapsize"));
+    Assert.assertTrue(attribute2Occurances.containsKey("dfs_namenode_name_dir"));
+    Assert.assertEquals("3", attribute2Occurances.get("dfs_namenode_name_dir"));
+    Assert.assertTrue(attribute2Occurances.containsKey("c"));
+    Assert.assertEquals("q", attribute2Occurances.get("c"));
+
+    Assert.assertTrue(effectiveAttributes.containsKey("core-site"));
+    Map<String, Map<String, String>> coreAttrs = effectiveAttributes.get("core-site");
+    Assert.assertEquals(1, coreAttrs.size());
+    Assert.assertTrue(coreAttrs.containsKey("attribute1"));
+    Map<String, String> attribute1Occurances = coreAttrs.get("attribute1");
+    Assert.assertEquals(3, attribute1Occurances.size());
+    Assert.assertTrue(attribute1Occurances.containsKey("ipc.client.connect.max.retries"));
+    Assert.assertEquals("1", attribute1Occurances.get("ipc.client.connect.max.retries"));
+    Assert.assertTrue(attribute1Occurances.containsKey("fs.trash.interval"));
+    Assert.assertEquals("11", attribute1Occurances.get("fs.trash.interval"));
+    Assert.assertTrue(attribute1Occurances.containsKey("b"));
+    Assert.assertEquals("y", attribute1Occurances.get("b"));
+  }
+
+  @Test
+  public void testCloneAttributesMap() throws Exception {
+    // init
+    Map<String, Map<String, String>> targetAttributesMap = new HashMap<String, Map<String, String>>();
+    Map<String, String> attributesValues = new HashMap<String, String>();
+    attributesValues.put("a", "1");
+    attributesValues.put("b", "2");
+    attributesValues.put("f", "3");
+    attributesValues.put("q", "4");
+    targetAttributesMap.put("attr", attributesValues);
+    Map<String, Map<String, String>> sourceAttributesMap = new HashMap<String, Map<String, String>>();
+    attributesValues = new HashMap<String, String>();
+    attributesValues.put("a", "5");
+    attributesValues.put("f", "6");
+    sourceAttributesMap.put("attr", attributesValues);
+    attributesValues = new HashMap<String, String>();
+    attributesValues.put("f", "7");
+    attributesValues.put("q", "8");
+    sourceAttributesMap.put("attr1", attributesValues);
+
+    // eval
+    configHelper.cloneAttributesMap(sourceAttributesMap, targetAttributesMap);
+
+    // verification
+    Assert.assertEquals(2, targetAttributesMap.size());
+    Assert.assertTrue(targetAttributesMap.containsKey("attr"));
+    Assert.assertTrue(targetAttributesMap.containsKey("attr1"));
+    Map<String, String> attributes = targetAttributesMap.get("attr");
+    Assert.assertEquals(4, attributes.size());
+    Assert.assertEquals("5", attributes.get("a"));
+    Assert.assertEquals("2", attributes.get("b"));
+    Assert.assertEquals("6", attributes.get("f"));
+    Assert.assertEquals("4", attributes.get("q"));
+    attributes = targetAttributesMap.get("attr1");
+    Assert.assertEquals(2, attributes.size());
+    Assert.assertEquals("7", attributes.get("f"));
+    Assert.assertEquals("8", attributes.get("q"));
+  }
+
+  @Test
+  public void testCloneAttributesMap_sourceIsNull() throws Exception {
+    // init
+    Map<String, Map<String, String>> targetAttributesMap = new HashMap<String, Map<String, String>>();
+    Map<String, String> attributesValues = new HashMap<String, String>();
+    attributesValues.put("a", "1");
+    attributesValues.put("b", "2");
+    attributesValues.put("f", "3");
+    attributesValues.put("q", "4");
+    targetAttributesMap.put("attr", attributesValues);
+    Map<String, Map<String, String>> sourceAttributesMap = null;
+
+    // eval
+    configHelper.cloneAttributesMap(sourceAttributesMap, targetAttributesMap);
+
+    // verification
+    // No exception should be thrown
+    // targetMap should not be changed
+    Assert.assertEquals(1, targetAttributesMap.size());
+    Assert.assertTrue(targetAttributesMap.containsKey("attr"));
+    Map<String, String> attributes = targetAttributesMap.get("attr");
+    Assert.assertEquals(4, attributes.size());
+    Assert.assertEquals("1", attributes.get("a"));
+    Assert.assertEquals("2", attributes.get("b"));
+    Assert.assertEquals("3", attributes.get("f"));
+    Assert.assertEquals("4", attributes.get("q"));
+  }
+
+  @Test
+  public void testCloneAttributesMap_targetIsNull() throws Exception {
+    // init
+    Map<String, Map<String, String>> targetAttributesMap = null;
+    Map<String, Map<String, String>> sourceAttributesMap = new HashMap<String, Map<String, String>>();
+    Map<String, String> attributesValues = new HashMap<String, String>();
+    attributesValues.put("a", "5");
+    attributesValues.put("f", "6");
+    sourceAttributesMap.put("attr", attributesValues);
+    attributesValues = new HashMap<String, String>();
+    attributesValues.put("f", "7");
+    attributesValues.put("q", "8");
+    sourceAttributesMap.put("attr1", attributesValues);
+
+    // eval
+    configHelper.cloneAttributesMap(sourceAttributesMap, targetAttributesMap);
+
+    // verification
+    // No exception should be thrown
+    // sourceMap should not be changed
+    Assert.assertEquals(2, sourceAttributesMap.size());
+    Assert.assertTrue(sourceAttributesMap.containsKey("attr"));
+    Assert.assertTrue(sourceAttributesMap.containsKey("attr1"));
+    Map<String, String> attributes = sourceAttributesMap.get("attr");
+    Assert.assertEquals(2, attributes.size());
+    Assert.assertEquals("5", attributes.get("a"));
+    Assert.assertEquals("6", attributes.get("f"));
+    attributes = sourceAttributesMap.get("attr1");
+    Assert.assertEquals(2, attributes.size());
+    Assert.assertEquals("7", attributes.get("f"));
+    Assert.assertEquals("8", attributes.get("q"));
+  }
 }

+ 1 - 1
ambari-server/src/test/python/TestResourceFilesKeeper.py

@@ -49,7 +49,7 @@ class TestResourceFilesKeeper(TestCase):
   DUMMY_UNCHANGEABLE_PACKAGE=os.path.join(DUMMY_UNCHANGEABLE_STACK,
                                     ResourceFilesKeeper.PACKAGE_DIR)
 
-  DUMMY_UNCHANGEABLE_PACKAGE_HASH="4cd211c4d16b49b3546ecc9b7996698105fe10e4"
+  DUMMY_UNCHANGEABLE_PACKAGE_HASH="5de50cd1b26c5ff9b6f1031b9d15fa14df1a3898"
   DUMMY_HASH="dummy_hash"
   YA_HASH="yet_another_hash"
   SOME_PATH="some-path"

+ 12 - 6
ambari-server/src/test/python/stacks/1.3.2/HBASE/test_hbase_client.py

@@ -43,19 +43,22 @@ class TestHBaseClient(RMFTestCase):
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hbase-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hbase-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hdfs',
       group = 'hadoop',
       conf_dir = '/etc/hadoop/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
       owner = 'hbase',
@@ -106,19 +109,22 @@ class TestHBaseClient(RMFTestCase):
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hbase-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hbase-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
     )    
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hdfs',
       group = 'hadoop',
       conf_dir = '/etc/hadoop/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
       owner = 'hbase',

+ 12 - 6
ambari-server/src/test/python/stacks/1.3.2/HBASE/test_hbase_master.py

@@ -177,19 +177,22 @@ class TestHBaseMaster(RMFTestCase):
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hbase-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hbase-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
                               owner = 'hdfs',
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
-                              configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+                              configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
       owner = 'hbase',
@@ -264,19 +267,22 @@ class TestHBaseMaster(RMFTestCase):
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hbase-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hbase-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hdfs',
       group = 'hadoop',
       conf_dir = '/etc/hadoop/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
       owner = 'hbase',

+ 12 - 6
ambari-server/src/test/python/stacks/1.3.2/HBASE/test_hbase_regionserver.py

@@ -111,19 +111,22 @@ class TestHbaseRegionServer(RMFTestCase):
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hbase-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hbase-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hdfs',
       group = 'hadoop',
       conf_dir = '/etc/hadoop/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
       owner = 'hbase',
@@ -199,19 +202,22 @@ class TestHbaseRegionServer(RMFTestCase):
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hbase-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hbase-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties      
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hdfs',
       group = 'hadoop',
       conf_dir = '/etc/hadoop/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
       owner = 'hbase',

+ 2 - 0
ambari-server/src/test/python/stacks/1.3.2/HDFS/test_datanode.py

@@ -156,6 +156,7 @@ class TestDatanode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),
@@ -192,6 +193,7 @@ class TestDatanode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),

+ 2 - 0
ambari-server/src/test/python/stacks/1.3.2/HDFS/test_namenode.py

@@ -229,6 +229,7 @@ class TestNamenode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
 
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
@@ -256,6 +257,7 @@ class TestNamenode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
 
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',

+ 2 - 0
ambari-server/src/test/python/stacks/1.3.2/HDFS/test_snamenode.py

@@ -177,6 +177,7 @@ class TestSNamenode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),
@@ -201,6 +202,7 @@ class TestSNamenode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),

+ 2 - 0
ambari-server/src/test/python/stacks/1.3.2/HIVE/test_hcat_client.py

@@ -43,6 +43,7 @@ class TestHcatClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hive/conf',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
 
     self.assertResourceCalled('TemplateConfig', '/etc/hcatalog/conf/hcat-env.sh',
@@ -75,6 +76,7 @@ class TestHcatClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hive/conf',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
 
     self.assertResourceCalled('TemplateConfig', '/etc/hcatalog/conf/hcat-env.sh',

+ 2 - 0
ambari-server/src/test/python/stacks/1.3.2/HIVE/test_hive_client.py

@@ -39,6 +39,7 @@ class TestHiveClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hive/conf',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',
@@ -92,6 +93,7 @@ class TestHiveClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hive/conf',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',

+ 2 - 0
ambari-server/src/test/python/stacks/1.3.2/HIVE/test_hive_metastore.py

@@ -175,6 +175,7 @@ class TestHiveMetastore(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',
@@ -233,6 +234,7 @@ class TestHiveMetastore(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',

+ 2 - 0
ambari-server/src/test/python/stacks/1.3.2/HIVE/test_hive_server.py

@@ -221,6 +221,7 @@ class TestHiveServer(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',
@@ -307,6 +308,7 @@ class TestHiveServer(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',

+ 2 - 0
ambari-server/src/test/python/stacks/1.3.2/MAPREDUCE/test_mapreduce_client.py

@@ -80,6 +80,7 @@ class TestMapreduceClient(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',
@@ -150,6 +151,7 @@ class TestMapreduceClient(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',

+ 2 - 0
ambari-server/src/test/python/stacks/1.3.2/MAPREDUCE/test_mapreduce_historyserver.py

@@ -216,6 +216,7 @@ class TestHistoryServer(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',
@@ -336,6 +337,7 @@ class TestHistoryServer(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',

+ 2 - 0
ambari-server/src/test/python/stacks/1.3.2/MAPREDUCE/test_mapreduce_jobtracker.py

@@ -272,6 +272,7 @@ class TestJobtracker(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',
@@ -397,6 +398,7 @@ class TestJobtracker(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',

+ 2 - 0
ambari-server/src/test/python/stacks/1.3.2/MAPREDUCE/test_mapreduce_tasktracker.py

@@ -157,6 +157,7 @@ class TestTasktracker(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',
@@ -219,6 +220,7 @@ class TestTasktracker(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',

+ 2 - 0
ambari-server/src/test/python/stacks/1.3.2/OOZIE/test_oozie_client.py

@@ -34,6 +34,7 @@ class TestOozieClient(RMFTestCase):
       mode = 0664,
       conf_dir = '/etc/oozie/conf',
       configurations = self.getConfig()['configurations']['oozie-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['oozie-site']
     )
     self.assertResourceCalled('Directory', '/etc/oozie/conf',
       owner = 'oozie',
@@ -84,6 +85,7 @@ class TestOozieClient(RMFTestCase):
       mode = 0664,
       conf_dir = '/etc/oozie/conf',
       configurations = self.getConfig()['configurations']['oozie-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['oozie-site']
     )
     self.assertResourceCalled('Directory', '/etc/oozie/conf',
       owner = 'oozie',

+ 4 - 0
ambari-server/src/test/python/stacks/1.3.2/OOZIE/test_oozie_server.py

@@ -44,6 +44,7 @@ class TestOozieServer(RMFTestCase):
       mode = 0664,
       conf_dir = '/etc/oozie/conf',
       configurations = self.getConfig()['configurations']['oozie-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['oozie-site']
     )
     self.assertResourceCalled('Directory', '/etc/oozie/conf',
       owner = 'oozie',
@@ -187,6 +188,7 @@ class TestOozieServer(RMFTestCase):
       mode = 0664,
       conf_dir = '/etc/oozie/conf',
       configurations = self.getConfig()['configurations']['oozie-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['oozie-site']
     )
     self.assertResourceCalled('Directory', '/etc/oozie/conf',
       owner = 'oozie',
@@ -323,6 +325,7 @@ class TestOozieServer(RMFTestCase):
                               mode = 0664,
                               conf_dir = '/etc/oozie/conf',
                               configurations = self.getConfig()['configurations']['oozie-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['oozie-site']
                               )
     self.assertResourceCalled('Directory', '/etc/oozie/conf',
                               owner = 'oozie',
@@ -423,6 +426,7 @@ class TestOozieServer(RMFTestCase):
                               mode = 0664,
                               conf_dir = '/etc/oozie/conf',
                               configurations = self.getConfig()['configurations']['oozie-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['oozie-site']
                               )
     self.assertResourceCalled('Directory', '/etc/oozie/conf',
                               owner = 'oozie',

+ 4 - 2
ambari-server/src/test/python/stacks/1.3.2/WEBHCAT/test_webhcat_server.py

@@ -144,7 +144,8 @@ class TestWebHCatServer(RMFTestCase):
       owner = 'hcat',
       group = 'hadoop',
       conf_dir = '/etc/hcatalog/conf',
-      configurations = self.getConfig()['configurations']['webhcat-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['webhcat-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['webhcat-site']
     )
     self.assertResourceCalled('File', '/etc/hcatalog/conf/webhcat-env.sh',
       content = InlineTemplate(self.getConfig()['configurations']['webhcat-env']['content']),
@@ -222,7 +223,8 @@ class TestWebHCatServer(RMFTestCase):
       owner = 'hcat',
       group = 'hadoop',
       conf_dir = '/etc/hcatalog/conf',
-      configurations = self.getConfig()['configurations']['webhcat-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['webhcat-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['webhcat-site']
     )
     self.assertResourceCalled('File', '/etc/hcatalog/conf/webhcat-env.sh',
       content = InlineTemplate(self.getConfig()['configurations']['webhcat-env']['content']),

+ 49 - 0
ambari-server/src/test/python/stacks/1.3.2/configs/default.hbasedecom.json

@@ -399,6 +399,55 @@
             "tickTime": "2000"
         }
     }, 
+    "configuration_attributes": {
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "mapred-site": {
             "tag": "version1"

+ 49 - 0
ambari-server/src/test/python/stacks/1.3.2/configs/default.json

@@ -423,6 +423,55 @@
             "content": "log4jproperties\nline2"
         }
     }, 
+    "configuration_attributes": {
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "mapred-site": {
             "tag": "version1"

+ 50 - 1
ambari-server/src/test/python/stacks/1.3.2/configs/default.non_gmetad_host.json

@@ -422,7 +422,56 @@
         "oozie-log4j": {
             "content": "log4jproperties\nline2"
         }
-    }, 
+    },
+    "configuration_attributes": {
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "mapred-site": {
             "tag": "version1"

+ 50 - 1
ambari-server/src/test/python/stacks/1.3.2/configs/secured.json

@@ -605,7 +605,56 @@
         "oozie-log4j": {
             "content": "log4jproperties\nline2"
         }
-    }, 
+    },
+    "configuration_attributes": {
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "mapred-site": {
             "tag": "version1389980437965"

+ 50 - 1
ambari-server/src/test/python/stacks/1.3.2/configs/secured_no_jce_name.json

@@ -475,7 +475,56 @@
         "oozie-log4j": {
             "content": "log4jproperties\nline2"
         }
-    }, 
+    },
+    "configuration_attributes": {
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "mapred-site": {
             "tag": "version1389980437965"

+ 1 - 0
ambari-server/src/test/python/stacks/1.3.2/hooks/after-INSTALL/test_after_install.py

@@ -48,5 +48,6 @@ class TestHookAfterInstall(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['core-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
                               )
     self.assertNoMoreResources()

+ 12 - 6
ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py

@@ -49,19 +49,22 @@ class TestHBaseClient(RMFTestCase):
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hbase-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hbase-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hdfs',
       group = 'hadoop',
       conf_dir = '/etc/hadoop/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
       owner = 'hbase',
@@ -118,19 +121,22 @@ class TestHBaseClient(RMFTestCase):
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hbase-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hbase-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hdfs',
       group = 'hadoop',
       conf_dir = '/etc/hadoop/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
       owner = 'hbase',

+ 12 - 6
ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py

@@ -191,19 +191,22 @@ class TestHBaseMaster(RMFTestCase):
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hbase-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hbase-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
                               owner = 'hdfs',
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
-                              configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+                              configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
       owner = 'hbase',
@@ -284,19 +287,22 @@ class TestHBaseMaster(RMFTestCase):
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hbase-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hbase-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hdfs',
       group = 'hadoop',
       conf_dir = '/etc/hadoop/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
       owner = 'hbase',

+ 12 - 6
ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py

@@ -124,19 +124,22 @@ class TestHbaseRegionServer(RMFTestCase):
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hbase-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hbase-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hdfs',
       group = 'hadoop',
       conf_dir = '/etc/hadoop/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
       owner = 'hbase',
@@ -217,19 +220,22 @@ class TestHbaseRegionServer(RMFTestCase):
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hbase-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hbase-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hbase-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hbase',
       group = 'hadoop',
       conf_dir = '/etc/hbase/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('XmlConfig', 'hdfs-site.xml',
       owner = 'hdfs',
       group = 'hadoop',
       conf_dir = '/etc/hadoop/conf',
-      configurations = self.getConfig()['configurations']['hdfs-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['hdfs-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
     )
     self.assertResourceCalled('File', '/etc/hbase/conf/hbase-policy.xml',
       owner = 'hbase',

+ 2 - 0
ambari-server/src/test/python/stacks/2.0.6/HDFS/test_datanode.py

@@ -157,6 +157,7 @@ class TestDatanode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),
@@ -188,6 +189,7 @@ class TestDatanode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),

+ 2 - 0
ambari-server/src/test/python/stacks/2.0.6/HDFS/test_journalnode.py

@@ -162,6 +162,7 @@ class TestJournalnode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),
@@ -185,6 +186,7 @@ class TestJournalnode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),

+ 2 - 0
ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py

@@ -411,6 +411,7 @@ class TestNamenode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),
@@ -435,6 +436,7 @@ class TestNamenode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),

+ 2 - 0
ambari-server/src/test/python/stacks/2.0.6/HDFS/test_snamenode.py

@@ -177,6 +177,7 @@ class TestSNamenode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),
@@ -201,6 +202,7 @@ class TestSNamenode(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),

+ 2 - 0
ambari-server/src/test/python/stacks/2.0.6/HDFS/test_zkfc.py

@@ -40,6 +40,7 @@ class TestZkfc(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),
@@ -108,6 +109,7 @@ class TestZkfc(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['hdfs-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['hdfs-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/slaves',
                               content = Template('slaves.j2'),

+ 2 - 0
ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hcat_client.py

@@ -43,6 +43,7 @@ class TestHcatClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hive/conf',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('TemplateConfig', '/etc/hcatalog/conf/hcat-env.sh',
       owner = 'hcat',
@@ -73,6 +74,7 @@ class TestHcatClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hive/conf',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('TemplateConfig', '/etc/hcatalog/conf/hcat-env.sh',
       owner = 'hcat',

+ 4 - 0
ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_client.py

@@ -40,6 +40,7 @@ class TestHiveClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hive/conf',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'hive-site.xml',
       owner = 'hive',
@@ -47,6 +48,7 @@ class TestHiveClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hive/conf',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',
@@ -101,6 +103,7 @@ class TestHiveClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hive/conf',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'hive-site.xml',
       owner = 'hive',
@@ -108,6 +111,7 @@ class TestHiveClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hive/conf',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',

+ 4 - 0
ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_metastore.py

@@ -160,6 +160,7 @@ class TestHiveMetastore(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'hive-site.xml',
       owner = 'hive',
@@ -167,6 +168,7 @@ class TestHiveMetastore(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',
@@ -225,6 +227,7 @@ class TestHiveMetastore(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'hive-site.xml',
       owner = 'hive',
@@ -232,6 +235,7 @@ class TestHiveMetastore(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',

+ 4 - 0
ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py

@@ -269,6 +269,7 @@ class TestHiveServer(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'hive-site.xml',
       owner = 'hive',
@@ -276,6 +277,7 @@ class TestHiveServer(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',
@@ -363,6 +365,7 @@ class TestHiveServer(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'hive-site.xml',
       owner = 'hive',
@@ -370,6 +373,7 @@ class TestHiveServer(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',

+ 4 - 0
ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_client.py

@@ -30,6 +30,7 @@ class TestOozieClient(RMFTestCase):
     )
     # Hack for oozie.py changing conf on fly
     oozie_site = self.getConfig()['configurations']['oozie-site'].copy()
+    oozie_site_attrs = self.getConfig()['configuration_attributes']['oozie-site'].copy()
     oozie_site["oozie.services.ext"] = 'org.apache.oozie.service.JMSAccessorService,' + oozie_site["oozie.services.ext"]
     self.assertResourceCalled('XmlConfig', 'oozie-site.xml',
                               owner = 'oozie',
@@ -37,6 +38,7 @@ class TestOozieClient(RMFTestCase):
                               mode = 0664,
                               conf_dir = '/etc/oozie/conf',
                               configurations = oozie_site,
+                              configuration_attributes = oozie_site_attrs
                               )
     self.assertResourceCalled('Directory', '/etc/oozie/conf',
         owner = 'oozie',
@@ -83,6 +85,7 @@ class TestOozieClient(RMFTestCase):
     )
     # Hack for oozie.py changing conf on fly
     oozie_site = self.getConfig()['configurations']['oozie-site'].copy()
+    oozie_site_attrs = self.getConfig()['configuration_attributes']['oozie-site'].copy()
     oozie_site["oozie.services.ext"] = 'org.apache.oozie.service.JMSAccessorService,' + oozie_site["oozie.services.ext"]
     self.assertResourceCalled('XmlConfig', 'oozie-site.xml',
                               owner = 'oozie',
@@ -90,6 +93,7 @@ class TestOozieClient(RMFTestCase):
                               mode = 0664,
                               conf_dir = '/etc/oozie/conf',
                               configurations = oozie_site,
+                              configuration_attributes = oozie_site_attrs
                               )
     self.assertResourceCalled('Directory', '/etc/oozie/conf',
                               owner = 'oozie',

+ 4 - 0
ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_server.py

@@ -113,6 +113,7 @@ class TestOozieServer(RMFTestCase):
   def assert_configure_default(self):
     # Hack for oozie.py changing conf on fly
     oozie_site = self.getConfig()['configurations']['oozie-site'].copy()
+    oozie_site_attrs = self.getConfig()['configuration_attributes']['oozie-site'].copy()
     oozie_site["oozie.services.ext"] = 'org.apache.oozie.service.JMSAccessorService,' + oozie_site["oozie.services.ext"]
     self.assertResourceCalled('HdfsDirectory', '/user/oozie',
                               security_enabled = False,
@@ -130,6 +131,7 @@ class TestOozieServer(RMFTestCase):
                               mode = 0664,
                               conf_dir = '/etc/oozie/conf',
                               configurations = oozie_site,
+                              configuration_attributes = oozie_site_attrs
                               )
     self.assertResourceCalled('Directory', '/etc/oozie/conf',
                               owner = 'oozie',
@@ -217,6 +219,7 @@ class TestOozieServer(RMFTestCase):
   def assert_configure_secured(self):
     # Hack for oozie.py changing conf on fly
     oozie_site = self.getConfig()['configurations']['oozie-site'].copy()
+    oozie_site_attrs = self.getConfig()['configuration_attributes']['oozie-site'].copy()
     oozie_site["oozie.services.ext"] = 'org.apache.oozie.service.JMSAccessorService,' + oozie_site["oozie.services.ext"]
     self.assertResourceCalled('HdfsDirectory', '/user/oozie',
                               security_enabled = True,
@@ -234,6 +237,7 @@ class TestOozieServer(RMFTestCase):
                               mode = 0664,
                               conf_dir = '/etc/oozie/conf',
                               configurations = oozie_site,
+                              configuration_attributes = oozie_site_attrs
                               )
     self.assertResourceCalled('Directory', '/etc/oozie/conf',
                               owner = 'oozie',

+ 4 - 2
ambari-server/src/test/python/stacks/2.0.6/WEBHCAT/test_webhcat_server.py

@@ -147,7 +147,8 @@ class TestWebHCatServer(RMFTestCase):
       owner = 'hcat',
       group = 'hadoop',
       conf_dir = '/etc/hcatalog/conf',
-      configurations = self.getConfig()['configurations']['webhcat-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['webhcat-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['webhcat-site']
     )
     self.assertResourceCalled('File', '/etc/hcatalog/conf/webhcat-env.sh',
       content = InlineTemplate(self.getConfig()['configurations']['webhcat-env']['content']),
@@ -225,7 +226,8 @@ class TestWebHCatServer(RMFTestCase):
       owner = 'hcat',
       group = 'hadoop',
       conf_dir = '/etc/hcatalog/conf',
-      configurations = self.getConfig()['configurations']['webhcat-site'], # don't hardcode all the properties
+      configurations = self.getConfig()['configurations']['webhcat-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['webhcat-site']
     )
     self.assertResourceCalled('File', '/etc/hcatalog/conf/webhcat-env.sh',
       content = InlineTemplate(self.getConfig()['configurations']['webhcat-env']['content']),

+ 12 - 0
ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py

@@ -226,6 +226,7 @@ class TestHistoryServer(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['core-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
     )
     self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
       owner = 'yarn',
@@ -233,6 +234,7 @@ class TestHistoryServer(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
       owner = 'yarn',
@@ -240,6 +242,7 @@ class TestHistoryServer(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['yarn-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
     )
     self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
       owner = 'yarn',
@@ -247,6 +250,7 @@ class TestHistoryServer(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['capacity-scheduler'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
     )
     self.assertResourceCalled('File', '/etc/hadoop/conf/yarn.exclude',
       owner = 'yarn',
@@ -279,6 +283,7 @@ class TestHistoryServer(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-queue-acls.xml',
                               owner = 'mapred',
@@ -289,6 +294,7 @@ class TestHistoryServer(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['capacity-scheduler'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',
@@ -405,6 +411,7 @@ class TestHistoryServer(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['core-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
     )
     self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
       owner = 'yarn',
@@ -412,6 +419,7 @@ class TestHistoryServer(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
       owner = 'yarn',
@@ -419,6 +427,7 @@ class TestHistoryServer(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['yarn-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
     )
     self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
       owner = 'yarn',
@@ -426,6 +435,7 @@ class TestHistoryServer(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['capacity-scheduler'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
     )
     self.assertResourceCalled('File', '/etc/hadoop/conf/yarn.exclude',
       owner = 'yarn',
@@ -474,6 +484,7 @@ class TestHistoryServer(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-queue-acls.xml',
                               owner = 'mapred',
@@ -484,6 +495,7 @@ class TestHistoryServer(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['capacity-scheduler'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',

+ 12 - 0
ambari-server/src/test/python/stacks/2.0.6/YARN/test_mapreduce2_client.py

@@ -85,6 +85,7 @@ class TestMapReduce2Client(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['core-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
     )
     self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
       owner = 'yarn',
@@ -92,6 +93,7 @@ class TestMapReduce2Client(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
       owner = 'yarn',
@@ -99,6 +101,7 @@ class TestMapReduce2Client(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['yarn-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
     )
     self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
       owner = 'yarn',
@@ -106,6 +109,7 @@ class TestMapReduce2Client(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['capacity-scheduler'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
     )
     self.assertResourceCalled('File', '/etc/hadoop/conf/yarn.exclude',
       owner = 'yarn',
@@ -138,6 +142,7 @@ class TestMapReduce2Client(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-queue-acls.xml',
                               owner = 'mapred',
@@ -148,6 +153,7 @@ class TestMapReduce2Client(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['capacity-scheduler'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',
@@ -211,6 +217,7 @@ class TestMapReduce2Client(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['core-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
     )
     self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
       owner = 'yarn',
@@ -218,6 +225,7 @@ class TestMapReduce2Client(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
       owner = 'yarn',
@@ -225,6 +233,7 @@ class TestMapReduce2Client(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['yarn-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
     )
     self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
       owner = 'yarn',
@@ -232,6 +241,7 @@ class TestMapReduce2Client(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['capacity-scheduler'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
     )
     self.assertResourceCalled('File', '/etc/hadoop/conf/yarn.exclude',
       owner = 'yarn',
@@ -280,6 +290,7 @@ class TestMapReduce2Client(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-queue-acls.xml',
                               owner = 'mapred',
@@ -290,6 +301,7 @@ class TestMapReduce2Client(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['capacity-scheduler'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',

+ 12 - 0
ambari-server/src/test/python/stacks/2.0.6/YARN/test_nodemanager.py

@@ -226,6 +226,7 @@ class TestNodeManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['core-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
     )
     self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
       owner = 'yarn',
@@ -233,6 +234,7 @@ class TestNodeManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
       owner = 'yarn',
@@ -240,6 +242,7 @@ class TestNodeManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['yarn-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
     )
     self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
       owner = 'yarn',
@@ -247,6 +250,7 @@ class TestNodeManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['capacity-scheduler'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
     )
     self.assertResourceCalled('File', '/etc/hadoop/conf/yarn.exclude',
       owner = 'yarn',
@@ -279,6 +283,7 @@ class TestNodeManager(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-queue-acls.xml',
                               owner = 'mapred',
@@ -289,6 +294,7 @@ class TestNodeManager(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['capacity-scheduler'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',
@@ -405,6 +411,7 @@ class TestNodeManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['core-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
     )
     self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
       owner = 'yarn',
@@ -412,6 +419,7 @@ class TestNodeManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
       owner = 'yarn',
@@ -419,6 +427,7 @@ class TestNodeManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['yarn-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
     )
     self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
       owner = 'yarn',
@@ -426,6 +435,7 @@ class TestNodeManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['capacity-scheduler'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
     )
     self.assertResourceCalled('File', '/etc/hadoop/conf/yarn.exclude',
       owner = 'yarn',
@@ -474,6 +484,7 @@ class TestNodeManager(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-queue-acls.xml',
                               owner = 'mapred',
@@ -484,6 +495,7 @@ class TestNodeManager(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['capacity-scheduler'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',

+ 12 - 0
ambari-server/src/test/python/stacks/2.0.6/YARN/test_resourcemanager.py

@@ -166,6 +166,7 @@ class TestResourceManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['core-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
     )
     self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
       owner = 'yarn',
@@ -173,6 +174,7 @@ class TestResourceManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
       owner = 'yarn',
@@ -180,6 +182,7 @@ class TestResourceManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['yarn-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
     )
     self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
       owner = 'yarn',
@@ -187,6 +190,7 @@ class TestResourceManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['capacity-scheduler'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
     )
     self.assertResourceCalled('File', '/var/log/hadoop-yarn/yarn/hadoop-mapreduce.jobsummary.log',
       owner = 'yarn',
@@ -223,6 +227,7 @@ class TestResourceManager(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-queue-acls.xml',
                               owner = 'mapred',
@@ -233,6 +238,7 @@ class TestResourceManager(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['capacity-scheduler'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',
@@ -290,6 +296,7 @@ class TestResourceManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['core-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
     )
     self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
       owner = 'yarn',
@@ -297,6 +304,7 @@ class TestResourceManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
       owner = 'yarn',
@@ -304,6 +312,7 @@ class TestResourceManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['yarn-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
     )
     self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
       owner = 'yarn',
@@ -311,6 +320,7 @@ class TestResourceManager(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['capacity-scheduler'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
     )
     self.assertResourceCalled('File', '/var/log/hadoop-yarn/yarn/hadoop-mapreduce.jobsummary.log',
       owner = 'yarn',
@@ -363,6 +373,7 @@ class TestResourceManager(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-queue-acls.xml',
                               owner = 'mapred',
@@ -373,6 +384,7 @@ class TestResourceManager(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['capacity-scheduler'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',

+ 18 - 0
ambari-server/src/test/python/stacks/2.0.6/YARN/test_yarn_client.py

@@ -86,6 +86,7 @@ class TestYarnClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['core-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
     )
     self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
       owner = 'yarn',
@@ -93,6 +94,7 @@ class TestYarnClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
       owner = 'yarn',
@@ -100,6 +102,7 @@ class TestYarnClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['yarn-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
     )
     self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
       owner = 'yarn',
@@ -107,6 +110,7 @@ class TestYarnClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['capacity-scheduler'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
     )
     self.assertResourceCalled('File', '/etc/hadoop/conf/yarn.exclude',
       owner = 'yarn',
@@ -139,6 +143,7 @@ class TestYarnClient(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-queue-acls.xml',
                               owner = 'mapred',
@@ -149,6 +154,7 @@ class TestYarnClient(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['capacity-scheduler'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',
@@ -212,6 +218,7 @@ class TestYarnClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['core-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
     )
     self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
       owner = 'yarn',
@@ -219,6 +226,7 @@ class TestYarnClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
       owner = 'yarn',
@@ -226,6 +234,7 @@ class TestYarnClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['yarn-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
     )
     self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
       owner = 'yarn',
@@ -233,6 +242,7 @@ class TestYarnClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['capacity-scheduler'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
     )
     self.assertResourceCalled('File', '/etc/hadoop/conf/yarn.exclude',
       owner = 'yarn',
@@ -281,6 +291,7 @@ class TestYarnClient(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-queue-acls.xml',
                               owner = 'mapred',
@@ -291,6 +302,7 @@ class TestYarnClient(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['capacity-scheduler'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',
@@ -365,6 +377,7 @@ class TestYarnClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['core-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
     )
     self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
       owner = 'yarn',
@@ -372,6 +385,7 @@ class TestYarnClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
       owner = 'yarn',
@@ -379,6 +393,7 @@ class TestYarnClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['yarn-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
     )
     self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
       owner = 'yarn',
@@ -386,6 +401,7 @@ class TestYarnClient(RMFTestCase):
       mode = 0644,
       conf_dir = '/etc/hadoop/conf',
       configurations = self.getConfig()['configurations']['capacity-scheduler'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
     )
     self.assertResourceCalled('File', '/etc/hadoop/conf/yarn.exclude',
       owner = 'yarn',
@@ -418,6 +434,7 @@ class TestYarnClient(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-queue-acls.xml',
                               owner = 'mapred',
@@ -428,6 +445,7 @@ class TestYarnClient(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['capacity-scheduler'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',

+ 50 - 1
ambari-server/src/test/python/stacks/2.0.6/configs/default.hbasedecom.json

@@ -534,7 +534,56 @@
         "sqoop-env": {
             "content": "\n# Set Hadoop-specific environment variables here.\n\n#Set path to where bin/hadoop is available\n#Set path to where bin/hadoop is available\nexport HADOOP_HOME=${HADOOP_HOME:-/usr/lib/hadoop}\n\n#set the path to where bin/hbase is available\nexport HBASE_HOME=${HBASE_HOME:-/usr/lib/hbase}\n\n#Set the path to where bin/hive is available\nexport HIVE_HOME=${HIVE_HOME:-/usr/lib/hive}\n\n#Set the path for where zookeper config dir is\nexport ZOOCFGDIR=${ZOOCFGDIR:-/etc/zookeeper/conf}\n\n# add libthrift in hive to sqoop class path first so hive imports work\nexport SQOOP_USER_CLASSPATH=\"`ls ${HIVE_HOME}/lib/libthrift-*.jar 2> /dev/null`:${SQOOP_USER_CLASSPATH}\""
         }
-    }, 
+    },
+    "configuration_attributes": {
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "capacity-scheduler": {
             "tag": "version1"

+ 66 - 0
ambari-server/src/test/python/stacks/2.0.6/configs/default.json

@@ -572,6 +572,72 @@
           "content": "log4jproperties\nline2"
         }
     },
+    "configuration_attributes": {
+      "yarn-site": {
+        "final": {
+          "yarn.nodemanager.disk-health-checker.min-healthy-disks": "true",
+          "yarn.nodemanager.container-executor.class": "true",
+          "yarn.nodemanager.local-dirs": "true"
+        }
+      },
+      "tez-site": {
+        "final": {
+          "tez.am.log.level": "true"
+        }
+      },
+      "capacity-scheduler": {
+        "final": {
+          "yarn.scheduler.capacity.node-locality-delay": "true"
+        }
+      },
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "capacity-scheduler": {
             "tag": "version1"

+ 49 - 0
ambari-server/src/test/python/stacks/2.0.6/configs/default.non_gmetad_host.json

@@ -553,6 +553,55 @@
             "content": "log4jproperties\nline2"
         }
     },
+    "configuration_attributes": {
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "capacity-scheduler": {
             "tag": "version1"

+ 49 - 0
ambari-server/src/test/python/stacks/2.0.6/configs/flume_target.json

@@ -520,6 +520,55 @@
           "content": "log4jproperties\nline2"
         }
     },
+    "configuration_attributes": {
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "capacity-scheduler": {
             "tag": "version1"

+ 50 - 1
ambari-server/src/test/python/stacks/2.0.6/configs/ha_default.json

@@ -484,7 +484,56 @@
         "sqoop-env": {
             "content": "\n# Set Hadoop-specific environment variables here.\n\n#Set path to where bin/hadoop is available\n#Set path to where bin/hadoop is available\nexport HADOOP_HOME=${HADOOP_HOME:-/usr/lib/hadoop}\n\n#set the path to where bin/hbase is available\nexport HBASE_HOME=${HBASE_HOME:-/usr/lib/hbase}\n\n#Set the path to where bin/hive is available\nexport HIVE_HOME=${HIVE_HOME:-/usr/lib/hive}\n\n#Set the path for where zookeper config dir is\nexport ZOOCFGDIR=${ZOOCFGDIR:-/etc/zookeeper/conf}\n\n# add libthrift in hive to sqoop class path first so hive imports work\nexport SQOOP_USER_CLASSPATH=\"`ls ${HIVE_HOME}/lib/libthrift-*.jar 2> /dev/null`:${SQOOP_USER_CLASSPATH}\""
         }
-    }, 
+    },
+    "configuration_attributes": {
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "capacity-scheduler": {
             "tag": "version1"

+ 50 - 2
ambari-server/src/test/python/stacks/2.0.6/configs/ha_secured.json

@@ -509,8 +509,56 @@
         "sqoop-env": {
             "content": "\n# Set Hadoop-specific environment variables here.\n\n#Set path to where bin/hadoop is available\n#Set path to where bin/hadoop is available\nexport HADOOP_HOME=${HADOOP_HOME:-/usr/lib/hadoop}\n\n#set the path to where bin/hbase is available\nexport HBASE_HOME=${HBASE_HOME:-/usr/lib/hbase}\n\n#Set the path to where bin/hive is available\nexport HIVE_HOME=${HIVE_HOME:-/usr/lib/hive}\n\n#Set the path for where zookeper config dir is\nexport ZOOCFGDIR=${ZOOCFGDIR:-/etc/zookeeper/conf}\n\n# add libthrift in hive to sqoop class path first so hive imports work\nexport SQOOP_USER_CLASSPATH=\"`ls ${HIVE_HOME}/lib/libthrift-*.jar 2> /dev/null`:${SQOOP_USER_CLASSPATH}\""
         }
-        
-    }, 
+    },
+    "configuration_attributes": {
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "capacity-scheduler": {
             "tag": "version1"

+ 67 - 1
ambari-server/src/test/python/stacks/2.0.6/configs/secured.json

@@ -598,7 +598,73 @@
         "oozie-log4j": {
             "content": "log4jproperties\nline2"
         }
-    }, 
+    },
+    "configuration_attributes": {
+      "yarn-site": {
+        "final": {
+          "yarn.nodemanager.disk-health-checker.min-healthy-disks": "true",
+          "yarn.nodemanager.container-executor.class": "true",
+          "yarn.nodemanager.local-dirs": "true"
+        }
+      },
+      "tez-site": {
+        "final": {
+          "tez.am.log.level": "true"
+        }
+      },
+      "capacity-scheduler": {
+        "final": {
+          "yarn.scheduler.capacity.node-locality-delay": "true"
+        }
+      },
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "capacity-scheduler": {
             "tag": "version1"

+ 50 - 1
ambari-server/src/test/python/stacks/2.0.6/configs/secured_no_jce_name.json

@@ -636,7 +636,56 @@
         "oozie-log4j": {
             "content": "log4jproperties\nline2"
         }
-    }, 
+    },
+    "configuration_attributes": {
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "capacity-scheduler": {
             "tag": "version1"

+ 1 - 0
ambari-server/src/test/python/stacks/2.0.6/hooks/after-INSTALL/test_after_install.py

@@ -48,5 +48,6 @@ class TestHookAfterInstall(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['core-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
                               )
     self.assertNoMoreResources()

+ 4 - 0
ambari-server/src/test/python/stacks/2.1/HIVE/test_hive_metastore.py

@@ -120,6 +120,7 @@ class TestHiveMetastore(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'hive-site.xml',
       owner = 'hive',
@@ -127,6 +128,7 @@ class TestHiveMetastore(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',
@@ -188,6 +190,7 @@ class TestHiveMetastore(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['mapred-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
     )
     self.assertResourceCalled('XmlConfig', 'hive-site.xml',
       owner = 'hive',
@@ -195,6 +198,7 @@ class TestHiveMetastore(RMFTestCase):
       mode = 0600,
       conf_dir = '/etc/hive/conf.server',
       configurations = self.getConfig()['configurations']['hive-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['hive-site']
     )
     self.assertResourceCalled('Execute', "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf -x \"\" --retry 5 http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar -o DBConnectionVerification.jar'",
       not_if = '[ -f DBConnectionVerification.jar]',

+ 1 - 0
ambari-server/src/test/python/stacks/2.1/TEZ/test_tez_client.py

@@ -40,6 +40,7 @@ class TestTezClient(RMFTestCase):
       group = 'hadoop',
       conf_dir = '/etc/tez/conf',
       configurations = self.getConfig()['configurations']['tez-site'],
+      configuration_attributes = self.getConfig()['configuration_attributes']['tez-site'],
       mode = 0664
     )
 

+ 6 - 0
ambari-server/src/test/python/stacks/2.1/YARN/test_apptimelineserver.py

@@ -120,6 +120,7 @@ class TestAppTimelineServer(RMFTestCase):
                               mode = 0644,
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['core-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['core-site']
                               )
     self.assertResourceCalled('XmlConfig', 'mapred-site.xml',
                               owner = 'yarn',
@@ -127,6 +128,7 @@ class TestAppTimelineServer(RMFTestCase):
                               mode = 0644,
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('XmlConfig', 'yarn-site.xml',
                               owner = 'yarn',
@@ -134,6 +136,7 @@ class TestAppTimelineServer(RMFTestCase):
                               mode = 0644,
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['yarn-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['yarn-site']
                               )
     self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml',
                               owner = 'yarn',
@@ -141,6 +144,7 @@ class TestAppTimelineServer(RMFTestCase):
                               mode = 0644,
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['capacity-scheduler'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
                               )
     self.assertResourceCalled('Directory', '/var/log/hadoop-yarn/timeline',
                               owner = 'yarn',
@@ -178,6 +182,7 @@ class TestAppTimelineServer(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['mapred-site'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['mapred-site']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-queue-acls.xml',
                               owner = 'mapred',
@@ -188,6 +193,7 @@ class TestAppTimelineServer(RMFTestCase):
                               group = 'hadoop',
                               conf_dir = '/etc/hadoop/conf',
                               configurations = self.getConfig()['configurations']['capacity-scheduler'],
+                              configuration_attributes = self.getConfig()['configuration_attributes']['capacity-scheduler']
                               )
     self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml',
                               owner = 'mapred',

+ 66 - 0
ambari-server/src/test/python/stacks/2.1/configs/default.json

@@ -676,6 +676,72 @@
             "property1": "value1"
         }
     },
+    "configuration_attributes": {
+      "yarn-site": {
+        "final": {
+          "yarn.nodemanager.disk-health-checker.min-healthy-disks": "true",
+          "yarn.nodemanager.container-executor.class": "true",
+          "yarn.nodemanager.local-dirs": "true"
+        }
+      },
+      "tez-site": {
+        "final": {
+          "tez.am.log.level": "true"
+        }
+      },
+      "capacity-scheduler": {
+        "final": {
+          "yarn.scheduler.capacity.node-locality-delay": "true"
+        }
+      },
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "capacity-scheduler": {
             "tag": "version1"

+ 72 - 3
ambari-server/src/test/python/stacks/2.1/configs/secured.json

@@ -32,7 +32,10 @@
         "excluded_hosts": "host1"
     }, 
     "taskId": 186, 
-    "public_hostname": "c6401.ambari.apache.org", 
+    "public_hostname": "c6401.ambari.apache.org",
+    "configuration_attributes": {
+
+    },
     "configurations": {
       "falcon-startup.properties": {
             "*.oozie.feed.workflow.builder": "org.apache.falcon.workflow.OozieFeedWorkflowBuilder",
@@ -655,7 +658,73 @@
         "zookeeper-log4j": {
             "property1": "value1"
         }
-    }, 
+    },
+    "configuration_attributes": {
+      "yarn-site": {
+        "final": {
+          "yarn.nodemanager.disk-health-checker.min-healthy-disks": "true",
+          "yarn.nodemanager.container-executor.class": "true",
+          "yarn.nodemanager.local-dirs": "true"
+        }
+      },
+      "tez-site": {
+        "final": {
+          "tez.am.log.level": "true"
+        }
+      },
+      "capacity-scheduler": {
+        "final": {
+          "yarn.scheduler.capacity.node-locality-delay": "true"
+        }
+      },
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
     "configurationTags": {
         "capacity-scheduler": {
             "tag": "version1"
@@ -795,4 +864,4 @@
             "c6402.ambari.apache.org"
         ]
     }
-}
+}

+ 1 - 0
ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive.py

@@ -42,6 +42,7 @@ def hive(name=None):
   XmlConfig("hive-site.xml",
             conf_dir=hive_config_dir,
             configurations=params.config['configurations']['hive-site'],
+            configuration_attributes=params.config['configuration_attributes']['hive-site'],
             owner=params.hive_user,
             group=params.user_group,
             mode=config_file_mode

+ 1 - 0
ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py

@@ -42,6 +42,7 @@ def hive(name=None):
   XmlConfig("hive-site.xml",
             conf_dir=hive_config_dir,
             configurations=params.config['configurations']['hive-site'],
+            configuration_attributes=params.config['configuration_attributes']['hive-site'],
             owner=params.hive_user,
             group=params.user_group,
             mode=config_file_mode