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

git commit: AMBARI-6695. Configs API + Blueprints: Handle deprecation of global config_type (aonishuk)

Repository: ambari
Updated Branches:
  refs/heads/trunk fc724cb01 -> 896367f38


AMBARI-6695. Configs API + Blueprints: Handle deprecation of global config_type (aonishuk)


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

Branch: refs/heads/trunk
Commit: 896367f381909c42656ce1851f461d64faa8fe6a
Parents: fc724cb
Author: Andrew Onishuk <ao...@hortonworks.com>
Authored: Fri Aug 1 02:13:41 2014 +0300
Committer: Andrew Onishuk <ao...@hortonworks.com>
Committed: Fri Aug 1 02:13:41 2014 +0300

----------------------------------------------------------------------
 .../AmbariManagementControllerImpl.java         |  51 +++-
 .../ambari/server/controller/AmbariServer.java  |   3 +-
 .../internal/BaseBlueprintProcessor.java        |   4 +
 .../internal/ClusterResourceProvider.java       |  42 +++-
 .../ambari/server/state/ConfigHelper.java       |  76 +++++-
 .../server/upgrade/UpgradeCatalog170.java       |   4 +-
 .../internal/ClusterResourceProviderTest.java   | 237 +++++++++++++++----
 7 files changed, 348 insertions(+), 69 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/896367f3/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 8a8b792..21a99c8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -629,20 +629,57 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
           request.getVersionTag(),
           request.getType()));
     }
+    
+    handleGlobalsBackwardsCompability(request, propertiesAttributes);
 
-    Config config = configFactory.createNew (cluster, request.getType(),
-        request.getProperties(), propertiesAttributes);
+    Config config = createConfig(cluster, request.getType(), request.getProperties(),
+        request.getVersionTag(), propertiesAttributes);
 
