Browse Source

AMBARI-15619 UI - calculate RU/EU is paused by using "suspended" property. (atkach)

Andrii Tkach 9 năm trước cách đây
mục cha
commit
13dfd3f195

+ 20 - 8
ambari-web/app/app.js

@@ -55,6 +55,9 @@ module.exports = Em.Application.create({
    *  - IN_PROGRESS
    *  - HOLDING
    *  - COMPLETED
+   *  - ABORTED
+   *  - HOLDING_FAILED
+   *  - HOLDING_TIMEDOUT
    * @type {String}
    */
   upgradeState: 'INIT',
@@ -71,16 +74,25 @@ module.exports = Em.Application.create({
    * @returns {boolean}
    */
   upgradeHolding: function() {
-    return this.get('upgradeState').contains("HOLDING");
-  }.property('upgradeState'),
+    return this.get('upgradeState').contains("HOLDING") || this.get('upgradeAborted');
+  }.property('upgradeState', 'upgradeAborted'),
 
   /**
    * flag is true when upgrade process is aborted
+   * SHOULD behave similar to HOLDING_FAILED state
    * @returns {boolean}
    */
   upgradeAborted: function () {
-    return this.get('upgradeState') === "ABORTED";
-  }.property('upgradeState'),
+    return this.get('upgradeState') === "ABORTED" && !App.router.get('mainAdminStackAndUpgradeController.isSuspended');
+  }.property('upgradeState', 'App.router.mainAdminStackAndUpgradeController.isSuspended'),
+
+  /**
+   * flag is true when upgrade process is suspended
+   * @returns {boolean}
+   */
+  upgradeSuspended: function () {
+    return this.get('upgradeState') === "ABORTED" && App.router.get('mainAdminStackAndUpgradeController.isSuspended');
+  }.property('upgradeState', 'App.router.mainAdminStackAndUpgradeController.isSuspended'),
 
   /**
    * RU is running
@@ -89,15 +101,15 @@ module.exports = Em.Application.create({
   upgradeIsRunning: Em.computed.or('upgradeInProgress', 'upgradeHolding'),
 
   /**
-   * flag is true when upgrade process is running or aborted
+   * flag is true when upgrade process is running or suspended
    * or wizard used by another user
    * @returns {boolean}
    */
   wizardIsNotFinished: function () {
     return this.get('upgradeIsRunning') ||
-           this.get('upgradeAborted') ||
+           this.get('upgradeSuspended') ||
            App.router.get('wizardWatcherController.isNonWizardUser');
-  }.property('upgradeIsRunning', 'upgradeAborted', 'router.wizardWatcherController.isNonWizardUser'),
+  }.property('upgradeIsRunning', 'upgradeAborted', 'router.wizardWatcherController.isNonWizardUser', 'upgradeSuspended'),
 
   /**
    * Options:
@@ -112,7 +124,7 @@ module.exports = Em.Application.create({
     var result = false;
     authRoles = $.map(authRoles.split(","), $.trim);
 
-    if (!(this.get('upgradeState') == "ABORTED") &&
+    if (!this.get('upgradeSuspended') &&
         !App.get('supports.opsDuringRollingUpgrade') &&
         !['INIT', 'COMPLETED'].contains(this.get('upgradeState')) ||
         !App.auth){

+ 18 - 5
ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js

@@ -75,6 +75,13 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
    */
   isDowngrade: false,
 
+  /**
+   * flag which indicate that upgrade suspended
+   * @type {boolean}
+   * @default false
+   */
+  isSuspended: false,
+
   /**
    * version that currently applied to server
    * should be plain object, because stored to localStorage
@@ -139,14 +146,17 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
    * @type {boolean} true if some request that should disable actions is in progress
    */
   requestInProgress: false,
+
   /**
    * @type {number} repo id, request for which is currently in progress
    */
   requestInProgressRepoId: null,
+
   /**
    * @type {boolean} true while no updated upgrade info is loaded after retry
    */
   isRetryPending: false,
+
   /**
    * properties that stored to localStorage to resume wizard progress
    */
@@ -158,7 +168,8 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
     'upgradeType',
     'failuresTolerance',
     'isDowngrade',
-    'downgradeAllowed'
+    'downgradeAllowed',
+    'isSuspended'
   ],
 
   /**
@@ -254,14 +265,14 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
    * @type {string}
    */
   requestStatus: function () {
-    if (this.get('upgradeData.Upgrade') && this.get('upgradeData.Upgrade.request_status') == 'ABORTED') {
+    if (this.get('upgradeData.Upgrade') && App.get('upgradeSuspended')) {
       return 'SUSPENDED';
     } else if (this.get('upgradeData.Upgrade')){
       return this.get('upgradeData.Upgrade.request_status');
     } else {
       return '';
     }
-  }.property('upgradeData.Upgrade.request_status'),
+  }.property('upgradeData.Upgrade.request_status', 'App.upgradeSuspended'),
 
   init: function () {
     this.initDBProperties();
@@ -342,10 +353,12 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
     if (Em.isNone(data)) return;
     App.set('upgradeState', data.Upgrade.request_status);
     this.setDBProperty('upgradeState', data.Upgrade.request_status);
+    this.set('isSuspended', data.Upgrade.suspended);
+    this.setDBProperty('isSuspended', data.Upgrade.suspended);
     if (data.upgrade_groups) {
       this.updateUpgradeData(data);
     }
-    if (this.get('isRetryPending') && data.Upgrade.request_status != 'ABORTED') {
+    if (this.get('isRetryPending') && data.Upgrade.request_status !== 'ABORTED') {
       this.setProperties({
         requestInProgress: false,
         isRetryPending: false
@@ -1714,7 +1727,7 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
     var self = this;
     this.retryUpgrade().done(function () {
       App.set('upgradeState', 'PENDING');
-      App.propertyDidChange('upgradeAborted');
+      App.propertyDidChange('upgradeSuspended');
       self.setDBProperty('upgradeState', 'PENDING');
       App.clusterStatus.setClusterStatus({
         wizardControllerName: self.get('name'),

+ 8 - 4
ambari-web/app/models/upgrade_entity.js

@@ -80,12 +80,16 @@ App.upgradeEntity = Em.Object.extend({
 
   upgradeItemStatus: Em.computed.firstNotBlank('display_status', 'status'),
 
+  /**
+   * @type {string}
+   */
   upgradeGroupStatus: function () {
-    if (this.get('status') === 'ABORTED') {
+    if (App.get('upgradeSuspended') && this.get('status') === 'ABORTED') {
       return 'SUSPENDED';
     }
-    if (this.get('type') === 'GROUP') {
-      return !this.get('isActive') && this.get('hasExpandableItems') ? 'SUBITEM_FAILED' : this.get('display_status') || this.get('status');
+    if (this.get('type') === 'GROUP' && !this.get('isActive') && this.get('hasExpandableItems')) {
+      return 'SUBITEM_FAILED';
     }
-  }.property('isExpandableGroup', 'display_status', 'status')
+    return this.get('display_status') || this.get('status');
+  }.property('isExpandableGroup', 'display_status', 'status', 'App.upgradeSuspended')
 });

+ 1 - 1
ambari-web/app/templates/application.hbs

@@ -133,7 +133,7 @@
                           <i class="icon-pause"></i>&nbsp;{{t admin.stackVersions.version.upgrade.pause}}</span>
                     {{/if}}
                   {{/if}}
-                  {{#if App.upgradeAborted}}
+                  {{#if App.upgradeSuspended}}
                     {{#if App.router.mainAdminStackAndUpgradeController.isDowngrade}}
                       <span class="label upgrade-holding" {{action "openUpgradeDialog" target="App.router.mainAdminStackAndUpgradeController"}}>
                         <i class="icon-pause"></i>&nbsp;{{t admin.stackVersions.version.downgrade.suspended}}

+ 1 - 1
ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_wizard.hbs

@@ -270,7 +270,7 @@
             </div>
           </div>
         {{/if}}
-        {{#if App.upgradeAborted}}
+        {{#if App.upgradeSuspended}}
           <div class="box details-box">
             <label class="message">
             {{#if isDowngrade}}

+ 2 - 1
ambari-web/app/utils/ajax/ajax.js

@@ -1628,6 +1628,7 @@ var urls = {
     'real': '/clusters/{clusterName}/upgrades/{id}?upgrade_groups/UpgradeGroup/status!=PENDING&fields=' +
     'Upgrade/progress_percent,Upgrade/request_context,Upgrade/request_status,Upgrade/direction,Upgrade/downgrade_allowed,' +
     'upgrade_groups/UpgradeGroup,' +
+    'Upgrade/*,' +
     'upgrade_groups/upgrade_items/UpgradeItem/status,' +
     'upgrade_groups/upgrade_items/UpgradeItem/display_status,' +
     'upgrade_groups/upgrade_items/UpgradeItem/context,' +
@@ -1641,7 +1642,7 @@ var urls = {
     'mock': '/data/stack_versions/upgrade.json'
   },
   'admin.upgrade.state': {
-    'real': '/clusters/{clusterName}/upgrades/{id}?fields=Upgrade',
+    'real': '/clusters/{clusterName}/upgrades/{id}?fields=Upgrade/*',
     'mock': '/data/stack_versions/upgrade.json'
   },
   'admin.upgrade.finalizeContext': {

+ 2 - 0
ambari-web/app/views/common/progress_bar_view.js

@@ -57,6 +57,8 @@ App.ProgressBarView = Em.View.extend({
         return 'progress-warning';
       case 'COMPLETED':
         return 'progress-success';
+      case 'SUSPENDED':
+        return 'progress-info';
       case 'QUEUED':
       case 'PENDING':
       case 'IN_PROGRESS':

+ 4 - 4
ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js

@@ -160,7 +160,7 @@ App.UpgradeVersionBoxView = Em.View.extend({
       isDisabled: false
     });
     var isInstalling = this.get('parentView.repoVersions').someProperty('status', 'INSTALLING');
-    var isAborted = App.get('upgradeState') === 'ABORTED';
+    var isSuspended = App.get('upgradeSuspended');
 
     if (['INSTALLING', 'CURRENT'].contains(status)) {
       element.setProperties(statePropertiesMap[status]);
@@ -197,10 +197,10 @@ App.UpgradeVersionBoxView = Em.View.extend({
         element.setProperties(statePropertiesMap['INSTALLED']);
       }
     }
-    else if ((['UPGRADING', 'UPGRADE_FAILED', 'UPGRADED'].contains(status) || this.get('isUpgrading')) && !isAborted) {
+    else if ((['UPGRADING', 'UPGRADE_FAILED', 'UPGRADED'].contains(status) || this.get('isUpgrading')) && !isSuspended) {
       element.set('isLink', true);
       element.set('action', 'openUpgradeDialog');
-      if (['HOLDING', 'HOLDING_FAILED', 'HOLDING_TIMEDOUT'].contains(App.get('upgradeState'))) {
+      if (['HOLDING', 'HOLDING_FAILED', 'HOLDING_TIMEDOUT', 'ABORTED'].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'));
@@ -219,7 +219,7 @@ App.UpgradeVersionBoxView = Em.View.extend({
         }
       }
     }
-    else if (isAborted) {
+    else if (isSuspended) {
       element.setProperties(statePropertiesMap['SUSPENDED']);
       var text = this.get('controller.isDowngrade') ? Em.I18n.t('admin.stackUpgrade.dialog.resume.downgrade') : Em.I18n.t('admin.stackUpgrade.dialog.resume');
       element.set('text', this.get('isVersionColumnView') ? Em.I18n.t('common.resume'): text);

+ 5 - 3
ambari-web/app/views/main/admin/stack_upgrade/upgrade_wizard_view.js

@@ -27,12 +27,12 @@ App.upgradeWizardView = Em.View.extend({
   /**
    * @type {Array}
    */
-  failedStatuses: ['HOLDING_FAILED', 'HOLDING_TIMEDOUT', 'FAILED', 'TIMED_OUT'],
+  failedStatuses: ['HOLDING_FAILED', 'HOLDING_TIMEDOUT', 'FAILED', 'TIMED_OUT', 'ABORTED'],
 
   /**
    * @type {Array}
    */
-  activeStatuses: ['HOLDING_FAILED', 'HOLDING_TIMEDOUT', 'FAILED', 'TIMED_OUT', 'HOLDING', 'IN_PROGRESS'],
+  activeStatuses: ['HOLDING_FAILED', 'HOLDING_TIMEDOUT', 'FAILED', 'TIMED_OUT', 'HOLDING', 'IN_PROGRESS', 'ABORTED'],
 
   /**
    * update timer
@@ -91,6 +91,7 @@ App.upgradeWizardView = Em.View.extend({
    * @type {object|undefined}
    */
   activeGroup: function () {
+    if (App.get('upgradeSuspended')) return;
     return this.get('upgradeGroups').find(function (item) {
       return this.get('activeStatuses').contains(item.get('status'));
     }, this);
@@ -142,7 +143,8 @@ App.upgradeWizardView = Em.View.extend({
    * @type {boolean}
    */
   isHoldingState: function () {
-    return Boolean(this.get('failedItem.status') && this.get('failedItem.status').contains('HOLDING'));
+    return Boolean(this.get('failedItem.status') &&
+                  this.get('failedItem.status').contains('HOLDING') || this.get('failedItem.status') === 'ABORTED');
   }.property('failedItem.status'),
 
   /**

+ 95 - 5
ambari-web/test/app_test.js

@@ -490,28 +490,75 @@ describe('App', function () {
 
   });
 
+  describe('#upgradeSuspended', function () {
+    var cases = [
+      {
+        upgradeState: 'INIT',
+        isSuspended: false,
+        upgradeSuspended: false
+      },
+      {
+        upgradeState: 'ABORTED',
+        isSuspended: false,
+        upgradeSuspended: false
+      },
+      {
+        upgradeState: 'ABORTED',
+        isSuspended: true,
+        upgradeSuspended: true
+      }
+    ];
+
+    beforeEach(function() {
+      this.mock = sinon.stub(App.router, 'get');
+    });
+    afterEach(function() {
+      this.mock.restore();
+    });
+
+    cases.forEach(function (test) {
+      it(test.upgradeState + ", isSuspended=" + test.isSuspended, function () {
+        App.set('upgradeState', test.upgradeState);
+        this.mock.returns(test.isSuspended);
+        App.propertyDidChange('upgradeSuspended');
+        expect(App.get('upgradeSuspended')).to.equal(test.upgradeSuspended);
+      });
+    });
+  });
+
   describe('#upgradeAborted', function () {
 
     var cases = [
       {
         upgradeState: 'INIT',
+        isSuspended: false,
         upgradeAborted: false
       },
       {
-        upgradeState: 'INIT',
+        upgradeState: 'ABORTED',
+        isSuspended: true,
         upgradeAborted: false
       },
       {
         upgradeState: 'ABORTED',
+        isSuspended: false,
         upgradeAborted: true
       }
     ];
 
-    cases.forEach(function (item) {
-      it(item.upgradeState + ", ", function () {
-        App.set('upgradeState', item.upgradeState);
+    beforeEach(function() {
+      this.mock = sinon.stub(App.router, 'get');
+    });
+    afterEach(function() {
+      this.mock.restore();
+    });
+
+    cases.forEach(function (test) {
+      it(test.upgradeState + ", isSuspended=" + test.isSuspended, function () {
+        App.set('upgradeState', test.upgradeState);
+        this.mock.returns(test.isSuspended);
         App.propertyDidChange('upgradeAborted');
-        expect(App.get('upgradeAborted')).to.equal(item.upgradeAborted);
+        expect(App.get('upgradeAborted')).to.equal(test.upgradeAborted);
       });
     });
   });
@@ -548,4 +595,47 @@ describe('App', function () {
       });
     });
   });
+
+  describe("#upgradeHolding", function () {
+    var cases = [
+      {
+        upgradeState: 'INIT',
+        upgradeAborted: false,
+        upgradeHolding: false
+      },
+      {
+        upgradeState: 'HOLDING',
+        upgradeAborted: false,
+        upgradeHolding: true
+      },
+      {
+        upgradeState: 'HOLDING_FAILED',
+        upgradeAborted: false,
+        upgradeHolding: true
+      },
+      {
+        upgradeState: 'INIT',
+        upgradeAborted: true,
+        upgradeHolding: true
+      }
+    ];
+
+    beforeEach(function() {
+      this.mock = sinon.stub(App.router, 'get');
+    });
+    afterEach(function() {
+      this.mock.restore();
+    });
+
+    cases.forEach(function (test) {
+      it(test.upgradeState + ", upgradeAborted=" + test.upgradeAborted, function () {
+        App.reopen({
+          upgradeAborted: test.upgradeAborted,
+          upgradeState: test.upgradeState
+        });
+        App.propertyDidChange('upgradeHolding');
+        expect(App.get('upgradeHolding')).to.equal(test.upgradeHolding);
+      });
+    });
+  });
 });

+ 19 - 1
ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js

@@ -84,16 +84,34 @@ describe('App.MainAdminStackAndUpgradeController', function() {
   });
 
   describe("#requestStatus", function() {
-    it("state ABORTED", function() {
+
+    beforeEach(function() {
+      this.mock = sinon.stub(App, 'get');
+    });
+    afterEach(function() {
+      this.mock.restore();
+    });
+
+    it("App.upgradeSuspended is true", function() {
+      this.mock.returns(true);
       controller.set('upgradeData', { Upgrade: {request_status: 'ABORTED'}});
       controller.propertyDidChange('requestStatus');
       expect(controller.get('requestStatus')).to.equal('SUSPENDED');
     });
+
     it("state not ABORTED", function() {
+      this.mock.returns(false);
       controller.set('upgradeData', { Upgrade: {request_status: 'INIT'}});
       controller.propertyDidChange('requestStatus');
       expect(controller.get('requestStatus')).to.equal('INIT');
     });
+
+    it("upgradeData is null", function() {
+      this.mock.returns(false);
+      controller.set('upgradeData', null);
+      controller.propertyDidChange('requestStatus');
+      expect(controller.get('requestStatus')).to.be.empty;
+    });
   });
 
   describe("#load()", function() {

+ 29 - 6
ambari-web/test/models/upgrade_entity_test.js

@@ -133,7 +133,8 @@ describe('App.upgradeEntity', function () {
     var cases = [
       {
         input: {
-          type: 'ITEM'
+          type: 'ITEM',
+          upgradeSuspended: false
         },
         upgradeGroupStatus: undefined,
         title: 'not upgrade group'
@@ -142,7 +143,8 @@ describe('App.upgradeEntity', function () {
         input: {
           type: 'GROUP',
           status: 'PENDING',
-          hasExpandableItems: false
+          hasExpandableItems: false,
+          upgradeSuspended: false
         },
         upgradeGroupStatus: 'PENDING',
         title: 'pending upgrade group'
@@ -151,7 +153,8 @@ describe('App.upgradeEntity', function () {
         input: {
           type: 'GROUP',
           status: 'PENDING',
-          hasExpandableItems: true
+          hasExpandableItems: true,
+          upgradeSuspended: false
         },
         upgradeGroupStatus: 'SUBITEM_FAILED',
         title: 'pending upgrade group with expandable items'
@@ -160,24 +163,44 @@ describe('App.upgradeEntity', function () {
         input: {
           type: 'GROUP',
           status: 'ABORTED',
-          hasExpandableItems: true
+          hasExpandableItems: false,
+          upgradeSuspended: false
         },
-        upgradeGroupStatus: 'SUSPENDED',
+        upgradeGroupStatus: 'ABORTED',
         title: 'aborted upgrade group with expandable items'
       },
+      {
+        input: {
+          type: 'GROUP',
+          status: 'ABORTED',
+          hasExpandableItems: true,
+          upgradeSuspended: true
+        },
+        upgradeGroupStatus: 'SUSPENDED',
+        title: 'suspended upgrade group with expandable items'
+      },
       {
         input: {
           type: 'GROUP',
           status: 'IN_PROGRESS',
-          hasExpandableItems: false
+          hasExpandableItems: false,
+          upgradeSuspended: false
         },
         upgradeGroupStatus: 'IN_PROGRESS',
         title: 'active upgrade'
       }
     ];
 
+    beforeEach(function() {
+      this.mock = sinon.stub(App, 'get');
+    });
+    afterEach(function() {
+      this.mock.restore();
+    });
+
     cases.forEach(function (item) {
       it(item.title, function () {
+        this.mock.returns(item.input.upgradeSuspended);
         model.setProperties(item.input);
         expect(model.get('upgradeGroupStatus')).to.equal(item.upgradeGroupStatus);
       });

+ 44 - 4
ambari-web/test/views/main/admin/stack_upgrade/upgrade_version_box_view_test.js

@@ -713,6 +713,26 @@ describe('App.UpgradeVersionBoxView', function () {
         },
         title: 'upgrading, holding failed'
       },
+      {
+        inputData: {
+          'content.status': 'UPGRADING',
+          'isUpgrading': true,
+          'controller.isDowngrade': false,
+          'controller.upgradeVersion': 'HDP-2.2.1',
+          'content.displayName': 'HDP-2.2.1'
+        },
+        setup: function () {
+          this.getMock.withArgs('upgradeState').returns('ABORTED');
+        },
+        expected: {
+          status: 'UPGRADING',
+          isLink: true,
+          action: 'openUpgradeDialog',
+          iconClass: 'icon-pause',
+          text: Em.I18n.t('admin.stackVersions.version.upgrade.pause')
+        },
+        title: 'upgrading, upgrade aborted'
+      },
       {
         inputData: {
           'content.status': 'UPGRADE_FAILED',
@@ -773,6 +793,26 @@ describe('App.UpgradeVersionBoxView', function () {
         },
         title: 'downgrading, holding failed'
       },
+      {
+        inputData: {
+          'content.status': 'UPGRADED',
+          'isUpgrading': true,
+          'controller.isDowngrade': true,
+          'controller.upgradeVersion': 'HDP-2.2.1',
+          'content.displayName': 'HDP-2.2.1'
+        },
+        setup: function () {
+          this.getMock.withArgs('upgradeState').returns('ABORTED');
+        },
+        expected: {
+          status: 'UPGRADED',
+          isLink: true,
+          action: 'openUpgradeDialog',
+          iconClass: 'icon-pause',
+          text: Em.I18n.t('admin.stackVersions.version.downgrade.pause')
+        },
+        title: 'downgrading, upgrade aborted'
+      },
       {
         inputData: {
           'content.status': 'UPGRADED',
@@ -802,7 +842,7 @@ describe('App.UpgradeVersionBoxView', function () {
           'parentView.repoVersions': []
         },
         setup: function () {
-          this.getMock.withArgs('upgradeState').returns('ABORTED');
+          this.getMock.withArgs('upgradeSuspended').returns('true');
         },
         expected: {
           status: 'UPGRADING',
@@ -811,7 +851,7 @@ describe('App.UpgradeVersionBoxView', function () {
           text: Em.I18n.t('admin.stackUpgrade.dialog.resume'),
           isDisabled: false
         },
-        title: 'upgrade aborted'
+        title: 'upgrade suspended'
       },
       {
         inputData: {
@@ -822,7 +862,7 @@ describe('App.UpgradeVersionBoxView', function () {
           'parentView.repoVersions': []
         },
         setup: function () {
-          this.getMock.withArgs('upgradeState').returns('ABORTED');
+          this.getMock.withArgs('upgradeSuspended').returns('true');
         },
         expected: {
           status: 'UPGRADE_FAILED',
@@ -831,7 +871,7 @@ describe('App.UpgradeVersionBoxView', function () {
           text: Em.I18n.t('admin.stackUpgrade.dialog.resume.downgrade'),
           isDisabled: true
         },
-        title: 'downgrade aborted, request in progress'
+        title: 'downgrade suspended, request in progress'
       }
     ];