You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ab...@apache.org on 2015/01/09 14:41:02 UTC

[1/2] ambari git commit: AMBARI-9059 Show Upgrade progress in top nav. (ababiichuk)

Repository: ambari
Updated Branches:
  refs/heads/trunk 01b86400d -> c1fd867e2


AMBARI-9059 Show Upgrade progress in top nav. (ababiichuk)


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

Branch: refs/heads/trunk
Commit: c1fd867e29d629b79a9c08f171e7eb9778673e00
Parents: 39aeeb0
Author: aBabiichuk <ab...@cybervisiontech.com>
Authored: Fri Jan 9 15:03:11 2015 +0200
Committer: aBabiichuk <ab...@cybervisiontech.com>
Committed: Fri Jan 9 15:41:00 2015 +0200

----------------------------------------------------------------------
 ambari-web/app/app.js                           |  17 ++
 .../background_operations/list_on_start.json    | 237 +++++++++++++++++--
 .../global/background_operations_controller.js  |  13 +
 ambari-web/app/messages.js                      |   2 +
 ambari-web/app/styles/application.less          |  47 ++++
 ambari-web/app/templates/application.hbs        |   8 +
 .../global/background_operations_test.js        |  34 +++
 7 files changed, 340 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c1fd867e/ambari-web/app/app.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/app.js b/ambari-web/app/app.js