-    if (!StringUtils.isEmpty(request.getVersionTag())) {
-      config.setTag(request.getVersionTag());
+    return new ConfigurationResponse(cluster.getClusterName(), config.getType(), config.getTag(), config.getVersion(),
+        config.getProperties(), config.getPropertiesAttributes());
+  }
+  
+  private void handleGlobalsBackwardsCompability(ConfigurationRequest request,
+      Map<String, Map<String, String>> propertiesAttributes) throws AmbariException {
+    Cluster cluster = clusters.getCluster(request.getClusterName());
+    if(request.getType().equals(Configuration.GLOBAL_CONFIG_TAG)) {
+      Map<String, Map<String, String>> configTypes = new HashMap<String, Map<String, String>>();
+      configTypes.put(Configuration.GLOBAL_CONFIG_TAG, request.getProperties());
+      configHelper.moveDeprecatedGlobals(cluster.getCurrentStackVersion(), configTypes);
+      
+      for(Map.Entry<String, Map<String, String>> configType : configTypes.entrySet()) {
+        String configTypeName = configType.getKey();
+        Map<String, String> properties = configType.getValue();
+        
+        if(configTypeName.equals(Configuration.GLOBAL_CONFIG_TAG))
+          continue;
+        
+        String tag;
+        if(cluster.getConfigsByType(configTypeName) == null) {
+          tag = "version1";
+        } else {
+          tag = "version" + System.currentTimeMillis();
+        }
+        
+        createConfig(cluster, configTypeName, properties, tag, propertiesAttributes);
+      }
+    }
+  }
+  
+  private Config createConfig(Cluster cluster, String type, Map<String, String> properties, 
+      String versionTag, Map<String, Map<String, String>> propertiesAttributes) {
+    Config config = configFactory.createNew (cluster, type,
+        properties, propertiesAttributes);
+
+    if (!StringUtils.isEmpty(versionTag)) {
+      config.setTag(versionTag);
     }
 
     config.persist();
 
     cluster.addConfig(config);
-
-    return new ConfigurationResponse(cluster.getClusterName(), config.getType(), config.getTag(), config.getVersion(),
-        config.getProperties(), config.getPropertiesAttributes());
+    
+    return config;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/896367f3/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
index f071e64..83ab1fc 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
@@ -87,6 +87,7 @@ import org.apache.ambari.server.security.authorization.internal.InternalTokenAut
 import org.apache.ambari.server.security.unsecured.rest.CertificateDownload;
 import org.apache.ambari.server.security.unsecured.rest.CertificateSign;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.utils.StageUtils;
 import org.apache.ambari.server.utils.VersionUtils;
 import org.apache.ambari.server.view.ViewRegistry;
@@ -542,7 +543,7 @@ public class AmbariServer {
     BlueprintResourceProvider.init(injector.getInstance(BlueprintDAO.class),
         injector.getInstance(Gson.class), ambariMetaInfo);
     StackDependencyResourceProvider.init(ambariMetaInfo);
-    ClusterResourceProvider.init(injector.getInstance(BlueprintDAO.class), ambariMetaInfo);
+    ClusterResourceProvider.init(injector.getInstance(BlueprintDAO.class), ambariMetaInfo, injector.getInstance(ConfigHelper.class));
     AlertDefinitionResourceProvider.init(injector.getInstance(AlertDefinitionDAO.class));
     PermissionResourceProvider.init(injector.getInstance(PermissionDAO.class));
     ViewPermissionResourceProvider.init(injector.getInstance(PermissionDAO.class));

http://git-wip-us.apache.org/repos/asf/ambari/blob/896367f3/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseBlueprintProcessor.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseBlueprintProcessor.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseBlueprintProcessor.java
index b3a8019..d723512 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseBlueprintProcessor.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BaseBlueprintProcessor.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.controller.internal;
 
 import com.google.gson.Gson;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.StackAccessException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
@@ -38,6 +39,7 @@ import org.apache.ambari.server.orm.entities.HostGroupComponentEntity;
 import org.apache.ambari.server.orm.entities.HostGroupConfigEntity;
 import org.apache.ambari.server.orm.entities.HostGroupEntity;
 import org.apache.ambari.server.state.AutoDeployInfo;
+import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.state.DependencyInfo;
 
 import java.util.Collection;
@@ -63,6 +65,8 @@ public abstract class BaseBlueprintProcessor extends AbstractControllerResourceP
    * Stack related information.
    */
   protected static AmbariMetaInfo stackInfo;
+  
+  protected static ConfigHelper configHelper;
 
 
   protected BaseBlueprintProcessor(Set<String> propertyIds,

http://git-wip-us.apache.org/repos/asf/ambari/blob/896367f3/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
index b72beb6..f99955b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
@@ -45,8 +45,11 @@ import org.apache.ambari.server.orm.dao.BlueprintDAO;
 import org.apache.ambari.server.orm.entities.BlueprintEntity;
 import org.apache.ambari.server.orm.entities.HostGroupEntity;
 import org.apache.ambari.server.state.Config;
+import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.state.ConfigImpl;
 import org.apache.ambari.server.state.PropertyInfo;
+import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.configuration.Configuration;
 
 /**
  * Resource provider for cluster resources.
@@ -109,9 +112,10 @@ public class ClusterResourceProvider extends BaseBlueprintProcessor {
    *
    * @param dao  blueprint data access object
    */
-  public static void init(BlueprintDAO dao, AmbariMetaInfo metaInfo) {
+  public static void init(BlueprintDAO dao, AmbariMetaInfo metaInfo, ConfigHelper ch) {
     blueprintDAO = dao;
     stackInfo    = metaInfo;
+    configHelper = ch;
   }
 
 
@@ -825,6 +829,18 @@ public class ClusterResourceProvider extends BaseBlueprintProcessor {
     }
     setMissingConfigurations();
   }
+  
+  /**
+   * Since global configs are deprecated since 1.7.0, but still supported.
+   * We should automatically map any globals used, to *-env dictionaries.
+   *
+   * @param blueprintConfigurations  map of blueprint configurations keyed by type
+   */
+  private void handleGlobalsBackwardsCompability(Stack stack, 
+      Map<String, Map<String, String>> blueprintConfigurations) {
+    StackId stackId = new StackId(stack.getName(), stack.getVersion());
+    configHelper.moveDeprecatedGlobals(stackId, blueprintConfigurations);
+  }
 
   /**
    * Process cluster scoped configurations provided in blueprint.
@@ -876,19 +892,21 @@ public class ClusterResourceProvider extends BaseBlueprintProcessor {
    * Explicitly set any properties that are required but not currently provided in the stack definition.
    */
   private void setMissingConfigurations() {
-    // AMBARI-4921
-    ensureProperty("global", "user_group", "hadoop");
-    ensureProperty("global", "nagios_contact", "default@REPLACEME.NOWHERE");
-    ensureProperty("global", "smokeuser", "ambari-qa");
-
     // AMBARI-5206
-    Map<String, String> globalConfig = mapClusterConfigurations.get("global");
-    String[] userProps = {"oozie_user", "hive_user", "hcat_user", "hbase_user", "falcon_user"};
+    final Map<String , String> userProps = new HashMap<String , String>();
+    userProps.put("oozie_user", "oozie-env");
+    userProps.put("hive_user", "hive-env");
+    userProps.put("hcat_user", "hive-env");
+    userProps.put("hbase_user", "hbase-env");
+    userProps.put("falcon_user", "falcon-env");
+    
     String proxyUserHosts  = "hadoop.proxyuser.%s.hosts";
     String proxyUserGroups = "hadoop.proxyuser.%s.groups";
 
-    for (String userProp : userProps) {
-      String user = globalConfig.get(userProp);
+    for (String property : userProps.keySet()) {
+      String configType = userProps.get(property);
+      Map<String, String> configs = mapClusterConfigurations.get(configType);
+      String user = configs.get(property);
       if (user != null && !user.isEmpty()) {
         ensureProperty("core-site", String.format(proxyUserHosts, user), "*");
         ensureProperty("core-site", String.format(proxyUserGroups, user), "users");
@@ -1023,10 +1041,12 @@ public class ClusterResourceProvider extends BaseBlueprintProcessor {
   private void registerConfigGroups(String clusterName, Map<String, HostGroup> hostGroups, Stack stack) throws
       ResourceAlreadyExistsException, SystemException,
       UnsupportedPropertyException, NoSuchParentResourceException {
-
+    
     for (HostGroup group : hostGroups.values()) {
       HostGroupEntity entity = group.getEntity();
       Map<String, Map<String, Config>> groupConfigs = new HashMap<String, Map<String, Config>>();
+      
+      handleGlobalsBackwardsCompability(stack, group.getConfigurations());
       for (Map.Entry<String, Map<String, String>> entry: group.getConfigurations().entrySet()) {
         String type = entry.getKey();
         String service = stack.getServiceForConfigType(type);

http://git-wip-us.apache.org/repos/asf/ambari/blob/896367f3/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
index 81c3c38..b8bf23b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
@@ -45,8 +45,10 @@ import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.ConfigurationRequest;
 import org.apache.ambari.server.orm.dao.ClusterDAO;
 import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
+import org.apache.ambari.server.upgrade.UpgradeCatalog170;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+
 /**
  * Helper class that works with config traversals.
  */
@@ -382,22 +384,16 @@ public class ConfigHelper {
   
   /**
    * Gets all the config dictionary where property with the given name is present in stack definitions
-   * @param cluster
+   * @param stackId
    * @param propertyName
    */
-  public Set<String> findConfigTypesByPropertyName(Cluster cluster, String propertyName) throws AmbariException {
-    StackId stackId = cluster.getCurrentStackVersion();
+  public Set<String> findConfigTypesByPropertyName(StackId stackId, String propertyName) throws AmbariException {
     StackInfo stack = ambariMetaInfo.getStackInfo(stackId.getStackName(),
         stackId.getStackVersion());
     
     Set<String> result = new HashSet<String>();
     
     for(ServiceInfo serviceInfo:stack.getServices()) {
-      // skip not installed services
-      if(!cluster.getServices().containsKey(serviceInfo.getName())) {
-        continue;
-      }
-      
       Set<PropertyInfo> stackProperties = ambariMetaInfo.getProperties(stack.getName(), stack.getVersion(), serviceInfo.getName());
       
       for (PropertyInfo stackProperty : stackProperties) {
@@ -458,6 +454,70 @@ public class ConfigHelper {
       cluster.addDesiredConfig(authName, baseConfig);
     }
   }
+  
+  /**
+   * Since global configs are deprecated since 1.7.0, but still supported.
+   * We should automatically map any globals used, to *-env dictionaries.
+   *
+   * @param configurations  map of configurations keyed by type
+   */
+  public void moveDeprecatedGlobals(StackId stackId, Map<String, Map<String, String>> configurations) {
+    Map<String, String> globalConfigurations = new HashMap<String, String>();
+    
+    if(configurations.get(Configuration.GLOBAL_CONFIG_TAG) == null ||
+        configurations.get(Configuration.GLOBAL_CONFIG_TAG).size() == 0)
+      return;
+  
+    globalConfigurations.putAll(configurations.get(Configuration.GLOBAL_CONFIG_TAG));
+    
+    if(globalConfigurations!=null && globalConfigurations.size() != 0) {
+      LOG.warn("Global configurations are deprecated, "
+          + "please use *-env");
+    }
+    
+    for(Map.Entry<String, String> property:globalConfigurations.entrySet()) {
+      String propertyName = property.getKey();
+      String propertyValue = property.getValue();
+      
+      Set<String> newConfigTypes = null;
+      try{
+        newConfigTypes = this.findConfigTypesByPropertyName(stackId, propertyName);
+      } catch(AmbariException e) {
+        LOG.error("Exception while getting configurations from the stacks", e);
+        return;
+      }
+      
+      newConfigTypes.remove(Configuration.GLOBAL_CONFIG_TAG);
+      
+      String newConfigType = null;
+      if(newConfigTypes.size() > 0) {
+        newConfigType = newConfigTypes.iterator().next();
+      } else {
+        newConfigType = UpgradeCatalog170.getAdditionalMappingGlobalToEnv().get(propertyName);
+      }
+      
+      if(newConfigType==null) {
+        LOG.warn("Cannot find where to map " + propertyName + " from " + Configuration.GLOBAL_CONFIG_TAG +
+            " (value="+propertyValue+")");
+        continue;
+      }
+      
+      LOG.info("Mapping config " + propertyName + " from " + Configuration.GLOBAL_CONFIG_TAG + 
+          " to " + newConfigType +
+          " (value="+propertyValue+")");
+      
+      configurations.get(Configuration.GLOBAL_CONFIG_TAG).remove(propertyName);
+      
+      if(!configurations.containsKey(newConfigType)) {
+        configurations.put(newConfigType, new HashMap<String, String>());
+      }
+      configurations.get(newConfigType).put(propertyName, propertyValue);
+    }
+    
+    if(configurations.get(Configuration.GLOBAL_CONFIG_TAG).size() == 0) {
+      configurations.remove(Configuration.GLOBAL_CONFIG_TAG);
+    }
+  }
 
   private boolean calculateIsStaleConfigs(ServiceComponentHost sch) throws AmbariException {
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/896367f3/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
index 392c316..cc4e1be 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
@@ -243,7 +243,7 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
 
     if (clusterMap != null && !clusterMap.isEmpty()) {
       for (final Cluster cluster : clusterMap.values()) {
-        Set<String> configTypes = configHelper.findConfigTypesByPropertyName(cluster, CONTENT_FIELD_NAME);  
+        Set<String> configTypes = configHelper.findConfigTypesByPropertyName(cluster.getCurrentStackVersion(), CONTENT_FIELD_NAME);  
         
         for(String configType:configTypes) {
           if(!configType.endsWith(ENV_CONFIGS_POSTFIX)) {
@@ -284,7 +284,7 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
           String propertyName = property.getKey();
           String propertyValue = property.getValue();
           
-          Set<String> newConfigTypes = configHelper.findConfigTypesByPropertyName(cluster, propertyName);
+          Set<String> newConfigTypes = configHelper.findConfigTypesByPropertyName(cluster.getCurrentStackVersion(), propertyName);
           // if it's custom user service global.xml can be still there.
           newConfigTypes.remove(Configuration.GLOBAL_CONFIG_TAG);
           

http://git-wip-us.apache.org/repos/asf/ambari/blob/896367f3/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java
index d8f7fbc..d1aa4d5 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java
@@ -76,6 +76,7 @@ import org.apache.ambari.server.orm.entities.BlueprintEntity;
 import org.apache.ambari.server.orm.entities.HostGroupComponentEntity;
 import org.apache.ambari.server.orm.entities.HostGroupConfigEntity;
 import org.apache.ambari.server.orm.entities.HostGroupEntity;
+import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.state.DependencyInfo;
 import org.apache.ambari.server.state.PropertyInfo;
 import org.apache.ambari.server.state.State;
@@ -164,6 +165,7 @@ public class ClusterResourceProviderTest {
     String stackVersion = "1.23";
     String clusterName = "c1";
 
+    ConfigHelper configHelper = createMock(ConfigHelper.class);
     BlueprintDAO blueprintDAO = createStrictMock(BlueprintDAO.class);
     AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.class);
     AmbariManagementController managementController = createStrictMock(AmbariManagementController.class);
@@ -196,6 +198,9 @@ public class ClusterResourceProviderTest {
 
     BlueprintConfigEntity blueprintConfig = createNiceMock(BlueprintConfigEntity.class);
     BlueprintConfigEntity blueprintConfig2 = createNiceMock(BlueprintConfigEntity.class);
+    BlueprintConfigEntity blueprintConfig3 = createNiceMock(BlueprintConfigEntity.class);
+    BlueprintConfigEntity blueprintConfig4 = createNiceMock(BlueprintConfigEntity.class);
+    BlueprintConfigEntity blueprintConfig5 = createNiceMock(BlueprintConfigEntity.class);
 
     HostGroupEntity hostGroup = createNiceMock(HostGroupEntity.class);
     HostGroupComponentEntity hostGroupComponent1 = createNiceMock(HostGroupComponentEntity.class);
@@ -223,6 +228,10 @@ public class ClusterResourceProviderTest {
     Capture<Map<String, String>> updateClusterPropertyMapCapture4 = new Capture<Map<String, String>>();
     Capture<Set<ClusterRequest>> updateClusterRequestCapture5 = new Capture<Set<ClusterRequest>>();
     Capture<Map<String, String>> updateClusterPropertyMapCapture5 = new Capture<Map<String, String>>();
+    Capture<Set<ClusterRequest>> updateClusterRequestCapture6 = new Capture<Set<ClusterRequest>>();
+    Capture<Map<String, String>> updateClusterPropertyMapCapture6 = new Capture<Map<String, String>>();
+    Capture<Set<ClusterRequest>> updateClusterRequestCapture7 = new Capture<Set<ClusterRequest>>();
+    Capture<Map<String, String>> updateClusterPropertyMapCapture7 = new Capture<Map<String, String>>();
 
     Capture<Request> serviceRequestCapture = new Capture<Request>();
     Capture<Request> componentRequestCapture = new Capture<Request>();
@@ -292,9 +301,19 @@ public class ClusterResourceProviderTest {
     Map<String, String> blueprintGlobalConfigProperties = new HashMap<String, String>();
     blueprintGlobalConfigProperties.put("hive_database", "New MySQL Database");
 
+    Map<String, String> oozieEnvConfigProperties = new HashMap<String, String>();
+    oozieEnvConfigProperties.put("property1","value2");
+    Map<String, String> hbaseEnvConfigProperties = new HashMap<String, String>();
+    hbaseEnvConfigProperties.put("property1","value2");
+    Map<String, String> falconEnvConfigProperties = new HashMap<String, String>();
+    falconEnvConfigProperties.put("property1","value2");
+
     Collection<BlueprintConfigEntity> configurations = new HashSet<BlueprintConfigEntity>();
     configurations.add(blueprintConfig);
     configurations.add(blueprintConfig2);
+    configurations.add(blueprintConfig3);
+    configurations.add(blueprintConfig4);
+    configurations.add(blueprintConfig5);
 
     // expectations
     expect(request.getProperties()).andReturn(propertySet).anyTimes();
@@ -342,7 +361,7 @@ public class ClusterResourceProviderTest {
     expect(stackConfigurationResponse2.getPropertyValue()).andReturn("value2");
     expect(stackConfigurationResponse2.getPropertyAttributes()).andReturn(hdfsSiteAttributes);
 
-    expect(stackConfigurationResponse3.getType()).andReturn("global.xml");
+    expect(stackConfigurationResponse3.getType()).andReturn("oozie-env.xml");
     expect(stackConfigurationResponse3.getPropertyName()).andReturn("oozie_user");
     expect(stackConfigurationResponse3.getPropertyValue()).andReturn("oozie");
 
@@ -360,7 +379,17 @@ public class ClusterResourceProviderTest {
     expect(blueprintConfig2.getBlueprintName()).andReturn("test-blueprint").anyTimes();
     expect(blueprintConfig2.getType()).andReturn("hive-env").anyTimes();
     expect(blueprintConfig2.getConfigData()).andReturn(new Gson().toJson(blueprintGlobalConfigProperties)).anyTimes();
+    expect(blueprintConfig3.getBlueprintName()).andReturn("test-blueprint").anyTimes();
+    expect(blueprintConfig3.getType()).andReturn("oozie-env").anyTimes();
+    expect(blueprintConfig3.getConfigData()).andReturn(new Gson().toJson(oozieEnvConfigProperties)).anyTimes();
+    expect(blueprintConfig4.getBlueprintName()).andReturn("test-blueprint").anyTimes();
+    expect(blueprintConfig4.getType()).andReturn("falcon-env").anyTimes();
+    expect(blueprintConfig4.getConfigData()).andReturn(new Gson().toJson(falconEnvConfigProperties)).anyTimes();
+    expect(blueprintConfig5.getBlueprintName()).andReturn("test-blueprint").anyTimes();
+    expect(blueprintConfig5.getType()).andReturn("hbase-env").anyTimes();
+    expect(blueprintConfig5.getConfigData()).andReturn(new Gson().toJson(hbaseEnvConfigProperties)).anyTimes();
 
+    
     expect(blueprint.getHostGroups()).andReturn(Collections.singleton(hostGroup)).anyTimes();
     expect(hostGroup.getName()).andReturn("group1").anyTimes();
     expect(hostGroup.getComponents()).andReturn(hostGroupComponents).anyTimes();
@@ -385,6 +414,10 @@ public class ClusterResourceProviderTest {
         capture(updateClusterPropertyMapCapture4))).andReturn(null);
     expect(managementController.updateClusters(capture(updateClusterRequestCapture5),
         capture(updateClusterPropertyMapCapture5))).andReturn(null);
+    expect(managementController.updateClusters(capture(updateClusterRequestCapture6),
+        capture(updateClusterPropertyMapCapture6))).andReturn(null);
+    expect(managementController.updateClusters(capture(updateClusterRequestCapture7),
+        capture(updateClusterPropertyMapCapture7))).andReturn(null);
 
     expect(serviceResourceProvider.createResources(capture(serviceRequestCapture))).andReturn(null);
     expect(componentResourceProvider.createResources(capture(componentRequestCapture))).andReturn(null);
@@ -403,12 +436,12 @@ public class ClusterResourceProviderTest {
            stackServiceComponentResponse1, stackServiceComponentResponse2, stackServiceComponentResponse3,
            stackServiceComponentResponse4, stackConfigurationResponse1, stackConfigurationResponse2,
            stackConfigurationResponse3, stackConfigurationResponse4, stackConfigurationResponse5, blueprintConfig,
-           blueprintConfig2, hostGroup, hostGroupComponent1, hostGroupComponent2, hostGroupComponent3, hostGroupComponent4,
+           blueprintConfig2, blueprintConfig3, blueprintConfig4, blueprintConfig5, hostGroup, hostGroupComponent1, hostGroupComponent2, hostGroupComponent3, hostGroupComponent4,
            hostGroupConfig, serviceResourceProvider, componentResourceProvider, hostResourceProvider,
            hostComponentResourceProvider, configGroupResourceProvider, persistKeyValue, metaInfo);
 
     // test
-    ClusterResourceProvider.init(blueprintDAO, metaInfo);
+    ClusterResourceProvider.init(blueprintDAO, metaInfo, configHelper);
     PersistKeyValueService.init(persistKeyValue);
     ResourceProvider provider = new TestClusterResourceProvider(
         managementController, serviceResourceProvider, componentResourceProvider,
@@ -466,44 +499,52 @@ public class ClusterResourceProviderTest {
     Set<ClusterRequest> updateClusterRequest3 = updateClusterRequestCapture3.getValue();
     Set<ClusterRequest> updateClusterRequest4 = updateClusterRequestCapture4.getValue();
     Set<ClusterRequest> updateClusterRequest5 = updateClusterRequestCapture5.getValue();
+    Set<ClusterRequest> updateClusterRequest6 = updateClusterRequestCapture6.getValue();
+    Set<ClusterRequest> updateClusterRequest7 = updateClusterRequestCapture7.getValue();
     assertEquals(1, updateClusterRequest1.size());
     assertEquals(1, updateClusterRequest2.size());
     assertEquals(1, updateClusterRequest3.size());
     assertEquals(1, updateClusterRequest4.size());
     assertEquals(1, updateClusterRequest5.size());
+    assertEquals(1, updateClusterRequest6.size());
+    assertEquals(1, updateClusterRequest7.size());
     ClusterRequest ucr1 = updateClusterRequest1.iterator().next();
     ClusterRequest ucr2 = updateClusterRequest2.iterator().next();
     ClusterRequest ucr3 = updateClusterRequest3.iterator().next();
     ClusterRequest ucr4 = updateClusterRequest4.iterator().next();
     ClusterRequest ucr5 = updateClusterRequest5.iterator().next();
+    ClusterRequest ucr6 = updateClusterRequest6.iterator().next();
+    ClusterRequest ucr7 = updateClusterRequest7.iterator().next();
     assertEquals(clusterName, ucr1.getClusterName());
     assertEquals(clusterName, ucr2.getClusterName());
     assertEquals(clusterName, ucr3.getClusterName());
     assertEquals(clusterName, ucr4.getClusterName());
     assertEquals(clusterName, ucr5.getClusterName());
+    assertEquals(clusterName, ucr6.getClusterName());
+    assertEquals(clusterName, ucr7.getClusterName());
     ConfigurationRequest cr1 = ucr1.getDesiredConfig();
     ConfigurationRequest cr2 = ucr2.getDesiredConfig();
     ConfigurationRequest cr3 = ucr3.getDesiredConfig();
     ConfigurationRequest cr4 = ucr4.getDesiredConfig();
     ConfigurationRequest cr5 = ucr5.getDesiredConfig();
+    ConfigurationRequest cr6 = ucr6.getDesiredConfig();
+    ConfigurationRequest cr7 = ucr7.getDesiredConfig();
     assertEquals("1", cr1.getVersionTag());
     assertEquals("1", cr2.getVersionTag());
     assertEquals("1", cr3.getVersionTag());
     assertEquals("1", cr4.getVersionTag());
     assertEquals("1", cr5.getVersionTag());
+    assertEquals("1", cr6.getVersionTag());
+    assertEquals("1", cr7.getVersionTag());
     Map<String, ConfigurationRequest> mapConfigRequests = new HashMap<String, ConfigurationRequest>();
     mapConfigRequests.put(cr1.getType(), cr1);
     mapConfigRequests.put(cr2.getType(), cr2);
     mapConfigRequests.put(cr3.getType(), cr3);
     mapConfigRequests.put(cr4.getType(), cr4);
     mapConfigRequests.put(cr5.getType(), cr5);
-    assertEquals(5, mapConfigRequests.size());
-    ConfigurationRequest globalConfigRequest = mapConfigRequests.get("global");
-    assertEquals(4, globalConfigRequest.getProperties().size());
-    assertEquals("hadoop", globalConfigRequest.getProperties().get("user_group"));
-    assertEquals("ambari-qa", globalConfigRequest.getProperties().get("smokeuser"));
-    assertEquals("default@REPLACEME.NOWHERE", globalConfigRequest.getProperties().get("nagios_contact"));
-    assertEquals("oozie", globalConfigRequest.getProperties().get("oozie_user"));
+    mapConfigRequests.put(cr6.getType(), cr6);
+    mapConfigRequests.put(cr7.getType(), cr7);
+    assertEquals(7, mapConfigRequests.size());
     ConfigurationRequest hiveEnvConfigRequest = mapConfigRequests.get("hive-env");
     assertEquals("New MySQL Database", hiveEnvConfigRequest.getProperties().get("hive_database"));
     ConfigurationRequest hdfsConfigRequest = mapConfigRequests.get("hdfs-site");
@@ -600,6 +641,7 @@ public class ClusterResourceProviderTest {
     AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.class);
     AmbariManagementController managementController = createStrictMock(AmbariManagementController.class);
     Request request = createNiceMock(Request.class);
+    ConfigHelper configHelper = createNiceMock(ConfigHelper.class);
     RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
     BlueprintEntity blueprint = createNiceMock(BlueprintEntity.class);
     StackServiceResponse stackServiceResponse1 = createNiceMock(StackServiceResponse.class);
@@ -609,6 +651,7 @@ public class ClusterResourceProviderTest {
     StackServiceComponentResponse stackServiceComponentResponse1 = createNiceMock(StackServiceComponentResponse.class);
     StackServiceComponentResponse stackServiceComponentResponse2 = createNiceMock(StackServiceComponentResponse.class);
     StackServiceComponentResponse stackServiceComponentResponse3 = createNiceMock(StackServiceComponentResponse.class);
+
     Capture<Set<StackServiceComponentRequest>> serviceComponentRequestCapture1 = new Capture<Set<StackServiceComponentRequest>>();
     Capture<Set<StackServiceComponentRequest>> serviceComponentRequestCapture2 = new Capture<Set<StackServiceComponentRequest>>();
 
@@ -616,6 +659,9 @@ public class ClusterResourceProviderTest {
     StackConfigurationResponse stackConfigurationResponse2 = createNiceMock(StackConfigurationResponse.class);
     StackConfigurationResponse stackConfigurationResponse3 = createNiceMock(StackConfigurationResponse.class);
     StackConfigurationResponse stackConfigurationResponse4 = createNiceMock(StackConfigurationResponse.class);
+    StackConfigurationResponse stackConfigurationResponse5 = createNiceMock(StackConfigurationResponse.class);
+    StackConfigurationResponse stackConfigurationResponse6 = createNiceMock(StackConfigurationResponse.class);
+    StackConfigurationResponse stackConfigurationResponse7 = createNiceMock(StackConfigurationResponse.class);
     Capture<Set<StackConfigurationRequest>> serviceConfigurationRequestCapture1 = new Capture<Set<StackConfigurationRequest>>();
     Capture<Set<StackConfigurationRequest>> serviceConfigurationRequestCapture2 = new Capture<Set<StackConfigurationRequest>>();
 
@@ -648,6 +694,7 @@ public class ClusterResourceProviderTest {
     Set<StackServiceComponentResponse> stackServiceComponentResponses2 = new LinkedHashSet<StackServiceComponentResponse>();
     stackServiceComponentResponses2.add(stackServiceComponentResponse3);
 
+
     // service1 has 1 config
     Set<StackConfigurationResponse> stackConfigurationResponses1 = new LinkedHashSet<StackConfigurationResponse>();
     stackConfigurationResponses1.add(stackConfigurationResponse1);
@@ -657,6 +704,9 @@ public class ClusterResourceProviderTest {
     stackConfigurationResponses2.add(stackConfigurationResponse2);
     stackConfigurationResponses2.add(stackConfigurationResponse3);
     stackConfigurationResponses2.add(stackConfigurationResponse4);
+    stackConfigurationResponses2.add(stackConfigurationResponse5);
+    stackConfigurationResponses2.add(stackConfigurationResponse6);
+    stackConfigurationResponses2.add(stackConfigurationResponse7);
 
     Collection<HostGroupComponentEntity> hostGroupComponents = new LinkedHashSet<HostGroupComponentEntity>();
     hostGroupComponents.add(hostGroupComponent1);
@@ -737,13 +787,26 @@ public class ClusterResourceProviderTest {
     expect(stackConfigurationResponse2.getPropertyName()).andReturn("property2");
     expect(stackConfigurationResponse2.getPropertyValue()).andReturn("value2");
 
-    expect(stackConfigurationResponse3.getType()).andReturn("global.xml");
+    expect(stackConfigurationResponse3.getType()).andReturn("oozie-env.xml");
     expect(stackConfigurationResponse3.getPropertyName()).andReturn("oozie_user");
     expect(stackConfigurationResponse3.getPropertyValue()).andReturn("oozie");
 
     expect(stackConfigurationResponse4.getType()).andReturn("core-site.xml");
     expect(stackConfigurationResponse4.getPropertyName()).andReturn("property3");
     expect(stackConfigurationResponse4.getPropertyValue()).andReturn("value3");
+    
+    expect(stackConfigurationResponse5.getType()).andReturn("hive-env.xml");
+    expect(stackConfigurationResponse5.getPropertyName()).andReturn("property3");
+    expect(stackConfigurationResponse5.getPropertyValue()).andReturn("value3");
+    
+    expect(stackConfigurationResponse6.getType()).andReturn("hbase-env.xml");
+    expect(stackConfigurationResponse6.getPropertyName()).andReturn("property3");
+    expect(stackConfigurationResponse6.getPropertyValue()).andReturn("value3");
+    
+    expect(stackConfigurationResponse7.getType()).andReturn("falcon-env.xml");
+    expect(stackConfigurationResponse7.getPropertyName()).andReturn("property3");
+    expect(stackConfigurationResponse7.getPropertyValue()).andReturn("value3");
+
 
     expect(blueprintConfig.getBlueprintName()).andReturn("test-blueprint").anyTimes();
     expect(blueprintConfig.getType()).andReturn("core-site").anyTimes();
@@ -764,12 +827,13 @@ public class ClusterResourceProviderTest {
     replay(blueprintDAO, managementController, request, response, blueprint, stackServiceResponse1, stackServiceResponse2,
         stackServiceComponentResponse1, stackServiceComponentResponse2, stackServiceComponentResponse3,
         stackConfigurationResponse1, stackConfigurationResponse2, stackConfigurationResponse3, stackConfigurationResponse4,
+        stackConfigurationResponse5, stackConfigurationResponse6, stackConfigurationResponse7,
         blueprintConfig, hostGroup, hostGroupComponent1, hostGroupComponent2, hostGroupComponent3, hostGroupConfig,
         serviceResourceProvider, componentResourceProvider, hostResourceProvider, hostComponentResourceProvider,
         configGroupResourceProvider, persistKeyValue, metaInfo);
 
     // test
-    ClusterResourceProvider.init(blueprintDAO, metaInfo);
+    ClusterResourceProvider.init(blueprintDAO, metaInfo, configHelper);
     ResourceProvider provider = new TestClusterResourceProvider(
         managementController, serviceResourceProvider, componentResourceProvider,
         hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider);
@@ -796,6 +860,7 @@ public class ClusterResourceProviderTest {
     String stackVersion = "1.23";
     String clusterName = "c1";
 
+    ConfigHelper configHelper = createNiceMock(ConfigHelper.class);
     BlueprintDAO blueprintDAO = createStrictMock(BlueprintDAO.class);
     AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.class);
     AmbariManagementController managementController = createStrictMock(AmbariManagementController.class);
@@ -948,7 +1013,7 @@ public class ClusterResourceProviderTest {
         configGroupResourceProvider, persistKeyValue, metaInfo);
 
     // test
-    ClusterResourceProvider.init(blueprintDAO, metaInfo);
+    ClusterResourceProvider.init(blueprintDAO, metaInfo, configHelper);
     ResourceProvider provider = new TestClusterResourceProvider(
         managementController, serviceResourceProvider, componentResourceProvider,
         hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider);
@@ -968,6 +1033,7 @@ public class ClusterResourceProviderTest {
     String stackVersion = "1.23";
     String clusterName = "c1";
 
+    ConfigHelper configHelper = createNiceMock(ConfigHelper.class);
     BlueprintDAO blueprintDAO = createStrictMock(BlueprintDAO.class);
     AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.class);
     AmbariManagementController managementController = createStrictMock(AmbariManagementController.class);
@@ -1130,7 +1196,7 @@ public class ClusterResourceProviderTest {
         configGroupResourceProvider, persistKeyValue, metaInfo);
 
     // test
-    ClusterResourceProvider.init(blueprintDAO, metaInfo);
+    ClusterResourceProvider.init(blueprintDAO, metaInfo, configHelper);
     ResourceProvider provider = new TestClusterResourceProvider(
         managementController, serviceResourceProvider, componentResourceProvider,
         hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider);
@@ -1150,6 +1216,7 @@ public class ClusterResourceProviderTest {
     String stackVersion = "1.23";
     String clusterName = "c1";
 
+    ConfigHelper configHelper = createNiceMock(ConfigHelper.class);
     BlueprintDAO blueprintDAO = createStrictMock(BlueprintDAO.class);
     AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.class);
     AmbariManagementController managementController = createStrictMock(AmbariManagementController.class);
@@ -1312,7 +1379,7 @@ public class ClusterResourceProviderTest {
         configGroupResourceProvider, persistKeyValue, metaInfo);
 
     // test
-    ClusterResourceProvider.init(blueprintDAO, metaInfo);
+    ClusterResourceProvider.init(blueprintDAO, metaInfo, configHelper);
     ResourceProvider provider = new TestClusterResourceProvider(
         managementController, serviceResourceProvider, componentResourceProvider,
         hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider);
@@ -1332,6 +1399,7 @@ public class ClusterResourceProviderTest {
     String stackVersion = "1.23";
     String clusterName = "c1";
 
+    ConfigHelper configHelper = createNiceMock(ConfigHelper.class);
     BlueprintDAO blueprintDAO = createStrictMock(BlueprintDAO.class);
     AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.class);
     AmbariManagementController managementController = createStrictMock(AmbariManagementController.class);
@@ -1345,6 +1413,9 @@ public class ClusterResourceProviderTest {
     StackServiceComponentResponse stackServiceComponentResponse1 = createNiceMock(StackServiceComponentResponse.class);
     StackServiceComponentResponse stackServiceComponentResponse2 = createNiceMock(StackServiceComponentResponse.class);
     StackServiceComponentResponse stackServiceComponentResponse3 = createNiceMock(StackServiceComponentResponse.class);
+    StackConfigurationResponse stackConfigurationResponse5 = createNiceMock(StackConfigurationResponse.class);
+    StackConfigurationResponse stackConfigurationResponse6 = createNiceMock(StackConfigurationResponse.class);
+    StackConfigurationResponse stackConfigurationResponse7 = createNiceMock(StackConfigurationResponse.class);
     Capture<Set<StackServiceComponentRequest>> serviceComponentRequestCapture1 = new Capture<Set<StackServiceComponentRequest>>();
     Capture<Set<StackServiceComponentRequest>> serviceComponentRequestCapture2 = new Capture<Set<StackServiceComponentRequest>>();
 
@@ -1380,6 +1451,11 @@ public class ClusterResourceProviderTest {
     Capture<Map<String, String>> updateClusterPropertyMapCapture3 = new Capture<Map<String, String>>();
     Capture<Set<ClusterRequest>> updateClusterRequestCapture4 = new Capture<Set<ClusterRequest>>();
     Capture<Map<String, String>> updateClusterPropertyMapCapture4 = new Capture<Map<String, String>>();
+    Capture<Set<ClusterRequest>> updateClusterRequestCapture5 = new Capture<Set<ClusterRequest>>();
+    Capture<Map<String, String>> updateClusterPropertyMapCapture5 = new Capture<Map<String, String>>();
+    Capture<Set<ClusterRequest>> updateClusterRequestCapture6 = new Capture<Set<ClusterRequest>>();
+    Capture<Map<String, String>> updateClusterPropertyMapCapture6 = new Capture<Map<String, String>>();
+
     
     Capture<Request> serviceRequestCapture = new Capture<Request>();
     Capture<Request> componentRequestCapture = new Capture<Request>();
@@ -1410,6 +1486,10 @@ public class ClusterResourceProviderTest {
     stackConfigurationResponses2.add(stackConfigurationResponse2);
     stackConfigurationResponses2.add(stackConfigurationResponse3);
     stackConfigurationResponses2.add(stackConfigurationResponse4);
+    stackConfigurationResponses2.add(stackConfigurationResponse5);
+    stackConfigurationResponses2.add(stackConfigurationResponse6);
+    stackConfigurationResponses2.add(stackConfigurationResponse7);
+
 
     Collection<HostGroupComponentEntity> hostGroupComponents = new LinkedHashSet<HostGroupComponentEntity>();
     hostGroupComponents.add(hostGroupComponent1);
@@ -1492,13 +1572,25 @@ public class ClusterResourceProviderTest {
     expect(stackConfigurationResponse2.getPropertyName()).andReturn("property2");
     expect(stackConfigurationResponse2.getPropertyValue()).andReturn("value2");
 
-    expect(stackConfigurationResponse3.getType()).andReturn("global.xml");
-    expect(stackConfigurationResponse3.getPropertyName()).andReturn("oozie_user");
-    expect(stackConfigurationResponse3.getPropertyValue()).andReturn("oozie");
+    expect(stackConfigurationResponse3.getType()).andReturn("hive-env.xml");
+    expect(stackConfigurationResponse3.getPropertyName()).andReturn("property3");
+    expect(stackConfigurationResponse3.getPropertyValue()).andReturn("value3");
 
     expect(stackConfigurationResponse4.getType()).andReturn("core-site.xml");
     expect(stackConfigurationResponse4.getPropertyName()).andReturn("property3");
     expect(stackConfigurationResponse4.getPropertyValue()).andReturn("value3");
+    
+    expect(stackConfigurationResponse5.getType()).andReturn("hbase-env.xml");
+    expect(stackConfigurationResponse5.getPropertyName()).andReturn("property3");
+    expect(stackConfigurationResponse5.getPropertyValue()).andReturn("value3");
+    
+    expect(stackConfigurationResponse6.getType()).andReturn("falcon-env.xml");
+    expect(stackConfigurationResponse6.getPropertyName()).andReturn("property3");
+    expect(stackConfigurationResponse6.getPropertyValue()).andReturn("value3");
+    
+    expect(stackConfigurationResponse7.getType()).andReturn("oozie-env.xml");
+    expect(stackConfigurationResponse7.getPropertyName()).andReturn("oozie_user");
+    expect(stackConfigurationResponse7.getPropertyValue()).andReturn("oozie");
 
     expect(blueprintConfig.getBlueprintName()).andReturn("test-blueprint").anyTimes();
     expect(blueprintConfig.getType()).andReturn("core-site").anyTimes();
@@ -1523,6 +1615,13 @@ public class ClusterResourceProviderTest {
         capture(updateClusterPropertyMapCapture2))).andReturn(null);
     expect(managementController.updateClusters(capture(updateClusterRequestCapture3),
         capture(updateClusterPropertyMapCapture3))).andReturn(null);
+    expect(managementController.updateClusters(capture(updateClusterRequestCapture4),
+        capture(updateClusterPropertyMapCapture4))).andReturn(null);
+    expect(managementController.updateClusters(capture(updateClusterRequestCapture5),
+        capture(updateClusterPropertyMapCapture5))).andReturn(null);
+    expect(managementController.updateClusters(capture(updateClusterRequestCapture6),
+        capture(updateClusterPropertyMapCapture6))).andReturn(null);
+
 
     expect(serviceResourceProvider.createResources(capture(serviceRequestCapture))).andReturn(null);
     expect(componentResourceProvider.createResources(capture(componentRequestCapture))).andReturn(null);
@@ -1540,12 +1639,13 @@ public class ClusterResourceProviderTest {
     replay(blueprintDAO, managementController, request, response, blueprint, stackServiceResponse1, stackServiceResponse2,
         stackServiceComponentResponse1, stackServiceComponentResponse2, stackServiceComponentResponse3,
         stackConfigurationResponse1, stackConfigurationResponse2, stackConfigurationResponse3, stackConfigurationResponse4,
+        stackConfigurationResponse5, stackConfigurationResponse6, stackConfigurationResponse7,
         blueprintConfig, hostGroup, hostGroupComponent1, hostGroupComponent2, hostGroupComponent3, hostGroupConfig,
         serviceResourceProvider, componentResourceProvider, hostResourceProvider, hostComponentResourceProvider,
         configGroupResourceProvider, persistKeyValue, metaInfo);
 
     // test
-    ClusterResourceProvider.init(blueprintDAO, metaInfo);
+    ClusterResourceProvider.init(blueprintDAO, metaInfo, configHelper);
     PersistKeyValueService.init(persistKeyValue);
     ResourceProvider provider = new TestClusterResourceProvider(
         managementController, serviceResourceProvider, componentResourceProvider,
@@ -1601,32 +1701,50 @@ public class ClusterResourceProviderTest {
     Set<ClusterRequest> updateClusterRequest1 = updateClusterRequestCapture.getValue();
     Set<ClusterRequest> updateClusterRequest2 = updateClusterRequestCapture2.getValue();
     Set<ClusterRequest> updateClusterRequest3 = updateClusterRequestCapture3.getValue();
+    Set<ClusterRequest> updateClusterRequest4 = updateClusterRequestCapture4.getValue();
+    Set<ClusterRequest> updateClusterRequest5 = updateClusterRequestCapture5.getValue();
+    Set<ClusterRequest> updateClusterRequest6 = updateClusterRequestCapture6.getValue();
+
     assertEquals(1, updateClusterRequest1.size());
     assertEquals(1, updateClusterRequest2.size());
     assertEquals(1, updateClusterRequest3.size());
+    assertEquals(1, updateClusterRequest4.size());
+    assertEquals(1, updateClusterRequest5.size());
+    assertEquals(1, updateClusterRequest6.size());
     ClusterRequest ucr1 = updateClusterRequest1.iterator().next();
     ClusterRequest ucr2 = updateClusterRequest2.iterator().next();
     ClusterRequest ucr3 = updateClusterRequest3.iterator().next();
+    ClusterRequest ucr4 = updateClusterRequest4.iterator().next();
+    ClusterRequest ucr5 = updateClusterRequest5.iterator().next();
+    ClusterRequest ucr6 = updateClusterRequest6.iterator().next();
     assertEquals(clusterName, ucr1.getClusterName());
     assertEquals(clusterName, ucr2.getClusterName());
     assertEquals(clusterName, ucr3.getClusterName());
+    assertEquals(clusterName, ucr4.getClusterName());
+    assertEquals(clusterName, ucr5.getClusterName());
+    assertEquals(clusterName, ucr6.getClusterName());
     ConfigurationRequest cr1 = ucr1.getDesiredConfig();
     ConfigurationRequest cr2 = ucr2.getDesiredConfig();
     ConfigurationRequest cr3 = ucr3.getDesiredConfig();
+    ConfigurationRequest cr4 = ucr4.getDesiredConfig();
+    ConfigurationRequest cr5 = ucr5.getDesiredConfig();
+    ConfigurationRequest cr6 = ucr6.getDesiredConfig();
+
     assertEquals("1", cr1.getVersionTag());
     assertEquals("1", cr2.getVersionTag());
     assertEquals("1", cr3.getVersionTag());
+    assertEquals("1", cr4.getVersionTag());
+    assertEquals("1", cr5.getVersionTag());
+    assertEquals("1", cr6.getVersionTag());
+
     Map<String, ConfigurationRequest> mapConfigRequests = new HashMap<String, ConfigurationRequest>();
     mapConfigRequests.put(cr1.getType(), cr1);
     mapConfigRequests.put(cr2.getType(), cr2);
     mapConfigRequests.put(cr3.getType(), cr3);
-    assertEquals(3, mapConfigRequests.size());
-    ConfigurationRequest globalConfigRequest = mapConfigRequests.get("global");
-    assertEquals(4, globalConfigRequest.getProperties().size());
-    assertEquals("hadoop", globalConfigRequest.getProperties().get("user_group"));
-    assertEquals("ambari-qa", globalConfigRequest.getProperties().get("smokeuser"));
-    assertEquals("default@REPLACEME.NOWHERE", globalConfigRequest.getProperties().get("nagios_contact"));
-    assertEquals("oozie", globalConfigRequest.getProperties().get("oozie_user"));
+    mapConfigRequests.put(cr4.getType(), cr4);
+    mapConfigRequests.put(cr5.getType(), cr5);
+    mapConfigRequests.put(cr6.getType(), cr6);
+    assertEquals(6, mapConfigRequests.size());
     ConfigurationRequest hdfsConfigRequest = mapConfigRequests.get("hdfs-site");
     assertEquals(1, hdfsConfigRequest.getProperties().size());
     assertEquals("value2", hdfsConfigRequest.getProperties().get("property2"));
@@ -1692,6 +1810,7 @@ public class ClusterResourceProviderTest {
     verify(blueprintDAO, managementController, request, response, blueprint, stackServiceResponse1, stackServiceResponse2,
         stackServiceComponentResponse1, stackServiceComponentResponse2, stackServiceComponentResponse3,
         stackConfigurationResponse1, stackConfigurationResponse2, stackConfigurationResponse3, stackConfigurationResponse4,
+        stackConfigurationResponse5, stackConfigurationResponse6, stackConfigurationResponse7,
         blueprintConfig, hostGroup, hostGroupComponent1, hostGroupComponent2, hostGroupComponent3, hostGroupConfig,
         serviceResourceProvider, componentResourceProvider, hostResourceProvider, hostComponentResourceProvider,
         configGroupResourceProvider, persistKeyValue);
@@ -1704,6 +1823,7 @@ public class ClusterResourceProviderTest {
     String stackVersion = "1.23";
     String clusterName = "c1";
 
+    ConfigHelper configHelper = createNiceMock(ConfigHelper.class);
     BlueprintDAO blueprintDAO = createStrictMock(BlueprintDAO.class);
     AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.class);
     AmbariManagementController managementController = createStrictMock(AmbariManagementController.class);
@@ -1908,7 +2028,7 @@ public class ClusterResourceProviderTest {
         configGroupResourceProvider, metaInfo);
 
     // test
-    ClusterResourceProvider.init(blueprintDAO, metaInfo);
+    ClusterResourceProvider.init(blueprintDAO, metaInfo, configHelper);
     ResourceProvider provider = new TestClusterResourceProvider(
         managementController, serviceResourceProvider, componentResourceProvider,
         hostResourceProvider, hostComponentResourceProvider, configGroupResourceProvider);
@@ -1928,6 +2048,7 @@ public class ClusterResourceProviderTest {
     String stackVersion = "1.23";
     String clusterName = "c1";
 
+    ConfigHelper configHelper = createNiceMock(ConfigHelper.class);
     BlueprintDAO blueprintDAO = createStrictMock(BlueprintDAO.class);
     AmbariMetaInfo metaInfo = createMock(AmbariMetaInfo.class);
     AmbariManagementController managementController = createStrictMock(AmbariManagementController.class);
@@ -1950,6 +2071,9 @@ public class ClusterResourceProviderTest {
     StackConfigurationResponse stackConfigurationResponse3 = createNiceMock(StackConfigurationResponse.class);
     StackConfigurationResponse stackConfigurationResponse4 = createNiceMock(StackConfigurationResponse.class);
     StackConfigurationResponse stackConfigurationResponse5 = createNiceMock(StackConfigurationResponse.class);
+    StackConfigurationResponse stackConfigurationResponse6 = createNiceMock(StackConfigurationResponse.class);
+    StackConfigurationResponse stackConfigurationResponse7 = createNiceMock(StackConfigurationResponse.class);
+    StackConfigurationResponse stackConfigurationResponse8 = createNiceMock(StackConfigurationResponse.class);
     Capture<Set<StackConfigurationRequest>> serviceConfigurationRequestCapture1 = new Capture<Set<StackConfigurationRequest>>();
     Capture<Set<StackConfigurationRequest>> serviceConfigurationRequestCapture2 = new Capture<Set<StackConfigurationRequest>>();
 
@@ -1987,6 +2111,11 @@ public class ClusterResourceProviderTest {
     Capture<Map<String, String>> updateClusterPropertyMapCapture4 = new Capture<Map<String, String>>();
     Capture<Set<ClusterRequest>> updateClusterRequestCapture5 = new Capture<Set<ClusterRequest>>();
     Capture<Map<String, String>> updateClusterPropertyMapCapture5 = new Capture<Map<String, String>>();
+    Capture<Set<ClusterRequest>> updateClusterRequestCapture6 = new Capture<Set<ClusterRequest>>();
+    Capture<Map<String, String>> updateClusterPropertyMapCapture6 = new Capture<Map<String, String>>();
+    Capture<Set<ClusterRequest>> updateClusterRequestCapture7 = new Capture<Set<ClusterRequest>>();
+    Capture<Map<String, String>> updateClusterPropertyMapCapture7 = new Capture<Map<String, String>>();
+
 
     Capture<Request> serviceRequestCapture = new Capture<Request>();
     Capture<Request> componentRequestCapture = new Capture<Request>();
@@ -2019,6 +2148,9 @@ public class ClusterResourceProviderTest {
     stackConfigurationResponses2.add(stackConfigurationResponse2);
     stackConfigurationResponses2.add(stackConfigurationResponse3);
     stackConfigurationResponses2.add(stackConfigurationResponse4);
+    stackConfigurationResponses2.add(stackConfigurationResponse6);
+    stackConfigurationResponses2.add(stackConfigurationResponse7);
+    stackConfigurationResponses2.add(stackConfigurationResponse8);
 
     Collection<HostGroupComponentEntity> hostGroupComponents = new LinkedHashSet<HostGroupComponentEntity>();
     hostGroupComponents.add(hostGroupComponent1);
@@ -2118,7 +2250,7 @@ public class ClusterResourceProviderTest {
     expect(stackConfigurationResponse2.getPropertyValue()).andReturn("value2");
     expect(stackConfigurationResponse2.getPropertyAttributes()).andReturn(hdfsSiteAttributes);
 
-    expect(stackConfigurationResponse3.getType()).andReturn("global.xml");
+    expect(stackConfigurationResponse3.getType()).andReturn("oozie-env.xml");
     expect(stackConfigurationResponse3.getPropertyName()).andReturn("oozie_user");
     expect(stackConfigurationResponse3.getPropertyValue()).andReturn("oozie");
 
@@ -2130,6 +2262,20 @@ public class ClusterResourceProviderTest {
     expect(stackConfigurationResponse5.getPropertyName()).andReturn("javax.jdo.option.ConnectionURL");
     expect(stackConfigurationResponse5.getPropertyValue()).andReturn("localhost:12345");
 
+    expect(stackConfigurationResponse6.getType()).andReturn("hbase-env.xml");
+    expect(stackConfigurationResponse6.getPropertyName()).andReturn("property3");
+    expect(stackConfigurationResponse6.getPropertyValue()).andReturn("value3");
+   
+    expect(stackConfigurationResponse7.getType()).andReturn("falcon-env.xml");
+    expect(stackConfigurationResponse7.getPropertyName()).andReturn("property3");
+    expect(stackConfigurationResponse7.getPropertyValue()).andReturn("value3");
+    
+    expect(stackConfigurationResponse8.getType()).andReturn("hive-env.xml");
+    expect(stackConfigurationResponse8.getPropertyName()).andReturn("property3");
+    expect(stackConfigurationResponse8.getPropertyValue()).andReturn("value3");
+
+
+
     expect(blueprintConfig.getBlueprintName()).andReturn("test-blueprint").anyTimes();
     expect(blueprintConfig.getType()).andReturn("core-site").anyTimes();
     expect(blueprintConfig.getConfigData()).andReturn(new Gson().toJson(blueprintCoreConfigProperties)).anyTimes();
@@ -2163,6 +2309,11 @@ public class ClusterResourceProviderTest {
         capture(updateClusterPropertyMapCapture4))).andReturn(null);
     expect(managementController.updateClusters(capture(updateClusterRequestCapture5),
         capture(updateClusterPropertyMapCapture5))).andReturn(null);
+    expect(managementController.updateClusters(capture(updateClusterRequestCapture6),
+        capture(updateClusterPropertyMapCapture6))).andReturn(null);
+    expect(managementController.updateClusters(capture(updateClusterRequestCapture7),
+        capture(updateClusterPropertyMapCapture7))).andReturn(null);
+
 
     expect(serviceResourceProvider.createResources(capture(serviceRequestCapture))).andReturn(null);
     expect(componentResourceProvider.createResources(capture(componentRequestCapture))).andReturn(null);
@@ -2180,13 +2331,13 @@ public class ClusterResourceProviderTest {
     replay(blueprintDAO, managementController, request, response, blueprint, stackServiceResponse1, stackServiceResponse2,
         stackServiceComponentResponse1, stackServiceComponentResponse2, stackServiceComponentResponse3,
         stackServiceComponentResponse4, stackConfigurationResponse1, stackConfigurationResponse2,
-        stackConfigurationResponse3, stackConfigurationResponse4, stackConfigurationResponse5, blueprintConfig,
+        stackConfigurationResponse3, stackConfigurationResponse4, stackConfigurationResponse5, stackConfigurationResponse6, stackConfigurationResponse7, stackConfigurationResponse8, blueprintConfig,
         blueprintConfig2, hostGroup, hostGroupComponent1, hostGroupComponent2, hostGroupComponent3, hostGroupComponent4,
         hostGroupConfig, serviceResourceProvider, componentResourceProvider, hostResourceProvider,
         hostComponentResourceProvider, configGroupResourceProvider, persistKeyValue, metaInfo);
 
     // test
-    ClusterResourceProvider.init(blueprintDAO, metaInfo);
+    ClusterResourceProvider.init(blueprintDAO, metaInfo, configHelper);
     PersistKeyValueService.init(persistKeyValue);
     ResourceProvider provider = new TestClusterResourceProvider(
         managementController, serviceResourceProvider, componentResourceProvider,
@@ -2244,46 +2395,52 @@ public class ClusterResourceProviderTest {
     Set<ClusterRequest> updateClusterRequest3 = updateClusterRequestCapture3.getValue();
     Set<ClusterRequest> updateClusterRequest4 = updateClusterRequestCapture4.getValue();
     Set<ClusterRequest> updateClusterRequest5 = updateClusterRequestCapture5.getValue();
+    Set<ClusterRequest> updateClusterRequest6 = updateClusterRequestCapture6.getValue();
+    Set<ClusterRequest> updateClusterRequest7 = updateClusterRequestCapture7.getValue();
     assertEquals(1, updateClusterRequest1.size());
     assertEquals(1, updateClusterRequest2.size());
     assertEquals(1, updateClusterRequest3.size());
     assertEquals(1, updateClusterRequest4.size());
     assertEquals(1, updateClusterRequest5.size());
+    assertEquals(1, updateClusterRequest6.size());
+    assertEquals(1, updateClusterRequest7.size());
     ClusterRequest ucr1 = updateClusterRequest1.iterator().next();
     ClusterRequest ucr2 = updateClusterRequest2.iterator().next();
     ClusterRequest ucr3 = updateClusterRequest3.iterator().next();
     ClusterRequest ucr4 = updateClusterRequest4.iterator().next();
     ClusterRequest ucr5 = updateClusterRequest5.iterator().next();
+    ClusterRequest ucr6 = updateClusterRequest6.iterator().next();
+    ClusterRequest ucr7 = updateClusterRequest7.iterator().next();
     assertEquals(clusterName, ucr1.getClusterName());
     assertEquals(clusterName, ucr2.getClusterName());
     assertEquals(clusterName, ucr3.getClusterName());
     assertEquals(clusterName, ucr4.getClusterName());
     assertEquals(clusterName, ucr5.getClusterName());
+    assertEquals(clusterName, ucr6.getClusterName());
+    assertEquals(clusterName, ucr7.getClusterName());
     ConfigurationRequest cr1 = ucr1.getDesiredConfig();
     ConfigurationRequest cr2 = ucr2.getDesiredConfig();
     ConfigurationRequest cr3 = ucr3.getDesiredConfig();
     ConfigurationRequest cr4 = ucr4.getDesiredConfig();
     ConfigurationRequest cr5 = ucr5.getDesiredConfig();
+    ConfigurationRequest cr6 = ucr6.getDesiredConfig();
+    ConfigurationRequest cr7 = ucr7.getDesiredConfig();
     assertEquals("1", cr1.getVersionTag());
     assertEquals("1", cr2.getVersionTag());
     assertEquals("1", cr3.getVersionTag());
     assertEquals("1", cr4.getVersionTag());
     assertEquals("1", cr5.getVersionTag());
+    assertEquals("1", cr6.getVersionTag());
+    assertEquals("1", cr7.getVersionTag());
     Map<String, ConfigurationRequest> mapConfigRequests = new HashMap<String, ConfigurationRequest>();
     mapConfigRequests.put(cr1.getType(), cr1);
     mapConfigRequests.put(cr2.getType(), cr2);
     mapConfigRequests.put(cr3.getType(), cr3);
     mapConfigRequests.put(cr4.getType(), cr4);
     mapConfigRequests.put(cr5.getType(), cr5);
-    assertEquals(5, mapConfigRequests.size());
-    ConfigurationRequest globalConfigRequest = mapConfigRequests.get("global");
-    assertEquals(4, globalConfigRequest.getProperties().size());
-    assertEquals("hadoop", globalConfigRequest.getProperties().get("user_group"));
-    assertEquals("ambari-qa", globalConfigRequest.getProperties().get("smokeuser"));
-    assertEquals("default@REPLACEME.NOWHERE", globalConfigRequest.getProperties().get("nagios_contact"));
-    assertEquals("oozie", globalConfigRequest.getProperties().get("oozie_user"));
-    assertNotNull(globalConfigRequest.getPropertiesAttributes());
-    assertEquals(0, globalConfigRequest.getPropertiesAttributes().size());
+    mapConfigRequests.put(cr6.getType(), cr6);
+    mapConfigRequests.put(cr7.getType(), cr7);
+    assertEquals(7, mapConfigRequests.size());
     ConfigurationRequest hiveEnvConfigRequest = mapConfigRequests.get("hive-env");
     assertEquals("New MySQL Database", hiveEnvConfigRequest.getProperties().get("hive_database"));
     assertNotNull(hiveEnvConfigRequest.getPropertiesAttributes());
@@ -2320,7 +2477,7 @@ public class ClusterResourceProviderTest {
     assertNull(updateClusterPropertyMapCapture.getValue());
     assertNull(updateClusterPropertyMapCapture2.getValue());
     assertNull(updateClusterPropertyMapCapture3.getValue());
-    assertNull(updateClusterPropertyMapCapture4.getValue());
+    assertNull(updateClusterPropertyMapCapture5.getValue());
 
     Request serviceRequest = serviceRequestCapture.getValue();
     assertEquals(2, serviceRequest.getProperties().size());