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 2015/06/16 11:45:30 UTC

ambari git commit: AMBARI-11943. RU: UI must retry ABORTED upgrades (onechiporenko)

Repository: ambari
Updated Branches:
  refs/heads/trunk 345f99588 -> b508d0396


AMBARI-11943. RU: UI must retry ABORTED upgrades (onechiporenko)


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

Branch: refs/heads/trunk
Commit: b508d0396dd572850c5018a4fcea6865261ac5be
Parents: 345f995
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Tue Jun 16 12:39:22 2015 +0300
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Tue Jun 16 12:39:22 2015 +0300

----------------------------------------------------------------------
 ambari-web/app/app.js                           | 16 ++++++
 .../main/admin/stack_and_upgrade_controller.js  | 50 +++++++++++++++++
 ambari-web/app/messages.js                      | 11 +++-
 ambari-web/app/styles/application.less          | 17 ++++++
 ambari-web/app/styles/common.less               | 19 +++++++
 ambari-web/app/templates/application.hbs        | 13 ++++-
 .../stack_upgrade/stack_upgrade_wizard.hbs      | 25 +++++++++
 ambari-web/app/utils/ajax/ajax.js               | 14 +++++
 .../stack_upgrade/upgrade_version_box_view.js   |  8 ++-
 .../admin/stack_upgrade/upgrade_wizard_view.js  |  4 +-
 ambari-web/test/app_test.js                     | 56 ++++++++++++++++++++
 .../admin/stack_and_upgrade_controller_test.js  | 48 +++++++++++++++++
 .../upgrade_version_box_view_test.js            | 40 ++++++++++++++
 .../stack_upgrade/upgrade_wizard_view_test.js   | 13 ++++-
 14 files changed, 328 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/ambari-web/app/app.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/app.js b/ambari-web/app/app.js
