Repository: ambari
Updated Branches:
  refs/heads/trunk 2913de53c -> bba27c813


AMBARI-17606. Configs validation: UI warnings (not stack_advisor) are displayed 
only if service tab was previously opened (alexantonenko)


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

Branch: refs/heads/trunk
Commit: bba27c81351eaefe8b3e147936b72548eccfffbe
Parents: 2913de5
Author: Alex Antonenko <[email protected]>
Authored: Thu Jul 7 15:18:13 2016 +0300
Committer: Alex Antonenko <[email protected]>
Committed: Thu Jul 7 19:09:55 2016 +0300

----------------------------------------------------------------------
 ambari-web/app/controllers/wizard.js            |   5 +-
 .../configs/config_recommendation_parser.js     | 392 ++++++++++---------
 ...onfig_with_override_recommendation_parser.js | 172 ++++----
 ambari-web/app/utils/config.js                  |   4 +-
 .../config_recommendation_parser_test.js        |   8 +-
 ambari-web/test/utils/config_test.js            |   4 +-
 6 files changed, 298 insertions(+), 287 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/bba27c81/ambari-web/app/controllers/wizard.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard.js 
b/ambari-web/app/controllers/wizard.js
index 9dba647..3bf3c05 100644
--- a/ambari-web/app/controllers/wizard.js
+++ b/ambari-web/app/controllers/wizard.js
@@ -928,10 +928,7 @@ App.WizardController = 
Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
           _configProperties.get('filename'),
           // need to invert boolean because this argument will be inverted in 
method body
           !_configProperties.get('isUserProperty'),
