Repository: ambari
Updated Branches:
  refs/heads/trunk 5a2dbeab0 -> 3ca4b0383


AMBARI-9793. Alert Definition: Thresholds are empty after edit (onechiporenko)


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

Branch: refs/heads/trunk
Commit: 3ca4b038352457f70539a139964500a2edc03d80
Parents: 5a2dbea
Author: Oleg Nechiporenko <[email protected]>
Authored: Wed Feb 25 16:30:55 2015 +0200
Committer: Oleg Nechiporenko <[email protected]>
Committed: Wed Feb 25 17:51:42 2015 +0200

----------------------------------------------------------------------
 .../alerts/definition_configs_controller.js     | 47 ++++++++-----
 ambari-web/app/models/alert_config.js           | 72 +++++++++++---------
 ambari-web/test/models/alert_config_test.js     | 26 +++++++
 3 files changed, 96 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/3ca4b038/ambari-web/app/controllers/main/alerts/definition_configs_controller.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/app/controllers/main/alerts/definition_configs_controller.js 
b/ambari-web/app/controllers/main/alerts/definition_configs_controller.js
index 4dac378..82844ae 100644
--- a/ambari-web/app/controllers/main/alerts/definition_configs_controller.js
+++ b/ambari-web/app/controllers/main/alerts/definition_configs_controller.js
@@ -87,13 +87,36 @@ App.MainAlertDefinitionConfigsController = 
Em.Controller.extend({
    */
   changeType: function (selectedType) {
     if (selectedType === 'alert_type_service') {
-      this.get('configs').findProperty('name', 'service').set('isDisabled', 
false).set('options', this.get('allServices')).set('value', 
this.get('allServices')[0]);
-      this.get('configs').findProperty('name', 'component').set('isDisabled', 
false).set('value', 'No component');
-      this.get('configs').findProperty('name', 'scope').set('isDisabled', 
false).set('options', this.get('allScopes')).set('value', 
this.get('allScopes')[0]);
+      this.get('configs').findProperty('name', 'service').setProperties({
+        isDisabled: false,
+        options: this.get('allServices'),
+        value: this.get('allServices')[0]
+      });
+      this.get('configs').findProperty('name', 'component').setProperties({
+        isDisabled: false,
+        value: 'No component'
+      });
+      this.get('configs').findProperty('name', 'scope').setProperties({
+        isDisabled: false,
+        options: this.get('allScopes'),
+        value: this.get('allScopes')[0]
+      });
     } else {
-      this.get('configs').findProperty('name', 'service').set('isDisabled', 
true).set('options', ['Ambari']).set('value', 'Ambari');
-      this.get('configs').findProperty('name', 'component').set('isDisabled', 
true).set('options', ['Ambari Agent']).set('value', 'Ambari Agent');
-      this.get('configs').findProperty('name', 'scope').set('isDisabled', 
true).set('options', ['Host']).set('value', 'Host');
+      this.get('configs').findProperty('name', 'service').setProperties({
+        isDisabled: true,
+        options: ['Ambari'],
+        value: 'Ambari'
+      });
+      this.get('configs').findProperty('name', 'component').setProperties({
+        isDisabled: true,
+        options: ['Ambari Agent'],
+        value: 'Ambari Agent'
+      });
+      this.get('configs').findProperty('name', 'scope').setProperties({
+        isDisabled: true,
+        options: ['Host'],
+        value: 'Host'
+      });
     }
   },
 
@@ -165,14 +188,12 @@ App.MainAlertDefinitionConfigsController = 
Em.Controller.extend({
         text: isWizard ? '' : this.getThresholdsProperty('ok', 'text'),
         value: isWizard ? '' : this.getThresholdsProperty('ok', 'value')
       }),
-      App.AlertConfigProperties.Thresholds.WarningThreshold.create({
-        type: 'PORT',
+      
App.AlertConfigProperties.Thresholds.WarningThreshold.create(App.AlertConfigProperties.Thresholds.PositiveMixin,
 {
         valueMetric: 'Seconds',
         text: isWizard ? '' : this.getThresholdsProperty('warning', 'text'),
         value: isWizard ? '' : this.getThresholdsProperty('warning', 'value')
       }),
-      App.AlertConfigProperties.Thresholds.CriticalThreshold.create({
-        type: 'PORT',
+      
App.AlertConfigProperties.Thresholds.CriticalThreshold.create(App.AlertConfigProperties.Thresholds.PositiveMixin,
 {
         valueMetric: 'Seconds',
         text: isWizard ? '' : this.getThresholdsProperty('critical', 'text'),
         value: isWizard ? '' : this.getThresholdsProperty('critical', 'value')
@@ -212,13 +233,11 @@ App.MainAlertDefinitionConfigsController = 
Em.Controller.extend({
         value: isWizard ? '' : this.getThresholdsProperty('ok', 'value')
       }),
       App.AlertConfigProperties.Thresholds.WarningThreshold.create({
-        type: 'METRIC',
         valueMetric: units,
         text: isWizard ? '' : this.getThresholdsProperty('warning', 'text'),
         value: isWizard ? '' : this.getThresholdsProperty('warning', 'value')
       }),
       App.AlertConfigProperties.Thresholds.CriticalThreshold.create({
-        type: 'METRIC',
         valueMetric: units,
         text: isWizard ? '' : this.getThresholdsProperty('critical', 'text'),
         value: isWizard ? '' : this.getThresholdsProperty('critical', 'value')
@@ -256,13 +275,11 @@ App.MainAlertDefinitionConfigsController = 
Em.Controller.extend({
         value: isWizard ? '' : this.getThresholdsProperty('ok', 'value')
       }),
       App.AlertConfigProperties.Thresholds.WarningThreshold.create({
-        type: 'WEB',
         showInputForValue: false,
         text: isWizard ? '' : this.getThresholdsProperty('warning', 'text'),
         value: isWizard ? '' : this.getThresholdsProperty('warning', 'value')
       }),
       App.AlertConfigProperties.Thresholds.CriticalThreshold.create({
-        type: 'WEB',
         showInputForValue: false,
         text: isWizard ? '' : this.getThresholdsProperty('critical', 'text'),
         value: isWizard ? '' : this.getThresholdsProperty('critical', 'value')
@@ -320,13 +337,11 @@ App.MainAlertDefinitionConfigsController = 
Em.Controller.extend({
         value: isWizard ? '' : this.getThresholdsProperty('ok', 'value')
       }),
       
App.AlertConfigProperties.Thresholds.WarningThreshold.create(App.AlertConfigProperties.Thresholds.PercentageMixin,
 {
-        type: 'AGGREGATE',
         text: isWizard ? '' : this.getThresholdsProperty('warning', 'text'),
         value: isWizard ? '' : this.getThresholdsProperty('warning', 'value'),
         valueMetric: '%'
       }),
       
App.AlertConfigProperties.Thresholds.CriticalThreshold.create(App.AlertConfigProperties.Thresholds.PercentageMixin,
 {
-        type: 'AGGREGATE',
         text: isWizard ? '' : this.getThresholdsProperty('critical', 'text'),
         value: isWizard ? '' : this.getThresholdsProperty('critical', 'value'),
         valueMetric: '%'

http://git-wip-us.apache.org/repos/asf/ambari/blob/3ca4b038/ambari-web/app/models/alert_config.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/alert_config.js 
b/ambari-web/app/models/alert_config.js
index 0ba04c6..c76417e 100644
--- a/ambari-web/app/models/alert_config.js
+++ b/ambari-web/app/models/alert_config.js
@@ -17,6 +17,7 @@
  */
 
 var App = require('app');
+var validator = require('utils/validator');
 
 App.AlertConfigProperty = Ember.Object.extend({
 
@@ -302,7 +303,7 @@ App.AlertConfigProperties = {
     apiProperty: [],
 
     init: function () {
-      this.valueWasChanged();
+      this.set('displayValue', this.getNewValue());
       this._super();
     },
 
@@ -361,7 +362,7 @@ App.AlertConfigProperties = {
     valueWasChanged: function () {
       var displayValue = this.get('displayValue');
       var newDisplayValue = this.getNewValue();
-      if (Math.abs(newDisplayValue - displayValue) > 0.000001) {
+      if (newDisplayValue !== displayValue && !(isNaN(newDisplayValue) 
||isNaN(displayValue))) {
         this.set('displayValue', newDisplayValue);
       }
     }.observes('value'),
@@ -378,10 +379,23 @@ App.AlertConfigProperties = {
     displayValueWasChanged: function () {
       var value = this.get('value');
       var newValue = this.getNewDisplayValue();
-      if (Math.abs(newValue - value) > 0.000001) {
+      if (newValue !== value && !(isNaN(newValue) ||isNaN(value))) {
         this.set('value', newValue);
       }
-    }.observes('displayValue')
+    }.observes('displayValue'),
+
+    /**
+     * Check if <code>displayValue</code> is valid float number
+     * If this value isn't shown (see <code>showInputForValue</code>), result 
is always true
+     * @return {boolean}
+     */
+    isValid: function () {
+      if (!this.get('showInputForValue')) return true;
+      var value = this.get('displayValue');
+      if (Em.isNone(value)) return false;
+      value = ('' + value).trim();
+      return validator.isValidFloat(value);
+    }.property('displayValue', 'showInputForValue')
 
   }),
 
@@ -487,21 +501,7 @@ App.AlertConfigProperties.Thresholds = {
         ret.push('source.reporting.warning.text');
       }
       return ret;
-    }.property('showInputForValue', 'showInputForText'),
-
-    isValid: function () {
-      var value = this.get('displayValue');
-      if (!value && this.get('type') === 'WEB') return true;
-      if (!value) return false;
-      value = ('' + value).trim();
-      if (this.get('type') === 'AGGREGATE') {
-        return this.get('showInputForValue') ? !isNaN(value) && value > 0 && 
value <= 100 : true;
-      } else if (this.get('type') === 'PORT') {
-        return this.get('showInputForValue') ? !isNaN(value) && value > 0 : 
true;
-      } else {
-        return this.get('showInputForValue') ? !isNaN(value) : true;
-      }
-    }.property('displayValue', 'showInputForValue')
+    }.property('showInputForValue', 'showInputForText')
 
   }),
 
@@ -520,21 +520,8 @@ App.AlertConfigProperties.Thresholds = {
         ret.push('source.reporting.critical.text');
       }
       return ret;
-    }.property('showInputForValue', 'showInputForText'),
+    }.property('showInputForValue', 'showInputForText')
 
-    isValid: function () {
-      var value = this.get('displayValue');
-      if (!value && this.get('type') === 'WEB') return true;
-      if (!value) return false;
-      value = ('' + value).trim();
-        if (this.get('type') === 'AGGREGATE') {
-            return this.get('showInputForValue') ? !isNaN(value) && value > 0 
&& value <= 100 : true;
-        } else if (this.get('type') === 'PORT') {
-            return this.get('showInputForValue') ? !isNaN(value) && value > 0 
: true;
-        } else {
-            return this.get('showInputForValue') ? !isNaN(value) : true;
-        }
-    }.property('displayValue', 'showInputForValue')
   }),
 
   /**
@@ -548,6 +535,7 @@ App.AlertConfigProperties.Thresholds = {
       var value = this.get('displayValue');
       if (!value) return false;
       value = ('' + value).trim();
+      value = parseFloat(value);
       return this.get('showInputForValue') ? !isNaN(value) && value > 0 && 
value <= 100 : true;
     }.property('displayValue', 'showInputForValue'),
 
@@ -569,6 +557,24 @@ App.AlertConfigProperties.Thresholds = {
       return (displayValue && !isNaN(displayValue)) ? (Number(displayValue) / 
100) + '' : displayValue;
     }
 
+  }),
+
+  /**
+   * Mixin for <code>App.AlertConfigProperties.Threshold</code>
+   * Used to validate values that should be greater than 0
+   * @type {Em.Mixin}
+   */
+  PositiveMixin: Em.Mixin.create({
+
+    isValid: function () {
+      if (!this.get('showInputForValue')) return true;
+      var value = this.get('displayValue');
+      if (!value) return false;
+      value = ('' + value).trim();
+      value = parseFloat(value);
+      return !isNaN(value) && value > 0;
+    }.property('displayValue', 'showInputForValue')
+
   })
 
 };

http://git-wip-us.apache.org/repos/asf/ambari/blob/3ca4b038/ambari-web/test/models/alert_config_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/models/alert_config_test.js 
b/ambari-web/test/models/alert_config_test.js
index 1012a22..933a228 100644
--- a/ambari-web/test/models/alert_config_test.js
+++ b/ambari-web/test/models/alert_config_test.js
@@ -141,6 +141,32 @@ describe('App.AlertConfigProperties', function () {
 
     });
 
+    describe('#isValid', function () {
+
+      it('should be true if showInputForValue is false', function () {
+        model.set('showInputForValue', false);
+        expect(model.get('isValid')).to.be.true;
+      });
+
+      it('should be false if displayValue is null', function () {
+        model.set('displayValue', null);
+        expect(model.get('isValid')).to.be.false;
+
+        model.set('displayValue', undefined);
+        expect(model.get('isValid')).to.be.false;
+      });
+
+      it('should be true if displayValue is valid float', function () {
+        model.set('displayValue', '123.456');
+        expect(model.get('isValid')).to.be.true;
+
+        model.set('displayValue', '$1234.444');
+        expect(model.get('isValid')).to.be.false;
+      });
+
+
+    });
+
   });
 
   describe('App.AlertConfigProperties.Thresholds', function () {

Reply via email to