index 23db3a5..0683818 100644
--- a/ambari-web/app/app.js
+++ b/ambari-web/app/app.js
@@ -66,6 +66,14 @@ module.exports = Em.Application.create({
   }.property('upgradeState'),
 
   /**
+   * flag is true when upgrade process is aborted
+   * @returns {boolean}
+   */
+  upgradeAborted: function() {
+    return this.get('upgradeState') === "ABORTED";
+  }.property('upgradeState'),
+
+  /**
    * RU is running
    * @type {boolean}
    */
@@ -74,6 +82,14 @@ module.exports = Em.Application.create({
   }.property('upgradeInProgress', 'upgradeHolding'),
 
   /**
+   * flag is true when upgrade process is running or aborted
+   * @returns {boolean}
+   */
+  upgradeIsNotFinished: function () {
+    return this.get('upgradeIsRunning') || this.get('upgradeAborted');
+  }.property('upgradeIsRunning', 'upgradeAborted'),
+
+  /**
    * compute user access rights by permission type
    * types:
    *  - ADMIN

http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/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 7768f1c..309ab5e 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
@@ -69,6 +69,10 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
    */
   requestInProgress: false,
   /**
+   * @type {boolean} true while no updated upgrade info is loaded after retry
+   */
+  isRetryPending: false,
+  /**
    * properties that stored to localStorage to resume wizard progress
    */
   wizardStorageProperties: ['upgradeId', 'upgradeVersion', 'currentVersion', 'isDowngrade'],
@@ -207,6 +211,12 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
     if (data.upgrade_groups) {
       this.updateUpgradeData(data);
     }
+    if (this.get('isRetryPending') && data.Upgrade.request_status != 'ABORTED') {
+      this.setProperties({
+        requestInProgress: false,
+        isRetryPending: false
+      });
+    }
   },
 
   /**
@@ -375,6 +385,20 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
     });
   },
 
+  retryUpgrade: function () {
+    this.setProperties({
+      requestInProgress: true,
+      isRetryPending: true
+    });
+    return App.ajax.send({
+      name: 'admin.upgrade.retry',
+      sender: this,
+      data: {
+        upgradeId: this.get('upgradeId')
+      }
+    });
+  },
+
   /**
    * make call to start upgrade process and show popup with current progress
    * @param {object} version
@@ -507,6 +531,32 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
     this.set('requestInProgress', false);
   },
 
+  confirmRetryUpgrade: function (version) {
+    var self = this;
+    return App.showConfirmationPopup(
+      function () {
+        self.retryUpgrade();
+      },
+      Em.I18n.t('admin.stackUpgrade.upgrade.retry.confirm.body').format(version.get('displayName')),
+      null,
+      Em.I18n.t('admin.stackUpgrade.dialog.header').format(version.get('displayName'))
+    );
+  },
+
+  confirmRetryDowngrade: function () {
+    var self = this,
+      currentVersion = this.get('currentVersion');
+    return App.showConfirmationPopup(
+      function() {
+        self.retryUpgrade();
+      },
+      Em.I18n.t('admin.stackUpgrade.downgrade.retry.body').format(currentVersion.repository_name),
+      null,
+      Em.I18n.t('admin.stackUpgrade.dialog.downgrade.header').format(currentVersion.repository_name),
+      Em.I18n.t('admin.stackUpgrade.downgrade.proceed')
+    );
+  },
+
   /**
    * confirmation popup before install repository version
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 40e76d5..0f5a8a9 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -158,6 +158,7 @@ Em.I18n.translations = {
   'common.confirm': 'Confirm',
   'common.upgrade': 'Upgrade',
   'common.reUpgrade': 'Retry Upgrade',
+  'common.reDowngrade': 'Retry Downgrade',
   'common.security':'Security',
   'common.kerberos':'Kerberos',
   'common.cluster':'Cluster',
@@ -343,7 +344,7 @@ Em.I18n.translations = {
   'popup.clusterCheck.Upgrade.fail.title': 'Requirements',
   'popup.clusterCheck.Upgrade.fail.alert': 'You <strong>must</strong> meet these requirements before you can proceed.',
   'popup.clusterCheck.Upgrade.warning.title': 'Warnings',
-  'popup.clusterCheck.Upgrade.warning.alert': 'Correcting the warnings are not required but are <strong>recommended</strong>.',
+  'popup.clusterCheck.Upgrade.warning.alert': 'Correcting the warnings is not required but is <strong>recommended</strong>.',
   'popup.clusterCheck.Upgrade.configsMerge.title': 'Configuration Changes',
   'popup.clusterCheck.Upgrade.configsMerge.alert': 'During upgrade, the following configuration changes will be applied.',
   'popup.clusterCheck.Upgrade.configsMerge.configType': 'Config Type',
@@ -1426,8 +1427,10 @@ Em.I18n.translations = {
   'admin.stackVersions.version.performUpgrade': "Perform Upgrade",
   'admin.stackVersions.version.upgrade.pause': "Upgrade: Action Required",
   'admin.stackVersions.version.upgrade.running': "Upgrade: In Process",
+  'admin.stackVersions.version.upgrade.aborted': "Upgrade: Aborted",
   'admin.stackVersions.version.downgrade.pause': "Downgrade: Action Required",
   'admin.stackVersions.version.downgrade.running': "Downgrade: In Process",
+  'admin.stackVersions.version.downgrade.aborted': "Downgrade: Aborted",
 
   'admin.stackVersions.hosts.popup.header.current': "Current",
   'admin.stackVersions.hosts.popup.header.installed': "Installed",
@@ -1454,13 +1457,17 @@ Em.I18n.translations = {
   'admin.stackUpgrade.pauseDowngrade': "Pause Downgrade",  
   'admin.stackUpgrade.downgrade.proceed': "Proceed with Downgrade",
   'admin.stackUpgrade.downgrade.body': "Are you sure you wish to abort the upgrade process and downgrade to <b>{0}</b>?",
+  'admin.stackUpgrade.downgrade.retry.body': "Are you sure you wish to retry downgrade to <b>{0}</b>?",
   'admin.stackUpgrade.upgrade.confirm.body': "You are about to perform an upgrade to {0}.",
+  'admin.stackUpgrade.upgrade.retry.confirm.body': "You are about to retry an upgrade to {0}.",
   'admin.stackUpgrade.title': "Stack and Versions",
   'admin.stackUpgrade.state.inProgress': "Upgrade in Progress",
   'admin.stackUpgrade.state.paused': "Upgrade Paused",
+  'admin.stackUpgrade.state.aborted': "Upgrade Aborted",
   'admin.stackUpgrade.state.completed': "Upgrade Finished",
   'admin.stackUpgrade.state.inProgress.downgrade': "Downgrade in Progress",
   'admin.stackUpgrade.state.paused.downgrade': "Downgrade Paused",
+  'admin.stackUpgrade.state.aborted.downgrade': "Downgrade Aborted",
   'admin.stackUpgrade.state.completed.downgrade': "Downgrade Finished",
   'admin.stackUpgrade.dialog.header': "Rolling Upgrade to {0}",
   'admin.stackUpgrade.dialog.downgrade.header': "Downgrade to {0}",
@@ -1475,6 +1482,8 @@ Em.I18n.translations = {
   'admin.stackUpgrade.dialog.manualDone': "I have performed the manual steps above.",
   'admin.stackUpgrade.dialog.closeProgress': "Upgrade is in progress. \n If you dismiss this window, Upgrade will keep running in background.",
   'admin.stackUpgrade.dialog.closePause': "Upgrade is paused. \n If you dismiss this window, you can resume Upgrade later.",
+  'admin.stackUpgrade.dialog.aborted': "Upgrade is aborted. \n You can either downgrade or retry upgrade.",
+  'admin.stackUpgrade.dialog.downgrade.aborted': "Downgrade is aborted. \n You can retry downgrade.",
   'admin.stackUpgrade.dialog.details.open': "show details",
   'admin.stackUpgrade.dialog.details.hide': "hide details",
   'admin.stackUpgrade.dialog.notActive': "Waiting to execute the next task...",

http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index 25e719c..5866fb0 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -181,6 +181,23 @@ footer {
         animation-iteration-count: infinite;
       }
 
+      .upgrade-aborted {
+        text-shadow: none;
+        background-color: @health-status-red;
+        -webkit-animation-name: redPulse;
+        -webkit-animation-duration: 1s;
+        -webkit-animation-iteration-count: infinite;
+        -moz-animation-name: redPulse;
+        -moz-animation-duration: 1s;
+        -moz-animation-iteration-count: infinite;
+        animation-name: redPulse;
+        animation-duration: 1s;
+        animation-iteration-count: infinite;
+        .icon-remove {
+          color: #fff;
+        }
+      }
+
     }
     @media (max-width: 1200px) {
       ul.top-nav-menu.nav {

http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/ambari-web/app/styles/common.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/common.less b/ambari-web/app/styles/common.less
index 64bfde3..0edec5f 100644
--- a/ambari-web/app/styles/common.less
+++ b/ambari-web/app/styles/common.less
@@ -115,6 +115,25 @@
   100% { color: #118fff; }
 }
 
+@-webkit-keyframes redPulse {
+  from { background-color: #ff3333; }
+  50% { background-color: #ff0000; }
+  to { background-color: #ff3333; }
+}
+
+@-moz-keyframes redPulse {
+  from { background-color: #ff3333; }
+  50% { background-color: #ff0000; }
+  to { background-color: #ff3333; }
+}
+
+@keyframes redPulse
+{
+  0% { background-color: #ff3333; }
+  50% { background-color: #ff0000; }
+  100% { background-color: #ff3333; }
+}
+
 .gradient(@color: #FAFAFA, @start: #FFFFFF, @stop: #F2F2F2) {
   background: @color;
   background: -webkit-gradient(linear, left top, left bottom, color-stop(0, @start), color-stop(1, @stop));

http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/ambari-web/app/templates/application.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/application.hbs b/ambari-web/app/templates/application.hbs
index 10897e9..e6de54e 100644
--- a/ambari-web/app/templates/application.hbs
+++ b/ambari-web/app/templates/application.hbs
@@ -95,7 +95,7 @@
   </div>
   <div class="container main-container">
     <div id="content">
-      {{#if App.upgradeIsRunning}}
+      {{#if App.upgradeIsNotFinished}}
         <div class="ru-badge span12">
           <div class="navbar navbar-static-top clearfix">
             <div class="span4 offset4">
@@ -123,6 +123,17 @@
                           <i class="icon-pause"></i>&nbsp;{{t admin.stackVersions.version.upgrade.pause}}</span>
                     {{/if}}
                   {{/if}}
+                  {{#if App.upgradeAborted}}
+                    {{#if App.router.mainAdminStackAndUpgradeController.isDowngrade}}
+                      <span
+                          class="label upgrade-aborted" {{action "openUpgradeDialog" target="App.router.mainAdminStackAndUpgradeController"}}>
+                          <i class="icon-remove"></i>&nbsp;{{t admin.stackVersions.version.downgrade.aborted}}</span>
+                    {{else}}
+                      <span
+                        class="label upgrade-aborted" {{action "openUpgradeDialog" target="App.router.mainAdminStackAndUpgradeController"}}>
+                          <i class="icon-remove"></i>&nbsp;{{t admin.stackVersions.version.upgrade.aborted}}</span>
+                    {{/if}}
+                  {{/if}}
                 </a>
               {{/if}}
             </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_wizard.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_wizard.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_wizard.hbs
index c6f38b5..7874175 100644
--- a/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_wizard.hbs
+++ b/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_wizard.hbs
@@ -153,6 +153,31 @@
             </div>
           </div>
         {{/if}}
+        {{#if App.upgradeAborted}}
+          {{#unless requestInProgress}}
+            <div class="box details-box">
+              <label class="message">
+                {{#if view.isDowngradeAvailable}}
+                  {{t admin.stackUpgrade.dialog.aborted}}
+                {{else}}
+                  {{t admin.stackUpgrade.dialog.downgrade.aborted}}
+                {{/if}}
+              </label>
+              <div class="button-row">
+                {{#if view.isDowngradeAvailable}}
+                  <button class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.manualItem target="controller"}}>{{t common.downgrade}}</button>
+                {{/if}}
+                <button class="btn btn-success" {{action retryUpgrade target="controller"}}>
+                  {{#if view.isDowngradeAvailable}}
+                    {{t common.reUpgrade}}
+                  {{else}}
+                    {{t common.reDowngrade}}
+                  {{/if}}
+                </button>
+              </div>
+            </div>
+          {{/unless}}
+        {{/if}}
       </div>
       {{#each group in view.upgradeGroups}}
         {{#if group.isVisible}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js
index 2542e57..2ec11c9 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -1553,6 +1553,20 @@ var urls = {
       }
     }
   },
+  'admin.upgrade.retry': {
+    'real': '/clusters/{clusterName}/upgrades/{upgradeId}',
+    'mock': '',
+    'type': 'PUT',
+    'format': function (data) {
+      return {
+        data: JSON.stringify({
+          "Upgrade": {
+            "request_status": "PENDING"
+          }
+        })
+      }
+    }
+  },
   'admin.upgrade.upgradeItem.setState': {
     'real': '/clusters/{clusterName}/upgrades/{upgradeId}/upgrade_groups/{groupId}/upgrade_items/{itemId}',
     'mock': '',

http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js
index 28d1428..9e6d5ad 100644
--- a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js
+++ b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js
@@ -110,6 +110,7 @@ App.UpgradeVersionBoxView = Em.View.extend({
       isDisabled: false
     });
     var isInstalling = this.get('parentView.repoVersions').someProperty('status', 'INSTALLING');
+    var isAborted = App.get('upgradeState') === 'ABORTED';
 
     if (status === 'CURRENT') {
       element.set('isLabel', true);
@@ -143,7 +144,7 @@ App.UpgradeVersionBoxView = Em.View.extend({
         element.set('text', Em.I18n.t('common.installed'));
         element.set('action', null);
       }
-    } else if (['UPGRADING', 'UPGRADE_FAILED', 'UPGRADED'].contains(status) || this.get('isUpgrading')) {
+    } else if ((['UPGRADING', 'UPGRADE_FAILED', 'UPGRADED'].contains(status) || this.get('isUpgrading')) && !isAborted) {
       element.set('isLink', true);
       element.set('action', 'openUpgradeDialog');
       if (['HOLDING', 'HOLDING_FAILED', 'HOLDING_TIMEDOUT'].contains(App.get('upgradeState'))) {
@@ -161,6 +162,11 @@ App.UpgradeVersionBoxView = Em.View.extend({
           element.set('text', Em.I18n.t('admin.stackVersions.version.upgrade.running'));
         }
       }
+    } else if (isAborted) {
+      element.set('isButton', true);
+      element.set('text', this.get('controller.isDowngrade') ? Em.I18n.t('common.reDowngrade') : Em.I18n.t('common.reUpgrade'));
+      element.set('action', this.get('controller.isDowngrade') ? 'confirmRetryDowngrade' : 'confirmRetryUpgrade');
+      element.set('isDisabled', this.get('controller.requestInProgress'));
     }
     return element;
   }.property('content.status', 'controller.isDowngrade', 'isUpgrading', 'controller.requestInProgress', 'parentView.repoVersions.@each.status'),

http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/ambari-web/app/views/main/admin/stack_upgrade/upgrade_wizard_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_wizard_view.js b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_wizard_view.js
index 590201e..d7098a6 100644
--- a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_wizard_view.js
+++ b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_wizard_view.js
@@ -122,7 +122,7 @@ App.upgradeWizardView = Em.View.extend({
    */
   noActiveItem: function () {
     return (Em.isNone(this.get('failedItem')) && Em.isNone(this.get('runningItem')) && Em.isNone(this.get('manualItem'))) &&
-      !['INIT', 'COMPLETED'].contains(App.get('upgradeState'));
+      !['INIT', 'COMPLETED', 'ABORTED'].contains(App.get('upgradeState'));
   }.property('failedItem', 'runningItem', 'manualItem', 'App.upgradeState'),
 
   /**
@@ -193,6 +193,8 @@ App.upgradeWizardView = Em.View.extend({
         labelKey = 'admin.stackUpgrade.state.completed';
         break;
       case 'ABORTED':
+        labelKey = 'admin.stackUpgrade.state.aborted';
+        break;
       case 'TIMEDOUT':
       case 'FAILED':
       case 'HOLDING_FAILED':

http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/ambari-web/test/app_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/app_test.js b/ambari-web/test/app_test.js
index 9a2a0f6..416f3af 100644
--- a/ambari-web/test/app_test.js
+++ b/ambari-web/test/app_test.js
@@ -556,4 +556,60 @@ describe('App', function () {
 
   });
 
+  describe('#upgradeAborted', function () {
+
+    var cases = [
+      {
+        upgradeState: 'INIT',
+        upgradeAborted: false
+      },
+      {
+        upgradeState: 'ABORTED',
+        upgradeAborted: true
+      }
+    ];
+
+    cases.forEach(function (item) {
+      it(item.upgradeState, function () {
+        App.set('upgradeState', item.upgradeState);
+        expect(App.get('upgradeAborted')).to.equal(item.upgradeAborted);
+      });
+    });
+
+  });
+
+  describe('#upgradeIsNotFinished', function () {
+
+    var cases = [
+      {
+        upgradeState: 'INIT',
+        upgradeIsNotFinished: false
+      },
+      {
+        upgradeState: 'IN_PROGRESS',
+        upgradeIsNotFinished: true
+      },
+      {
+        upgradeState: 'HOLDING',
+        upgradeIsNotFinished: true
+      },
+      {
+        upgradeState: 'HOLDING_TIMEDOUT',
+        upgradeIsNotFinished: true
+      },
+      {
+        upgradeState: 'ABORTED',
+        upgradeIsNotFinished: true
+      }
+    ];
+
+    cases.forEach(function (item) {
+      it(item.upgradeState, function () {
+        App.set('upgradeState', item.upgradeState);
+        expect(App.get('upgradeIsNotFinished')).to.equal(item.upgradeIsNotFinished);
+      });
+    });
+
+  });
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/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 f456708..a37e115 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
@@ -151,6 +151,36 @@ describe('App.MainAdminStackAndUpgradeController', function() {
   });
 
   describe("#loadUpgradeDataSuccessCallback()", function() {
+    var retryCases = [
+      {
+        isRetryPendingInitial: true,
+        status: 'ABORTED',
+        isRetryPending: true,
+        requestInProgress: true,
+        title: 'retry request not yet applied'
+      },
+      {
+        isRetryPendingInitial: true,
+        status: 'UPGRADING',
+        isRetryPending: false,
+        requestInProgress: false,
+        title: 'retry request applied'
+      },
+      {
+        isRetryPendingInitial: false,
+        status: 'ABORTED',
+        isRetryPending: false,
+        requestInProgress: true,
+        title: 'no retry request sent'
+      },
+      {
+        isRetryPendingInitial: false,
+        status: 'UPGRADING',
+        isRetryPending: false,
+        requestInProgress: true,
+        title: 'upgrade wasn\'t aborted'
+      }
+    ];
     beforeEach(function () {
       sinon.stub(controller, 'updateUpgradeData', Em.K);
       sinon.stub(controller, 'setDBProperty', Em.K);
@@ -183,6 +213,24 @@ describe('App.MainAdminStackAndUpgradeController', function() {
       expect(controller.updateUpgradeData.called).to.be.false;
       expect(controller.setDBProperty.called).to.be.false;
     });
+    retryCases.forEach(function (item) {
+      it(item.title, function () {
+        var data = {
+          "Upgrade": {
+            "request_status": item.status
+          }
+        };
+        controller.setProperties({
+          isRetryPending: item.isRetryPendingInitial,
+          requestInProgress: true
+        });
+        controller.loadUpgradeDataSuccessCallback(data);
+        expect(controller.getProperties(['isRetryPending', 'requestInProgress'])).to.eql({
+          isRetryPending: item.isRetryPending,
+          requestInProgress: item.requestInProgress
+        });
+      });
+    });
   });
 
   describe("#getUpgradeItem()", function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/ambari-web/test/views/main/admin/stack_upgrade/upgrade_version_box_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_version_box_view_test.js b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_version_box_view_test.js
index e45bfd3..080bf39 100644
--- a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_version_box_view_test.js
+++ b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_version_box_view_test.js
@@ -699,6 +699,46 @@ describe('App.UpgradeVersionBoxView', function () {
           text: Em.I18n.t('admin.stackVersions.version.downgrade.pause')
         },
         title: 'downgrading, holding finished on timeout'
+      },
+      {
+        inputData: {
+          'content.status': 'UPGRADING',
+          'isUpgrading': true,
+          'controller.isDowngrade': false,
+          'controller.requestInProgress': false,
+          'parentView.repoVersions': []
+        },
+        setup: function () {
+          this.getMock.withArgs('upgradeState').returns('ABORTED');
+        },
+        expected: {
+          status: 'UPGRADING',
+          isButton: true,
+          action: 'confirmRetryUpgrade',
+          text: Em.I18n.t('common.reUpgrade'),
+          isDisabled: false
+        },
+        title: 'upgrade aborted'
+      },
+      {
+        inputData: {
+          'content.status': 'UPGRADE_FAILED',
+          'isUpgrading': true,
+          'controller.isDowngrade': true,
+          'controller.requestInProgress': true,
+          'parentView.repoVersions': []
+        },
+        setup: function () {
+          this.getMock.withArgs('upgradeState').returns('ABORTED');
+        },
+        expected: {
+          status: 'UPGRADE_FAILED',
+          isButton: true,
+          action: 'confirmRetryDowngrade',
+          text: Em.I18n.t('common.reDowngrade'),
+          isDisabled: true
+        },
+        title: 'downgrade aborted, request in progress'
       }
     ];
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b508d039/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
index 9dfaddd..37027b1 100644
--- a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
+++ b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_wizard_view_test.js
@@ -292,6 +292,15 @@ describe('App.upgradeWizardView', function () {
           failedItem: null,
           runningItem: null,
           manualItem: null,
+          upgradeState: 'ABORTED'
+        },
+        result: false
+      },
+      {
+        data: {
+          failedItem: null,
+          runningItem: null,
+          manualItem: null,
           upgradeState: 'IN_PROGRESS'
         },
         result: true
@@ -472,7 +481,7 @@ describe('App.upgradeWizardView', function () {
           status: 'ABORTED',
           isDowngrade: false
         },
-        result: Em.I18n.t('admin.stackUpgrade.state.paused')
+        result: Em.I18n.t('admin.stackUpgrade.state.aborted')
       },
       {
         data: {
@@ -549,7 +558,7 @@ describe('App.upgradeWizardView', function () {
           status: 'ABORTED',
           isDowngrade: true
         },
-        result: Em.I18n.t('admin.stackUpgrade.state.paused.downgrade')
+        result: Em.I18n.t('admin.stackUpgrade.state.aborted.downgrade')
       },
       {
         data: {