-          {
-            value: _configProperties.get('value'),
-            isRequired: _configProperties.get('isRequired')
-           }
+          _configProperties.getProperties('value', 'isRequired', 
'errorMessage', 'warnMessage')
         );
         configProperty = App.config.mergeStaticProperties(configProperty, 
_configProperties, [], ['name', 'filename', 'isUserProperty', 'value']);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/bba27c81/ambari-web/app/mixins/common/configs/config_recommendation_parser.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/app/mixins/common/configs/config_recommendation_parser.js 
b/ambari-web/app/mixins/common/configs/config_recommendation_parser.js
index 7c5d2ae..ec5358b 100644
--- a/ambari-web/app/mixins/common/configs/config_recommendation_parser.js
+++ b/ambari-web/app/mixins/common/configs/config_recommendation_parser.js
@@ -21,7 +21,7 @@ var validator = require('utils/validator');
 
 App.ConfigRecommendationParser = Em.Mixin.create(App.ConfigRecommendations, {
 
-       stepConfigs: [],
+  stepConfigs: [],
 
   modifiedFileNames: [],
 
@@ -36,20 +36,20 @@ App.ConfigRecommendationParser = 
Em.Mixin.create(App.ConfigRecommendations, {
       this.get('modifiedFileNames').push(filename);
   },
 
-       /**
-        * Method that goes through all configs
-        * and apply recommendations using callbacks
-        *
-        * @param recommendationObject
-        * @param configs
-        * @param parentProperties
-        * @param configGroup
-        * @param updateCallback
-        * @param removeCallback
-        * @param updateBoundariesCallback
-        */
-       parseRecommendations: function(recommendationObject, configs, 
parentProperties, configGroup,
-                                      updateCallback, removeCallback, 
updateBoundariesCallback) {
+  /**
+   * Method that goes through all configs
+   * and apply recommendations using callbacks
+   *
+   * @param recommendationObject
+   * @param configs
+   * @param parentProperties
+   * @param configGroup
+   * @param updateCallback
+   * @param removeCallback
+   * @param updateBoundariesCallback
+   */
+  parseRecommendations: function(recommendationObject, configs, 
parentProperties, configGroup,
+                                 updateCallback, removeCallback, 
updateBoundariesCallback) {
 
     App.assertObject(recommendationObject);
     App.assertArray(configs);
@@ -57,25 +57,25 @@ App.ConfigRecommendationParser = 
Em.Mixin.create(App.ConfigRecommendations, {
     App.assertFunction(removeCallback);
     App.assertFunction(updateBoundariesCallback);
 
-               var propertiesToDelete = [];
-               configs.forEach(function (config) {
-                       var name = Em.get(config, 'name'), fileName = 
Em.get(config, 'filename'),
-                               recommendations = 
recommendationObject[App.config.getConfigTagFromFileName(fileName)];
+    var propertiesToDelete = [];
+    configs.forEach(function (config) {
+      var name = Em.get(config, 'name'), fileName = Em.get(config, 'filename'),
+        recommendations = 
recommendationObject[App.config.getConfigTagFromFileName(fileName)];
 
-                       if (recommendations) {
+      if (recommendations) {
 
-                               if (recommendations.properties) {
-                                       var recommendedValue = 
App.config.formatValue(recommendations.properties[name]);
-                                       if (!Em.isNone(recommendedValue)) {
-                                               /** update config **/
-                                               updateCallback(config, 
recommendedValue, parentProperties, configGroup);
+        if (recommendations.properties) {
+          var recommendedValue = 
App.config.formatValue(recommendations.properties[name]);
+          if (!Em.isNone(recommendedValue)) {
+            /** update config **/
+            updateCallback(config, recommendedValue, parentProperties, 
configGroup);
 
-                                               delete 
recommendations.properties[name];
-                                       }
-                               }
+            delete recommendations.properties[name];
+          }
+        }
 
-                               if (recommendations.property_attributes) {
-                                       var propertyAttributes = 
recommendations.property_attributes[name];
+        if (recommendations.property_attributes) {
+          var propertyAttributes = recommendations.property_attributes[name];
           if (propertyAttributes) {
             var stackProperty = App.configsCollection.getConfigByName(name, 
fileName);
             for (var attr in propertyAttributes) {
@@ -87,94 +87,98 @@ App.ConfigRecommendationParser = 
Em.Mixin.create(App.ConfigRecommendations, {
               }
             }
           }
-                               }
-                       }
-               }, this);
-
-               if (propertiesToDelete.length) {
-                       propertiesToDelete.forEach(function (property) {
-                               /** remove config **/
-                               removeCallback(property, configs, 
parentProperties, configGroup);
-
-                       }, this);
-               }
-       },
-
-       /**
-        * Method that goes through all configs
-        * and apply recommendations to configs when it's needed
-        *
-        * @param {Object} recommendationObject
-        * @param {Object[]} configs
-        * @param {Object[]} parentProperties
-        */
-       updateConfigsByRecommendations: function (recommendationObject, 
configs, parentProperties) {
-               this.parseRecommendations(recommendationObject, configs, 
parentProperties, null,
-                       this._updateConfigByRecommendation.bind(this), 
this._removeConfigByRecommendation.bind(this), 
this._updateBoundaries.bind(this));
-       },
-
-       /**
-        * This method goes through all config recommendations
-        * and trying to add new properties
-        *
-        * @param {Object} recommendationObject
-        * @param {Object[]} parentProperties
-        */
-       addByRecommendations: function (recommendationObject, parentProperties) 
{
+        }
+      }
+    }, this);
+
+    if (propertiesToDelete.length) {
+      propertiesToDelete.forEach(function (property) {
+        /** remove config **/
+        removeCallback(property, configs, parentProperties, configGroup);
+
+      }, this);
+    }
+  },
+
+  /**
+   * Method that goes through all configs
+   * and apply recommendations to configs when it's needed
+   *
+   * @param {Object} recommendationObject
+   * @param {Object[]} configs
+   * @param {Object[]} parentProperties
+   */
+  updateConfigsByRecommendations: function (recommendationObject, configs, 
parentProperties) {
+    this.parseRecommendations(recommendationObject, configs, parentProperties, 
null,
+      this._updateConfigByRecommendation.bind(this), 
this._removeConfigByRecommendation.bind(this), 
this._updateBoundaries.bind(this));
+  },
+
+  /**
+   * This method goes through all config recommendations
+   * and trying to add new properties
+   *
+   * @param {Object} recommendationObject
+   * @param {Object[]} parentProperties
+   */
+  addByRecommendations: function (recommendationObject, parentProperties) {
     App.assertObject(recommendationObject);
 
-               for (var site in recommendationObject) {
-                       var properties = recommendationObject[site].properties;
-                       if (properties && Object.keys(properties).length) {
-                               var stepConfig = 
App.config.getStepConfigForProperty(this.get('stepConfigs'), site), configs = 
[];
-                               if (stepConfig) {
-                                       for (var propertyName in properties) {
-                                               if 
(this.allowUpdateProperty(parentProperties, propertyName, site)) {
+    for (var site in recommendationObject) {
+      var properties = recommendationObject[site].properties;
+      if (properties && Object.keys(properties).length) {
+        var stepConfig = 
App.config.getStepConfigForProperty(this.get('stepConfigs'), site), configs = 
[];
+        if (stepConfig) {
+          for (var propertyName in properties) {
+            if (this.allowUpdateProperty(parentProperties, propertyName, 
site)) {
               configs.pushObject(this._createNewProperty(propertyName, site, 
stepConfig.get('serviceName'), properties[propertyName], parentProperties));
-                                               }
-                                       }
+            }
+          }
           if (configs.length) {
             var mergedConfigs = configs.concat(stepConfig.get('configs'));
             stepConfig.set('configs', mergedConfigs);
           }
-                               }
-                       }
-               }
-       },
-
-       /**
-        * Update config based on recommendations
-        *
-        * @param {recommendation} config
-        * @param {String} recommendedValue
-        * @param {String[]} [parentProperties]
+        }
+      }
+    }
+  },
+
+  /**
+   * Update config based on recommendations
+   *
+   * @param {recommendation} config
+   * @param {String} recommendedValue
+   * @param {String[]} [parentProperties]
    * @returns {recommendation}
-        * @protected
-        */
-       _updateConfigByRecommendation: function (config, recommendedValue, 
parentProperties) {
+   * @protected
+   */
+  _updateConfigByRecommendation: function (config, recommendedValue, 
parentProperties) {
     App.assertObject(config);
 
-               Em.set(config, 'recommendedValue', recommendedValue);
-               if (this.allowUpdateProperty(parentProperties, Em.get(config, 
'name'), Em.get(config, 'filename'))) {
-                       Em.set(config, 'value', recommendedValue);
-                       this.applyRecommendation(Em.get(config, 'name'), 
Em.get(config, 'filename'), Em.get(config, 'group.name'), recommendedValue, 
this._getInitialValue(config), parentProperties);
-               }
-               if (this.updateInitialOnRecommendations(Em.get(config, 
'serviceName'))) {
-                       Em.set(config, 'initialValue', recommendedValue);
-               }
+    Em.set(config, 'recommendedValue', recommendedValue);
+    if (this.allowUpdateProperty(parentProperties, Em.get(config, 'name'), 
Em.get(config, 'filename'))) {
+      Em.setProperties(config, {
+        value: recommendedValue,
+        errorMessage: '',
+        warnMessage: ''
+      });
+      this.applyRecommendation(Em.get(config, 'name'), Em.get(config, 
'filename'), Em.get(config, 'group.name'), recommendedValue, 
this._getInitialValue(config), parentProperties);
+    }
+    if (this.updateInitialOnRecommendations(Em.get(config, 'serviceName'))) {
+      Em.set(config, 'initialValue', recommendedValue);
+    }
     return config;
-       },
+  },
 
-       /**
-        * Add config based on recommendations
-        *
-        * @param name
-        * @param fileName
+  /**
+   * Add config based on recommendations
+   *
+   * @param name
+   * @param fileName
    * @param serviceName
-        * @param recommendedValue
-        * @param parentProperties
-        * @protected
-        */
+   * @param recommendedValue
+   * @param parentProperties
+   * @protected
+   */
   _createNewProperty: function (name, fileName, serviceName, recommendedValue, 
parentProperties) {
     App.assertExists(name, 'name');
     App.assertExists(fileName, 'fileName');
@@ -209,15 +213,15 @@ App.ConfigRecommendationParser = 
Em.Mixin.create(App.ConfigRecommendations, {
   },
 
 
-       /**
-        * Remove config based on recommendations
-        *
-        * @param config
-        * @param configsCollection
-        * @param parentProperties
-        * @protected
-        */
-       _removeConfigByRecommendation: function (config, configsCollection, 
parentProperties) {
+  /**
+   * Remove config based on recommendations
+   *
+   * @param config
+   * @param configsCollection
+   * @param parentProperties
+   * @protected
+   */
+  _removeConfigByRecommendation: function (config, configsCollection, 
parentProperties) {
     App.assertObject(config);
     App.assertArray(configsCollection);
 
@@ -225,11 +229,11 @@ App.ConfigRecommendationParser = 
Em.Mixin.create(App.ConfigRecommendations, {
       this.addModifiedFileName(Em.get(config, 'filename'));
     }
 
-               configsCollection.removeObject(config);
+    configsCollection.removeObject(config);
 
-               this.applyRecommendation(Em.get(config, 'name'), Em.get(config, 
'filename'), Em.get(config, 'group.name'),
-                       null, this._getInitialValue(config), parentProperties);
-       },
+    this.applyRecommendation(Em.get(config, 'name'), Em.get(config, 
'filename'), Em.get(config, 'group.name'),
+      null, this._getInitialValue(config), parentProperties);
+  },
 
   /**
    * Defines if property was defined on initial load or was saved.
@@ -243,31 +247,31 @@ App.ConfigRecommendationParser = 
Em.Mixin.create(App.ConfigRecommendations, {
     return !Em.isNone(Em.get(config, 'savedValue')) && 
!Em.isNone(Em.get(config, 'initialValue'));
   },
 
-       /**
-        * Update config valueAttributes by recommendations
-        *
-        * @param {Object} stackProperty
-        * @param {string} attr
-        * @param {Number|String|Boolean} value
-        * @param {String} name
-        * @param {String} fileName
-        * @protected
-        */
-       _updateBoundaries: function(stackProperty, attr, value, name, fileName) 
{
-               if (attr === 'visible') {
-                       var p = 
App.config.findConfigProperty(this.get('stepConfigs'), name, 
App.config.getOriginalFileName(fileName));
-                       if (p) {
-                               p.set('isVisible', value);
-                       }
-               }
-               if (stackProperty) {
-                       if (!Em.get(stackProperty, 'valueAttributes')) {
-                               stackProperty.valueAttributes = {};
-                       }
-                       Em.set(stackProperty.valueAttributes, attr, value);
-               }
+  /**
+   * Update config valueAttributes by recommendations
+   *
+   * @param {Object} stackProperty
+   * @param {string} attr
+   * @param {Number|String|Boolean} value
+   * @param {String} name
+   * @param {String} fileName
+   * @protected
+   */
+  _updateBoundaries: function(stackProperty, attr, value, name, fileName) {
+    if (attr === 'visible') {
+      var p = App.config.findConfigProperty(this.get('stepConfigs'), name, 
App.config.getOriginalFileName(fileName));
+      if (p) {
+        p.set('isVisible', value);
+      }
+    }
+    if (stackProperty) {
+      if (!Em.get(stackProperty, 'valueAttributes')) {
+        stackProperty.valueAttributes = {};
+      }
+      Em.set(stackProperty.valueAttributes, attr, value);
+    }
     return stackProperty || null;
-       },
+  },
 
   /**
    * Get initial config value that was before recommendations was applied
@@ -285,56 +289,56 @@ App.ConfigRecommendationParser = 
Em.Mixin.create(App.ConfigRecommendations, {
     }
   },
 
-       /**
-        * Get default config value
-        * <code>savedValue<code> for installed services
-        * <code>initialValue<code> for new services
-        *
-        * @param configProperty
-        * @returns {*}
-        * @protected
-        */
-       _getInitialValue: function (configProperty) {
-               if (!configProperty) return null;
-               return this.useInitialValue(Em.get(configProperty, 
'serviceName')) ?
-                       Em.get(configProperty, 'initialValue') : 
Em.get(configProperty, 'savedValue');
-       },
-
-       /**
-        * Update initial only when <code>initialValue<code> is used
-        *
-        * @param {string} serviceName
-        * @returns {boolean}
-        */
-       updateInitialOnRecommendations: function(serviceName) {
-               return this.useInitialValue(serviceName);
-       },
-
-       /**
-        * Defines if initialValue of config can be used on current controller
-        * if not savedValue is used instead
-        *
-        * @param {String} serviceName
-        * @return {boolean}
-        */
-       useInitialValue: function (serviceName) {
-               return false;
-       },
-
-       /**
-        * Defines if recommendation allowed to be applied
-        *
-        * @param parentProperties
-        * @param name
-        * @param fileName
-        * @param [configGroup]
-        * @returns {boolean}
-        */
-       allowUpdateProperty: function (parentProperties, name, fileName, 
configGroup) {
-               try {
-                       return Em.get(this.getRecommendation(name, fileName, 
configGroup), 'saveRecommended');
-               } catch (e) {
-                       return true;
-               }
-       }
+  /**
+   * Get default config value
+   * <code>savedValue<code> for installed services
+   * <code>initialValue<code> for new services
+   *
+   * @param configProperty
+   * @returns {*}
+   * @protected
+   */
+  _getInitialValue: function (configProperty) {
+    if (!configProperty) return null;
+    return this.useInitialValue(Em.get(configProperty, 'serviceName')) ?
+      Em.get(configProperty, 'initialValue') : Em.get(configProperty, 
'savedValue');
+  },
+
+  /**
+   * Update initial only when <code>initialValue<code> is used
+   *
+   * @param {string} serviceName
+   * @returns {boolean}
+   */
+  updateInitialOnRecommendations: function(serviceName) {
+    return this.useInitialValue(serviceName);
+  },
+
+  /**
+   * Defines if initialValue of config can be used on current controller
+   * if not savedValue is used instead
+   *
+   * @param {String} serviceName
+   * @return {boolean}
+   */
+  useInitialValue: function (serviceName) {
+    return false;
+  },
+
+  /**
+   * Defines if recommendation allowed to be applied
+   *
+   * @param parentProperties
+   * @param name
+   * @param fileName
+   * @param [configGroup]
+   * @returns {boolean}
+   */
+  allowUpdateProperty: function (parentProperties, name, fileName, 
configGroup) {
+    try {
+      return Em.get(this.getRecommendation(name, fileName, configGroup), 
'saveRecommended');
+    } catch (e) {
+      return true;
+    }
+  }
 });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/bba27c81/ambari-web/app/mixins/common/configs/config_with_override_recommendation_parser.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/app/mixins/common/configs/config_with_override_recommendation_parser.js
 
b/ambari-web/app/mixins/common/configs/config_with_override_recommendation_parser.js
index 0898ed9..c39b9dd 100644
--- 
a/ambari-web/app/mixins/common/configs/config_with_override_recommendation_parser.js
+++ 
b/ambari-web/app/mixins/common/configs/config_with_override_recommendation_parser.js
@@ -20,94 +20,96 @@ var App = require('app');
 
 App.ConfigWithOverrideRecommendationParser = 
Em.Mixin.create(App.ConfigRecommendationParser, {
 
-       /**
-        * Method that goes through all configs
-        * and apply recommendations to overrides when it's needed
-        *
-        * @param {Object} recommendationObject
-        * @param {Object[]} configs
-        * @param {Object[]} parentProperties
-        * @param {App.ServiceConfigGroup} configGroup
-        */
-       updateOverridesByRecommendations: function (recommendationObject, 
configs, parentProperties, configGroup) {
-               Em.assert('Config groups should be defined and not default', 
configGroup && configGroup.get('name') && !configGroup.get('isDefault'));
-               this.parseRecommendations(recommendationObject, configs, 
parentProperties, configGroup,
-                       this._updateOverride.bind(this), 
this._removeOverride.bind(this), this._updateOverrideBoundaries.bind(this));
-       },
+  /**
+   * Method that goes through all configs
+   * and apply recommendations to overrides when it's needed
+   *
+   * @param {Object} recommendationObject
+   * @param {Object[]} configs
+   * @param {Object[]} parentProperties
+   * @param {App.ServiceConfigGroup} configGroup
+   */
+  updateOverridesByRecommendations: function (recommendationObject, configs, 
parentProperties, configGroup) {
+    Em.assert('Config groups should be defined and not default', configGroup 
&& configGroup.get('name') && !configGroup.get('isDefault'));
+    this.parseRecommendations(recommendationObject, configs, parentProperties, 
configGroup,
+      this._updateOverride.bind(this), this._removeOverride.bind(this), 
this._updateOverrideBoundaries.bind(this));
+  },
 
-       /**
-        * Update override by recommendations
-        * includes add/update actions
-        *
-        * @param config
-        * @param recommendedValue
-        * @param parentProperties
-        * @param configGroup
-        * @protected
-        */
-       _updateOverride: function(config, recommendedValue, parentProperties, 
configGroup) {
-               var updateValue = this.allowUpdateProperty(parentProperties, 
Em.get(config, 'name'), Em.get(config, 'filename'), configGroup.get('name'));
-               var override = config.getOverride(configGroup.get('name'));
-               if (override) {
-                       this._updateConfigByRecommendation(override, 
recommendedValue, parentProperties);
-               } else if (updateValue) {
-                       this._addConfigOverrideRecommendation(config, 
recommendedValue, parentProperties, configGroup);
-               }
-       },
+  /**
+   * Update override by recommendations
+   * includes add/update actions
+   *
+   * @param config
+   * @param recommendedValue
+   * @param parentProperties
+   * @param configGroup
+   * @protected
+   */
+  _updateOverride: function(config, recommendedValue, parentProperties, 
configGroup) {
+    var updateValue = this.allowUpdateProperty(parentProperties, 
Em.get(config, 'name'), Em.get(config, 'filename'), configGroup.get('name'));
+    var override = config.getOverride(configGroup.get('name'));
+    if (override) {
+      this._updateConfigByRecommendation(override, recommendedValue, 
parentProperties);
+    } else if (updateValue) {
+      this._addConfigOverrideRecommendation(config, recommendedValue, 
parentProperties, configGroup);
+    }
+  },
 
-       /**
-        * Remove override by recommendations
-        *
-        * @param property
-        * @param configs
-        * @param parentProperties
-        * @param configGroup
-        * @protected
-        */
-       _removeOverride: function(property, configs, parentProperties, 
configGroup) {
-               
this._removeConfigByRecommendation(property.getOverride(configGroup.get('name')),
 property.get('overrides') || [], parentProperties);
-       },
+  /**
+   * Remove override by recommendations
+   *
+   * @param property
+   * @param configs
+   * @param parentProperties
+   * @param configGroup
+   * @protected
+   */
+  _removeOverride: function(property, configs, parentProperties, configGroup) {
+    
this._removeConfigByRecommendation(property.getOverride(configGroup.get('name')),
 property.get('overrides') || [], parentProperties);
+  },
 
-       /**
-        * Add override by recommendations
-        *
-        * @param config
-        * @param recommendedValue
-        * @param configGroup
-        * @param parentProperties
-        * @protected
-        */
-       _addConfigOverrideRecommendation: function (config, recommendedValue, 
parentProperties, configGroup) {
-               var popupProperty = this.getRecommendation(Em.get(config, 
'name'), Em.get(config, 'filename'), configGroup.get('name')),
-                       initialValue = popupProperty ? popupProperty.value : 
null;
-               var coreObject = {
-                       "value": recommendedValue,
-                       "recommendedValue": recommendedValue,
-                       "initialValue": initialValue,
-                       "savedValue": !this.useInitialValue(Em.get(config, 
'serviceName')) && !Em.isNone(initialValue) ? initialValue : null,
-                       "isEditable": true
-               };
-               var override = App.config.createOverride(config, coreObject, 
configGroup);
+  /**
+   * Add override by recommendations
+   *
+   * @param config
+   * @param recommendedValue
+   * @param configGroup
+   * @param parentProperties
+   * @protected
+   */
+  _addConfigOverrideRecommendation: function (config, recommendedValue, 
parentProperties, configGroup) {
+    var popupProperty = this.getRecommendation(Em.get(config, 'name'), 
Em.get(config, 'filename'), configGroup.get('name')),
+      initialValue = popupProperty ? popupProperty.value : null;
+    var coreObject = {
+      "value": recommendedValue,
+      "recommendedValue": recommendedValue,
+      "initialValue": initialValue,
+      "savedValue": !this.useInitialValue(Em.get(config, 'serviceName')) && 
!Em.isNone(initialValue) ? initialValue : null,
+      "isEditable": true,
+      "errorMessage": '',
+      "warnMessage": ''
+    };
+    var override = App.config.createOverride(config, coreObject, configGroup);
 
-               this.applyRecommendation(Em.get(config, 'name'), Em.get(config, 
'filename'), configGroup.get('name'),
-                       recommendedValue, this._getInitialValue(override), 
parentProperties);
-       },
+    this.applyRecommendation(Em.get(config, 'name'), Em.get(config, 
'filename'), configGroup.get('name'),
+      recommendedValue, this._getInitialValue(override), parentProperties);
+  },
 
-       /**
-        * Update override valueAttributes by recommendations
-        *
-        * @param {Object} stackProperty
-        * @param {string} attr
-        * @param {Number|String|Boolean} value
-        * @param {String} name
-        * @param {String} fileName
-        * @param {App.ServiceConfigGroup} configGroup
-        * @protected
-        */
-       _updateOverrideBoundaries: function(stackProperty, attr, value, name, 
fileName, configGroup) {
-               if (!stackProperty.valueAttributes[configGroup.get('name')]) {
-                       stackProperty.valueAttributes[configGroup.get('name')] 
= {};
-               }
-               Em.set(stackProperty.valueAttributes[configGroup.get('name')], 
attr, value);
-       }
+  /**
+   * Update override valueAttributes by recommendations
+   *
+   * @param {Object} stackProperty
+   * @param {string} attr
+   * @param {Number|String|Boolean} value
+   * @param {String} name
+   * @param {String} fileName
+   * @param {App.ServiceConfigGroup} configGroup
+   * @protected
+   */
+  _updateOverrideBoundaries: function(stackProperty, attr, value, name, 
fileName, configGroup) {
+    if (!stackProperty.valueAttributes[configGroup.get('name')]) {
+      stackProperty.valueAttributes[configGroup.get('name')] = {};
+    }
+    Em.set(stackProperty.valueAttributes[configGroup.get('name')], attr, 
value);
+  }
 });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/bba27c81/ambari-web/app/utils/config.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js
index 4fa8aa8..6c6e7f6 100644
--- a/ambari-web/app/utils/config.js
+++ b/ambari-web/app/utils/config.js
@@ -323,7 +323,9 @@ App.config = Em.Object.create({
       dependentConfigPattern: null,
       options: null,
       radioName: null,
-      widgetType: null
+      widgetType: null,
+      errorMessage: '',
+      warnMessage: ''
     };
     return Object.keys(coreObject|| {}).length ?
       $.extend(tpl, coreObject) : tpl;

http://git-wip-us.apache.org/repos/asf/ambari/blob/bba27c81/ambari-web/test/mixins/common/configs/config_recommendation_parser_test.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/test/mixins/common/configs/config_recommendation_parser_test.js 
b/ambari-web/test/mixins/common/configs/config_recommendation_parser_test.js
index 1b84509..c5ccdb9 100644
--- a/ambari-web/test/mixins/common/configs/config_recommendation_parser_test.js
+++ b/ambari-web/test/mixins/common/configs/config_recommendation_parser_test.js
@@ -194,7 +194,9 @@ describe('App.ConfigRecommendationParser', function() {
         'result': {
           'recommendedValue': 'recommendedValue',
           'value': 'recommendedValue',
-          'initialValue': 'recommendedValue'
+          'initialValue': 'recommendedValue',
+          'errorMessage': '',
+          'warnMessage': ''
         }
       },
       {
@@ -204,7 +206,9 @@ describe('App.ConfigRecommendationParser', function() {
         'result': {
           'recommendedValue': 'recommendedValue',
           'value': 'recommendedValue',
-          'initialValue': null
+          'initialValue': null,
+          'errorMessage': '',
+          'warnMessage': ''
         }
       },
       {

http://git-wip-us.apache.org/repos/asf/ambari/blob/bba27c81/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 d0f9c37..7b7dfa9 100644
--- a/ambari-web/test/utils/config_test.js
+++ b/ambari-web/test/utils/config_test.js
@@ -708,7 +708,9 @@ describe('App.config', function () {
       dependentConfigPattern: null,
       options: null,
       radioName: null,
-      widgetType: null
+      widgetType: null,
+      errorMessage: '',
+      warnMessage: ''
     };
     it('create default config object', function () {
       expect(App.config.createDefaultConfig('pName', 'pFileName', 
true)).to.eql(res);

Reply via email to