index 2f12795..3466f28 100644
--- a/ambari-web/app/app.js
+++ b/ambari-web/app/app.js
@@ -48,6 +48,23 @@ module.exports = Em.Application.create({
   upgradeState: 'INIT',
 
   /**
+   * flag is true when upgrade process is running
+   * @returns {boolean}
+   */
+  upgradeInProgress: function() {
+    return ["IN_PROGRESS"].contains(this.get('upgradeState'));
+  }.property('upgradeState'),
+
+  /**
+   * flag is true when upgrade process is waiting for user action
+   * to procced, retry, perform manual steps etc.
+   * @returns {boolean}
+   */
+  upgradeHolding: function() {
+    return this.get('upgradeState').contains("HOLDING");
+  }.property('upgradeState'),
+
+  /**
    * compute user access rights by permission type
    * types:
    *  - ADMIN

http://git-wip-us.apache.org/repos/asf/ambari/blob/c1fd867e/ambari-web/app/assets/data/background_operations/list_on_start.json
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/data/background_operations/list_on_start.json b/ambari-web/app/assets/data/background_operations/list_on_start.json
index 57a974c..7d47c15 100644
--- a/ambari-web/app/assets/data/background_operations/list_on_start.json
+++ b/ambari-web/app/assets/data/background_operations/list_on_start.json
@@ -1,55 +1,256 @@
 {
-  "href" : "http://192.168.56.101:8080/api/v1/clusters/perf/requests?to=end&page_size=10&fields=Requests",
+  "href" : "http://162.216.151.112:8080/api/v1/clusters/c1/requests?to=end&page_size=10&fields=Requests&_=1420804171828",
+  "itemTotal" : "10",
   "items" : [
     {
-      "href" : "http://192.168.56.101:8080/api/v1/clusters/c1/requests/12",
+      "href" : "http://162.216.151.112:8080/api/v1/clusters/c1/requests/17",
       "Requests" : {
         "aborted_task_count" : 0,
         "cluster_name" : "c1",
-        "completed_task_count" : 2,
-        "create_time" : 1414410974460,
-        "end_time" : 1414411113883,
+        "completed_task_count" : 3,
+        "create_time" : 1420732929053,
+        "end_time" : 1420733166162,
         "exclusive" : false,
         "failed_task_count" : 0,
-        "id" : 12,
+        "id" : 17,
         "inputs" : null,
         "operation_level" : null,
         "progress_percent" : 100.0,
         "queued_task_count" : 0,
-        "request_context" : "Install Services",
+        "request_context" : "Distribute repositories/install packages",
         "request_schedule" : null,
         "request_status" : "COMPLETED",
         "resource_filters" : [ ],
-        "start_time" : 1414410974489,
-        "task_count" : 2,
+        "start_time" : 1420732929071,
+        "task_count" : 3,
         "timed_out_task_count" : 0,
         "type" : "INTERNAL_REQUEST"
       }
     },
     {
-      "href" : "http://192.168.56.101:8080/api/v1/clusters/c1/requests/13",
+      "href" : "http://162.216.151.112:8080/api/v1/clusters/c1/requests/18",
       "Requests" : {
         "aborted_task_count" : 0,
         "cluster_name" : "c1",
-        "completed_task_count" : 2,
-        "create_time" : 1414411114097,
-        "end_time" : 1414411129173,
+        "completed_task_count" : 3,
+        "create_time" : 1420741144265,
+        "end_time" : 1420741162446,
         "exclusive" : false,
         "failed_task_count" : 0,
-        "id" : 13,
+        "id" : 18,
         "inputs" : null,
         "operation_level" : null,
         "progress_percent" : 100.0,
         "queued_task_count" : 0,
-        "request_context" : "Start Added Services",
+        "request_context" : "Distribute repositories/install packages",
         "request_schedule" : null,
         "request_status" : "COMPLETED",
         "resource_filters" : [ ],
-        "start_time" : 1414411114179,
-        "task_count" : 2,
+        "start_time" : 1420741144295,
+        "task_count" : 3,
+        "timed_out_task_count" : 0,
+        "type" : "INTERNAL_REQUEST"
+      }
+    },
+    {
+      "href" : "http://162.216.151.112:8080/api/v1/clusters/c1/requests/19",
+      "Requests" : {
+        "aborted_task_count" : 20,
+        "cluster_name" : "c1",
+        "completed_task_count" : 21,
+        "create_time" : 1420741278556,
+        "end_time" : 1420742042708,
+        "exclusive" : false,
+        "failed_task_count" : 1,
+        "id" : 19,
+        "inputs" : null,
+        "operation_level" : null,
+        "progress_percent" : 100.0,
+        "queued_task_count" : 0,
+        "request_context" : "Upgrading to 2.2.4.3-885",
+        "request_schedule" : null,
+        "request_status" : "FAILED",
+        "resource_filters" : [ ],
+        "start_time" : 1420741278615,
+        "task_count" : 21,
+        "timed_out_task_count" : 0,
+        "type" : "INTERNAL_REQUEST"
+      }
+    },
+    {
+      "href" : "http://162.216.151.112:8080/api/v1/clusters/c1/requests/20",
+      "Requests" : {
+        "aborted_task_count" : 20,
+        "cluster_name" : "c1",
+        "completed_task_count" : 21,
+        "create_time" : 1420742881366,
+        "end_time" : 1420742911600,
+        "exclusive" : false,
+        "failed_task_count" : 1,
+        "id" : 20,
+        "inputs" : null,
+        "operation_level" : null,
+        "progress_percent" : 100.0,
+        "queued_task_count" : 0,
+        "request_context" : "Upgrading to 2.2.0.1-885",
+        "request_schedule" : null,
+        "request_status" : "FAILED",
+        "resource_filters" : [ ],
+        "start_time" : 1420742881426,
+        "task_count" : 21,
+        "timed_out_task_count" : 0,
+        "type" : "INTERNAL_REQUEST"
+      }
+    },
+    {
+      "href" : "http://162.216.151.112:8080/api/v1/clusters/c1/requests/21",
+      "Requests" : {
+        "aborted_task_count" : 20,
+        "cluster_name" : "c1",
+        "completed_task_count" : 20,
+        "create_time" : 1420743882836,
+        "end_time" : 1420801978445,
+        "exclusive" : false,
+        "failed_task_count" : 0,
+        "id" : 21,
+        "inputs" : null,
+        "operation_level" : null,
+        "progress_percent" : 98.57142857142857,
+        "queued_task_count" : 0,
+        "request_context" : "Upgrading to 2.2.0.1-885",
+        "request_schedule" : null,
+        "request_status" : "HOLDING_FAILED",
+        "resource_filters" : [ ],
+        "start_time" : 1420743882894,
+        "task_count" : 21,
+        "timed_out_task_count" : 0,
+        "type" : "INTERNAL_REQUEST"
+      }
+    },
+    {
+      "href" : "http://162.216.151.112:8080/api/v1/clusters/c1/requests/22",
+      "Requests" : {
+        "aborted_task_count" : 0,
+        "cluster_name" : "c1",
+        "completed_task_count" : 3,
+        "create_time" : 1420801929946,
+        "end_time" : 1420801992902,
+        "exclusive" : false,
+        "failed_task_count" : 0,
+        "id" : 22,
+        "inputs" : null,
+        "operation_level" : null,
+        "progress_percent" : 100.0,
+        "queued_task_count" : 0,
+        "request_context" : "Distribute repositories/install packages",
+        "request_schedule" : null,
+        "request_status" : "COMPLETED",
+        "resource_filters" : [ ],
+        "start_time" : 1420801978494,
+        "task_count" : 3,
+        "timed_out_task_count" : 0,
+        "type" : "INTERNAL_REQUEST"
+      }
+    },
+    {
+      "href" : "http://162.216.151.112:8080/api/v1/clusters/c1/requests/23",
+      "Requests" : {
+        "aborted_task_count" : 20,
+        "cluster_name" : "c1",
+        "completed_task_count" : 21,
+        "create_time" : 1420802322402,
+        "end_time" : 1420802372784,
+        "exclusive" : false,
+        "failed_task_count" : 1,
+        "id" : 23,
+        "inputs" : null,
+        "operation_level" : null,
+        "progress_percent" : 100.0,
+        "queued_task_count" : 0,
+        "request_context" : "Upgrading to 2.2.0-2041",
+        "request_schedule" : null,
+        "request_status" : "FAILED",
+        "resource_filters" : [ ],
+        "start_time" : 1420802322463,
+        "task_count" : 21,
+        "timed_out_task_count" : 0,
+        "type" : "INTERNAL_REQUEST"
+      }
+    },
+    {
+      "href" : "http://162.216.151.112:8080/api/v1/clusters/c1/requests/24",
+      "Requests" : {
+        "aborted_task_count" : 0,
+        "cluster_name" : "c1",
+        "completed_task_count" : 3,
+        "create_time" : 1420802446657,
+        "end_time" : 1420802467535,
+        "exclusive" : false,
+        "failed_task_count" : 0,
+        "id" : 24,
+        "inputs" : null,
+        "operation_level" : null,
+        "progress_percent" : 100.0,
+        "queued_task_count" : 0,
+        "request_context" : "Distribute repositories/install packages",
+        "request_schedule" : null,
+        "request_status" : "COMPLETED",
+        "resource_filters" : [ ],
+        "start_time" : 1420802446679,
+        "task_count" : 3,
+        "timed_out_task_count" : 0,
+        "type" : "INTERNAL_REQUEST"
+      }
+    },
+    {
+      "href" : "http://162.216.151.112:8080/api/v1/clusters/c1/requests/25",
+      "Requests" : {
+        "aborted_task_count" : 20,
+        "cluster_name" : "c1",
+        "completed_task_count" : 21,
+        "create_time" : 1420802506244,
+        "end_time" : 1420802526532,
+        "exclusive" : false,
+        "failed_task_count" : 1,
+        "id" : 25,
+        "inputs" : null,
+        "operation_level" : null,
+        "progress_percent" : 100.0,
+        "queued_task_count" : 0,
+        "request_context" : "Upgrading to 2.2.0-2041",
+        "request_schedule" : null,
+        "request_status" : "FAILED",
+        "resource_filters" : [ ],
+        "start_time" : 1420802506371,
+        "task_count" : 21,
+        "timed_out_task_count" : 0,
+        "type" : "INTERNAL_REQUEST"
+      }
+    },
+    {
+      "href" : "http://162.216.151.112:8080/api/v1/clusters/c1/requests/26",
+      "Requests" : {
+        "aborted_task_count" : 0,
+        "cluster_name" : "c1",
+        "completed_task_count" : 9,
+        "create_time" : 1420802576635,
+        "end_time" : -1,
+        "exclusive" : false,
+        "failed_task_count" : 2,
+        "id" : 26,
+        "inputs" : null,
+        "operation_level" : null,
+        "progress_percent" : 42.857142857142854,
+        "queued_task_count" : 0,
+        "request_context" : "Upgrading to 2.2.1.0-2191",
+        "request_schedule" : null,
+        "request_status" : "FAILED",
+        "resource_filters" : [ ],
+        "start_time" : 1420802576700,
+        "task_count" : 21,
         "timed_out_task_count" : 0,
         "type" : "INTERNAL_REQUEST"
       }
     }
   ]
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/c1fd867e/ambari-web/app/controllers/global/background_operations_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/global/background_operations_controller.js b/ambari-web/app/controllers/global/background_operations_controller.js
index e6461d6..328575f 100644
--- a/ambari-web/app/controllers/global/background_operations_controller.js
+++ b/ambari-web/app/controllers/global/background_operations_controller.js
@@ -189,6 +189,16 @@ App.BackgroundOperationsController = Em.Controller.extend({
   },
 
   /**
+   * returns true if it's upgrade equest
+   * use this flag to exclude upgrade requests from bgo
+   * @param {object} request
+   * @returns {boolean}
+   */
+  isUpgradeRequest: function(request) {
+    var context = Em.get(request, 'Requests.request_context');
+    return context ? context.toLowerCase().contains('upgrading') : false;
+  },
+  /**
    * Prepare, received from server, requests for host component popup
    * @param data
    */
@@ -199,6 +209,9 @@ App.BackgroundOperationsController = Em.Controller.extend({
     var countGot = data.itemTotal;
    
     data.items.forEach(function (request) {
+      if (this.isUpgradeRequest(request)) {
+        return;
+      }
       var rq = this.get("services").findProperty('id', request.Requests.id);
       var isRunning = this.isRequestRunning(request);
       var requestParams = this.parseRequestContext(request.Requests.request_context);

http://git-wip-us.apache.org/repos/asf/ambari/blob/c1fd867e/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 947110e..e8dc05b 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -44,6 +44,8 @@ Em.I18n.translations = {
   'app.aboutAmbari.getInvolved': 'Get involved!',
   'app.aboutAmbari.version': 'Version',
   'app.aboutAmbari.licensed': 'Licensed under the Apache License, Version 2.0',
+  'app.upgrade.inProgress': 'Upgrade: In Process',
+  'app.upgrade.holding': 'Upgrade: Action Required',
 
   'apply':'apply',
   'and':'and',

http://git-wip-us.apache.org/repos/asf/ambari/blob/c1fd867e/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index 1d793ff..3410a1b 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -22,6 +22,25 @@
 @space-m: 10px;
 @space-l: 20px;
 
+@-webkit-keyframes orangePulse {
+  from { background-color: #fdb82f; }
+  50% { background-color: #fd910e; }
+  to { background-color: #fdb82f; }
+}
+
+@-moz-keyframes orangePulse {
+  from { background-color: #fdb82f; }
+  50% { background-color: #fd910e; }
+  to { background-color: #fdb82f; }
+}
+
+@keyframes orangePulse
+{
+  0% { background-color: #fdb82f; }
+  50% { background-color: #fd910e; }
+  100% { background-color: #fdb82f; }
+}
+
 @-webkit-keyframes greenPulse {
   from { background-color: #118fff; }
   50% { background-color: #006DCC; }
@@ -217,6 +236,34 @@ footer {
         animation-iteration-count: infinite;
       }
 
+      .upgrade-in-progress {
+        text-shadow: none;
+        background-color: #006DCC;
+        -webkit-animation-name: greenPulse;
+        -webkit-animation-duration: 1s;
+        -webkit-animation-iteration-count: infinite;
+        -moz-animation-name: greenPulse;
+        -moz-animation-duration: 1s;
+        -moz-animation-iteration-count: infinite;
+        animation-name: greenPulse;
+        animation-duration: 1s;
+        animation-iteration-count: infinite;
+      }
+
+      .upgrade-holding {
+        text-shadow: none;
+        background-color: @health-status-orange;
+        -webkit-animation-name: orangePulse;
+        -webkit-animation-duration: 1s;
+        -webkit-animation-iteration-count: infinite;
+        -moz-animation-name: orangePulse;
+        -moz-animation-duration: 1s;
+        -moz-animation-iteration-count: infinite;
+        animation-name: orangePulse;
+        animation-duration: 1s;
+        animation-iteration-count: infinite;
+      }
+
     }
     .top-nav-menu.nav {
       display: block;

http://git-wip-us.apache.org/repos/asf/ambari/blob/c1fd867e/ambari-web/app/templates/application.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/application.hbs b/ambari-web/app/templates/application.hbs
index bf123dd..7fc2606 100644
--- a/ambari-web/app/templates/application.hbs
+++ b/ambari-web/app/templates/application.hbs
@@ -44,6 +44,14 @@
                   {{allAlertsCount}} {{pluralize allAlertsCount singular="alert" plural="alerts"}}</span>
                 {{/if}}
               {{/with}}
+              {{#if App.upgradeInProgress}}
+                <span class="label upgrade-in-progress" {{action "openUpgradeDialog" target="App.router.mainAdminStackAndUpgradeController"}}>
+                  <i class="icon-cog"></i> {{t app.upgrade.inProgress}}</span>
+              {{/if}}
+              {{#if App.upgradeHolding}}
+                <span class="label upgrade-holding" {{action "openUpgradeDialog" target="App.router.mainAdminStackAndUpgradeController"}}>
+                  <i class="icon-pause"></i> {{t app.upgrade.holding}}</span>
+              {{/if}}
             </a>
           {{else}}
             <a class="logo"><img src="/img/logo-white.png" alt="Apache Ambari" title="Apache Ambari"></a>

http://git-wip-us.apache.org/repos/asf/ambari/blob/c1fd867e/ambari-web/test/controllers/global/background_operations_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/global/background_operations_test.js b/ambari-web/test/controllers/global/background_operations_test.js
index 5207040..51925b7 100644
--- a/ambari-web/test/controllers/global/background_operations_test.js
+++ b/ambari-web/test/controllers/global/background_operations_test.js
@@ -153,6 +153,25 @@ describe('App.BackgroundOperationsController', function () {
     });
   });
 
+  describe('#isUpgradeRequest', function() {
+
+    it('defines if request is upgrade task (true)', function() {
+      expect(controller.isUpgradeRequest({Requests: {request_context: "upgrading"}})).to.be.true;
+    });
+
+    it('defines if request is upgrade task (true - with uppercase)', function() {
+      expect(controller.isUpgradeRequest({Requests: {request_context: "UPGRADING"}})).to.be.true;
+    });
+
+    it('defines if request is upgrade task (false)', function() {
+      expect(controller.isUpgradeRequest({Requests: {request_context: "install"}})).to.be.false;
+    });
+
+    it('defines if request is upgrade task (false - invalid param)', function() {
+      expect(controller.isUpgradeRequest({Requests: {}})).to.be.false;
+    });
+  });
+
   describe('#callBackForMostRecent()', function () {
     it('No requests exists', function () {
       var data = {
@@ -184,6 +203,21 @@ describe('App.BackgroundOperationsController', function () {
       expect(controller.get("services").mapProperty('id')).to.eql([1]);
     });
 
+    it('One request that is excluded', function () {
+      var data = {
+        items: [
+          {
+            Requests: {
+              id: 1,
+              request_context: 'upgrading'
+            }
+          }
+        ]
+      };
+      controller.callBackForMostRecent(data);
+      expect(controller.get("allOperationsCount")).to.equal(0);
+      expect(controller.get("services").mapProperty('id')).to.eql([]);
+    });
 
     it('One running request', function () {
       var data = {


[2/2] ambari git commit: AMBARI-9058 Rolling Upgrade UI allows "Ignore and Process" when upgrade item is not skippable. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-9058 Rolling Upgrade UI allows "Ignore and Process" when upgrade item is not skippable. (ababiichuk)


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

Branch: refs/heads/trunk
Commit: 39aeeb0eee77cf6ec01cc681cf26fdc9ddea4522
Parents: 01b8640
Author: aBabiichuk <ab...@cybervisiontech.com>
Authored: Fri Jan 9 15:01:03 2015 +0200
Committer: aBabiichuk <ab...@cybervisiontech.com>
Committed: Fri Jan 9 15:41:00 2015 +0200

----------------------------------------------------------------------
 .../app/assets/data/stack_versions/upgrade.json     |  4 ++--
 ambari-web/app/messages.js                          |  1 +
 .../admin/stack_upgrade/stack_upgrade_wizard.hbs    |  6 +++++-
 .../main/admin/stack_upgrade/upgrade_wizard_view.js | 16 ++++++++++++++++
 .../admin/stack_upgrade/upgrade_wizard_view_test.js | 13 +++++++++++++
 5 files changed, 37 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/39aeeb0e/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
index d4dfc95..a8cecc3 100644
--- a/ambari-web/app/assets/data/stack_versions/upgrade.json
+++ b/ambari-web/app/assets/data/stack_versions/upgrade.json
@@ -15,7 +15,7 @@
     "queued_task_count" : 0,
     "request_context" : "Upgrading to 2.2.1.0-2191",
     "request_id" : 26,
-    "request_status" : "FAILED",
+    "request_status" : "IN_PROGRESS",
     "resource_filters" : [ ],
     "start_time" : 1420802576700,
     "task_count" : 21,
@@ -355,7 +355,7 @@
             "skippable" : false,
             "stage_id" : 10,
             "start_time" : 1420803704259,
-            "status" : "IN_PROGRESS"
+            "status" : "HOLDING_FAILED"
           },
           "tasks" : [
             {

http://git-wip-us.apache.org/repos/asf/ambari/blob/39aeeb0e/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 3fb544e..947110e 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -1335,6 +1335,7 @@ Em.I18n.translations = {
   'admin.stackUpgrade.dialog.operationFailed': "This operation failed.",
   'admin.stackUpgrade.dialog.stop': "Stop Upgrade",
   'admin.stackUpgrade.dialog.continue': "Ignore and Proceed",
+  'admin.stackUpgrade.dialog.cancel': "Cancel Upgrade",
   'admin.stackUpgrade.dialog.inProgress': "Now Running:",
   'admin.stackUpgrade.dialog.keepRunning': "Keep running Upgrade in background",
   'admin.stackUpgrade.dialog.failed': "Failed on:",

http://git-wip-us.apache.org/repos/asf/ambari/blob/39aeeb0e/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 d90eeb9..bca7dc8 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
@@ -64,7 +64,11 @@
             </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>
+                {{#if view.isSkipable}}
+                  <button class="btn btn-warning" {{action continue view.failedItem target="view"}}>{{t admin.stackUpgrade.dialog.continue}}</button>
+                {{else}}
+                  <button class="btn btn-danger" {{action cancel view.failedItem target="view"}}>{{t admin.stackUpgrade.dialog.cancel}}</button>
+                {{/if}}
                 <button class="btn" {{action retry view.failedItem target="view"}}>{{t common.retry}}</button>
               </div>
             {{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/39aeeb0e/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 e20c465..d4e819c 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
@@ -125,6 +125,14 @@ App.upgradeWizardView = Em.View.extend({
   }.property('failedItem.status'),
 
   /**
+   * indicate whether failed item can be skipped or retried in order to continue Upgrade
+   * @type {boolean}
+   */
+  isSkipable: function () {
+    return this.get('failedItem.skippable');
+  }.property('failedItem.skippable'),
+
+  /**
    * @type {boolean}
    */
   isManualDone: false,
@@ -257,5 +265,13 @@ App.upgradeWizardView = Em.View.extend({
    */
   complete: function (event) {
     this.setUpgradeItemStatus(event.context, 'COMPLETED');
+  },
+
+  /**
+   * set current upgrade item state to FAILED in order to cancel upgrade
+   * @param {object} event
+   */
+  cancel: function (event) {
+    this.setUpgradeItemStatus(event.context, 'FAILED');
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/39aeeb0e/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 fd43233..cba70bd 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
@@ -161,6 +161,19 @@ describe('App.upgradeWizardView', function () {
     });
   });
 
+  describe("#cancel()", function () {
+    before(function () {
+      sinon.stub(view, 'setUpgradeItemStatus', Em.K);
+    });
+    after(function () {
+      view.setUpgradeItemStatus.restore();
+    });
+    it("cabcel request", function () {
+      view.cancel({context: Em.Object.create({'status': 'HOLDING_FAILED'})});
+      expect(view.setUpgradeItemStatus.calledWith(Em.Object.create({'status': 'HOLDING_FAILED'}), 'FAILED')).to.be.true;
+    });
+  });
+
   describe("#setUpgradeItemStatus()", function () {
     before(function () {
       sinon.stub(App.ajax, 'send', function () {