You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by at...@apache.org on 2014/11/26 18:24:16 UTC

ambari git commit: AMBARI-8457 Rolling Upgrade process: upgrade progress popup. (atkach)

Repository: ambari
Updated Branches:
  refs/heads/trunk 9218a8ebf -> ee9abd1b1


AMBARI-8457 Rolling Upgrade process: upgrade progress popup. (atkach)


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

Branch: refs/heads/trunk
Commit: ee9abd1b105e01bb5b6aad092f1754333368d508
Parents: 9218a8e
Author: Andrii Tkach <at...@hortonworks.com>
Authored: Wed Nov 26 19:15:01 2014 +0200
Committer: Andrii Tkach <at...@hortonworks.com>
Committed: Wed Nov 26 19:15:01 2014 +0200

----------------------------------------------------------------------
 .../app/assets/data/stack_versions/upgrade.json | 70 ++++++++++++++++++++
 ambari-web/app/assets/test/tests.js             |  3 +-
 .../main/admin/stack_and_upgrade_controller.js  | 51 ++++++++++++++
 ambari-web/app/messages.js                      |  6 ++
 ambari-web/app/styles/application.less          | 26 ++++++++
 .../stack_upgrade/stack_upgrade_dialog.hbs      | 38 +++++++++++
 .../main/admin/stack_upgrade/upgrade_task.hbs   | 48 ++++++++++++++
 ambari-web/app/utils/ajax/ajax.js               |  4 ++
 ambari-web/app/views.js                         |  3 +-
 .../admin/stack_upgrade/upgrade_task_view.js    | 63 ++++++++++++++++++
 .../stack_upgrade/upgrade_version_box_view.js   | 58 ++++++++++++++++
 .../main/admin/upgrade_version_box_view.js      | 41 ------------
 .../admin/stack_and_upgrade_controller_test.js  | 51 ++++++++++++++
 .../stack_upgrade/upgrade_task_view_test.js     | 59 +++++++++++++++++
 .../upgrade_version_box_view_test.js            | 62 +++++++++++++++++
 .../main/admin/upgrade_version_box_view_test.js | 57 ----------------
 16 files changed, 540 insertions(+), 100 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/ambari-web/app/assets/data/stack_versions/upgrade.json
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/data/stack_versions/upgrade.json b/ambari-web/app/assets/data/stack_versions/upgrade.json
new file mode 100644
index 0000000..33a97b8
--- /dev/null
+++ b/ambari-web/app/assets/data/stack_versions/upgrade.json
@@ -0,0 +1,70 @@
+{
+  "items": [
+    {
+      "UpgradeItem": {
+        "upgrade_item_id": 1,
+        "step_index": 1,
+        "status": "COMPLETED",
+        "stage_id": 124321,
+        "command": "Restart Zookeeper Server on host1",
+        "type": "auto",
+        "description": ""
+      }
+    },
+    {
+      "UpgradeItem": {
+        "upgrade_item_id": 2,
+        "step_index": 2,
+        "status": "WARNING",
+        "stage_id": 124321,
+        "command": "Restart Zookeeper Server on host2",
+        "type": "auto",
+        "description": ""
+      }
+    },
+    {
+      "UpgradeItem": {
+        "upgrade_item_id": 3,
+        "step_index": 3,
+        "status": "IN_PROGRESS",
+        "stage_id": 124321,
+        "command": "Run manual steps",
+        "type": "manual",
+        "description": "List of manual steps"
+      }
+    },
+    {
+      "UpgradeItem": {
+        "upgrade_item_id": 4,
+        "step_index": 4,
+        "status": "PENDING",
+        "stage_id": 124321,
+        "command": "Restart Datanode on 2 hosts",
+        "type": "auto",
+        "description": ""
+      }
+    },
+    {
+      "UpgradeItem": {
+        "upgrade_item_id": 5,
+        "step_index": 5,
+        "status": "PENDING",
+        "stage_id": 124321,
+        "command": "Restart Datanode on 2 hosts",
+        "type": "auto",
+        "description": ""
+      }
+    },
+    {
+      "UpgradeItem": {
+        "upgrade_item_id": 6,
+        "step_index": 6,
+        "status": "FAILED",
+        "stage_id": 124321,
+        "command": "Restart Zookeeper Server on host3",
+        "type": "auto",
+        "description": ""
+      }
+    }
+  ]
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/ambari-web/app/assets/test/tests.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/test/tests.js b/ambari-web/app/assets/test/tests.js
index da05db2..d165276 100644
--- a/ambari-web/app/assets/test/tests.js
+++ b/ambari-web/app/assets/test/tests.js
@@ -160,7 +160,8 @@ var files = ['test/init_model_test',
   'test/views/main/alerts/manage_alert_groups_view_test',
   'test/views/main/alerts/manage_alert_notifications_view_test',
   'test/views/main/admin/stack_version/stack_version_details_test',
-  'test/views/main/admin/upgrade_version_box_view_test',
+  'test/views/main/admin/stack_upgrade/upgrade_version_box_view_test',
+  'test/views/main/admin/stack_upgrade/upgrade_task_view_test',
   'test/views/main/dashboard/config_history_view_test',
   'test/views/main/dashboard/widget_test',
   'test/views/main/dashboard/widgets_test',

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
index 54f853d..bd48b7b 100644
--- a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
+++ b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
@@ -22,6 +22,7 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend({
   name: 'mainAdminStackAndUpgradeController',
 
   serviceToInstall: null,
+  upgradeTasks: [],
 
   /**
    * version that currently applied to server
@@ -78,6 +79,33 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend({
   },
 
   /**
+   * load upgrade tasks by upgrade id
+   * @return {$.ajax}
+   */
+  loadUpgradeTasks: function () {
+    //TODO should make call with actual upgrade id
+    var upgradeId = 1;
+    return App.ajax.send({
+      name: 'admin.upgrade.tasks',
+      sender: this,
+      data: {
+        id: upgradeId
+      },
+      success: 'loadUpgradeTasksSuccessCallback'
+    });
+  },
+
+  /**
+   * parse and push upgrade tasks to controller
+   * @param data
+   */
+  loadUpgradeTasksSuccessCallback: function (data) {
+    this.set("upgradeTasks", data.items.map(function (item) {
+      return item.UpgradeItem;
+    }));
+  },
+
+  /**
    * start cluster downgrade
    */
   downgrade: function () {
@@ -88,6 +116,8 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend({
    */
   upgrade: function () {
     //TODO start actual upgrade
+    this.loadUpgradeTasks();
+    this.openUpgradeDialog();
   },
   /**
    * resume upgrade process
@@ -100,5 +130,26 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend({
    */
   finalize: function () {
     //TODO start actual finalize
+  },
+
+  /**
+   * show dialog with tasks of upgrade
+   * @return {App.ModalPopup}
+   */
+  openUpgradeDialog: function () {
+    var upgradeVersion = 'HDP-2.2.1';
+
+    return App.ModalPopup.show({
+      header: Em.I18n.t('admin.stackUpgrade.dialog.header').format(upgradeVersion),
+      bodyClass: Em.View.extend({
+        controller: this,
+        templateName: require('templates/main/admin/stack_upgrade/stack_upgrade_dialog'),
+        tasks: function () {
+          return this.get('controller.upgradeTasks');
+        }.property('controller.upgradeTasks')
+      }),
+      primary: null,
+      secondary: null
+    });
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index b9e7a92..a77d74d 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -1264,6 +1264,12 @@ Em.I18n.translations = {
   'admin.stackUpgrade.state.finalize': "Finalize",
   'admin.stackUpgrade.hosts': "hosts",
   'admin.stackUpgrade.host': "host",
+  'admin.stackUpgrade.dialog.header': "Upgrade to {0} in progress",
+  'admin.stackUpgrade.dialog.operationFailed': "This operation failed.",
+  'admin.stackUpgrade.dialog.errorLink': "See error message",
+  'admin.stackUpgrade.dialog.stop': "Stop Upgrade",
+  'admin.stackUpgrade.dialog.continue': "Ignore and Continue",
+  'admin.stackUpgrade.dialog.manualDone': "I have preformed the manual steps above.",
 
   'services.service.start':'Start',
   'services.service.stop':'Stop',

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index 83001cc..b4bb625 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -6547,6 +6547,32 @@ i.icon-asterisks {
   }
 }
 
+#stack-upgrade-dialog {
+  .task-list {
+    overflow: auto;
+    .task-details {
+      padding: 2px 4px;
+      margin-left: 15px;
+      .button-row {
+        text-align: right;
+        padding: 5px;
+      }
+      input[type="checkbox"] {
+        margin: 0;
+      }
+      .message {
+        line-height: 30px;
+      }
+    }
+  }
+  .task-list>div {
+    padding: 5px;
+    i {
+      margin-right: 5px;
+    }
+  }
+}
+
 #config-group-select-create-dialog {
   .select-create-config-group-div {
     margin-left: 20px;

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_dialog.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_dialog.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_dialog.hbs
new file mode 100644
index 0000000..bdb650e
--- /dev/null
+++ b/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_dialog.hbs
@@ -0,0 +1,38 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+<div id="stack-upgrade-dialog">
+
+  <div class="row-fluid">
+    <div class="span2">{{t common.progress}}</div>
+    <div class="span9">
+      <div class="progress progress-striped active">
+        <div class="bar" style="width: 40%;"></div>
+      </div>
+    </div>
+    <div class="span1">
+      40%
+    </div>
+  </div>
+
+  <div class="task-list">
+    {{#each task in view.tasks}}
+      {{view App.upgradeTaskView contentBinding="task"}}
+    {{/each}}
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/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
new file mode 100644
index 0000000..67e373f
--- /dev/null
+++ b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_task.hbs
@@ -0,0 +1,48 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+<i {{bindAttr class="view.iconClass"}}></i><span>{{view.content.command}}</span>
+{{#if view.isFailed}}
+  <div class="box task-details">
+    <div>
+      {{t admin.stackUpgrade.dialog.operationFailed}}&nbsp;
+      <a href>{{t admin.stackUpgrade.dialog.errorLink}}</a>
+    </div>
+    <div class="button-row">
+      <button class="btn">{{t admin.stackUpgrade.dialog.continue}}</button>
+      <button class="btn btn-danger">{{t admin.stackUpgrade.dialog.stop}}</button>
+      <button class="btn btn-primary">{{t common.retry}}</button>
+    </div>
+  </div>
+{{/if}}
+{{#if view.isManualOpened}}
+  <div class="task-details">
+    <div class="alert alert-info">
+      {{view.content.description}}
+    </div>
+    <div class="row-fluid">
+      <div class="span10 message">
+        {{view Em.Checkbox valueBinding="view.isManualDone"}}
+        {{t admin.stackUpgrade.dialog.manualDone}}
+      </div>
+      <div class="span2">
+        <button class="btn btn-success pull-right">{{t common.proceed}}</button>
+      </div>
+    </div>
+  </div>
+{{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js
index 4c3d74d..e162719 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -1267,6 +1267,10 @@ var urls = {
     'real': '/clusters/{cluster}/requests/{requestId}?fields=tasks/*',
     'mock': '/data/wizard/{mock}'
   },
+  'admin.upgrade.tasks': {
+    'real': '/clusters/{clusterName}/upgrades/{id}/upgrade_items',
+    'mock': '/data/stack_versions/upgrade.json'
+  },
   'admin.stack_versions.all': {
     'real': '/clusters/{clusterName}/stack_versions?fields=ClusterStackVersions/*&minimal_response=true',
     'mock': '/data/stack_versions/stack_version_all.json'

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/ambari-web/app/views.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views.js b/ambari-web/app/views.js
index a36006f..9e21516 100644
--- a/ambari-web/app/views.js
+++ b/ambari-web/app/views.js
@@ -104,7 +104,8 @@ require('views/main/admin/highAvailability/resourceManager/step3_view');
 require('views/main/admin/highAvailability/resourceManager/step4_view');
 require('views/main/admin/serviceAccounts_view');
 require('views/main/admin/stack_upgrade');
-require('views/main/admin/upgrade_version_box_view');
+require('views/main/admin/stack_upgrade/upgrade_version_box_view');
+require('views/main/admin/stack_upgrade/upgrade_task_view');
 require('views/main/admin/stack_and_upgrade_view');
 require('views/main/admin/stack_versions/stack_version_view');
 require('views/main/admin/stack_versions/stack_version_details_view');

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/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
new file mode 100644
index 0000000..b88219a
--- /dev/null
+++ b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_task_view.js
@@ -0,0 +1,63 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+var App = require('app');
+
+App.upgradeTaskView = Em.View.extend({
+  templateName: require('templates/main/admin/stack_upgrade/upgrade_task'),
+
+  /**
+   * @type {object|null}
+   */
+  task: null,
+
+  statusIconMap: {
+    'COMPLETED': 'icon-ok',
+    'WARNING': 'icon-warning-sign',
+    'FAILED': 'icon-warning-sign',
+    'PENDING': 'icon-cog'
+  },
+
+  /**
+   * @type {boolean}
+   */
+  isManualDone: false,
+
+  /**
+   * @type {string}
+   */
+  iconClass: function () {
+    return this.get('statusIconMap')[this.get('content.status')] || 'icon-question-sign';
+  }.property('content.status'),
+
+  /**
+   * @type {boolean}
+   */
+  isFailed: function () {
+    return this.get('content.status') === 'FAILED';
+  }.property('content.status'),
+
+  /**
+   * @type {boolean}
+   */
+  isManualOpened: function () {
+    //TODO modify logic according to actual API
+    return this.get('content.status') === 'IN_PROGRESS' && this.get('content.type') === 'manual'
+  }.property('content.status', 'content.type')
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/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
new file mode 100644
index 0000000..9689bef
--- /dev/null
+++ b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js
@@ -0,0 +1,58 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+var App = require('app');
+
+App.UpgradeVersionBoxView = Em.View.extend({
+  /**
+   * @type {object|null}
+   */
+  version: null,
+
+  /**
+   * @type {string}
+   */
+  versionName: function () {
+    if (Em.isNone(this.get('version'))) return "";
+    return this.get('version.stack') + "-" + this.get('version.version');
+  }.property('version.stack', 'version.version'),
+
+  /**
+   * @type {string}
+   */
+  btnClass: 'btn-default',
+
+  /**
+   * @type {number}
+   */
+  hostsCount: 0,
+
+  /**
+   * run action by name of method
+   * @param event
+   * @return {Boolean}
+   */
+  runAction: function (event) {
+    if (typeof this.get('controller')[event.context] === 'function') {
+      this.get('controller')[event.context]();
+      return true;
+    }
+    return false;
+  }
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/ambari-web/app/views/main/admin/upgrade_version_box_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin/upgrade_version_box_view.js b/ambari-web/app/views/main/admin/upgrade_version_box_view.js
deleted file mode 100644
index a071324..0000000
--- a/ambari-web/app/views/main/admin/upgrade_version_box_view.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-var App = require('app');
-
-App.UpgradeVersionBoxView = Em.View.extend({
-  version: null,
-  versionName: function () {
-    return this.get('version.stack') + "-" + this.get('version.version');
-  }.property('version.stack', 'version.version'),
-  btnClass: 'btn-default',
-  hostsCount: null,
-  /**
-   * run action by name of method
-   * @param event
-   * @return {Boolean}
-   */
-  runAction: function (event) {
-    if (typeof this.get('controller')[event.context] === 'function') {
-      this.get('controller')[event.context]();
-      return true;
-    }
-    return false;
-  }
-});

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
index 4e9e1bf..0fb32f4 100644
--- a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
@@ -105,4 +105,55 @@ describe('App.MainAdminStackAndUpgradeController', function() {
       }]);
     });
   });
+
+  describe("#loadUpgradeTasks()", function() {
+    before(function () {
+      sinon.stub(App.ajax, 'send', Em.K);
+    });
+    after(function () {
+      App.ajax.send.restore();
+    });
+    it("make ajax call", function() {
+      controller.loadUpgradeTasks();
+      expect(App.ajax.send.getCall(0).args[0]).to.eql({
+        name: 'admin.upgrade.tasks',
+        sender: controller,
+        data: {
+          id: 1
+        },
+        success: 'loadUpgradeTasksSuccessCallback'
+      })
+    });
+  });
+
+  describe("#loadUpgradeTasksSuccessCallback()", function() {
+    it("", function() {
+      var data = {"items": [
+        {
+          "UpgradeItem": {
+            "id": 1
+          }
+        }
+      ]};
+      controller.loadUpgradeTasksSuccessCallback(data);
+      expect(controller.get('upgradeTasks')).to.eql([
+        {
+          "id": 1
+        }
+      ]);
+    });
+  });
+
+  describe("#openUpgradeDialog()", function () {
+    before(function () {
+      sinon.stub(App.ModalPopup, 'show', Em.K);
+    });
+    after(function () {
+      App.ModalPopup.show.restore();
+    });
+    it("should open dialog", function () {
+      controller.openUpgradeDialog();
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+    });
+  });
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_task_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/admin/stack_upgrade/upgrade_task_view_test.js b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_task_view_test.js
new file mode 100644
index 0000000..7fcd08c
--- /dev/null
+++ b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_task_view_test.js
@@ -0,0 +1,59 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+var App = require('app');
+require('views/main/admin/stack_upgrade/upgrade_task_view');
+
+describe('App.upgradeTaskView', function () {
+  var view = App.upgradeTaskView.create({
+    content: Em.Object.create()
+  });
+
+  describe("#iconClass", function () {
+    it("status has icon", function () {
+      view.set('statusIconMap', {
+        'S1': 'icon1'
+      });
+      view.set('content.status', 'S1');
+      view.propertyDidChange('iconClass');
+      expect(view.get('iconClass')).to.equal('icon1');
+    });
+    it("status undefined", function () {
+      view.set('statusIconMap', {
+        'S1': 'icon1'
+      });
+      view.set('content.status', 'S2');
+      view.propertyDidChange('iconClass');
+      expect(view.get('iconClass')).to.equal('icon-question-sign');
+    });
+  });
+
+  describe("#isFailed", function () {
+    it("task is not failed", function () {
+      view.set('content.status', 'COMPLETED');
+      view.propertyDidChange('isFailed');
+      expect(view.get('isFailed')).to.be.false;
+    });
+    it("task is not failed", function () {
+      view.set('content.status', 'FAILED');
+      view.propertyDidChange('isFailed');
+      expect(view.get('isFailed')).to.be.true;
+    });
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/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
new file mode 100644
index 0000000..7e277e5
--- /dev/null
+++ b/ambari-web/test/views/main/admin/stack_upgrade/upgrade_version_box_view_test.js
@@ -0,0 +1,62 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+var App = require('app');
+require('views/main/admin/stack_upgrade/upgrade_version_box_view');
+
+describe('App.UpgradeVersionBoxView', function () {
+  var view = App.UpgradeVersionBoxView.create({
+    controller: Em.Object.create({
+      upgrade: Em.K
+    })
+  });
+
+  describe("#versionName", function () {
+    it("version is null", function () {
+      view.set('version', null);
+      view.propertyDidChange('versionName');
+      expect(view.get('versionName')).to.be.empty;
+    });
+    it("version is loaded", function () {
+      view.set('version', Em.Object.create({
+        stack: 'HDP',
+        version: '2.2'
+      }));
+      view.propertyDidChange('versionName');
+      expect(view.get('versionName')).to.equal('HDP-2.2');
+    });
+  });
+
+  describe("#runAction()", function () {
+    beforeEach(function () {
+      sinon.spy(view.get('controller'), 'upgrade');
+    });
+    afterEach(function () {
+      view.get('controller').upgrade.restore();
+    });
+    it("call upgrade()", function () {
+      expect(view.runAction({context: 'upgrade'})).to.be.true;
+      expect(view.get('controller').upgrade.calledOnce).to.be.true;
+    });
+    it("no method should be called", function () {
+      expect(view.runAction({context: null})).to.be.false;
+      expect(view.get('controller').upgrade.called).to.be.false;
+    });
+  });
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/ee9abd1b/ambari-web/test/views/main/admin/upgrade_version_box_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/admin/upgrade_version_box_view_test.js b/ambari-web/test/views/main/admin/upgrade_version_box_view_test.js
deleted file mode 100644
index 79436ac..0000000
--- a/ambari-web/test/views/main/admin/upgrade_version_box_view_test.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-var App = require('app');
-require('views/main/admin/upgrade_version_box_view');
-
-describe('App.UpgradeVersionBoxView', function () {
-  var view = App.UpgradeVersionBoxView.create({
-    controller: Em.Object.create({
-      upgrade: Em.K
-    })
-  });
-
-  describe("#versionName", function () {
-    it("", function () {
-      view.set('version', Em.Object.create({
-        stack: 'HDP',
-        version: '2.2'
-      }));
-      view.propertyDidChange('versionName');
-      expect(view.get('versionName')).to.equal('HDP-2.2');
-    });
-  });
-
-  describe("#runAction()", function () {
-    beforeEach(function () {
-      sinon.spy(view.get('controller'), 'upgrade');
-    });
-    afterEach(function () {
-      view.get('controller').upgrade.restore();
-    });
-    it("call upgrade()", function () {
-      expect(view.runAction({context: 'upgrade'})).to.be.true;
-      expect(view.get('controller').upgrade.calledOnce).to.be.true;
-    });
-    it("no method should be called", function () {
-      expect(view.runAction({context: null})).to.be.false;
-      expect(view.get('controller').upgrade.called).to.be.false;
-    });
-  });
-});
\ No newline at end of file