You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ab...@apache.org on 2015/04/02 11:31:04 UTC

ambari git commit: AMBARI-10324 Add-service wizard should use enhanced configs when appropriate. (ababiichuk)

Repository: ambari
Updated Branches:
  refs/heads/trunk 55bfe3aba -> fbc69dce3


AMBARI-10324 Add-service wizard should use enhanced configs when appropriate. (ababiichuk)


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

Branch: refs/heads/trunk
Commit: fbc69dce33cb0afa9598011d89690f2fabbb66db
Parents: 55bfe3a
Author: aBabiichuk <ab...@cybervisiontech.com>
Authored: Thu Apr 2 12:24:04 2015 +0300
Committer: aBabiichuk <ab...@cybervisiontech.com>
Committed: Thu Apr 2 12:24:04 2015 +0300

----------------------------------------------------------------------
 .../global/configuration_controller.js          |   1 -
 .../controllers/main/service/info/configs.js    | 275 ++++++++++++-------
 .../service/manage_config_groups_controller.js  |   1 -
 .../app/controllers/wizard/step7_controller.js  |   2 +-
 .../configs/stack_config_properties_mapper.js   |  23 +-
 .../mixins/common/configs/enhanced_configs.js   | 254 ++---------------
 .../service/configs/preload_requests_chain.js   |  73 ++---
 .../app/models/configs/stack_config_property.js |  51 +++-
 .../common/configs/services_config.hbs          |   5 +
 ambari-web/app/utils/ajax/ajax.js               |   5 +-
 ambari-web/app/utils/config.js                  | 168 +++++------
 ambari-web/app/views/common/controls_view.js    |   2 +-
 .../common/configs/enhanced_configs_test.js     |  20 --
 ambari-web/test/utils/config_test.js            |  39 ---
 14 files changed, 365 insertions(+), 554 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/controllers/global/configuration_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/global/configuration_controller.js b/ambari-web/app/controllers/global/configuration_controller.js
