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}}&nbsp;{{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}}&nbsp;{{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}}&nbsp;
-        <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}}&nbsp;
-        <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);
+      });
+    });
+  });
 });

Reply via email to