Repository: ambari Updated Branches: refs/heads/trunk 0e8b717b2 -> edb27ea87
http://git-wip-us.apache.org/repos/asf/ambari/blob/edb27ea8/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 3fec992..d90eeb9 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 @@ -33,8 +33,64 @@ <div class="task-list scrollable-block task-list-main-warp"> {{#if view.isLoaded}} - {{#each group in controller.upgradeData.upgradeGroups}} - {{view App.upgradeGroupView contentBinding="group"}} + <div> + {{#if view.runningItem}} + <div class="box details-box"> + <div class="row-fluid"> + <div class="pull-left">{{t admin.stackUpgrade.dialog.inProgress}} {{view.runningItem.context}}</div> + {{#if view.isDetailsOpened}} + <a href="#" class="pull-right" {{action toggleDetails target="view"}}>{{t admin.stackUpgrade.dialog.details.hide}}</a> + <div class="clear"> + {{view App.upgradeTaskView contentBinding="view.taskDetails" outsideViewBinding="view.outsideView"}} + </div> + {{else}} + <a href="#" class="pull-right" {{action toggleDetails target="view"}}>{{t admin.stackUpgrade.dialog.details.open}}</a> + {{/if}} + </div> + </div> + {{/if}} + {{#if view.failedItem}} + <div class="box details-box"> + <div class="row-fluid"> + <div class="pull-left">{{t admin.stackUpgrade.dialog.failed}} {{view.failedItem.context}}</div> + {{#if view.isDetailsOpened}} + <a href="#" class="pull-right" {{action toggleDetails target="view"}}>{{t admin.stackUpgrade.dialog.details.hide}}</a> + <div class="clear"> + {{view App.upgradeTaskView contentBinding="view.taskDetails" outsideViewBinding="view.outsideView"}} + </div> + {{else}} + <a href="#" class="pull-right" {{action toggleDetails target="view"}}>{{t admin.stackUpgrade.dialog.details.open}}</a> + {{/if}} + </div> + {{#if view.isHoldingState}} + <div class="button-row"> + <button class="btn btn-warning" {{action continue view.failedItem target="view"}}>{{t admin.stackUpgrade.dialog.continue}}</button> + <button class="btn" {{action retry view.failedItem target="view"}}>{{t common.retry}}</button> + </div> + {{/if}} + </div> + {{/if}} + {{#if view.manualItem}} + <div class="box details-box"> + <p><strong>{{t admin.stackUpgrade.dialog.manual}}</strong></p> + <p>{{view.manualItem.context}}</p> + + <div class="message"> + {{view Em.Checkbox checkedBinding="view.isManualDone"}} + {{t admin.stackUpgrade.dialog.manualDone}} + </div> + <div class="button-row"> + <button class="btn btn-success" {{bindAttr disabled="view.isManualProceedDisabled"}} {{action complete view.manualItem target="view"}}> + {{t common.proceed}} + </button> + </div> + </div> + {{/if}} + </div> + {{#each group in view.upgradeGroups}} + {{#if group.isVisible}} + {{view App.upgradeGroupView contentBinding="group"}} + {{/if}} {{/each}} {{/if}} </div> http://git-wip-us.apache.org/repos/asf/ambari/blob/edb27ea8/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_group.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_group.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_group.hbs index 31be899..016251c 100644 --- a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_group.hbs +++ b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_group.hbs @@ -39,23 +39,25 @@ {{! List of UpgradeItem}} {{#each item in view.content.upgradeItems}} - <div class="row-fluid"> - <div {{bindAttr class="item.isActive::not-active-link :span8"}}> - {{statusIcon item.status}} - <a href="#" {{action toggleExpanded item view.content.upgradeItems target="view"}}>{{item.context}}</a> - </div> - {{#if item.isRunning}} - <div class="span3"> - {{view App.ProgressBarView - progressBinding="item.progress" - statusBinding="item.status" - }} - </div> - <div class="span1"> - <div>{{item.progress}}%</div> + {{#if item.isVisible}} + <div class="row-fluid"> + <div {{bindAttr class="item.isActive::not-active-link :span8"}}> + {{statusIcon item.status}} + <a href="#" {{action toggleExpanded item view.content.upgradeItems target="view"}}>{{item.context}}</a> </div> - {{/if}} - </div> + {{#if item.isRunning}} + <div class="span3"> + {{view App.ProgressBarView + progressBinding="item.progress" + statusBinding="item.status" + }} + </div> + <div class="span1"> + <div>{{item.progress}}%</div> + </div> + {{/if}} + </div> + {{/if}} {{#if item.isExpanded}} {{! List of Tasks}} @@ -66,45 +68,4 @@ </div> {{/if}} {{/each}} -</div> - -{{#unless view.content.isExpanded}} - {{#if view.showProgressInfo}} - <div class="box details-box"> - <div> - {{t admin.stackUpgrade.dialog.inProgress}} - <a href="#" {{action toggleExpanded view.content controller.upgradeData.upgradeGroups target="view"}}>{{view.runningItem.context}}</a> - </div> - </div> - {{/if}} - {{#if view.showFailedInfo}} - <div class="box details-box"> - <div> - {{t admin.stackUpgrade.dialog.failed}} - <a href="#" {{action toggleExpanded view.content controller.upgradeData.upgradeGroups target="view"}}>{{view.failedItem.context}}</a> - </div> - {{#if view.isHoldingState}} - <div class="button-row"> - <button class="btn btn-warning" {{action continue view.failedItem target="view"}}>{{t admin.stackUpgrade.dialog.continue}}</button> - <button class="btn" {{action retry view.failedItem target="view"}}>{{t common.retry}}</button> - </div> - {{/if}} - </div> - {{/if}} - {{#if view.isManualOpened}} - <div class="box details-box"> - <p><strong>{{t admin.stackUpgrade.dialog.manual}}</strong></p> - <p>{{view.manualItem.context}}</p> - - <div class="message"> - {{view Em.Checkbox checkedBinding="view.isManualDone"}} - {{t admin.stackUpgrade.dialog.manualDone}} - </div> - <div class="button-row"> - <button class="btn btn-success" {{bindAttr disabled="view.isManualProceedDisabled"}} {{action complete view.manualItem target="view"}}> - {{t common.proceed}} - </button> - </div> - </div> - {{/if}} -{{/unless}} +</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/edb27ea8/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_task.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_task.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_task.hbs index 4dff7ed..60225c3 100644 --- a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_task.hbs +++ b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_task.hbs @@ -16,9 +16,12 @@ * limitations under the License. }} - -<div {{bindAttr class="view.content.isActive::not-active-link"}}>{{statusIcon view.content.status}}<a href="#" {{action toggleExpanded view.content view.tasks target="view.parentView"}}>{{view.content.command_detail}}</a></div> -{{#if view.content.isExpanded}} +{{#unless view.outsideView}} + <div {{bindAttr class="view.content.isActive::not-active-link"}}>{{statusIcon view.content.status}}<a + href="#" {{action toggleExpanded view.content view.tasks target="view.parentView"}}>{{view.content.command_detail}}</a> + </div> +{{/unless}} +{{#if view.showContent}} <div class="task-details task-detail-info"> <ul class="nav nav-tabs"> <li class="active"><a href="#tab1" data-toggle="tab">{{t common.stdout}}</a></li> http://git-wip-us.apache.org/repos/asf/ambari/blob/edb27ea8/ambari-web/app/views/main/admin/stack_upgrade/upgrade_group_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_group_view.js b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_group_view.js index 92bc291..d745e39 100644 --- a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_group_view.js +++ b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_group_view.js @@ -23,124 +23,6 @@ App.upgradeGroupView = Em.View.extend({ templateName: require('templates/main/admin/stack_upgrade/upgrade_group'), /** - * @type {boolean} - */ - isManualDone: false, - - /** - * @type {Array} - */ - failedStatuses: ['HOLDING_FAILED', 'HOLDING_TIMED_OUT', 'FAILED', 'TIMED_OUT'], - - /** - * progress info is a box that show running UpgradeItem - * @type {boolean} - */ - showProgressInfo: function () { - return Boolean(this.get('content.isRunning') && this.get('runningItem')); - }.property('content.isRunning', 'runningItem'), - - /** - * @type {boolean} - */ - isManualProceedDisabled: function () { - return !this.get('isManualDone'); - }.property('isManualDone'), - - /** - * @type {boolean} - */ - showFailedInfo: function () { - return Boolean(this.get('failedStatuses').contains(this.get('content.status')) && this.get('failedItem')); - }.property('content.status', 'failedItem'), - - /** - * if upgrade group is in progress it should have currently running item - * @type {object|undefined} - */ - runningItem: function () { - return this.get('content.upgradeItems').findProperty('status', 'IN_PROGRESS'); - }.property('[email protected]'), - - /** - * if upgrade group is failed it should have failed item - * @type {object|undefined} - */ - failedItem: function () { - return this.get('content.upgradeItems').find(function (item) { - return this.get('failedStatuses').contains(item.get('status')); - }, this); - }.property('[email protected]'), - - /** - * if upgrade group is manual it should have manual item - * @type {object|undefined} - */ - manualItem: function () { - return this.get('content.upgradeItems').findProperty('status', 'HOLDING'); - }.property('[email protected]'), - - /** - * @type {boolean} - */ - isManualOpened: function () { - return Boolean(this.get('manualItem')); - }.property('manualItem'), - - /** - * indicate whether failed item can be skipped or retried in order to continue Upgrade - * @type {boolean} - */ - isHoldingState: function () { - return Boolean(this.get('failedItem.status') && this.get('failedItem.status').contains('HOLDING')); - }.property('failedItem.status'), - - /** - * set status to Upgrade item - * @param item - * @param status - */ - setUpgradeItemStatus: function(item, status) { - return App.ajax.send({ - name: 'admin.upgrade.upgradeItem.setState', - sender: this, - data: { - upgradeId: item.get('request_id'), - itemId: item.get('stage_id'), - groupId: item.get('group_id'), - status: status - } - }).done(function () { - item.set('status', status); - }); - }, - - /** - * set current upgrade item state to FAILED (for HOLDING_FAILED) or TIMED_OUT (for HOLDING_TIMED_OUT) - * in order to ignore fail and continue Upgrade - * @param {object} event - */ - continue: function (event) { - this.setUpgradeItemStatus(event.context, event.context.get('status').slice(8)); - }, - - /** - * set current upgrade item state to PENDING in order to retry Upgrade - * @param {object} event - */ - retry: function (event) { - this.setUpgradeItemStatus(event.context, 'PENDING'); - }, - - /** - * set current upgrade item state to COMPLETED in order to proceed - * @param {object} event - */ - complete: function (event) { - this.setUpgradeItemStatus(event.context, 'COMPLETED'); - }, - - /** * Only one UpgradeGroup or UpgradeItem could be expanded at a time * @param {object} event */ http://git-wip-us.apache.org/repos/asf/ambari/blob/edb27ea8/ambari-web/app/views/main/admin/stack_upgrade/upgrade_task_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_task_view.js b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_task_view.js index bc5b006..c4fc0ed 100644 --- a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_task_view.js +++ b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_task_view.js @@ -23,6 +23,19 @@ App.upgradeTaskView = Em.View.extend({ templateName: require('templates/main/admin/stack_upgrade/upgrade_task'), /** + * view observed directly + * @type {boolean} + */ + outsideView: false, + + /** + * @type {boolean} + */ + showContent: function () { + return this.get('outsideView') || this.get('content.isExpanded'); + }.property('content.isExpanded'), + + /** * @type {boolean} */ errorLogOpened: false, @@ -54,13 +67,17 @@ App.upgradeTaskView = Em.View.extend({ */ taskDetailsProperties: ['status', 'stdout', 'stderr', 'error_log', 'host_name', 'output_log'], + didInsertElement: function () { + if (this.get('outsideView')) this.doPolling(); + }, + /** * poll for task details when task is expanded */ doPolling: function () { var self = this; - if (this.get('content.isExpanded')) { + if (this.get('content.isExpanded') || this.get('outsideView')) { this.getTaskDetails(); this.set('timer', setTimeout(function () { self.doPolling(); @@ -68,7 +85,7 @@ App.upgradeTaskView = Em.View.extend({ } else { clearTimeout(this.get('timer')); } - }.observes('content.isExpanded'), + }.observes('content.isExpanded', 'outsideView'), /** * request task details from server http://git-wip-us.apache.org/repos/asf/ambari/blob/edb27ea8/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 bbfd067..e20c465 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 @@ -24,6 +24,16 @@ App.upgradeWizardView = Em.View.extend({ templateName: require('templates/main/admin/stack_upgrade/stack_upgrade_wizard'), /** + * @type {Array} + */ + failedStatuses: ['HOLDING_FAILED', 'HOLDING_TIMED_OUT', 'FAILED', 'TIMED_OUT'], + + /** + * @type {Array} + */ + activeStatuses: ['HOLDING_FAILED', 'HOLDING_TIMED_OUT', 'FAILED', 'TIMED_OUT', 'HOLDING', 'IN_PROGRESS'], + + /** * update timer * @type {number|null} * @default null @@ -36,6 +46,16 @@ App.upgradeWizardView = Em.View.extend({ isLoaded: false, /** + * @type {boolean} + */ + isDetailsOpened: false, + + /** + * @type {boolean} + */ + outsideView: true, + + /** * progress value is rounded to floor * @type {number} */ @@ -44,6 +64,87 @@ App.upgradeWizardView = Em.View.extend({ }.property('controller.upgradeData.Upgrade.progress_percent'), /** + * upgrade groups, reversed and PENDING ones are hidden + * @type {Array} + */ + upgradeGroups: function () { + if (Em.isNone(this.get('controller.upgradeData.upgradeGroups'))) return []; + var upgradeGroups = this.get('controller.upgradeData.upgradeGroups'); + upgradeGroups.reverse(); + return upgradeGroups; + }.property('controller.upgradeData.upgradeGroups'), + + /** + * currently active group + * @type {object|undefined} + */ + activeGroup: function () { + return this.get('upgradeGroups').find(function (item) { + return this.get('activeStatuses').contains(item.get('status')); + }, this); + }.property('[email protected]'), + + /** + * if upgrade group is in progress it should have currently running item + * @type {object|undefined} + */ + runningItem: function () { + return this.get('activeGroup.upgradeItems') && this.get('activeGroup.upgradeItems').findProperty('status', 'IN_PROGRESS'); + }.property('[email protected]'), + + /** + * if upgrade group is failed it should have failed item + * @type {object|undefined} + */ + failedItem: function () { + return this.get('activeGroup.upgradeItems') && this.get('activeGroup.upgradeItems').find(function (item) { + return this.get('failedStatuses').contains(item.get('status')); + }, this); + }.property('[email protected]'), + + /** + * details of currently active task + * @type {object|undefined} + */ + taskDetails: function () { + if (this.get('runningItem')) { + return this.get('runningItem').get('tasks').findProperty('status', 'IN_PROGRESS'); + } else if (this.get('failedItem')) { + return this.get('failedItem').get('tasks').find(function (task) { + return this.get('failedStatuses').contains(task.get('status')); + }, this); + } + }.property('[email protected]', '[email protected]'), + + /** + * indicate whether failed item can be skipped or retried in order to continue Upgrade + * @type {boolean} + */ + isHoldingState: function () { + return Boolean(this.get('failedItem.status') && this.get('failedItem.status').contains('HOLDING')); + }.property('failedItem.status'), + + /** + * @type {boolean} + */ + isManualDone: false, + + /** + * @type {boolean} + */ + isManualProceedDisabled: function () { + return !this.get('isManualDone'); + }.property('isManualDone'), + + /** + * if upgrade group is manual it should have manual item + * @type {object|undefined} + */ + manualItem: function () { + return this.get('activeGroup.upgradeItems') && this.get('activeGroup.upgradeItems').findProperty('status', 'HOLDING'); + }.property('[email protected]'), + + /** * label of Upgrade status * @type {string} */ @@ -68,6 +169,13 @@ App.upgradeWizardView = Em.View.extend({ }.property('controller.upgradeData.Upgrade.request_status'), /** + * toggle details box + */ + toggleDetails: function () { + this.toggleProperty('isDetailsOpened'); + }, + + /** * start polling upgrade data */ startPolling: function () { @@ -104,5 +212,50 @@ App.upgradeWizardView = Em.View.extend({ self.get('controller').loadUpgradeData(); self.doPolling(); }, App.bgOperationsUpdateInterval)); + }, + + /** + * set status to Upgrade item + * @param item + * @param status + */ + setUpgradeItemStatus: function(item, status) { + return App.ajax.send({ + name: 'admin.upgrade.upgradeItem.setState', + sender: this, + data: { + upgradeId: item.get('request_id'), + itemId: item.get('stage_id'), + groupId: item.get('group_id'), + status: status + } + }).done(function () { + item.set('status', status); + }); + }, + + /** + * set current upgrade item state to FAILED (for HOLDING_FAILED) or TIMED_OUT (for HOLDING_TIMED_OUT) + * in order to ignore fail and continue Upgrade + * @param {object} event + */ + continue: function (event) { + this.setUpgradeItemStatus(event.context, event.context.get('status').slice(8)); + }, + + /** + * set current upgrade item state to PENDING in order to retry Upgrade + * @param {object} event + */ + retry: function (event) { + this.setUpgradeItemStatus(event.context, 'PENDING'); + }, + + /** + * set current upgrade item state to COMPLETED in order to proceed + * @param {object} event + */ + complete: function (event) { + this.setUpgradeItemStatus(event.context, 'COMPLETED'); } }); http://git-wip-us.apache.org/repos/asf/ambari/blob/edb27ea8/ambari-web/test/views/main/admin/stack_upgrade/upgrade_group_view_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_group_view_test.js b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_group_view_test.js index 249764f..ac50eee 100644 --- a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_group_view_test.js +++ b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_group_view_test.js @@ -26,265 +26,6 @@ describe('App.upgradeGroupView', function () { failedStatuses: ['FAILED'] }); - describe("#runningItem", function () { - it("no running item", function () { - view.set('content.upgradeItems', []); - view.propertyDidChange('runningItem'); - expect(view.get('runningItem')).to.be.undefined; - }); - it("running item present", function () { - view.set('content.upgradeItems', [ - {status: 'IN_PROGRESS'} - ]); - view.propertyDidChange('runningItem'); - expect(view.get('runningItem')).to.be.eql({status: 'IN_PROGRESS'}); - }); - }); - - describe("#failedItem", function () { - it("no running item", function () { - view.set('content.upgradeItems', []); - view.propertyDidChange('failedItem'); - expect(view.get('failedItem')).to.be.undefined; - }); - it("running item present", function () { - view.set('content.upgradeItems', [Em.Object.create({status: 'FAILED'})]); - view.propertyDidChange('failedItem'); - expect(view.get('failedItem')).to.be.eql(Em.Object.create({status: 'FAILED'})); - }); - }); - - describe("#manualItem", function () { - it("no running item", function () { - view.set('content.upgradeItems', []); - view.propertyDidChange('manualItem'); - expect(view.get('manualItem')).to.be.undefined; - }); - it("running item present", function () { - view.set('content.upgradeItems', [Em.Object.create({status: 'HOLDING'})]); - view.propertyDidChange('manualItem'); - expect(view.get('manualItem')).to.be.eql(Em.Object.create({status: 'HOLDING'})); - }); - }); - - describe("#isManualOpened", function () { - it("manual item null", function () { - view.reopen({manualItem: null}); - view.propertyDidChange('isManualOpened'); - expect(view.get('isManualOpened')).to.be.false; - }); - it("manual item correct", function () { - view.reopen({manualItem: {}}); - view.propertyDidChange('isManualOpened'); - expect(view.get('isManualOpened')).to.be.true; - }); - }); - - describe("#showProgressInfo", function () { - var testCases = [ - { - data: { - runningItem: undefined, - isRunning: false - }, - result: false - }, - { - data: { - runningItem: undefined, - isRunning: true - }, - result: false - }, - { - data: { - runningItem: {}, - isRunning: false - }, - result: false - }, - { - data: { - runningItem: {}, - isRunning: true - }, - result: true - } - ]; - testCases.forEach(function (test) { - it('runningItem - ' + test.data.runningItem + ', isRunning - ' + test.data.isRunning, function () { - view.reopen({ - runningItem: test.data.runningItem - }); - view.set('content.isRunning', test.data.isRunning); - view.propertyDidChange('showProgressInfo'); - expect(view.get('showProgressInfo')).to.equal(test.result); - }); - }); - }); - - describe("#isManualProceedDisabled", function () { - it("", function () { - view.set('isManualDone', true); - view.propertyDidChange('isManualProceedDisabled'); - expect(view.get('isManualProceedDisabled')).to.be.false; - }); - }); - - describe("#showFailedInfo", function () { - var testCases = [ - { - data: { - failedItem: undefined, - status: 'PENDING' - }, - result: false - }, - { - data: { - failedItem: undefined, - status: 'FAILED' - }, - result: false - }, - { - data: { - failedItem: {}, - status: 'PENDING' - }, - result: false - }, - { - data: { - failedItem: {}, - status: 'FAILED' - }, - result: true - } - ]; - testCases.forEach(function (test) { - it('failedItem - ' + test.data.failedItem + ', status - ' + test.data.status, function () { - view.reopen({ - failedItem: test.data.failedItem - }); - view.set('content.status', test.data.status); - view.propertyDidChange('showFailedInfo'); - expect(view.get('showFailedInfo')).to.equal(test.result); - }); - }); - }); - - describe("#isHoldingState", function () { - var testCases = [ - { - data: { - failedItem: undefined - }, - result: false - }, - { - data: { - failedItem: {status: 'PENDING'} - }, - result: false - }, - { - data: { - failedItem: {status: 'HOLDING_FAILED'} - }, - result: true - }, - { - data: { - failedItem: {status: 'HOLDING_TIMED_OUT'} - }, - result: true - } - ]; - testCases.forEach(function (test) { - it('failedItem - ' + test.data.failedItem, function () { - view.reopen({ - failedItem: test.data.failedItem - }); - view.propertyDidChange('isHoldingState'); - expect(view.get('isHoldingState')).to.equal(test.result); - }); - }); - }); - - describe("#setUpgradeItemStatus()", function () { - before(function () { - sinon.stub(App.ajax, 'send', function () { - return { - done: function (callback) { - callback(); - } - } - }); - }); - after(function () { - App.ajax.send.restore(); - }); - it("", function () { - var item = Em.Object.create({ - request_id: 1, - stage_id: 1, - group_id: 1 - }) - view.setUpgradeItemStatus(item, 'PENDING'); - expect(App.ajax.send.getCall(0).args[0]).to.eql({ - name: 'admin.upgrade.upgradeItem.setState', - sender: view, - data: { - upgradeId: 1, - itemId: 1, - groupId: 1, - status: 'PENDING' - } - }); - expect(item.get('status')).to.equal('PENDING'); - }); - }); - - describe("#continue()", function () { - before(function () { - sinon.stub(view, 'setUpgradeItemStatus', Em.K); - }); - after(function () { - view.setUpgradeItemStatus.restore(); - }); - it("", function () { - view.continue({context: Em.Object.create({'status': 'HOLDING_FAILED'})}); - expect(view.setUpgradeItemStatus.calledWith(Em.Object.create({'status': 'HOLDING_FAILED'}), 'FAILED')).to.be.true; - }); - }); - - describe("#complete()", function () { - before(function () { - sinon.stub(view, 'setUpgradeItemStatus', Em.K); - }); - after(function () { - view.setUpgradeItemStatus.restore(); - }); - it("", function () { - view.complete({context: Em.Object.create({'status': 'FAILED'})}); - expect(view.setUpgradeItemStatus.calledWith(Em.Object.create({'status': 'FAILED'}), 'COMPLETED')).to.be.true; - }); - }); - - describe("#retry()", function () { - before(function () { - sinon.stub(view, 'setUpgradeItemStatus', Em.K); - }); - after(function () { - view.setUpgradeItemStatus.restore(); - }); - it("", function () { - view.retry({context: Em.Object.create({'status': 'FAILED'})}); - expect(view.setUpgradeItemStatus.calledWith(Em.Object.create({'status': 'FAILED'}), 'PENDING')).to.be.true; - }); - }); - describe("#toggleExpanded()", function () { before(function () { sinon.stub(view, 'collapseLowerLevels', Em.K); http://git-wip-us.apache.org/repos/asf/ambari/blob/edb27ea8/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 d195696..fd43233 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 @@ -21,11 +21,14 @@ var App = require('app'); require('views/main/admin/stack_upgrade/upgrade_wizard_view'); describe('App.upgradeWizardView', function () { - var view = App.upgradeWizardView.create(); + var view = App.upgradeWizardView.create({ + failedStatuses: ['FAILED'] + }); view.reopen({ controller: Em.Object.create({ loadUpgradeData: Em.K - }) + }), + activeGroup: Em.Object.create() }); view.removeObserver('App.clusterName', view, 'startPolling'); @@ -118,4 +121,158 @@ describe('App.upgradeWizardView', function () { expect(view.doPolling.calledTwice).to.be.true; }); }); + + describe("#continue()", function () { + before(function () { + sinon.stub(view, 'setUpgradeItemStatus', Em.K); + }); + after(function () { + view.setUpgradeItemStatus.restore(); + }); + it("", function () { + view.continue({context: Em.Object.create({'status': 'HOLDING_FAILED'})}); + expect(view.setUpgradeItemStatus.calledWith(Em.Object.create({'status': 'HOLDING_FAILED'}), 'FAILED')).to.be.true; + }); + }); + + describe("#complete()", function () { + before(function () { + sinon.stub(view, 'setUpgradeItemStatus', Em.K); + }); + after(function () { + view.setUpgradeItemStatus.restore(); + }); + it("", function () { + view.complete({context: Em.Object.create({'status': 'FAILED'})}); + expect(view.setUpgradeItemStatus.calledWith(Em.Object.create({'status': 'FAILED'}), 'COMPLETED')).to.be.true; + }); + }); + + describe("#retry()", function () { + before(function () { + sinon.stub(view, 'setUpgradeItemStatus', Em.K); + }); + after(function () { + view.setUpgradeItemStatus.restore(); + }); + it("", function () { + view.retry({context: Em.Object.create({'status': 'FAILED'})}); + expect(view.setUpgradeItemStatus.calledWith(Em.Object.create({'status': 'FAILED'}), 'PENDING')).to.be.true; + }); + }); + + describe("#setUpgradeItemStatus()", function () { + before(function () { + sinon.stub(App.ajax, 'send', function () { + return { + done: function (callback) { + callback(); + } + } + }); + }); + after(function () { + App.ajax.send.restore(); + }); + it("", function () { + var item = Em.Object.create({ + request_id: 1, + stage_id: 1, + group_id: 1 + }) + view.setUpgradeItemStatus(item, 'PENDING'); + expect(App.ajax.send.getCall(0).args[0]).to.eql({ + name: 'admin.upgrade.upgradeItem.setState', + sender: view, + data: { + upgradeId: 1, + itemId: 1, + groupId: 1, + status: 'PENDING' + } + }); + expect(item.get('status')).to.equal('PENDING'); + }); + }); + + describe("#manualItem", function () { + it("no running item", function () { + view.set('activeGroup.upgradeItems', []); + view.propertyDidChange('manualItem'); + expect(view.get('manualItem')).to.be.undefined; + }); + it("running item present", function () { + view.set('activeGroup.upgradeItems', [Em.Object.create({status: 'HOLDING'})]); + view.propertyDidChange('manualItem'); + expect(view.get('manualItem')).to.be.eql(Em.Object.create({status: 'HOLDING'})); + }); + }); + + describe("#isManualProceedDisabled", function () { + it("", function () { + view.set('isManualDone', true); + view.propertyDidChange('isManualProceedDisabled'); + expect(view.get('isManualProceedDisabled')).to.be.false; + }); + }); + + describe("#failedItem", function () { + it("no running item", function () { + view.set('activeGroup.upgradeItems', []); + view.propertyDidChange('failedItem'); + expect(view.get('failedItem')).to.be.undefined; + }); + it("running item present", function () { + view.set('activeGroup.upgradeItems', [Em.Object.create({status: 'FAILED'})]); + view.propertyDidChange('failedItem'); + expect(view.get('failedItem')).to.be.eql(Em.Object.create({status: 'FAILED'})); + }); + }); + + describe("#runningItem", function () { + it("no running item", function () { + view.set('activeGroup.upgradeItems', []); + view.propertyDidChange('runningItem'); + expect(view.get('runningItem')).to.be.undefined; + }); + it("running item present", function () { + view.set('activeGroup.upgradeItems', [ + {status: 'IN_PROGRESS'} + ]); + view.propertyDidChange('runningItem'); + expect(view.get('runningItem')).to.be.eql({status: 'IN_PROGRESS'}); + }); + }); + + describe("#isHoldingState", function () { + var testCases = [ + { + data: { + failedItem: {status: 'PENDING'} + }, + result: false + }, + { + data: { + failedItem: {status: 'HOLDING_FAILED'} + }, + result: true + }, + { + data: { + failedItem: {status: 'HOLDING_TIMED_OUT'} + }, + result: true + } + ]; + testCases.forEach(function (test) { + it('failedItem - ' + test.data.failedItem, function () { + view.reopen({ + failedItem: test.data.failedItem + }); + view.propertyDidChange('isHoldingState'); + expect(view.get('isHoldingState')).to.equal(test.result); + }); + }); + }); });
