AMBARI-21847 Refactor stack version column view. (atkach)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/42387818 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/42387818 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/42387818 Branch: refs/heads/feature-branch-AMBARI-21307 Commit: 4238781810d8c8236626b204a39353f1f33e8e49 Parents: 418be51 Author: Andrii Tkach <atk...@apache.org> Authored: Tue Aug 29 22:04:57 2017 +0300 Committer: Andrii Tkach <atk...@apache.org> Committed: Wed Aug 30 12:46:50 2017 +0300 ---------------------------------------------------------------------- .../stack_upgrade/upgrade_version_box_view.js | 187 ++++++++------ .../upgrade_version_box_view_test.js | 241 +++++++++++++++++++ 2 files changed, 354 insertions(+), 74 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/42387818/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 ec3b4c9..84612ab 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 @@ -161,15 +161,11 @@ App.UpgradeVersionBoxView = Em.View.extend({ * TODO remove <code>isUpgrading</code> condition when transition of version states in API fixed */ stateElement: function () { - var currentVersion = this.get('controller.currentVersion'); var statePropertiesMap = this.get('statePropertiesMap'); - var requestInProgressRepoId = this.get('controller.requestInProgressRepoId'); var status = this.get('content.status'); var element = Em.Object.create({ status: status, - isInstalling: function () { - return this.get('status') === 'INSTALLING'; - }.property('status'), + isInstalling: Em.computed.equal('status', 'INSTALLING'), buttons: [], isDisabled: false }); @@ -182,79 +178,16 @@ App.UpgradeVersionBoxView = Em.View.extend({ element.setProperties(statePropertiesMap[status]); } else if (status === 'NOT_REQUIRED') { - var isDisabledOnInit = this.isDisabledOnInit(); - requestInProgressRepoId && requestInProgressRepoId == this.get('content.id') ? element.setProperties(statePropertiesMap['LOADING']) : element.setProperties(statePropertiesMap[status]); - element.set('isDisabled', isDisabledOnInit); - element.set('isButtonGroup', true); - element.set('isButton', false); - element.get('buttons').pushObject({ - text: Em.I18n.t('common.discard'), - action: 'confirmDiscardRepoVersion', - isDisabled: isDisabledOnInit - }); + this.processNotRequiredState(element); } - else if ((status === 'INSTALLED' && !this.get('isUpgrading')) || - (['INSTALL_FAILED', 'OUT_OF_SYNC'].contains(status))) { - if (stringUtils.compareVersions(this.get('content.repositoryVersion'), Em.get(currentVersion, 'repository_version')) === 1) { - var isDisabled = this.isDisabledOnInstalled(); - element.set('isButtonGroup', true); - if (status === 'OUT_OF_SYNC') { - element.set('text', this.get('isVersionColumnView') ? Em.I18n.t('common.reinstall') : Em.I18n.t('admin.stackVersions.version.reinstall')); - element.set('action', 'installRepoVersionConfirmation'); - element.get('buttons').pushObject({ - text: this.get('isVersionColumnView') ? Em.I18n.t('common.upgrade') : Em.I18n.t('admin.stackVersions.version.performUpgrade'), - action: 'confirmUpgrade', - isDisabled: isDisabled - }); - } else { - element.set('text', this.get('isVersionColumnView') ? Em.I18n.t('common.upgrade') : Em.I18n.t('admin.stackVersions.version.performUpgrade')); - element.set('action', 'confirmUpgrade'); - element.get('buttons').pushObject({ - text: this.get('isVersionColumnView') ? Em.I18n.t('common.reinstall') : Em.I18n.t('admin.stackVersions.version.reinstall'), - action: 'installRepoVersionConfirmation', - isDisabled: isDisabled - }); - if (this.get('content.isPatch')) { - element.get('buttons').pushObject({ - text: Em.I18n.t('common.discard'), - action: 'confirmDiscardRepoVersion', - isDisabled: isDisabled - }); - } - } - element.set('isDisabled', isDisabled); - } - else { - element.setProperties(statePropertiesMap['INSTALLED']); - } + else if ((status === 'INSTALLED' && !this.get('isUpgrading')) || (['INSTALL_FAILED', 'OUT_OF_SYNC'].contains(status))) { + this.processPreUpgradeState(element); } - else if ((this.get('isUpgrading')) && !isSuspended) { - element.set('isLink', true); - element.set('action', 'openUpgradeDialog'); - if (['HOLDING', 'HOLDING_FAILED', 'HOLDING_TIMEDOUT', 'ABORTED'].contains(App.get('upgradeState'))) { - element.set('iconClass', 'glyphicon glyphicon-pause'); - if (this.get('controller.isDowngrade')) { - element.set('text', Em.I18n.t('admin.stackVersions.version.downgrade.pause')); - } - else { - element.set('text', Em.I18n.t('admin.stackVersions.version.upgrade.pause')); - } - } - else { - element.set('iconClass', 'glyphicon glyphicon-cog'); - if (this.get('controller.isDowngrade')) { - element.set('text', Em.I18n.t('admin.stackVersions.version.downgrade.running')); - } - else { - element.set('text', Em.I18n.t('admin.stackVersions.version.upgrade.running')); - } - } + else if (this.get('isUpgrading') && !isSuspended) { + this.processUpgradingState(element); } 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); - element.set('isDisabled', this.get('controller.requestInProgress')); + this.processSuspendedState(element); } //For restricted upgrade wizard should be disabled in any state if (this.get('controller.isWizardRestricted') || (!App.isAuthorized('CLUSTER.UPGRADE_DOWNGRADE_STACK'))) { @@ -282,6 +215,112 @@ App.UpgradeVersionBoxView = Em.View.extend({ }, /** + * @param {Em.Object} element + */ + processSuspendedState: function(element) { + element.setProperties(this.get('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); + element.set('isDisabled', this.get('controller.requestInProgress')); + }, + + /** + * @param {Em.Object} element + */ + processUpgradingState: function(element) { + element.set('isLink', true); + element.set('action', 'openUpgradeDialog'); + if (['HOLDING', 'HOLDING_FAILED', 'HOLDING_TIMEDOUT', 'ABORTED'].contains(App.get('upgradeState'))) { + element.set('iconClass', 'glyphicon glyphicon-pause'); + if (this.get('controller.isDowngrade')) { + element.set('text', Em.I18n.t('admin.stackVersions.version.downgrade.pause')); + } + else { + element.set('text', Em.I18n.t('admin.stackVersions.version.upgrade.pause')); + } + } + else { + element.set('iconClass', 'glyphicon glyphicon-cog'); + if (this.get('controller.isDowngrade')) { + element.set('text', Em.I18n.t('admin.stackVersions.version.downgrade.running')); + } + else { + element.set('text', Em.I18n.t('admin.stackVersions.version.upgrade.running')); + } + } + }, + + /** + * @param {Em.Object} element + */ + processPreUpgradeState: function(element) { + var currentVersion = this.get('controller.currentVersion'); + var status = this.get('content.status'); + var isVersionHigherThanCurrent = stringUtils.compareVersions( + this.get('content.repositoryVersion'), + Em.get(currentVersion, 'repository_version') + ) === 1; + + if (Em.get(currentVersion, 'stack_name') !== this.get('content.stackVersionType') || isVersionHigherThanCurrent) { + var isDisabled = this.isDisabledOnInstalled(); + element.set('isButtonGroup', true); + if (status === 'OUT_OF_SYNC') { + element.set('text', this.get('isVersionColumnView') ? Em.I18n.t('common.reinstall') : Em.I18n.t('admin.stackVersions.version.reinstall')); + element.set('action', 'installRepoVersionConfirmation'); + element.get('buttons').pushObject({ + text: this.get('isVersionColumnView') ? Em.I18n.t('common.upgrade') : Em.I18n.t('admin.stackVersions.version.performUpgrade'), + action: 'confirmUpgrade', + isDisabled: isDisabled + }); + } else { + element.set('text', this.get('isVersionColumnView') ? Em.I18n.t('common.upgrade') : Em.I18n.t('admin.stackVersions.version.performUpgrade')); + element.set('action', 'confirmUpgrade'); + element.get('buttons').pushObject({ + text: this.get('isVersionColumnView') ? Em.I18n.t('common.reinstall') : Em.I18n.t('admin.stackVersions.version.reinstall'), + action: 'installRepoVersionConfirmation', + isDisabled: isDisabled + }); + if (this.get('content.isPatch')) { + element.get('buttons').pushObject({ + text: Em.I18n.t('common.discard'), + action: 'confirmDiscardRepoVersion', + isDisabled: isDisabled + }); + } + } + element.set('isDisabled', isDisabled); + } + else { + element.setProperties(this.get('statePropertiesMap')['INSTALLED']); + } + }, + + /** + * @param {Em.Object} element + */ + processNotRequiredState: function(element) { + var isDisabledOnInit = this.isDisabledOnInit(); + var requestInProgressRepoId = this.get('controller.requestInProgressRepoId'); + var status = this.get('content.status'); + + if (requestInProgressRepoId && requestInProgressRepoId === this.get('content.id')) { + element.setProperties(this.get('statePropertiesMap')['LOADING']); + } else { + element.setProperties(this.get('statePropertiesMap')[status]); + } + element.set('isDisabled', isDisabledOnInit); + element.set('isButtonGroup', true); + element.set('isButton', false); + element.get('buttons').pushObject({ + text: Em.I18n.t('common.discard'), + action: 'confirmDiscardRepoVersion', + isDisabled: isDisabledOnInit + }); + }, + + /** * check if actions of INSTALLED stack version disabled * @returns {boolean} */ http://git-wip-us.apache.org/repos/asf/ambari/blob/42387818/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 d1c338f..af3e990 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 @@ -1257,4 +1257,245 @@ describe('App.UpgradeVersionBoxView', function () { }); }); }); + + describe('#processSuspendedState', function() { + + it('should process suspended state', function() { + view.set('controller.requestInProgress', false); + var element = Em.Object.create(); + view.processSuspendedState(element); + expect(element).to.be.eql(Em.Object.create({ + "action": "resumeUpgrade", + "isButton": true, + "isDisabled": false, + "text": Em.I18n.t('admin.stackUpgrade.dialog.resume') + })); + }); + }); + + describe('#processUpgradingState', function() { + + beforeEach(function() { + this.mock = sinon.stub(App, 'get'); + }); + afterEach(function() { + this.mock.restore(); + }); + + it('downgrade in HOLDING state', function() { + this.mock.returns('HOLDING'); + view.set('controller.isDowngrade', true); + var element = Em.Object.create(); + view.processUpgradingState(element); + expect(element).to.be.eql(Em.Object.create({ + "action": "openUpgradeDialog", + "iconClass": "glyphicon glyphicon-pause", + "isLink": true, + "text": Em.I18n.t('admin.stackVersions.version.downgrade.pause') + })); + }); + + it('upgrade in HOLDING state', function() { + this.mock.returns('HOLDING'); + view.set('controller.isDowngrade', false); + var element = Em.Object.create(); + view.processUpgradingState(element); + expect(element).to.be.eql(Em.Object.create({ + "action": "openUpgradeDialog", + "iconClass": "glyphicon glyphicon-pause", + "isLink": true, + "text": Em.I18n.t('admin.stackVersions.version.upgrade.pause') + })); + }); + + it('upgrade in running state', function() { + this.mock.returns('UPGRADING'); + view.set('controller.isDowngrade', false); + var element = Em.Object.create(); + view.processUpgradingState(element); + expect(element).to.be.eql(Em.Object.create({ + "action": "openUpgradeDialog", + "iconClass": "glyphicon glyphicon-cog", + "isLink": true, + "text": Em.I18n.t('admin.stackVersions.version.upgrade.running') + })); + }); + + it('downgrade in running state', function() { + this.mock.returns('UPGRADING'); + view.set('controller.isDowngrade', true); + var element = Em.Object.create(); + view.processUpgradingState(element); + expect(element).to.be.eql(Em.Object.create({ + "action": "openUpgradeDialog", + "iconClass": "glyphicon glyphicon-cog", + "isLink": true, + "text": Em.I18n.t('admin.stackVersions.version.downgrade.running') + })); + }); + }); + + describe('#processPreUpgradeState', function() { + beforeEach(function() { + sinon.stub(view, 'isDisabledOnInstalled').returns(false); + }); + afterEach(function() { + view.isDisabledOnInstalled.restore(); + }); + + it('version lower than current and in INSTALLED state', function() { + view.set('controller', Em.Object.create({ + currentVersion: Em.Object.create({ + repository_version: '2.0', + stack_name: 'HDP' + }) + })); + view.set('content', Em.Object.create({ + status: 'INSTALLED', + repositoryVersion: '2.0', + stackVersionType: 'HDP' + })); + var element = Em.Object.create(); + view.processPreUpgradeState(element); + expect(element).to.be.eql(Em.Object.create({ + "action": null, + "iconClass": "glyphicon glyphicon-ok", + "isLink": true, + "text": "Installed" + })); + }); + + it('version higher than current and in OUT_OF_SYNC state', function() { + view.set('controller', Em.Object.create({ + currentVersion: Em.Object.create({ + repository_version: '2.0', + stack_name: 'HDP' + }) + })); + view.set('content', Em.Object.create({ + status: 'OUT_OF_SYNC', + repositoryVersion: '2.1', + stackVersionType: 'HDP' + })); + var element = Em.Object.create({ + buttons: [] + }); + view.processPreUpgradeState(element); + expect(JSON.stringify(element)).to.be.equal(JSON.stringify(Em.Object.create({ + "buttons": [ + { + "text": Em.I18n.t('admin.stackVersions.version.performUpgrade'), + "action": "confirmUpgrade", + "isDisabled": false + } + ], + "isButtonGroup": true, + "text": Em.I18n.t('admin.stackVersions.version.reinstall'), + "action": 'installRepoVersionConfirmation', + "isDisabled": false + }))); + }); + + it('version higher than current and in INSTALLED state', function() { + view.set('controller', Em.Object.create({ + currentVersion: Em.Object.create({ + repository_version: '2.0', + stack_name: 'HDP' + }) + })); + view.set('content', Em.Object.create({ + status: 'INSTALLED', + repositoryVersion: '2.1', + stackVersionType: 'HDP', + isPatch: true + })); + var element = Em.Object.create({ + buttons: [] + }); + view.processPreUpgradeState(element); + expect(JSON.stringify(element)).to.be.equal(JSON.stringify(Em.Object.create({ + "buttons": [ + { + "text": Em.I18n.t('admin.stackVersions.version.reinstall'), + "action": "installRepoVersionConfirmation", + "isDisabled": false + }, + { + "text": Em.I18n.t('common.discard'), + "action": "confirmDiscardRepoVersion", + "isDisabled": false + } + ], + "isButtonGroup": true, + "text": Em.I18n.t('admin.stackVersions.version.performUpgrade'), + "action": 'confirmUpgrade', + "isDisabled": false + }))); + }); + }); + + describe('#processNotRequiredState', function() { + beforeEach(function() { + sinon.stub(view, 'isDisabledOnInit').returns(false); + }); + afterEach(function() { + view.isDisabledOnInit.restore(); + }); + + it('version in LOADING state', function() { + view.set('controller', Em.Object.create({ + requestInProgressRepoId: 1 + })); + view.set('content', Em.Object.create({ + status: 'NOT_REQUIRED', + id: 1 + })); + var element = Em.Object.create({ + buttons: [] + }); + view.processNotRequiredState(element); + expect(JSON.stringify(element)).to.be.equal(JSON.stringify(Em.Object.create({ + "buttons": [ + { + "text": Em.I18n.t('common.discard'), + "action": "confirmDiscardRepoVersion", + "isDisabled": false + } + ], + "isSpinner": true, + "class": "spinner", + "isDisabled": false, + "isButtonGroup": true, + "isButton": false + }))); + }); + + it('version in NOT_REQUIRED state', function() { + view.set('controller', Em.Object.create({ + requestInProgressRepoId: 1 + })); + view.set('content', Em.Object.create({ + status: 'NOT_REQUIRED', + id: 2 + })); + var element = Em.Object.create({ + buttons: [] + }); + view.processNotRequiredState(element); + expect(JSON.stringify(element)).to.be.equal(JSON.stringify(Em.Object.create({ + "buttons": [ + { + "text": Em.I18n.t('common.discard'), + "action": "confirmDiscardRepoVersion", + "isDisabled": false + } + ], + "isButton": false, + "text": Em.I18n.t('admin.stackVersions.version.installNow'), + "action": 'installRepoVersionConfirmation', + "isDisabled": false, + "isButtonGroup": true + }))); + }); + }); });