index 9270fac..1f5675f 100644
--- a/ambari-web/app/controllers/global/configuration_controller.js
+++ b/ambari-web/app/controllers/global/configuration_controller.js
@@ -107,7 +107,6 @@ App.ConfigurationController = Em.Controller.extend({
     App.config.loadConfigsByTags(tags).done(function (data) {
       if (data.items) {
         data.items.forEach(function (item) {
-          App.config.loadedConfigurationsCache[item.type + "_" + item.tag] = item.properties;
           loadedConfigs.push(item);
         });
       }

http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/controllers/main/service/info/configs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/info/configs.js b/ambari-web/app/controllers/main/service/info/configs.js
index 185fb48..f9729e5 100644
--- a/ambari-web/app/controllers/main/service/info/configs.js
+++ b/ambari-web/app/controllers/main/service/info/configs.js
@@ -42,11 +42,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
 
   selectedConfigGroup: null,
 
-  configTypesInfo: {
-    items: [],
-    supportsFinal: []
-  },
-
   requestInProgress: null,
 
   selectedServiceConfigTypes: [],
@@ -108,6 +103,32 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
   clusterEnvTagVersion: '',
 
   /**
+   * defines which service configs need to be loaded to stepConfigs
+   * @type {string[]}
+   */
+  servicesToLoad: function() {
+    return this.get('dependentServiceNames').concat([this.get('content.serviceName')]).uniq();
+  }.property('content.serviceName', 'dependentServiceNames'),
+
+  /**
+   * defines which config groups need to be loaded
+   * @type {object[]}
+   */
+  configGroupsToLoad: function() {
+    return this.get('configGroups').concat(this.get('dependentConfigGroups')).uniq();
+  }.property('content.serviceName', 'dependentServiceNames'),
+
+  /**
+   * configs from stack for dependent services
+   * @type {App.StackConfigProperty[]}
+   */
+  advancedConfigs: function() {
+    return App.StackConfigProperty.find().filter(function(scp) {
+      return this.get('servicesToLoad').contains(scp.get('serviceName'));
+    }, this);
+  }.property('content.serviceName'),
+
+  /**
    * @type {boolean}
    */
   isCurrentSelected: function () {
@@ -322,15 +343,12 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
    */
   loadStep: function () {
     console.log("TRACE: Loading configure for service");
-    var self = this;
+    var serviceName = this.get('content.serviceName');
     this.clearStep();
     if (App.get('supports.enhancedConfigs')) {
-      this.loadConfigTheme(this.get('content.serviceName')).always(function() {
-        self.setDependentServices(self.get('content.serviceName'));
-        App.themesMapper.generateAdvancedTabs([self.get('content.serviceName')]);
-        if (self.get('dependentServiceNames.length') > 0) {
-          self.loadConfigCurrentVersions(self.get('dependentServiceNames'));
-        }
+      this.setDependentServices(serviceName);
+      this.loadConfigTheme(serviceName).always(function() {
+        App.themesMapper.generateAdvancedTabs([serviceName]);
       });
     }
     this.loadClusterEnvSite();
@@ -369,7 +387,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
     var selectedConfigGroup = this.get('selectedConfigGroup');
     var serviceName = this.get('content.serviceName');
     //STEP 1: handle tags from JSON data for host overrides
-    var configGroupsWithOverrides = selectedConfigGroup.get('isDefault') && !this.get('isHostsConfigsPage') ? this.get('configGroups') : [selectedConfigGroup];
+    var configGroupsWithOverrides = selectedConfigGroup.get('isDefault') && !this.get('isHostsConfigsPage') ? this.get('configGroupsToLoad') : [selectedConfigGroup].concat(this.get('dependentConfigGroups'));
     configGroupsWithOverrides.forEach(function (item) {
       var groupName = item.get('name');
       if (Em.isNone(this.loadedGroupToOverrideSiteToTagMap[groupName])) {
@@ -382,12 +400,10 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
     }, this);
     //STEP 2: Create an array of objects defining tag names to be polled and new tag names to be set after submit
     this.setServiceConfigTags(this.loadedClusterSiteToTagMap);
-    //STEP 3: Load advanced configs
-    var advancedConfigs = this.get('advancedConfigs');
     //STEP 4: Load on-site config by service from server
     App.router.get('configurationController').getConfigsByTags(this.get('serviceConfigTags')).done(function(configGroups){
       //Merge on-site configs with pre-defined
-      var configSet = App.config.mergePreDefinedWithLoaded(configGroups, advancedConfigs, self.get('serviceConfigTags'), serviceName);
+      var configSet = App.config.mergePreDefinedWithLoaded(configGroups, self.get('advancedConfigs'), self.get('serviceConfigTags'), serviceName);
       configSet = App.config.syncOrderWithPredefined(configSet);
 
       var configs = configSet.configs;
@@ -402,7 +418,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
       self.loadCompareVersionConfigs(self.get('allConfigs')).done(function (isComparison) {
         //Load and add overriden configs of group
         if (!isComparison && (!self.get('selectedConfigGroup').get('isDefault') || self.get('isCurrentSelected'))) {
-          App.config.loadServiceConfigGroupOverrides(self.get('allConfigs'), self.get('loadedGroupToOverrideSiteToTagMap'), self.get('configGroups'), self.onLoadOverrides, self);
+          App.config.loadServiceConfigGroupOverrides(self.get('allConfigs'), self.get('loadedGroupToOverrideSiteToTagMap'), self.get('configGroupsToLoad'), self.onLoadOverrides, self);
         } else {
           self.onLoadOverrides(self.get('allConfigs'));
         }
@@ -594,7 +610,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
       compareObject.set('isFinal', compareConfig.isFinal);
       compareObject.set('value', App.config.formatOverrideValue(serviceConfig, compareConfig.value));
       compareObject.set('compareConfigs', null);
-      this.setSupportsFinal(compareObject);
     }
     return compareObject;
   },
@@ -755,22 +770,24 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
    * @method onLoadOverrides
    */
   onLoadOverrides: function (allConfigs) {
-    var serviceName = this.get('content.serviceName');
-    var advancedConfigs = this.get('advancedConfigs');
-    //STEP 10: creation of serviceConfig object which contains configs for current service
-    var serviceConfig = App.config.createServiceConfig(serviceName);
-    //STEP11: Make SecondaryNameNode invisible on enabling namenode HA
-    if (serviceConfig.get('serviceName') === 'HDFS') {
-      App.config.OnNnHAHideSnn(serviceConfig);
-    }
+    var serviceNames = this.get('servicesToLoad');
+    serviceNames.forEach(function(serviceName) {
+      var serviceConfig = App.config.createServiceConfig(serviceName);
+      //Make SecondaryNameNode invisible on enabling namenode HA
+      if (serviceConfig.get('serviceName') === 'HDFS') {
+        App.config.OnNnHAHideSnn(serviceConfig);
+      }
+      var configsByService = this.get('allConfigs').filterProperty('serviceName', serviceName);
+      this.loadConfigs(configsByService, serviceConfig);
 
-    serviceConfig = App.config.createServiceConfig(this.get('content.serviceName'));
-    this.loadConfigs(this.get('allConfigs'), serviceConfig);
-    this.setVisibilityForRangerProperties(serviceConfig);
-    this.checkOverrideProperty(serviceConfig);
-    this.checkDatabaseProperties(serviceConfig);
-    this.get('stepConfigs').pushObject(serviceConfig);
-    this.set('selectedService', this.get('stepConfigs').objectAt(0));
+      this.get('stepConfigs').pushObject(serviceConfig);
+    }, this);
+
+    var selectedService = this.get('stepConfigs').findProperty('serviceName', this.get('content.serviceName'));
+    this.set('selectedService', selectedService);
+    this.setVisibilityForRangerProperties(selectedService);
+    this.checkOverrideProperty(selectedService);
+    this.checkDatabaseProperties(selectedService);
     this.checkForSecureConfig(this.get('selectedService'));
     this.setProperties({
       dataIsLoaded: true,
@@ -868,7 +885,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
 
     var serviceConfigProperty = App.ServiceConfigProperty.create(_serviceConfigProperty);
 
-    this.setSupportsFinal(serviceConfigProperty);
     this.setValuesForOverrides(overrides, _serviceConfigProperty, serviceConfigProperty, defaultGroupSelected);
     this.setEditability(serviceConfigProperty, defaultGroupSelected);
 
@@ -935,21 +951,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
   },
 
   /**
-   * set supportsFinal property of config for admin
-   * @param {Ember.Object} serviceConfigProperty
-   * @private
-   * @method setSupportsFinal
-   */
-  setSupportsFinal: function (serviceConfigProperty) {
-    if (serviceConfigProperty.get('isMock')) return;
-    var fileName = serviceConfigProperty.get('filename');
-    var matchingConfigType = this.get('configTypesInfo').supportsFinal.find(function(configType) {
-      return fileName.startsWith(configType);
-    });
-    serviceConfigProperty.set('supportsFinal', !!matchingConfigType);
-  },
-
-  /**
    * set override values
    * @param overrides
    * @param _serviceConfigProperty
@@ -961,7 +962,8 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
   setValuesForOverrides: function (overrides, _serviceConfigProperty, serviceConfigProperty, defaultGroupSelected) {
     if (Em.isNone(overrides)) return;
     overrides.forEach(function (override) {
-      if (defaultGroupSelected || (Em.get(override, 'group') && this.get('selectedConfigGroup.name') === Em.get(override, 'group.name'))) {
+      if (defaultGroupSelected || (Em.get(override, 'group') && this.get('selectedConfigGroup.name') === Em.get(override, 'group.name'))
+        || serviceConfigProperty.get('serviceName') !== this.get('content.serviceName')) {
         var newSCP = this.createNewSCP(override, _serviceConfigProperty, serviceConfigProperty, defaultGroupSelected);
         var parentOverridesArray = serviceConfigProperty.get('overrides');
         if (parentOverridesArray == null) {
@@ -1090,13 +1092,39 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
   },
 
   /**
+   * get config properties for that fileNames that was changed
+   * @param stepConfigs
+   * @returns {Array}
+   */
+  getModifiedConfigs: function(stepConfigs) {
+    var modifiedConfigs = stepConfigs
+      // get only modified and created configs
+      .filter(function (config) {
+        return config.get('isNotDefaultValue') || config.get('isNotSaved');
+      })
+      // get file names and add file names that was modified, for example after property removing
+      .mapProperty('filename').concat(this.get('modifiedFileNames')).uniq()
+      // get configs by filename
+      .map(function (fileName) {
+        return stepConfigs.filterProperty('filename', fileName);
+      });
+
+    if (!!modifiedConfigs.length) {
+      // concatenate results
+      modifiedConfigs = modifiedConfigs.reduce(function (current, prev) {
+        return current.concat(prev);
+      });
+    }
+    return modifiedConfigs;
+  },
+
+  /**
    * Save changed configs and config groups
    * @method saveConfigs
    */
   saveConfigs: function () {
     var selectedConfigGroup = this.get('selectedConfigGroup');
     var configs = this.get('stepConfigs').findProperty('serviceName', this.get('content.serviceName')).get('configs');
-    var self = this;
 
     if (selectedConfigGroup.get('isDefault')) {
       if (this.get('content.serviceName') === 'YARN') {
@@ -1107,24 +1135,8 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
        * generates list of properties that was changed
        * @type {Array}
        */
-      var modifiedConfigs = configs
-        // get only modified and created configs
-        .filter(function (config) {
-          return config.get('isNotDefaultValue') || config.get('isNotSaved');
-        })
-        // get file names and add file names that was modified, for example after property removing
-        .mapProperty('filename').concat(this.get('modifiedFileNames')).uniq()
-        // get configs by filename
-        .map(function (fileName) {
-          return configs.filterProperty('filename', fileName);
-        });
+      var modifiedConfigs = this.getModifiedConfigs(configs);
 
-      if (!!modifiedConfigs.length) {
-        // concatenate results
-        modifiedConfigs = modifiedConfigs.reduce(function (current, prev) {
-          return current.concat(prev);
-        });
-      }
       // save modified original configs that have no group
       this.saveSiteConfigs(modifiedConfigs.filter(function (config) {
         return !config.get('group');
@@ -1137,44 +1149,94 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
       this.doPUTClusterConfigurations();
 
     } else {
-      var overridenConfigs = [];
-      var groupHosts = [];
-      configs.filterProperty('isOverridden', true).forEach(function (config) {
-        overridenConfigs = overridenConfigs.concat(config.get('overrides'));
-      });
-      // find custom original properties that assigned to selected config group
-      overridenConfigs = overridenConfigs.concat(configs.filterProperty('group')
-        .filter(function (config) {
-          return config.get('group.name') == self.get('selectedConfigGroup.name');
-        }));
 
-      this.formatConfigValues(overridenConfigs);
-      selectedConfigGroup.get('hosts').forEach(function (hostName) {
-        groupHosts.push({"host_name": hostName});
-      });
+      var overridenConfigs = this.getConfigsForGroup(configs, selectedConfigGroup.get('name'));
 
       /**
        * if there are some changes in dependent configs
        * need to save these config to in separate request
        */
-      this.saveDependentGroups();
-
-      this.putConfigGroupChanges({
-        ConfigGroup: {
-          "id": selectedConfigGroup.get('id'),
-          "cluster_name": App.get('clusterName'),
-          "group_name": selectedConfigGroup.get('name'),
-          "tag": selectedConfigGroup.get('service.id'),
-          "description": selectedConfigGroup.get('description'),
-          "hosts": groupHosts,
-          "service_config_version_note": this.get('serviceConfigVersionNote'),
-          "desired_configs": this.buildGroupDesiredConfigs(overridenConfigs)
+      this.get('dependentServiceNames').forEach(function(serviceName) {
+        var serviceConfig = this.get('stepConfigs').findProperty('serviceName', serviceName);
+        if (serviceConfig && this.get('changedProperties').findProperty('serviceName', serviceName) && this.get('groupsToSave')[serviceName]) {
+          var stepConfigs = serviceConfig.get('configs');
+
+          if (this.get('groupsToSave')[serviceName].contains('Default')) {
+            var data = [];
+
+            var modifiedConfigs = this.getModifiedConfigs(stepConfigs);
+
+            var fileNamesToSave = modifiedConfigs.mapProperty('filename').uniq();
+
+            var dependentConfigsToSave = this.generateDesiredConfigsJSON(modifiedConfigs, fileNamesToSave, this.get('serviceConfigNote'));
+
+            if (dependentConfigsToSave.length > 0) {
+              data.pushObject(JSON.stringify({
+                Clusters: {
+                  desired_config: dependentConfigsToSave
+                }
+              }));
+            }
+            this.doPUTClusterConfigurationSites(data, false);
+          } else {
+            var overridenConfigs = this.getConfigsForGroup(stepConfigs, selectedConfigGroup.get('name'));
+            var group = this.get('dependentConfigGroups').findProperty('name', this.get('groupsToSave')[serviceName]);
+            this.saveGroup(overridenConfigs, group, false);
+          }
         }
-      }, true);
+      }, this);
+
+      this.saveGroup(overridenConfigs, selectedConfigGroup, true);
     }
   },
 
   /**
+   * get configs that belongs to config group
+   * @param stepConfigs
+   * @param configGroupName
+   */
+  getConfigsForGroup: function(stepConfigs, configGroupName) {
+    var overridenConfigs = [];
+
+    stepConfigs.filterProperty('isOverridden', true).forEach(function (config) {
+      overridenConfigs = overridenConfigs.concat(config.get('overrides'));
+    });
+    // find custom original properties that assigned to selected config group
+    overridenConfigs = overridenConfigs.concat(stepConfigs.filterProperty('group')
+      .filter(function (config) {
+        return config.get('group.name') == configGroupName;
+      }));
+
+    this.formatConfigValues(overridenConfigs);
+    return overridenConfigs;
+  },
+
+  /**
+   * save config group
+   * @param overridenConfigs
+   * @param selectedConfigGroup
+   * @param showPopup
+   */
+  saveGroup: function(overridenConfigs, selectedConfigGroup, showPopup) {
+    var groupHosts = [];
+    var fileNamesToSave = overridenConfigs.mapProperty('filename');
+    selectedConfigGroup.get('hosts').forEach(function (hostName) {
+      groupHosts.push({"host_name": hostName});
+    });
+    this.putConfigGroupChanges({
+      ConfigGroup: {
+        "id": selectedConfigGroup.get('id'),
+        "cluster_name": App.get('clusterName'),
+        "group_name": selectedConfigGroup.get('name'),
+        "tag": selectedConfigGroup.get('service.id'),
+        "description": selectedConfigGroup.get('description'),
+        "hosts": groupHosts,
+        "service_config_version_note": this.get('serviceConfigVersionNote'),
+        "desired_configs": this.generateDesiredConfigsJSON(overridenConfigs, fileNamesToSave, null, true)
+      }
+    }, showPopup);
+  },
+  /**
    * On save configs handler. Open save configs popup with appropriate message
    * @private
    * @method onDoPUTClusterConfigurations
@@ -1747,7 +1809,14 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
          * if there are such configs
          */
         this.get('dependentServiceNames').forEach(function(serviceName) {
-          var dependentConfigsToSave = this.getDependentConfigObject(serviceName);
+
+          var serviceConfigs = this.get('stepConfigs').findProperty('serviceName', serviceName).get('configs');
+
+          var modifiedConfigs = this.getModifiedConfigs(serviceConfigs);
+
+          var fileNamesToSave = modifiedConfigs.mapProperty('filename').uniq();
+
+          var dependentConfigsToSave = this.generateDesiredConfigsJSON(modifiedConfigs, fileNamesToSave, this.get('serviceConfigNote'));
           if (dependentConfigsToSave.length > 0) {
             data.pushObject(JSON.stringify({
               Clusters: {
@@ -1757,7 +1826,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
           }
         }, this);
       }
-      this.doPUTClusterConfigurationSites(data);
+      this.doPUTClusterConfigurationSites(data, true);
     } else {
       this.onDoPUTClusterConfigurations();
     }
@@ -1910,19 +1979,23 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM
    * Saves configuration of set of sites. The provided data
    * contains the site name and tag to be used.
    * @param {Object[]} services
+   * @param {boolean} showPopup
    * @return {$.ajax}
    * @method doPUTClusterConfigurationSites
    */
-  doPUTClusterConfigurationSites: function (services) {
-    return App.ajax.send({
+  doPUTClusterConfigurationSites: function (services, showPopup) {
+    var ajaxData = {
       name: 'common.across.services.configurations',
       sender: this,
       data: {
         data: '[' + services.toString() + ']'
       },
-      success: 'doPUTClusterConfigurationSiteSuccessCallback',
       error: 'doPUTClusterConfigurationSiteErrorCallback'
-    });
+    };
+    if (showPopup) {
+      ajaxData.success = 'doPUTClusterConfigurationSiteSuccessCallback'
+    }
+    return App.ajax.send(ajaxData);
   },
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/controllers/main/service/manage_config_groups_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/manage_config_groups_controller.js b/ambari-web/app/controllers/main/service/manage_config_groups_controller.js
index 3cbb229..6842323 100644
--- a/ambari-web/app/controllers/main/service/manage_config_groups_controller.js
+++ b/ambari-web/app/controllers/main/service/manage_config_groups_controller.js
@@ -250,7 +250,6 @@ App.ManageConfigGroupsController = Em.Controller.extend({
   onLoadPropertiesSuccess: function (data, opt, params) {
     data.items.forEach(function (configs) {
       var typeTagConfigs = [];
-      App.config.loadedConfigurationsCache[configs.type + "_" + configs.tag] = configs.properties;
       var group = params.typeTagToGroupMap[configs.type + "///" + configs.tag];
       for (var config in configs.properties) {
         typeTagConfigs.push(Em.Object.create({

http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/controllers/wizard/step7_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step7_controller.js b/ambari-web/app/controllers/wizard/step7_controller.js
index e91f6cb..f8dad20 100644
--- a/ambari-web/app/controllers/wizard/step7_controller.js
+++ b/ambari-web/app/controllers/wizard/step7_controller.js
@@ -27,7 +27,7 @@ var App = require('app');
  *
  */
 
-App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, {
+App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.EnhancedConfigsMixin, {
 
   name: 'wizardStep7Controller',
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/mappers/configs/stack_config_properties_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/configs/stack_config_properties_mapper.js b/ambari-web/app/mappers/configs/stack_config_properties_mapper.js
index afec5e6..9220b3f 100644
--- a/ambari-web/app/mappers/configs/stack_config_properties_mapper.js
+++ b/ambari-web/app/mappers/configs/stack_config_properties_mapper.js
@@ -25,6 +25,7 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({
     display_name: 'StackConfigurations.property_display_name',
     file_name: 'StackConfigurations.type',
     description: 'StackConfigurations.property_description',
+    value: 'StackConfigurations.property_value',
     default_value: 'StackConfigurations.property_value',
     type: 'StackConfigurations.property_type',
     service_name: 'StackConfigurations.service_name',
@@ -32,11 +33,13 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({
     stack_version: 'StackConfigurations.stack_version',
     property_depended_by: 'StackConfigurations.property_depended_by',
     value_attributes: 'StackConfigurations.property_value_attributes',
+    is_final: 'default_is_final',
     default_is_final: 'default_is_final',
     supports_final: 'supports_final',
-    widget: 'widget'
-    //display_type: 'display_type', //not used for now
-    //category_name: 'category_name' //not used for now
+    widget: 'widget',
+    /**** ui properties ***/
+    display_type: 'display_type',
+    category: 'category'
   },
 
   map: function (json) {
@@ -56,20 +59,21 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({
            * for now is not used; uncomment in will be needed
            * this.mergeWithUI(config);
            */
+          this.mergeWithUI(config);
           configs.push(this.parseIt(config, this.get('config')));
         }, this);
       }, this);
       App.store.loadMany(this.get('model'), configs);
     }
     console.timeEnd('stackConfigMapper execution time');
-  }
+  },
 
   /******************* METHODS TO MERGE STACK PROPERTIES WITH STORED ON UI (NOT USED FOR NOW)*********************************/
 
   /**
    * configs that are stored on UI
    * @type {Object[]};
-   *
+   */
   preDefinedSiteProperties: function () {
     var file = App.get('isHadoop22Stack') ? require('data/HDP2.2/site_properties') : require('data/HDP2/site_properties');
     return file.configProperties;
@@ -80,10 +84,11 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({
    * if there is such property - adds some info to config object
    * @param {Object} config
    * @method mergeWithUI
-   *
+   */
   mergeWithUI: function(config) {
     var uiConfigProperty = this.getUIConfig(config.StackConfigurations.property_name, config.StackConfigurations.type);
-    config.category_name = uiConfigProperty ? uiConfigProperty.category : 'General';
+    config.display_name = uiConfigProperty ? uiConfigProperty.displayName : config.StackConfigurations.display_name;
+    config.category = uiConfigProperty ? uiConfigProperty.category : 'Advanced ' + App.config.getConfigTagFromFileName(config.StackConfigurations.type);
     config.display_type = uiConfigProperty ? uiConfigProperty.displayType : 'string';
   },
 
@@ -94,8 +99,8 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({
    * @param siteName
    * @returns {Object|null}
    * @method getUIConfig
-   *
+   */
   getUIConfig: function(propertyName, siteName) {
     return this.get('preDefinedSiteProperties').filterProperty('filename', siteName).findProperty('name', propertyName);
-  }*/
+  }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/mixins/common/configs/enhanced_configs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/configs/enhanced_configs.js b/ambari-web/app/mixins/common/configs/enhanced_configs.js
index 6de333a..876823b 100644
--- a/ambari-web/app/mixins/common/configs/enhanced_configs.js
+++ b/ambari-web/app/mixins/common/configs/enhanced_configs.js
@@ -95,82 +95,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
    * @type {Object}
    */
   groupsToSave: {},
-
-  /***********************************METHODS THAT WORKS WITH MODEL ********************************************/
-
-  /**
-   * generates desired_config objects for default config group
-   * @returns {Object}
-   * @method getDependentConfigObject
-   */
-  getDependentConfigObject: function(serviceName) {
-
-    var fileNamesToSave = this._getFileNamesToSave(serviceName);
-
-    var configsToSave = this._getConfigsToSave(fileNamesToSave);
-
-    return this.generateDesiredConfigsJSON(configsToSave, fileNamesToSave, this.get('serviceConfigNote'));
-  },
-
-  /**
-   * generates data and save configs for not default groups only
-   * that uses configs from model App.ConfigProperty
-   * @param serviceName
-   * @param configGroup
-   * @method saveEnhancedConfigsAndGroup
-   */
-  saveModelConfigsWithGroup: function(serviceName, configGroup) {
-    /**
-     * for now we are saving configs from model only for dependent services
-     * so excluding situation in current service is trying to be saved
-     * this is temporary solution
-     */
-    if (this.get('content.serviceName') !== serviceName) {
-
-      var configsToSave = App.ConfigProperty.find().filter(function(cp) {
-        return cp.get('configVersion.groupName') == configGroup.get('name') || cp.get('isNotSaved');
-      });
-      if (configsToSave.length > 0) {
-        var hostNames = configGroup.get('hosts').map(function(hostName) {
-          return  {
-            "host_name": hostName
-          }
-        });
-
-        var fileNamesToSave = configsToSave.mapProperty('fileName').uniq();
-
-        this.putConfigGroupChanges({
-          ConfigGroup: {
-            "id": configGroup.get('id'),
-            "cluster_name": App.get('clusterName'),
-            "group_name": configGroup.get('name'),
-            "tag": configGroup.get('service.id'),
-            "description": configGroup.get('description'),
-            "hosts": hostNames,
-            "service_config_version_note": this.get('serviceConfigNote'),
-            "desired_configs": this.generateDesiredConfigsJSON(configsToSave, fileNamesToSave, null, true)
-          }
-        })
-      }
-    }
-  },
-
-  /**
-   * save configs from model to default config group
-   * @param serviceName
-   */
-  saveModelConfigs: function(serviceName) {
-    var desired_configs = this.getDependentConfigObject(serviceName);
-    if (desired_configs.length > 0) {
-      var data = [JSON.stringify({
-        Clusters: {
-          desired_config: desired_configs
-        }
-      })];
-      this.doPUTClusterConfigurationSites(data);
-    }
-  },
-
   /********************************METHODS THAT GENERATES JSON TO SAVE *****************************************/
 
   /**
@@ -189,7 +113,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
 
       fileNamesToSave.forEach(function(fName) {
         if (this.allowSaveSite(fName)) {
-          var properties = configsToSave.filterProperty('fileName', fName);
+          var properties = configsToSave.filterProperty('filename', fName);
           var type = App.config.getConfigTagFromFileName(fName);
           desired_config.push(this.createDesiredConfig(type, tagVersion, properties, serviceConfigNote, isNotDefaultGroup));
         }
@@ -303,26 +227,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
 
 
   /**
-   * saves properties for dependent service to config group based on <code>groupsToSave<code>
-   */
-  saveDependentGroups: function() {
-    if (App.get('supports.enhancedConfigs') && this.get('dependentServiceNames.length') && Object.keys(this.get('groupsToSave')).length > 0) {
-
-      this.get('dependentServiceNames').forEach(function(serviceName) {
-        if (this.get('groupsToSave')[serviceName]) {
-          if (this.get('groupsToSave')[serviceName].contains('Default')) {
-            this.saveModelConfigs(serviceName);
-          } else {
-            this.saveModelConfigsWithGroup(serviceName, this.get('dependentConfigGroups').findProperty('name', this.get('groupsToSave')[serviceName]));
-          }
-        }
-      }, this);
-
-    }
-  },
-
-
-  /**
    * runs <code>setDependentServicesAndFileNames<code>
    * for stack properties for current service
    * @method loadDependentConfigs
@@ -336,17 +240,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
   },
 
   /**
-   * get service for current config type
-   * @param {String} configType - config fileName without xml
-   * @return App.StackService
-   */
-  getServiceByConfigType: function(configType) {
-    return App.StackService.find().find(function(s) {
-      return Object.keys(s.get('configTypes')).contains(configType);
-    });
-  },
-
-  /**
    * show popup to select config group for dependent services
    * to which dependent configs will ve saved
    * @method showSelectGroupsPopup
@@ -499,35 +392,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
   },
 
   /**
-   * get file names that need to be saved
-   * used for default config group
-   * @param {String} serviceName
-   * @returns {Ember.Enumerable}
-   * @private
-   */
-  _getFileNamesToSave: function(serviceName) {
-    return App.ConfigProperty.find().filter(function(cp) {
-      return cp.get('isNotDefaultValue') && cp.get('stackConfigProperty.serviceName') === serviceName;
-    }, this).mapProperty('fileName').uniq();
-  },
-
-  /**
-   * get configs that need to be saved, for default group
-   * @param fileNamesToSave
-   * @returns {App.ConfigProperty[]}
-   * @private
-   */
-  _getConfigsToSave: function(fileNamesToSave) {
-    if (Em.isArray(fileNamesToSave) && fileNamesToSave.length) {
-      return App.ConfigProperty.find().filter(function(cp) {
-        return fileNamesToSave.contains(cp.get('fileName')) && cp.get('configVersion.isCurrent');
-      });
-    } else {
-      return Em.A([]);
-    }
-  },
-
-  /**
    * save values that are stored in <code>_dependentConfigValues<code>
    * for current service to step configs
    * for dependent services to model
@@ -537,11 +401,12 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
     var self = this;
     this.get('_dependentConfigValues').forEach(function(dependentConfig) {
       if (Em.get(dependentConfig, 'saveRecommended')) { // if saveRecommended is false leave properties as is
-        if (Em.get(dependentConfig, 'serviceName') === self.get('content.serviceName')) { //for current service save dependent properties to step configs
-          self.get('stepConfigs').objectAt(0).get('configs').forEach(function(stepConfig) {
+        self.get('stepConfigs').forEach(function(serviceConfigs) {
+          serviceConfigs.get('configs').forEach(function(stepConfig) {
             if (stepConfig.get('filename') === App.config.getOriginalFileName(Em.get(dependentConfig, 'fileName'))
               && stepConfig.get('name') === Em.get(dependentConfig, 'propertyName')) {
-              if (self.get('selectedConfigGroup.isDefault')) {
+              if (self.get('selectedConfigGroup.isDefault') || (self.get('groupsToSave')[Em.get(dependentConfig, 'serviceName')]
+                && self.get('groupsToSave')[Em.get(dependentConfig, 'serviceName')].contains('Default'))) {
                 stepConfig.set('value', Em.get(dependentConfig, 'recommendedValue'))
               } else {
                 if (!stepConfig.get('overrides')) {
@@ -556,33 +421,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
               }
             }
           })
-        } else { //for not current service save dependent properties to model
-
-          App.ConfigProperty.find().forEach(function(cp) {
-            if (cp.get('name') === Em.get(dependentConfig, 'propertyName')
-              && cp.get('fileName') === App.config.getOriginalFileName(Em.get(dependentConfig, 'fileName'))) {
-
-              if (self.get('selectedConfigGroup.isDefault') || Em.get(dependentConfig, 'configGroup').contains('Default')) {
-                if (cp.get('isOriginalSCP')) {
-                  cp.set('value', Em.get(dependentConfig, 'recommendedValue'))
-                }
-              } else {
-                if (cp.get('configVersion.groupName') === self.get('groupsToSave')[dependentConfig.serviceName]) {
-                  cp.set('value', Em.get(dependentConfig, 'recommendedValue'));
-                } else {
-                  App.store.load(App.ConfigProperty, {
-                    id: Em.get(dependentConfig, 'propertyName') + '_' + Em.get(dependentConfig, 'fileName') + '_',
-                    name: Em.get(dependentConfig, 'propertyName'),
-                    value: Em.get(dependentConfig, 'recommendedValue'),
-                    file_name: App.config.getOriginalFileName(Em.get(dependentConfig, 'fileName')),
-                    is_not_saved: true
-                  })
-                }
-              }
-
-            }
-          });
-        }
+        });
       }
     });
   },
@@ -597,8 +436,8 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
     var self = this;
     this.get('_dependentConfigValues').forEach(function(dependentConfig) {
       if (!Em.get(dependentConfig, 'saveRecommended')) { // if saveRecommended is false leave properties as is
-        if (Em.get(dependentConfig, 'serviceName') === self.get('content.serviceName')) { //for current service save dependent properties to step configs
-          self.get('stepConfigs').objectAt(0).get('configs').forEach(function(stepConfig) {
+        self.get('stepConfigs').forEach(function(serviceConfigs) {
+          serviceConfigs.get('configs').forEach(function(stepConfig) {
             if (stepConfig.get('filename') === App.config.getOriginalFileName(Em.get(dependentConfig, 'fileName'))
               && stepConfig.get('name') === Em.get(dependentConfig, 'propertyName')) {
               if (self.get('selectedConfigGroup.isDefault')) {
@@ -618,30 +457,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
               }
             }
           })
-        } else { //for not current service save dependent properties to model
-
-          App.ConfigProperty.find().forEach(function(cp) {
-            if (cp.get('name') === Em.get(dependentConfig, 'propertyName')
-              && cp.get('fileName') === App.config.getOriginalFileName(Em.get(dependentConfig, 'fileName'))) {
-
-              if (self.get('selectedConfigGroup.isDefault') || Em.get(dependentConfig, 'configGroup').contains('Default')) {
-                if (cp.get('isOriginalSCP')) {
-                  cp.set('value', Em.get(dependentConfig, 'value'))
-                }
-              } else {
-                if (cp.get('configVersion.groupName') === self.get('groupsToSave')[dependentConfig.serviceName]) {
-                  if (cp.get('isNotSaved')) {
-                    cp.deleteRecord();
-                    App.store.commit();
-                  } else {
-                    cp.set('value', Em.get(dependentConfig, 'value'));
-                  }
-                }
-              }
-
-            }
-          });
-        }
+        });
       }
     });
     this.set('recommendationTimeStamp', (new Date).getTime());
@@ -653,7 +469,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
    * for not default group - overriden property in case there is such property in group
    * otherwise - property from default group
    * @param stepConfigs
-   * @returns {App.ServiceConfigProperty[]}
+   * @returns {Object[]}
    * @private
    */
   _getConfigsByGroup: function(stepConfigs) {
@@ -661,17 +477,17 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
     if (this.get('selectedConfigGroup.isDefault')) {
       return stepConfigs;
     } else {
-      stepConfigs.forEach(function(stepConfig) {
-        if (stepConfig.get('overrides')) {
-          var conf = stepConfig.get('overrides').findProperty('group.name', this.get('selectedConfigGroup.name'));
-          if (conf) {
-            configsToSend.pushObject(conf);
+      stepConfigs.forEach(function(serviceConfig) {
+        var stepConfigToSend = [];
+        serviceConfig.get('configs').forEach(function(stepConfig) {
+          if (stepConfig.get('overrides')) {
+            var conf = stepConfig.get('overrides').findProperty('group.name', this.get('selectedConfigGroup.name'));
+            stepConfigToSend.pushObject(conf ? conf : stepConfig);
           } else {
-            configsToSend.pushObject(stepConfig);
+            stepConfigToSend.pushObject(stepConfig);
           }
-        } else {
-          configsToSend.pushObject(stepConfig);
-        }
+        }, this);
+        configsToSend.pushObject(stepConfigToSend);
       }, this)
     }
     return configsToSend;
@@ -688,7 +504,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
     var configs = data.resources[0].recommendations.blueprint.configurations;
     for (var key in configs) {
       for (var propertyName in configs[key].properties) {
-        var service = this.getServiceByConfigType(key);
+        var service = App.config.getServiceByConfigType(key);
         var value = this._getCurrentValue(service.get('serviceName'), key, propertyName, this.get('selectedConfigGroup'));
         if (!Em.isNone(value)) {
           var dependentProperty = this.get('_dependentConfigValues').findProperty('propertyName', propertyName);
@@ -696,8 +512,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
             if (value != configs[key].properties[propertyName]) {
               Em.set(dependentProperty, 'value', value);
               Em.set(dependentProperty, 'recommendedValue', configs[key].properties[propertyName]);
-            } else {
-              this.get('_dependentConfigValues').removeObject(dependentProperty);
             }
           } else {
             var configGroup = this.get('selectedConfigGroup.isDefault') ?
@@ -728,16 +542,18 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
    * @returns {null|Object}
    * @private
    */
-  _getCurrentValue: function(serviceName, tag, propertyName, configGroup) {
-    if (serviceName == this.get('content.serviceName')) {
-      var stepConfig = this.get('stepConfigs').objectAt(0).get('configs').find(function(stepConfig) {
+  _getCurrentValue: function (serviceName, tag, propertyName, configGroup) {
+    var serviceConfig = this.get('stepConfigs').findProperty('serviceName', serviceName);
+    var groupForService = serviceName == this.get('content.serviceName') ? configGroup.get('name') : this.get('groupsToSave')[serviceName];
+    if (serviceConfig) {
+      var stepConfig = serviceConfig.get('configs').find(function (stepConfig) {
         return (stepConfig.get('filename') === App.config.getOriginalFileName(tag) && stepConfig.get('name') === propertyName);
       });
       if (stepConfig) {
         if (configGroup.get('isDefault') || Em.isNone(stepConfig.get('overrides'))) {
           return stepConfig.get('value');
         } else {
-          var overridenConfig = stepConfig.get('overrides').findProperty('group.name', configGroup.get('name'));
+          var overridenConfig = stepConfig.get('overrides').findProperty('group.name', groupForService);
           if (overridenConfig) {
             return overridenConfig.get('value');
           } else {
@@ -745,24 +561,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
           }
         }
       }
-    } else {
-      var currentDefaultProperties = App.ConfigProperty.find().filter(function(cp) {
-        return cp.get('configVersion.isCurrent') && cp.get('configVersion.isDefault');
-      });
-      if (!this.get('selectedConfigGroup.isDefault') && (!this.get('groupsToSave')[serviceName] || !this.get('groupsToSave')[serviceName].contains('Default'))) {
-        var currentProperties = App.ConfigProperty.find().filter(function(cp) {
-          return cp.get('configVersion.isCurrent') && cp.get('configVersion.groupName') === this.get('groupsToSave')[serviceName];
-        }, this);
-        var modelConfig = currentProperties.findProperty('name', propertyName);
-        if (modelConfig) {
-          return modelConfig.get('value');
-        }
-      }
-
-      var modelDefaultConfig = currentDefaultProperties.findProperty('name', propertyName);
-      if (modelDefaultConfig) {
-        return modelDefaultConfig.get('value');
-      }
     }
     return null;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/mixins/main/service/configs/preload_requests_chain.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/main/service/configs/preload_requests_chain.js b/ambari-web/app/mixins/main/service/configs/preload_requests_chain.js
index b40b567..09e7b16 100644
--- a/ambari-web/app/mixins/main/service/configs/preload_requests_chain.js
+++ b/ambari-web/app/mixins/main/service/configs/preload_requests_chain.js
@@ -25,14 +25,11 @@ var App = require('app');
  * Chain:
  *    - loadClusterEnvSite
  *      |- (on success callback)
- *          loadServiceConfigs
- *            |- App.config.loadAdvancedConfig
- *                | - (on complete callback)
- *                    loadServiceConfigVersions
- *                      |- (on success callback)
- *                          loadSelectedVersion
- *                            |- (on complete callback)
- *                                loadServiceTagsAndGroups
+ *         loadServiceConfigVersions
+ *           |- (on success callback)
+ *              loadSelectedVersion
+ *                 |- (on complete callback)
+ *                    loadServiceTagsAndGroups
  * @type {Ember.Mixin}
  */
 App.PreloadRequestsChainMixin = Em.Mixin.create({
@@ -70,33 +67,7 @@ App.PreloadRequestsChainMixin = Em.Mixin.create({
     // find the latest tag version
     var maxVersion = Math.max.apply(this, data.items.mapProperty('version'));
     this.set('clusterEnvTagVersion', data.items.findProperty('version', maxVersion).tag);
-    this.loadServiceConfigs();
-  },
-
-  /**
-   * Loads service configurations
-   * @private
-   * @method loadServiceConfigs
-   */
-  loadServiceConfigs: function () {
-    var advancedConfigs = [];
-    var self = this;
-    var serviceName = this.get('content.serviceName');
-
-    var stackService = App.StackService.find().findProperty('serviceName', serviceName);
-    if (stackService) {
-      self.set('configTypesInfo', App.config.getConfigTypesInfoFromService(stackService));
-    }
-
-    this.trackRequest(App.config.loadAdvancedConfig(serviceName, function (properties, xhr) {
-      if (xhr.statusText === 'abort') return;
-      advancedConfigs.pushObjects(properties);
-      self.set('advancedConfigs', advancedConfigs);
-      self.trackRequest(App.config.loadClusterConfig(function(clusterProperties) {
-        self.get('advancedConfigs').pushObjects(clusterProperties);
-        self.trackRequest(self.loadServiceConfigVersions());
-      }));
-    }));
+    this.trackRequest(this.loadServiceConfigVersions());
   },
 
   /**
@@ -163,14 +134,17 @@ App.PreloadRequestsChainMixin = Em.Mixin.create({
     if (self.get('dataIsLoaded') && switchToGroup) {
       this.set('selectedConfigGroup', switchToGroup);
     }
-
+    var data = {
+      serviceName: this.get('content.serviceName'),
+      serviceConfigVersions: versions
+    };
+    if (App.get('supports.enhancedConfigs') && this.get('dependentServiceNames.length')) {
+      data.additionalParams = '|service_name.in(' +  this.get('dependentServiceNames') + ')&is_current=true';
+    }
     this.trackRequest(App.ajax.send({
       name: 'service.serviceConfigVersions.get.multiple',
       sender: this,
-      data: {
-        serviceName: this.get('content.serviceName'),
-        serviceConfigVersions: versions
-      },
+      data: data,
       success: 'loadSelectedVersionSuccess'
     }).complete(function (xhr) {
         if (xhr.statusText === 'abort') return;
@@ -194,7 +168,7 @@ App.PreloadRequestsChainMixin = Em.Mixin.create({
       sender: this,
       data: {
         serviceName: this.get('content.serviceName'),
-        urlParams: "&config_groups/ConfigGroup/tag.in(" + [this.get('content.serviceName')].concat(this.get('dependentServiceNames')).join(',')+ ')'
+        urlParams: "&config_groups/ConfigGroup/tag.in(" + this.get('servicesToLoad').join(',') + ')'
       },
       success: 'loadServiceConfigsSuccess'
     }));
@@ -209,9 +183,14 @@ App.PreloadRequestsChainMixin = Em.Mixin.create({
    * @method loadSelectedVersionSuccess
    */
   loadSelectedVersionSuccess: function (data, opt, params) {
-    var serviceConfigsDef = this.get('serviceConfigs').findProperty('serviceName', this.get('content.serviceName'));
+    var serviceConfigsDef = this.get('serviceConfigs').filter(function(serviceConfig) {
+      return this.get('servicesToLoad').contains(serviceConfig.get('serviceName'));
+    }, this);
     var siteToTagMap = {};
-    var configTypesRendered = Object.keys(serviceConfigsDef.get('configTypesRendered'));
+    var configTypesRendered = [];
+    serviceConfigsDef.forEach(function(s) {
+      configTypesRendered = configTypesRendered.concat(Object.keys(s.get('configTypesRendered')));
+    });
     var selectedVersion = params.serviceConfigVersions.length > 1 ? params.serviceConfigVersions[1] : params.serviceConfigVersions[0];
     var configurations = [];
 
@@ -222,7 +201,7 @@ App.PreloadRequestsChainMixin = Em.Mixin.create({
           configurations = item.configurations;
           if (item.configurations.someProperty('type', siteName)) {
             siteToTagMap[siteName] = item.configurations.findProperty('type', siteName).tag;
-          } else {
+          } else if (!siteToTagMap[siteName]) {
             siteToTagMap[siteName] = 'version1';
           }
         } else {
@@ -320,6 +299,12 @@ App.PreloadRequestsChainMixin = Em.Mixin.create({
             service: App.Service.find().findProperty('serviceName', item.tag),
             hosts: item.hosts.mapProperty('host_name')
           });
+          item.desired_configs.forEach(function (config) {
+            newDependentConfigGroup.configSiteTags.push(App.ConfigSiteTag.create({
+              site: config.type,
+              tag: config.tag
+            }));
+          }, this);
           if (!this.get('dependentConfigGroups').findProperty('name', item.group_name)) {
             this.get('dependentConfigGroups').push(newDependentConfigGroup);
           }

http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/models/configs/stack_config_property.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/configs/stack_config_property.js b/ambari-web/app/models/configs/stack_config_property.js
index 4a87b36..5f66049 100644
--- a/ambari-web/app/models/configs/stack_config_property.js
+++ b/ambari-web/app/models/configs/stack_config_property.js
@@ -44,6 +44,14 @@ App.StackConfigProperty = DS.Model.extend({
   fileName: DS.attr('string'),
 
   /**
+   * same as fileName
+   * @property {string}
+   */
+  filename: function() {
+    return this.get('fileName');
+  }.property('fileName'),
+
+  /**
    * description of config property meaning
    * @property {string}
    */
@@ -75,20 +83,6 @@ App.StackConfigProperty = DS.Model.extend({
   type: DS.attr('array', {defaultValue: []}),
 
   /**
-   * defines what kind of value this property contains
-   * ex: string, digits, number, directories, custom
-   * @property {string}
-   */
-  displayType: DS.attr('string', {defaultValue: 'string'}),
-
-  /**
-   * defines category name of property
-   * used for advanced tab
-   * @property {string}
-   */
-  categoryName: DS.attr('string'),
-
-  /**
    * service name
    * @property {string}
    */
@@ -153,8 +147,35 @@ App.StackConfigProperty = DS.Model.extend({
    * sub section to which belongs this property
    * @property {App.SubSection}
    */
-  subSection: DS.belongsTo('App.SubSection')
+  subSection: DS.belongsTo('App.SubSection'),
+
+  /******************************* UI properties ****************************************/
+
+  /**
+   * defines what kind of value this property contains
+   * ex: string, digits, number, directories, custom
+   * @property {string}
+   */
+  displayType: DS.attr('string', {defaultValue: 'string'}),
 
+  /**
+   * defines category name of property
+   * used for advanced tab
+   * @property {string}
+   */
+  category: DS.attr('string'),
+
+  /**
+   * config property value same as default
+   * @property {string}
+   */
+  value: DS.attr('string'),
+
+  /**
+   * config property isFinal value same as defaultIsFinal
+   * @property {boolean}
+   */
+  isFinal: DS.attr('boolean', {defaultValue: false})
 });
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/templates/common/configs/services_config.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/configs/services_config.hbs b/ambari-web/app/templates/common/configs/services_config.hbs
index 0076c11..328a954 100644
--- a/ambari-web/app/templates/common/configs/services_config.hbs
+++ b/ambari-web/app/templates/common/configs/services_config.hbs
@@ -31,6 +31,11 @@
 {{else}}
     <div class="spinner"></div>
 {{/if}}
+{{#if hasChangedDependencies}}
+  <div class="alert alert-warning">
+    <span>{{dependenciesMessage}}</span> <a href="#" {{action "showChangedDependentConfigs" target="controller"}}>{{t common.showDetails}}</a>
+  </div>
+{{/if}}
 {{view App.ServiceConfigContainerView}}
 {{#if controller.isRecommendedLoaded}}
     <p class="loading align-center"></p>

http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js
index ab722cc..22e5715 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -2316,11 +2316,12 @@ var urls = {
     mock: '/data/configurations/service_version.json'
   },
   'service.serviceConfigVersions.get.multiple': {
-    real: '/clusters/{clusterName}/configurations/service_config_versions?service_name={serviceName}&service_config_version.in({serviceConfigVersions})',
+    real: '/clusters/{clusterName}/configurations/service_config_versions?service_name={serviceName}&service_config_version.in({serviceConfigVersions}){additionalParams}',
     mock: '/data/configurations/service_version.json',
     format: function (data) {
       return {
-        serviceConfigVersions: data.serviceConfigVersions.join(',')
+        serviceConfigVersions: data.serviceConfigVersions.join(','),
+        additionalParams: data.additionalParams || ''
       }
     }
   },

http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/utils/config.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js
index a7686d4..162ea1e 100644
--- a/ambari-web/app/utils/config.js
+++ b/ambari-web/app/utils/config.js
@@ -190,44 +190,32 @@ App.config = Em.Object.create({
   },
 
   /**
-   * Cache of loaded configurations. This is useful in not loading
-   * same configuration multiple times. It is populated in multiple
-   * places.
-   *
-   * Example:
-   * {
-   *  'hdfs-site_version3': {...},
-   * }
-   */
-  loadedConfigurationsCache: {},
-
-  /**
    * identify category by filename of config
    * @param config
    * @return {object|null}
    */
   identifyCategory: function (config) {
     var category = null,
-      serviceConfigMetaData = this.get('preDefinedServiceConfigs').findProperty('serviceName', config.serviceName),
+      serviceConfigMetaData = this.get('preDefinedServiceConfigs').findProperty('serviceName', Em.get(config, 'serviceName')),
       configCategories = (serviceConfigMetaData && serviceConfigMetaData.get('configCategories')) || [];
 
-    if (config.filename.contains("env")) {
-      if (config.category) {
-        category = configCategories.findProperty("name", config.category);
+    if (Em.get(config, 'filename') && Em.get(config, 'filename').contains("env")) {
+      if (Em.get(config, 'category')) {
+        category = configCategories.findProperty("name", Em.get(config, 'category'));
       } else {
         configCategories.forEach(function (_category) {
-          if (_category.name.contains(this.getConfigTagFromFileName(config.filename))) {
+          if (_category.name.contains(this.getConfigTagFromFileName(Em.get(config, 'filename')))) {
             category = _category;
           }
         }, this);
       }
     } else {
       configCategories.forEach(function (_category) {
-        if (_category.siteFileNames && Array.isArray(_category.siteFileNames) && _category.siteFileNames.contains(config.filename)) {
+        if (_category.siteFileNames && Array.isArray(_category.siteFileNames) && _category.siteFileNames.contains(Em.get(config, 'filename'))) {
           category = _category;
         }
       });
-      category = Em.isNone(category) ? configCategories.findProperty('siteFileName', this.getOriginalFileName(config.filename)) : category;
+      category = Em.isNone(category) ? configCategories.findProperty('siteFileName', this.getOriginalFileName(Em.get(config, 'filename'))) : category;
     }
     return category;
   },
@@ -238,51 +226,44 @@ App.config = Em.Object.create({
    * @param config
    */
   handleSpecialProperties: function (config) {
-    if (config.displayType === 'int' && /\d+m$/.test(config.value)) {
-      config.value = config.value.slice(0, config.value.length - 1);
-      config.defaultValue = config.value;
+    if (Em.get(config, 'displayType') === 'int' && /\d+m$/.test(Em.get(config, 'value') )) {
+      Em.set(config, 'value', Em.get(config, 'value').slice(0, Em.get(config, 'value.length') - 1));
+      Em.set(config, 'defaultValue', Em.get(config, 'value'));
     }
   },
 
   /**
    * calculate config properties:
-   * category, filename, isUserProperty, description
+   * category, filename, description
    * @param config
    * @param isAdvanced
-   * @param advancedConfigs
+   * @param advancedProperty
    */
-  calculateConfigProperties: function (config, isAdvanced, advancedConfigs) {
-    if (!isAdvanced || this.get('customFileNames').contains(config.filename)) {
+  calculateConfigProperties: function (config, isAdvanced, advancedProperty) {
+    if (!isAdvanced || this.get('customFileNames').contains(Em.get(config, 'filename'))) {
       var categoryMetaData = this.identifyCategory(config);
       if (categoryMetaData != null) {
-        config.category = categoryMetaData.get('name');
-        if (!isAdvanced) config.isUserProperty = true;
-      }
-      if (isAdvanced) {
-        var advancedProperty = advancedConfigs.filterProperty('filename', config.filename).findProperty('name', config.name);
-        if (advancedProperty) {
-          config.description = advancedProperty.description;
-        }
+        Em.set(config, 'category', categoryMetaData.get('name'));
       }
     } else {
-      var advancedProperty = null;
-      var configType = this.getConfigTagFromFileName(config.filename);
-      if (isAdvanced) {
-        advancedProperty = advancedConfigs.filterProperty('filename', config.filename).findProperty('name', config.name);
-      }
-      config.category = config.category ? config.category : 'Advanced ' + configType;
-      if (advancedProperty) {
-        config.description = advancedProperty.description;
-      }
+      var configType = this.getConfigTagFromFileName(Em.get(config, 'filename'));
+      Em.set(config, 'category', Em.get(config, 'category') ? Em.get(config, 'category') : 'Advanced ' + configType);
+    }
+    if (advancedProperty) {
+      Em.set(config, 'description', Em.get(advancedProperty, 'description'));
     }
   },
 
-  capacitySchedulerFilter: function () {
-    var yarnRegex = /^yarn\.scheduler\.capacity\.root\.([a-z]([\_\-a-z0-9]{0,50}))\.(acl_administer_jobs|acl_submit_jobs|state|user-limit-factor|maximum-capacity|capacity)$/i;
-    return function (_config) {
-      return (yarnRegex.test(_config.name));
-    }
-  }.property(),
+  /**
+   * get service for current config type
+   * @param {String} configType - config fileName without xml
+   * @return App.StackService
+   */
+  getServiceByConfigType: function(configType) {
+    return App.StackService.find().find(function(s) {
+      return Object.keys(s.get('configTypes')).contains(configType);
+    });
+  },
 
   /**
    * return:
@@ -301,10 +282,13 @@ App.config = Em.Object.create({
     var preDefinedConfigs = this.get('preDefinedSiteProperties').concat(contentProperties);
     var mappingConfigs = [];
     var filenameExceptions = this.get('filenameExceptions');
-    var selectedServiceNames = App.Service.find().mapProperty('serviceName');
     tags.forEach(function (_tag) {
-      var isAdvanced = null;
-      var filename = (filenameExceptions.contains(_tag.siteName)) ? _tag.siteName : _tag.siteName + ".xml";
+      var service = this.getServiceByConfigType(_tag.siteName);
+      if (service) {
+        serviceName = service.get('serviceName');
+      }
+
+      var filename = App.config.getOriginalFileName(_tag.siteName);
       var siteConfig = configCategories.filter(function (serviceConfigProperties) {
         return _tag.tagName === serviceConfigProperties.tag && _tag.siteName === serviceConfigProperties.type;
       });
@@ -315,13 +299,10 @@ App.config = Em.Object.create({
       var properties = siteConfig.properties || {};
       for (var index in properties) {
         var configsPropertyDef = preDefinedConfigs.filterProperty('name', index).findProperty('filename', filename);
+        var advancedConfig = advancedConfigs.filterProperty('name', index).findProperty('filename', filename);
+        var isAdvanced = Boolean(advancedConfig);
         if (!configsPropertyDef) {
-          advancedConfigs.filterProperty('name', index).forEach(function (_advancedConfig) {
-            var isServiceInstalled = selectedServiceNames.contains(_advancedConfig.serviceName);
-            if (isServiceInstalled || _advancedConfig.serviceName == 'MISC') {
-              configsPropertyDef = _advancedConfig;
-            }
-          }, this);
+          configsPropertyDef = advancedConfig;
         }
 
         var serviceConfigObj = App.ServiceConfig.create({
@@ -329,15 +310,17 @@ App.config = Em.Object.create({
           value: properties[index],
           defaultValue: properties[index],
           filename: filename,
-          isUserProperty: false,
+          isUserProperty: !advancedConfig,
           isOverridable: true,
           isReconfigurable: true,
-          isRequired: advancedConfigs.someProperty('name', index),
+          isRequired: isAdvanced,
           isFinal: finalAttributes[index] === "true",
           defaultIsFinal: finalAttributes[index] === "true",
           showLabel: true,
           serviceName: serviceName,
-          belongsToService: []
+          belongsToService: [],
+          supportsFinal: advancedConfig ? Em.get(advancedConfig, 'supportsFinal') : false
+
         });
 
         if (configsPropertyDef) {
@@ -354,22 +337,22 @@ App.config = Em.Object.create({
         this.tweakConfigVisibility(serviceConfigObj, properties);
         if (!this.getBySiteName(serviceConfigObj.get('filename')).someProperty('name', index)) {
           if (configsPropertyDef) {
-            if (configsPropertyDef.isRequiredByAgent === false) {
+            if (Em.get(configsPropertyDef, 'isRequiredByAgent') === false) {
               continue;
             }
             this.handleSpecialProperties(serviceConfigObj);
           } else {
-            serviceConfigObj.displayType = stringUtils.isSingleLine(serviceConfigObj.value) ? 'advanced' : 'multiLine';
+            serviceConfigObj.set('displayType', stringUtils.isSingleLine(serviceConfigObj.get('value')) ? 'advanced' : 'multiLine');
           }
-
-          isAdvanced = advancedConfigs.filterProperty('name', index).someProperty('filename', filename);
-          serviceConfigObj.id = 'site property';
-          serviceConfigObj.displayName = configsPropertyDef && configsPropertyDef.displayName ? configsPropertyDef.displayName : index;
-          serviceConfigObj.options = configsPropertyDef ? configsPropertyDef.options : null;
-          serviceConfigObj.radioName = configsPropertyDef ? configsPropertyDef.radioName : null;
-          serviceConfigObj.serviceName = configsPropertyDef && configsPropertyDef.serviceName ? configsPropertyDef.serviceName : serviceName;
-          serviceConfigObj.belongsToService = configsPropertyDef && configsPropertyDef.belongsToService ? configsPropertyDef.belongsToService : [];
-          this.calculateConfigProperties(serviceConfigObj, isAdvanced, advancedConfigs);
+          serviceConfigObj.setProperties({
+            'id': 'site property',
+            'displayName': configsPropertyDef && Em.get(configsPropertyDef, 'displayName') ? Em.get(configsPropertyDef, 'displayName') : index,
+            'options': configsPropertyDef ? Em.get(configsPropertyDef, 'options') : null,
+            'radioName': configsPropertyDef ? Em.get(configsPropertyDef, 'radioName') : null,
+            'serviceName': configsPropertyDef && Em.get(configsPropertyDef, 'serviceName') ? Em.get(configsPropertyDef, 'serviceName') : serviceName,
+            'belongsToService': configsPropertyDef && Em.get(configsPropertyDef, 'belongsToService') ? Em.get(configsPropertyDef, 'belongsToService') : []
+          });
+          this.calculateConfigProperties(serviceConfigObj, isAdvanced, advancedConfig);
           this.setValueByDisplayType(serviceConfigObj);
           configs.push(serviceConfigObj);
         } else {
@@ -385,8 +368,8 @@ App.config = Em.Object.create({
 
   tweakConfigVisibility: function (config, allSiteConfigs) {
     var kdcType = allSiteConfigs['kdc_type'];
-    if (kdcType === 'active-directory' && (config.name === 'container_dn' || config.name === 'ldap_url')) {
-      config.isVisible = true;
+    if (kdcType === 'active-directory' && ['container_dn', 'ldap_url'].contains(Em.get(config, 'name'))) {
+      Em.set(config, 'isVisible', true);
     }
   },
 
@@ -416,21 +399,23 @@ App.config = Em.Object.create({
    * @param configsPropertyDef : Object
    */
   setServiceConfigUiAttributes: function (serviceConfigObj, configsPropertyDef) {
-    serviceConfigObj.displayType = configsPropertyDef.displayType;
-    serviceConfigObj.isRequired = (configsPropertyDef.isRequired !== undefined) ? configsPropertyDef.isRequired : true;
-    serviceConfigObj.isRequiredByAgent = (configsPropertyDef.isRequiredByAgent !== undefined) ? configsPropertyDef.isRequiredByAgent : true;
-    serviceConfigObj.isReconfigurable = (configsPropertyDef.isReconfigurable !== undefined) ? configsPropertyDef.isReconfigurable : true;
-    serviceConfigObj.isVisible = (configsPropertyDef.isVisible !== undefined) ? configsPropertyDef.isVisible : true;
-    serviceConfigObj.unit = (configsPropertyDef.unit !== undefined) ? configsPropertyDef.unit : undefined;
-    serviceConfigObj.description = (configsPropertyDef.description !== undefined) ? configsPropertyDef.description : undefined;
-    serviceConfigObj.isOverridable = configsPropertyDef.isOverridable === undefined ? true : configsPropertyDef.isOverridable;
-    serviceConfigObj.serviceName = configsPropertyDef ? configsPropertyDef.serviceName : null;
-    serviceConfigObj.index = configsPropertyDef.index;
-    serviceConfigObj.isSecureConfig = configsPropertyDef.isSecureConfig === undefined ? false : configsPropertyDef.isSecureConfig;
-    serviceConfigObj.belongsToService = configsPropertyDef.belongsToService;
-    serviceConfigObj.category = configsPropertyDef.category;
-    serviceConfigObj.showLabel = configsPropertyDef.showLabel !== false;
-    serviceConfigObj.dependentConfigPattern = configsPropertyDef.dependentConfigPattern
+    serviceConfigObj.setProperties({
+      'displayType': Em.get(configsPropertyDef, 'displayType'),
+      'isRequired': (Em.get(configsPropertyDef, 'isRequired') !== undefined) ? Em.get(configsPropertyDef, 'isRequired') : true,
+      'isRequiredByAgent': (Em.get(configsPropertyDef, 'isRequiredByAgent') !== undefined) ? Em.get(configsPropertyDef, 'isRequiredByAgent') : true,
+      'isReconfigurable': (Em.get(configsPropertyDef, 'isReconfigurable') !== undefined) ? Em.get(configsPropertyDef, 'isReconfigurable') : true,
+      'isVisible': (Em.get(configsPropertyDef, 'isVisible') !== undefined) ? Em.get(configsPropertyDef, 'isVisible') : true,
+      'unit': Em.get(configsPropertyDef, 'unit'),
+      'description': Em.get(configsPropertyDef, 'description'),
+      'isOverridable': Em.get(configsPropertyDef, 'isOverridable') === undefined ? true : Em.get(configsPropertyDef, 'isOverridable'),
+      'serviceName': configsPropertyDef ? Em.get(configsPropertyDef, 'serviceName') : serviceConfigObj.get('serviceName'),
+      'index': Em.get(configsPropertyDef, 'index'),
+      'isSecureConfig': Em.get(configsPropertyDef, 'isSecureConfig') === undefined ? false : Em.get(configsPropertyDef, 'isSecureConfig'),
+      'belongsToService': Em.get(configsPropertyDef, 'belongsToService'),
+      'category': Em.get(configsPropertyDef, 'category'),
+      'showLabel': Em.get(configsPropertyDef, 'showLabel') !== false,
+      'dependentConfigPattern': Em.get(configsPropertyDef, 'dependentConfigPattern')
+    });
   },
 
   /**
@@ -1074,7 +1059,6 @@ App.config = Em.Object.create({
 
   loadServiceConfigGroupOverridesSuccess: function (data, opt, params) {
     data.items.forEach(function (config) {
-      App.config.loadedConfigurationsCache[config.type + "_" + config.tag] = config.properties;
       var group = params.typeTagToGroupMap[config.type + "///" + config.tag];
       var properties = config.properties;
       for (var prop in properties) {
@@ -1289,8 +1273,8 @@ App.config = Em.Object.create({
     if (stored.category == 'Users and Groups') {
       configData.index = this.getOriginalConfigAttribute(stored, 'index', advancedConfigs);
     }
-
-    App.get('config').calculateConfigProperties(configData, isAdvanced, advancedConfigs);
+    var advancedConfig = advancedConfigs.filterProperty('name', stored.name).findProperty('filename', stored.filename);
+    App.get('config').calculateConfigProperties(configData, isAdvanced, advancedConfig);
     return configData;
   },
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/views/common/controls_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/controls_view.js b/ambari-web/app/views/common/controls_view.js
index b611fb6..b41f3c5 100644
--- a/ambari-web/app/views/common/controls_view.js
+++ b/ambari-web/app/views/common/controls_view.js
@@ -67,7 +67,7 @@ App.SupportsDependentConfigs = Ember.Mixin.create({
    * and in case there was changes shows popup with info about changed configs
    */
   sendRequestRorDependentConfigs: function(config) {
-    if (App.get('supports.enhancedConfigs') && this.get('controller.name') === 'mainServiceInfoConfigsController') {
+    if (App.get('supports.enhancedConfigs') && App.router.get('clusterInstallCompleted') && ['mainServiceInfoConfigsController','wizardStep7Controller'].contains(this.get('controller.name'))) {
       var name = config.get('name');
       var type = App.config.getConfigTagFromFileName(config.get('filename'));
       var p = App.StackConfigProperty.find(name + '_' + type);

http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/test/mixins/common/configs/enhanced_configs_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mixins/common/configs/enhanced_configs_test.js b/ambari-web/test/mixins/common/configs/enhanced_configs_test.js
index babbd3b..7cdfb1b 100644
--- a/ambari-web/test/mixins/common/configs/enhanced_configs_test.js
+++ b/ambari-web/test/mixins/common/configs/enhanced_configs_test.js
@@ -23,26 +23,6 @@ describe('App.EnhancedConfigsMixin', function() {
   var mixinObject =  Em.Controller.extend(App.EnhancedConfigsMixin, {});
   var instanceObject = mixinObject.create({});
   var stackProperty
-  describe('#_getFileNamesToSave()', function() {
-
-    beforeEach(function() {
-      App.resetDsStoreTypeMap(App.ConfigProperty);
-      App.resetDsStoreTypeMap(App.StackConfigProperty);
-      stackProperty = App.ConfigProperty.createRecord({id: '1', serviceName: 'service1'});
-    });
-
-    it('returns file names that was changed', function() {
-      App.ConfigProperty.createRecord({id: 'p1_c1', value:'1', defaultValue: '2', fileName: 'file1', stackConfigProperty: stackProperty});
-      App.ConfigProperty.createRecord({id: 'p2_c1', value:'1', defaultValue: '1', fileName: 'file2', stackConfigProperty: stackProperty});
-      expect(instanceObject._getFileNamesToSave('service1')).to.eql(['file1'])
-    });
-
-    it('returns file names that was changed for current service', function() {
-      App.ConfigProperty.createRecord({id: 'p1_c1', value:'7', defaultValue: '1', fileName: 'file1', stackConfigProperty: stackProperty});
-      App.ConfigProperty.createRecord({id: 'p2_c1', value:'8', defaultValue: '1', fileName: 'file2'});
-      expect(instanceObject._getFileNamesToSave('service1')).to.eql(['file1'])
-    });
-  });
 
   describe('#allowSaveSite()', function() {
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/test/utils/config_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/utils/config_test.js b/ambari-web/test/utils/config_test.js
index 98b6b1c..3c10523 100644
--- a/ambari-web/test/utils/config_test.js
+++ b/ambari-web/test/utils/config_test.js
@@ -74,45 +74,6 @@ describe('App.config', function () {
     });
   });
 
-  describe('#capacitySchedulerFilter', function() {
-    var testMessage = 'filter should {0} detect `{1}` property';
-    describe('Stack version >= 2.0', function() {
-      before(function() {
-        setups.setupStackVersion(this, 'HDP-2.1');
-      });
-      var tests = [
-        {
-          config: {
-            name: 'yarn.scheduler.capacity.maximum-am-resource-percent'
-          },
-          e: false
-        },
-        {
-          config: {
-            name: 'yarn.scheduler.capacity.root.capacity'
-          },
-          e: false
-        },
-        {
-          config: {
-            name: 'yarn.scheduler.capacity.root.default.capacity'
-          },
-          e: true
-        }
-      ];
-
-      tests.forEach(function(test){
-        it(testMessage.format( !!test.e ? '' : 'not', test.config.name), function() {
-          expect(App.config.get('capacitySchedulerFilter')(test.config)).to.eql(test.e);
-        });
-      });
-      after(function() {
-        setups.restoreStackVersion(this);
-      })
-    });
-
-  });
-
   describe('#fileConfigsIntoTextarea', function () {
     var filename = 'capacity-scheduler.xml';
     var configs = [