You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by on...@apache.org on 2014/05/16 15:43:45 UTC

git commit: AMBARI-5787. Unit tests for step controllers (7) with refactor. (onechiporenko)

Repository: ambari
Updated Branches:
  refs/heads/trunk 0982aa2e3 -> 4b0cd8fd4


AMBARI-5787. Unit tests for step controllers (7) with refactor. (onechiporenko)


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

Branch: refs/heads/trunk
Commit: 4b0cd8fd47fa0715ee2fd8bfdb514b44fe423834
Parents: 0982aa2
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Fri May 16 16:39:58 2014 +0300
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Fri May 16 16:43:37 2014 +0300

----------------------------------------------------------------------
 .../app/controllers/wizard/step7_controller.js  | 361 +++++++++++-------
 .../test/controllers/wizard/step7_test.js       | 369 +++++++++++++++++--
 2 files changed, 567 insertions(+), 163 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/4b0cd8fd/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 30b72ac..5de14f5 100644
--- a/ambari-web/app/controllers/wizard/step7_controller.js
+++ b/ambari-web/app/controllers/wizard/step7_controller.js
@@ -55,7 +55,7 @@ App.WizardStep7Controller = Em.Controller.extend({
   /**
    * @type {string}
    */
-  gangliaMoutDir:'/',
+  gangliaMoutDir: '/',
 
   overrideToAdd: null,
 
@@ -128,7 +128,7 @@ App.WizardStep7Controller = Em.Controller.extend({
    */
   installedServiceNames: function () {
     var serviceNames = this.get('content.services').filterProperty('isInstalled').mapProperty('serviceName');
-    if(this.get('content.controllerName') !== 'installerController') {
+    if (this.get('content.controllerName') !== 'installerController') {
       return serviceNames.without('SQOOP').without('HCATALOG');
     }
     return serviceNames;
@@ -197,7 +197,7 @@ App.WizardStep7Controller = Em.Controller.extend({
    * @method loadInstalledServicesConfigGroups
    */
   loadInstalledServicesConfigGroups: function (servicesNames) {
-    servicesNames.forEach(function(serviceName) {
+    servicesNames.forEach(function (serviceName) {
       App.ajax.send({
         name: 'config.tags_and_groups',
         sender: this,
@@ -210,29 +210,52 @@ App.WizardStep7Controller = Em.Controller.extend({
     }, this);
   },
 
- /**
-  * Load config groups success callback
-  * @param {object} data
-  * @param {object} opt
-  * @param {object} params
-  * @method loadServiceTagsSuccess
-  */
-  loadServiceTagsSuccess: function (data, opt, params) {
-    var serviceConfigsDef = params.serviceConfigsDef;
-    var serviceName = params.serviceName;
-    var service = this.get('stepConfigs').findProperty('serviceName', serviceName);
-    // Create default configuration group
-    var defaultConfigGroupHosts = this.get('wizardController.allHosts').mapProperty('hostName');
-    var selectedConfigGroup;
+  /**
+   * Create site to tag map. Format:
+   * <code>
+   *   {
+   *    site1: tag1,
+   *    site1: tag2,
+   *    site2: tag3
+   *    ...
+   *   }
+   * </code>
+   * @param {object} desired_configs
+   * @param {string[]} sites
+   * @returns {object}
+   * @private
+   * @method _createSiteToTagMap
+   */
+  _createSiteToTagMap: function (desired_configs, sites) {
     var siteToTagMap = {};
-    for (var site in data.Clusters.desired_configs) {
-      if (serviceConfigsDef.sites.indexOf(site) > -1) {
-        siteToTagMap[site] = data.Clusters.desired_configs[site].tag;
+    for (var site in desired_configs) {
+      if (desired_configs.hasOwnProperty(site)) {
+        if (sites.indexOf(site) > -1) {
+          siteToTagMap[site] = desired_configs[site].tag;
+        }
       }
     }
-    this.loadedClusterSiteToTagMap = siteToTagMap;
+    return siteToTagMap;
+  },
+
+  /**
+   * Load config groups success callback
+   * @param {object} data
+   * @param {object} opt
+   * @param {object} params
+   * @method loadServiceTagsSuccess
+   */
+  loadServiceTagsSuccess: function (data, opt, params) {
+    var serviceName = params.serviceName,
+      service = this.get('stepConfigs').findProperty('serviceName', serviceName),
+      defaultConfigGroupHosts = this.get('wizardController.allHosts').mapProperty('hostName'),
+      siteToTagMap = this._createSiteToTagMap(data.Clusters.desired_configs, params.serviceConfigsDef.sites),
+      selectedConfigGroup;
+
+    this.set('loadedClusterSiteToTagMap', siteToTagMap);
+
     //parse loaded config groups
-    if (App.supports.hostOverrides) {
+    if (App.get('supports.hostOverrides')) {
       var configGroups = [];
       if (data.config_groups.length) {
         data.config_groups.forEach(function (item) {
@@ -280,10 +303,10 @@ App.WizardStep7Controller = Em.Controller.extend({
     }
     configGroups = configGroups.sortProperty('name');
     configGroups.unshift(defaultConfigGroup);
-    if (App.supports.hostOverrides) {
+    if (App.get('supports.hostOverrides')) {
       service.set('configGroups', configGroups);
       var loadedGroupToOverrideSiteToTagMap = {};
-      if (App.supports.hostOverrides) {
+      if (App.get('supports.hostOverrides')) {
         var configGroupsWithOverrides = selectedConfigGroup.get('isDefault') ? service.get('configGroups') : [selectedConfigGroup];
         configGroupsWithOverrides.forEach(function (item) {
           var groupName = item.get('name');
@@ -306,103 +329,191 @@ App.WizardStep7Controller = Em.Controller.extend({
   },
 
   /**
-   *
-   * @param {Ember.Object[]} configs
-   * @param {Ember.Object} componentConfig
-   * @param {Ember.Object} component
-   * @method loadComponentConfigs
-   */
-  loadComponentConfigs: function (configs, componentConfig, component) {
-    var localDB = App.router.get('mainServiceInfoConfigsController').getInfoForDefaults();
-    var recommendedDefaults = {};
-    var s = this.get('serviceConfigsData').findProperty('serviceName', component.get('serviceName'));
-    var defaultGroupSelected = component.get('selectedConfigGroup.isDefault');
-    var defaults = [];
+   * Get object with recommended default values for config properties
+   * Format:
+   *  <code>
+   *    {
+   *      configName1: configValue1,
+   *      configName2: configValue2
+   *      ...
+   *    }
+   *  </code>
+   * @param {string} serviceName
+   * @returns {object}
+   * @method _getRecommendedDefaultsForComponent
+   */
+  _getRecommendedDefaultsForComponent: function (serviceName) {
+    var s = this.get('serviceConfigsData').findProperty('serviceName', serviceName),
+      recommendedDefaults = {},
+      localDB = App.router.get('mainServiceInfoConfigsController').getInfoForDefaults();
     if (s.defaultsProviders) {
-      s.defaultsProviders.forEach(function(defaultsProvider) {
+      s.defaultsProviders.forEach(function (defaultsProvider) {
         var d = defaultsProvider.getDefaults(localDB);
-        defaults.push(d);
         for (var name in d) {
-          recommendedDefaults[name] = d[name];
+          if (d.hasOwnProperty(name)) {
+            recommendedDefaults[name] = d[name];
+          }
         }
       });
     }
-    if (s.configsValidator) {
-      s.configsValidator.set('recommendedDefaults', recommendedDefaults);
+    return recommendedDefaults;
+  },
+
+  /**
+   * By default <code>value</code>-property is string "true|false".
+   * Should update it to boolean type
+   * Also affects <code>defaultValue</code>
+   * @param {Ember.Object} serviceConfigProperty
+   * @returns {Ember.Object} Updated config-object
+   * @method _updateValueForCheckBoxConfig
+   */
+  _updateValueForCheckBoxConfig: function (serviceConfigProperty) {
+    var v = serviceConfigProperty.get('value');
+    switch (serviceConfigProperty.get('value')) {
+      case 'true':
+        v = true;
+        break;
+      case 'false':
+        v = false;
+        break;
     }
-    configs.forEach(function (serviceConfigProperty) {
-      if (!serviceConfigProperty) return;
-      var overrides = serviceConfigProperty.get('overrides');
-      // we will populate the override properties below
-      serviceConfigProperty.set('overrides', null);
+    serviceConfigProperty.setProperties({value: v, defaultValue: v});
+    return serviceConfigProperty;
+  },
 
-      if (serviceConfigProperty.isOverridable === undefined) {
-        serviceConfigProperty.set('isOverridable', true);
+  /**
+   * Set <code>isEditable</code>-property to <code>serviceConfigProperty</code>
+   * Based on user's permissions and selected config group
+   * @param {Ember.Object} serviceConfigProperty
+   * @param {bool} defaultGroupSelected
+   * @returns {Ember.Object} Updated config-object
+   * @method _updateIsEditableFlagForConfig
+   */
+  _updateIsEditableFlagForConfig: function (serviceConfigProperty, defaultGroupSelected) {
+    if (App.get('isAdmin')) {
+      if (defaultGroupSelected && !this.get('isHostsConfigsPage')) {
+        serviceConfigProperty.set('isEditable', serviceConfigProperty.get('isReconfigurable'));
+      }
+      else {
+        serviceConfigProperty.set('isEditable', false);
       }
-      if (serviceConfigProperty.displayType === 'checkbox') {
-        switch (serviceConfigProperty.value) {
-          case 'true':
-            serviceConfigProperty.set('value', true);
-            serviceConfigProperty.set('defaultValue', true);
-            break;
-          case 'false':
-            serviceConfigProperty.set('value', false);
-            serviceConfigProperty.set('defaultValue', false);
-            break;
+    }
+    else {
+      serviceConfigProperty.set('isEditable', false);
+    }
+    return serviceConfigProperty;
+  },
+
+  /**
+   * Set <code>overrides</code>-property to <code>serviceConfigProperty<code>
+   * @param {Ember.Object} serviceConfigProperty
+   * @param {Ember.Object} component
+   * @return {Ember.Object} Updated config-object
+   * @method _updateOverridesForConfig
+   */
+  _updateOverridesForConfig: function (serviceConfigProperty, component) {
+
+    var overrides = serviceConfigProperty.get('overrides');
+
+    if (Em.isNone(overrides)) {
+      serviceConfigProperty.set('overrides', Em.A([]));
+      return serviceConfigProperty;
+    }
+    serviceConfigProperty.set('overrides', null);
+    var defaultGroupSelected = component.get('selectedConfigGroup.isDefault');
+
+    // Wrap each override to App.ServiceConfigProperty
+    overrides.forEach(function (override) {
+      var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty);
+      newSCP.set('value', override.value);
+      newSCP.set('isOriginalSCP', false); // indicated this is overridden value,
+      newSCP.set('parentSCP', serviceConfigProperty);
+      if (App.get('supports.hostOverrides') && defaultGroupSelected) {
+        var group = component.get('configGroups').findProperty('name', override.group.get('name'));
+        // prevent cycle in proto object, clean link
+        if (group.get('properties').length == 0) {
+          group.set('properties', Em.A([]));
         }
+        group.get('properties').push(newSCP);
+        newSCP.set('group', override.group);
+        newSCP.set('isEditable', false);
       }
-      if (serviceConfigProperty.get('serviceName') === component.get('serviceName')) {
-        if (s.configsValidator) {
-          var validators = s.configsValidator.get('configValidators');
-          for (var validatorName in validators) {
-            if (serviceConfigProperty.name == validatorName) {
-              serviceConfigProperty.set('serviceValidator', s.configsValidator);
+      var parentOverridesArray = serviceConfigProperty.get('overrides');
+      if (Em.isNone(parentOverridesArray)) {
+        parentOverridesArray = Em.A([]);
+        serviceConfigProperty.set('overrides', parentOverridesArray);
+      }
+      serviceConfigProperty.get('overrides').pushObject(newSCP);
+    }, this);
+    return serviceConfigProperty;
+  },
+
+  /**
+   * Set <code>serviceValidator</code>-property to <code>serviceConfigProperty</code> if config's serviceName is equal
+   * to component's serviceName
+   * othervise set <code>isVisible</code>-property to <code>false</code>
+   * @param {Ember.Object} serviceConfigProperty
+   * @param {Ember.Object} component
+   * @param {object} serviceConfigsData
+   * @returns {Ember.Object} updated config-object
+   * @mrthod _updateValidatorsForConfig
+   */
+  _updateValidatorsForConfig: function (serviceConfigProperty, component, serviceConfigsData) {
+    if (serviceConfigProperty.get('serviceName') === component.get('serviceName')) {
+      if (serviceConfigsData.configsValidator) {
+        var validators = serviceConfigsData.configsValidator.get('configValidators');
+        for (var validatorName in validators) {
+          if (validators.hasOwnProperty(validatorName)) {
+            if (serviceConfigProperty.get('name') == validatorName) {
+              serviceConfigProperty.set('serviceValidator', serviceConfigsData.configsValidator);
             }
           }
         }
-      } else {
-        serviceConfigProperty.set('isVisible', false);
       }
-      if (overrides != null) {
-        overrides.forEach(function (override) {
-          var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty);
-          newSCP.set('value', override.value);
-          newSCP.set('isOriginalSCP', false); // indicated this is overridden value,
-          newSCP.set('parentSCP', serviceConfigProperty);
-          if (App.supports.hostOverrides && defaultGroupSelected) {
-            var group = component.get('configGroups').findProperty('name', override.group.get('name'));
-            // prevent cycle in proto object, clean link
-            if (group.get('properties').length == 0)
-              group.set('properties', Em.A([]));
-            group.get('properties').push(newSCP);
-            newSCP.set('group', override.group);
-            newSCP.set('isEditable', false);
-          }
-          var parentOverridesArray = serviceConfigProperty.get('overrides');
-          if (parentOverridesArray == null) {
-            parentOverridesArray = Em.A([]);
-            serviceConfigProperty.set('overrides', parentOverridesArray);
-          }
-          serviceConfigProperty.get('overrides').pushObject(newSCP);
-        }, this);
-      } else {
-        serviceConfigProperty.set('overrides', Em.A([]));
+    }
+    else {
+      serviceConfigProperty.set('isVisible', false);
+    }
+    return serviceConfigProperty;
+  },
+
+  /**
+   * Set configs with overrides, recommended defaults to component
+   * @param {Ember.Object[]} configs
+   * @param {Ember.Object} componentConfig
+   * @param {Ember.Object} component
+   * @method loadComponentConfigs
+   */
+  loadComponentConfigs: function (configs, componentConfig, component) {
+    var s = this.get('serviceConfigsData').findProperty('serviceName', component.get('serviceName')),
+      defaultGroupSelected = component.get('selectedConfigGroup.isDefault');
+
+    if (s.configsValidator) {
+      var recommendedDefaults = this._getRecommendedDefaultsForComponent(component.get('serviceName'));
+      s.configsValidator.set('recommendedDefaults', recommendedDefaults);
+    }
+
+    configs.forEach(function (serviceConfigProperty) {
+      if (!serviceConfigProperty) return;
+
+      if (Em.isNone(serviceConfigProperty.get('isOverridable'))) {
+        serviceConfigProperty.set('isOverridable', true);
       }
-      if (App.get('isAdmin')) {
-        if(defaultGroupSelected && !this.get('isHostsConfigsPage')){
-          serviceConfigProperty.set('isEditable', serviceConfigProperty.get('isReconfigurable'));
-        } else {
-          serviceConfigProperty.set('isEditable', false);
-        }
-      } else {
-        serviceConfigProperty.set('isEditable', false);
+      if (serviceConfigProperty.get('displayType') === 'checkbox') {
+        this._updateValueForCheckBoxConfig(serviceConfigProperty);
       }
+      this._updateValidatorsForConfig(serviceConfigProperty, component, s);
+      this._updateOverridesForConfig(serviceConfigProperty, component);
+      this._updateIsEditableFlagForConfig(serviceConfigProperty, defaultGroupSelected);
+
       componentConfig.get('configs').pushObject(serviceConfigProperty);
       serviceConfigProperty.validate();
+
     }, this);
+
     var overrideToAdd = this.get('overrideToAdd');
     if (overrideToAdd) {
-      overrideToAdd = componentConfig.configs.findProperty('name', overrideToAdd.name);
+      overrideToAdd = componentConfig.get('configs').findProperty('name', overrideToAdd.name);
       if (overrideToAdd) {
         this.addOverrideProperty(overrideToAdd);
         component.set('overrideToAdd', null);
@@ -431,17 +542,17 @@ App.WizardStep7Controller = Em.Controller.extend({
    * @param {Ember.Enumerable} configs
    * @method resolveStormConfigs
    */
-  resolveStormConfigs: function(configs) {
+  resolveStormConfigs: function (configs) {
     var dependentConfigs, gangliaServerHost;
     dependentConfigs = ['nimbus.childopts', 'supervisor.childopts', 'worker.childopts'];
     // if Ganglia selected or installed, set ganglia host to configs
     if (this.get('installedServiceNames').contains('STORM') && this.get('installedServiceNames').contains('GANGLIA')) return;
     if (this.get('allSelectedServiceNames').contains('GANGLIA') || this.get('installedServiceNames').contains('GANGLIA')) {
       gangliaServerHost = this.get('wizardController').getDBProperty('masterComponentHosts').findProperty('component', 'GANGLIA_SERVER').hostName;
-      dependentConfigs.forEach(function(configName) {
+      dependentConfigs.forEach(function (configName) {
         var config = configs.findProperty('name', configName);
         var replaceStr = '.jar=host=';
-        config.value = config.defaultValue = config.value.replace(replaceStr, replaceStr+gangliaServerHost);
+        config.value = config.defaultValue = config.value.replace(replaceStr, replaceStr + gangliaServerHost);
         config.forceUpdate = true;
       }, this);
     }
@@ -501,7 +612,7 @@ App.WizardStep7Controller = Em.Controller.extend({
    * and (if some services are already installed) load config groups for installed services
    * @method checkHostOverrideInstaller
    */
-  checkHostOverrideInstaller: function() {
+  checkHostOverrideInstaller: function () {
     if (App.get('supports.hostOverridesInstaller')) {
       this.loadConfigGroups(this.get('content.configGroups'));
       if (this.get('installedServiceNames').length > 0) {
@@ -518,7 +629,7 @@ App.WizardStep7Controller = Em.Controller.extend({
    * @param {Ember.Object[]} storedConfigs
    * @method setStepConfigs
    */
-  setStepConfigs: function(configs, storedConfigs) {
+  setStepConfigs: function (configs, storedConfigs) {
     var localDB = {
       hosts: this.get('wizardController').getDBProperty('hosts'),
       masterComponentHosts: this.get('wizardController').getDBProperty('masterComponentHosts'),
@@ -528,8 +639,8 @@ App.WizardStep7Controller = Em.Controller.extend({
     if (this.get('wizardController.name') === 'addServiceController') {
       serviceConfigs.setEach('showConfig', true);
       serviceConfigs.setEach('selected', false);
-      this.get('selectedServiceNames').forEach(function(serviceName) {
-        if(!serviceConfigs.findProperty('serviceName', serviceName)) return;
+      this.get('selectedServiceNames').forEach(function (serviceName) {
+        if (!serviceConfigs.findProperty('serviceName', serviceName)) return;
         serviceConfigs.findProperty('serviceName', serviceName).set('selected', true);
       });
 
@@ -537,7 +648,7 @@ App.WizardStep7Controller = Em.Controller.extend({
       if (App.get('isHaEnabled')) {
         var c = serviceConfigs.findProperty('serviceName', 'HDFS').configs;
         var removedConfigs = c.filterProperty('category', 'SNameNode');
-        removedConfigs.map(function(config) {
+        removedConfigs.map(function (config) {
           c = c.without(config);
         });
         serviceConfigs.findProperty('serviceName', 'HDFS').configs = c;
@@ -552,7 +663,7 @@ App.WizardStep7Controller = Em.Controller.extend({
    * Select first service at all in other cases
    * @method selectProperService
    */
-  selectProperService: function() {
+  selectProperService: function () {
     if (this.get('wizardController.name') === 'addServiceController') {
       this.set('selectedService', this.get('stepConfigs').filterProperty('selected', true).get('firstObject'));
     }
@@ -566,7 +677,7 @@ App.WizardStep7Controller = Em.Controller.extend({
    * @return {$.ajax|null}
    * @method getConfigTags
    */
-  getConfigTags: function() {
+  getConfigTags: function () {
     return App.ajax.send({
       name: 'config.tags.sync',
       sender: this,
@@ -583,19 +694,21 @@ App.WizardStep7Controller = Em.Controller.extend({
   getConfigTagsSuccess: function (data) {
     var installedServiceSites = [];
     this.get('serviceConfigsData').filter(function (service) {
-      if (this.get('installedServiceNames').contains(service.serviceName)){
+      if (this.get('installedServiceNames').contains(service.serviceName)) {
         installedServiceSites = installedServiceSites.concat(service.sites);
       }
     }, this);
     installedServiceSites = installedServiceSites.uniq();
     var serviceConfigTags = [];
     for (var site in data.Clusters.desired_configs) {
-      if (installedServiceSites.contains(site)) {
-        serviceConfigTags.push({
-          siteName: site,
-          tagName: data.Clusters.desired_configs[site].tag,
-          newTagName: null
-        });
+      if (data.Clusters.desired_configs.hasOwnProperty(site)) {
+        if (installedServiceSites.contains(site)) {
+          serviceConfigTags.push({
+            siteName: site,
+            tagName: data.Clusters.desired_configs[site].tag,
+            newTagName: null
+          });
+        }
       }
     }
     this.set('serviceConfigTags', serviceConfigTags);
@@ -609,7 +722,7 @@ App.WizardStep7Controller = Em.Controller.extend({
    */
   setInstalledServiceConfigs: function (serviceConfigTags, configs) {
     var configsMap = {};
-    App.router.get('configurationController').getConfigsByTags(serviceConfigTags).forEach(function(configSite){
+    App.router.get('configurationController').getConfigsByTags(serviceConfigTags).forEach(function (configSite) {
       $.extend(configsMap, configSite.properties);
     });
     configs.forEach(function (_config) {
@@ -629,9 +742,9 @@ App.WizardStep7Controller = Em.Controller.extend({
    * @param {Ember.Object[]} groups
    * @method setGroupsToDelete
    */
-  setGroupsToDelete: function(groups) {
+  setGroupsToDelete: function (groups) {
     var groupsToDelete = this.get('groupsToDelete');
-    groups.forEach(function(group) {
+    groups.forEach(function (group) {
       if (group.get('id'))
         groupsToDelete.push({
           id: group.get('id')
@@ -691,7 +804,7 @@ App.WizardStep7Controller = Em.Controller.extend({
         serviceRawGroups.filterProperty('isDefault', false).forEach(function (configGroup) {
           var readyGroup = App.ConfigGroup.create(configGroup);
           var wrappedProperties = [];
-          readyGroup.get('properties').forEach(function(property){
+          readyGroup.get('properties').forEach(function (property) {
             wrappedProperties.pushObject(App.ServiceConfigProperty.create(property));
           });
           wrappedProperties.setEach('group', readyGroup);
@@ -725,7 +838,7 @@ App.WizardStep7Controller = Em.Controller.extend({
       selectedGroup = this.get('selectedConfigGroup'),
       overrideToAdd = this.get('overrideToAdd'),
       overrides = [];
-    if(!selectedGroup) return;
+    if (!selectedGroup) return;
 
     var displayedConfigGroups = this._getDisplayedConfigGroups();
     displayedConfigGroups.forEach(function (group) {
@@ -743,7 +856,7 @@ App.WizardStep7Controller = Em.Controller.extend({
    * @return {Array}
    * @method _getDisplayedConfigGroups
    */
-  _getDisplayedConfigGroups: function() {
+  _getDisplayedConfigGroups: function () {
     var selectedGroup = this.get('selectedConfigGroup');
     if (!selectedGroup) return [];
     return (selectedGroup.get('isDefault')) ?
@@ -757,7 +870,7 @@ App.WizardStep7Controller = Em.Controller.extend({
    * @return {Ember.Object} updated config-object
    * @method _setEditableValue
    */
-  _setEditableValue: function(config) {
+  _setEditableValue: function (config) {
     var selectedGroup = this.get('selectedConfigGroup');
     if (!selectedGroup) return config;
     var isEditable = config.get('isEditable'),
@@ -779,7 +892,7 @@ App.WizardStep7Controller = Em.Controller.extend({
    * @returns {Ember.Object}
    * @method _setOverrides
    */
-  _setOverrides: function(config, overrides) {
+  _setOverrides: function (config, overrides) {
     var selectedGroup = this.get('selectedConfigGroup'),
       overrideToAdd = this.get('overrideToAdd'),
       configOverrides = overrides.filterProperty('name', config.get('name'));

http://git-wip-us.apache.org/repos/asf/ambari/blob/4b0cd8fd/ambari-web/test/controllers/wizard/step7_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step7_test.js b/ambari-web/test/controllers/wizard/step7_test.js
index 52e00dd..b49c29c 100644
--- a/ambari-web/test/controllers/wizard/step7_test.js
+++ b/ambari-web/test/controllers/wizard/step7_test.js
@@ -870,7 +870,7 @@ describe('App.InstallerStep7Controller', function () {
         })
       });
     });
-    afterEach(function() {
+    afterEach(function () {
       App.config.renderConfigs.restore();
     });
     it('if wizard isn\'t addService, should set output of App.config.renderConfigs', function () {
@@ -897,8 +897,8 @@ describe('App.InstallerStep7Controller', function () {
       expect(installerStep7Controller.get('stepConfigs').findProperty('serviceName', 's2').get('selected')).to.equal(true);
     });
     it('addServiceWizard used, HA enabled', function () {
-      sinon.stub(App, 'get', function(k) {
-        if(k === 'isHaEnabled') {
+      sinon.stub(App, 'get', function (k) {
+        if (k === 'isHaEnabled') {
           return true;
         }
         return Em.get(App, k);
@@ -929,12 +929,12 @@ describe('App.InstallerStep7Controller', function () {
     });
   });
 
-  describe('#checkHostOverrideInstaller', function() {
-    beforeEach(function() {
+  describe('#checkHostOverrideInstaller', function () {
+    beforeEach(function () {
       sinon.stub(installerStep7Controller, 'loadConfigGroups', Em.K);
       sinon.stub(installerStep7Controller, 'loadInstalledServicesConfigGroups', Em.K);
     });
-    afterEach(function() {
+    afterEach(function () {
       installerStep7Controller.loadConfigGroups.restore();
       installerStep7Controller.loadInstalledServicesConfigGroups.restore();
       App.get.restore();
@@ -976,9 +976,9 @@ describe('App.InstallerStep7Controller', function () {
             loadInstalledServicesConfigGroups: true
           }
         }
-    ]).forEach(function(test) {
-        it(test.m, function() {
-          sinon.stub(App, 'get', function(k) {
+      ]).forEach(function (test) {
+        it(test.m, function () {
+          sinon.stub(App, 'get', function (k) {
             if (k === 'supports.hostOverridesInstaller') return test.hostOverridesInstaller;
             return Em.get(App, k);
           });
@@ -1000,12 +1000,14 @@ describe('App.InstallerStep7Controller', function () {
       });
   });
 
-  describe('#loadStep', function() {
-    beforeEach(function() {
+  describe('#loadStep', function () {
+    beforeEach(function () {
       installerStep7Controller.reopen({
         content: {services: []},
         wizardController: Em.Object.create({
-          getDBProperty: function(k) {return this.get(k);}
+          getDBProperty: function (k) {
+            return this.get(k);
+          }
         })
       });
       sinon.stub(App.config, 'mergePreDefinedWithStored', Em.K);
@@ -1022,7 +1024,7 @@ describe('App.InstallerStep7Controller', function () {
       sinon.stub(installerStep7Controller, 'selectProperService', Em.K);
       sinon.stub(App.router, 'send', Em.K);
     });
-    afterEach(function() {
+    afterEach(function () {
       App.config.mergePreDefinedWithStored.restore();
       App.config.addAdvancedConfigs.restore();
       App.config.addCustomConfigs.restore();
@@ -1037,16 +1039,16 @@ describe('App.InstallerStep7Controller', function () {
       installerStep7Controller.selectProperService.restore();
       App.router.send.restore();
     });
-    it('should call clearStep', function() {
+    it('should call clearStep', function () {
       installerStep7Controller.loadStep();
       expect(installerStep7Controller.clearStep.calledOnce).to.equal(true);
     });
-    it('shouldn\'t do nothing if isAdvancedConfigLoaded is false', function() {
+    it('shouldn\'t do nothing if isAdvancedConfigLoaded is false', function () {
       installerStep7Controller.set('isAdvancedConfigLoaded', false);
       installerStep7Controller.loadStep();
       expect(installerStep7Controller.clearStep.called).to.equal(false);
     });
-    it('should use App.config to map configs', function() {
+    it('should use App.config to map configs', function () {
       installerStep7Controller.loadStep();
       expect(App.config.mergePreDefinedWithStored.calledOnce).to.equal(true);
       expect(App.config.addAdvancedConfigs.calledOnce).to.equal(true);
@@ -1075,14 +1077,14 @@ describe('App.InstallerStep7Controller', function () {
         }
       ]).forEach(function (test) {
         it('allSelectedServiceNames = ' + JSON.stringify(test.allSelectedServiceNames) + ', capacitySchedulerUi = ' + test.capacitySchedulerUi.toString(), function () {
-          sinon.stub(App, 'get', function(k) {
+          sinon.stub(App, 'get', function (k) {
             if (k === 'supports.capacitySchedulerUi') return test.capacitySchedulerUi;
             return Em.get(App, k);
           });
           installerStep7Controller.reopen({allSelectedServiceNames: test.allSelectedServiceNames});
           installerStep7Controller.loadStep();
           if (test.e) {
-          expect(App.config.fileConfigsIntoTextarea.calledOnce).to.equal(true);
+            expect(App.config.fileConfigsIntoTextarea.calledOnce).to.equal(true);
           }
           else {
             expect(App.config.fileConfigsIntoTextarea.called).to.equal(false);
@@ -1090,19 +1092,19 @@ describe('App.InstallerStep7Controller', function () {
           App.get.restore();
         });
       });
-    it('should call getConfigTags, setInstalledServiceConfigs for addServiceController', function() {
+    it('should call getConfigTags, setInstalledServiceConfigs for addServiceController', function () {
       installerStep7Controller.set('wizardController.name', 'addServiceController');
       installerStep7Controller.loadStep();
       expect(installerStep7Controller.getConfigTags.calledOnce).to.equal(true);
       expect(installerStep7Controller.setInstalledServiceConfigs.calledOnce).to.equal(true);
     });
     Em.A([
-      {
-        allSelectedServiceNames: ['STORM'],
-        installedServiceNames: ['STORM'],
-        m: 'allSelectedServiceNames contains STORM, installedServiceNames contains STORM',
-        e: true
-      },
+        {
+          allSelectedServiceNames: ['STORM'],
+          installedServiceNames: ['STORM'],
+          m: 'allSelectedServiceNames contains STORM, installedServiceNames contains STORM',
+          e: true
+        },
         {
           allSelectedServiceNames: [],
           installedServiceNames: ['STORM'],
@@ -1121,8 +1123,8 @@ describe('App.InstallerStep7Controller', function () {
           m: 'allSelectedServiceNames doesn\'t contain STORM, installedServiceNames doesn\'t contain STORM',
           e: false
         }
-    ]).forEach(function(test) {
-        it(test.m, function() {
+      ]).forEach(function (test) {
+        it(test.m, function () {
           installerStep7Controller.reopen({
             allSelectedServiceNames: test.allSelectedServiceNames,
             installedServiceNames: test.installedServiceNames
@@ -1136,19 +1138,19 @@ describe('App.InstallerStep7Controller', function () {
           }
         });
       });
-    it('should call setStepConfigs', function() {
+    it('should call setStepConfigs', function () {
       installerStep7Controller.loadStep();
       expect(installerStep7Controller.setStepConfigs.calledOnce).to.equal(true);
     });
-    it('should call checkHostOverrideInstaller', function() {
+    it('should call checkHostOverrideInstaller', function () {
       installerStep7Controller.loadStep();
       expect(installerStep7Controller.checkHostOverrideInstaller.calledOnce).to.equal(true);
     });
-    it('should call activateSpecialConfigs', function() {
+    it('should call activateSpecialConfigs', function () {
       installerStep7Controller.loadStep();
       expect(installerStep7Controller.activateSpecialConfigs.calledOnce).to.equal(true);
     });
-    it('should call selectProperService', function() {
+    it('should call selectProperService', function () {
       installerStep7Controller.loadStep();
       expect(installerStep7Controller.selectProperService.calledOnce).to.equal(true);
     });
@@ -1163,17 +1165,306 @@ describe('App.InstallerStep7Controller', function () {
           skipConfigStep: false,
           e: false
         }
-      ]).forEach(function(test) {
-      it(test.m, function() {
-        installerStep7Controller.set('content.skipConfigStep', test.skipConfigStep);
-        installerStep7Controller.loadStep();
-        if (test.e) {
-          expect(App.router.send.calledWith('next')).to.equal(true);
+      ]).forEach(function (test) {
+        it(test.m, function () {
+          installerStep7Controller.set('content.skipConfigStep', test.skipConfigStep);
+          installerStep7Controller.loadStep();
+          if (test.e) {
+            expect(App.router.send.calledWith('next')).to.equal(true);
+          }
+          else {
+            expect(App.router.send.called).to.equal(false);
+          }
+        });
+      });
+  });
+
+  describe('#_updateValueForCheckBoxConfig', function () {
+    Em.A([
+        {
+          v: 'true',
+          e: true
+        },
+        {
+          v: 'false',
+          e: false
         }
-        else {
-          expect(App.router.send.called).to.equal(false);
+      ]).forEach(function (test) {
+        it(test.v, function () {
+          var serviceConfigProperty = Em.Object.create({value: test.v});
+          installerStep7Controller._updateValueForCheckBoxConfig(serviceConfigProperty);
+          expect(serviceConfigProperty.get('value')).to.equal(test.e);
+          expect(serviceConfigProperty.get('defaultValue')).to.equal(test.e);
+        });
+      });
+  });
+
+  describe('#_updateIsEditableFlagForConfig', function () {
+    Em.A([
+        {
+          isAdmin: false,
+          isReconfigurable: false,
+          isHostsConfigsPage: true,
+          defaultGroupSelected: false,
+          m: 'false for non-admin users',
+          e: false
+        },
+        {
+          isAdmin: true,
+          isReconfigurable: false,
+          isHostsConfigsPage: true,
+          defaultGroupSelected: false,
+          m: 'false if defaultGroupSelected is false and isHostsConfigsPage is true',
+          e: false
+        },
+        {
+          isAdmin: true,
+          isReconfigurable: false,
+          isHostsConfigsPage: true,
+          defaultGroupSelected: true,
+          m: 'false if defaultGroupSelected is true and isHostsConfigsPage is true',
+          e: false
+        },
+        {
+          isAdmin: true,
+          isReconfigurable: false,
+          isHostsConfigsPage: false,
+          defaultGroupSelected: false,
+          m: 'false if defaultGroupSelected is false and isHostsConfigsPage is false',
+          e: false
+        },
+        {
+          isAdmin: true,
+          isReconfigurable: true,
+          isHostsConfigsPage: false,
+          defaultGroupSelected: true,
+          m: 'equal to isReconfigurable if defaultGroupSelected is true and isHostsConfigsPage is false',
+          e: true
         }
+      ]).forEach(function (test) {
+        it(test.m, function () {
+          sinon.stub(App, 'get', function (k) {
+            if (k === 'isAdmin') return test.isAdmin;
+            return Em.get(App, k);
+          });
+          installerStep7Controller.reopen({isHostsConfigsPage: test.isHostsConfigsPage});
+          var serviceConfigProperty = Em.Object.create({
+            isReconfigurable: test.isReconfigurable
+          });
+          installerStep7Controller._updateIsEditableFlagForConfig(serviceConfigProperty, test.defaultGroupSelected);
+          App.get.restore();
+          expect(serviceConfigProperty.get('isEditable')).to.equal(test.e);
+        });
       });
+  });
+
+  describe('#_updateOverridesForConfig', function () {
+
+    it('should set empty array', function () {
+      var serviceConfigProperty = Em.Object.create({
+        overrides: null
+      }), component = Em.Object.create();
+      installerStep7Controller._updateOverridesForConfig(serviceConfigProperty, component);
+      expect(serviceConfigProperty.get('overrides')).to.eql(Em.A([]));
+    });
+
+    it('host overrides not supported', function () {
+      var serviceConfigProperty = Em.Object.create({
+        overrides: [
+          {value: 'new value'}
+        ]
+      }), component = Em.Object.create({selectedConfigGroup: {isDefault: false}});
+      installerStep7Controller._updateOverridesForConfig(serviceConfigProperty, component);
+      expect(serviceConfigProperty.get('overrides').length).to.equal(1);
+      expect(serviceConfigProperty.get('overrides.firstObject.value')).to.equal('new value');
+      expect(serviceConfigProperty.get('overrides.firstObject.isOriginalSCP')).to.equal(false);
+      expect(serviceConfigProperty.get('overrides.firstObject.parentSCP')).to.eql(serviceConfigProperty);
+    });
+
+    it('host overrides supported', function () {
+      sinon.stub(App, 'get', function (k) {
+        if (k === 'supports.hostOverrides') return true;
+        return Em.get(App, k);
+      });
+      var serviceConfigProperty = Em.Object.create({
+          overrides: [
+            {value: 'new value', group: Em.Object.create({name: 'n1'})}
+          ]
+        }),
+        component = Em.Object.create({
+          selectedConfigGroup: {isDefault: true},
+          configGroups: Em.A([
+            Em.Object.create({name: 'n1', properties: []})
+          ])
+        });
+      installerStep7Controller._updateOverridesForConfig(serviceConfigProperty, component);
+      App.get.restore();
+      expect(serviceConfigProperty.get('overrides').length).to.equal(1);
+      expect(serviceConfigProperty.get('overrides.firstObject.value')).to.equal('new value');
+      expect(serviceConfigProperty.get('overrides.firstObject.isOriginalSCP')).to.equal(false);
+      expect(serviceConfigProperty.get('overrides.firstObject.parentSCP')).to.eql(serviceConfigProperty);
+      expect(component.get('configGroups.firstObject.properties').length).to.equal(1);
+      expect(component.get('configGroups.firstObject.properties.firstObject.isEditable')).to.equal(false);
+      expect(component.get('configGroups.firstObject.properties.firstObject.group')).to.be.object;
+    });
+
+  });
+
+  describe('#_updateValidatorsForConfig', function () {
+
+    it('should set isVisible to false', function () {
+      var serviceConfigProperty = Em.Object.create({serviceName: 's1', isVisible: true}),
+        component = Em.Object.create({serviceName: 's2'}),
+        serviceConfigsData = {};
+      installerStep7Controller._updateValidatorsForConfig(serviceConfigProperty, component, serviceConfigsData);
+      expect(serviceConfigProperty.get('isVisible')).to.equal(false);
+    });
+
+    it('should set serviceValidator', function () {
+      var serviceConfigProperty = Em.Object.create({serviceName: 's1', name: 'n1', serviceValidator: null}),
+        component = Em.Object.create({serviceName: 's1'}),
+        serviceConfigsData = {
+          configsValidator: Em.Object.create({
+            configValidators: {
+              n1: {},
+              n2: {}
+            }
+          })
+        };
+      installerStep7Controller._updateValidatorsForConfig(serviceConfigProperty, component, serviceConfigsData);
+      expect(serviceConfigProperty.get('serviceValidator')).to.be.object;
+      expect(Em.keys(serviceConfigProperty.get('serviceValidator.configValidators'))).to.eql(['n1', 'n2']);
+    });
+
+  });
+
+  describe('#getRecommendedDefaultsForComponent', function () {
+    beforeEach(function () {
+      sinon.stub(App.router, 'get', function (k) {
+        if (k === 'mainServiceInfoConfigsController') return Em.Object.create({
+          getInfoForDefaults: Em.K
+        });
+        return Em.get(App.router, k);
+      });
+    });
+    afterEach(function () {
+      App.router.get.restore();
+    });
+    it('should return empty object', function () {
+      var serviceConfigsData = [
+          {serviceName: 's1'}
+        ],
+        serviceName = 's1';
+      installerStep7Controller.reopen({serviceConfigsData: serviceConfigsData});
+      var r = installerStep7Controller._getRecommendedDefaultsForComponent(serviceName);
+      expect(r).to.eql({});
+    });
+
+    it('should return recommendedDefaults', function () {
+      var serviceConfigsData = [
+          {serviceName: 's1', defaultsProviders: [
+            {getDefaults: function () {
+              return {c1: 'v1', c2: 'v2'};
+            }},
+            {getDefaults: function () {
+              return {c3: 'v3', c4: 'v4'};
+            }}
+          ]}
+        ],
+        serviceName = 's1';
+      installerStep7Controller.reopen({serviceConfigsData: serviceConfigsData});
+      var r = installerStep7Controller._getRecommendedDefaultsForComponent(serviceName);
+      expect(r).to.eql({c1: 'v1', c2: 'v2', c3: 'v3', c4: 'v4'});
+    });
+
+  });
+
+  describe('#loadComponentConfigs', function () {
+
+    beforeEach(function () {
+      sinon.stub(installerStep7Controller, '_updateValidatorsForConfig', Em.K);
+      sinon.stub(installerStep7Controller, '_updateOverridesForConfig', Em.K);
+      sinon.stub(installerStep7Controller, '_updateIsEditableFlagForConfig', Em.K);
+    });
+
+    afterEach(function () {
+      installerStep7Controller._updateIsEditableFlagForConfig.restore();
+      installerStep7Controller._updateOverridesForConfig.restore();
+      installerStep7Controller._updateValidatorsForConfig.restore();
+    });
+
+    it('should set recommended defaults', function () {
+      var configs = [],
+        serviceConfigsData = [
+          {serviceName: 's1', configsValidator: Em.Object.create({recommendedDefaults: {}})}
+        ],
+        component = Em.Object.create({serviceName: 's1'}),
+        componentConfig = {},
+        recommendedDefaults = {c1: 'v1', c2: 'v2'};
+      installerStep7Controller.reopen({serviceConfigsData: serviceConfigsData});
+      sinon.stub(installerStep7Controller, '_getRecommendedDefaultsForComponent', function () {
+        return recommendedDefaults;
+      });
+      installerStep7Controller.loadComponentConfigs(configs, componentConfig, component);
+      installerStep7Controller._getRecommendedDefaultsForComponent.restore();
+      expect(installerStep7Controller.get('serviceConfigsData.firstObject.configsValidator.recommendedDefaults')).to.eql(recommendedDefaults);
+    });
+
+    it('should skip null configs', function () {
+      var configs = [null, null, null],
+        serviceConfigsData = [
+          {serviceName: 's1'}
+        ],
+        component = Em.Object.create({serviceName: 's1'}),
+        componentConfig = Em.Object.create({configs: []});
+      installerStep7Controller.reopen({serviceConfigsData: serviceConfigsData});
+      installerStep7Controller.loadComponentConfigs(configs, componentConfig, component);
+      expect(componentConfig.get('configs.length')).to.equal(0);
+    });
+
+    it('should update isOverridable flag', function () {
+      var configs = [Em.Object.create({validate: Em.K}), Em.Object.create({validate: Em.K})],
+        componentConfig = Em.Object.create({configs: []}),
+        serviceConfigsData = [
+          {serviceName: 's1'}
+        ],
+        component = Em.Object.create({serviceName: 's1'});
+      installerStep7Controller.reopen({serviceConfigsData: serviceConfigsData});
+      installerStep7Controller.loadComponentConfigs(configs, componentConfig, component);
+      expect(componentConfig.get('configs').getEach('isOverridable')).to.eql([true, true]);
+    });
+
+    it('should update value for checkboxes', function () {
+      var configs = [
+          Em.Object.create({displayType: 'checkbox', value: 'true', validate: Em.K}),
+          Em.Object.create({displayType: 'checkbox', value: 'false', validate: Em.K})
+        ],
+        componentConfig = Em.Object.create({configs: []}),
+        serviceConfigsData = [
+          {serviceName: 's1'}
+        ],
+        component = Em.Object.create({serviceName: 's1'});
+      installerStep7Controller.reopen({serviceConfigsData: serviceConfigsData});
+      installerStep7Controller.loadComponentConfigs(configs, componentConfig, component);
+      expect(componentConfig.get('configs').getEach('value')).to.eql([true, false]);
+      expect(componentConfig.get('configs').getEach('defaultValue')).to.eql([true, false]);
+    });
+
+  });
+
+  describe('#_createSiteToTagMap', function () {
+    it('should map sites', function () {
+      var desired_configs = {
+          s1: {tag: 't1'},
+          s2: {tag: 't1'},
+          s3: {tag: 't3'},
+          s4: {tag: 't1'},
+          s5: {tag: 't2'}
+        },
+        sites = ['s1', 's2', 's3'],
+        expected = {s1: 't1', s2: 't1', s3: 't3'};
+      var r = installerStep7Controller._createSiteToTagMap(desired_configs, sites);
+      expect(r).to.eql(expected);
     });
   });