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/11/20 19:30:20 UTC

ambari git commit: AMBARI-8399. Alerts UI: Alerts Instances keep storing in DS.Store even after user navigate away (onechiporenko)

Repository: ambari
Updated Branches:
  refs/heads/trunk f543cc6c0 -> beccf117a


AMBARI-8399. Alerts UI: Alerts Instances keep storing in DS.Store even after user navigate away (onechiporenko)


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

Branch: refs/heads/trunk
Commit: beccf117a3e002afe39c7f75abdc553b55486d1c
Parents: f543cc6
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Thu Nov 20 19:46:33 2014 +0200
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Thu Nov 20 19:46:33 2014 +0200

----------------------------------------------------------------------
 ambari-web/app/assets/test/tests.js             |   1 +
 .../main/alerts/alert_instances_controller.js   | 109 ++++++++++----
 .../app/mappers/alert_instances_mapper.js       |  24 +++
 .../alerts/alert_instances_controller_test.js   |   4 +-
 .../test/mappers/alert_instances_mapper_test.js | 145 +++++++++++++++++++
 5 files changed, 252 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/beccf117/ambari-web/app/assets/test/tests.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/test/tests.js b/ambari-web/app/assets/test/tests.js
index 8fb8688..c831716 100644
--- a/ambari-web/app/assets/test/tests.js
+++ b/ambari-web/app/assets/test/tests.js
@@ -110,6 +110,7 @@ var files = ['test/init_model_test',
   'test/login_test',
   'test/router_test',
   'test/mappers/alert_groups_mapper_test',
+  'test/mappers/alert_instances_mapper_test',
   'test/mappers/alert_definitions_mapper_test',
   'test/mappers/alert_definition_summary_mapper_test',
   'test/mappers/server_data_mapper_test',

http://git-wip-us.apache.org/repos/asf/ambari/blob/beccf117/ambari-web/app/controllers/main/alerts/alert_instances_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/alerts/alert_instances_controller.js b/ambari-web/app/controllers/main/alerts/alert_instances_controller.js
index 02a0577..93d2994 100644
--- a/ambari-web/app/controllers/main/alerts/alert_instances_controller.js
+++ b/ambari-web/app/controllers/main/alerts/alert_instances_controller.js
@@ -19,60 +19,86 @@
 var App = require('app');
 
 App.MainAlertInstancesController = Em.Controller.extend({
+
   name: 'mainAlertInstancesController',
+
+  /**
+   * Are alertInstances loaded
+   * @type {boolean}
+   */
   isLoaded: false,
+
   /**
    * Causes automatic updates of content if set to true
+   * @type {boolean}
    */
   isUpdating: false,
+
+  /**
+   * Times for alert instances updater
+   * Used in <code>scheduleUpdate</code>
+   * @type {number|null}
+   */
   updateTimer: null,
-  updateInterval: App.alertInstancesUpdateInterval,
+
   /**
-   * "HOST" or "ALERT_DEFINITION"
+   * @type {string|null} sourceName - hostName or alertDefinitionId
    */
-  sourceType: null,
   sourceName: null,
 
+  /**
+   * @type {string|null} sourceType - 'HOST'|'ALERT_DEFINITION'
+   */
+  sourceType: null,
+
+  /**
+   * Load alert instances from server (all, for selected host, for selected alert definition)
+   * @returns {$.ajax}
+   * @method fetchAlertInstances
+   */
   fetchAlertInstances: function () {
-    switch (this.get('sourceType')) {
+    var sourceType = this.get('sourceType'),
+      sourceName = this.get('sourceName'),
+      ajaxData = {
+        sender: this,
+        success: 'getAlertInstancesSuccessCallback',
+        error: 'getAlertInstancesErrorCallback'
+      };
+
+    switch (sourceType) {
       case 'HOST':
-        App.ajax.send({
+        $.extend(ajaxData, {
           name: 'alerts.instances.by_host',
-          sender: this,
           data: {
-            clusterName: App.router.get('clusterName'),
-            hostName: this.get('sourceName')
-          },
-          success: 'getAlertInstancesSuccessCallback',
-          error: 'getAlertInstancesErrorCallback'
+            hostName: sourceName
+          }
         });
         break;
+
       case 'ALERT_DEFINITION':
-        App.ajax.send({
+        $.extend(ajaxData, {
           name: 'alerts.instances.by_definition',
-          sender: this,
           data: {
-            clusterName: App.router.get('clusterName'),
-            definitionId: this.get('sourceName')
-          },
-          success: 'getAlertInstancesSuccessCallback',
-          error: 'getAlertInstancesErrorCallback'
+            definitionId: sourceName
+          }
         });
         break;
+
       default:
-        App.ajax.send({
-          name: 'alerts.instances',
-          sender: this,
-          data: {
-            clusterName: App.router.get('clusterName')
-          },
-          success: 'getAlertInstancesSuccessCallback',
-          error: 'getAlertInstancesErrorCallback'
+        $.extend(ajaxData, {
+          name: 'alerts.instances'
         });
         break;
     }
+
+    return App.ajax.send(ajaxData);
   },
 
+  /**
+   * Pseudo for <code>fetchAlertInstances</code>
+   * Used to get all alert instances
+   * @method loadAlertInstances
+   */
   loadAlertInstances: function () {
     this.set('isLoaded', false);
     this.set('sourceType', null);
@@ -80,6 +106,12 @@ App.MainAlertInstancesController = Em.Controller.extend({
     this.fetchAlertInstances();
   },
 
+  /**
+   * Pseudo for <code>fetchAlertInstances</code>
+   * Used to get alert instances for some host
+   * @param {string} hostName
+   * @method loadAlertInstancesByHost
+   */
   loadAlertInstancesByHost: function (hostName) {
     this.set('isLoaded', false);
     this.set('sourceType', 'HOST');
@@ -87,10 +119,16 @@ App.MainAlertInstancesController = Em.Controller.extend({
     this.fetchAlertInstances();
   },
 
-  loadAlertInstancesByAlertDefinition: function (definitionName) {
+  /**
+   * Pseudo for <code>fetchAlertInstances</code>
+   * Used to get alert instances for some alert definition
+   * @param {string} definitionId
+   * @method loadAlertInstancesByAlertDefinition
+   */
+  loadAlertInstancesByAlertDefinition: function (definitionId) {
     this.set('isLoaded', false);
     this.set('sourceType', 'ALERT_DEFINITION');
-    this.set('sourceName', definitionName);
+    this.set('sourceName', definitionId);
     this.fetchAlertInstances();
   },
 
@@ -100,18 +138,29 @@ App.MainAlertInstancesController = Em.Controller.extend({
       this.set('updateTimer', setTimeout(function () {
         self.fetchAlertInstances();
         self.scheduleUpdate();
-      }, this.get('updateInterval')));
-    } else {
+      }, App.get('alertInstancesUpdateInterval')));
+    }
+    else {
       clearTimeout(this.get('updateTimer'));
     }
   }.observes('isUpdating'),
 
+  /**
+   * Success-callback for alert instances request
+   * @param {object} json
+   * @method getAlertInstancesSuccessCallback
+   */
   getAlertInstancesSuccessCallback: function (json) {
     App.alertInstanceMapper.map(json);
     this.set('isLoaded', true);
   },
 
+  /**
+   * Error-callback for alert instances request
+   * @method getAlertInstancesErrorCallback
+   */
   getAlertInstancesErrorCallback: function () {
     this.set('isLoaded', true);
   }
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/beccf117/ambari-web/app/mappers/alert_instances_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/alert_instances_mapper.js b/ambari-web/app/mappers/alert_instances_mapper.js
index 9544882..468d66c 100644
--- a/ambari-web/app/mappers/alert_instances_mapper.js
+++ b/ambari-web/app/mappers/alert_instances_mapper.js
@@ -18,7 +18,9 @@
 var App = require('app');
 
 App.alertInstanceMapper = App.QuickDataMapper.create({
+
   model : App.AlertInstance,
+
   config : {
     id: 'Alert.id',
     label: 'Alert.label',
@@ -34,5 +36,27 @@ App.alertInstanceMapper = App.QuickDataMapper.create({
     instance: 'Alert.instance',
     state: 'Alert.state',
     text: 'Alert.text'
+  },
+
+  map: function(json) {
+    if (json.items) {
+      var self = this,
+        alertInstances = [],
+        model = this.get('model'),
+        alertsToDelete = model.find().mapProperty('id');
+
+      json.items.forEach(function (item) {
+        var alert = this.parseIt(item, this.get('config'));
+        alertInstances.push(alert);
+        alertsToDelete = alertsToDelete.without(alert.id);
+      }, this);
+
+      alertsToDelete.forEach(function(alertId) {
+        self.deleteRecord(model.find(alertId));
+      });
+
+      App.store.loadMany(model, alertInstances);
+    }
   }
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/beccf117/ambari-web/test/controllers/main/alerts/alert_instances_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/alerts/alert_instances_controller_test.js b/ambari-web/test/controllers/main/alerts/alert_instances_controller_test.js
index 9c49c90..8f24e5a 100644
--- a/ambari-web/test/controllers/main/alerts/alert_instances_controller_test.js
+++ b/ambari-web/test/controllers/main/alerts/alert_instances_controller_test.js
@@ -20,7 +20,7 @@ var App = require('app');
 
 var controller;
 
-describe('App.MainAlertDefinitionActionsController', function () {
+describe('App.MainAlertInstancesController', function () {
 
   beforeEach(function () {
     controller = App.MainAlertInstancesController.create({});
@@ -43,6 +43,7 @@ describe('App.MainAlertDefinitionActionsController', function () {
         controller.loadAlertInstancesByHost('host');
         console.log(App.ajax.send.args[0]);
         expect(App.ajax.send.args[0][0].name).to.equal('alerts.instances.by_host');
+        expect(App.ajax.send.args[0][0].data.hostName).to.equal('host');
 
       });
 
@@ -51,6 +52,7 @@ describe('App.MainAlertDefinitionActionsController', function () {
         controller.loadAlertInstancesByAlertDefinition('1');
         console.log(App.ajax.send.args[0]);
         expect(App.ajax.send.args[0][0].name).to.equal('alerts.instances.by_definition');
+        expect(App.ajax.send.args[0][0].data.definitionId).to.equal('1');
 
       });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/beccf117/ambari-web/test/mappers/alert_instances_mapper_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mappers/alert_instances_mapper_test.js b/ambari-web/test/mappers/alert_instances_mapper_test.js
new file mode 100644
index 0000000..9096d3e
--- /dev/null
+++ b/ambari-web/test/mappers/alert_instances_mapper_test.js
@@ -0,0 +1,145 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+var App = require('app');
+
+require('mappers/alert_instances_mapper');
+var testHelpers = require('test/helpers');
+
+describe('App.alertInstanceMapper', function () {
+
+  var alertInstances = [
+      {id: 1},
+      {id: 2},
+      {id: 3},
+      {id: 4}
+    ],
+    json = {
+      "items" : [
+        {
+          "Alert" : {
+            "component_name" : "AMBARI_AGENT",
+            "host_name" : "c6401.ambari.apache.org",
+            "id" : 2,
+            "instance" : null,
+            "label" : "Ambari Agent Disk Usage",
+            "latest_timestamp" : 1415224354954,
+            "maintenance_state" : "OFF",
+            "name" : "ambari_agent_disk_usage",
+            "original_timestamp" : 1414695835400,
+            "scope" : "HOST",
+            "service_name" : "AMBARI",
+            "state" : "OK",
+            "text" : "Capacity Used: [1.26%, 6.6 GB], Capacity Total: [525.3 GB]"
+          }
+        },
+        {
+          "Alert" : {
+            "component_name" : null,
+            "host_name" : null,
+            "id" : 3,
+            "instance" : null,
+            "label" : "Percent DataNodes Available",
+            "latest_timestamp" : 1415224362617,
+            "maintenance_state" : "OFF",
+            "name" : "datanode_process_percent",
+            "original_timestamp" : 1414695787466,
+            "scope" : "SERVICE",
+            "service_name" : "HDFS",
+            "state" : "CRITICAL",
+            "text" : "affected: [1], total: [1]"
+          }
+        }
+      ]
+    };
+
+  beforeEach(function () {
+
+    sinon.stub(App.alertInstanceMapper, 'deleteRecord', Em.K);
+
+    sinon.stub(App.store, 'loadMany', function (type, content) {
+      type.content = content;
+    });
+
+    App.alertInstanceMapper.model = {
+      find: function () {
+        if (arguments.length) {
+          return alertInstances.findProperty('id', arguments[0]);
+        }
+        return alertInstances;
+      }
+    };
+
+  });
+
+  afterEach(function () {
+
+    App.alertInstanceMapper.deleteRecord.restore();
+    App.alertInstanceMapper.model = App.AlertInstance;
+    App.store.loadMany.restore();
+
+  });
+
+  it('should delete not existing models', function () {
+
+    App.alertInstanceMapper.map(json);
+
+    expect(App.alertInstanceMapper.deleteRecord.calledTwice).to.be.true;
+    expect(App.alertInstanceMapper.deleteRecord.args[0][0].id).to.equal(1);
+    expect(App.alertInstanceMapper.deleteRecord.args[1][0].id).to.equal(4);
+
+  });
+
+  it('should map alert instances', function () {
+
+    var expected = [
+      {
+        "id": 2,
+        "label": "Ambari Agent Disk Usage",
+        "service_id": "AMBARI",
+        "component_name": "AMBARI_AGENT",
+        "host_id": "c6401.ambari.apache.org",
+        "scope": "HOST",
+        "original_timestamp": 1414695835400,
+        "latest_timestamp": 1415224354954,
+        "maintenance_state": "OFF",
+        "instance": null,
+        "state": "OK",
+        "text": "Capacity Used: [1.26%, 6.6 GB], Capacity Total: [525.3 GB]"
+      },
+      {
+        "id": 3,
+        "label": "Percent DataNodes Available",
+        "service_id": "HDFS",
+        "component_name": null,
+        "host_id": null,
+        "scope": "SERVICE",
+        "original_timestamp": 1414695787466,
+        "latest_timestamp": 1415224362617,
+        "maintenance_state": "OFF",
+        "instance": null,
+        "state": "CRITICAL",
+        "text": "affected: [1], total: [1]"
+      }
+    ];
+
+    App.alertInstanceMapper.map(json);
+    testHelpers.nestedExpect(expected, App.alertInstanceMapper.model.content);
+
+  });
+
+});
\ No newline at end of file