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/10 14:56:37 UTC

ambari git commit: AMBARI-10434 Reverting config (by clicking default) does not revert changed configs warnings. (ababiichuk)

Repository: ambari
Updated Branches:
  refs/heads/trunk 53da928ba -> 26472889f


AMBARI-10434 Reverting config (by clicking default) does not revert changed configs warnings. (ababiichuk)


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

Branch: refs/heads/trunk
Commit: 26472889fd57aa6182af7e1727eb97c563f90495
Parents: 53da928
Author: aBabiichuk <ab...@cybervisiontech.com>
Authored: Fri Apr 10 15:53:01 2015 +0300
Committer: aBabiichuk <ab...@cybervisiontech.com>
Committed: Fri Apr 10 15:56:23 2015 +0300

----------------------------------------------------------------------
 .../mixins/common/configs/enhanced_configs.js   | 19 ++++---
 .../unit_convert/base_unit_convert_mixin.js     |  1 +
 .../configs/widgets/config_widget_view.js       |  5 +-
 .../widgets/slider_config_widget_view.js        | 18 ++++---
 ambari-web/app/views/common/controls_view.js    | 34 ++++++++++++-
 .../configs/widgets/config_widget_view_test.js  | 52 ++++++++++++++++++++
 .../widgets/list_config_widget_view_test.js     |  2 +
 7 files changed, 114 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/26472889/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 1781d5d..1a53b7f 100644
--- a/ambari-web/app/mixins/common/configs/enhanced_configs.js
+++ b/ambari-web/app/mixins/common/configs/enhanced_configs.js
@@ -54,6 +54,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
    *   saveRecommendedDefault: {boolean}, used for cancel operation to restore previous state
    *   fileName: {string}, //file name without '.xml'
    *   propertyName: {string},
+   *   parentConfigs: {string[]} // name of the parent configs
    *   configGroup: {string},
    *   value: {string},
    *   serviceName: {string},
@@ -63,7 +64,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
    * }
    * @private
    */
