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 2015/09/10 14:14:32 UTC

ambari git commit: AMBARI-13054 Pre-Req Endpoint Should Be Used For Determining Upgrade Button Visibility. (atkach)

Repository: ambari
Updated Branches:
  refs/heads/trunk eccadf9ce -> c985602cc


AMBARI-13054 Pre-Req Endpoint Should Be Used For Determining Upgrade Button Visibility. (atkach)


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

Branch: refs/heads/trunk
Commit: c985602ccb4a8b9696f0f0eab33425aa7d03d706
Parents: eccadf9
Author: Andrii Tkach <at...@hortonworks.com>
Authored: Thu Sep 10 15:14:05 2015 +0300
Committer: Andrii Tkach <at...@hortonworks.com>
Committed: Thu Sep 10 15:14:24 2015 +0300

----------------------------------------------------------------------
 .../stack_upgrade/upgrade_version_box_view.js   | 87 ++++++++++++++++---
 .../upgrade_version_box_view_test.js            | 89 ++++++++++++++++++++
 2 files changed, 165 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c985602c/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 f4950c3..2e468a1 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
@@ -32,6 +32,17 @@ App.UpgradeVersionBoxView = Em.View.extend({
   PROGRESS_STATUS: 'IN_PROGRESS',
 
   /**
+   * flag that verify Upgrade availability when version in INSTALL_FAILED state
+   * @type {boolean}
+   */
+  isUpgradeAvailable: false,
+
+  /**
+   * @type {boolean}
+   */
+  upgradeCheckInProgress: false,
+
+  /**
    * progress of version installation
    * @type {number}
    */
@@ -103,7 +114,6 @@ App.UpgradeVersionBoxView = Em.View.extend({
    */
   stateElement: function () {
     var currentVersion = this.get('controller.currentVersion');
-    var upgradeVersion = this.get('controller.upgradeVersion');
     var status = this.get('content.status');
     var element = Em.Object.create({
       status: status,
@@ -120,17 +130,21 @@ App.UpgradeVersionBoxView = Em.View.extend({
       element.set('isLabel', true);
       element.set('text', Em.I18n.t('common.current'));
       element.set('class', 'label label-success');
-    } else if (['INIT', 'INSTALL_FAILED', 'OUT_OF_SYNC'].contains(status)) {
+    }
+    else if (['INIT', 'INSTALL_FAILED', 'OUT_OF_SYNC'].contains(status) && !this.get('isUpgradeAvailable')) {
       element.set('isButton', true);
       element.set('text', Em.I18n.t('admin.stackVersions.version.installNow'));
       element.set('action', 'installRepoVersionConfirmation');
       element.set('isDisabled', !App.isAccessible('ADMIN') || this.get('controller.requestInProgress') || isInstalling);
-    } else if (status === 'INSTALLING') {
+    }
+    else if (status === 'INSTALLING') {
       element.set('iconClass', 'icon-cog');
       element.set('isLink', true);
       element.set('text', Em.I18n.t('hosts.host.stackVersions.status.installing'));
       element.set('action', 'showProgressPopup');
-    } else if (status === 'INSTALLED' && !this.get('isUpgrading')) {
+    }
+    else if ((status === 'INSTALLED' && !this.get('isUpgrading')) ||
+             (status === 'INSTALL_FAILED' && this.get('isUpgradeAvailable'))) {
       if (stringUtils.compareVersions(this.get('content.repositoryVersion'), Em.get(currentVersion, 'repository_version')) === 1) {
         var isDisabled = !App.isAccessible('ADMIN') || this.get('controller.requestInProgress') || isInstalling;
         element.set('isButtonGroup', true);
@@ -142,40 +156,53 @@ App.UpgradeVersionBoxView = Em.View.extend({
           isDisabled: isDisabled
         });
         element.set('isDisabled', isDisabled);
-      } else {
+      }
+      else {
         element.set('iconClass', 'icon-ok');
         element.set('isLink', true);
         element.set('text', Em.I18n.t('common.installed'));
         element.set('action', null);
       }
-    } else if ((['UPGRADING', 'UPGRADE_FAILED', 'UPGRADED'].contains(status) || this.get('isUpgrading')) && !isAborted) {
+    }
+    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'))) {
         element.set('iconClass', 'icon-pause');
         if (this.get('controller.isDowngrade')) {
           element.set('text', Em.I18n.t('admin.stackVersions.version.downgrade.pause'));
-        } else {
+        }
+        else {
           element.set('text', Em.I18n.t('admin.stackVersions.version.upgrade.pause'));
         }
-      } else {
+      }
+      else {
         element.set('iconClass', 'icon-cog');
         if (this.get('controller.isDowngrade')) {
           element.set('text', Em.I18n.t('admin.stackVersions.version.downgrade.running'));
-        } else {
+        }
+        else {
           element.set('text', Em.I18n.t('admin.stackVersions.version.upgrade.running'));
         }
       }
-    } else if (isAborted) {
+    }
+    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'),
+  }.property(
+    'content.status',
+    'controller.isDowngrade',
+    'isUpgrading',
+    'controller.requestInProgress',
+    'parentView.repoVersions.@each.status',
+    'isUpgradeAvailable'),
 
   didInsertElement: function () {
+    this.checkUpgradeAvailability();
     App.tooltip($('.link-tooltip'), {title: Em.I18n.t('admin.stackVersions.version.linkTooltip')});
     App.tooltip($('.hosts-tooltip'));
     App.tooltip($('.out-of-sync-badge'), {title: Em.I18n.t('hosts.host.stackVersions.status.out_of_sync')});
@@ -339,5 +366,43 @@ App.UpgradeVersionBoxView = Em.View.extend({
     App.router.get('mainHostController').filterByStack(displayName, state);
     App.router.get('mainHostController').set('showFilterConditionsFirstLoad', true);
     App.router.transitionTo('hosts.index');
+  },
+
+  /**
+   * when version in INSTALL_FAILED state it still could be upgraded if check passed
+   */
+  checkUpgradeAvailability: function () {
+    if (this.get('content.status') === 'INSTALL_FAILED') {
+      this.runUpgradeCheck();
+    }
+  }.observes('content.status'),
+
+  /**
+   * run Upgrade Check
+   */
+  runUpgradeCheck: function() {
+    if (App.get('supports.preUpgradeCheck') && !this.get('upgradeCheckInProgress')) {
+      App.ajax.send({
+        name: "admin.rolling_upgrade.pre_upgrade_check",
+        sender: this,
+        data: {
+          value: this.get('content.repositoryVersion'),
+          label: this.get('content.displayName')
+        },
+        success: "runUpgradeCheckSuccess",
+        error: "runUpgradeCheckError"
+      });
+      this.set('upgradeCheckInProgress', true);
+    }
+  },
+
+  runUpgradeCheckSuccess: function (data) {
+    this.set('isUpgradeAvailable', !data.items.someProperty('UpgradeChecks.status', 'FAIL'));
+    this.set('upgradeCheckInProgress', false);
+  },
+
+  runUpgradeCheckError: function() {
+    this.set('isUpgradeAvailable', false);
+    this.set('upgradeCheckInProgress', false);
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/c985602c/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 7654411..0911a4d 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
@@ -432,6 +432,34 @@ describe('App.UpgradeVersionBoxView', function () {
       },
       {
         inputData: {
+          'controller.currentVersion': {
+            repository_version: '2.2.0'
+          },
+          'content.repositoryVersion': '2.2.1',
+          'content.status': 'INSTALL_FAILED',
+          'controller.requestInProgress': false,
+          'parentView.repoVersions': [],
+          'isUpgradeAvailable': true
+        },
+        setup: function () {
+          this.isAccessibleMock.withArgs('ADMIN').returns(true);
+        },
+        expected: {
+          status: 'INSTALL_FAILED',
+          isButtonGroup: true,
+          buttons: [
+            {
+              text: Em.I18n.t('admin.stackVersions.version.reinstall'),
+              action: 'installRepoVersionConfirmation',
+              isDisabled: false
+            }
+          ],
+          isDisabled: false
+        },
+        title: 'install failed version should be enabled to Upgrade'
+      },
+      {
+        inputData: {
           'content.status': 'OUT_OF_SYNC',
           'controller.requestInProgress': false,
           'parentView.repoVersions': [
@@ -827,7 +855,68 @@ describe('App.UpgradeVersionBoxView', function () {
         expect(view.get('isRepoUrlsEditDisabled')).to.equal(item.isRepoUrlsEditDisabled);
       });
     });
+  });
+
+  describe("#checkUpgradeAvailability()", function () {
+    beforeEach(function () {
+      sinon.stub(view, 'runUpgradeCheck', Em.K);
+    });
+    afterEach(function () {
+      view.runUpgradeCheck.restore();
+    });
 
+    it("status is INSTALLED", function () {
+      view.set('content.status', 'INSTALLED');
+      view.checkUpgradeAvailability();
+      expect(view.runUpgradeCheck.called).to.be.false;
+    });
+    it("status is INSTALL_FAILED", function () {
+      view.set('content.status', 'INSTALL_FAILED');
+      view.checkUpgradeAvailability();
+      expect(view.runUpgradeCheck.calledTwice).to.be.true;
+    });
   });
 
+  describe("#runUpgradeCheck()", function () {
+    beforeEach(function () {
+      sinon.stub(App.ajax, 'send', Em.K);
+    });
+    afterEach(function () {
+      App.ajax.send.restore();
+    });
+
+    it("upgradeCheckInProgress is true", function () {
+      view.set('upgradeCheckInProgress', true);
+      view.runUpgradeCheck();
+      expect(App.ajax.send.called).to.be.false;
+      expect(view.get('upgradeCheckInProgress')).to.be.true;
+    });
+    it("upgradeCheckInProgress is false", function () {
+      view.set('upgradeCheckInProgress', false);
+      view.runUpgradeCheck();
+      expect(App.ajax.send.calledOnce).to.be.true;
+      expect(view.get('upgradeCheckInProgress')).to.be.true;
+    });
+  });
+
+  describe("#runUpgradeCheckSuccess()", function () {
+    it("check failed", function () {
+      view.runUpgradeCheckSuccess({items: [{UpgradeChecks: {status: 'FAIL'}}]});
+      expect(view.get('isUpgradeAvailable')).to.be.false;
+      expect(view.get('upgradeCheckInProgress')).to.be.false;
+    });
+    it("check passed", function () {
+      view.runUpgradeCheckSuccess({items: [{UpgradeChecks: {status: 'PASS'}}]});
+      expect(view.get('isUpgradeAvailable')).to.be.true;
+      expect(view.get('upgradeCheckInProgress')).to.be.false;
+    });
+  });
+
+  describe("#runUpgradeCheckError()", function () {
+    it("check failed", function () {
+      view.runUpgradeCheckError();
+      expect(view.get('isUpgradeAvailable')).to.be.false;
+      expect(view.get('upgradeCheckInProgress')).to.be.false;
+    });
+  });
 });