You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by at...@apache.org on 2017/11/29 11:54:34 UTC

ambari git commit: AMBARI-22528 Integrate stack upgrades with websocket events. (atkach)

Repository: ambari
Updated Branches:
  refs/heads/branch-3.0-perf 45d9ca671 -> eaf1fd5ce


AMBARI-22528 Integrate stack upgrades with websocket events. (atkach)


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

Branch: refs/heads/branch-3.0-perf
Commit: eaf1fd5cee81bc8a021e2dd01ee4fc604c0ee3b0
Parents: 45d9ca6
Author: Andrii Tkach <at...@apache.org>
Authored: Wed Nov 29 13:45:32 2017 +0200
Committer: Andrii Tkach <at...@apache.org>
Committed: Wed Nov 29 13:45:32 2017 +0200

----------------------------------------------------------------------
 ambari-web/app/assets/test/tests.js             |   1 +
 .../global/background_operations_controller.js  |  10 +-
 .../controllers/global/cluster_controller.js    |   7 -
 .../app/controllers/global/update_controller.js |  42 ++---
 ambari-web/app/controllers/main.js              |   2 +
 .../main/admin/stack_and_upgrade_controller.js  |  22 +--
 ambari-web/app/mappers.js                       |   1 +
 .../app/mappers/socket/upgrade_state_mapper.js  |  42 +++++
 .../global/background_operations_test.js        |  15 +-
 .../global/cluster_controller_test.js           |  12 --
 .../global/update_controller_test.js            | 181 ++-----------------
 .../admin/stack_and_upgrade_controller_test.js  |  16 +-
 ambari-web/test/controllers/main_test.js        |  33 ++++
 .../mappers/socket/upgrade_state_mapper_test.js |  80 ++++++++
 14 files changed, 211 insertions(+), 253 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/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 23b985a..f4b319a 100644