-  _dependentConfigValues: [],
+  _dependentConfigValues: Em.A([]),
 
   /**
    * dependent properties that was changed by Ambari
@@ -168,9 +169,9 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
 
   /**
    * sends request to get values for dependent configs
-   * @param changedConfigs
-   * @param initial
-   * @param onComplete
+   * @param {Object[]} changedConfigs - list of changed configs to track recommendations
+   * @param {Boolean} initial
+   * @param {Function} onComplete
    * @returns {$.ajax|null}
    */
   getRecommendationsForDependencies: function(changedConfigs, initial, onComplete) {
@@ -220,7 +221,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
    * @method dependenciesSuccess
    */
   dependenciesSuccess: function (data, opt, params) {
-    this._saveRecommendedValues(data, params.initial);
+    this._saveRecommendedValues(data, params.initial, params.dataToSend.changed_configurations);
     this._updateDependentConfigs();
   },
 
@@ -378,14 +379,16 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
 
   /**
    * saves values from response for dependent configs to <code>_dependentConfigValues<code>
-   * @param data
+   * @param data - JSON response from `recommendations` endpoint
    * @param updateOnlyBoundaries
+   * @param {App.ServiceConfigProperty[]} parentConfigs - config properties for which recommendations were recieved
    * @method saveRecommendedValues
    * @private
    */
-  _saveRecommendedValues: function(data, updateOnlyBoundaries) {
+  _saveRecommendedValues: function(data, updateOnlyBoundaries, parentConfigs) {
     Em.assert('invalid data - `data.resources[0].recommendations.blueprint.configurations` not defined ', data && data.resources[0] && Em.get(data.resources[0], 'recommendations.blueprint.configurations'));
     var configs = data.resources[0].recommendations.blueprint.configurations;
+    var parentPropertiesNames = parentConfigs ? parentConfigs.mapProperty('name') : [];
     /** get all configs by config group **/
     var stepConfigsByGroup = this._getConfigsByGroup(this.get('stepConfigs'));
     for (var key in configs) {
@@ -410,6 +413,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
               if (value != configs[key].properties[propertyName]) {
                 Em.set(dependentProperty, 'value', value);
                 Em.set(dependentProperty, 'recommendedValue', configs[key].properties[propertyName]);
+                Em.set(dependentProperty, 'parentConfigs', dependentProperty.parentConfigs.concat(parentPropertiesNames).uniq());
               }
             } else {
               if (value != configs[key].properties[propertyName]) {
@@ -420,6 +424,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
                   propertyName: propertyName,
                   configGroup: group ? group.get('name') : service.get('displayName') + " Default",
                   value: value,
+                  parentConfigs: parentPropertiesNames,
                   serviceName: serviceName,
                   allowChangeGroup: serviceName != this.get('content.serviceName') && !this.get('selectedConfigGroup.isDefault'),
                   serviceDisplayName: service.get('displayName'),

http://git-wip-us.apache.org/repos/asf/ambari/blob/26472889/ambari-web/app/mixins/unit_convert/base_unit_convert_mixin.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/unit_convert/base_unit_convert_mixin.js b/ambari-web/app/mixins/unit_convert/base_unit_convert_mixin.js
index 4ba70a3..3863c43 100644
--- a/ambari-web/app/mixins/unit_convert/base_unit_convert_mixin.js
+++ b/ambari-web/app/mixins/unit_convert/base_unit_convert_mixin.js
@@ -205,4 +205,5 @@ App.BaseUnitConvertMixin = Em.Mixin.create({
     }
     return isInt(value) ? value : parseFloat(value.toFixed(2));
   }
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/26472889/ambari-web/app/views/common/configs/widgets/config_widget_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/widgets/config_widget_view.js b/ambari-web/app/views/common/configs/widgets/config_widget_view.js
index 8598754..465439c 100644
--- a/ambari-web/app/views/common/configs/widgets/config_widget_view.js
+++ b/ambari-web/app/views/common/configs/widgets/config_widget_view.js
@@ -104,9 +104,12 @@ App.ConfigWidgetView = Em.View.extend(App.SupportsDependentConfigs, App.WidgetPo
    * @method restoreValue
    */
   restoreValue: function () {
+    var self = this;
     this.set('config.value', this.get('config.defaultValue'));
     this.get('controller').removeCurrentFromDependentList(this.get('config'));
-    this.sendRequestRorDependentConfigs(this.get('config'));
+    this.sendRequestRorDependentConfigs(this.get('config')).done(function() {
+      self.restoreDependentConfigs(self.get('config'));
+    });
 
     if (this.get('config.supportsFinal')) {
       this.get('config').set('isFinal', this.get('config.defaultIsFinal'));

http://git-wip-us.apache.org/repos/asf/ambari/blob/26472889/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js b/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js
index 6cb0602..fcdb412 100644
--- a/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js
+++ b/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js
@@ -246,18 +246,20 @@ App.SliderConfigWidgetView = App.ConfigWidgetView.extend({
       self.set('config.value', '' + self.configValueByWidget(val));
       self.set('mirrorValue', val);
     }).on('slideStop', function() {
-        /**
-         * action to run sendRequestRorDependentConfigs when
-         * we have changed config value within slider
-         */
-        self.get('controller').removeCurrentFromDependentList(self.get('config'));
-        self.sendRequestRorDependentConfigs(self.get('config'));
-      });
+      /**
+       * action to run sendRequestRorDependentConfigs when
+       * we have changed config value within slider
+       */
+      self.get('controller').removeCurrentFromDependentList(self.get('config'));
+      self.sendRequestRorDependentConfigs(self.get('config'));
+    });
     this.set('slider', slider);
     var sliderTicks = this.$('.ui-slider-wrapper:eq(0) .slider-tick');
 
-    sliderTicks.eq(defaultValueId).addClass('slider-tick-default').on('click', function() {
+    sliderTicks.eq(defaultValueId).addClass('slider-tick-default').on('mousedown', function(e) {
+      if (self.get('disabled')) return false;
       self.restoreValue();
+      e.stopPropagation();
     });
     // if mirrored value was added need to hide the tick for it
     if (defaultValueMirroredId) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/26472889/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 b661a8b..284f479 100644
--- a/ambari-web/app/views/common/controls_view.js
+++ b/ambari-web/app/views/common/controls_view.js
@@ -70,9 +70,13 @@ App.SupportsDependentConfigs = Ember.Mixin.create({
       this.get('controller').removeCurrentFromDependentList(this.get('serviceConfig'));
     }
   },
+
   /**
    * method send request to check if some of dependent configs was changes
    * and in case there was changes shows popup with info about changed configs
+   *
+   * @param {App.ServiceConfigProperty} config
+   * @returns {$.Deferred}
    */
   sendRequestRorDependentConfigs: function(config) {
     if (App.get('supports.enhancedConfigs') && ['mainServiceInfoConfigsController','wizardStep7Controller'].contains(this.get('controller.name'))) {
@@ -80,13 +84,41 @@ App.SupportsDependentConfigs = Ember.Mixin.create({
       var type = App.config.getConfigTagFromFileName(config.get('filename'));
       var p = App.StackConfigProperty.find(name + '_' + type);
       if (p && p.get('propertyDependedBy.length') > 0) {
-        this.get('controller').getRecommendationsForDependencies([{
+        return this.get('controller').getRecommendationsForDependencies([{
           "type": type,
           "name": name
         }]);
       }
     }
+
+    return $.Deferred().resolve().promise();
+  },
+
+  /**
+   * Restore values for dependent configs by parent config info.
+   * NOTE: If dependent config inherited from multiply configs its
+   * value will be restored only when all parent configs are being restored.
+   *
+   * @param {App.ServiceConfigProperty} parentConfig
+   */
+  restoreDependentConfigs: function(parentConfig) {
+    var controller = this.get('controller');
+    var dependentConfigs = controller.get('_dependentConfigValues');
+    if (controller._updateDependentConfigs) {
+      controller._updateDependentConfigs();
+      controller.set('_dependentConfigValues', dependentConfigs.reject(function(item) {
+        if (item.parentConfigs.contains(parentConfig.get('name'))) {
+          if (item.parentConfigs.length > 1) {
+            item.parentConfigs.removeObject(parentConfig.get('name'));
+          } else {
+            return true;
+          }
+        }
+        return false;
+      }));
+    }
   }
+
 });
 
 /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/26472889/ambari-web/test/views/common/configs/widgets/config_widget_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/configs/widgets/config_widget_view_test.js b/ambari-web/test/views/common/configs/widgets/config_widget_view_test.js
index 9d0f7db..823033b 100644
--- a/ambari-web/test/views/common/configs/widgets/config_widget_view_test.js
+++ b/ambari-web/test/views/common/configs/widgets/config_widget_view_test.js
@@ -149,4 +149,56 @@ describe('App.ConfigWidgetView', function () {
 
   });
 
+  describe('#restoreDependentConfigs', function() {
+    beforeEach(function() {
+      view = App.ConfigWidgetView.create({
+        controller: Em.Object.create({
+          _updateDependentConfigs: function() {}
+        }),
+        config: Em.Object.create({ name: 'config1'})
+      });
+    });
+
+    var tests = [
+      {
+        dependentConfigs: [
+          {name: 'dependent1', parentConfigs: ['config1']},
+          {name: 'dependent2', parentConfigs: ['config2']},
+          {name: 'dependent3', parentConfigs: ['config1']}
+        ],
+        e: ['dependent2'],
+        m: 'when dependent configs has one parent they should be removed'
+      },
+      {
+        dependentConfigs: [
+          {name: 'dependent1', parentConfigs: ['config1', 'config2']},
+          {name: 'dependent2', parentConfigs: ['config2']},
+          {name: 'dependent3', parentConfigs: ['config1']}
+        ],
+        e: ['dependent1', 'dependent2'],
+        m: 'when dependent configs has multiple parents they should not be removed'
+      }
+    ];
+
+    tests.forEach(function(test) {
+      it(test.m, function() {
+        view.set('controller._dependentConfigValues', test.dependentConfigs);
+        view.restoreDependentConfigs(view.get('config'));
+        expect(view.get('controller._dependentConfigValues').mapProperty('name')).to.be.eql(test.e);
+      });
+    });
+
+    it('when dependent configs has multiple parents appropriate parent config should be removed', function() {
+      view.set('controller._dependentConfigValues', [
+        {name: 'dependent1', parentConfigs: ['config1', 'config2']},
+        {name: 'dependent2', parentConfigs: ['config2', 'config1']},
+        {name: 'dependent3', parentConfigs: ['config1']}
+      ]);
+      view.restoreDependentConfigs(view.get('config'));
+      expect(view.get('controller._dependentConfigValues').findProperty('name', 'dependent1').parentConfigs.toArray()).to.be.eql(["config2"]);
+      expect(view.get('controller._dependentConfigValues').findProperty('name', 'dependent2').parentConfigs.toArray()).to.be.eql(["config2"]);
+      expect(view.get('controller._dependentConfigValues.length')).to.be.eql(2);
+    });
+
+  });
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/26472889/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js b/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js
index 01e184a..4497eb8 100644
--- a/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js
+++ b/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js
@@ -115,9 +115,11 @@ describe('App.ListConfigWidgetView', function () {
   describe('#restoreValue', function () {
 
     beforeEach(function() {
+      sinon.stub(view, 'restoreDependentConfigs', Em.K);
       sinon.stub(view.get('controller'), 'removeCurrentFromDependentList', Em.K)
     });
     afterEach(function() {
+      view.restoreDependentConfigs.restore();
       view.get('controller.removeCurrentFromDependentList').restore();
     });
     it('should restore default value', function () {