--- a/ambari-web/app/assets/test/tests.js
+++ b/ambari-web/app/assets/test/tests.js
@@ -174,6 +174,7 @@ var files = [
   'test/mappers/socket/host_state_mapper_test',
   'test/mappers/socket/alert_definitions_mapper_adapter_test',
   'test/mappers/socket/alert_groups_mapper_adapter_test',
+  'test/mappers/socket/upgrade_state_mapper_test',
   'test/mixins/common/configs/enhanced_configs_test',
   'test/mixins/common/configs/config_recommendations_test',
   'test/mixins/common/configs/config_recommendation_parser_test',

http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/app/controllers/global/background_operations_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/global/background_operations_controller.js b/ambari-web/app/controllers/global/background_operations_controller.js
index f160883..caca04a 100644
--- a/ambari-web/app/controllers/global/background_operations_controller.js
+++ b/ambari-web/app/controllers/global/background_operations_controller.js
@@ -65,6 +65,9 @@ App.BackgroundOperationsController = Em.Controller.extend({
   }.observes('isWorking'),
 
   updateRequests: function(event) {
+    if (this.isUpgradeRequest({Requests: {request_context: event.requestContext}})) {
+      return;
+    }
     const request = this.get('services').findProperty('id', event.requestId);
     const context = this.parseRequestContext(event.requestContext);
     const visibleOperationsCount = this.get('operationsCount');
@@ -308,13 +311,9 @@ App.BackgroundOperationsController = Em.Controller.extend({
     var currentRequestIds = [];
     var countIssued = this.get('operationsCount');
     var countGot = data.itemTotal;
-    var restoreUpgradeState = false;
 
     data.items.forEach(function (request) {
       if (this.isUpgradeRequest(request)) {
-        if (!App.get('upgradeIsRunning')) {
-          restoreUpgradeState = true;
-        }
         return;
       }
       var rq = this.get("services").findProperty('id', request.Requests.id);
@@ -349,9 +348,6 @@ App.BackgroundOperationsController = Em.Controller.extend({
         this.set("services", this.get("services").sortProperty('id').reverse());
       }
     }, this);
-    if (restoreUpgradeState) {
-      App.router.get('clusterController').restoreUpgradeState();
-    }
     this.removeOldRequests(currentRequestIds);
     this.set('isShowMoreAvailable', countGot >= countIssued);
     this.set('serviceTimestamp', App.dateTimeWithTimeZone());

http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/app/controllers/global/cluster_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/global/cluster_controller.js b/ambari-web/app/controllers/global/cluster_controller.js
index 32b5db5..bc3ce38 100644
--- a/ambari-web/app/controllers/global/cluster_controller.js
+++ b/ambari-web/app/controllers/global/cluster_controller.js
@@ -306,7 +306,6 @@ App.ClusterController = Em.Controller.extend(App.ReloadPopupMixin, {
    * restore upgrade status from server
    * and make call to get latest status from server
    * Also loading all upgrades to App.StackUpgradeHistory model
-   * TODO should be called even if recent background operations doesn't have Upgrade request
    */
   restoreUpgradeState: function () {
     var self = this;
@@ -314,7 +313,6 @@ App.ClusterController = Em.Controller.extend(App.ReloadPopupMixin, {
       var upgradeController = App.router.get('mainAdminStackAndUpgradeController');
       var allUpgrades = data.items.sortProperty('Upgrade.request_id');
       var lastUpgradeData = allUpgrades.pop();
-      var dbUpgradeState = App.db.get('MainAdminStackAndUpgrade', 'upgradeState');
       if (lastUpgradeData){
         var status = lastUpgradeData.Upgrade.request_status;
         var lastUpgradeNotFinished = (self.isSuspendedState(status) || self.isRunningState(status));
@@ -347,11 +345,6 @@ App.ClusterController = Em.Controller.extend(App.ReloadPopupMixin, {
         }
       } else {
         upgradeController.initDBProperties();
-        upgradeController.loadUpgradeData(true);
-      }
-
-      if (!Em.isNone(dbUpgradeState)) {
-        App.set('upgradeState', dbUpgradeState);
       }
 
       App.stackUpgradeHistoryMapper.map(data);

http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/app/controllers/global/update_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/global/update_controller.js b/ambari-web/app/controllers/global/update_controller.js
index 56f9ab6..231b178 100644
--- a/ambari-web/app/controllers/global/update_controller.js
+++ b/ambari-web/app/controllers/global/update_controller.js
@@ -187,15 +187,6 @@ App.UpdateController = Em.Controller.extend({
    */
   updateAll: function () {
     if (this.get('isWorking') && !App.get('isOnlyViewUser')) {
-      App.StompClient.subscribe('/events/hostcomponents', App.hostComponentStatusMapper.map.bind(App.hostComponentStatusMapper));
-      App.StompClient.subscribe('/events/alerts', App.alertSummaryMapper.map.bind(App.alertSummaryMapper));
-      App.StompClient.subscribe('/events/ui_topologies', App.topologyMapper.map.bind(App.topologyMapper));
-      App.StompClient.subscribe('/events/configs', this.makeCallForClusterEnv.bind(this));
-      App.StompClient.subscribe('/events/services', App.serviceStateMapper.map.bind(App.serviceStateMapper));
-      App.StompClient.subscribe('/events/hosts', App.hostStateMapper.map.bind(App.hostStateMapper));
-      App.StompClient.subscribe('/events/alert_definitions', App.alertDefinitionsMapperAdapter.map.bind(App.alertDefinitionsMapperAdapter));
-      App.StompClient.subscribe('/events/alert_group', App.alertGroupsMapperAdapter.map.bind(App.alertGroupsMapperAdapter));
-
       App.updater.run(this, 'updateHostsMetrics', 'isWorking', App.contentUpdateInterval, '\/main\/(hosts).*');
       App.updater.run(this, 'updateServiceMetric', 'isWorking', App.componentsUpdateInterval, '\/main\/(dashboard|services).*');
       App.updater.run(this, 'updateComponentsState', 'isWorking', App.componentsUpdateInterval, '\/main\/(dashboard|services|hosts).*');
@@ -204,20 +195,22 @@ App.UpdateController = Em.Controller.extend({
       if (!App.get('router.mainAlertInstancesController.isUpdating')) {
         App.updater.run(this, 'updateUnhealthyAlertInstances', 'updateAlertInstances', App.alertInstancesUpdateInterval, '\/main\/alerts.*');
       }
-      App.updater.run(this, 'updateUpgradeState', 'isWorking', App.bgOperationsUpdateInterval);
       App.updater.run(this, 'updateWizardWatcher', 'isWorking', App.bgOperationsUpdateInterval);
-    } else {
-      App.StompClient.unsubscribe('/events/hostcomponents');
-      App.StompClient.unsubscribe('/events/alerts');
-      // "/events/ui_topologies" topic should listen to topology changes when wizard running
-      App.StompClient.unsubscribe('/events/configs');
-      App.StompClient.unsubscribe('/events/services');
-      App.StompClient.unsubscribe('/events/hosts');
-      App.StompClient.unsubscribe('/events/alert_definitions');
-      App.StompClient.unsubscribe('/events/alert_group');
     }
   }.observes('isWorking', 'App.router.mainAlertInstancesController.isUpdating'),
 
+  startSubscriptions: function () {
+    App.StompClient.subscribe('/events/hostcomponents', App.hostComponentStatusMapper.map.bind(App.hostComponentStatusMapper));
+    App.StompClient.subscribe('/events/alerts', App.alertSummaryMapper.map.bind(App.alertSummaryMapper));
+    App.StompClient.subscribe('/events/ui_topologies', App.topologyMapper.map.bind(App.topologyMapper));
+    App.StompClient.subscribe('/events/configs', this.makeCallForClusterEnv.bind(this));
+    App.StompClient.subscribe('/events/services', App.serviceStateMapper.map.bind(App.serviceStateMapper));
+    App.StompClient.subscribe('/events/hosts', App.hostStateMapper.map.bind(App.hostStateMapper));
+    App.StompClient.subscribe('/events/alert_definitions', App.alertDefinitionsMapperAdapter.map.bind(App.alertDefinitionsMapperAdapter));
+    App.StompClient.subscribe('/events/alert_group', App.alertGroupsMapperAdapter.map.bind(App.alertGroupsMapperAdapter));
+    App.StompClient.subscribe('/events/upgrade', App.upgradeStateMapper.map.bind(App.upgradeStateMapper));
+  },
+
   /**
    *
    * @param {Function} callback
@@ -622,17 +615,6 @@ App.UpdateController = Em.Controller.extend({
     });
   },
 
-  updateUpgradeState: function (callback) {
-    var currentStateName = App.get('router.currentState.name'),
-      parentStateName = App.get('router.currentState.parentState.name'),
-      mainAdminStackAndUpgradeController = App.get('router.mainAdminStackAndUpgradeController');
-    if (!(currentStateName === 'versions' && parentStateName === 'stackAndUpgrade') && currentStateName !== 'stackUpgrade' && App.get('wizardIsNotFinished') && !mainAdminStackAndUpgradeController.get('isLoadUpgradeDataPending')) {
-      mainAdminStackAndUpgradeController.loadUpgradeData(true).done(callback);
-    } else {
-      callback();
-    }
-  },
-
   makeCallForClusterEnv: function(event) {
     if (event.configs.someProperty('type', 'cluster-env')) {
       this.updateClusterEnv();

http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/app/controllers/main.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main.js b/ambari-web/app/controllers/main.js
index 18018d9..a34e199 100644
--- a/ambari-web/app/controllers/main.js
+++ b/ambari-web/app/controllers/main.js
@@ -101,9 +101,11 @@ App.MainController = Em.Controller.extend({
   startPolling: function () {
     if (App.router.get('applicationController.isExistingClusterDataLoaded')) {
       App.router.get('updateController').set('isWorking', true);
+      App.router.get('updateController').startSubscriptions();
       App.router.get('backgroundOperationsController').set('isWorking', true);
     }
   }.observes('App.router.applicationController.isExistingClusterDataLoaded'),
+
   stopPolling: function(){
     App.router.get('updateController').set('isWorking', false);
     App.router.get('backgroundOperationsController').set('isWorking', false);

http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
index 2f0cb68..20627ce 100644
--- a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
+++ b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
@@ -421,13 +421,11 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
     var dfd = $.Deferred();
     var self = this;
 
-    this.loadUpgradeData(true).done(function() {
-      self.loadStackVersionsToModel(true).done(function () {
-        self.loadRepoVersionsToModel().done(function() {
-          self.loadCompatibleVersions().done(function() {
-            self.updateCurrentStackVersion();
-            dfd.resolve();
-          });
+    this.loadStackVersionsToModel(true).done(function () {
+      self.loadRepoVersionsToModel().done(function() {
+        self.loadCompatibleVersions().done(function() {
+          self.updateCurrentStackVersion();
+          dfd.resolve();
         });
       });
     });
@@ -2140,16 +2138,18 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
       isWizardRestricted: upgradeType.get('isWizardRestricted'),
       downgradeAllowed: lastUpgradeData.Upgrade.downgrade_allowed,
       upgradeTypeDisplayName: upgradeType.get('displayName'),
-      failuresTolerance: Em.Object.create({
+      isSuspended: lastUpgradeData.Upgrade.suspended,
+      failuresTolerance: {
         skipComponentFailures: lastUpgradeData.Upgrade.skip_failures,
         skipSCFailures: lastUpgradeData.Upgrade.skip_service_check_failures
-      })
+      }
     });
+    this.initDBProperties();
+    App.set('upgradeState', lastUpgradeData.Upgrade.request_status);
     this.loadRepoVersionsToModel().done(function () {
       var toVersion = App.RepositoryVersion.find().findProperty('repositoryVersion', lastUpgradeData.Upgrade.associated_version);
       self.setDBProperty('upgradeVersion', toVersion && toVersion.get('displayName'));
-      self.initDBProperties();
-      self.loadUpgradeData(true);
+      self.set('upgradeVersion', toVersion && toVersion.get('displayName'));
     });
   },
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/app/mappers.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers.js b/ambari-web/app/mappers.js
index 93cd319..e6f1bb0 100644
--- a/ambari-web/app/mappers.js
+++ b/ambari-web/app/mappers.js
@@ -51,3 +51,4 @@ require('mappers/socket/alert_summary_mapper');
 require('mappers/socket/host_state_mapper');
 require('mappers/socket/alert_definitions_mapper_adapter');
 require('mappers/socket/alert_groups_mapper_adapter');
+require('mappers/socket/upgrade_state_mapper');

http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/app/mappers/socket/upgrade_state_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/socket/upgrade_state_mapper.js b/ambari-web/app/mappers/socket/upgrade_state_mapper.js
new file mode 100644
index 0000000..1670ed5
--- /dev/null
+++ b/ambari-web/app/mappers/socket/upgrade_state_mapper.js
@@ -0,0 +1,42 @@
+/**
+ * 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');
+
+App.upgradeStateMapper = App.QuickDataMapper.create({
+
+  /**
+   * @param {object} event
+   */
+  map: function (event) {
+    var controller = App.router.get('mainAdminStackAndUpgradeController');
+    if (event.type === 'CREATE') {
+      controller.restoreLastUpgrade({Upgrade: event});
+    }
+    //TODO rename type to eventType
+    if (event.type === 'UPDATE' && controller.get('upgradeId') === event.request_id) {
+      if (!Em.isNone(event.request_status)) {
+        App.set('upgradeState', event.request_status);
+        controller.setDBProperty('upgradeState', event.request_status);
+      }
+      if (!Em.isNone(event.suspended)) {
+        controller.set('isSuspended', event.suspended);
+        controller.setDBProperty('isSuspended', event.suspended);
+      }
+    }
+  }
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/test/controllers/global/background_operations_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/global/background_operations_test.js b/ambari-web/test/controllers/global/background_operations_test.js
index 43b2170..8612cd2 100644
--- a/ambari-web/test/controllers/global/background_operations_test.js
+++ b/ambari-web/test/controllers/global/background_operations_test.js
@@ -149,14 +149,6 @@ describe('App.BackgroundOperationsController', function () {
 
   describe('#callBackForMostRecent()', function () {
 
-    beforeEach(function () {
-      sinon.stub(App.router.get('clusterController'), 'restoreUpgradeState', Em.K);
-    });
-
-    afterEach(function () {
-      App.router.get('clusterController').restoreUpgradeState.restore();
-    });
-
     it('No requests exists', function () {
       var data = {
         items: []
@@ -783,6 +775,13 @@ describe('App.BackgroundOperationsController', function () {
       controller.propertyDidChange.restore();
     });
 
+    it('should exit when request is upgrade', function() {
+      controller.updateRequests({
+        requestContext: 'upgrading'
+      });
+      expect(controller.parseRequestContext.called).to.be.false;
+    });
+
     it('should add request to list', function() {
       controller.set('services', []);
       controller.updateRequests({

http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/test/controllers/global/cluster_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/global/cluster_controller_test.js b/ambari-web/test/controllers/global/cluster_controller_test.js
index 988379d..fcbad62 100644
--- a/ambari-web/test/controllers/global/cluster_controller_test.js
+++ b/ambari-web/test/controllers/global/cluster_controller_test.js
@@ -501,10 +501,6 @@ describe('App.clusterController', function () {
         expect(controller.getAllUpgrades.calledOnce).to.be.true;
       });
 
-      it('upgradeState is PENDING', function () {
-        expect(App.get('upgradeState')).to.equal('PENDING');
-      });
-
       it('restoreLastUpgrade is called with valid arguments', function () {
         expect(upgradeController.restoreLastUpgrade.calledWith(data.upgradeData.items[0])).to.be.true;
       });
@@ -572,10 +568,6 @@ describe('App.clusterController', function () {
         expect(controller.getAllUpgrades.calledOnce).to.be.true;
       });
 
-      it('upgradeState is PENDING', function () {
-        expect(App.get('upgradeState')).to.equal('PENDING');
-      });
-
       it('restoreLastUpgrade is not called', function () {
         expect(upgradeController.restoreLastUpgrade.called).to.be.false;
       });
@@ -588,10 +580,6 @@ describe('App.clusterController', function () {
         expect(upgradeController.initDBProperties.calledOnce).to.be.true;
       });
 
-      it('loadUpgradeData is called with valid arguments', function () {
-        expect(upgradeController.loadUpgradeData.calledWith(true)).to.be.true;
-      });
-
     });
   });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/test/controllers/global/update_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/global/update_controller_test.js b/ambari-web/test/controllers/global/update_controller_test.js
index 78a4064..a812353 100644
--- a/ambari-web/test/controllers/global/update_controller_test.js
+++ b/ambari-web/test/controllers/global/update_controller_test.js
@@ -56,31 +56,29 @@ describe('App.UpdateController', function () {
   });
 
   describe('#updateAll()', function () {
-    beforeEach(function() {
-      sinon.stub(App.StompClient, 'unsubscribe');
-      sinon.stub(App.StompClient, 'subscribe');
-    });
-    afterEach(function() {
-      App.StompClient.unsubscribe.restore();
-      App.StompClient.subscribe.restore();
-    });
 
     it('isWorking = false', function () {
       controller.set('isWorking', false);
       controller.updateAll();
       expect(App.updater.run.called).to.equal(false);
-      expect(App.StompClient.unsubscribe.calledWith('/events/hostcomponents')).to.be.true;
-      expect(App.StompClient.unsubscribe.calledWith('/events/alerts')).to.be.true;
-      expect(App.StompClient.unsubscribe.calledWith('/events/configs')).to.be.true;
-      expect(App.StompClient.unsubscribe.calledWith('/events/services')).to.be.true;
-      expect(App.StompClient.unsubscribe.calledWith('/events/hosts')).to.be.true;
-      expect(App.StompClient.unsubscribe.calledWith('/events/alert_definitions')).to.be.true;
-      expect(App.StompClient.unsubscribe.calledWith('/events/alert_group')).to.be.true;
     });
 
     it('isWorking = true', function () {
       controller.set('isWorking', true);
-      expect(App.updater.run.callCount).to.equal(7);
+      expect(App.updater.run.callCount).to.equal(6);
+    });
+  });
+
+  describe('#startSubscriptions()', function () {
+    beforeEach(function() {
+      sinon.stub(App.StompClient, 'subscribe');
+    });
+    afterEach(function() {
+      App.StompClient.subscribe.restore();
+    });
+
+    it('should subscribe to all topics', function () {
+      controller.startSubscriptions();
       expect(App.StompClient.subscribe.calledWith('/events/hostcomponents')).to.be.true;
       expect(App.StompClient.subscribe.calledWith('/events/alerts')).to.be.true;
       expect(App.StompClient.subscribe.calledWith('/events/ui_topologies')).to.be.true;
@@ -89,6 +87,7 @@ describe('App.UpdateController', function () {
       expect(App.StompClient.subscribe.calledWith('/events/hosts')).to.be.true;
       expect(App.StompClient.subscribe.calledWith('/events/alert_definitions')).to.be.true;
       expect(App.StompClient.subscribe.calledWith('/events/alert_group')).to.be.true;
+      expect(App.StompClient.subscribe.calledWith('/events/upgrade')).to.be.true;
     });
   });
 
@@ -320,156 +319,6 @@ describe('App.UpdateController', function () {
     });
   });
 
-  describe('#updateUpgradeState()', function () {
-
-    var cases = [
-        {
-          currentStateName: 'versions',
-          parentStateName: 'stackAndUpgrade',
-          wizardIsNotFinished: true,
-          isLoadUpgradeDataPending: true,
-          loadUpgradeDataCallCount: 0,
-          callbackCallCount: 1,
-          title: 'stack versions page'
-        },
-        {
-          currentStateName: 'stackUpgrade',
-          parentStateName: 'admin',
-          wizardIsNotFinished: true,
-          isLoadUpgradeDataPending: true,
-          loadUpgradeDataCallCount: 0,
-          callbackCallCount: 1,
-          title: 'upgrade popup open'
-        },
-        {
-          currentStateName: 'versions',
-          parentStateName: 'admin',
-          wizardIsNotFinished: true,
-          isLoadUpgradeDataPending: false,
-          loadUpgradeDataCallCount: 1,
-          callbackCallCount: 0,
-          title: 'another page with \'versions\' name'
-        },
-        {
-          currentStateName: 'versions',
-          parentStateName: 'admin',
-          wizardIsNotFinished: false,
-          isLoadUpgradeDataPending: false,
-          loadUpgradeDataCallCount: 0,
-          callbackCallCount: 1,
-          title: 'another page with \'versions\' name, upgrade finished'
-        },
-        {
-          currentStateName: 'versions',
-          parentStateName: 'admin',
-          wizardIsNotFinished: true,
-          isLoadUpgradeDataPending: true,
-          loadUpgradeDataCallCount: 0,
-          callbackCallCount: 1,
-          title: 'another page with \'versions\' name, another update upgrade request not completed'
-        },
-        {
-          currentStateName: 'services',
-          parentStateName: 'stackAndUpgrade',
-          wizardIsNotFinished: true,
-          isLoadUpgradeDataPending: false,
-          loadUpgradeDataCallCount: 1,
-          callbackCallCount: 0,
-          title: 'another page from \'Stack and Versions\' section'
-        },
-        {
-          currentStateName: 'services',
-          parentStateName: 'stackAndUpgrade',
-          wizardIsNotFinished: false,
-          isLoadUpgradeDataPending: false,
-          loadUpgradeDataCallCount: 0,
-          callbackCallCount: 1,
-          title: 'another page from \'Stack and Versions\' section, upgrade finished'
-        },
-        {
-          currentStateName: 'services',
-          parentStateName: 'stackAndUpgrade',
-          wizardIsNotFinished: true,
-          isLoadUpgradeDataPending: true,
-          loadUpgradeDataCallCount: 0,
-          callbackCallCount: 1,
-          title: 'another page from \'Stack and Versions\' section, another update upgrade request not completed'
-        },
-        {
-          currentStateName: 'widgets',
-          parentStateName: 'dashboard',
-          wizardIsNotFinished: true,
-          isLoadUpgradeDataPending: false,
-          loadUpgradeDataCallCount: 1,
-          callbackCallCount: 0,
-          title: 'not \'Stack and Versions\' section'
-        },
-        {
-          currentStateName: 'widgets',
-          parentStateName: 'dashboard',
-          wizardIsNotFinished: false,
-          isLoadUpgradeDataPending: false,
-          loadUpgradeDataCallCount: 0,
-          callbackCallCount: 1,
-          title: 'not \'Stack and Versions\' section, upgrade finished'
-        },
-        {
-          currentStateName: 'widgets',
-          parentStateName: 'dashboard',
-          wizardIsNotFinished: true,
-          isLoadUpgradeDataPending: true,
-          loadUpgradeDataCallCount: 0,
-          callbackCallCount: 1,
-          title: 'not \'Stack and Versions\' section, another update upgrade request not completed'
-        }
-      ],
-      mock = {
-        callback: Em.K,
-        loadUpgradeData: function () {
-          return {
-            done: Em.K
-          };
-        }
-      },
-      appGetMock;
-
-    beforeEach(function () {
-      sinon.spy(mock, 'callback');
-      sinon.spy(mock, 'loadUpgradeData');
-      appGetMock = sinon.stub(App, 'get');
-    });
-
-    afterEach(function () {
-      mock.callback.restore();
-      mock.loadUpgradeData.restore();
-      App.get.restore();
-      appGetMock.restore();
-    });
-
-    cases.forEach(function (item) {
-      describe(item.title, function () {
-
-        beforeEach(function () {
-          appGetMock.withArgs('router.mainAdminStackAndUpgradeController').returns(Em.Object.create({
-            loadUpgradeData: mock.loadUpgradeData,
-            isLoadUpgradeDataPending: item.isLoadUpgradeDataPending
-          })).withArgs('wizardIsNotFinished').returns(item.wizardIsNotFinished)
-            .withArgs('router.currentState.name').returns(item.currentStateName)
-            .withArgs('router.currentState.parentState.name').returns(item.parentStateName);
-          controller.updateUpgradeState(mock.callback);
-        });
-        it('loadUpgradeData is called ' + item.loadUpgradeDataCallCount + ' times', function () {
-          expect(mock.loadUpgradeData.callCount).to.equal(item.loadUpgradeDataCallCount);
-        });
-        it('callback is called ' + item.callbackCallCount + ' times', function () {
-          expect(mock.callback.callCount).to.equal(item.callbackCallCount);
-        });
-
-      });
-    });
-
-  });
-
   describe('#computeParameters', function () {
 
     beforeEach(function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
index 1b04b17..0ebaee8 100644
--- a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
@@ -113,9 +113,6 @@ describe('App.MainAdminStackAndUpgradeController', function() {
 
   describe("#load()", function() {
     beforeEach(function(){
-      sinon.stub(controller, 'loadUpgradeData').returns({
-        done: Em.clb
-      });
       sinon.stub(controller, 'loadStackVersionsToModel').returns({
         done: Em.clb
       });
@@ -137,15 +134,11 @@ describe('App.MainAdminStackAndUpgradeController', function() {
       controller.load();
     });
     afterEach(function(){
-      controller.loadUpgradeData.restore();
       controller.loadStackVersionsToModel.restore();
       controller.loadRepoVersionsToModel.restore();
       controller.loadCompatibleVersions.restore();
       App.StackVersion.find.restore();
     });
-    it("loadUpgradeData called with valid arguments", function() {
-      expect(controller.loadUpgradeData.calledWith(true)).to.be.true;
-    });
     it('loadStackVersionsToModel called with valid arguments', function () {
       expect(controller.loadStackVersionsToModel.calledWith(true)).to.be.true;
     });
@@ -1771,6 +1764,7 @@ describe('App.MainAdminStackAndUpgradeController', function() {
         upgrade_type: 'ROLLING',
         downgrade_allowed: true,
         skip_failures: true,
+        suspended: false,
         skip_service_check_failures: true,
         to_version: '1'
       }
@@ -1811,11 +1805,12 @@ describe('App.MainAdminStackAndUpgradeController', function() {
         upgradeType: "ROLLING",
         isWizardRestricted: false,
         downgradeAllowed: true,
+        isSuspended: false,
         upgradeTypeDisplayName: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.RU.title'),
-        failuresTolerance: Em.Object.create({
+        failuresTolerance: {
           skipComponentFailures: true,
           skipSCFailures: true
-        })
+        }
       });
     });
     it('models are saved', function () {
@@ -1824,9 +1819,6 @@ describe('App.MainAdminStackAndUpgradeController', function() {
     it('initDBProperties is called', function () {
       expect(controller.initDBProperties.calledOnce).to.be.true;
     });
-    it('loadUpgradeData called with valid arguments', function () {
-      expect(controller.loadUpgradeData.calledWith(true)).to.be.true;
-    });
   });
 
   describe("#getServiceCheckItemSuccessCallback()", function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/test/controllers/main_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main_test.js b/ambari-web/test/controllers/main_test.js
index 4ab423e..8adb1fd 100644
--- a/ambari-web/test/controllers/main_test.js
+++ b/ambari-web/test/controllers/main_test.js
@@ -102,4 +102,37 @@ describe('App.MainController', function () {
     });
   });
 
+  describe('#startPolling', function() {
+    var mock,
+        updateController = Em.Object.create({
+          startSubscriptions: sinon.spy(),
+          isWorking: false
+        }),
+        backgroundOperationsController = Em.Object.create({
+          isWorking: false
+        });
+    beforeEach(function() {
+      mock = sinon.stub(App.router, 'get');
+      mock.withArgs('applicationController.isExistingClusterDataLoaded').returns(true);
+      mock.withArgs('updateController').returns(updateController);
+      mock.withArgs('backgroundOperationsController').returns(backgroundOperationsController);
+      mainController.startPolling();
+    });
+    afterEach(function() {
+      App.router.get.restore();
+    });
+
+    it('updateController should be working', function() {
+      expect(updateController.get('isWorking')).to.be.true;
+    });
+
+    it('backgroundOperationsController should be working', function() {
+      expect(backgroundOperationsController.get('isWorking')).to.be.true;
+    });
+
+    it('startSubscriptions should be called', function() {
+      expect(updateController.startSubscriptions.called).to.be.true;
+    });
+  });
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/eaf1fd5c/ambari-web/test/mappers/socket/upgrade_state_mapper_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mappers/socket/upgrade_state_mapper_test.js b/ambari-web/test/mappers/socket/upgrade_state_mapper_test.js
new file mode 100644
index 0000000..322c04f
--- /dev/null
+++ b/ambari-web/test/mappers/socket/upgrade_state_mapper_test.js
@@ -0,0 +1,80 @@
+/**
+ * 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/socket/upgrade_state_mapper');
+
+describe('App.upgradeStateMapper', function () {
+
+  describe('#map', function() {
+    var mainAdminStackAndUpgradeController = Em.Object.create({
+      restoreLastUpgrade: sinon.spy(),
+      setDBProperty: sinon.spy(),
+      upgradeId: 1
+    });
+    beforeEach(function() {
+      sinon.stub(App.router, 'get').returns(mainAdminStackAndUpgradeController)
+    });
+    afterEach(function() {
+      App.router.get.restore();
+    });
+
+    it('should call restoreLastUpgrade on CREATE event', function() {
+      var event = {
+        type: 'CREATE',
+        associated_version: "2.5.4.0-121",
+        cluster_id: 2,
+        direction: "DOWNGRADE",
+        downgrade_allowed: false,
+        end_time: -1,
+        progress_percent: 0,
+        request_id: 26,
+        request_status: "PENDING",
+        revert_allowed: false,
+        skip_failures: false,
+        skip_service_check_failures: false,
+        start_time: -1,
+        suspended: false,
+        upgrade_id: 56,
+        upgrade_type: "NON_ROLLING"
+      };
+      App.upgradeStateMapper.map(event);
+      expect(mainAdminStackAndUpgradeController.restoreLastUpgrade.getCall(0).args[0]).to.be.eql({
+        Upgrade: event
+      });
+    });
+
+    it('should set upgrade state on UPDATE event', function() {
+      var event = {
+        end_time: -1,
+        progress_percent: 0,
+        request_id: 1,
+        request_status: "PENDING",
+        start_time: -1,
+        suspended: true,
+        type: "UPDATE"
+      };
+      App.upgradeStateMapper.map(event);
+      expect(App.get('upgradeState')).to.be.equal('PENDING');
+      expect(mainAdminStackAndUpgradeController.get('isSuspended')).to.be.true;
+      expect(mainAdminStackAndUpgradeController.setDBProperty.calledWith('upgradeState', 'PENDING')).to.be.true;
+      expect(mainAdminStackAndUpgradeController.setDBProperty.calledWith('isSuspended', true)).to.be.true;
+    });
+  });
+});