You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jg...@apache.org on 2018/05/16 16:38:01 UTC

[ambari] 01/02: Removed "Stack and Versions" view and a lot of related code that is no longer needed.

This is an automated email from the ASF dual-hosted git repository.

jgolieb pushed a commit to branch branch-feature-AMBARI-14714
in repository https://gitbox.apache.org/repos/asf/ambari.git

commit 4587fc6cd38a215335063c7a473e810a47f42c32
Author: Jason Golieb <jg...@hortonworks.com>
AuthorDate: Tue May 15 14:36:05 2018 -0700

    Removed "Stack and Versions" view and a lot of related code that is no longer needed.
---
 ambari-web/app/app.js                              |  112 +-
 ambari-web/app/controllers.js                      |    1 -
 ambari-web/app/controllers/application.js          |   34 -
 .../app/controllers/global/cluster_controller.js   |   55 -
 .../app/controllers/global/update_controller.js    |    1 -
 .../highAvailability/progress_popup_controller.js  |    3 -
 .../main/admin/stack_and_upgrade_controller.js     | 2226 ------------
 ambari-web/app/data/controller_route.js            |    4 -
 ambari-web/app/mappers.js                          |    3 +-
 .../app/mappers/socket/upgrade_state_mapper.js     |   42 -
 ambari-web/app/router.js                           |   12 +-
 ambari-web/app/routes/main.js                      |   70 -
 ambari-web/app/routes/stack_upgrade_routes.js      |   95 -
 ambari-web/app/templates/application.hbs           |   26 -
 .../app/templates/main/admin/stack_and_upgrade.hbs |   22 -
 .../main/admin/stack_upgrade/services.hbs          |  123 -
 .../admin/stack_upgrade/stack_upgrade_wizard.hbs   |  340 --
 .../stack_upgrade/upgrade_configs_merge_table.hbs  |    2 +-
 .../upgrade_configs_recommend_table.hbs            |    2 +-
 .../admin/stack_upgrade/upgrade_version_box.hbs    |  116 -
 .../admin/stack_upgrade/upgrade_version_column.hbs |  121 -
 .../main/admin/stack_upgrade/versions.hbs          |   71 -
 .../app/templates/main/host/stack_versions.hbs     |   10 +-
 ambari-web/app/utils/ajax/ajax.js                  |   41 -
 ambari-web/app/views.js                            |    7 -
 .../common/modal_popups/cluster_check_popup.js     |   38 +-
 ambari-web/app/views/main/admin.js                 |    7 -
 .../app/views/main/admin/stack_and_upgrade_view.js |   24 -
 .../views/main/admin/stack_upgrade/menu_view.js    |   70 -
 .../main/admin/stack_upgrade/services_view.js      |  146 -
 .../stack_upgrade/upgrade_version_box_view.js      |  635 ----
 .../stack_upgrade/upgrade_version_column_view.js   |  120 -
 .../admin/stack_upgrade/upgrade_wizard_view.js     |  520 ---
 .../main/admin/stack_upgrade/versions_view.js      |  254 --
 .../app/views/main/host/stack_versions_view.js     |    7 -
 ambari-web/app/views/main/menu.js                  |    8 -
 ambari-web/test/app_test.js                        |  176 -
 .../controllers/global/cluster_controller_test.js  |  152 -
 .../controllers/global/update_controller_test.js   |    1 -
 .../progress_popup_controller_test.js              |    6 -
 .../admin/stack_and_upgrade_controller_test.js     | 3606 --------------------
 .../mappers/socket/upgrade_state_mapper_test.js    |   80 -
 .../main/admin/stack_upgrade/menu_view_test.js     |   59 -
 .../main/admin/stack_upgrade/services_view_test.js |   91 -
 .../stack_upgrade/upgrade_version_box_view_test.js | 1552 ---------
 .../upgrade_version_column_view_test.js            |  193 --
 .../stack_upgrade/upgrade_wizard_view_test.js      |  956 ------
 .../main/admin/stack_upgrade/version_view_test.js  |  604 ----
 48 files changed, 59 insertions(+), 12785 deletions(-)

diff --git a/ambari-web/app/app.js b/ambari-web/app/app.js
index 0dc9ca9..9614e28 100644
--- a/ambari-web/app/app.js
+++ b/ambari-web/app/app.js
@@ -45,7 +45,7 @@ module.exports = Em.Application.create({
   isClusterUser: false,
   isPermissionDataLoaded: false,
   auth: undefined,
-  isOnlyViewUser: function() {
+  isOnlyViewUser: function () {
     return App.auth && (App.auth.length == 0 || (App.isAuthorized('VIEW.USE') && App.auth.length == 1));
   }.property('auth'),
 
@@ -62,102 +62,20 @@ module.exports = Em.Application.create({
   isKerberosEnabled: false,
 
   /**
-   * state of stack upgrade process
-   * states:
-   *  - NOT_REQUIRED
-   *  - PENDING
-   *  - IN_PROGRESS
-   *  - HOLDING
-   *  - COMPLETED
-   *  - ABORTED
-   *  - HOLDING_FAILED
-   *  - HOLDING_TIMEDOUT
-   * @type {String}
-   */
-  upgradeState: 'NOT_REQUIRED',
-
-  /**
-   * Check if upgrade is in INIT state
-   * 'INIT' is set on upgrade start and when it's finished
-   * @type {boolean}
-   */
-  upgradeInit: Em.computed.equal('upgradeState', 'NOT_REQUIRED'),
-
-  /**
-   * flag is true when upgrade process is running
-   * @returns {boolean}
-   */
-  upgradeInProgress: Em.computed.equal('upgradeState', 'IN_PROGRESS'),
-
-  /**
-   * Checks if update process is completed
-   * @type {boolean}
-   */
-  upgradeCompleted: Em.computed.equal('upgradeState', 'COMPLETED'),
-
-  /**
-   * flag is true when upgrade process is waiting for user action
-   * to proceed, retry, perform manual steps etc.
-   * @returns {boolean}
-   */
-  upgradeHolding: function() {
-    return this.get('upgradeState').contains("HOLDING") || this.get('upgradeAborted');
-  }.property('upgradeState', 'upgradeAborted'),
-
-  /**
-   * flag is true when upgrade process is aborted
-   * SHOULD behave similar to HOLDING_FAILED state
-   * @returns {boolean}
-   */
-  upgradeAborted: function () {
-    return this.get('upgradeState') === "ABORTED" && !App.router.get('mainAdminStackAndUpgradeController.isSuspended');
-  }.property('upgradeState', 'router.mainAdminStackAndUpgradeController.isSuspended'),
-
-  /**
-   * flag is true when upgrade process is suspended
-   * @returns {boolean}
-   */
-  upgradeSuspended: function () {
-    return this.get('upgradeState') === "ABORTED" && App.router.get('mainAdminStackAndUpgradeController.isSuspended');
-  }.property('upgradeState', 'router.mainAdminStackAndUpgradeController.isSuspended'),
-
-  /**
-   * RU is running
-   * @type {boolean}
-   */
-  upgradeIsRunning: Em.computed.or('upgradeInProgress', 'upgradeHolding'),
-
-  /**
-   * flag is true when upgrade process is running or suspended
-   * or wizard used by another user
-   * @returns {boolean}
-   */
-  wizardIsNotFinished: function () {
-    return this.get('upgradeIsRunning') ||
-           this.get('upgradeSuspended') ||
-           App.router.get('wizardWatcherController.isNonWizardUser');
-  }.property('upgradeIsRunning', 'upgradeAborted', 'router.wizardWatcherController.isNonWizardUser', 'upgradeSuspended'),
-
-  /**
    * @param {string} authRoles
    * @returns {boolean}
    */
   havePermissions: function (authRoles) {
     var result = false;
-    authRoles = $.map(authRoles.split(","), $.trim);
-
-    // When Upgrade running(not suspended) only operations related to upgrade should be allowed
-    if ((!this.get('upgradeSuspended') && !authRoles.contains('CLUSTER.UPGRADE_DOWNGRADE_STACK')) &&
-      !App.get('supports.opsDuringRollingUpgrade') &&
-      !['NOT_REQUIRED', 'COMPLETED'].contains(this.get('upgradeState')) ||
-      !App.auth){
-      return false;
-    }
 
-    authRoles.forEach(function (auth) {
-      result = result || App.auth.contains(auth);
-    });
+    if (App.auth) {
+      authRoles = $.map(authRoles.split(","), $.trim);
 
+      authRoles.forEach(function (auth) {
+        result = result || App.auth.contains(auth);
+      });
+    }
+    
     return result;
   },
   /**
@@ -174,7 +92,7 @@ module.exports = Em.Application.create({
    */
   stackVersionURL: function () {
     return '/stacks/{0}/versions/{1}'.format(this.get('currentStackName') || 'HDP', this.get('currentStackVersionNumber'));
-  }.property('currentStackName','currentStackVersionNumber'),
+  }.property('currentStackName', 'currentStackVersionNumber'),
 
   falconServerURL: function () {
     var falconService = this.Service.find().findProperty('serviceName', 'FALCON');
@@ -188,7 +106,7 @@ module.exports = Em.Application.create({
    * Because this value is retrieved from the cardinality of the component, it is safe to keep in app.js
    * since its value will not change during the lifetime of the application.
    */
-  doesATSSupportKerberos: function() {
+  doesATSSupportKerberos: function () {
     var YARNService = App.StackServiceComponent.find().filterProperty('serviceName', 'YARN');
     if (YARNService.length) {
       var ATS = App.StackServiceComponent.find().findProperty('componentName', 'APP_TIMELINE_SERVER');
@@ -201,7 +119,7 @@ module.exports = Em.Application.create({
   clusterName: null,
   clockDistance: null, // server clock - client clock
   currentStackVersion: '',
-  currentStackName: function() {
+  currentStackName: function () {
     return Em.get((this.get('currentStackVersion') || this.get('defaultStackVersion')).match(/(.+)-\d.+/), '1');
   }.property('currentStackVersion', 'defaultStackVersion'),
 
@@ -260,7 +178,7 @@ module.exports = Em.Application.create({
    */
   isRMHaEnabled: function () {
     var result = false;
-    var rmStackComponent = App.StackServiceComponent.find().findProperty('componentName','RESOURCEMANAGER');
+    var rmStackComponent = App.StackServiceComponent.find().findProperty('componentName', 'RESOURCEMANAGER');
     if (rmStackComponent && rmStackComponent.get('isMultipleAllowed')) {
       result = this.HostComponent.find().filterProperty('componentName', 'RESOURCEMANAGER').length > 1;
     }
@@ -275,7 +193,7 @@ module.exports = Em.Application.create({
    */
   isRAHaEnabled: function () {
     var result = false;
-    var raStackComponent = App.StackServiceComponent.find().findProperty('componentName','RANGER_ADMIN');
+    var raStackComponent = App.StackServiceComponent.find().findProperty('componentName', 'RANGER_ADMIN');
     if (raStackComponent && raStackComponent.get('isMultipleAllowed')) {
       result = App.HostComponent.find().filterProperty('componentName', 'RANGER_ADMIN').length > 1;
     }
@@ -326,11 +244,11 @@ module.exports = Em.Application.create({
       return App.StackService.find().filterProperty('isServiceMetricsService').mapProperty('serviceName');
     }.property('App.router.clusterController.isLoaded'),
 
-    supportsServiceCheck: function() {
+    supportsServiceCheck: function () {
       return App.StackService.find().filterProperty('serviceCheckSupported').mapProperty('serviceName');
     }.property('App.router.clusterController.isLoaded'),
 
-    supportsDeleteViaUI: function() {
+    supportsDeleteViaUI: function () {
       return App.StackService.find().filterProperty('supportDeleteViaUi').mapProperty('serviceName');
     }.property('App.router.clusterController.isLoaded')
   }),
diff --git a/ambari-web/app/controllers.js b/ambari-web/app/controllers.js
index 7f1b494..7e5b046 100644
--- a/ambari-web/app/controllers.js
+++ b/ambari-web/app/controllers.js
@@ -89,7 +89,6 @@ require('controllers/main/admin/highAvailability/journalNode/step5_controller');
 require('controllers/main/admin/highAvailability/journalNode/step6_controller');
 require('controllers/main/admin/highAvailability/journalNode/step7_controller');
 require('controllers/main/admin/highAvailability/journalNode/step8_controller');
-require('controllers/main/admin/stack_and_upgrade_controller');
 require('controllers/main/admin/stack_upgrade_history_controller');
 require('controllers/main/admin/serviceGroups_controller');
 require('controllers/main/admin/serviceAccounts_controller');
diff --git a/ambari-web/app/controllers/application.js b/ambari-web/app/controllers/application.js
index d813d89..b36e529 100644
--- a/ambari-web/app/controllers/application.js
+++ b/ambari-web/app/controllers/application.js
@@ -74,40 +74,6 @@ App.ApplicationController = Em.Controller.extend(App.Persist, {
    */
   showUpgradeLabel: Em.computed.or('App.upgradeInProgress', 'App.upgradeHolding', 'App.upgradeSuspended'),
 
-  /**
-   * @return {{msg: string, cls: string, icon: string}}
-   */
-  upgradeMap: function () {
-    var upgradeInProgress = App.get('upgradeInProgress');
-    var upgradeHolding = App.get('upgradeHolding');
-    var upgradeSuspended = App.get('upgradeSuspended');
-    var isDowngrade = App.router.get('mainAdminStackAndUpgradeController.isDowngrade');
-    var typeSuffix = isDowngrade ? 'downgrade' : 'upgrade';
-    var hasUpgradePrivilege = App.isAuthorized('CLUSTER.UPGRADE_DOWNGRADE_STACK');
-    if (upgradeInProgress) {
-      return {
-        cls: hasUpgradePrivilege? 'upgrade-in-progress' : 'upgrade-in-progress not-allowed-cursor',
-        icon: 'glyphicon-cog',
-        msg: Em.I18n.t('admin.stackVersions.version.' + typeSuffix + '.running')
-      }
-    }
-    if (upgradeHolding) {
-      return {
-        cls: hasUpgradePrivilege? 'upgrade-holding' : 'upgrade-holding not-allowed-cursor',
-        icon: 'glyphicon-pause',
-        msg: Em.I18n.t('admin.stackVersions.version.' + typeSuffix + '.pause')
-      }
-    }
-    if (upgradeSuspended) {
-      return {
-        cls: hasUpgradePrivilege? 'upgrade-aborted' : 'upgrade-aborted not-allowed-cursor',
-        icon: 'glyphicon-pause',
-        msg: Em.I18n.t('admin.stackVersions.version.' + typeSuffix + '.suspended')
-      }
-    }
-    return {};
-  }.property('App.upgradeInProgress', 'App.upgradeHolding', 'App.upgradeSuspended', 'App.router.mainAdminStackAndUpgradeController.isDowngrade'),
-
   startKeepAlivePoller: function() {
     if (!this.get('isPollerRunning')) {
      this.set('isPollerRunning',true);
diff --git a/ambari-web/app/controllers/global/cluster_controller.js b/ambari-web/app/controllers/global/cluster_controller.js
index e0122f2..0763ab7 100644
--- a/ambari-web/app/controllers/global/cluster_controller.js
+++ b/ambari-web/app/controllers/global/cluster_controller.js
@@ -182,7 +182,6 @@ App.ClusterController = Em.Controller.extend(App.ReloadPopupMixin, {
     hostsController.updateStatusCounters();
 
     this.loadClusterInfo();
-    this.restoreUpgradeState();
     App.router.get('wizardWatcherController').getUser();
 
     this.loadClusterDataToModel();
@@ -309,60 +308,6 @@ App.ClusterController = Em.Controller.extend(App.ReloadPopupMixin, {
     });
   },
 
-  /**
-   * restore upgrade status from server
-   * and make call to get latest status from server
-   * Also loading all upgrades to App.StackUpgradeHistory model
-   */
-  restoreUpgradeState: function () {
-    var self = this;
-    return this.getAllUpgrades().done(function (data) {
-      var upgradeController = App.router.get('mainAdminStackAndUpgradeController');
-      var allUpgrades = data.items.sortProperty('Upgrade.request_id');
-      var lastUpgradeData = allUpgrades.pop();
-      if (lastUpgradeData){
-        var status = lastUpgradeData.Upgrade.request_status;
-        var lastUpgradeNotFinished = (self.isSuspendedState(status) || self.isRunningState(status));
-        if (lastUpgradeNotFinished){
-          /**
-           * No need to display history if there is only one running or suspended upgrade.
-           * Because UI still needs to provide user the option to resume the upgrade via the Upgrade Wizard UI.
-           * If there is more than one upgrade. Show/Hive the tab based on the status.
-           */
-          var hasFinishedUpgrades = allUpgrades.some(function (item) {
-            var status = item.Upgrade.request_status;
-            if (!self.isRunningState(status)){
-              return true;
-            }
-          }, self);
-          App.set('upgradeHistoryAvailable', hasFinishedUpgrades);
-        } else {
-          //There is at least one finished upgrade. Display it.
-          App.set('upgradeHistoryAvailable', true);
-        }
-      } else {
-        //There is no upgrades at all.
-        App.set('upgradeHistoryAvailable', false);
-      }
-
-      //completed upgrade shouldn't be restored
-      if (lastUpgradeData) {
-        if (lastUpgradeData.Upgrade.request_status !== "COMPLETED") {
-          upgradeController.restoreLastUpgrade(lastUpgradeData);
-        }
-      } else {
-        upgradeController.initDBProperties();
-      }
-
-      App.stackUpgradeHistoryMapper.map(data);
-      upgradeController.loadStackVersionsToModel(true).done(function () {
-        upgradeController.loadCompatibleVersions();
-        upgradeController.updateCurrentStackVersion();
-        App.set('stackVersionsAvailable', App.StackVersion.find().content.length > 0);
-      });
-    });
-  },
-
   isRunningState: function(status){
     if (status) {
       return "IN_PROGRESS" === status || "PENDING" === status || status.contains("HOLDING");
diff --git a/ambari-web/app/controllers/global/update_controller.js b/ambari-web/app/controllers/global/update_controller.js
index 14cd3cc..5f38eef 100644
--- a/ambari-web/app/controllers/global/update_controller.js
+++ b/ambari-web/app/controllers/global/update_controller.js
@@ -209,7 +209,6 @@ App.UpdateController = Em.Controller.extend({
     App.StompClient.subscribe('/events/hosts', App.hostStateMapper.map.bind(App.hostStateMapper));
     App.StompClient.subscribe('/events/alert_definitions', App.alertDefinitionsMapperAdapter.map.bind(App.alertDefinitionsMapperAdapter));
     App.StompClient.subscribe('/events/alert_group', App.alertGroupsMapperAdapter.map.bind(App.alertGroupsMapperAdapter));
-    App.StompClient.subscribe('/events/upgrade', App.upgradeStateMapper.map.bind(App.upgradeStateMapper));
   },
 
   /**
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/progress_popup_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/progress_popup_controller.js
index 9d8f33e..133ae41 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/progress_popup_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/progress_popup_controller.js
@@ -160,9 +160,6 @@ App.HighAvailabilityProgressPopupController = Ember.Controller.extend({
       this.calculateHostsData(hostsData);
       App.HostPopup.initPopup(popupTitle, this, false, this.get("requestIds")[0]);
       if (this.isRequestRunning(hostsData)) {
-        if (this.get('progressController.name') === 'mainAdminStackAndUpgradeController') {
-          this.doPolling();
-        }
         this.addObserver('progressController.logs.length', this, 'getDataFromProgressController');
       }
     }
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
deleted file mode 100644
index 50c0902..0000000
--- a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
+++ /dev/null
@@ -1,2226 +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');
-var stringUtils = require('utils/string_utils');
-
-App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage, {
-  name: 'mainAdminStackAndUpgradeController',
-
-  /**
-   * @type {boolean}
-   */
-  isLoaded: false,
-
-  /**
-   * @type {object}
-   * @default null
-   */
-  upgradeData: null,
-
-  /**
-   * @type {number}
-   * @default null
-   */
-  upgradeId: null,
-
-  /**
-   * Start version of upgrade
-   * @type {string}
-   * @default null
-   */
-  fromVersion: null,
-
-  /**
-   * @type {string}
-   * @default null
-   */
-  upgradeVersion: null,
-
-  /**
-   * @type {string}
-   * @default null
-   */
-  upgradeType: null,
-
-  /**
-   * @type {Em.Object}
-   */
-  upgradeTypeConfig: Em.computed.findByKey('upgradeMethods', 'type', 'upgradeType'),
-
-  /**
-   * @type {boolean}
-   */
-  cantBeStarted: Em.computed.alias('upgradeTypeConfig.cantBeStarted'),
-
-  /**
-   * @type {boolean}
-   */
-  showPauseButton: Em.computed.and('!App.upgradeSuspended', '!App.upgradeCompleted', '!App.upgradeInit'),
-
-  /**
-   * @type {boolean}
-   * @default true
-   */
-  downgradeAllowed: true,
-
-  /**
-   * @type {string}
-   * @default null
-   */
-  upgradeTypeDisplayName: null,
-
-  /**
-   * @type {object}
-   * @default null
-   */
-  failuresTolerance: null,
-
-  /**
-   * @type {boolean}
-   * @default false
-   */
-  isDowngrade: false,
-
-  /**
-   * flag which indicate that upgrade suspended
-   * @type {boolean}
-   * @default false
-   */
-  isSuspended: false,
-
-  /**
-   * version that currently applied to server
-   * should be plain object, because stored to localStorage
-   * @type {object|null}
-   */
-  currentVersion: null,
-
-  /**
-   * versions to which cluster could be upgraded
-   * @type {Array}
-   */
-  targetVersions: [],
-
-  /**
-   * @type {object}
-   * @default null
-   */
-  slaveComponentStructuredInfo: null,
-
-  /**
-   * @type {Array}
-   */
-  serviceCheckFailuresServicenames: [],
-
-  /**
-   * @type {boolean}
-   * @default false
-   */
-  isUpgradeTypesLoaded: false,
-
-  /**
-   * @type {string}
-   */
-  getSupportedUpgradeError: '',
-
-  /**
-   * Restricted type of upgrade, can't be viewed in wizard.
-   * It's status visible only in upgrade status label
-   * @type {boolean}
-   * @default false
-   */
-  isWizardRestricted: false,
-
-  /**
-   * @type {string}
-   */
-  wizardModalTitle: function () {
-    var repoVersion = App.RepositoryVersion.find().findProperty('repositoryVersion', this.get('toVersion'));
-    return this.getUpgradeDowngradeHeader(
-      this.get('upgradeTypeDisplayName'),
-      this.get('upgradeVersion'),
-      this.get('isDowngrade'),
-      repoVersion
-    );
-  }.property('upgradeTypeDisplayName', 'upgradeVersion', 'isDowngrade'),
-
-
-  /**
-   * @param {string} upgradeType
-   * @param {string} upgradeVersion
-   * @param {boolean} isDowngrade
-   * @param {boolean} isPatch
-   * @returns {string}
-   */
-  getUpgradeDowngradeHeader: function(upgradeType, upgradeVersion, isDowngrade, repoVersion) {
-    if (isDowngrade) {
-      return Em.I18n.t('admin.stackUpgrade.dialog.downgrade.header').format(upgradeVersion);
-    }
-    if (repoVersion && repoVersion.get('isPatch')) {
-      return Em.I18n.t('admin.stackUpgrade.dialog.upgrade.patch.header').format(upgradeType, upgradeVersion);
-    }
-    if (repoVersion && repoVersion.get('isMaint')) {
-      return Em.I18n.t('admin.stackUpgrade.dialog.upgrade.maint.header').format(upgradeType, upgradeVersion);
-    }
-    return Em.I18n.t('admin.stackUpgrade.dialog.upgrade.header').format(upgradeType, upgradeVersion);
-  },
-
-  /**
-   * methods through which cluster could be upgraded, "allowed" indicated if the method is allowed
-   * by stack upgrade path
-   * @type {Array}
-   */
-  upgradeMethods: [
-    Em.Object.create({
-      displayName: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.RU.title'),
-      type: 'ROLLING',
-      icon: "glyphicon glyphicon-dashboard",
-      description: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.RU.description'),
-      selected: false,
-      allowed: true,
-      isCheckComplete: false,
-      isCheckRequestInProgress: false,
-      precheckResultsMessage: '',
-      precheckResultsTitle: '',
-      action: '',
-      isWizardRestricted: false
-    }),
-    Em.Object.create({
-      displayName: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.EU.title'),
-      type: 'NON_ROLLING',
-      icon: "icon-bolt",
-      description: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.EU.description'),
-      selected: false,
-      allowed: true,
-      isCheckComplete: false,
-      isCheckRequestInProgress: false,
-      precheckResultsMessage: '',
-      precheckResultsTitle: '',
-      action: '',
-      isWizardRestricted: false
-    }),
-    Em.Object.create({
-      displayName: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.HOU.title'),
-      type: 'HOST_ORDERED',
-      icon: "icon-bolt",
-      description: '',
-      selected: false,
-      allowed: false,
-      isCheckComplete: false,
-      isCheckRequestInProgress: false,
-      precheckResultsMessage: '',
-      precheckResultsTitle: '',
-      action: '',
-      isWizardRestricted: !App.supports.enabledWizardForHostOrderedUpgrade,
-      cantBeStarted: true
-    })
-  ],
-
-  /**
-   * pre-check messages map
-   * @type {object}
-   */
-  preCheckMessages: {
-    'WARNING': {
-      template: 'admin.stackUpgrade.preCheck.warning.message',
-      precheckResultsMessageClass: 'ORANGE',
-      isPrecheckFailed: false,
-      precheckResultsMessageIconClass: 'glyphicon glyphicon-warning-sign'
-    },
-    'BYPASS': {
-      template: 'admin.stackUpgrade.preCheck.bypass.message',
-      precheckResultsMessageClass: 'RED',
-      isPrecheckFailed: false,
-      precheckResultsMessageIconClass: 'glyphicon glyphicon-remove',
-      bypassedFailures: true
-    },
-    'FAIL': {
-      template: 'admin.stackUpgrade.preCheck.fail.message',
-      precheckResultsMessageClass: 'RED',
-      isPrecheckFailed: true,
-      precheckResultsMessageIconClass: 'glyphicon glyphicon-remove'
-    }
-  },
-
-  runningCheckRequests: [],
-
-  /**
-   * @type {boolean} true if some request that should disable actions is in progress
-   */
-  requestInProgress: false,
-
-  /**
-   * @type {number} repo id, request for which is currently in progress
-   */
-  requestInProgressRepoId: null,
-
-  /**
-   * @type {boolean} true while no updated upgrade info is loaded after retry
-   */
-  isRetryPending: false,
-
-  /**
-   * properties that stored to localStorage to resume wizard progress
-   */
-  wizardStorageProperties: [
-    'fromVersion',
-    'upgradeId',
-    'upgradeVersion',
-    'toVersion',
-    'currentVersion',
-    'upgradeTypeDisplayName',
-    'upgradeType',
-    'failuresTolerance',
-    'isDowngrade',
-    'downgradeAllowed',
-    'isSuspended',
-    'isWizardRestricted'
-  ],
-
-  /**
-   * mutable properties of Upgrade Task
-   * @type {Array}
-   */
-  taskDetailsProperties: ['status', 'stdout', 'stderr', 'error_log', 'host_name', 'output_log'],
-
-  /**
-   * Context for Finalize item
-   * @type {string}
-   */
-  finalizeContext: 'Confirm Finalize',
-
-  /**
-   * Context for Slave component failures manual item
-   * @type {string}
-   */
-  slaveFailuresContext: "Check Component Versions",
-
-  /**
-   * Context for Service check (may include slave component) failures manual item
-   * @type {string}
-   */
-  serviceCheckFailuresContext: "Verifying Skipped Failures",
-
-  /**
-   * Check if current item is Finalize
-   * @type {boolean}
-   */
-  isFinalizeItem: false,
-
-  isLoadUpgradeDataPending: false,
-
-  /**
-   * path to the mock json
-   * @type {String}
-   */
-  mockRepoUrl: '/data/stack_versions/repo_versions_all.json',
-
-  /**
-   * api to get RepoVersions
-   * @type {String}
-   */
-  realRepoUrl: function () {
-    return App.get('apiPrefix') + '/stacks?fields=versions/repository_versions/RepositoryVersions,' +
-      'versions/repository_versions/operating_systems/*,versions/repository_versions/operating_systems/repositories/*';
-  }.property('App.stackVersionURL'),
-
-  /**
-   * path to the mock json
-   * @type {String}
-   */
-  mockStackUrl: '/data/stack_versions/stack_version_all.json',
-
-  /**
-   * api to get ClusterStackVersions with repository_versions (use to init data load)
-   * @type {String}
-   */
-  realStackUrl: function () {
-    return App.get('apiPrefix') + '/clusters/' + App.get('clusterName') +
-      '/stack_versions?fields=*,repository_versions/*,repository_versions/operating_systems/OperatingSystems/*,repository_versions/operating_systems/repositories/*';
-  }.property('App.clusterName'),
-
-  /**
-   * api to get ClusterStackVersions without repository_versions (use to update data)
-   * @type {String}
-   */
-  realUpdateUrl: function () {
-    return App.get('apiPrefix') + '/clusters/' + App.get('clusterName') + '/stack_versions?fields=ClusterStackVersions/*';
-  }.property('App.clusterName'),
-
-  /**
-   * Determines if list of services with checks that failed and were skipped by user during the upgrade is loaded
-   * @type {boolean}
-   */
-  areSkippedServiceChecksLoaded: false,
-
-  /**
-   * List of services with checks that failed and were skipped by user during the upgrade
-   * @type {array}
-   */
-  skippedServiceChecks: [],
-
-  /**
-   * status of tasks/items/groups which should be grayed out and disabled
-   * @type {Array}
-   */
-  nonActiveStates: ['PENDING', 'ABORTED'],
-
-  /**
-   * status of Upgrade request
-   * @type {string}
-   */
-  requestStatus: function () {
-    if (this.get('upgradeData.Upgrade') && App.get('upgradeSuspended')) {
-      return 'SUSPENDED';
-    } else if (this.get('upgradeData.Upgrade')){
-      return this.get('upgradeData.Upgrade.request_status');
-    } else {
-      return 'INIT';
-    }
-  }.property('upgradeData.Upgrade.request_status', 'App.upgradeSuspended'),
-
-  init: function () {
-    this.initDBProperties();
-  },
-
-  /**
-   * restore data from localStorage
-   */
-  initDBProperties: function () {
-    var props = this.getDBProperties(this.get('wizardStorageProperties'));
-    Em.keys(props).forEach(function (k) {
-      if (!Em.isNone(props[k])) {
-        this.set(k, props[k]);
-      }
-    }, this);
-  },
-
-  /**
-   * load all data:
-   * - upgrade data
-   * - stack versions
-   * - repo versions
-   */
-  load: function () {
-    var dfd = $.Deferred();
-    var self = this;
-
-    this.loadStackVersionsToModel(true).done(function () {
-      self.loadRepoVersionsToModel().done(function() {
-        self.loadCompatibleVersions().done(function() {
-          self.updateCurrentStackVersion();
-          dfd.resolve();
-        });
-      });
-    });
-    return dfd.promise();
-  },
-
-  updateCurrentStackVersion: function(){
-    var currentVersion = App.StackVersion.find().findProperty('state', 'CURRENT');
-    if (currentVersion) {
-      this.set('currentVersion', {
-        stack_name: currentVersion.get('repositoryVersion.stackVersionType'),
-        repository_version: currentVersion.get('repositoryVersion.repositoryVersion'),
-        repository_name: currentVersion.get('repositoryVersion.displayName'),
-        id: currentVersion.get('repositoryVersion.id')
-      });
-    }
-  },
-
-  /**
-   * load upgrade tasks by upgrade id
-   * @return {$.Deferred}
-   * @param {boolean} onlyState
-   */
-  loadUpgradeData: function (onlyState) {
-    var upgradeId = this.get('upgradeId'),
-      deferred = $.Deferred(),
-      self = this;
-
-    if (Em.isNone(upgradeId)) {
-      deferred.resolve();
-    } else {
-      this.set('isLoadUpgradeDataPending', true);
-      App.ajax.send({
-        name: (onlyState) ? 'admin.upgrade.state' : 'admin.upgrade.data',
-        sender: this,
-        data: {
-          id: upgradeId
-        },
-        success: 'loadUpgradeDataSuccessCallback'
-      }).then(deferred.resolve).always(function () {
-          self.set('isLoadUpgradeDataPending', false);
-        });
-    }
-    return deferred.promise();
-  },
-
-  /**
-   * parse and push upgrade tasks to controller
-   * @param data
-   */
-  loadUpgradeDataSuccessCallback: function (data) {
-    if (Em.isNone(data)) return;
-    App.set('upgradeState', data.Upgrade.request_status);
-    this.setDBProperty('upgradeState', data.Upgrade.request_status);
-    this.set('isSuspended', data.Upgrade.suspended);
-    this.setDBProperty('isSuspended', data.Upgrade.suspended);
-    if (data.upgrade_groups) {
-      this.updateUpgradeData(data);
-    }
-    if (this.get('isRetryPending') && data.Upgrade.request_status !== 'ABORTED') {
-      this.setProperties({
-        requestInProgress: false,
-        isRetryPending: false
-      });
-    }
-    if (data.Upgrade.request_status === 'COMPLETED') {
-      this.finish();
-    }
-  },
-
-  loadCompatibleVersions: function() {
-    return App.ajax.send({
-      name: 'admin.upgrade.get_compatible_versions',
-      sender: this,
-      data: {
-        stackName: App.get('currentStackName'),
-        stackVersion: App.get('currentStackVersionNumber')
-      },
-      success: 'loadCompatibleVersionsSuccessCallback'
-    });
-  },
-
-  /**
-   *
-   * @param {object} data
-   */
-  loadCompatibleVersionsSuccessCallback: function(data) {
-    App.RepositoryVersion.find().forEach(function(repo) {
-      var version = repo.get('repositoryVersion');
-      repo.set('isCompatible', data.items.someProperty('CompatibleRepositoryVersions.repository_version', version));
-    });
-  },
-
-  /**
-   * update data of Upgrade
-   * @param {object} newData
-   */
-  updateUpgradeData: function (newData) {
-    var oldData = this.get('upgradeData'),
-      nonActiveStates = this.get('nonActiveStates'),
-      groupsMap = {},
-      itemsMap = {};
-
-    if (Em.isNone(oldData) || (newData.upgrade_groups.length !== oldData.upgradeGroups.length)) {
-      this.initUpgradeData(newData);
-    } else {
-      //create entities maps
-      newData.upgrade_groups.forEach(function (newGroup) {
-        groupsMap[newGroup.UpgradeGroup.group_id] = newGroup.UpgradeGroup;
-        newGroup.upgrade_items.forEach(function (item) {
-          itemsMap[item.UpgradeItem.stage_id] = item.UpgradeItem;
-        })
-      });
-
-      //update existed entities with new data
-      oldData.upgradeGroups.forEach(function (oldGroup) {
-        oldGroup.set('status', groupsMap[oldGroup.get('group_id')].status);
-        oldGroup.set('display_status', groupsMap[oldGroup.get('group_id')].display_status);
-        oldGroup.set('progress_percent', groupsMap[oldGroup.get('group_id')].progress_percent);
-        oldGroup.set('completed_task_count', groupsMap[oldGroup.get('group_id')].completed_task_count);
-        oldGroup.upgradeItems.forEach(function (item) {
-          item.set('status', itemsMap[item.get('stage_id')].status);
-          item.set('display_status', itemsMap[item.get('stage_id')].display_status);
-          item.set('progress_percent', itemsMap[item.get('stage_id')].progress_percent);
-        });
-        var hasExpandableItems = oldGroup.upgradeItems.some(function (item) {
-          return !nonActiveStates.contains(item.get('status'));
-        });
-        oldGroup.set('hasExpandableItems', hasExpandableItems);
-      });
-      oldData.set('Upgrade', newData.Upgrade);
-    }
-  },
-
-  /**
-   * change structure of Upgrade
-   * In order to maintain nested views in template object should have direct link to its properties, for example
-   * item.UpgradeItem.<properties> -> item.<properties>
-   * @param {object} newData
-   */
-  initUpgradeData: function (newData) {
-    var upgradeGroups = [],
-      nonActiveStates = this.get('nonActiveStates');
-
-    //wrap all entities into App.upgradeEntity
-    newData.upgrade_groups.forEach(function (newGroup) {
-      var hasExpandableItems = newGroup.upgrade_items.some(function (item) {
-          return !nonActiveStates.contains(item.UpgradeItem.status);
-        }),
-        oldGroup = App.upgradeEntity.create({type: 'GROUP', hasExpandableItems: hasExpandableItems}, newGroup.UpgradeGroup),
-        upgradeItems = [];
-      newGroup.upgrade_items.forEach(function (item) {
-        var oldItem = App.upgradeEntity.create({type: 'ITEM'}, item.UpgradeItem);
-        this.formatMessages(oldItem);
-        oldItem.set('tasks', []);
-        upgradeItems.pushObject(oldItem);
-      }, this);
-      upgradeItems.reverse();
-      oldGroup.set('upgradeItems', upgradeItems);
-      upgradeGroups.pushObject(oldGroup);
-    }, this);
-    upgradeGroups.reverse();
-    this.set('upgradeData', Em.Object.create({
-      upgradeGroups: upgradeGroups,
-      Upgrade: newData.Upgrade
-    }));
-    this.set('downgradeAllowed', newData.Upgrade.downgrade_allowed);
-    this.setDBProperty('downgradeAllowed', newData.Upgrade.downgrade_allowed);
-  },
-
-  /**
-   * format upgrade item text
-   * @param {App.upgradeEntity} oldItem
-   */
-  formatMessages: function (oldItem) {
-    var text = oldItem.get('text');
-    var messages = [];
-
-    try {
-      var messageArray = JSON.parse(text);
-      for (var i = 0; i < messageArray.length; i++) {
-        messages.push(messageArray[i].message);
-      }
-      oldItem.set('text', messages.join(' '));
-    } catch (err) {
-      console.warn('Upgrade Item has malformed text');
-    }
-    oldItem.set('messages', messages);
-  },
-
-  /**
-   * request Upgrade Item and its tasks from server
-   * @param {Em.Object} item
-   * @param {Function} customCallback
-   * @return {$.ajax}
-   */
-  getUpgradeItem: function (item, customCallback) {
-    return App.ajax.send({
-      name: 'admin.upgrade.upgrade_item',
-      sender: this,
-      data: {
-        upgradeId: item.get('request_id'),
-        groupId: item.get('group_id'),
-        stageId: item.get('stage_id')
-      },
-      success: customCallback || 'getUpgradeItemSuccessCallback'
-    });
-  },
-
-  /**
-   * success callback of <code>getTasks</code>
-   * @param {object} data
-   */
-  getUpgradeItemSuccessCallback: function (data) {
-    this.get('upgradeData.upgradeGroups').forEach(function (group) {
-      if (group.get('group_id') === data.UpgradeItem.group_id) {
-        group.get('upgradeItems').forEach(function (item) {
-          if (item.get('stage_id') === data.UpgradeItem.stage_id) {
-            if (item.get('tasks.length')) {
-              data.tasks.forEach(function (task) {
-                var currentTask = item.get('tasks').findProperty('id', task.Tasks.id);
-                this.get('taskDetailsProperties').forEach(function (property) {
-                  currentTask.set(property, task.Tasks[property]);
-                }, this);
-              }, this);
-            } else {
-              var tasks = [];
-              data.tasks.forEach(function (task) {
-                tasks.pushObject(App.upgradeEntity.create({type: 'TASK'}, task.Tasks));
-              });
-              item.set('tasks', tasks);
-            }
-            item.set('isTasksLoaded', true);
-          }
-        }, this);
-      }
-    }, this);
-  },
-
-  /**
-   * Failures info may includes service_check and host_component failures. These two types should be displayed separately.
-   */
-  getServiceCheckItemSuccessCallback: function(data) {
-    var task = data.tasks[0];
-    var info = {
-      hosts: [],
-      host_detail: {}
-    };
-
-    if (task && task.Tasks && task.Tasks.structured_out && task.Tasks.structured_out.failures) {
-      this.set('serviceCheckFailuresServicenames', task.Tasks.structured_out.failures.service_check || []);
-      if (task.Tasks.structured_out.failures.host_component) {
-        for (var hostname in task.Tasks.structured_out.failures.host_component){
-          info.hosts.push(hostname);
-        }
-        info.host_detail = task.Tasks.structured_out.failures.host_component;
-      }
-      this.set('slaveComponentStructuredInfo', info);
-    }
-  },
-
-  getSlaveComponentItemSuccessCallback: function(data) {
-    var info = data.tasks[0];
-    if (info && info.Tasks && info.Tasks.structured_out) {
-      this.set('slaveComponentStructuredInfo', info.Tasks.structured_out);
-    }
-  },
-
-  /**
-   * downgrade confirmation popup
-   * @param {object} event
-   */
-  confirmDowngrade: function (event) {
-    var self = this;
-    if(!this.get('currentVersion')){
-      this.updateCurrentStackVersion();
-    }
-    var currentVersion = this.get('currentVersion');
-    return App.showConfirmationPopup(
-      function() {
-        self.downgrade.call(self, currentVersion, event);
-      },
-      Em.I18n.t('admin.stackUpgrade.downgrade.body').format(currentVersion.repository_name),
-      null,
-      Em.I18n.t('admin.stackUpgrade.dialog.downgrade.header').format(this.get('upgradeVersion')),
-      Em.I18n.t('admin.stackUpgrade.downgrade.proceed')
-    );
-  },
-
-  /**
-   * make call to start downgrade process
-   * @param {object} currentVersion
-   * @param {object} event
-   */
-  downgrade: function (currentVersion, event) {
-    var self = this;
-    this.set('requestInProgress', true);
-    this.abortUpgrade().done(function() {
-      var interval = setInterval(function() {
-        if (self.get('upgradeData.Upgrade.request_status') == 'ABORTED') {
-          clearInterval(interval);
-          self.startDowngrade(currentVersion);
-        }
-      }, 1000);
-    });
-  },
-
-  /**
-   * abort upgrade (in order to start Downgrade)
-   */
-  abortUpgrade: function () {
-    var errorCallback = this.get('isDowngrade') ? 'abortDowngradeErrorCallback' : 'abortUpgradeErrorCallback';
-    return App.ajax.send({
-      name: 'admin.upgrade.abort',
-      sender: this,
-      data: {
-        upgradeId: this.get('upgradeId'),
-        isDowngrade: this.get('isDowngrade')
-      },
-      error: errorCallback
-    });
-  },
-
-  /**
-   * just request ro start downgrade,
-   * should be performed only if <code>abortUpgrade<code> was completed
-   */
-  startDowngrade: function(currentVersion) {
-   App.ajax.send({
-      name: 'admin.downgrade.start',
-      sender: this,
-      data: {
-        value: currentVersion.repository_version,
-        label: this.get('upgradeVersion'),
-        id: currentVersion.id,
-        isDowngrade: true,
-        upgradeType: this.get('upgradeType')
-      },
-      success: 'upgradeSuccessCallback',
-      callback: function() {
-        this.sender.set('requestInProgress', false);
-      }
-    });
-  },
-
-  /**
-   * suspend upgrade (in order to restart it later)
-   */
-  abortUpgradeWithSuspend: function () {
-    var errorCallback = this.get('isDowngrade') ? 'abortDowngradeErrorCallback' : 'abortUpgradeErrorCallback';
-    return App.ajax.send({
-      name: 'admin.upgrade.suspend',
-      sender: this,
-      data: {
-        upgradeId: this.get('upgradeId'),
-        isDowngrade: this.get('isDowngrade')
-      },
-      error: errorCallback
-    });
-  },
-
-  /**
-   * error callback of <code>abortUpgrade()</code>
-   * @param {object} data
-   */
-  abortUpgradeErrorCallback: function (data) {
-    var header = Em.I18n.t('admin.stackUpgrade.state.paused.fail.header');
-    var body = Em.I18n.t('admin.stackUpgrade.state.paused.fail.body');
-    if (data && data.responseText) {
-      try {
-        var json = $.parseJSON(data.responseText);
-        body = body + ' ' + json.message;
-      } catch (err) {}
-    }
-    App.showAlertPopup(header, body);
-  },
-
-  /**
-   * error callback of <code>abortDowngrade()</code>
-   * @param {object} data
-   */
-  abortDowngradeErrorCallback: function (data) {
-    var header = Em.I18n.t('admin.stackDowngrade.state.paused.fail.header');
-    var body = Em.I18n.t('admin.stackDowngrade.state.paused.fail.body');
-    if(data && data.responseText){
-      try {
-        var json = $.parseJSON(data.responseText);
-        body = body + ' ' + json.message;
-      } catch (err) {}
-    }
-    App.showAlertPopup(header, body);
-  },
-
-  retryUpgrade: function () {
-    this.setProperties({
-      requestInProgress: true,
-      isRetryPending: true
-    });
-    return App.ajax.send({
-      name: 'admin.upgrade.retry',
-      sender: this,
-      data: {
-        upgradeId: this.get('upgradeId')
-      }
-    });
-  },
-
-  /**
-   * make call to start upgrade process and show popup with current progress
-   * @param {object} version
-   */
-  upgrade: function (version) {
-    this.set('requestInProgress', true);
-    App.ajax.send({
-      name: 'admin.upgrade.start',
-      sender: this,
-      data: version,
-      success: 'upgradeSuccessCallback',
-      error: 'upgradeErrorCallback',
-      callback: function() {
-        this.sender.set('requestInProgress', false);
-      }
-    });
-    this.setDBProperty('currentVersion', this.get('currentVersion'));
-
-    // Show a "preparing the upgrade..." dialog in case the api call returns too slow
-    if (App.router.get('currentState.name') != 'stackUpgrade') {
-      this.showPreparingUpgradeIndicator();
-    }
-  },
-
-  /**
-   * Should progress bar be displayed when preparing upgrade,
-   * should show after Upgrade Options window and before Upgrade Wizard
-   * @method showPreparingUpgradeIndicator
-   */
-  showPreparingUpgradeIndicator: function () {
-    return App.ModalPopup.show({
-      header: '',
-      showFooter: false,
-      showCloseButton: false,
-      bodyClass: Em.View.extend({
-        templateName: require('templates/wizard/step8/step8_log_popup'),
-        controllerBinding: 'App.router.mainAdminStackAndUpgradeController',
-
-        /**
-         * Css-property for progress-bar
-         * @type {string}
-         */
-        barWidth: 'width: 100%;',
-        progressBarClass: 'progress log_popup',
-
-        /**
-         * Popup-message
-         * @type {string}
-         */
-        message: Em.I18n.t('admin.stackUpgrade.dialog.prepareUpgrade.header'),
-
-        /**
-         * Hide popup when upgrade wizard is open
-         * @method autoHide
-         */
-        autoHide: function () {
-          if (!this.get('controller.requestInProgress')) {
-            this.get('parentView').hide();
-          }
-        }.observes('controller.requestInProgress')
-      })
-    });
-  },
-
-  /**
-   * error callback of <code>upgrade()</code>
-   * @param {object} data
-   */
-  upgradeErrorCallback: function (data) {
-    var header = Em.I18n.t('admin.stackVersions.upgrade.start.fail.title');
-    var body = "";
-    if (data && data.responseText) {
-      try {
-        var json = $.parseJSON(data.responseText);
-        body = json.message;
-      } catch (err) {}
-    }
-    App.showAlertPopup(header, body);
-  },
-
-  /**
-   * success callback of <code>upgrade()</code>
-   * @param {object} data
-   */
-  upgradeSuccessCallback: function (data, opt, params) {
-    this.set('upgradeData', null);
-    this.set('upgradeId', data.resources[0].Upgrade.request_id);
-    this.set('toVersion', params.value);
-    this.set('upgradeVersion', params.label);
-    this.set('isDowngrade', !!params.isDowngrade);
-    var upgradeMethod = this.get('upgradeMethods').findProperty('type', params.type),
-        upgradeTypeDisplayName = null,
-        upgradeType = null,
-        isWizardRestricted = false;
-
-    if (upgradeMethod) {
-      upgradeTypeDisplayName = upgradeMethod.get('displayName');
-      upgradeType = upgradeMethod.get('type');
-      isWizardRestricted = upgradeMethod.get('isWizardRestricted');
-    }
-
-    this.set('isWizardRestricted', isWizardRestricted);
-    this.set('upgradeType', upgradeType);
-    this.set('upgradeTypeDisplayName', upgradeTypeDisplayName);
-    this.set('failuresTolerance', Em.Object.create({
-      skipComponentFailures: params.skipComponentFailures == 'true',
-      skipSCFailures: params.skipSCFailures == 'true'
-    }));
-    this.setDBProperties({
-      upgradeVersion: params.label,
-      upgradeId: data.resources[0].Upgrade.request_id,
-      toVersion: params.value,
-      upgradeState: 'PENDING',
-      isDowngrade: !!params.isDowngrade,
-      upgradeType: upgradeType,
-      isWizardRestricted: isWizardRestricted,
-      upgradeTypeDisplayName: upgradeTypeDisplayName,
-      failuresTolerance: Em.Object.create({
-        skipComponentFailures: params.skipComponentFailures == 'true',
-        skipSCFailures: params.skipSCFailures == 'true'
-      })
-    });
-    App.set('upgradeState', 'PENDING');
-    App.clusterStatus.setClusterStatus({
-      wizardControllerName: this.get('name'),
-      localdb: App.db.data
-    });
-    this.load();
-    this.openUpgradeDialog();
-  },
-
-  /**
-   * success callback of updating upgrade options including failures tolerance. etc
-   * @param {object} data
-   */
-  updateOptionsSuccessCallback: function (data, opt, params) {
-    this.set('failuresTolerance', Em.Object.create({
-      skipComponentFailures: params.skipComponentFailures == 'true',
-      skipSCFailures: params.skipSCFailures == 'true'
-    }));
-  },
-
-  /**
-   * run upgrade checks and add results to each method object and set selected method
-   * @param {Em.Object} version
-   */
-  runUpgradeMethodChecks: function(version) {
-    this.get('upgradeMethods').forEach(function (method) {
-      if (method.get('allowed')) {
-        this.runPreUpgradeCheckOnly({
-          id: version.get('id'),
-          label: version.get('displayName'),
-          type: method.get('type')
-        });
-      } else {
-        //if method not supported in current stack version, mark as check completed
-        method.setProperties({
-          isCheckComplete: false,
-          isCheckRequestInProgress: false,
-          action: ''
-        });
-      }
-    }, this);
-  },
-
-  getConfigsWarnings: function (configsMergeWarning) {
-    var configs = [];
-    if (configsMergeWarning && Em.get(configsMergeWarning, 'UpgradeChecks.status') === 'WARNING') {
-      var configsMergeCheckData = Em.get(configsMergeWarning, 'UpgradeChecks.failed_detail');
-      if (configsMergeCheckData && Em.isArray(configsMergeCheckData)) {
-        configs = configsMergeCheckData.reduce(function (allConfigs, item) {
-          var isDeprecated = Em.isNone(item.new_stack_value),
-            willBeRemoved = Em.isNone(item.result_value);
-
-          return allConfigs.concat({
-            type: item.type,
-            name: item.property,
-            wasModified: (!isDeprecated && !willBeRemoved && Em.compare(item.current, item.result_value) === 0),
-            currentValue: item.current,
-            recommendedValue: isDeprecated ? Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.deprecated') : item.new_stack_value,
-            isDeprecated: isDeprecated,
-            resultingValue: willBeRemoved ? Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.willBeRemoved') : item.result_value,
-            willBeRemoved: willBeRemoved
-          });
-        }, []);
-      }
-    }
-    return configs;
-  },
-
-  showUpgradeOptions: function ( version ) {
-    this.upgradeOptions(false, version, true);
-  },
-
-  /**
-   * Open upgrade options window: upgrade type and failures tolerance
-   * @param {boolean} isInUpgradeWizard
-   * @param {object} version
-   * @return App.ModalPopup
-   */
-  upgradeOptions: function (isInUpgradeWizard, version, preUpgradeShow) {
-    var self = this,
-      upgradeMethods = this.get('upgradeMethods'),
-      runningCheckRequests = this.get('runningCheckRequests');
-    if (!isInUpgradeWizard) {
-      upgradeMethods.setEach('isCheckRequestInProgress', true);
-      upgradeMethods.setEach('selected', false);
-      var request = this.getSupportedUpgradeTypes(Ember.Object.create({
-        stackName: App.get('currentStackVersion').split('-')[0],
-        stackVersion: App.get('currentStackVersion').split('-')[1],
-        toVersion: version.get('repositoryVersion')
-      })).done(function () {
-          if (App.get('router.currentState.name') === 'versions' && App.get('router.currentState.parentState.name') === 'stackAndUpgrade') {
-            self.runUpgradeMethodChecks(version);
-          }
-      }).always(function () {
-        self.set('isUpgradeTypesLoaded', true);
-        self.set('runningCheckRequests', runningCheckRequests.rejectProperty('type', 'ALL'));
-        });
-      request.type = 'ALL';
-      this.get('runningCheckRequests').push(request);
-    } else {
-      this.set('isUpgradeTypesLoaded', true);
-    }
-
-    return App.ModalPopup.show({
-      encodeBody: false,
-      primary: function() {
-        if ( preUpgradeShow ) return false;
-        if ( isInUpgradeWizard || this.get('controller.getSupportedUpgradeError') ) return Em.I18n.t('ok');
-        return Em.I18n.t('common.proceed');
-      }.property('controller.getSupportedUpgradeError'),
-      secondary: function() {
-        if (preUpgradeShow) return Em.I18n.t('common.dismiss');
-        if (this.get('controller.getSupportedUpgradeError')) return null;
-        return Em.I18n.t('common.cancel');
-      }.property('controller.getSupportedUpgradeError'),
-      secondaryClass: preUpgradeShow ? 'btn-success' : '',
-      classNames: ['upgrade-options-popup'],
-      header: preUpgradeShow ? Em.I18n.t('admin.stackVersions.version.preUpgrade.header') : Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.header'),
-      controller: this,
-      showFooter: function() {
-        return this.get('controller.isUpgradeTypesLoaded') || preUpgradeShow;
-      }.property('controller.isUpgradeTypesLoaded'),
-      bodyClass: Em.View.extend({
-        templateName: require('templates/main/admin/stack_upgrade/upgrade_options'),
-        didInsertElement: function () {
-          App.tooltip($(".failure-tolerance-tooltip"), {
-            placement: "top",
-            title: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.tolerance.tooltip')
-          });
-          Em.run.later(this, function () {
-            App.tooltip($(".img-thumbnail.check-failed"), {
-              placement: "bottom",
-              title: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.failed.tooltip')
-            });
-            App.tooltip($(".not-allowed-by-version"), {
-              placement: "bottom",
-              title: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.notAllowed')
-            });
-          }, 1000);
-        },
-        upgradeMethods: function () {
-          self.updateSelectedMethod(isInUpgradeWizard);
-          return self.get('upgradeMethods');
-        }.property().volatile(),
-        isInUpgradeWizard: isInUpgradeWizard,
-        showPreUpgradeChecks: App.get('supports.preUpgradeCheck') && !isInUpgradeWizard,
-        versionText: (function () {
-          if ( preUpgradeShow ) return Em.I18n.t('admin.stackVersions.version.preUpgrade.bodyMsg.version').format(version.get('displayName'));
-          if ( isInUpgradeWizard ) return '';
-          return Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.bodyMsg.version').format(version.get('displayName'));
-        })(),
-        selectMethod: function (event) {
-          if (isInUpgradeWizard || !event.context.get('allowed') || event.context.get('isPrecheckFailed')) return;
-          var selectedMethod = event.context;
-          self.updateSelectedMethod(isInUpgradeWizard);
-          self.get('upgradeMethods').forEach(function (method) {
-            method.set('selected', false);
-          });
-          selectedMethod.set('selected', true);
-          this.set('parentView.selectedMethod', selectedMethod);
-        },
-        runAction: function (event) {
-          var method = event.context,
-            action = method.get('action');
-          if (action) {
-            this.get(action)(event);
-          }
-        },
-        rerunCheck: function (event) {
-          self.runPreUpgradeCheckOnly({
-            id: version.get('id'),
-            label: version.get('displayName'),
-            type: event.context.get('type')
-          });
-        },
-        openMessage: function (event) {
-          if (isInUpgradeWizard || !event.context.get('allowed')) return;
-          var data = event.context.get('precheckResultsData');
-
-          var failTitle = Em.I18n.t('popup.clusterCheck.Upgrade.fail.title');
-          var failAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.fail.alert'));
-          var bypassedFailures = data.items.filterProperty('UpgradeChecks.status', 'BYPASS').length > 0;
-          if (data.items.filterProperty('UpgradeChecks.status', 'ERROR').length == 0 && bypassedFailures) {
-            failTitle = Em.I18n.t('popup.clusterCheck.Upgrade.bypassed-failures.title');
-            failAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.bypassed-failures.alert'));
-          }
-
-          var header = Em.I18n.t('popup.clusterCheck.Upgrade.header').format(version.get('displayName')),
-            warningTitle = Em.I18n.t('popup.clusterCheck.Upgrade.warning.title'),
-            warningAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.warning.alert')),
-            configsMergeWarning = data.items.findProperty('UpgradeChecks.id', "CONFIG_MERGE"),
-            popupData = {
-              items: data.items.rejectProperty('UpgradeChecks.id', 'CONFIG_MERGE')
-            },
-            configs = self.getConfigsWarnings(configsMergeWarning);
-          App.showClusterCheckPopup(popupData, {
-            header: header,
-            failTitle: failTitle,
-            failAlert: failAlert,
-            warningTitle: warningTitle,
-            warningAlert: warningAlert,
-            primary: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.rerun'),
-            secondary: Em.I18n.t('common.cancel'),
-            bypassedFailures: bypassedFailures,
-            callback: function () {
-              self.runPreUpgradeCheckOnly.call(self, {
-                id: version.get('id'),
-                label: version.get('displayName'),
-                type: event.context.get('type')
-              });
-            }
-          }, configs);
-        },
-        upgradeShow: !preUpgradeShow
-      }),
-
-      /**
-       * @type {Em.Object}
-       * @default null
-       */
-      selectedMethod: null,
-      skipComponentFailures: self.get('failuresTolerance.skipComponentFailures'),
-      skipSCFailures: self.get('failuresTolerance.skipSCFailures'),
-      disablePrimary: function () {
-        if (isInUpgradeWizard || this.get('controller.getSupportedUpgradeError')) return false;
-        var selectedMethod = this.get('selectedMethod');
-        if (selectedMethod) {
-          if (App.get('supports.preUpgradeCheck')) {
-            return selectedMethod.get('isPrecheckFailed') || selectedMethod.get('isCheckRequestInProgress');
-          } else {
-            return false;
-          }
-        } else {
-          return true;
-        }
-      }.property('selectedMethod', 'selectedMethod.isPrecheckFailed', 'selectedMethod.isCheckRequestInProgress'),
-      onPrimary: function () {
-        this.hide();
-        if (isInUpgradeWizard) {
-          return App.ajax.send({
-            name: 'admin.upgrade.update.options',
-            sender: self,
-            data: {
-              upgradeId: self.get('upgradeId'),
-              skipComponentFailures: Boolean(this.get('skipComponentFailures')).toString(),
-              skipSCFailures: Boolean(this.get('skipSCFailures')).toString()
-            },
-            success: 'updateOptionsSuccessCallback'
-          });
-        } else {
-          var upgradeMethod = self.get('upgradeMethods').findProperty('selected');
-          version.upgradeType = upgradeMethod.get('type');
-          version.upgradeTypeDisplayName = upgradeMethod.get('displayName');
-          version.skipComponentFailures = this.get('skipComponentFailures');
-          version.skipSCFailures = this.get('skipSCFailures');
-
-          var toVersion = version.get('displayName');
-          var bodyMessage = Em.Object.create({
-            confirmButton: Em.I18n.t('yes'),
-            confirmMsg: upgradeMethod.get('type') === 'ROLLING' ?
-              Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.RU.confirm.msg').format(toVersion) :
-              Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.EU.confirm.msg').format(toVersion)
-          });
-          return App.showConfirmationFeedBackPopup(function (query) {
-            return self.runPreUpgradeCheck.call(self, version);
-          }, bodyMessage);
-        }
-      }
-    });
-  },
-
-  /**
-   * open upgrade options from upgrade wizard
-   */
-  openUpgradeOptions: function () {
-    if (this.get('isDowngrade')) return;
-    this.upgradeOptions(true, null);
-  },
-
-  /**
-   * upgrade confirmation popup including upgrade options: upgrade type and failures tolerance
-   * @param {object} version
-   * @return App.ModalPopup
-   */
-  confirmUpgrade: function (version) {
-    this.upgradeOptions(false, version);
-  },
-
-  /**
-   * send request for pre upgrade check only
-   */
-  runPreUpgradeCheckOnly: function (data) {
-    if (App.get('supports.preUpgradeCheck')) {
-      var method = this.get('upgradeMethods').findProperty('type', data.type);
-      method.setProperties({
-        isCheckComplete: false,
-        isCheckRequestInProgress: true,
-        action: ''
-      });
-      var request = App.ajax.send({
-        name: "admin.upgrade.pre_upgrade_check",
-        sender: this,
-        data: data,
-        success: 'runPreUpgradeCheckOnlySuccess',
-        error: 'runPreUpgradeCheckOnlyError',
-        callback: function () {
-          var runningCheckRequests = this.sender.get('runningCheckRequests');
-          method.set('isCheckRequestInProgress', false);
-          this.sender.set('runningCheckRequests', runningCheckRequests.rejectProperty('type', this.data.type));
-        }
-      });
-      request.type = data.type;
-      this.get('runningCheckRequests').push(request);
-    }
-  },
-
-  /**
-   * send request to get available upgrade tye names
-   */
-  getSupportedUpgradeTypes: function(data) {
-    this.set('isUpgradeTypesLoaded', false);
-    this.set('getSupportedUpgradeError', '');
-    return App.ajax.send({
-      name: "admin.upgrade.get_supported_upgradeTypes",
-      sender: this,
-      data: data,
-      success: "getSupportedUpgradeTypesSuccess",
-      error: "getSupportedUpgradeTypesError"
-    });
-  },
-
-  /**
-   * success callback of <code>getSupportedUpgradeTypes()</code>
-   * @param data {object}
-   */
-  getSupportedUpgradeTypesSuccess: function (data) {
-    var supportedUpgradeTypes = data.items[0] && data.items[0].CompatibleRepositoryVersions.upgrade_types;
-    this.get('upgradeMethods').forEach(function (method) {
-      method.set('allowed', Boolean(supportedUpgradeTypes && supportedUpgradeTypes.contains(method.get('type'))));
-    });
-  },
-
-  /**
-   * error callback of <code>getSupportedUpgradeTypes()</code>
-   * @param xhr {object}
-   */
-  getSupportedUpgradeTypesError: function (xhr) {
-    var response;
-    try {
-      response = JSON.parse(xhr.responseText);
-    } catch (e) {
-      response = {message: xhr.statusText};
-    }
-    this.set('getSupportedUpgradeError', response.message);
-  },
-
-  /**
-   * success callback of <code>runPreUpgradeCheckOnly()</code>
-   * Show a message how many fails/warnings/bypass/passed
-   * on clicking that message a popup window show up
-   * @param data {object}
-   * @param opt {object}
-   * @param params {object}
-   */
-  runPreUpgradeCheckOnlySuccess: function (data, opt, params) {
-    var properties = {
-      precheckResultsTitle: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.title'),
-      precheckResultsData: data,
-      isCheckComplete: true,
-      action: 'openMessage',
-      precheckResultsMessage: '',
-      recheckResultsMessageClass: 'GREEN',
-      isPrecheckFailed: false,
-      precheckResultsMessageIconClass: 'glyphicon glyphicon-ok',
-      bypassedFailures: false
-    };
-
-    Object.keys(this.get('preCheckMessages')).forEach(function(status) {
-      if (data.items.someProperty('UpgradeChecks.status', status)) {
-        properties = this.formatPreCheckMessage(status, data, properties);
-      }
-    }, this);
-
-    if (!properties.precheckResultsMessage) {
-      properties.precheckResultsMessage = Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.allPassed');
-    }
-    this.get('upgradeMethods').findProperty('type', params.type).setProperties(properties);
-    this.updateSelectedMethod(false);
-    this.addPrecheckMessageTooltip();
-  },
-
-  /**
-   * @method formatPreCheckMessage
-   * @param {string} type
-   * @param {object} data
-   * @param {object} defaults
-   * @returns {object}
-   */
-  formatPreCheckMessage: function(type, data, defaults) {
-    var length = data.items.filterProperty('UpgradeChecks.status', type).length;
-    var properties = this.get('preCheckMessages')[type] || {};
-    var message = Em.I18n.t(properties.template).format(length, defaults.precheckResultsMessage);
-    defaults = $.extend(defaults, properties);
-    delete defaults.template;
-    defaults.precheckResultsMessage = message;
-    return defaults;
-  },
-
-  addPrecheckMessageTooltip: function() {
-    Em.run.later(this, function () {
-      // add tooltip for the type with preCheck errors
-      App.tooltip($(".img-thumbnail.check-failed"), {
-        placement: "bottom",
-        title: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.failed.tooltip')
-      });
-      // destroy the tooltip for the type wo preCheck errors
-      $(".img-thumbnail").not(".check-failed").not(".not-allowed-by-version").tooltip("destroy");
-    }, 1000);
-  },
-
-  runPreUpgradeCheckOnlyError: function (request, ajaxOptions, error, data, params) {
-    var method = this.get('upgradeMethods').findProperty('type', params.type);
-    method.setProperties({
-      precheckResultsMessage: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.failed.link'),
-      precheckResultsTitle: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.failed.title'),
-      precheckResultsMessageClass: 'RED',
-      isPrecheckFailed: true,
-      precheckResultsMessageIconClass: 'glyphicon glyphicon-warning-sign',
-      action: 'rerunCheck'
-    });
-  },
-
-  /**
-   * In Upgrade Wizard: update which method already been selected on open
-   * Not in upgrade wizard: de-select the method with pre-check errors
-   * @param isInUpgradeWizard {boolean}
-   */
-  updateSelectedMethod: function (isInUpgradeWizard) {
-    if (isInUpgradeWizard) {
-      this.get('upgradeMethods').forEach(function (method) {
-        method.set('selected', method.get('type') === this.get('upgradeType'));
-      }, this);
-    } else {
-      var ruMethod = this.get('upgradeMethods').findProperty('type', 'ROLLING');
-      var euMethod = this.get('upgradeMethods').findProperty('type', 'NON_ROLLING');
-      if (ruMethod && ruMethod.get('isPrecheckFailed')) ruMethod.set('selected', false);
-      if (euMethod && euMethod.get('isPrecheckFailed')) euMethod.set('selected', false);
-    }
-  },
-
-  /**
-   * send request for pre upgrade check
-   * @param version
-   */
-  runPreUpgradeCheck: function(version) {
-    var params = {
-      value: version.get('repositoryVersion'),
-      label: version.get('displayName'),
-      type: version.get('upgradeType'),
-      skipComponentFailures: version.get('skipComponentFailures') ? 'true' : 'false',
-      skipSCFailures: version.get('skipSCFailures') ? 'true' : 'false',
-      id: version.get('id'),
-      targetStack: version.get('displayName')
-    };
-    if (App.get('supports.preUpgradeCheck')) {
-      this.set('requestInProgress', true);
-      App.ajax.send({
-        name: "admin.upgrade.pre_upgrade_check",
-        sender: this,
-        data: params,
-        success: "runPreUpgradeCheckSuccess",
-        error: "runPreUpgradeCheckError"
-      });
-    } else {
-      this.upgrade(params);
-    }
-  },
-
-  /**
-   * success callback of <code>runPreUpgradeCheckSuccess()</code>
-   * if there are some fails - it shows popup else run upgrade
-   * @param data {object}
-   * @param opt {object}
-   * @param params {object}
-   * @returns {App.ModalPopup|undefined}
-   */
-  runPreUpgradeCheckSuccess: function (data, opt, params) {
-    var self = this;
-    if (data.items.someProperty('UpgradeChecks.status', 'FAIL') || data.items.someProperty('UpgradeChecks.status', 'WARNING') || data.items.someProperty('UpgradeChecks.status', 'BYPASS')) {
-      this.set('requestInProgress', false);
-      var hasFails = data.items.someProperty('UpgradeChecks.status', 'FAIL'),
-        header = Em.I18n.t('popup.clusterCheck.Upgrade.header').format(params.label),
-        failTitle = Em.I18n.t('popup.clusterCheck.Upgrade.fail.title'),
-        failAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.fail.alert')),
-        warningTitle = Em.I18n.t('popup.clusterCheck.Upgrade.warning.title'),
-        warningAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.warning.alert')),
-        bypassedFailures = data.items.someProperty('UpgradeChecks.status', 'BYPASS').length > 0,
-        configsMergeWarning = data.items.findProperty('UpgradeChecks.id', 'CONFIG_MERGE'),
-        popupData = {
-          items: data.items.rejectProperty('UpgradeChecks.id', 'CONFIG_MERGE')
-        },
-        configs = this.getConfigsWarnings(configsMergeWarning);
-      App.showClusterCheckPopup(popupData, {
-        header: header,
-        failTitle: failTitle,
-        failAlert: failAlert,
-        warningTitle: warningTitle,
-        warningAlert: warningAlert,
-        bypassedFailures: bypassedFailures,
-        noCallbackCondition: hasFails,
-        callback: function () {
-          self.upgrade(params);
-        }
-      }, configs, params.label);
-    } else {
-      this.upgrade(params);
-    }
-  },
-
-  runPreUpgradeCheckError: function() {
-    this.set('requestInProgress', false);
-  },
-
-  confirmRetryUpgrade: function (version) {
-    var self = this;
-    return App.showConfirmationPopup(
-      function () {
-        self.retryUpgrade();
-      },
-      Em.I18n.t('admin.stackUpgrade.upgrade.retry.confirm.body').format(version.get('displayName')),
-      null,
-      this.getUpgradeDowngradeHeader(version.get('upgradeTypeDislayName'), version.get('displayName'))
-    );
-  },
-
-  confirmRetryDowngrade: function () {
-    var self = this,
-      currentVersion = this.get('currentVersion');
-    return App.showConfirmationPopup(
-      function() {
-        self.retryUpgrade();
-      },
-      Em.I18n.t('admin.stackUpgrade.downgrade.retry.body').format(currentVersion.repository_name),
-      null,
-      Em.I18n.t('admin.stackUpgrade.dialog.downgrade.header').format(currentVersion.repository_name),
-      Em.I18n.t('admin.stackUpgrade.downgrade.proceed')
-    );
-  },
-
-  /**
-   * confirmation popup before install repository version
-   */
-  installRepoVersionPopup: function (repo) {
-    var availableServices = repo.get('stackServices').filter(function(service) {
-      return App.Service.find(service.get('name')).get('isLoaded') && service.get('isAvailable') && service.get('isUpgradable');
-    }, this);
-    if (!availableServices.length && !repo.get('isStandard')){
-      return App.showAlertPopup( Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.title'), Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.noAvailableServices').format(repo.get('displayName')) );
-    }
-    var self = this;
-    var bodyContent = repo.get('isPatch')
-      ? Em.I18n.t('admin.stackVersions.version.install.patch.confirm')
-      : Em.I18n.t('admin.stackVersions.version.install.confirm');
-    return App.ModalPopup.show({
-      header: Em.I18n.t('popup.confirmation.commonHeader'),
-      popupBody: bodyContent.format(repo.get('displayName')),
-      skipDependencyCheck: false,
-      bodyClass: Em.View.extend({
-        classNames: ['install-repo-confirmation'],
-        content: availableServices,
-        showAvailableServices: repo.get('isPatch') || repo.get('isMaint'),
-        templateName: require('templates/common/modal_popups/install_repo_confirmation')
-      }),
-      onPrimary: function () {
-        self.installRepoVersion(repo);
-        this._super();
-      }
-    });
-  },
-
-  /**
-   * sends request to install repoVersion to the cluster
-   * and create clusterStackVersion resourse
-   * @param {Em.Object} repo
-   * @return {$.ajax}
-   * @method installRepoVersion
-   */
-  installRepoVersion: function (repo) {
-    this.set('requestInProgress', true);
-    this.set('requestInProgressRepoId', repo.get('id'));
-
-    var data = {
-      ClusterStackVersions: {
-        stack: repo.get('stackVersionType'),
-        version: repo.get('stackVersionNumber'),
-        repository_version: repo.get('repositoryVersion')
-      },
-      id: repo.get('id')
-    };
-    return App.ajax.send({
-      name: 'admin.stack_version.install.repo_version',
-      sender: this,
-      data: data,
-      success: 'installRepoVersionSuccess',
-      error: 'installRepoVersionError',
-      callback: function() {
-        this.sender.set('requestInProgress', false);
-        this.sender.set('requestInProgressRepoId', null);
-      }
-    });
-  },
-
-  /**
-   * transform repo data into json for
-   * saving changes to repository version
-   * @param {Em.Object} repo
-   * @returns {{operating_systems: Array}}
-   */
-  prepareRepoForSaving: function(repo) {
-    var repoVersion = { "operating_systems": [] };
-    var ambari_managed_repositories = !repo.get('useRedhatSatellite');
-    repo.get('operatingSystems').forEach(function (os, k) {
-      repoVersion.operating_systems.push({
-        "OperatingSystems": {
-          "os_type": os.get("osType"),
-          "ambari_managed_repositories": ambari_managed_repositories
-        },
-        "repositories": []
-      });
-      os.get('repositories').forEach(function (repository) {
-        repoVersion.operating_systems[k].repositories.push({
-          "Repositories": {
-            "base_url": repository.get('baseUrl'),
-            "repo_id": repository.get('repoId'),
-            "repo_name": repository.get('repoName')
-          }
-        });
-      });
-    });
-    return repoVersion;
-  },
-
-  /**
-   * Return stack version for the repo object
-   * @param {Em.Object} repo
-   * */
-  getStackVersionNumber: function(repo){
-    var stackVersionNumber = repo.get('stackVersion');
-    if(null == stackVersionNumber)
-      stackVersionNumber = App.get('currentStackVersion');
-    return stackVersionNumber;
-  },
-
-  /**
-   * perform validation if <code>skip<code> is  false and run save if
-   * validation successfull or run save without validation is <code>skip<code> is true
-   * @param {Em.Object} repo
-   * @param {boolean} skip
-   * @returns {$.Deferred}
-   */
-  saveRepoOS: function (repo, skip) {
-    var self = this;
-    var deferred = $.Deferred();
-    this.validateRepoVersions(repo, skip).done(function(data) {
-      if (data.length > 0) {
-        deferred.resolve(data);
-      } else {
-        var repoVersion = self.prepareRepoForSaving(repo);
-        var stackVersionNumber = self.getStackVersionNumber(repo);
-
-        App.ajax.send({
-          name: 'admin.stack_versions.edit.repo',
-          sender: this,
-          data: {
-            stackName: App.get('currentStackName'),
-            stackVersion: stackVersionNumber,
-            repoVersionId: repo.get('repoVersionId'),
-            repoVersion: repoVersion
-          }
-        }).success(function() {
-          deferred.resolve([]);
-        });
-      }
-    });
-    return deferred.promise();
-  },
-
-  /**
-   * send request for validation for each repository
-   * @param {Em.Object} repo
-   * @param {boolean} skip
-   * @returns {*}
-   */
-  validateRepoVersions: function(repo, skip) {
-    var deferred = $.Deferred(),
-      totalCalls = 0,
-      invalidUrls = [];
-
-    if (skip) {
-      deferred.resolve(invalidUrls);
-    } else {
-      var stackVersionNumber = this.getStackVersionNumber(repo);
-      repo.get('operatingSystems').forEach(function (os) {
-        if (os.get('isSelected')) {
-          os.get('repositories').forEach(function (repo) {
-            totalCalls++;
-            this.validationCall(repo, os, stackVersionNumber)
-            .success(function () {
-              totalCalls--;
-              if (totalCalls === 0) deferred.resolve(invalidUrls);
-            })
-            .error(function () {
-              repo.set('hasError', true);
-              invalidUrls.push(repo);
-              totalCalls--;
-              if (totalCalls === 0) deferred.resolve(invalidUrls);
-            });
-          }, this);
-        } else {
-          return deferred.resolve(invalidUrls);
-        }
-      }, this);
-    }
-    return deferred.promise();
-  },
-
-  /**
-   *
-   * @param {Em.Object} repo
-   * @param {Em.Object} os
-   * @param {string} stackVersionNumber
-   */
-  validationCall: function(repo, os, stackVersionNumber) {
-    return App.ajax.send({
-      name: 'admin.stack_versions.validate.repo',
-      sender: this,
-      data: {
-        repo: repo,
-        repoName: repo.get('repoName'),
-        repoId: repo.get('repoId'),
-        baseUrl: repo.get('baseUrl'),
-        osType: os.get('osType'),
-        stackName: App.get('currentStackName'),
-        stackVersion: stackVersionNumber
-      }
-    })
-  },
-
-  /**
-   * success callback for <code>installRepoVersion()<code>
-   * saves request id to the db
-   * @param data
-   * @param opt
-   * @param params
-   * @method installStackVersionSuccess
-   */
-  installRepoVersionSuccess: function (data, opt, params) {
-    if (data && data.statusText === "timeout") {
-      App.showAlertPopup(Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.title'), Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.timeout'));
-      return false;
-    }
-    var version = App.RepositoryVersion.find(params.id);
-    App.db.set('repoVersionInstall', 'id', [data.Requests.id]);
-    App.clusterStatus.setClusterStatus({
-      wizardControllerName: this.get('name'),
-      localdb: App.db.data
-    });
-    version.set('defaultStatus', 'INSTALLING');
-    if (version.get('stackVersion')) {
-      version.set('stackVersion.state', 'INSTALLING');
-    }
-  },
-
-  /**
-   * error callback for <code>installRepoVersion()<code>
-   * show the error message
-   * @param data
-   * @method installStackVersionSuccess
-   */
-  installRepoVersionError: function (data, opt, params) {
-    var header = Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.title');
-    var body = "";
-    if (data && data.responseText) {
-      try {
-        var json = $.parseJSON(data.responseText);
-        body = json.message;
-      } catch (err) {}
-    }
-    if (data && data.statusText === "timeout") {
-      body = Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.timeout');
-    }
-    var version = App.RepositoryVersion.find(params.id);
-    version.set('defaultStatus', 'INSTALL_FAILED');
-    if (version.get('stackVersion')) {
-      version.set('stackVersion.state', 'INSTALL_FAILED');
-    }
-    App.showAlertPopup(header, body);
-  },
-
-  /**
-   * opens a popup with installations state per host
-   * @param {Em.Object} version
-   * @method showProgressPopup
-   */
-  showProgressPopup: function(version) {
-    var popupTitle = Em.I18n.t('admin.stackVersions.details.install.hosts.popup.title').format(version.get('displayName'));
-    var requestIds = this.getRepoVersionInstallId();
-    var hostProgressPopupController = App.router.get('highAvailabilityProgressPopupController');
-    hostProgressPopupController.initPopup(popupTitle, requestIds, this);
-  },
-
-  getRepoVersionInstallId: function() {
-    if (App.get('testMode')) return [1];
-
-    var requestIds = App.db.get('repoVersionInstall', 'id');
-    var lastRepoVersionInstall = App.router.get('backgroundOperationsController.services').find(function(request) {
-      return request.get('name').startsWith('Install version');
-    });
-    if (lastRepoVersionInstall &&
-      (!requestIds || !requestIds.contains(lastRepoVersionInstall.get('id')))) {
-      requestIds = [lastRepoVersionInstall.get('id')];
-    }
-    return requestIds || [];
-  },
-
-  /**
-   * reset upgradeState to NOT_REQUIRED when upgrade is COMPLETED
-   * and clean auxiliary data
-   */
-  finish: function () {
-    var upgradeVersion = this.get('upgradeVersion') && this.get('upgradeVersion').match(/[a-zA-Z]+\-\d+\.\d+/);
-    this.setDBProperties({
-      fromVersion: undefined,
-      upgradeId: undefined,
-      upgradeState: 'NOT_REQUIRED',
-      upgradeVersion: undefined,
-      currentVersion: undefined,
-      upgradeTypeDisplayName: undefined,
-      upgradeType: undefined,
-      isWizardRestricted: false,
-      failuresTolerance: undefined,
-      isDowngrade: undefined,
-      downgradeAllowed: undefined
-    });
-    this.initDBProperties();
-    App.clusterStatus.setClusterStatus({
-      localdb: App.db.data
-    });
-    if (upgradeVersion && upgradeVersion[0]) {
-      App.set('currentStackVersion', upgradeVersion[0]);
-    }
-    App.set('upgradeState', 'NOT_REQUIRED');
-  },
-
-  /**
-   * Check <code>App.upgradeState</code> for HOLDING
-   * If it is, send request to check if current item is Finalize
-   * @method updateFinalize
-   */
-  updateFinalize: function () {
-    var upgradeState = App.get('upgradeState');
-    if (upgradeState === 'HOLDING') {
-      return App.ajax.send({
-        name: 'admin.upgrade.finalizeContext',
-        sender: this,
-        success: 'updateFinalizeSuccessCallback',
-        error: 'updateFinalizeErrorCallback'
-      })
-    }
-    else {
-      this.set('isFinalizeItem', false);
-    }
-  }.observes('App.upgradeState'),
-
-  /**
-   *
-   * @param {object|null} data
-   * @method updateFinalizeSuccessCallback
-   */
-  updateFinalizeSuccessCallback: function (data) {
-    var context = data ? Em.get(data, 'items.firstObject.upgrade_groups.firstObject.upgrade_items.firstObject.UpgradeItem.context') : '';
-    this.set('isFinalizeItem', context === this.get('finalizeContext'));
-  },
-
-  updateFinalizeErrorCallback: function() {
-    this.set('isFinalizeItem', false);
-  },
-
-  /**
-   * show dialog with tasks of upgrade
-   * @return {App.ModalPopup}
-   */
-  openUpgradeDialog: function () {
-    if (App.isAuthorized('CLUSTER.UPGRADE_DOWNGRADE_STACK') && !this.get('isWizardRestricted')) {
-      App.propertyDidChange('upgradeSuspended');
-      App.router.transitionTo('admin.stackUpgrade');
-    }
-  },
-
-  /**
-   * returns url to get data for repoVersion or clusterStackVersion
-   * @param {Boolean} stack true if load clusterStackVersion
-   * @param {Boolean} fullLoad true if load all data
-   * @returns {String}
-   * @method getUrl
-   */
-  getUrl: function(stack, fullLoad) {
-    if (App.get('testMode')) {
-      return stack ? this.get('mockStackUrl') : this.get('mockRepoUrl')
-    } else {
-      if (fullLoad) {
-        return stack ? this.get('realStackUrl') : this.get('realRepoUrl');
-      } else {
-        return this.get('realUpdateUrl');
-      }
-    }
-  },
-
-  /**
-   * get stack versions from server and push it to model
-   * @return {*}
-   * @method loadStackVersionsToModel
-   */
-  loadStackVersionsToModel: function (fullLoad) {
-    var dfd = $.Deferred();
-    App.HttpClient.get(this.getUrl(true, fullLoad), App.stackVersionMapper, {
-      complete: function () {
-        dfd.resolve();
-      }
-    });
-    return dfd.promise();
-  },
-
-  /**
-   * get repo versions from server and push it to model
-   * @return {*}
-   * @params {Boolean} isUpdate - if true loads part of data that need to be updated
-   * @method loadRepoVersionsToModel()
-   */
-  loadRepoVersionsToModel: function () {
-    var dfd = $.Deferred();
-    App.HttpClient.get(this.getUrl(false, true), App.repoVersionMapper, {
-      complete: function () {
-        dfd.resolve();
-      }
-    });
-    return dfd.promise();
-  },
-
-  /**
-   * set status to Upgrade item
-   * @param item
-   * @param status
-   */
-  setUpgradeItemStatus: function(item, status) {
-    this.set('requestInProgress', true);
-    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
-      },
-      callback: function() {
-        this.sender.set('requestInProgress', false);
-      }
-    }).done(function () {
-      item.set('status', status);
-    });
-  },
-
-  currentVersionObserver: function () {
-    var versionNumber = this.get('currentVersion.repository_version');
-    var currentVersionObject = App.RepositoryVersion.find().findProperty('status', 'CURRENT');
-    var versionName = currentVersionObject && currentVersionObject.get('stackVersionType');
-    App.set('isStormMetricsSupported', versionName != 'HDP' || stringUtils.compareVersions(versionNumber, '2.2.2') > -1 || !versionNumber);
-  }.observes('currentVersion.repository_version'),
-
-  /**
-   * get the installed repositories of HDP from server
-   */
-  loadRepositories: function () {
-    if (App.router.get('clusterController.isLoaded') && App.get('currentStackVersion')) {
-      var nameVersionCombo = App.get('currentStackVersion');
-      var stackName = nameVersionCombo.split('-')[0];
-      var stackVersion = nameVersionCombo.split('-')[1];
-      App.ajax.send({
-        name: 'cluster.load_repositories',
-        sender: this,
-        data: {
-          stackName: stackName,
-          stackVersion: stackVersion
-        },
-        success: 'loadRepositoriesSuccessCallback',
-        error: 'loadRepositoriesErrorCallback'
-      });
-    }
-  }.observes('App.router.clusterController.isLoaded'),
-
-  loadRepositoriesSuccessCallback: function (data) {
-    var allRepos = [];
-    data.items.forEach(function (os) {
-      os.repositories.forEach(function (repository) {
-        var osType = repository.Repositories.os_type;
-        var repo = Em.Object.create({
-          baseUrl: repository.Repositories.base_url,
-          osType: osType,
-          repoId: repository.Repositories.repo_id,
-          repoName : repository.Repositories.repo_name,
-          stackName : repository.Repositories.stack_name,
-          stackVersion : repository.Repositories.stack_version,
-          isFirst: false
-        });
-        var group = allRepos.findProperty('name', osType);
-        if (!group) {
-          group = {
-            name: osType,
-            repositories: []
-          };
-          repo.set('isFirst', true);
-          allRepos.push(group);
-        }
-        group.repositories.push(repo);
-      });
-    }, this);
-    allRepos.stackVersion = App.get('currentStackVersionNumber');
-    this.set('allRepos', allRepos);
-  },
-
-  loadRepositoriesErrorCallback: function (request, ajaxOptions, error) {
-
-  },
-
-  /**
-   * @returns {$.ajax}
-   */
-  suspendUpgrade: function () {
-    var self = this;
-    return this.abortUpgradeWithSuspend().done(function () {
-      App.set('upgradeState', 'ABORTED');
-      self.setDBProperty('upgradeState', 'ABORTED');
-      App.clusterStatus.setClusterStatus({
-        wizardControllerName: self.get('name'),
-        localdb: App.db.data
-      });
-    });
-  },
-
-  /**
-   * @returns {$.ajax}
-   */
-  resumeUpgrade: function() {
-    var self = this;
-    this.retryUpgrade().done(function () {
-      App.set('upgradeState', 'PENDING');
-      App.propertyDidChange('upgradeSuspended');
-      self.setDBProperty('upgradeState', 'PENDING');
-      App.clusterStatus.setClusterStatus({
-        wizardControllerName: self.get('name'),
-        localdb: App.db.data
-      });
-    });
-  },
-
-  /**
-   *
-   * @param {Em.Object} version
-   */
-  confirmRevertPatchUpgrade: function(version) {
-    var self = this;
-    var currentStack = App.RepositoryVersion.find(this.get('currentVersion.id'));
-
-    App.ModalPopup.show({
-      header: Em.I18n.t('popup.confirmation.commonHeader'),
-      popupBody: Em.I18n.t('admin.stackVersions.upgrade.patch.revert.confirmation'),
-      bodyClass: Em.View.extend({
-        classNames: ['revert-patch-upgrade-confirmation'],
-        servicesToBeReverted: this.getServicesToBeReverted(version, currentStack),
-        stackFromVersion: version.get('displayName'),
-        stackToVersion: currentStack.get('displayNameSimple'),
-        templateName: require('templates/common/modal_popups/revert_patch_upgrade_confirmation')
-      }),
-      onPrimary: function () {
-        self.revertPatchUpgrade(version);
-        this._super();
-      }
-    });
-  },
-
-  /**
-   *
-   * @param {Em.Object} version
-   * @param {Em.Object} currentStack
-   * @returns {Array}
-   */
-  getServicesToBeReverted: function(version, currentStack) {
-    return version.get('stackServices').filter(function(_service) {
-      var originalService = App.Service.find(_service.get('name'));
-      var isOriginal = originalService.get('desiredRepositoryVersionId') === version.get('id')
-      return (originalService.get('isLoaded') && _service.get('isAvailable')) && isOriginal;
-    }).map(function(_service) {
-      return {
-        displayName: _service.get('displayName'),
-        fromVersion: _service.get('latestVersion'),
-        toVersion: currentStack.get('stackServices').findProperty('name', _service.get('name')).get('latestVersion')
-      }
-    });
-  },
-
-  /**
-   *
-   * @param {Em.Object} version
-   * @returns {$.ajax}
-   */
-  revertPatchUpgrade: function (version) {
-    this.set('requestInProgress', true);
-    return App.ajax.send({
-      name: 'admin.upgrade.revert',
-      sender: this,
-      success: 'upgradeSuccessCallback',
-      error: 'upgradeErrorCallback',
-      callback: function () {
-        this.sender.set('requestInProgress', false);
-      },
-      data: {
-        upgradeId: version.get('stackVersion').get('revertUpgradeId'),
-        id: version.get('id'),
-        value: version.get('repositoryVersion'),
-        label: version.get('displayName'),
-        isDowngrade: true
-      }
-    });
-  },
-
-  /**
-   * @param {App.RepositoryVersion} version
-   * @returns {Em.Object}
-   */
-  confirmDiscardRepoVersion: function(version) {
-    var self = this;
-    return App.showConfirmationPopup(function() {
-      self.discardRepoVersion(version);
-    });
-  },
-
-  /**
-   * @param {App.RepositoryVersion} version
-   * @returns {$.ajax}
-   */
-  discardRepoVersion: function(version) {
-    this.set('requestInProgress', true);
-    return App.ajax.send({
-      name: 'admin.stack_versions.discard',
-      sender: this,
-      callback: function () {
-        this.sender.set('requestInProgress', false);
-      },
-      data: {
-        id: version.get('id'),
-        stackName: version.get('stackVersionType'),
-        stackVersion: version.get('stackVersionNumber')
-      },
-    });
-  },
-
-  /**
-   * restore last Upgrade data
-   * @param {object} lastUpgradeData
-   */
-  restoreLastUpgrade: function(lastUpgradeData) {
-    var self = this;
-    var upgradeType = this.get('upgradeMethods').findProperty('type', lastUpgradeData.Upgrade.upgrade_type);
-    const isDowngrade = lastUpgradeData.Upgrade.direction === 'DOWNGRADE';
-    this.setDBProperties({
-      toVersion: lastUpgradeData.Upgrade.associated_version,
-      upgradeId: lastUpgradeData.Upgrade.request_id,
-      isDowngrade,
-      upgradeState: lastUpgradeData.Upgrade.request_status,
-      upgradeType: lastUpgradeData.Upgrade.upgrade_type,
-      isWizardRestricted: upgradeType.get('isWizardRestricted'),
-      downgradeAllowed: lastUpgradeData.Upgrade.downgrade_allowed,
-      upgradeTypeDisplayName: upgradeType.get('displayName'),
-      isSuspended: lastUpgradeData.Upgrade.suspended,
-      failuresTolerance: {
-        skipComponentFailures: lastUpgradeData.Upgrade.skip_failures,
-        skipSCFailures: lastUpgradeData.Upgrade.skip_service_check_failures
-      }
-    });
-    this.initDBProperties();
-    App.set('upgradeState', lastUpgradeData.Upgrade.request_status);
-    this.loadRepoVersionsToModel().done(function () {
-      var toVersion = App.RepositoryVersion.find().findProperty('repositoryVersion', lastUpgradeData.Upgrade.associated_version);
-      self.setDBProperty('upgradeVersion', toVersion && toVersion.get('displayName'));
-      self.set('upgradeVersion', toVersion && toVersion.get('displayName'));
-    });
-  },
-
-  /**
-   * Build table from configs list and open new window to show this table
-   * @param configs
-   */
-  openConfigsInNewWindow: function (configs) {
-    var newWindow;
-    var output = '';
-
-    output += '<table style="text-align: left;"><thead><tr>' +
-        '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.configType') + '</th>' +
-        '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.propertyName') + '</th>' +
-        '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.currentValue') + '</th>' +
-        '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.recommendedValue') + '</th>' +
-        '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.resultingValue') + '</th>' +
-        '</tr></thead><tbody>';
-
-    configs.context.forEach(function (config) {
-      output += '<tr>' +
-          '<td>' + config.type + '</td>' +
-          '<td>' + config.name + '</td>' +
-          '<td>' + config.currentValue + '</td>' +
-          '<td>' + config.recommendedValue + '</td>' +
-          '<td>' + config.resultingValue + '</td>' +
-          '</tr>';
-    });
-
-    output += '</tbody></table>';
-    newWindow = window.open();
-    newWindow.document.write(output);
-    newWindow.focus();
-  },
-
-  /**
-   * load version for services to display on Choose Services page
-   * should load from VersionDefinition endpoint
-   */
-  loadServiceVersionFromVersionDefinitions: function () {
-    return App.ajax.send({
-      name: 'cluster.load_current_repo_stack_services',
-      sender: this,
-      data: {
-        clusterName: App.get('clusterName')
-      },
-      success: 'loadServiceVersionFromVersionDefinitionsSuccessCallback',
-      error: 'loadServiceVersionFromVersionDefinitionsErrorCallback'
-    });
-  },
-
-  serviceVersionsMap: {},
-
-  /**
-   * @param {object|null} jsonData
-   */
-  loadServiceVersionFromVersionDefinitionsSuccessCallback: function (jsonData) {
-    var rv = Em.getWithDefault(jsonData, 'items', []).filter(function(i) {
-      return Em.getWithDefault(i, 'ClusterStackVersions.stack', null) === App.get('currentStackName') &&
-       Em.getWithDefault(i, 'ClusterStackVersions.version', null) === App.get('currentStackVersionNumber');
-    })[0];
-    var map = this.get('serviceVersionsMap');
-    var stackServices = Em.getWithDefault(rv || {}, 'repository_versions.0.RepositoryVersions.stack_services', false);
-    if (stackServices) {
-      stackServices.forEach(function (item) {
-        map[item.name] = item.versions[0];
-      });
-    }
-  },
-
-  loadServiceVersionFromVersionDefinitionsErrorCallback: function (request, ajaxOptions, error) {}
-
-});
diff --git a/ambari-web/app/data/controller_route.js b/ambari-web/app/data/controller_route.js
index 13d0380..193a353 100644
--- a/ambari-web/app/data/controller_route.js
+++ b/ambari-web/app/data/controller_route.js
@@ -70,10 +70,6 @@ module.exports = [
     route: 'main.services.rollbackHighAvailability'
   },
   {
-    wizardControllerName: App.router.get('mainAdminStackAndUpgradeController.name'),
-    route: App.db.get('MainAdminStackAndUpgrade', 'upgradeState') === 'NOT_REQUIRED' ? 'main.admin.stackAndUpgrade.index' : 'main.admin.stackAndUpgrade.versions'
-  },
-  {
     wizardControllerName: App.router.get('widgetWizardController.name'),
     route: 'main.createWidget'
   },
diff --git a/ambari-web/app/mappers.js b/ambari-web/app/mappers.js
index f310d44..49bd42e 100644
--- a/ambari-web/app/mappers.js
+++ b/ambari-web/app/mappers.js
@@ -51,5 +51,4 @@ require('mappers/socket/host_component_status_mapper');
 require('mappers/socket/alert_summary_mapper');
 require('mappers/socket/host_state_mapper');
 require('mappers/socket/alert_definitions_mapper_adapter');
-require('mappers/socket/alert_groups_mapper_adapter');
-require('mappers/socket/upgrade_state_mapper');
+require('mappers/socket/alert_groups_mapper_adapter');
\ No newline at end of file
diff --git a/ambari-web/app/mappers/socket/upgrade_state_mapper.js b/ambari-web/app/mappers/socket/upgrade_state_mapper.js
deleted file mode 100644
index 1670ed5..0000000
--- a/ambari-web/app/mappers/socket/upgrade_state_mapper.js
+++ /dev/null
@@ -1,42 +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.upgradeStateMapper = App.QuickDataMapper.create({
-
-  /**
-   * @param {object} event
-   */
-  map: function (event) {
-    var controller = App.router.get('mainAdminStackAndUpgradeController');
-    if (event.type === 'CREATE') {
-      controller.restoreLastUpgrade({Upgrade: event});
-    }
-    //TODO rename type to eventType
-    if (event.type === 'UPDATE' && controller.get('upgradeId') === event.request_id) {
-      if (!Em.isNone(event.request_status)) {
-        App.set('upgradeState', event.request_status);
-        controller.setDBProperty('upgradeState', event.request_status);
-      }
-      if (!Em.isNone(event.suspended)) {
-        controller.set('isSuspended', event.suspended);
-        controller.setDBProperty('isSuspended', event.suspended);
-      }
-    }
-  }
-});
diff --git a/ambari-web/app/router.js b/ambari-web/app/router.js
index c1e060f..2c11aa9 100644
--- a/ambari-web/app/router.js
+++ b/ambari-web/app/router.js
@@ -709,16 +709,8 @@ App.Router = Em.Router.extend({
                 route = wizardControllerRoute.route;
               }
             }
-            if (wizardControllerRoute && wizardControllerRoute.wizardControllerName === 'mainAdminStackAndUpgradeController') {
-              var clusterController = App.router.get('clusterController');
-              clusterController.loadClusterName().done(function(){
-                clusterController.restoreUpgradeState().done(function(){
-                  callback(route);
-                });
-              });
-            } else {
-              callback(route);
-            }
+
+            callback(route);
           });
         });
       } else {
diff --git a/ambari-web/app/routes/main.js b/ambari-web/app/routes/main.js
index 8589b32..ab2ef31 100644
--- a/ambari-web/app/routes/main.js
+++ b/ambari-web/app/routes/main.js
@@ -88,18 +88,6 @@ module.exports = Em.Route.extend(App.RouterRedirections, {
       }
     });
   },
-  /*
-   routePath: function(router,event) {
-   if (router.getAuthenticated()) {
-   App.router.get('clusterController').loadClusterName(false);
-   router.get('mainController').initialize();
-   // TODO: redirect to last known state
-   } else {
-   Ember.run.next(function () {
-   router.transitionTo('login');
-   });
-   }
-   }, */
 
   index: Ember.Route.extend({
     route: '/',
@@ -580,64 +568,6 @@ module.exports = Em.Route.extend(App.RouterRedirections, {
       }
     }),
 
-    stackAndUpgrade: Em.Route.extend({
-      route: '/stack',
-      breadcrumbs: null,
-      connectOutlets: function (router) {
-        router.set('mainAdminController.category', "stackAndUpgrade");
-        router.set('mainAdminController.categoryLabel', Em.I18n.t('admin.stackUpgrade.title'));
-        router.get('mainAdminController').connectOutlet('mainAdminStackAndUpgrade');
-      },
-
-      index: Em.Route.extend({
-        route: '/',
-        redirectsTo: 'services'
-      }),
-
-      services: Em.Route.extend({
-
-        breadcrumbs: {
-          label: Em.I18n.t('common.stack')
-        },
-
-        route: '/services',
-        connectOutlets: function (router, context) {
-          router.get('mainAdminStackAndUpgradeController').connectOutlet('mainAdminStackServices');
-        }
-      }),
-
-      versions: Em.Route.extend({
-        breadcrumbs: {
-          label: Em.I18n.t('common.versions')
-        },
-        route: '/versions',
-        connectOutlets: function (router, context) {
-          router.get('mainAdminStackAndUpgradeController').connectOutlet('MainAdminStackVersions');
-        }
-      }),
-
-      upgradeHistory: Em.Route.extend({
-
-        breadcrumbs: {
-          label: Em.I18n.t('common.upgrade.history')
-        },
-
-        route: '/history',
-        connectOutlets: function (router, context) {
-          router.get('mainAdminStackAndUpgradeController').connectOutlet('mainAdminStackUpgradeHistory');
-        },
-      }),
-
-      stackNavigate: function (router, event) {
-        var parent = event.view._parentView;
-        parent.deactivateChildViews();
-        event.view.set('active', "active");
-        router.transitionTo(event.context);
-      }
-    }),
-    
-    stackUpgrade: require('routes/stack_upgrade_routes'),
-
     adminAdvanced: Em.Route.extend({
       route: '/advanced',
       connectOutlets: function (router) {
diff --git a/ambari-web/app/routes/stack_upgrade_routes.js b/ambari-web/app/routes/stack_upgrade_routes.js
deleted file mode 100644
index d36253a..0000000
--- a/ambari-web/app/routes/stack_upgrade_routes.js
+++ /dev/null
@@ -1,95 +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');
-
-module.exports = App.WizardRoute.extend({
-  route: 'stack/upgrade',
-
-  breadcrumbs: {
-    labelBindingPath: 'App.router.mainAdminStackAndUpgradeController.wizardModalTitle'
-  },
-
-  enter: function (router) {
-    if (App.isAuthorized('CLUSTER.UPGRADE_DOWNGRADE_STACK')) {
-      router.get('mainController').dataLoading().done(function () {
-        Ember.run.next(function () {
-          //if upgrade id is absent then upgrade is completed
-          if (Em.isNone(App.db.get('MainAdminStackAndUpgrade', 'upgradeId'))) {
-            router.transitionTo('main.admin.stackAndUpgrade.versions');
-            return null;
-          }
-
-          App.router.get('updateController').set('isWorking', false);
-
-          return App.ModalPopup.show({
-            classNames: ['upgrade-wizard-modal'],
-            modalDialogClasses: ['modal-xlg'],
-            headerClass: Em.View.extend({
-              header: Em.computed.alias('controller.wizardModalTitle'),
-              controllerBinding: 'App.router.mainAdminStackAndUpgradeController',
-              template: Ember.Handlebars.compile(
-                '{{view.header}}' +
-                '<div {{bindAttr class=":upgrade-options-link controller.isDowngrade:disabled" disabled="controller.isDowngrade"}} {{action openUpgradeOptions target="controller"}}>' +
-                '<i class="icon-cogs"></i><a>{{t admin.stackVersions.version.upgrade.upgradeOptions.header}}</a>' +
-                '</div>'
-              )
-            }),
-            bodyClass: App.upgradeWizardView,
-            primary: Em.I18n.t('common.dismiss'),
-            secondary: null,
-            didInsertElement: function () {
-              this._super();
-              this.fitHeight();
-              this.fitInnerHeight();
-            },
-
-            /**
-             * fit height of scrollable block inside of modal body
-             */
-            fitInnerHeight: function () {
-              var block = this.$().find('.modal .modal-body');
-              var scrollable = this.$().find('.modal .scrollable-block');
-
-              scrollable.css('max-height', Number(block.css('max-height').slice(0, -2)) - block.height());
-              block.css('max-height', 'none');
-            },
-            onPrimary: function () {
-              this.closeWizard();
-            },
-            onClose: function () {
-              this.closeWizard();
-            },
-            closeWizard: function () {
-              App.router.get('updateController').set('isWorking', true);
-              App.router.transitionTo('main.admin.stackAndUpgrade.versions');
-              this.hide();
-              if (['NOT_REQUIRED', 'COMPLETED'].contains(App.get('upgradeState'))) {
-                location.reload();
-              }
-            }
-          });
-        });
-      });
-    } else {
-      Em.run.next(function () {
-        App.router.transitionTo('main.views');
-      });
-    }
-  }
-});
diff --git a/ambari-web/app/templates/application.hbs b/ambari-web/app/templates/application.hbs
index b108a94..5748c83 100644
--- a/ambari-web/app/templates/application.hbs
+++ b/ambari-web/app/templates/application.hbs
@@ -202,32 +202,6 @@
 
   <div class="container main-container">
     <div id="content">
-      {{#if App.wizardIsNotFinished}}
-        <div class="ru-badge row">
-          {{#if isExistingClusterDataLoaded}}
-            <p class="col-md-4 col-md-offset-4">
-              {{#if App.router.wizardWatcherController.isNonWizardUser}}
-                <span class="label upgrade-in-progress">
-                  <i class="glyphicon glyphicon-cog"></i>&nbsp;{{App.router.wizardWatcherController.wizardDisplayName}}
-                </span>
-              {{/if}}
-              {{#if showUpgradeLabel}}
-                <a href="#" {{action "openUpgradeDialog" target="App.router.mainAdminStackAndUpgradeController"}}>
-                  <span {{bindAttr class="upgradeMap.cls :label"}}>
-                    <i {{bindAttr class="upgradeMap.icon :glyphicon"}}></i>&nbsp;
-                    {{upgradeMap.msg}}
-                  </span>
-                </a>
-              {{/if}}
-            </p>
-          {{/if}}
-        </div>
-        <div class="row">
-          {{#if App.router.mainAdminStackAndUpgradeController.isFinalizeItem}}
-          <p class="col-md-10 col-md-offset-1 alert alert-danger">{{t admin.stackVersions.version.upgrade.notFinalized.warning}}</p>
-          {{/if}}
-        </div>
-      {{/if}}
       {{outlet}}
     </div>
   </div>
diff --git a/ambari-web/app/templates/main/admin/stack_and_upgrade.hbs b/ambari-web/app/templates/main/admin/stack_and_upgrade.hbs
deleted file mode 100644
index e0a7242..0000000
--- a/ambari-web/app/templates/main/admin/stack_and_upgrade.hbs
+++ /dev/null
@@ -1,22 +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.
-}}
-
-<div id="stack-upgrade-page">
-  {{view App.MainAdminStackMenuView}}
-  {{outlet}}
-</div>
\ No newline at end of file
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/services.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/services.hbs
deleted file mode 100644
index f1c61f9..0000000
--- a/ambari-web/app/templates/main/admin/stack_upgrade/services.hbs
+++ /dev/null
@@ -1,123 +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.
-}}
-
-
-<div class="row">
-  <h2 class="table-title col-sm-1">{{t common.stack}}</h2>
-</div>
-<table class="table table-hover">
-  <thead>
-  <tr>
-    <th>{{t common.service}}</th>
-    <th>{{t common.version}}</th>
-    <th>{{t common.status}}</th>
-    <th>{{t common.description}}</th>
-  </tr>
-  </thead>
-  <tbody>
-    {{#each service in view.services}}
-    <tr>
-      <td class="service-display-name">{{service.displayName}}</td>
-      <td class="service-stack-version">{{service.serviceVersionDisplay}}</td>
-      <td class="stack-version-state">
-        {{#if service.isInstalled}}
-          <span class="label label-success">{{t common.installed}}</span>
-        {{else}}
-          <a {{bindAttr class=":path-link view.isAddServiceAvailable::not-active-link"}} {{action goToAddService service.serviceName target="view"}}>
-            {{t services.service.add}}</a>
-        {{/if}}
-      </td>
-      <td class="service-description">{{{service.comments}}}</td>
-    </tr>
-    {{/each}}
-  </tbody>
-</table>
-
-{{#unless App.stackVersionsAvailable}}
-
-  <div class="header">
-    <strong>{{t admin.cluster.repositories.repositories}}</strong>
-  </div>
-  <ul class="nav nav-tabs">
-    <li class="active">
-      <a href="javascript:void(null);">{{view.allRepositoriesGroups.stackVersion}}</a>
-    </li>
-  </ul>
-
-  <div class="admin-cluster">
-    <div class="repositories-table">
-      <div class="thead">
-        <div class="th os-th">{{t common.os}}</div>
-        <div class="th name-th">{{t common.name}}</div>
-        <div class="th url-th">{{t installer.step1.advancedRepo.localRepo.column.baseUrl}}</div>
-      </div>
-      <div class="tbody">
-        {{#each repoGroup in view.allRepositoriesGroups}}
-          <div class="trow">
-            <div class="os-td">
-              <label>
-                <span class="os">{{repoGroup.name}}</span>
-              </label>
-            </div>
-            <div style="width:89%">
-              {{#each repository in repoGroup.repositories}}
-                <div class="sub-trow">
-                  <div class="name-td">{{repository.repoId}}</div>
-                  <!--edit mode for current url-->
-                  {{#if repository.onEdit}}
-                    <div {{bindAttr class=":url-td repository.empty-error:textfield-error repository.invalid-error:textfield-error"}}>
-                      {{view Ember.TextField valueBinding="repository.baseUrl" class="form-control"}}
-                    </div>
-                    <div class="clear-td">
-                      {{#if repository.clearAll}}
-                        <a {{action "clearGroupLocalRepository" repository target="view" }}>
-                          <i class="glyphicon glyphicon-remove-sign"></i>
-                        </a>
-                      {{/if}}
-                    </div>
-                    <div class="edit-buttons-td">
-                      <a class="btn btn-default" {{action doCancel repository target="view"}}>{{t common.cancel}}</a>
-                    </div>
-                    <div class="edit-buttons-td">
-                      {{#if repository.empty-error}}
-                        <a class="btn btn-primary" disabled="disabled">{{t common.save}}</a>
-                      {{else}}
-                        <a class="btn btn-primary" {{action saveRepoUrls repository target="view"}}>{{t common.save}}</a>
-                      {{/if}}
-                    </div>
-                    <!--non-edit mode for current url-->
-                  {{else}}
-                    <div class="url-text-td">
-                      {{repository.baseUrl}}
-                    </div>
-                    <div class="edit-td">
-                      <a {{action "onEditClick" repository target="view" }}>
-                        <i class="glyphicon glyphicon-edit"></i> {{t common.edit}}
-                      </a>
-                    </div>
-                  {{/if}}
-                </div>
-              {{/each}}
-            </div>
-          </div>
-        {{/each}}
-      </div>
-    </div>
-  </div>
-
-{{/unless}}
\ No newline at end of file
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
deleted file mode 100644
index 332594e..0000000
--- a/ambari-web/app/templates/main/admin/stack_upgrade/stack_upgrade_wizard.hbs
+++ /dev/null
@@ -1,340 +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.
-}}
-
-<div id="stack-upgrade-dialog">
-
-  <div {{bindAttr class="view.isLoaded::hidden :row"}}>
-    <div class="col-md-2 task-list-main-wrap">{{statusIcon controller.requestStatus}}
-      &nbsp;{{view.upgradeStatusLabel}}</div>
-    <div class="col-md-7">
-      {{view App.ProgressBarView
-        progressBinding="view.overallProgress"
-        statusBinding="controller.requestStatus"
-      }}
-    </div>
-    <div class="col-md-1">
-      {{view.overallProgress}}%
-    </div>
-    <div class="col-md-2 pause-button pull-right">
-        {{#if view.isLoaded}}
-            {{#if showPauseButton}}
-                {{#if isDowngrade}}
-                  <button
-                    class="btn btn-default pull-right" {{action confirmPauseDowngrade target="view"}}>{{t admin.stackUpgrade.pauseDowngrade}}</button>
-                {{else}}
-                  <button
-                    class="btn btn-default pull-right" {{action confirmPauseUpgrade target="view"}}>{{t admin.stackUpgrade.pauseUpgrade}}</button>
-                {{/if}}
-            {{/if}}
-        {{/if}}
-    </div>
-  </div>
-
-  <div class="task-list scrollable-block task-list-main-wrap upgrade-groups">
-      {{#if view.isLoaded}}
-        <div class="panel-group">
-            {{#if view.runningItem}}
-              <div class="panel panel-default details-box row">
-                <div class="panel-heading row">
-                  <div class="pull-left col-md-6">
-                      {{t admin.stackUpgrade.dialog.inProgress}}&nbsp;{{view.runningItem.text}}
-                  </div>
-                    {{#if view.isDetailsOpened}}
-                      <div class="pull-right col-md-6">
-                        <a href="#collapseBox" class="pull-right" {{action toggleDetails target="view"}}
-                           data-toggle="collapse">
-                            {{t admin.stackUpgrade.dialog.details.hide}}
-                        </a>
-                      </div>
-                    {{else}}
-                      <div class="pull-right col-md-6">
-                        <a href="#collapseBox" class="pull-right" {{action toggleDetails target="view"}}
-                           data-toggle="collapse">
-                            {{t admin.stackUpgrade.dialog.details.open}}
-                        </a>
-                      </div>
-                    {{/if}}
-                </div>
-                <div id="collapseBox" class="panel-collapse collapse">
-                  <div class="panel-body">
-                      {{#if view.runningItem.isTasksLoaded}}
-                        <div class="clear col-md-12">
-                            {{view App.upgradeTaskView contentBinding="view.taskDetails" outsideViewBinding="view.outsideView"}}
-                        </div>
-                      {{else}}
-                          {{view App.SpinnerView classNames="clear"}}
-                      {{/if}}
-                  </div>
-                </div>
-              </div>
-            {{/if}}
-            {{#if view.failedItem}}
-                {{#unless view.isSlaveComponentFailuresItem}}
-                  <div class="panel panel-default details-box row">
-                    <div class="panel-heading row">
-                      <div class="pull-left col-md-6">
-                          {{t admin.stackUpgrade.dialog.failed}}&nbsp;{{view.failedItem.text}}
-                      </div>
-                        {{#if view.isDetailsOpened}}
-                          <div class="pull-right col-md-6">
-                            <a href="#collapseBox" class="pull-right" {{action toggleDetails target="view"}}
-                               data-toggle="collapse">
-                                {{t admin.stackUpgrade.dialog.details.hide}}
-                            </a>
-                          </div>
-                        {{else}}
-                          <div class="pull-right col-md-6">
-                            <a href="#collapseBox" class="pull-right" {{action toggleDetails target="view"}}
-                               data-toggle="collapse">
-                                {{t admin.stackUpgrade.dialog.details.open}}
-                            </a>
-                          </div>
-                        {{/if}}
-                    </div>
-                    <div id="collapseBox" class="panel-collapse collapse">
-                      <div class="panel-body">
-                          {{#if view.failedItem.isTasksLoaded}}
-                            <div class="clear col-md-12">
-                                {{view App.upgradeTaskView contentBinding="view.taskDetails" outsideViewBinding="view.outsideView"}}
-                            </div>
-                          {{else}}
-                              {{view App.SpinnerView classNames="clear"}}
-                          {{/if}}
-                      </div>
-                    </div>
-                      {{#if view.isHoldingState}}
-                        <div class="button-row">
-                            {{#if view.isDowngradeAvailable}}
-                              <button
-                                class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.failedItem target="controller"}}>{{t common.downgrade}}</button>
-                            {{/if}}
-                            {{#if view.canSkipFailedItem}}
-                              <button
-                                class="btn btn-warning" {{bindAttr disabled="controller.requestInProgress"}} {{action continue view.failedItem target="view"}}>{{t admin.stackUpgrade.dialog.continue}}</button>
-                            {{/if}}
-                          <button
-                            class="btn btn-default" {{bindAttr disabled="controller.requestInProgress"}} {{action retry view.failedItem target="view"}}>{{t common.retry}}</button>
-                        </div>
-                      {{/if}}
-                  </div>
-                {{/unless}}
-            {{/if}}
-        {{#if view.plainManualItem}}
-          <div class="panel panel-default details-box">
-            <p class="manual-steps-title"><strong>{{t admin.stackUpgrade.dialog.manual}}</strong></p>
-            {{#if view.manualItem.messages.length}}
-              {{#each message in view.manualItem.messages}}
-                <p class="manual-steps-content">{{message}}</p>
-              {{/each}}
-            {{else}}
-              <p class="manual-steps-content">{{t admin.stackUpgrade.dialog.skipped.failures}}</p>
-            {{/if}}
-            <label class="message">
-              {{view App.CheckboxView checkedBinding="view.isManualDone" labelTranslate="admin.stackUpgrade.dialog.manualDone"}}
-            </label>
-            <div class="button-row">
-              {{#if view.isDowngradeAvailable}}
-                <button class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.manualItem target="controller"}}>{{t common.downgrade}}</button>
-              {{/if}}
-              <button class="btn btn-success" {{bindAttr disabled="view.isManualProceedDisabled"}} {{action complete view.manualItem target="view"}}>
-                {{t common.proceed}}
-              </button>
-            </div>
-          </div>
-        {{/if}}
-        {{#if view.isFinalizeItem}}
-          <div class="panel panel-default details-box">
-            <p class="manual-steps-title"><strong>{{t admin.stackUpgrade.dialog.manual}}</strong></p>
-            {{#if isDowngrade}}
-              <p class="manual-steps-content">{{t admin.stackUpgrade.finalize.message.downgrade}}</p>
-            {{else}}
-                {{#if view.isRevertibleUpgrade}}
-                  <p class="manual-steps-content">{{{view.revertibleFinalizeMessage}}}</p>
-                {{else}}
-                  <p class="manual-steps-content">{{t admin.stackUpgrade.finalize.message.upgrade}}</p>
-                {{/if}}
-            {{/if}}
-              <p class="manual-steps-content"><strong>{{t admin.stackUpgrade.finalize.message.autoStart}}</strong></p>
-
-            {{#if areSkippedServiceChecksLoaded}}
-              {{#if skippedServiceChecks.length}}
-                <div>{{t admin.stackUpgrade.finalize.message.skippedServiceChecks}}</div>
-                <ul>
-                  {{#each serviceName in skippedServiceChecks}}
-                    <li>{{serviceName}}</li>
-                  {{/each}}
-                </ul>
-                <div>{{t admin.stackUpgrade.finalize.message.testServices}}</div>
-              {{/if}}
-            {{else}}
-              {{view App.SpinnerView}}
-            {{/if}}
-
-            <label class="message">
-              {{view App.CheckboxView checkedBinding="view.isManualDone" labelTranslate="admin.stackUpgrade.dialog.manualDone"}}
-            </label>
-            <div class="button-row">
-              {{#if view.isDowngradeAvailable}}
-                <button class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.manualItem target="controller"}}>{{t common.downgrade}}</button>
-              {{/if}}
-                <button class="btn btn-default" {{action confirmPauseUpgrade target="view"}}>{{t admin.stackUpgrade.finalize.later}}</button>
-                <button class="btn btn-success" {{bindAttr disabled="view.isManualProceedDisabled"}} {{action complete view.manualItem target="view"}}>
-                  {{t common.finalize}}
-                </button>
-            </div>
-          </div>
-        {{/if}}
-        {{#if view.isSlaveComponentFailuresItem}}
-          <div class="panel panel-default details-box">
-            <p class="manual-steps-title"><strong>{{t admin.stackUpgrade.dialog.manual}}</strong></p>
-            <div class="slave-failures-info">
-            <p>
-              {{#if areSlaveComponentFailuresHostsLoaded}}
-                {{t admin.stackUpgrade.failedHosts.message}}
-                <a href="#" {{action showFailedHosts target="view"}}>{{view.failedHostsMessage}}</a>
-              {{else}}
-                {{view App.SpinnerView}}
-              {{/if}}
-                </p>
-                <p>
-                  {{t admin.stackUpgrade.failedHosts.options}}
-                <ul>
-                  {{#if view.isOutOfSync}}
-                    <li>{{t admin.stackUpgrade.failedHosts.isOutOfSync.options.first}}</li>
-                    <li>{{t admin.stackUpgrade.failedHosts.isOutOfSync.options.second}}</li>
-                  {{/if}}
-                  <li>{{t admin.stackUpgrade.failedHosts.options.first}}</li>
-                  {{#if view.isDowngradeAvailable}}
-                    <li>{{t admin.stackUpgrade.failedHosts.options.second}}</li>
-                  {{/if}}
-                </ul>
-                </p>
-            </div>
-            {{#unless view.isHoldingState}}
-              <label class="message">
-                {{view App.CheckboxView checkedBinding="view.isManualDone" labelTranslate="admin.stackUpgrade.dialog.manualDone"}}
-              </label>
-            {{/unless}}
-            <div class="button-row">
-              {{#if view.isDowngradeAvailable}}
-                <button class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.manualItem target="controller"}}>{{t common.downgrade}}</button>
-              {{/if}}
-              {{#if view.isHoldingState}}
-                <button class="btn btn-default" {{bindAttr disabled="controller.requestInProgress"}} {{action retry view.failedItem target="view"}}>{{t common.retry}}</button>
-              {{else}}
-              <button class="btn btn-success" {{bindAttr disabled="view.isManualProceedDisabled"}} {{action complete view.manualItem target="view"}}>
-                {{t common.proceed}}
-              </button>
-              {{/if}}
-            </div>
-          </div>
-        {{/if}}
-        {{#if view.isServiceCheckFailuresItem}}
-          <div class="panel panel-default details-box">
-            <p class="manual-steps-title"><strong>{{t admin.stackUpgrade.dialog.manual}}</strong></p>
-
-            {{#if areServiceCheckFailuresServicenamesLoaded}}
-              {{#if serviceCheckFailuresServicenames.length}}
-                <div class="service-check-failures-info">
-                  <p class="service-check-failures-title"><strong>{{t admin.stackUpgrade.dialog.manual.serviceCheckFailures.title}}</strong></p>
-                  <div>{{t admin.stackUpgrade.dialog.manual.serviceCheckFailures.msg1}}</div>
-                  <ul class="failed-info-list">
-                    {{#each serviceName in serviceCheckFailuresServicenames}}
-                      <li>{{serviceName}}</li>
-                    {{/each}}
-                  </ul>
-                  <div>{{t admin.stackUpgrade.dialog.manual.serviceCheckFailures.msg2}}</div>
-                </div>
-              {{/if}}
-              {{#if slaveComponentStructuredInfo.hosts.length}}
-                <div class="slave-failures-info">
-                  <p class="slave-failures-title"><strong>{{t admin.stackUpgrade.dialog.manual.slaveComponentFailures.title}}</strong></p>
-                  <p>
-                    {{t admin.stackUpgrade.failedHosts.message}}
-                      <a href="#" {{action showFailedHosts target="view"}}>{{view.failedHostsMessage}}</a>
-                  </p>
-                  <p>
-                    {{t admin.stackUpgrade.failedHosts.options}}
-                  <ul>
-                    <li>{{t admin.stackUpgrade.failedHosts.options.first}}</li>
-                    <li>{{t admin.stackUpgrade.failedHosts.options.third}}</li>
-                    {{#if view.isDowngradeAvailable}}
-                      <li>{{t admin.stackUpgrade.failedHosts.options.second}}</li>
-                    {{/if}}
-                  </ul>
-                  </p>
-                </div>
-              {{/if}}
-            {{else}}
-                {{view App.SpinnerView}}
-            {{/if}}
-
-            <label class="message">
-              {{view App.CheckboxView checkedBinding="view.isManualDone" labelTranslate="admin.stackUpgrade.dialog.manualDone"}}
-            </label>
-            <div class="button-row">
-              {{#if view.isDowngradeAvailable}}
-                  <button class="btn btn-danger" {{bindAttr disabled="controller.requestInProgress"}} {{action confirmDowngrade view.manualItem target="controller"}}>{{t common.downgrade}}</button>
-              {{/if}}
-              <button class="btn btn-success" {{bindAttr disabled="view.isManualProceedDisabled"}} {{action complete view.manualItem target="view"}}>
-                {{t common.proceed}}
-              </button>
-            </div>
-          </div>
-        {{/if}}
-        {{#if view.noActiveItem}}
-          <div class="panel panel-default details-box">
-            <div>
-              {{t admin.stackUpgrade.dialog.notActive}}
-            </div>
-          </div>
-        {{/if}}
-        {{#if App.upgradeSuspended}}
-          <div class="panel panel-default details-box">
-            <label class="message">
-            {{#if isDowngrade}}
-              {{t admin.stackUpgrade.dialog.suspended.downgrade}}
-            {{else}}
-              {{t admin.stackUpgrade.dialog.suspended}}
-            {{/if}}
-            </label>
-            <div class="button-row">
-              {{#if isDowngrade}}
-                <button class="btn btn-primary" {{action resumeUpgrade target="controller"}}>
-                  {{t admin.stackUpgrade.dialog.resume.downgrade}}
-                </button>
-              {{else}}
-                <button class="btn btn-primary" {{action resumeUpgrade target="controller"}}>
-                  {{t admin.stackUpgrade.dialog.resume}}
-                </button>
-              {{/if}}
-            </div>
-          </div>
-        {{/if}}
-      </div>
-      {{#each group in view.upgradeGroups}}
-        {{#if group.isVisible}}
-          {{view App.upgradeGroupView contentBinding="group"}}
-        {{/if}}
-      {{/each}}
-    {{/if}}
-  </div>
-  {{#unless view.isLoaded}}
-    {{view App.SpinnerView}}
-  {{/unless}}
-</div>
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_configs_merge_table.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_configs_merge_table.hbs
index b78ba5a..aecf410 100644
--- a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_configs_merge_table.hbs
+++ b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_configs_merge_table.hbs
@@ -17,7 +17,7 @@
 }}
 
 <h4 class="configurations-changes-header">{{t popup.clusterCheck.Upgrade.configsMerge.title}}</h4>
-<a {{action openConfigsInNewWindow view.configs target="App.router.mainAdminStackAndUpgradeController"}} {{translateAttr title="common.openNewWindow"}} class="pull-right open-in-new-window" href="#">
+<a {{action openConfigsInNewWindow view.configs target="view"}} {{translateAttr title="common.openNewWindow"}} class="pull-right open-in-new-window" href="#">
   <i class="icon-external-link"></i> <span>{{t common.open}}</span>
 </a>
 <div class="alert alert-warning">
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_configs_recommend_table.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_configs_recommend_table.hbs
index 8df3327..be0bfce 100644
--- a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_configs_recommend_table.hbs
+++ b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_configs_recommend_table.hbs
@@ -17,7 +17,7 @@
 }}
 
 <h4 class="configurations-changes-header">{{t popup.clusterCheck.Upgrade.configsRecommend.title}}</h4>
-<a {{action openConfigsInNewWindow view.configs target="App.router.mainAdminStackAndUpgradeController"}} {{translateAttr title="common.openNewWindow"}} class="pull-right open-in-new-window" href="#">
+<a {{action openConfigsInNewWindow view.configs target="view"}} {{translateAttr title="common.openNewWindow"}} class="pull-right open-in-new-window" href="#">
   <i class="icon-external-link"></i> <span id="i18n-34">{{t common.open}}</span>
 </a>
 <div class="alert alert-warning">
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_box.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_box.hbs
deleted file mode 100644
index d40483d..0000000
--- a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_box.hbs
+++ /dev/null
@@ -1,116 +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.
-}}
-
-{{#if view.isOutOfSync}}
-  <i class="glyphicon glyphicon-exclamation-sign out-of-sync-badge"></i>
-{{/if}}
-
-<p {{bindAttr class=":version view.isRepoUrlsEditDisabled:not-active-link"}}>
-  <span>{{view.content.displayName}}</span>
-  <a class="pull-right not-active link-tooltip" {{action editRepositories target="view"}}>
-    <i class="glyphicon glyphicon-edit"></i>
-  </a>
-</p>
-<p class="repository-name">({{view.content.repositoryVersion}})</p>
-
-<p class="patch-icon">
-  {{#if view.content.isMaint}}
-    <i class="icon-wrench"></i>&nbsp;{{t common.maint}}
-  {{/if}}
-  {{#if view.content.isPatch}}
-    <i class="icon-bug"></i>&nbsp;{{t common.patch}}
-  {{/if}}
-  {{#if view.content.isService}}
-    <i class="icon-umbrella"></i>&nbsp;{{t common.service}}
-  {{/if}}
-</p>
-
-
-<div {{bindAttr class="view.stateElement.isInstalling:installing :align-center :state :repo-version-tooltip"}}>
-  {{#if view.stateElement.isButton}}
-    <button class="btn btn-primary"
-      {{action runAction target="view"}}
-      {{bindAttr disabled="view.stateElement.isDisabled"}}>
-      {{view.stateElement.text}}
-    </button>
-  {{/if}}
-  {{#if view.stateElement.isButtonGroup}}
-    <div class="btn-group">
-      <button class="btn btn-primary"
-        {{action runAction target="view"}}
-        {{bindAttr disabled="view.stateElement.isDisabled"}}>
-        {{view.stateElement.text}}
-      </button>
-      <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown" {{bindAttr disabled="view.stateElement.isDisabled"}}>
-        <span class="caret"></span>
-      </button>
-      <ul class="dropdown-menu">
-        {{#each button in view.stateElement.buttons}}
-          <li {{bindAttr class="button.isDisabled:disabled"}}>
-            <a {{action runAction button.action target="view"}}>
-              {{button.text}}
-            </a>
-          </li>
-        {{/each}}
-      </ul>
-    </div>
-  {{/if}}
-  {{#if view.stateElement.isLabel}}
-    <span {{bindAttr class="view.stateElement.class"}}>{{view.stateElement.text}}</span>
-  {{/if}}
-  {{#if view.stateElement.isLink}}
-    {{#if view.stateElement.iconClass}}
-      <i {{bindAttr class="view.stateElement.iconClass" disabled="view.stateElement.isDisabled"}}></i>
-    {{/if}}
-    <a href="#" {{action runAction target="view"}}
-        {{bindAttr disabled="view.stateElement.isDisabled"}}>{{view.stateElement.text}}</a>
-    {{#if view.stateElement.isInstalling}}
-      {{view App.ProgressBarView
-        progressBinding="view.installProgress"
-        statusBinding="view.PROGRESS_STATUS"
-      }}
-    {{/if}}
-  {{/if}}
-  {{#if view.stateElement.isSpinner}}
-    {{view App.SpinnerView}}
-  {{/if}}
-</div>
-
-<div class="hosts-section">
-  <div class="hosts-bar">{{t common.hosts}}</div>
-  <div class="row host-link">
-    <div class="col-md-4 align-center not-installed-hosts">
-      <div><a href="#" class="hosts-tooltip not-active" {{bindAttr data-original-title="view.content.noInitHostsTooltip" }}
-        {{action showHosts view.versionStateMap.not_installed target="view"}}>
-        {{view.notInstalledHosts.length}}</a></div>
-      <div>{{t admin.stackVersions.version.notInstalled}}</div>
-    </div>
-    <div class="col-md-4 align-center installed-hosts">
-      <div><a href="#" class="hosts-tooltip not-active" {{bindAttr data-original-title="view.content.noInstalledHostsTooltip" }}
-        {{action showHosts view.versionStateMap.installed target="view"}}>
-        {{view.installedHosts.length}}</a></div>
-      <div>{{t common.installed}}</div>
-    </div>
-    <div class="col-md-4 align-center current-hosts">
-      <div><a href="#" class="hosts-tooltip not-active" {{bindAttr data-original-title="view.content.noCurrentHostsTooltip" }}
-        {{action showHosts view.versionStateMap.current target="view"}}>
-        {{view.currentHosts.length}}</a></div>
-      <div>{{t common.current}}</div>
-    </div>
-  </div>
-</div>
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_column.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_column.hbs
deleted file mode 100644
index bfeae65..0000000
--- a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_column.hbs
+++ /dev/null
@@ -1,121 +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.
-}}
-
-{{#if view.isOutOfSync}}
-  <i class="glyphicon glyphicon-exclamation-sign out-of-sync-badge"></i>
-{{/if}}
-
-<p class="version-column-display-name">
-  {{#if view.content.isStandard}}
-    <span>{{view.content.displayNameSimple}}</span>
-  {{else}}
-    <span>{{view.content.displayName}}</span>
-  {{/if}}
-</p>
-
-<p class="version-column-display-type">
-  {{#if view.content.isMaint}}
-    <i class="icon-wrench"></i>&nbsp;{{t common.maint}}
-  {{/if}}
-  {{#if view.content.isPatch}}
-    <i class="icon-bug"></i>&nbsp;{{t common.patch}}
-  {{/if}}
-  {{#if view.content.isService}}
-    <i class="icon-umbrella"></i>&nbsp;{{t common.service}}
-  {{/if}}
-</p>
-
-<p class="version-column-show-details">
-  <a {{action openVersionBoxPopup target="view"}}>{{t admin.stackVersions.version.column.showDetails}}</a>
-</p>
-<div {{bindAttr class="view.stateElement.isInstalling:installing :align-center :state :repo-version-tooltip"}}>
-  {{#if view.stateElement.isButton}}
-    <button class="btn btn-primary"
-      {{action runAction target="view"}}
-      {{bindAttr disabled="view.stateElement.isDisabled"}}>
-      {{view.stateElement.text}}
-    </button>
-  {{/if}}
-  {{#if view.stateElement.isButtonGroup}}
-    <div class="btn-group">
-      <button class="btn btn-primary"
-        {{action runAction target="view"}}
-        {{bindAttr disabled="view.stateElement.isDisabled"}}>
-        {{view.stateElement.text}}
-      </button>
-      <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown" {{bindAttr disabled="view.stateElement.isDisabled"}}>
-        <span class="caret"></span>
-      </button>
-      <ul class="dropdown-menu">
-        {{#each button in view.stateElement.buttons}}
-          <li {{bindAttr class="button.isDisabled:disabled"}}>
-            <a {{action runAction button.action target="view"}}>
-              {{button.text}}
-            </a>
-          </li>
-        {{/each}}
-      </ul>
-    </div>
-  {{/if}}
-  {{#if view.stateElement.isLabel}}
-    <div class="label-wrapper">
-      <span {{bindAttr class="view.stateElement.class"}}>{{view.stateElement.text}}</span>
-      {{#if view.stateElement.canBeReverted}}
-        <button class="btn dropdown-toggle" data-toggle="dropdown">
-          <span class="caret"></span>
-        </button>
-        <ul class="dropdown-menu">
-          <li>
-            <a {{action runAction view.stateElement.action target="view"}}>
-              {{view.stateElement.actionText}}
-            </a>
-          </li>
-        </ul>
-      {{/if}}
-    </div>
-  {{/if}}
-  {{#if view.stateElement.isLink}}
-    {{#if view.stateElement.iconClass}}
-      <i {{bindAttr class="view.stateElement.iconClass" disabled="view.stateElement.isDisabled"}}></i>
-    {{/if}}
-    <a href="#" {{action runAction target="view"}}
-        {{bindAttr disabled="view.stateElement.isDisabled"}}>{{view.stateElement.text}}</a>
-    {{#if view.stateElement.isInstalling}}
-      {{view App.ProgressBarView
-          progressBinding="view.installProgress"
-          statusBinding="view.PROGRESS_STATUS"
-          }}
-    {{/if}}
-  {{/if}}
-  {{#if view.stateElement.isSpinner}}
-    {{view App.SpinnerView}}
-  {{/if}}
-</div>
-
-<div class="services-section">
-  {{#each service in view.services}}
-    <p class="service-version-info">
-       <span {{bindAttr class="service.isVersionInvisible:invisible service.isAvailable:available :label"}}>
-           {{service.latestVersion}}
-       </span>
-        {{#if service.notUpgradable}}
-          <i class="icon-info-sign not-upgradable"></i>
-        {{/if}}
-    </p>
-  {{/each}}
-</div>
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/versions.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/versions.hbs
deleted file mode 100644
index 47f9a2d..0000000
--- a/ambari-web/app/templates/main/admin/stack_upgrade/versions.hbs
+++ /dev/null
@@ -1,71 +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.
-}}
-
-<div id="versions-filter-section" class="btn-toolbar">
-  {{#havePermissions "AMBARI.MANAGE_STACK_VERSIONS"}}
-    <button class="btn btn-primary" {{action goToVersions target="view"}}  {{bindAttr disabled="App.router.wizardWatcherController.isNonWizardUser"}} id="manage-versions-link">
-        <i class="icon-external-link"></i>&nbsp;{{t admin.stackVersions.manageVersions}}
-    </button>
-  {{/havePermissions}}
-  <div class="btn-group display-inline-block">
-    <button class="btn btn-default dropdown-toggle" data-toggle="dropdown" href="#">
-      <span class="filters-label">{{t common.filter}}: </span>
-        <span>
-          {{view.selectedCategory.label}}
-          <span class="caret"></span>
-        </span>
-    </button>
-    <ul class="dropdown-menu">
-      {{#each category in view.categories}}
-        <li>
-          <a {{action selectCategory category target="view"}} href="#">
-            {{category.label}}
-          </a>
-        </li>
-      {{/each}}
-    </ul>
-  </div>
-</div>
-<div id="versions-section" class="row col-md-12">
-  <div class="col-md-3 left-menu-table">
-    <table class="table border-extended-table">
-      <thead>
-      </thead>
-      <tbody>
-        {{#each service in view.services}}
-          <tr>
-            <td class="service-display-name">{{service.displayName}}</td>
-          </tr>
-        {{/each}}
-      </tbody>
-    </table>
-  </div>
-  <div class="col-md-9 versions-slides">
-    {{#if isLoaded}}
-      <div class="versions-slides-bar">
-        {{#each version in view.repoVersions}}
-          {{#if version.isVisible}}
-            {{view App.UpgradeVersionColumnView contentBinding="version"}}
-          {{/if}}
-        {{/each}}
-      </div>
-    {{else}}
-      {{view App.SpinnerView}}
-    {{/if}}
-  </div>
-</div>
diff --git a/ambari-web/app/templates/main/host/stack_versions.hbs b/ambari-web/app/templates/main/host/stack_versions.hbs
index cf167a4..5cc7ee3 100644
--- a/ambari-web/app/templates/main/host/stack_versions.hbs
+++ b/ambari-web/app/templates/main/host/stack_versions.hbs
@@ -43,13 +43,9 @@
           {{#if version.isCurrent}}
             <span class="label label-success">{{t common.current}}</span>
           {{else}}
-            {{#if version.isInstalling}}
-              <a href="#" {{action showInstallProgress version target="view"}}><i class="glyphicon glyphicon-cog in_progress"></i>&nbsp;{{version.displayStatus}}</a>
-            {{else}}
-              {{version.displayStatus}}
-              {{#if version.isOutOfSync}}
-                {{view view.outOfSyncInfo}}
-              {{/if}}
+            {{version.displayStatus}}
+            {{#if version.isOutOfSync}}
+              {{view view.outOfSyncInfo}}
             {{/if}}
           {{/if}}
         </td>
diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js
index fbc26ae..d288030 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -1867,47 +1867,6 @@ var urls = {
     'mock': ''
   },
 
-  'admin.stack_versions.edit.repo': {
-    'real': '/stacks/{stackName}/versions/{stackVersion}/repository_versions/{repoVersionId}',
-    'mock': '',
-    'type': 'PUT',
-    'format': function (data) {
-      return {
-        data: JSON.stringify(data.repoVersion)
-      }
-    }
-  },
-  'admin.stack_versions.validate.repo': {
-    'real': '/stacks/{stackName}/versions/{stackVersion}/operating_systems/{osType}/repositories/{repoId}?validate_only=true',
-    'mock': '',
-    'type': 'POST',
-    'format': function (data) {
-      return {
-        data: JSON.stringify({
-          "Repositories": {
-            "base_url": data.baseUrl,
-            "repo_name": data.repoName
-          }
-        })
-      }
-    }
-  },
-
-  'admin.stack_versions.discard': {
-    'real': '/stacks/{stackName}/versions/{stackVersion}/repository_versions/{id}',
-    'mock': '',
-    'type': 'PUT',
-    'format': function (data) {
-      return {
-        data: JSON.stringify({
-          "RepositoryVersions":{
-            "hidden": "true"
-          }
-        })
-      }
-    }
-  },
-
   'admin.upgrade.pre_upgrade_check': {
     'real': '/clusters/{clusterName}/rolling_upgrades_check?fields=*&UpgradeChecks/repository_version_id={id}&UpgradeChecks/upgrade_type={type}',
     'mock': '/data/stack_versions/pre_upgrade_check.json'
diff --git a/ambari-web/app/views.js b/ambari-web/app/views.js
index 163484e..92156b5 100644
--- a/ambari-web/app/views.js
+++ b/ambari-web/app/views.js
@@ -231,18 +231,11 @@ require('views/main/admin/serviceAccounts_view');
 require('views/main/admin/serviceGroups_view');
 require('views/main/admin/serviceGroups/upgradeStatus_view');
 require('views/main/admin/serviceGroups/serviceGroup_view');
-require('views/main/admin/stack_upgrade/upgrade_wizard_view');
-require('views/main/admin/stack_upgrade/upgrade_version_box_view');
-require('views/main/admin/stack_upgrade/upgrade_version_column_view');
 require('views/main/admin/stack_upgrade/upgrade_group_view');
 require('views/main/admin/stack_upgrade/upgrade_task_view');
 require('views/main/admin/stack_upgrade/upgrade_history_view');
 require('views/main/admin/stack_upgrade/upgrade_history_details_view');
-require('views/main/admin/stack_upgrade/services_view');
-require('views/main/admin/stack_upgrade/versions_view');
-require('views/main/admin/stack_upgrade/menu_view');
 require('views/main/admin/stack_upgrade/failed_hosts_modal_view');
-require('views/main/admin/stack_and_upgrade_view');
 require('views/main/admin/mpack_upgrade_view');
 require('views/main/admin/mpack_upgrade_view');
 require('views/main/admin/mpackUpgrade/downloadOptions_view');
diff --git a/ambari-web/app/views/common/modal_popups/cluster_check_popup.js b/ambari-web/app/views/common/modal_popups/cluster_check_popup.js
index bef3c90..01f77ce 100644
--- a/ambari-web/app/views/common/modal_popups/cluster_check_popup.js
+++ b/ambari-web/app/views/common/modal_popups/cluster_check_popup.js
@@ -88,16 +88,50 @@ App.showClusterCheckPopup = function (data, popup, configs) {
   });
 };
 
+/**
+ * Build table from configs list and open new window to show this table
+ * @param configs
+ */
+function openConfigsInNewWindow(configs) {
+  var newWindow;
+  var output = '';
+
+  output += '<table style="text-align: left;"><thead><tr>' +
+      '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.configType') + '</th>' +
+      '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.propertyName') + '</th>' +
+      '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.currentValue') + '</th>' +
+      '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.recommendedValue') + '</th>' +
+      '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.resultingValue') + '</th>' +
+      '</tr></thead><tbody>';
+
+  configs.context.forEach(function (config) {
+    output += '<tr>' +
+        '<td>' + config.type + '</td>' +
+        '<td>' + config.name + '</td>' +
+        '<td>' + config.currentValue + '</td>' +
+        '<td>' + config.recommendedValue + '</td>' +
+        '<td>' + config.resultingValue + '</td>' +
+        '</tr>';
+  });
+
+  output += '</tbody></table>';
+  newWindow = window.open();
+  newWindow.document.write(output);
+  newWindow.focus();
+};
+
 App.getMergeConflictsView = function (configs) {
   return Em.View.extend({
     templateName: require('templates/main/admin/stack_upgrade/upgrade_configs_merge_table'),
-    configs: configs
+    configs: configs,
+    openConfigsInNewWindow: openConfigsInNewWindow
   });
 };
 
 App.getNewStackRecommendationsView = function (configs) {
   return Em.View.extend({
     templateName: require('templates/main/admin/stack_upgrade/upgrade_configs_recommend_table'),
-    configs: configs
+    configs: configs,
+    openConfigsInNewWindow: openConfigsInNewWindow
   });
 };
diff --git a/ambari-web/app/views/main/admin.js b/ambari-web/app/views/main/admin.js
index 05d0f56..c132a16 100644
--- a/ambari-web/app/views/main/admin.js
+++ b/ambari-web/app/views/main/admin.js
@@ -23,13 +23,6 @@ App.MainAdminView = Em.View.extend({
   selectedBinding: 'controller.category',
   categories: function() {
     var items = [];
-    if(App.isAuthorized('CLUSTER.VIEW_STACK_DETAILS, CLUSTER.UPGRADE_DOWNGRADE_STACK') || (App.get('upgradeInProgress') || App.get('upgradeHolding'))) {
-      items.push({
-        name: 'stackAndUpgrade',
-        url: 'stackAndUpgrade.index',
-        label: Em.I18n.t('admin.stackUpgrade.title')
-      });
-    }
     if(App.isAuthorized('SERVICE.SET_SERVICE_USERS_GROUPS') || (App.get('upgradeInProgress') || App.get('upgradeHolding'))) {
       items.push({
         name: 'adminServiceAccounts',
diff --git a/ambari-web/app/views/main/admin/stack_and_upgrade_view.js b/ambari-web/app/views/main/admin/stack_and_upgrade_view.js
deleted file mode 100644
index 09e34b0..0000000
--- a/ambari-web/app/views/main/admin/stack_and_upgrade_view.js
+++ /dev/null
@@ -1,24 +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.MainAdminStackAndUpgradeView = Em.View.extend({
-  templateName: require('templates/main/admin/stack_and_upgrade')
-});
-
diff --git a/ambari-web/app/views/main/admin/stack_upgrade/menu_view.js b/ambari-web/app/views/main/admin/stack_upgrade/menu_view.js
deleted file mode 100644
index b3a9df8..0000000
--- a/ambari-web/app/views/main/admin/stack_upgrade/menu_view.js
+++ /dev/null
@@ -1,70 +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.MainAdminStackMenuView = Em.CollectionView.extend({
-  tagName: 'ul',
-  classNames: ["nav", "nav-tabs", "background-text"],
-  defaultRoute: 'services',
-
-  content: function () {
-    return [
-      Em.Object.create({
-        name: 'services',
-        label: Em.I18n.t('common.stack'),
-        routing: 'services'
-      }),
-      Em.Object.create({
-        name: 'versions',
-        label: Em.I18n.t('common.versions'),
-        routing: 'versions',
-        hidden: !App.get('stackVersionsAvailable')
-      }),
-      Em.Object.create({
-        name: 'upgradeHistory',
-        label: Em.I18n.t('common.upgrade.history'),
-        routing: 'upgradeHistory',
-        hidden: !App.get('upgradeHistoryAvailable')
-      })
-    ]
-  }.property('App.stackVersionsAvailable'),
-
-  didInsertElement: function () {
-    this.activateView();
-  },
-
-  activateView: function () {
-    var defaultRoute = App.router.get('currentState.name') || this.get('defaultRoute');
-    $.each(this._childViews, function () {
-      this.set('active', (this.get('content.routing') == defaultRoute) ? "active" : "");
-    });
-  },
-
-  deactivateChildViews: function () {
-    $.each(this._childViews, function () {
-      this.set('active', "");
-    });
-  },
-
-  itemViewClass: Em.View.extend({
-    classNameBindings: ["active"],
-    active: "",
-    template: Ember.Handlebars.compile('{{#unless view.content.hidden}}<a {{action stackNavigate view.content.routing }} href="#"> {{unbound view.content.label}}</a>{{/unless}}')
-  })
-});
diff --git a/ambari-web/app/views/main/admin/stack_upgrade/services_view.js b/ambari-web/app/views/main/admin/stack_upgrade/services_view.js
deleted file mode 100644
index 257087d..0000000
--- a/ambari-web/app/views/main/admin/stack_upgrade/services_view.js
+++ /dev/null
@@ -1,146 +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.MainAdminStackServicesView = Em.View.extend({
-  templateName: require('templates/main/admin/stack_upgrade/services'),
-
-  isAddServiceAvailable: function () {
-    return App.isAuthorized('CLUSTER.UPGRADE_DOWNGRADE_STACK');
-  }.property('App.supports.opsDuringRollingUpgrade', 'App.upgradeState', 'App.isAdmin'),
-
-  /**
-   * @type {Array}
-   */
-  services: function() {
-    var services = App.supports.installGanglia ? App.StackService.find() : App.StackService.find().without(App.StackService.find('GANGLIA'));
-    var controller = this.get('controller');
-    controller.loadServiceVersionFromVersionDefinitions().complete(function () {
-      return services.map(function(s) {
-        s.set('serviceVersionDisplay', controller.get('serviceVersionsMap')[s.get('serviceName')]);
-        s.set('isInstalled', App.Service.find().someProperty('serviceName', s.get('serviceName')));
-        return s;
-      });
-    });
-    return services;
-  }.property('App.router.clusterController.isLoaded'),
-
-  didInsertElement: function () {
-    if (!App.get('stackVersionsAvailable')) {
-      this.get('controller').loadStackVersionsToModel(true).done(function () {
-        App.set('stackVersionsAvailable', App.StackVersion.find().content.length > 0);
-      });
-      this.get('controller').loadRepositories();
-    }
-  },
-
-  /**
-   * launch Add Service wizard
-   * @param event
-   */
-  goToAddService: function (event) {
-    if (!App.isAuthorized('SERVICE.ADD_DELETE_SERVICES') || !App.supports.enableAddDeleteServices) {
-      return;
-    } else if (event.context == "KERBEROS") {
-      App.router.get('mainAdminKerberosController').checkAndStartKerberosWizard();
-      App.router.get('kerberosWizardController').setDBProperty('onClosePath', 'main.admin.stackAndUpgrade.services');
-    } else {
-      App.router.get('addServiceController').set('serviceToInstall', event.context);
-      App.router.get('addServiceController').setDBProperty('onClosePath', 'main.admin.stackAndUpgrade.services');
-      App.get('router').transitionTo('main.serviceAdd');
-    }
-  },
-
-  /**
-   * List of all repo-groups
-   * @type {Object[][]}
-   */
-  allRepositoriesGroups: function () {
-    var repos = this.get('controller.allRepos');
-    var reposGroup = [];
-    var repositories = [];
-    reposGroup.set('stackVersion', App.get('currentStackVersionNumber'));
-    if (repos) {
-      repos.forEach(function (group) {
-        group.repositories.forEach (function(repo) {
-          var cur_repo = Em.Object.create({
-            'repoId': repo.repoId,
-            'id': repo.repoId + '-' + repo.osType,
-            'repoName' : repo.repoName,
-            'stackName' : repo.stackName,
-            'stackVersion' : repo.stackVersion,
-            'baseUrl': repo.baseUrl,
-            'originalBaseUrl': repo.baseUrl,
-            'osType': repo.osType,
-            'onEdit': false,
-            'empty-error': !repo.baseUrl,
-            'undo': false,
-            'clearAll': repo.baseUrl
-          });
-          var cur_group = reposGroup.findProperty('name', group.name);
-          if (!cur_group) {
-            cur_group = Ember.Object.create({
-              name: group.name,
-              repositories: []
-            });
-            reposGroup.push(cur_group);
-          }
-          cur_group.repositories.push(cur_repo);
-          repositories.push(cur_repo);
-        });
-      });
-    }
-    this.set('allRepos', repositories);
-    return reposGroup;
-  }.property('controller.allRepos'),
-
-  /**
-   * Onclick handler for edit action of each repo, enter edit mode
-   * @param {object} event
-   */
-  onEditClick:function (event) {
-    var targetRepo = this.get('allRepos').findProperty('id', event.context.get('id'));
-    if (targetRepo) {
-      targetRepo.set('onEdit', true);
-    }
-  },
-
-  /**
-   * Handler for clear icon click
-   * @method clearGroupLocalRepository
-   * @param {object} event
-   */
-  clearGroupLocalRepository: function (event) {
-    this.doActionForGroupLocalRepository(event, '');
-  },
-
-  /**
-   * Common handler for repo groups actions
-   * @method doActionForGroupLocalRepository
-   * @param {object} event
-   * @param {string} newBaseUrlField
-   */
-  doActionForGroupLocalRepository: function (event, newBaseUrlField) {
-    var targetRepo = this.get('allRepos').findProperty('id', event.context.get('id'));
-    if (targetRepo) {
-      targetRepo.set('baseUrl', Em.isEmpty(newBaseUrlField) ? '' : Em.get(targetRepo, newBaseUrlField));
-    }
-  },
-});
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
deleted file mode 100644
index c0786a3..0000000
--- a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js
+++ /dev/null
@@ -1,635 +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');
-var stringUtils = require('utils/string_utils');
-
-App.UpgradeVersionBoxView = Em.View.extend({
-  templateName: require('templates/main/admin/stack_upgrade/upgrade_version_box'),
-  classNames: ['version-box'],
-  classNameBindings: ['versionClass'],
-
-  /**
-   * @type {string}
-   * @constant
-   */
-  PROGRESS_STATUS: 'IN_PROGRESS',
-
-  /**
-   * @type {boolean}
-   */
-  upgradeCheckInProgress: false,
-
-  /**
-   * progress of version installation
-   * @type {number}
-   */
-  installProgress: function() {
-    if (App.get('testMode')) return 100;
-
-    var installRequest, requestIds = this.get('controller').getRepoVersionInstallId();
-    if (requestIds) {
-      installRequest = App.router.get('backgroundOperationsController.services').findProperty('id', requestIds[0]);
-    }
-    return (installRequest) ? installRequest.get('progress') : 0;
-  }.property('App.router.backgroundOperationsController.serviceTimestamp'),
-
-  /**
-   * version is upgrading or downgrading
-   * @type {boolean}
-   */
-  isUpgrading: function () {
-    return (this.get('controller.upgradeVersion') === this.get('content.displayName') ||
-            this.get('controller.fromVersion') === this.get('content.repositoryVersion'))
-            && App.get('upgradeState') !== 'NOT_REQUIRED';
-  }.property('App.upgradeState', 'content.displayName', 'controller.upgradeVersion'),
-
-  isRepoUrlsEditDisabled: function () {
-    return ['INSTALLING', 'UPGRADING'].contains(this.get('content.status')) || this.get('isUpgrading') || (!App.isAuthorized('AMBARI.MANAGE_STACK_VERSIONS'));
-  }.property('content.status', 'isUpgrading'),
-
-  /**
-   * @type {string}
-   */
-  versionClass: function () {
-    return this.get('content.status') === 'CURRENT' ? 'current-version-box' : '';
-  }.property('content.status'),
-
-  /**
-   * @type {boolean}
-   */
-  isOutOfSync: Em.computed.equal('content.status', 'OUT_OF_SYNC'),
-
-  /**
-   * map containing version (id, label)
-   * this is used as param for <code>showHosts<code> method
-   * @type {Object}
-   */
-  versionStateMap: {
-    'current': {
-      'type': 'CURRENT',
-      'value': ['CURRENT'],
-      'property': 'currentHosts',
-      'label': Em.I18n.t('admin.stackVersions.hosts.popup.header.current')
-    },
-    'installed': {
-      'type': 'INSTALLED',
-      'value': ['INSTALLED'],
-      'property': 'installedHosts',
-      'label': Em.I18n.t('admin.stackVersions.hosts.popup.header.installed')
-    },
-    'not_installed': {
-      'type': 'NOT_INSTALLED',
-      'value': ['INSTALLING', 'INSTALL_FAILED', 'OUT_OF_SYNC'],
-      'property': 'notInstalledHosts',
-      'label': Em.I18n.t('admin.stackVersions.hosts.popup.header.not_installed')
-    }
-  },
-
-  /**
-   * @type {object}
-   * @default null
-   */
-  content: null,
-
-  /**
-   * map of properties which correspond to particular state of Upgrade version
-   * @type {object}
-   */
-  statePropertiesMap: {
-    'CURRENT': {
-      isLabel: true,
-      text: Em.I18n.t('common.current'),
-      class: 'label label-success'
-    },
-    'NOT_REQUIRED': {
-      isButton: true,
-      text: Em.I18n.t('admin.stackVersions.version.installNow'),
-      action: 'installRepoVersionPopup'
-    },
-    'LOADING': {
-      isSpinner: true,
-      class: 'spinner'
-    },
-    'INSTALLING': {
-      iconClass: 'glyphicon glyphicon-cog',
-      isLink: true,
-      text: Em.I18n.t('hosts.host.stackVersions.status.installing'),
-      action: 'showProgressPopup'
-    },
-    'INSTALLED': {
-      iconClass: 'glyphicon glyphicon-ok',
-      isButtonGroup: true,
-      text: Em.I18n.t('common.installed'),
-      action: null
-    },
-    'SUSPENDED': {
-      isButton: true,
-      text: Em.I18n.t('admin.stackUpgrade.dialog.resume'),
-      action: 'resumeUpgrade'
-    },
-    'CURRENT_PATCH': {
-      isLabel: true,
-      text: Em.I18n.t('common.current'),
-      class: 'label label-success'
-    }
-  },
-
-  /**
-   * object that describes how content should be displayed
-   * @type {Em.Object}
-   * TODO remove <code>isUpgrading</code> condition when transition of version states in API fixed
-   */
-  stateElement: function () {
-    var statePropertiesMap = this.get('statePropertiesMap');
-    var status = this.get('content.status');
-    var element = Em.Object.create({
-      status: status,
-      isInstalling: Em.computed.equal('status', 'INSTALLING'),
-      buttons: [],
-      isDisabled: false
-    });
-    var isSuspended = App.get('upgradeSuspended');
-
-    if (status === 'CURRENT' && this.get('content.isPatch') && !this.get('isUpgrading')) {
-      element.setProperties(statePropertiesMap['CURRENT_PATCH']);
-      element.set('canBeReverted', this.get('content.stackVersion').get('supportsRevert'));
-      element.set('action', 'confirmRevertPatchUpgrade');
-      element.set('actionText', Em.I18n.t('common.revert'));
-    }
-    else if (['INSTALLING', 'CURRENT'].contains(status) && !this.get('content.isPatch')) {
-      element.setProperties(statePropertiesMap[status]);
-    }
-    else if (status === 'NOT_REQUIRED') {
-      this.processNotRequiredState(element);
-    }
-    else if ((status === 'INSTALLED' && !this.get('isUpgrading')) || (['INSTALL_FAILED', 'OUT_OF_SYNC'].contains(status))) {
-      this.processPreUpgradeState(element);
-    }
-    else if (this.get('isUpgrading') && !isSuspended) {
-      this.processUpgradingState(element);
-    }
-    else if (isSuspended) {
-      this.processSuspendedState(element);
-    }
-    //For restricted upgrade wizard should be disabled in any state
-    if (this.get('controller.isWizardRestricted') || (!App.isAuthorized('CLUSTER.UPGRADE_DOWNGRADE_STACK'))) {
-      element.set('isDisabled', true);
-    }
-    return element;
-  }.property(
-    'content.status',
-    'controller.isDowngrade',
-    'isUpgrading',
-    'controller.requestInProgress',
-    'controller.requestInProgressRepoId',
-    'parentView.repoVersions.@each.status',
-    'isCurrentStackPresent'
-  ),
-
-  /**
-   * check if actions of NOT_REQUIRED stack version disabled
-   * @returns {boolean}
-   */
-  isDisabledOnInit: function() {
-    return  this.get('controller.requestInProgress') ||
-            !this.get('isCurrentStackPresent') ||
-            !this.get('content.isCompatible') ||
-            (App.get('upgradeIsRunning') && !App.get('upgradeSuspended')) ||
-            this.get('parentView.repoVersions').someProperty('status', 'INSTALLING');
-  },
-
-  /**
-   * @param {Em.Object} element
-   */
-  processSuspendedState: function(element) {
-    element.setProperties(this.get('statePropertiesMap')['SUSPENDED']);
-    var text = this.get('controller.isDowngrade')
-      ? Em.I18n.t('admin.stackUpgrade.dialog.resume.downgrade')
-      : Em.I18n.t('admin.stackUpgrade.dialog.resume');
-    element.set('text', this.get('isVersionColumnView') ? Em.I18n.t('common.resume'): text);
-    element.set('isDisabled', this.get('controller.requestInProgress'));
-  },
-
-  /**
-   * @param {Em.Object} element
-   */
-  processUpgradingState: function(element) {
-    element.set('isLink', true);
-    element.set('action', 'openUpgradeDialog');
-    if (['HOLDING', 'HOLDING_FAILED', 'HOLDING_TIMEDOUT', 'ABORTED'].contains(App.get('upgradeState'))) {
-      element.set('iconClass', 'glyphicon glyphicon-pause');
-      if (this.get('controller.isDowngrade')) {
-        element.set('text', Em.I18n.t('admin.stackVersions.version.downgrade.pause'));
-      }
-      else {
-        element.set('text', Em.I18n.t('admin.stackVersions.version.upgrade.pause'));
-      }
-    }
-    else {
-      element.set('iconClass', 'glyphicon glyphicon-cog');
-      if (this.get('controller.isDowngrade')) {
-        element.set('text', Em.I18n.t('admin.stackVersions.version.downgrade.running'));
-      }
-      else {
-        element.set('text', Em.I18n.t('admin.stackVersions.version.upgrade.running'));
-      }
-    }
-  },
-
-  /**
-   * @param {Em.Object} element
-   */
-  processPreUpgradeState: function(element) {
-    var currentVersion = this.get('controller.currentVersion');
-    var status = this.get('content.status');
-    var isVersionHigherThanCurrent = stringUtils.compareVersions(
-        this.get('content.repositoryVersion'),
-        Em.get(currentVersion, 'repository_version')
-      ) === 1;
-    var isDisabled = this.isDisabledOnInstalled();
-    if (Em.get(currentVersion, 'stack_name') !== this.get('content.stackVersionType') || isVersionHigherThanCurrent) {
-      switch (status){
-        case 'OUT_OF_SYNC':
-          element.set('isButton', true);
-          element.set('text', this.get('isVersionColumnView') ? Em.I18n.t('common.reinstall') : Em.I18n.t('admin.stackVersions.version.reinstall'));
-          element.set('action', 'installRepoVersionPopup');
-          break;
-        case 'INSTALL_FAILED':
-          element.set('isButton', true);
-          element.set('text', this.get('isVersionColumnView') ? Em.I18n.t('common.reinstall') : Em.I18n.t('admin.stackVersions.version.reinstall'));
-          element.set('action', 'installRepoVersionPopup');
-          break;
-        default:
-          var isVersionColumnView = this.get('isVersionColumnView');
-          var stackServices = this.get('content.stackServices');
-          var isUpgradable = stackServices && (this.get('content.isStandard') || stackServices.some( function(stackService){
-              return stackService.get('isUpgradable');
-          }));
-          var isPatch = this.get('content.isPatch');
-          var isMaint = this.get('content.isMaint');
-
-          element.set('isButtonGroup', true);
-          if (isUpgradable){
-            element.set('text', isVersionColumnView ? Em.I18n.t('common.upgrade') : Em.I18n.t('admin.stackVersions.version.performUpgrade'));
-            element.set('action', 'confirmUpgrade');
-            element.get('buttons').pushObject({
-              text: isVersionColumnView ? Em.I18n.t('common.reinstall') : Em.I18n.t('admin.stackVersions.version.reinstall'),
-              action: 'installRepoVersionPopup',
-              isDisabled: isDisabled
-            });
-
-            element.get('buttons').pushObject({
-              text: Em.I18n.t('admin.stackVersions.version.preUpgradeCheck'),
-              action: 'showUpgradeOptions',
-              isDisabled: isDisabled
-            });
-          }
-          else{
-            element.set('iconClass', 'icon-ok');
-            element.set('text', Em.I18n.t('common.installed'))
-          }
-
-          if ( isPatch || isMaint ) {
-            element.get('buttons').pushObject({
-              text: Em.I18n.t('common.hide'),
-              action: 'confirmDiscardRepoVersion',
-              isDisabled: isDisabled
-            });
-          }
-
-      }
-      element.set('isDisabled', isDisabled);
-    }
-    else {
-      element.setProperties(this.get('statePropertiesMap')['INSTALLED']);
-      if (this.get('content.isPatch') || this.get('content.isMaint')) {
-        element.get('buttons').pushObject({
-          text: Em.I18n.t('common.hide'),
-          action: 'confirmDiscardRepoVersion',
-          isDisabled: isDisabled
-        });
-      }
-    }
-  },
-
-  /**
-   * @param {Em.Object} element
-   */
-  processNotRequiredState: function(element) {
-    var isDisabledOnInit = this.isDisabledOnInit();
-    var requestInProgressRepoId = this.get('controller.requestInProgressRepoId');
-    var status = this.get('content.status');
-
-    if (requestInProgressRepoId && requestInProgressRepoId === this.get('content.id')) {
-      element.setProperties(this.get('statePropertiesMap')['LOADING']);
-    } else {
-      element.setProperties(this.get('statePropertiesMap')[status]);
-    }
-    element.set('isDisabled', isDisabledOnInit);
-    element.set('isButtonGroup', true);
-    element.set('isButton', false);
-    element.get('buttons').pushObject({
-      text: Em.I18n.t('common.hide'),
-      action: 'confirmDiscardRepoVersion',
-      isDisabled: isDisabledOnInit
-    });
-  },
-
-  /**
-   * check if actions of INSTALLED stack version disabled
-   * @returns {boolean}
-   */
-  isDisabledOnInstalled: function() {
-    return !this.get('isCurrentStackPresent') ||
-      !App.isAuthorized('CLUSTER.UPGRADE_DOWNGRADE_STACK') ||
-      this.get('controller.requestInProgress') ||
-      this.get('parentView.repoVersions').someProperty('status', 'INSTALLING') ||
-      (this.get('controller.isDowngrade') &&
-        (this.get('controller.currentVersion.repository_name') === this.get('controller.upgradeVersion'))
-      );
-  },
-
-  didInsertElement: function () {
-    App.tooltip($('.link-tooltip'), {title: Em.I18n.t('admin.stackVersions.version.linkTooltip')});
-    App.tooltip($('.hosts-tooltip'));
-    App.tooltip($('.out-of-sync-badge'), {title: Em.I18n.t('hosts.host.stackVersions.status.out_of_sync')});
-    if (!this.get('content.isCompatible')) {
-      App.tooltip(this.$(".repo-version-tooltip"), {
-        title: Em.I18n.t('admin.stackVersions.version.noCompatible.tooltip')
-      });
-    }
-    Em.run.later(this, function () {
-      if (this.get('state') !== 'inDOM') {
-        return;
-      }
-      if (this.get('maintenanceHosts').length + this.get('notRequiredHosts').length) {
-        App.tooltip(this.$('.hosts-section'), {placement: 'bottom', title: Em.I18n.t('admin.stackVersions.version.hostsInfoTooltip').format(
-          this.get('maintenanceHosts').length + this.get('notRequiredHosts').length, this.get('maintenanceHosts').length, this.get('notRequiredHosts').length
-        )});
-      }
-    }, 1000);
-  },
-
-  willDestroyElement: function () {
-    $('.link-tooltip').tooltip('destroy');
-    $('.hosts-tooltip').tooltip('destroy');
-    $('.out-of-sync-badge').tooltip('destroy');
-  },
-
-  isCurrentStackPresent: Ember.computed('parentView.repoVersions.@each.stackVersion.state', function () {
-    return this.get('parentView.repoVersions').someProperty('stackVersion.state', 'CURRENT');
-  }),
-
-  /**
-   * run custom action of controller
-   */
-  runAction: function (event) {
-    var target = event && event.target,
-      action = event && event.context || this.get('stateElement.action');
-    if (target && ($(target).hasClass('disabled') || $(target).parent().hasClass('disabled'))) {
-      return;
-    }
-    if (action) {
-      this.get('controller')[action](this.get('content'));
-    }
-  },
-
-  /**
-   * @param App.RepositoryVersion
-   * */
-  getStackVersionNumber: function(repository){
-    var stackVersion = null;
-    var systems = repository.get('operatingSystems');
-
-    systems.forEach(function (os) {
-      os.get('repositories').forEach(function (repo) {
-        stackVersion = repo.get('stackVersion');
-        if (null != stackVersion)
-          return stackVersion;
-      });
-    });
-
-    return stackVersion;
-  },
-
-  /**
-   * show popup with repositories to edit
-   * @return {App.ModalPopup}
-   */
-  editRepositories: function () {
-    var self = this;
-    var repoRecord = App.RepositoryVersion.find(this.get('content.id'));
-    //make deep copy of repoRecord
-    var repo = Em.Object.create({
-      repoVersionId: repoRecord.get('id'),
-      displayName: repoRecord.get('displayName'),
-      repositoryVersion: repoRecord.get('displayName'),
-      stackVersion: self.getStackVersionNumber(repoRecord),
-      useRedhatSatellite: repoRecord.get('useRedhatSatellite'),
-      operatingSystems: repoRecord.get('operatingSystems').map(function (os) {
-        return Em.Object.create({
-          osType: os.get('osType'),
-          isSelected: true,
-          repositories: os.get('repositories').map(function (repository) {
-            return Em.Object.create({
-              repoName: repository.get('repoName'),
-              repoId: repository.get('repoId'),
-              baseUrl: repository.get('baseUrl'),
-              hasError: false
-            });
-          })
-        });
-      })
-    });
-
-    return this.get('isRepoUrlsEditDisabled') ? null : App.ModalPopup.show({
-      classNames: ['repository-list', 'common-modal-wrapper'],
-      modalDialogClasses: ['modal-lg'],
-      skipValidation: false,
-      autoHeight: false,
-      /**
-       * @type {boolean}
-       */
-      serverValidationFailed: false,
-      bodyClass: Ember.View.extend({
-        content: repo,
-        skipCheckBox: App.CheckboxView.extend({
-          repoBinding: 'parentView.content',
-          checkboxClassNames: ["align-checkbox"],
-          change: function() {
-            this.get('repo.operatingSystems').forEach(function(os) {
-              os.get('repositories').forEach(function(repo) {
-                repo.set('skipValidation', this.get('checked'));
-              }, this);
-            }, this);
-          }
-        }),
-
-        /**
-         * set <code>disablePrimary</code> of popup depending on base URL validation
-         */
-        uiValidation: function () {
-          var disablePrimary = !(App.get('isAdmin') && !App.get('isOperator'));
-
-          this.get('content.operatingSystems').forEach(function (os) {
-            os.get('repositories').forEach(function (repo) {
-              disablePrimary = !disablePrimary ? repo.get('hasError') : disablePrimary;
-            }, this);
-          }, this);
-          this.set('parentView.disablePrimary', disablePrimary);
-        },
-        templateName: require('templates/main/admin/stack_upgrade/edit_repositories'),
-        didInsertElement: function () {
-          App.tooltip($("[rel=skip-validation-tooltip], [rel=use-redhat-tooltip]"), {placement: 'right'});
-        },
-        willDestroyElement: function () {
-          $("[rel=skip-validation-tooltip], [rel=use-redhat-tooltip]").tooltip('destroy');
-        }
-      }),
-      header: Em.I18n.t('common.repositories'),
-      primary: Em.I18n.t('common.save'),
-      disablePrimary: false,
-      onPrimary: function () {
-        var self = this;
-        App.get('router.mainAdminStackAndUpgradeController').saveRepoOS(repo, this.get('skipValidation')).done(function(data){
-          if (data.length > 0) {
-            self.set('serverValidationFailed', true);
-            self.set('disablePrimary', true);
-          } else {
-            self.hide();
-          }
-        })
-      }
-    });
-  },
-
-  /**
-   * shows popup with listed hosts wich has current state of hostStackVersion
-   * @param {object} event
-   * @returns {App.ModalPopup}
-   * @method showHostsListPopup
-   */
-  showHosts: function (event) {
-    var status = event.contexts[0];
-    var displayName = this.get('content.displayName');
-    var hosts = this.get(status['property']);
-    var self = this;
-    var title = status.type === 'CURRENT'
-      ? Em.I18n.t('admin.stackVersions.hosts.popup.current.title').format(displayName, hosts.length)
-      : Em.I18n.t('admin.stackVersions.hosts.popup.title').format(displayName, status.label, hosts.length);
-    hosts.sort();
-    if (hosts.length) {
-      return App.ModalPopup.show({
-        bodyClass: Ember.View.extend({
-          title: title,
-          hosts: hosts,
-          template: Em.Handlebars.compile('<h4>{{view.title}}</h4><div class="limited-height-2">{{#each view.hosts}}<div>{{this}}</div>{{/each}}</div>')
-        }),
-        header: Em.I18n.t('admin.stackVersions.hosts.popup.header').format(status.label),
-        primary: Em.I18n.t('admin.stackVersions.hosts.popup.primary'),
-        secondary: Em.I18n.t('common.close'),
-        onPrimary: function () {
-          this.hide();
-          if ($('.version-box-popup .modal')) {
-            $('.version-box-popup .modal .modal-footer .btn-success').click();
-          }
-          self.filterHostsByStack(displayName, status.value);
-        }
-      });
-    }
-  },
-
-  /**
-   * goes to the hosts page with content filtered by repo_version_name and repo_version_state
-   * @param {string} displayName
-   * @param {Array} states
-   * @method filterHostsByStack
-   */
-  filterHostsByStack: function (displayName, states) {
-    if (Em.isNone(displayName) || Em.isNone(states) || !states.length) return;
-    App.router.get('mainHostController').filterByStack(displayName, states);
-    App.router.get('mainHostController').set('showFilterConditionsFirstLoad', true);
-    App.router.get('mainHostController').set('filterChangeHappened', true);
-    App.router.transitionTo('hosts.index');
-  },
-
-  /**
-   * Not installed hosts should exclude 1.not required hosts 2. Maintenance Mode hosts,
-   * or it maybe confusing to users
-   * @type {Array}
-   */
-  notInstalledHosts: function () {
-    var notInstalledHosts = this.get('content.notInstalledHosts') || App.get('allHostNames');
-    var notRequiredHosts = this.get('notRequiredHosts');
-    var maintenanceHosts = this.get('maintenanceHosts');
-    if (notInstalledHosts.length && notRequiredHosts.length) {
-      notRequiredHosts.forEach(function(not_required) {
-        var index = notInstalledHosts.indexOf(not_required);
-        if (index > -1) {
-          notInstalledHosts.splice(index, 1);
-        }
-      });
-    }
-    if (notInstalledHosts.length && maintenanceHosts.length) {
-      maintenanceHosts.forEach(function(mm_host) {
-        var index = notInstalledHosts.indexOf(mm_host);
-        if (index > -1) {
-          notInstalledHosts.splice(index, 1);
-        }
-      });
-    }
-    return notInstalledHosts;
-  }.property('content.notInstalledHosts', 'notRequiredHosts', 'maintenanceHosts'),
-
-  /**
-   * @type {Array}
-   */
-  maintenanceHosts: function () {
-    return App.Host.find().filterProperty('passiveState', 'ON').mapProperty('hostName') || [];
-  }.property(''),
-
-  /**
-   * Host with no HDP component is not required to install new version
-   * @type {Array}
-   */
-  notRequiredHosts: function () {
-    var notRequiredHosts = [];
-    App.Host.find().forEach(function(host) {
-      if (!host.get('hostComponents').someProperty('isHDPComponent')) {
-        notRequiredHosts.push(host.get('hostName'));
-      }
-    });
-    return notRequiredHosts.uniq() || [];
-  }.property(''),
-
-  /**
-   * @type {Array}
-   */
-  installedHosts: function () {
-    return this.get('content.installedHosts') || [];
-  }.property('content.installedHosts'),
-
-  /**
-   * @type {Array}
-   */
-  currentHosts: function () {
-    return this.get('content.currentHosts') || [];
-  }.property('content.currentHosts')
-});
diff --git a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_column_view.js b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_column_view.js
deleted file mode 100644
index cb276ae..0000000
--- a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_column_view.js
+++ /dev/null
@@ -1,120 +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.UpgradeVersionColumnView = App.UpgradeVersionBoxView.extend({
-  templateName: require('templates/main/admin/stack_upgrade/upgrade_version_column'),
-  isVersionColumnView: true,
-  classNames: ['version-column', 'col-md-4'],
-
-  didInsertElement: function () {
-    App.tooltip($('.out-of-sync-badge'), {title: Em.I18n.t('hosts.host.stackVersions.status.out_of_sync')});
-    App.tooltip($('.not-upgradable'), {title: Em.I18n.t('admin.stackVersions.version.service.notUpgradable')});
-    if (!this.get('content.isCompatible')) {
-      App.tooltip(this.$(".repo-version-tooltip"), {
-        title: Em.I18n.t('admin.stackVersions.version.noCompatible.tooltip')
-      });
-    }
-    this.adjustColumnWidth();
-  },
-
-  adjustColumnWidth: function() {
-    //set the width, height of each version column dynamically
-    var reposCount = App.RepositoryVersion.find().filterProperty('isVisible').get('length');
-    var widthFactor = reposCount > 3 ? 0.18: 0.31;
-    $('.version-column').width($('.versions-slides').width() * widthFactor);
-    var height = App.Service.find().get('length') > 10 ? ((App.Service.find().get('length') - 10) * 40 + 500) : 500;
-    $('.version-column').height(height);
-
-    // set the lines width of the table, line up the labels
-    $('.border-extended-table').width(reposCount * 100 + 100 + "%");
-    $('.border-extended-table').css("max-width", reposCount * 100 + 100 + "%");
-  }.observes('parentView.repoVersions.@each.isVisible'),
-
-  services: function() {
-    var originalServices = this.get('content.stackServices');
-    // sort the services in the order the same as service menu
-    return App.Service.find().map(function (service) {
-
-      var stackService = originalServices.findProperty('name', service.get('serviceName'));
-      var isAvailable = this.isStackServiceAvailable(stackService);
-
-      var notUpgradable = false;
-      if (!stackService) {
-        console.error(stackService + " definition does not exist in the stack.")
-        notUpgradable = true;
-      } else {
-        notUpgradable = this.getNotUpgradable(isAvailable, stackService.get('isUpgradable'));
-      }
-
-      return Em.Object.create({
-        displayName: service.get('displayName'),
-        name: service.get('serviceName'),
-        latestVersion: stackService ? stackService.get('latestVersion') : '',
-        isVersionInvisible: !stackService,
-        notUpgradable: notUpgradable,
-        isAvailable: isAvailable
-      });
-    }, this);
-  }.property(),
-
-  getNotUpgradable: function(isAvailable, isUpgradable) {
-    return this.get('content.isMaint') && !this.get('isUpgrading') && this.get('content.status') !== 'CURRENT' && isAvailable && !isUpgradable;
-  },
-
-
-  /**
-   * @param {Em.Object} stackService
-   * @returns {boolean}
-   */
-  isStackServiceAvailable: function(stackService) {
-    var self = this;
-    if (!stackService) {
-      return false;
-    }
-    if ( this.get('content.isCurrent') ){
-      var originalService = App.Service.find(stackService.get('name'));
-      return stackService.get('isAvailable') && originalService.get('desiredRepositoryVersionId') === this.get('content.id');
-    }
-    else{
-      return stackService.get('isAvailable')
-    }
-  },
-
-  /**
-   * on click handler for "show details" link
-   */
-  openVersionBoxPopup: function (event) {
-    var content = this.get('content');
-    var parentView = this.get('parentView');
-
-    return App.ModalPopup.show({
-      classNames: ['version-box-popup'],
-      bodyClass: App.UpgradeVersionBoxView.extend({
-        classNames: ['version-box-in-popup'],
-        content: content,
-        parentView: parentView
-      }),
-      header: Em.I18n.t('admin.stackVersions.version.column.showDetails.title'),
-      primary: Em.I18n.t('common.dismiss'),
-      secondary: null
-    });
-  }
-});
-
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
deleted file mode 100644
index 87e2adf..0000000
--- a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_wizard_view.js
+++ /dev/null
@@ -1,520 +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');
-var stringUtils = require('utils/string_utils');
-
-App.upgradeWizardView = Em.View.extend({
-  controllerBinding: 'App.router.mainAdminStackAndUpgradeController',
-  templateName: require('templates/main/admin/stack_upgrade/stack_upgrade_wizard'),
-
-  /**
-   * @type {Array}
-   */
-  failedStatuses: ['HOLDING_FAILED', 'HOLDING_TIMEDOUT', 'FAILED', 'TIMED_OUT', 'ABORTED'],
-
-  /**
-   * @type {Array}
-   */
-  activeStatuses: ['HOLDING_FAILED', 'HOLDING_TIMEDOUT', 'FAILED', 'TIMED_OUT', 'HOLDING', 'IN_PROGRESS', 'ABORTED'],
-
-  /**
-   * update timer
-   * @type {number|null}
-   * @default null
-   */
-  updateTimer: null,
-
-  /**
-   * update timer of Upgrade Item
-   * @type {number|null}
-   * @default null
-   */
-  upgradeItemTimer: null,
-
-  /**
-   * @type {boolean}
-   */
-  isLoaded: false,
-
-  /**
-   * @type {boolean}
-   */
-  isDetailsOpened: false,
-
-  /**
-   * @type {boolean}
-   */
-  outsideView: true,
-
-  /**
-   * Downgrade should be available only if target version higher than current, so we can't downgrade
-   * when downgrade already started
-   * @type {boolean}
-   */
-  isDowngradeAvailable: Em.computed.and(
-    '!controller.isDowngrade',
-    'controller.downgradeAllowed',
-    '!controller.cantBeStarted'
-  ),
-
-  /**
-   * progress value is rounded to floor
-   * @type {number}
-   */
-  overallProgress: function () {
-    return Math.floor(this.get('controller.upgradeData.Upgrade.progress_percent'));
-  }.property('controller.upgradeData.Upgrade.progress_percent'),
-
-  /**
-   * upgrade groups, reversed and PENDING ones are hidden
-   * @type {Array}
-   */
-  upgradeGroups: function () {
-    return this.get('controller.upgradeData.upgradeGroups') || [];
-  }.property('controller.upgradeData.upgradeGroups'),
-
-  /**
-   * currently active group
-   * @type {object|undefined}
-   */
-  activeGroup: function () {
-    if (App.get('upgradeSuspended')) return;
-    return this.get('upgradeGroups').find(function (item) {
-      return this.get('activeStatuses').contains(item.get('status'));
-    }, this);
-  }.property('upgradeGroups.@each.status'),
-
-  /**
-   * if upgrade group is in progress it should have currently running item
-   * @type {object|undefined}
-   */
-  runningItem: Em.computed.findBy('activeGroup.upgradeItems', 'status', 'IN_PROGRESS'),
-
-  /**
-   * 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('activeGroup.upgradeItems.@each.status'),
-
-  /**
-   * can skip failed item or not
-   * @type {boolean}
-   */
-  canSkipFailedItem: function () {
-    var failedItem = this.get('failedItem');
-    var associatedVersion = this.get('controller.upgradeData.Upgrade.associated_version');
-    var version = associatedVersion && App.RepositoryVersion.find().findProperty('repositoryVersion', associatedVersion);
-    var isPatchOrMaint = version && ( version.get('isPatch') || version.get('isMaint') );
-    return failedItem && failedItem.get('skippable') && !(this.get('isFinalizeItem') && isPatchOrMaint);
-  }.property('failedItem'),
-
-  /**
-   * upgrade doesn't have any failed or manual or running item
-   * @type {boolean}
-   */
-  noActiveItem: function () {
-    return (Em.isNone(this.get('failedItem')) && Em.isNone(this.get('runningItem')) && Em.isNone(this.get('manualItem'))) &&
-      !['NOT_REQUIRED', 'COMPLETED', 'ABORTED'].contains(App.get('upgradeState'));
-  }.property('failedItem', 'runningItem', 'manualItem', 'App.upgradeState'),
-
-  /**
-   * details of currently active task
-   * @type {object|null}
-   */
-  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);
-    } else {
-      return null;
-    }
-  }.property('failedItem.tasks.@each.status', 'runningItem.tasks.@each.status'),
-
-  /**
-   * 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') || this.get('failedItem.status') === 'ABORTED');
-  }.property('failedItem.status'),
-
-  /**
-   * @type {boolean}
-   */
-  isManualDone: false,
-
-  /**
-   * if manualItem has been switched then isManualDone flag should be reset
-   */
-  resetManualDone: function() {
-    this.set('isManualDone', false);
-  }.observes('manualItem'),
-
-  /**
-   * @type {boolean}
-   */
-  isManualProceedDisabled: Em.computed.or('!isManualDone', 'controller.requestInProgress'),
-
-  /**
-   * if upgrade group is manual it should have manual item
-   * @type {object|undefined}
-   */
-  manualItem: Em.computed.findBy('activeGroup.upgradeItems', 'status', 'HOLDING'),
-
-  /**
-   * plain manual item
-   * @type {object|undefined}
-   */
-  plainManualItem: function () {
-    return this.get('manualItem') && ![
-      this.get('controller.finalizeContext'),
-      this.get("controller.slaveFailuresContext"),
-      this.get("controller.serviceCheckFailuresContext")
-    ].contains(this.get('manualItem.context'));
-  }.property('manualItem.context'),
-
-  /**
-   * manualItem: indicate whether the step is "Slave component failures", a dialog with instructions will show up for manual steps
-   * @type {boolean}
-   */
-  isSlaveComponentFailuresItem: function () {
-    var item = this.get('activeGroup.upgradeItems') && this.get('activeGroup.upgradeItems').findProperty('context', this.get("controller.slaveFailuresContext"));
-    var status = item && item.get('status');
-    this.set('isOutOfSync', status === 'OUT_OF_SYNC');
-    return ['HOLDING', 'HOLDING_FAILED', 'OUT_OF_SYNC'].contains(status);
-  }.property('activeGroup.upgradeItems.@each.status', 'activeGroup.upgradeItems.@each.context'),
-
-  /**
-   * manualItem: indicate whether the step is "Service check failures", a dialog with instructions will show up for manual steps
-   * @type {boolean}
-   */
-  isServiceCheckFailuresItem: Em.computed.equalProperties('manualItem.context', 'controller.serviceCheckFailuresContext'),
-
-  /**
-   * manualItem: indicate whether the step is Finalize
-   * @type {boolean}
-   */
-  isFinalizeItem: Em.computed.equalProperties('manualItem.context', 'controller.finalizeContext'),
-
-  /**
-   * Upgrade of PATCH version is revertible
-   */
-  isRevertibleUpgrade: function() {
-    var associatedVersion = this.get('controller.upgradeData.Upgrade.associated_version');
-    var upgradeVersion = App.RepositoryVersion.find().findProperty('repositoryVersion', associatedVersion);
-    return ['PATCH'].contains(upgradeVersion.get('type'));
-  }.property('controller.upgradeData.Upgrade.associated_version'),
-
-  revertibleFinalizeMessage: function() {
-    var associatedVersion = this.get('controller.upgradeData.Upgrade.associated_version');
-    var upgradeVersion = App.RepositoryVersion.find().findProperty('repositoryVersion', associatedVersion);
-    return Em.I18n.t('admin.stackUpgrade.finalize.message.revertible')
-      .format(upgradeVersion.get('type'), upgradeVersion.get('displayName'));
-  }.property('controller.upgradeData.Upgrade.associated_version'),
-
-  /**
-   * label of Upgrade status
-   * @type {string}
-   */
-  upgradeStatusLabel: function() {
-    var labelKey = null;
-    switch (this.get('controller.upgradeData.Upgrade.request_status')) {
-      case 'QUEUED':
-      case 'PENDING':
-      case 'IN_PROGRESS':
-        labelKey = 'admin.stackUpgrade.state.inProgress';
-        break;
-      case 'COMPLETED':
-        labelKey = 'admin.stackUpgrade.state.completed';
-        break;
-      case 'ABORTED':
-        labelKey = 'admin.stackUpgrade.state.paused';
-        break;
-      case 'TIMEDOUT':
-      case 'FAILED':
-      case 'HOLDING_FAILED':
-      case 'HOLDING_TIMEDOUT':
-      case 'HOLDING':
-        labelKey = 'admin.stackUpgrade.state.paused';
-        break;
-      default:
-        labelKey = 'admin.stackUpgrade.state.init';
-        break;
-    }
-    if (labelKey) {
-      labelKey += (this.get('controller.isDowngrade')) ? '.downgrade' : "";
-      return Em.I18n.t(labelKey);
-    } else {
-      return "";
-    }
-  }.property('controller.upgradeData.Upgrade.request_status', 'controller.isDowngrade'),
-
-  /**
-   * toggle details box
-   */
-  toggleDetails: function () {
-    this.toggleProperty('isDetailsOpened');
-  },
-
-  /**
-   * close details block if no active task present
-   */
-  closeDetails: function () {
-    if (this.get('noActiveItem')) {
-      this.set('isDetailsOpened', false);
-    }
-  }.observes('noActiveItem'),
-
-  /**
-   * start polling upgrade data
-   */
-  startPolling: function () {
-    var self = this;
-    if (App.get('clusterName')) {
-      this.get('controller').loadUpgradeData().done(function () {
-        self.set('isLoaded', true);
-        self.doPolling();
-      });
-    }
-  }.observes('App.clusterName'),
-
-  getSkippedServiceChecks: function () {
-    if (this.get('isFinalizeItem')) {
-      if (!this.get('controller.areSkippedServiceChecksLoaded')) {
-        var self = this;
-        App.ajax.send({
-          name: 'admin.upgrade.service_checks',
-          sender: this,
-          data: {
-            upgradeId: this.get('controller.upgradeId')
-          },
-          success: 'getSkippedServiceChecksSuccessCallback'
-        }).complete(function () {
-            self.set('controller.areSkippedServiceChecksLoaded', true);
-          });
-      }
-    } else {
-      this.set('controller.areSkippedServiceChecksLoaded', false);
-    }
-  }.observes('isFinalizeItem'),
-
-  getSkippedServiceChecksSuccessCallback: function (data) {
-    if (data.items && data.items.length) {
-      var lastItemWithChecks = data.items[data.items.length - 1];
-      if (lastItemWithChecks && lastItemWithChecks.upgrade_items && lastItemWithChecks.upgrade_items.length) {
-        var skippedServiceChecks = [];
-        lastItemWithChecks.upgrade_items.forEach(function (item) {
-          if (item.tasks && item.tasks.length) {
-            item.tasks.forEach(function (task) {
-              var detail = Em.get(task, 'Tasks.command_detail');
-              if (detail && detail.startsWith('SERVICE_CHECK ')) {
-                skippedServiceChecks.push(App.format.role(detail.replace('SERVICE_CHECK ', ''), true));
-              }
-            });
-          }
-        });
-        skippedServiceChecks = skippedServiceChecks.uniq();
-        this.set('controller.skippedServiceChecks', skippedServiceChecks);
-      }
-    }
-  },
-
-  /**
-   * get slave-component failure hosts
-   */
-  getSlaveComponentItem: function() {
-    var controller = this.get('controller');
-    if (this.get('isSlaveComponentFailuresItem')) {
-      if (!this.get('controller.areSlaveComponentFailuresHostsLoaded')) {
-        var item = this.get('activeGroup.upgradeItems') && this.get('activeGroup.upgradeItems').findProperty('context', this.get("controller.slaveFailuresContext"));
-        controller.getUpgradeItem(item, 'getSlaveComponentItemSuccessCallback').complete(function () {
-          controller.set('areSlaveComponentFailuresHostsLoaded', true);
-        });
-      }
-    } else {
-      controller.set('areSlaveComponentFailuresHostsLoaded', false);
-    }
-  }.observes('isSlaveComponentFailuresItem'),
-
-  /**
-   * get service names of Service Check failures
-   */
-  getServiceCheckItem: function() {
-    var controller = this.get('controller');
-    if (this.get('isServiceCheckFailuresItem')) {
-      if (!this.get('controller.areServiceCheckFailuresServicenamesLoaded')) {
-        controller.getUpgradeItem(this.get('manualItem'), 'getServiceCheckItemSuccessCallback').complete(function () {
-            controller.set('areServiceCheckFailuresServicenamesLoaded', true);
-          });
-      }
-    } else {
-      controller.set('areServiceCheckFailuresServicenamesLoaded', false);
-    }
-  }.observes('isServiceCheckFailuresItem'),
-
-  /**
-   * start polling upgrade data
-   */
-  willInsertElement: function () {
-    this.startPolling();
-  },
-
-  /**
-   * stop polling upgrade data
-   */
-  willDestroyElement: function () {
-    clearTimeout(this.get('updateTimer'));
-    clearTimeout(this.get('upgradeItemTimer'));
-    this.set('isLoaded', false);
-  },
-
-  /**
-   * load upgrade data with time interval
-   */
-  doPolling: function () {
-    var self = this;
-    this.set('updateTimer', setTimeout(function () {
-      self.get('controller').loadUpgradeData().done(function() {
-        self.doPolling();
-      });
-    }, App.bgOperationsUpdateInterval));
-  },
-
-  /**
-   * previous item request
-   */
-  prevItemRequest: null,
-
-  /**
-   * poll for tasks when item is expanded
-   */
-  doUpgradeItemPolling: function () {
-    var self = this;
-    var item = this.get('runningItem') || this.get('failedItem');
-    var request = this.get('prevItemRequest');
-    if ( request ) request.abort();
-    if (item && this.get('isDetailsOpened')) {
-      request = this.get('controller').getUpgradeItem(item).complete(function () {
-        self.set('upgradeItemTimer', setTimeout(function () {
-          self.doUpgradeItemPolling();
-        }, App.bgOperationsUpdateInterval));
-      });
-
-      this.set('prevItemRequest', request);
-    } else {
-      clearTimeout(this.get('upgradeItemTimer'));
-    }
-  }.observes('isDetailsOpened', 'runningItem', 'failedItem'),
-
-  /**
-   * 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.get('controller').setUpgradeItemStatus(event.context, event.context.get('status').slice(8));
-    this.set('isDetailsOpened', false);
-  },
-
-  /**
-   * set current upgrade item state to PENDING in order to retry Upgrade
-   * @param {object} event
-   */
-  retry: function (event) {
-    this.get('controller').setUpgradeItemStatus(event.context, 'PENDING');
-    this.set('isDetailsOpened', false);
-  },
-
-  /**
-   * set current upgrade item state to COMPLETED in order to proceed
-   * @param {object} event
-   */
-  complete: function (event) {
-    this.get('controller').setUpgradeItemStatus(event.context, 'COMPLETED');
-    this.set('isManualDone', false);
-  },
-
-  pauseUpgrade: function() {
-    var self = this;
-    this.get('controller').suspendUpgrade().done(function() {
-      self.get('parentView').closeWizard();
-    });
-  },
-
-  /**
-   * pause upgrade confirmation popup
-   * @param {object} event
-   */
-  confirmPauseUpgrade: function () {
-    var self = this;
-    return App.showConfirmationPopup(
-        function() {
-          self.pauseUpgrade();
-        },
-        Em.I18n.t('admin.stackUpgrade.pauseUpgrade.warning').format("upgrade"),
-        null,
-        Em.I18n.t('common.warning'),
-        Em.I18n.t('admin.stackUpgrade.pauseUpgrade')
-    );
-  },
-
-  /**
-   * pause downgrade confirmation popup
-   * @param {object} event
-   */
-  confirmPauseDowngrade: function () {
-    var self = this;
-    return App.showConfirmationPopup(
-        function() {
-          self.pauseUpgrade();
-        },
-        Em.I18n.t('admin.stackUpgrade.pauseUpgrade.warning').format("downgrade"),
-        null,
-        Em.I18n.t('common.warning'),
-        Em.I18n.t('admin.stackUpgrade.pauseDowngrade')
-    );
-  },
-
-  /**
-   * @type {string}
-   */
-  failedHostsMessage: function() {
-    var count = this.get('controller.slaveComponentStructuredInfo.hosts.length') || 0;
-    return Em.I18n.t('admin.stackUpgrade.failedHosts.showHosts').format(count);
-  }.property('controller.slaveComponentStructuredInfo.hosts'),
-
-  showFailedHosts: function() {
-    return App.ModalPopup.show({
-      header: Em.I18n.t('admin.stackUpgrade.failedHosts.header'),
-      bodyClass: App.FailedHostsPopupBodyView,
-      secondary: null,
-      primary: Em.I18n.t('common.close'),
-      content: this.get('controller.slaveComponentStructuredInfo')
-    });
-  }
-});
diff --git a/ambari-web/app/views/main/admin/stack_upgrade/versions_view.js b/ambari-web/app/views/main/admin/stack_upgrade/versions_view.js
deleted file mode 100644
index 3899bb1..0000000
--- a/ambari-web/app/views/main/admin/stack_upgrade/versions_view.js
+++ /dev/null
@@ -1,254 +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');
-var stringUtils = require('utils/string_utils');
-
-App.MainAdminStackVersionsView = Em.View.extend({
-  templateName: require('templates/main/admin/stack_upgrade/versions'),
-
-  /**
-   * update timer
-   * @type {number|null}
-   * @default null
-   */
-  updateTimer: null,
-
-  /**
-   * @type {Array}
-   */
-  services: App.Service.find(),
-
-  /**
-   * Not Installed = the version is not installed or out of sync
-   * Upgrade Ready = the version is installed and ready for upgrade
-   * Current = the version currently being used
-   * Upgrade in Process = UPGRADING
-   * Ready to Finalize = UPGRADED
-   * Installed = All the versions that are installed BUT cannot be upgraded to (meaning: they are lower than the current)
-   * @type {Array}
-   */
-  categories: [
-    Em.Object.create({
-      labelKey: 'admin.stackVersions.filter.all',
-      value: '',
-      isSelected: true
-    }),
-    Em.Object.create({
-      labelKey: 'admin.stackVersions.filter.notInstalled',
-      value: 'NOT_INSTALLED',
-      isSelected: false
-    }),
-    Em.Object.create({
-      labelKey: 'admin.stackVersions.filter.upgradeReady',
-      value: 'UPGRADE_READY',
-      isSelected: false
-    }),
-    Em.Object.create({
-      labelKey: 'admin.stackVersions.filter.current',
-      value: 'CURRENT',
-      isSelected: false
-    }),
-    Em.Object.create({
-      labelKey: 'admin.stackVersions.filter.installed',
-      value: 'INSTALLED',
-      isSelected: false
-    }),
-    Em.Object.create({
-      labelKey: 'admin.stackVersions.filter.upgrading',
-      value: 'UPGRADING',
-      isSelected: false
-    }),
-    Em.Object.create({
-      labelKey: 'admin.stackVersions.filter.upgraded',
-      value: 'UPGRADED',
-      isSelected: false
-    })
-  ],
-
-  didInsertElement: function () {
-    this.observesCategories();
-  },
-
-  /**
-   * update categories labels
-   */
-  observesCategories: function () {
-    this.get('categories').forEach(function (category) {
-      category.set('label', Em.I18n.t(category.labelKey).format(this.filterBy(this.get('repoVersions'), category).length));
-    }, this);
-    this.filterVersions(this.get('selectedCategory'));
-  }.observes('repoVersions.@each.stackVersion.state', 'controller.isLoaded'),
-
-  /**
-   * select category
-   * @param event
-   */
-  selectCategory: function (event) {
-    this.get('categories').filterProperty('isSelected').setEach('isSelected', false);
-    event.context.set('isSelected', true);
-    this.filterVersions(event.context);
-  },
-
-  /**
-   * filter versions that match category
-   * @param {Em.Object} category
-   */
-  filterVersions: function (category) {
-    var filteredVersionIds = this.filterBy(this.get('repoVersions'), category).mapProperty('id');
-    this.get('repoVersions').forEach(function (version) {
-      version.set('isVisible', filteredVersionIds.contains(version.get('id')));
-    });
-  },
-
-  /**
-   * @type {object}
-   */
-  selectedCategory: Em.computed.findBy('categories', 'isSelected', true),
-
-  /**
-   * @type {Em.Array}
-   */
-  repoVersions: App.RepositoryVersion.find(),
-  
-  /**
-   * @type {Em.Array}
-   */
-  stackVersions: App.StackVersion.find(),
-
-  /**
-   * filter versions by category
-   * @param versions
-   * @param filter
-   * @return {Array}
-   */
-  filterBy: function (versions, filter) {
-    var currentVersion = this.get('controller.currentVersion');
-    if (filter && filter.get('value')) {
-      versions = versions.filter(function (version) {
-        var status = version.get('status');
-        var isUpgrading = this.isVersionUpgrading(version);
-        if (status === 'INSTALLED' && ['UPGRADE_READY', 'INSTALLED', 'UPGRADING'].contains(filter.get('value'))) {
-          if (filter.get('value') === 'UPGRADING') {
-            return isUpgrading;
-          } else if (filter.get('value') === 'UPGRADE_READY') {
-            return !isUpgrading &&
-              stringUtils.compareVersions(version.get('repositoryVersion'), Em.get(currentVersion, 'repository_version')) === 1;
-          } else if (filter.get('value') === 'INSTALLED') {
-            return stringUtils.compareVersions(version.get('repositoryVersion'), Em.get(currentVersion, 'repository_version')) < 1;
-          }
-        } else if (filter.get('value') === 'NOT_INSTALLED') {
-          return ['NOT_REQUIRED', 'INSTALL_FAILED', 'INSTALLING', 'OUT_OF_SYNC'].contains(status);
-        } else {
-          return status === filter.get('value');
-        }
-      }, this);
-    }
-    if (App.get('supports.displayOlderVersions') || Em.isNone(currentVersion)) {
-      return versions.filterProperty('hidden', false).toArray();
-    } else {
-      return versions.filterProperty('hidden', false).filter(function(v) {
-        if (v.get('stackVersionType') === Em.get(currentVersion, 'stack_name')) {
-          // PATCH or MAINT version should be visible even if patch number lower than current
-          return v.get('isPatch') || v.get('isMaint') || stringUtils.compareVersions(v.get('repositoryVersion'), Em.get(currentVersion, 'repository_version')) >= 0;
-        }
-        return v.get('isCompatible');
-      }).toArray();
-    }
-  },
-
-  /**
-   * is version in upgrading or downgrading state
-   * @param version
-   */
-  isVersionUpgrading: function(version) {
-    var upgradeController = App.router.get('mainAdminStackAndUpgradeController');
-    return upgradeController.get('upgradeVersion') === version.get('displayName') ||
-           upgradeController.get('fromVersion') === version.get('repositoryVersion');
-  },
-
-  /**
-   * route to versions in Admin View
-   * @return {App.ModalPopup}
-   */
-  goToVersions: function () {
-    var self = this;
-    return App.showConfirmationPopup(function () {
-      App.ajax.send({
-        name: 'ambari.service.load_server_version',
-        sender: self
-      }).then(function(data) {
-        var components = Em.get(data,'components');
-        if (Em.isArray(components)) {
-          var mappedVersions = components.map(function(component) {
-              if (Em.get(component, 'RootServiceComponents.component_version')) {
-                return Em.get(component, 'RootServiceComponents.component_version');
-              }
-            }),
-            sortedMappedVersions = mappedVersions.sort(),
-            latestVersion = sortedMappedVersions[sortedMappedVersions.length-1].replace(/[^\d.-]/g, '');
-            window.location.replace(App.appURLRoot + 'views/ADMIN_VIEW/' + latestVersion + '/INSTANCE/#/stackVersions');
-        }
-      });
-    },
-    Em.I18n.t('admin.stackVersions.manageVersions.popup.body'),
-    null,
-    Em.I18n.t('admin.stackVersions.manageVersions'));
-  },
-
-  /**
-   * load ClusterStackVersions data
-   */
-  willInsertElement: function () {
-    this.poll();
-  },
-
-  /**
-   * stop polling upgrade state
-   */
-  willDestroyElement: function () {
-    window.clearTimeout(this.get('updateTimer'));
-    App.ajax.abortRequests(this.get('controller.runningCheckRequests'));
-  },
-
-  /**
-   * set timer for polling
-   */
-  doPolling: function () {
-    var self = this;
-    this.set('updateTimer', window.setTimeout(function () {
-      self.poll.apply(self);
-    }, App.bgOperationsUpdateInterval));
-  },
-
-  /**
-   * poll data
-   */
-  poll: function () {
-    var self = this;
-    //skip call if Upgrade wizard opened
-    if (App.router.get('updateController').get('isWorking')) {
-      this.get('controller').load().done(function () {
-        self.set('controller.isLoaded', true);
-        self.doPolling();
-      });
-    }
-  }
-
-});
diff --git a/ambari-web/app/views/main/host/stack_versions_view.js b/ambari-web/app/views/main/host/stack_versions_view.js
index 62a88b4..af48580 100644
--- a/ambari-web/app/views/main/host/stack_versions_view.js
+++ b/ambari-web/app/views/main/host/stack_versions_view.js
@@ -152,13 +152,6 @@ App.MainHostStackVersionsView = App.TableView.extend({
     }
   }),
 
-  /**
-   * show progress of installation of version on host
-   */
-  showInstallProgress: function (event) {
-    App.router.get('mainAdminStackAndUpgradeController').showProgressPopup(event.context);
-  },
-
   outOfSyncInfo: Em.View.extend({
     tagName: 'i',
     classNames: ['glyphicon glyphicon-question-sign'],
diff --git a/ambari-web/app/views/main/menu.js b/ambari-web/app/views/main/menu.js
index acbd7dc..c90d4ac 100644
--- a/ambari-web/app/views/main/menu.js
+++ b/ambari-web/app/views/main/menu.js
@@ -108,14 +108,6 @@ App.MainSideMenuView = Em.CollectionView.extend({
             href: router.urlFor('main.admin.serviceGroups')
           });
         }
-        if (App.isAuthorized('CLUSTER.VIEW_STACK_DETAILS, CLUSTER.UPGRADE_DOWNGRADE_STACK') || upg) {
-          categories.push({
-            name: 'stackAndUpgrade',
-            url: 'stack',
-            label: Em.I18n.t('admin.stackUpgrade.title'),
-            href: router.urlFor('main.admin.stackAndUpgrade')
-          });
-        }
         if(App.isAuthorized('SERVICE.SET_SERVICE_USERS_GROUPS') || upg) {
           categories.push({
             name: 'adminServiceAccounts',
diff --git a/ambari-web/test/app_test.js b/ambari-web/test/app_test.js
index 2812b7d..f2089b8 100644
--- a/ambari-web/test/app_test.js
+++ b/ambari-web/test/app_test.js
@@ -412,180 +412,4 @@ describe('App', function () {
       });
     });
   });
-
-  describe('#upgradeIsRunning', function () {
-
-    Em.A([
-        {
-          upgradeState: 'IN_PROGRESS',
-          m: 'should be true (1)',
-          e: true
-        },
-        {
-          upgradeState: 'HOLDING',
-          m: 'should be true (2)',
-          e: true
-        },
-        {
-          upgradeState: 'FAKE',
-          m: 'should be false',
-          e: false
-        }
-      ]).forEach(function (test) {
-        it(test.m, function () {
-          App.set('upgradeState', test.upgradeState);
-          expect(App.get('upgradeIsRunning')).to.equal(test.e);
-        });
-      });
-
-  });
-
-  describe('#upgradeSuspended', function () {
-    var cases = [
-      {
-        upgradeState: 'NOT_REQUIRED',
-        isSuspended: false,
-        upgradeSuspended: false
-      },
-      {
-        upgradeState: 'ABORTED',
-        isSuspended: false,
-        upgradeSuspended: false
-      },
-      {
-        upgradeState: 'ABORTED',
-        isSuspended: true,
-        upgradeSuspended: true
-      }
-    ];
-
-    beforeEach(function() {
-      this.mock = sinon.stub(App.router, 'get');
-    });
-    afterEach(function() {
-      this.mock.restore();
-    });
-
-    cases.forEach(function (test) {
-      it(test.upgradeState + ", isSuspended=" + test.isSuspended, function () {
-        App.set('upgradeState', test.upgradeState);
-        this.mock.returns(test.isSuspended);
-        App.propertyDidChange('upgradeSuspended');
-        expect(App.get('upgradeSuspended')).to.equal(test.upgradeSuspended);
-      });
-    });
-  });
-
-  describe('#upgradeAborted', function () {
-
-    var cases = [
-      {
-        upgradeState: 'NOT_REQUIRED',
-        isSuspended: false,
-        upgradeAborted: false
-      },
-      {
-        upgradeState: 'ABORTED',
-        isSuspended: true,
-        upgradeAborted: false
-      },
-      {
-        upgradeState: 'ABORTED',
-        isSuspended: false,
-        upgradeAborted: true
-      }
-    ];
-
-    beforeEach(function() {
-      this.mock = sinon.stub(App.router, 'get');
-    });
-    afterEach(function() {
-      this.mock.restore();
-    });
-
-    cases.forEach(function (test) {
-      it(test.upgradeState + ", isSuspended=" + test.isSuspended, function () {
-        App.set('upgradeState', test.upgradeState);
-        this.mock.returns(test.isSuspended);
-        App.propertyDidChange('upgradeAborted');
-        expect(App.get('upgradeAborted')).to.equal(test.upgradeAborted);
-      });
-    });
-  });
-
-  describe('#wizardIsNotFinished', function () {
-    var cases = [
-      {
-        upgradeState: 'NOT_REQUIRED',
-        wizardIsNotFinished: false
-      },
-      {
-        upgradeState: 'IN_PROGRESS',
-        wizardIsNotFinished: true
-      },
-      {
-        upgradeState: 'HOLDING',
-        wizardIsNotFinished: true
-      },
-      {
-        upgradeState: 'HOLDING_TIMEDOUT',
-        wizardIsNotFinished: true
-      },
-      {
-        upgradeState: 'ABORTED',
-        wizardIsNotFinished: true
-      }
-    ];
-
-    cases.forEach(function (item) {
-      it(item.upgradeState, function () {
-        App.set('upgradeState', item.upgradeState);
-        App.propertyDidChange('wizardIsNotFinished');
-        expect(App.get('wizardIsNotFinished')).to.equal(item.wizardIsNotFinished);
-      });
-    });
-  });
-
-  describe("#upgradeHolding", function () {
-    var cases = [
-      {
-        upgradeState: 'NOT_REQUIRED',
-        upgradeAborted: false,
-        upgradeHolding: false
-      },
-      {
-        upgradeState: 'HOLDING',
-        upgradeAborted: false,
-        upgradeHolding: true
-      },
-      {
-        upgradeState: 'HOLDING_FAILED',
-        upgradeAborted: false,
-        upgradeHolding: true
-      },
-      {
-        upgradeState: 'NOT_REQUIRED',
-        upgradeAborted: true,
-        upgradeHolding: true
-      }
-    ];
-
-    beforeEach(function() {
-      this.mock = sinon.stub(App.router, 'get');
-    });
-    afterEach(function() {
-      this.mock.restore();
-    });
-
-    cases.forEach(function (test) {
-      it(test.upgradeState + ", upgradeAborted=" + test.upgradeAborted, function () {
-        App.reopen({
-          upgradeAborted: test.upgradeAborted,
-          upgradeState: test.upgradeState
-        });
-        App.propertyDidChange('upgradeHolding');
-        expect(App.get('upgradeHolding')).to.equal(test.upgradeHolding);
-      });
-    });
-  });
 });
diff --git a/ambari-web/test/controllers/global/cluster_controller_test.js b/ambari-web/test/controllers/global/cluster_controller_test.js
index 1b05fd2..947d9b7 100644
--- a/ambari-web/test/controllers/global/cluster_controller_test.js
+++ b/ambari-web/test/controllers/global/cluster_controller_test.js
@@ -244,151 +244,6 @@ describe('App.clusterController', function () {
 
   });
 
-  describe("#restoreUpgradeState()", function() {
-    var data = {upgradeData: {}};
-    var mock = {
-      done: function (callback) {
-        callback(data.upgradeData);
-      }
-    };
-    var upgradeController = Em.Object.create({
-      restoreLastUpgrade: Em.K,
-      initDBProperties: Em.K,
-      loadUpgradeData: Em.K,
-      loadCompatibleVersions: Em.K,
-      updateCurrentStackVersion: Em.K,
-      loadStackVersionsToModel: function () {
-        return {done: Em.clb};
-      }
-    });
-
-    beforeEach(function () {
-      sinon.stub(controller, 'getAllUpgrades').returns(mock);
-      sinon.spy(mock, 'done');
-      sinon.stub(App.router, 'get').returns(upgradeController);
-      sinon.stub(App.db, 'get').returns('PENDING');
-      sinon.spy(upgradeController, 'restoreLastUpgrade');
-      sinon.spy(upgradeController, 'initDBProperties');
-      sinon.spy(upgradeController, 'loadUpgradeData');
-      sinon.spy(upgradeController, 'loadStackVersionsToModel');
-      sinon.spy(upgradeController, 'loadCompatibleVersions');
-      sinon.spy(upgradeController, 'updateCurrentStackVersion');
-      sinon.stub(App.stackUpgradeHistoryMapper, 'map');
-    });
-
-    afterEach(function () {
-      mock.done.restore();
-      controller.getAllUpgrades.restore();
-      App.router.get.restore();
-      App.db.get.restore();
-      upgradeController.restoreLastUpgrade.restore();
-      upgradeController.initDBProperties.restore();
-      upgradeController.loadUpgradeData.restore();
-      upgradeController.loadStackVersionsToModel.restore();
-      upgradeController.loadCompatibleVersions.restore();
-      upgradeController.updateCurrentStackVersion.restore();
-      App.stackUpgradeHistoryMapper.map.restore();
-    });
-
-    describe("has upgrade request", function() {
-
-      beforeEach(function () {
-        data.upgradeData = {items: [
-          {
-            Upgrade: {
-              request_id: 1
-            }
-          }
-        ]};
-        controller.restoreUpgradeState();
-      });
-
-      it('getAllUpgrades is called once', function () {
-        expect(controller.getAllUpgrades.calledOnce).to.be.true;
-      });
-
-      it('restoreLastUpgrade is called with valid arguments', function () {
-        expect(upgradeController.restoreLastUpgrade.calledWith(data.upgradeData.items[0])).to.be.true;
-      });
-
-      it('loadStackVersionsToModel is called with valid arguments', function () {
-        expect(upgradeController.loadStackVersionsToModel.calledWith(true)).to.be.true;
-      });
-
-      it('loadCompatibleVersions should be called', function () {
-        expect(upgradeController.loadCompatibleVersions.calledOnce).to.be.true;
-      });
-
-      it('updateCurrentStackVersion should be called', function () {
-        expect(upgradeController.updateCurrentStackVersion.calledOnce).to.be.true;
-      });
-
-      it('initDBProperties is not called', function () {
-        expect(upgradeController.initDBProperties.called).to.be.false;
-      });
-
-      it('loadUpgradeData is not called', function () {
-        expect(upgradeController.loadUpgradeData.called).to.be.false;
-      });
-
-      it('App.stackUpgradeHistoryMapper.map should be called', function () {
-        expect(App.stackUpgradeHistoryMapper.map.calledOnce).to.be.true;
-      });
-    });
-
-    describe("has completed upgrade request", function() {
-
-      beforeEach(function () {
-        data.upgradeData = {items: [
-          {
-            Upgrade: {
-              request_id: 1,
-              request_status: 'COMPLETED'
-            }
-          }
-        ]};
-        controller.restoreUpgradeState();
-      });
-
-      it('getAllUpgrades is called once', function () {
-        expect(controller.getAllUpgrades.calledOnce).to.be.true;
-      });
-
-      it('restoreLastUpgrade should not be called', function () {
-        expect(upgradeController.restoreLastUpgrade.called).to.be.false;
-      });
-
-      it('loadStackVersionsToModel should be called', function () {
-        expect(upgradeController.loadStackVersionsToModel).to.be.calledOnce;
-      });
-    });
-
-    describe("does not have upgrade request", function() {
-
-      beforeEach(function () {
-        data.upgradeData = {items: []};
-        controller.restoreUpgradeState();
-      });
-
-      it('getAllUpgrades is called once', function () {
-        expect(controller.getAllUpgrades.calledOnce).to.be.true;
-      });
-
-      it('restoreLastUpgrade is not called', function () {
-        expect(upgradeController.restoreLastUpgrade.called).to.be.false;
-      });
-
-      it('loadStackVersionsToModel is called with valid arguments', function () {
-        expect(upgradeController.loadStackVersionsToModel.calledWith(true)).to.be.true;
-      });
-
-      it('initDBProperties is called once', function () {
-        expect(upgradeController.initDBProperties.calledOnce).to.be.true;
-      });
-
-    });
-  });
-
   describe('#isRunningState()', function() {
     var testCases = [
       {
@@ -645,7 +500,6 @@ describe('App.clusterController', function () {
       sinon.stub(controller, 'loadAuthorizations');
       sinon.stub(controller, 'getAllHostNames');
       sinon.stub(controller, 'loadClusterInfo');
-      sinon.stub(controller, 'restoreUpgradeState');
       sinon.stub(controller, 'loadClusterDataToModel');
       sinon.stub(App.router.get('mainController'), 'startPolling');
       sinon.stub(App.router.get('userSettingsController'), 'getAllUserSettings');
@@ -666,7 +520,6 @@ describe('App.clusterController', function () {
       controller.loadAuthorizations.restore();
       controller.getAllHostNames.restore();
       controller.loadClusterInfo.restore();
-      controller.restoreUpgradeState.restore();
       controller.loadClusterDataToModel.restore();
     });
 
@@ -695,11 +548,6 @@ describe('App.clusterController', function () {
       expect(controller.loadClusterInfo.calledOnce).to.be.true;
     });
 
-    it('restoreUpgradeState should be called', function() {
-      controller.loadClusterData();
-      expect(controller.restoreUpgradeState.calledOnce).to.be.true;
-    });
-
     it('getUser should be called', function() {
       controller.loadClusterData();
       expect(App.router.get('wizardWatcherController').getUser.calledOnce).to.be.true;
diff --git a/ambari-web/test/controllers/global/update_controller_test.js b/ambari-web/test/controllers/global/update_controller_test.js
index 62a6bb1..a6ed0f2 100644
--- a/ambari-web/test/controllers/global/update_controller_test.js
+++ b/ambari-web/test/controllers/global/update_controller_test.js
@@ -87,7 +87,6 @@ describe('App.UpdateController', function () {
       expect(App.StompClient.subscribe.calledWith('/events/hosts')).to.be.true;
       expect(App.StompClient.subscribe.calledWith('/events/alert_definitions')).to.be.true;
       expect(App.StompClient.subscribe.calledWith('/events/alert_group')).to.be.true;
-      expect(App.StompClient.subscribe.calledWith('/events/upgrade')).to.be.true;
     });
   });
 
diff --git a/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js b/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js
index b14bf86..b531926 100644
--- a/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/highAvailability/progress_popup_controller_test.js
@@ -282,7 +282,6 @@ describe('App.HighAvailabilityProgressPopupController', function () {
       sinon.stub(App.HostPopup, 'initPopup');
       sinon.stub(controller, 'isRequestRunning').returns(true);
       sinon.stub(controller, 'addObserver');
-      sinon.stub(controller, 'doPolling');
       sinon.stub(spinner, 'hide');
       controller.setProperties({
         requestIds: [1],
@@ -301,7 +300,6 @@ describe('App.HighAvailabilityProgressPopupController', function () {
       App.HostPopup.initPopup.restore();
       controller.isRequestRunning.restore();
       controller.addObserver.restore();
-      controller.doPolling.restore();
       spinner.hide.restore();
     });
 
@@ -320,10 +318,6 @@ describe('App.HighAvailabilityProgressPopupController', function () {
     it("spinnerPopup.hide should be called", function() {
       expect(spinner.hide.calledOnce).to.be.true;
     });
-
-    it("doPolling should be called", function() {
-      expect(controller.doPolling.calledOnce).to.be.true;
-    });
   });
 
   describe("#calculateHostsData()", function () {
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
deleted file mode 100644
index 0ebaee8..0000000
--- a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js
+++ /dev/null
@@ -1,3606 +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('controllers/main/admin/stack_and_upgrade_controller');
-require('utils/string_utils');
-var testHelpers = require('test/helpers');
-
-describe('App.MainAdminStackAndUpgradeController', function() {
-
-  var controller = App.MainAdminStackAndUpgradeController.create({
-    getDBProperty: Em.K,
-    setDBProperty: Em.K,
-    setDBProperties: Em.K,
-    getDBProperties: Em.K
-  });
-
-  controller.removeObserver('App.upgradeState', controller, 'finish');
-
-
-  describe("#realRepoUrl", function() {
-    before(function () {
-      this.mock = sinon.stub(App, 'get');
-      this.mock.withArgs('apiPrefix').returns('apiPrefix');
-    });
-    after(function () {
-      this.mock.restore();
-    });
-    it("should be valid", function() {
-      var expected = 'apiPrefix/stacks?fields=versions/repository_versions/RepositoryVersions,' +
-        'versions/repository_versions/operating_systems/*,versions/repository_versions/operating_systems/repositories/*';
-      controller.propertyDidChange('realRepoUrl');
-      expect(controller.get('realRepoUrl')).to.equal(expected);
-    });
-  });
-
-  describe("#realStackUrl", function() {
-    before(function () {
-      this.mock = sinon.stub(App, 'get');
-      this.mock.withArgs('apiPrefix').returns('apiPrefix')
-        .withArgs('clusterName').returns('clusterName');
-    });
-    after(function () {
-      this.mock.restore();
-    });
-    it("should be valid", function() {
-      controller.propertyDidChange('realStackUrl');
-      expect(controller.get('realStackUrl')).to.equal('apiPrefix/clusters/clusterName/stack_versions?fields=*,repository_versions/*,repository_versions/operating_systems/OperatingSystems/*,repository_versions/operating_systems/repositories/*');
-    });
-  });
-
-  describe("#realUpdateUrl", function() {
-    before(function () {
-      this.mock = sinon.stub(App, 'get');
-      this.mock.withArgs('apiPrefix').returns('apiPrefix')
-        .withArgs('clusterName').returns('clusterName');
-    });
-    after(function () {
-      this.mock.restore();
-    });
-    it("realUpdateUrl is valid", function() {
-      controller.propertyDidChange('realUpdateUrl');
-      expect(controller.get('realUpdateUrl')).to.equal('apiPrefix/clusters/clusterName/stack_versions?fields=ClusterStackVersions/*');
-    });
-  });
-
-  describe("#requestStatus", function() {
-
-    beforeEach(function() {
-      this.mock = sinon.stub(App, 'get');
-    });
-    afterEach(function() {
-      this.mock.restore();
-    });
-
-    it("App.upgradeSuspended is true", function() {
-      this.mock.returns(true);
-      controller.set('upgradeData', { Upgrade: {request_status: 'ABORTED'}});
-      controller.propertyDidChange('requestStatus');
-      expect(controller.get('requestStatus')).to.equal('SUSPENDED');
-    });
-
-    it("state not ABORTED", function() {
-      this.mock.returns(false);
-      controller.set('upgradeData', { Upgrade: {request_status: 'NOT_REQUIRED'}});
-      controller.propertyDidChange('requestStatus');
-      expect(controller.get('requestStatus')).to.equal('NOT_REQUIRED');
-    });
-
-    it("upgradeData is null", function() {
-      this.mock.returns(false);
-      controller.set('upgradeData', null);
-      controller.propertyDidChange('requestStatus');
-      expect(controller.get('requestStatus')).to.equal('INIT');
-    });
-  });
-
-  describe("#load()", function() {
-    beforeEach(function(){
-      sinon.stub(controller, 'loadStackVersionsToModel').returns({
-        done: Em.clb
-      });
-      sinon.stub(controller, 'loadRepoVersionsToModel').returns({
-        done: Em.clb
-      });
-      sinon.stub(controller, 'loadCompatibleVersions').returns({
-        done: Em.clb
-      });
-      sinon.stub(App.StackVersion, 'find').returns([Em.Object.create({
-        state: 'CURRENT',
-        repositoryVersion: {
-          id: '1',
-          stackVersionType: 'HDP',
-          repositoryVersion: '2.2',
-          displayName: 'HDP-2.2'
-        }
-      })]);
-      controller.load();
-    });
-    afterEach(function(){
-      controller.loadStackVersionsToModel.restore();
-      controller.loadRepoVersionsToModel.restore();
-      controller.loadCompatibleVersions.restore();
-      App.StackVersion.find.restore();
-    });
-    it('loadStackVersionsToModel called with valid arguments', function () {
-      expect(controller.loadStackVersionsToModel.calledWith(true)).to.be.true;
-    });
-    it('loadRepoVersionsToModel called once', function () {
-      expect(controller.loadRepoVersionsToModel.calledOnce).to.be.true;
-    });
-    it('loadCompatibleVersions called once', function () {
-      expect(controller.loadCompatibleVersions.calledOnce).to.be.true;
-    });
-    it('currentVersion is corrent', function () {
-      expect(controller.get('currentVersion')).to.eql({
-        "id": "1",
-        "stack_name": 'HDP',
-        "repository_version": "2.2",
-        "repository_name": "HDP-2.2"
-      });
-    });
-  });
-
-  describe("#loadUpgradeData()", function() {
-
-    it("get entire data", function() {
-      controller.set('upgradeId', 1);
-      controller.loadUpgradeData();
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.data');
-      expect(args[0]).to.exists;
-      expect(args[0].sender).to.be.eql(controller);
-      expect(args[0].data).to.be.eql({
-        id: 1
-      });
-    });
-    it("get only state", function() {
-      controller.set('upgradeId', 1);
-      controller.loadUpgradeData(true);
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.state');
-      expect(args[0]).to.exists;
-      expect(args[0].sender).to.be.eql(controller);
-      expect(args[0].data).to.be.eql({
-        id: 1
-      });
-    });
-    it("upgrade id is null", function() {
-      controller.set('upgradeId', null);
-      controller.loadUpgradeData();
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.state');
-      var args2 = testHelpers.findAjaxRequest('name', 'admin.upgrade.data');
-      expect(args).to.not.exists;
-      expect(args2).to.not.exists;
-    });
-  });
-
-  describe("#loadUpgradeDataSuccessCallback()", function() {
-    var retryCases = [
-      {
-        isRetryPendingInitial: true,
-        status: 'ABORTED',
-        isRetryPending: true,
-        requestInProgress: true,
-        title: 'retry request not yet applied'
-      },
-      {
-        isRetryPendingInitial: true,
-        status: 'UPGRADING',
-        isRetryPending: false,
-        requestInProgress: false,
-        title: 'retry request applied'
-      },
-      {
-        isRetryPendingInitial: false,
-        status: 'ABORTED',
-        isRetryPending: false,
-        requestInProgress: true,
-        title: 'no retry request sent'
-      },
-      {
-        isRetryPendingInitial: false,
-        status: 'UPGRADING',
-        isRetryPending: false,
-        requestInProgress: true,
-        title: 'upgrade wasn\'t aborted'
-      }
-    ];
-    beforeEach(function () {
-      sinon.stub(controller, 'updateUpgradeData', Em.K);
-      sinon.stub(controller, 'setDBProperty', Em.K);
-      sinon.stub(controller, 'finish');
-    });
-    afterEach(function () {
-      controller.updateUpgradeData.restore();
-      controller.setDBProperty.restore();
-      controller.finish.restore();
-      App.set('upgradeState', 'NOT_REQUIRED');
-    });
-
-    it("correct data", function() {
-      var data = {
-        "Upgrade": {
-          "request_status": "UPGRADED"
-        },
-        "upgrade_groups": [
-          {
-            "UpgradeGroup": {
-              "id": 1
-            },
-            "upgrade_items": []
-          }
-        ]};
-      controller.loadUpgradeDataSuccessCallback(data);
-      expect(App.get('upgradeState')).to.equal('UPGRADED');
-      expect(controller.updateUpgradeData.calledOnce).to.be.true;
-      expect(controller.setDBProperty.calledWith('upgradeState', 'UPGRADED')).to.be.true;
-    });
-
-    it("data is null", function() {
-      var data = null;
-      controller.loadUpgradeDataSuccessCallback(data);
-      expect(controller.updateUpgradeData.called).to.be.false;
-      expect(controller.setDBProperty.called).to.be.false;
-    });
-
-    it("finish should be called", function() {
-      var data = {
-        "Upgrade": {
-          "request_status": "COMPLETED"
-        }
-      };
-      controller.loadUpgradeDataSuccessCallback(data);
-      expect(controller.finish.calledOnce).to.be.true;
-    });
-
-    retryCases.forEach(function (item) {
-      it(item.title, function () {
-        var data = {
-          "Upgrade": {
-            "request_status": item.status
-          }
-        };
-        controller.setProperties({
-          isRetryPending: item.isRetryPendingInitial,
-          requestInProgress: true
-        });
-        controller.loadUpgradeDataSuccessCallback(data);
-        expect(controller.getProperties(['isRetryPending', 'requestInProgress'])).to.eql({
-          isRetryPending: item.isRetryPending,
-          requestInProgress: item.requestInProgress
-        });
-      });
-    });
-  });
-
-  describe("#getUpgradeItem()", function() {
-
-    it("default callback", function() {
-      var item = Em.Object.create({
-        request_id: 1,
-        group_id: 2,
-        stage_id: 3
-      });
-      controller.getUpgradeItem(item);
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.upgrade_item');
-      expect(args[0]).to.exists;
-      expect(args[0].sender).to.be.eql(controller);
-      expect(args[0].success).to.be.equal('getUpgradeItemSuccessCallback');
-      expect(args[0].data).to.be.eql({
-        upgradeId: 1,
-        groupId: 2,
-        stageId: 3
-      });
-    });
-    it("custom callback", function() {
-      var item = Em.Object.create({
-        request_id: 1,
-        group_id: 2,
-        stage_id: 3
-      });
-      controller.getUpgradeItem(item, 'customCallback');
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.upgrade_item');
-      expect(args[0]).to.exists;
-      expect(args[0].sender).to.be.eql(controller);
-      expect(args[0].success).to.be.equal('customCallback');
-      expect(args[0].data).to.be.eql({
-        upgradeId: 1,
-        groupId: 2,
-        stageId: 3
-      });
-    });
-  });
-
-  describe("#openUpgradeDialog()", function () {
-    var mock = {
-      observer: Em.K
-    };
-    beforeEach(function () {
-      sinon.stub(App.router, 'transitionTo', Em.K);
-      sinon.spy(mock, 'observer');
-      this.mockAuthorized = sinon.stub(App, 'isAuthorized');
-      Em.addObserver(App, 'upgradeSuspended', mock, 'observer');
-    });
-    afterEach(function () {
-      App.router.transitionTo.restore();
-      mock.observer.restore();
-      this.mockAuthorized.restore();
-      Em.removeObserver(App, 'upgradeSuspended', mock, 'observer');
-    });
-
-    it('should open dialog', function () {
-      this.mockAuthorized.returns(true);
-      controller.openUpgradeDialog();
-      expect(App.router.transitionTo.calledWith('admin.stackUpgrade')).to.be.true;
-    });
-
-    it('upgradeSuspended should receive actual value', function () {
-      this.mockAuthorized.returns(true);
-      controller.openUpgradeDialog();
-      expect(mock.observer.calledOnce).to.be.true;
-    });
-
-    it('should not open dialog', function () {
-      this.mockAuthorized.returns(false);
-      controller.openUpgradeDialog();
-      expect(App.router.transitionTo.called).to.be.false;
-    });
-
-    it('should not open dialog, isWizardRestricted=true', function () {
-      this.mockAuthorized.returns(true);
-      controller.set('isWizardRestricted', true);
-      controller.openUpgradeDialog();
-      expect(App.router.transitionTo.called).to.be.false;
-    });
-
-    it('upgradeSuspended should not receive value', function () {
-      this.mockAuthorized.returns(false);
-      controller.openUpgradeDialog();
-      expect(mock.observer.called).to.be.false;
-    });
-
-    it('upgradeSuspended should not receive value, isWizardRestricted=true', function () {
-      this.mockAuthorized.returns(true);
-      controller.set('isWizardRestricted', true);
-      controller.openUpgradeDialog();
-      expect(mock.observer.called).to.be.false;
-    });
-  });
-
-  describe("#runPreUpgradeCheck()", function() {
-    it("make ajax call", function() {
-      controller.runPreUpgradeCheck(Em.Object.create({
-        id: '1',
-        repositoryVersion: '2.2',
-        displayName: 'HDP-2.2',
-        upgradeType: 'ROLLING',
-        skipComponentFailures: false,
-        skipSCFailures: false
-      }));
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.pre_upgrade_check');
-      expect(args[0]).to.exists;
-      expect(args[0].sender).to.be.eql(controller);
-      expect(args[0].data).to.be.eql({
-        id: '1',
-        value: '2.2',
-        label: 'HDP-2.2',
-        type: 'ROLLING',
-        targetStack: "HDP-2.2",
-        skipComponentFailures: 'false',
-        skipSCFailures: 'false'
-      });
-    });
-  });
-
-  describe("#runPreUpgradeCheckSuccess()", function () {
-    var cases = [
-      {
-        check: {
-          "check": "Work-preserving RM/NM restart is enabled in YARN configs",
-          "status": "FAIL",
-          "reason": "FAIL",
-          "failed_on": [],
-          "check_type": "SERVICE"
-        },
-        showClusterCheckPopupCalledCount: 1,
-        upgradeCalledCount: 0,
-        title: 'popup is displayed if fails are present'
-      },
-      {
-        check: {
-          "check": "Configuration Merge Check",
-          "status": "WARNING",
-          "reason": "Conflict",
-          "failed_on": [],
-          "failed_detail": [
-            {
-              type: 't0',
-              property: 'p0',
-              current: 'c0',
-              new_stack_value: 'n0',
-              result_value: 'n0'
-            },
-            {
-              type: 't1',
-              property: 'p1',
-              current: 'c1',
-              new_stack_value: null,
-              result_value: 'c1'
-            },
-            {
-              type: 't2',
-              property: 'p2',
-              current: 'c2',
-              new_stack_value: null,
-              result_value: null
-            }
-          ],
-          "check_type": "CLUSTER",
-          "id": "CONFIG_MERGE"
-        },
-        showClusterCheckPopupCalledCount: 1,
-        upgradeCalledCount: 0,
-        configs: [
-          {
-            type: 't0',
-            name: 'p0',
-            currentValue: 'c0',
-            recommendedValue: 'n0',
-            resultingValue: 'n0',
-            isDeprecated: false,
-            wasModified: false,
-            willBeRemoved: false
-          },
-          {
-            type: 't1',
-            name: 'p1',
-            currentValue: 'c1',
-            recommendedValue: Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.deprecated'),
-            resultingValue: 'c1',
-            isDeprecated: true,
-            wasModified: false,
-            willBeRemoved: false
-          },
-          {
-            type: 't2',
-            name: 'p2',
-            currentValue: 'c2',
-            recommendedValue: Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.deprecated'),
-            resultingValue: Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.willBeRemoved'),
-            isDeprecated: true,
-            wasModified: false,
-            willBeRemoved: true
-          }
-        ],
-        title: 'popup is displayed if warnings are present; configs merge conflicts'
-      },
-      {
-        check: {
-          "check": "Work-preserving RM/NM restart is enabled in YARN configs",
-          "status": "PASS",
-          "reason": "OK",
-          "failed_on": [],
-          "check_type": "SERVICE"
-        },
-        showClusterCheckPopupCalledCount: 0,
-        upgradeCalledCount: 1,
-        title: 'upgrade is started if fails and warnings are absent'
-      }
-    ];
-    beforeEach(function () {
-      sinon.stub(App, 'showClusterCheckPopup', Em.K);
-      sinon.stub(controller, 'upgrade', Em.K);
-    });
-    afterEach(function () {
-      App.showClusterCheckPopup.restore();
-      controller.upgrade.restore();
-    });
-    cases.forEach(function (item) {
-      it(item.title, function () {
-        controller.runPreUpgradeCheckSuccess(
-          {
-            items: [
-              {
-                UpgradeChecks: item.check
-              }
-            ]
-          }, null, {
-            label: 'name'
-          }
-        );
-        expect(controller.upgrade.callCount).to.equal(item.upgradeCalledCount);
-        expect(App.showClusterCheckPopup.callCount).to.equal(item.showClusterCheckPopupCalledCount);
-        if (item.check.id === 'CONFIG_MERGE') {
-          expect(App.showClusterCheckPopup.firstCall.args[2]).to.eql(item.configs);
-        }
-      });
-    });
-  });
-
-  describe("#initDBProperties()", function() {
-    before(function () {
-      this.mock = sinon.stub(controller, 'getDBProperties');
-    });
-    after(function () {
-      this.mock.restore();
-    });
-    it("set string properties", function () {
-      this.mock.returns({prop: 'string'});
-      controller.initDBProperties();
-      expect(controller.get('prop')).to.equal('string');
-    });
-    it("set number properties", function () {
-      this.mock.returns({prop: 0});
-      controller.initDBProperties();
-      expect(controller.get('prop')).to.equal(0);
-    });
-    it("set boolean properties", function () {
-      this.mock.returns({prop: false});
-      controller.initDBProperties();
-      expect(controller.get('prop')).to.be.false;
-    });
-    it("set undefined properties", function () {
-      this.mock.returns({prop: undefined});
-      controller.set('prop', 'value');
-      controller.initDBProperties();
-      expect(controller.get('prop')).to.equal('value');
-    });
-    it("set null properties", function () {
-      this.mock.returns({prop: null});
-      controller.set('prop', 'value');
-      controller.initDBProperties();
-      expect(controller.get('prop')).to.equal('value');
-    });
-  });
-
-  describe("#init()", function() {
-    before(function () {
-      sinon.stub(controller, 'initDBProperties', Em.K);
-    });
-    after(function () {
-      controller.initDBProperties.restore();
-    });
-    it("call initDBProperties", function () {
-      controller.init();
-      expect(controller.initDBProperties.calledOnce).to.be.true;
-    });
-  });
-
-  describe("#upgrade()", function() {
-    var callArgs;
-
-    beforeEach(function () {
-      sinon.stub(controller, 'setDBProperty', Em.K);
-      controller.set('currentVersion', {
-        repository_version: '2.2'
-      });
-      controller.upgrade({
-        value: '2.2',
-        label: 'HDP-2.2'
-      });
-      callArgs = testHelpers.findAjaxRequest('name', 'admin.upgrade.start')[0];
-    });
-
-    afterEach(function () {
-      controller.setDBProperty.restore();
-    });
-
-    it("request-data is valid", function() {
-      expect(callArgs.data).to.eql({"value": '2.2', "label": 'HDP-2.2'});
-    });
-    it('request-name is valid', function () {
-      expect(callArgs.name).to.equal('admin.upgrade.start');
-    });
-    it('request-sender is valid', function () {
-      expect(callArgs.sender).to.eql(controller);
-    });
-    it('callback is valid', function () {
-      expect(callArgs.success).to.equal('upgradeSuccessCallback');
-    });
-    it('callback is called', function () {
-      expect(callArgs.callback).to.be.called;
-    });
-    it('setDBProperty is called with valid data', function () {
-      expect(controller.setDBProperty.calledWith('currentVersion', {
-        repository_version: '2.2'
-      })).to.be.true;
-    });
-  });
-
-  describe("#upgradeSuccessCallback()", function() {
-
-    beforeEach(function () {
-      sinon.stub(App.clusterStatus, 'setClusterStatus', Em.K);
-      sinon.stub(controller, 'openUpgradeDialog', Em.K);
-      sinon.stub(controller, 'setDBProperties', Em.K);
-      sinon.stub(controller, 'load', Em.K);
-      var data = {
-        resources: [
-          {
-            Upgrade: {
-              request_id: 1
-            }
-          }
-        ]
-      };
-      controller.upgradeSuccessCallback(data, {}, {label: 'HDP-2.2.1', isDowngrade: true});
-    });
-
-    afterEach(function () {
-      App.clusterStatus.setClusterStatus.restore();
-      controller.openUpgradeDialog.restore();
-      controller.setDBProperties.restore();
-      controller.load.restore();
-    });
-
-    it('load is called ocne', function() {
-      expect(controller.load.calledOnce).to.be.true;
-    });
-    it('upgradeVersion is HDP-2.2.1', function() {
-      expect(controller.get('upgradeVersion')).to.equal('HDP-2.2.1');
-    });
-    it('upgradeData is null', function() {
-      expect(controller.get('upgradeData')).to.be.null;
-    });
-    it('isDowngrade is true', function() {
-      expect(controller.get('isDowngrade')).to.be.true;
-    });
-    it('App.clusterStatus.setClusterStatus is called once', function() {
-      expect(App.clusterStatus.setClusterStatus.calledOnce).to.be.true;
-    });
-    it('controller.openUpgradeDialog is called once', function() {
-      expect(controller.openUpgradeDialog.calledOnce).to.be.true;
-    });
-  });
-
-  describe("#updateUpgradeData()", function() {
-    beforeEach(function () {
-      sinon.stub(controller, 'initUpgradeData', Em.K);
-    });
-    afterEach(function () {
-      controller.initUpgradeData.restore();
-    });
-    it("data loaded first time", function() {
-      controller.set('upgradeData', null);
-      controller.updateUpgradeData({});
-      expect(controller.initUpgradeData.calledWith({})).to.be.true;
-    });
-
-    describe('upgradeData exists', function () {
-
-      var groups;
-
-      beforeEach(function() {
-        var oldData = Em.Object.create({
-          upgradeGroups: [
-            Em.Object.create({
-              group_id: 1,
-              upgradeItems: [
-                Em.Object.create({
-                  stage_id: 1
-                })
-              ]
-            }),
-            Em.Object.create({
-              group_id: 2,
-              upgradeItems: [
-                Em.Object.create({
-                  stage_id: 2
-                }),
-                Em.Object.create({
-                  stage_id: 3
-                })
-              ]
-            })
-          ]
-        });
-        var newData = {
-          Upgrade: {
-            request_id: 1
-          },
-          upgrade_groups: [
-            {
-              UpgradeGroup: {
-                group_id: 1,
-                status: 'COMPLETED',
-                display_status: 'COMPLETED',
-                progress_percent: 100,
-                completed_task_count: 3
-              },
-              upgrade_items: [
-                {
-                  UpgradeItem: {
-                    stage_id: 1,
-                    status: 'COMPLETED',
-                    display_status: 'COMPLETED',
-                    progress_percent: 100
-                  }
-                }
-              ]
-            },
-            {
-              UpgradeGroup: {
-                group_id: 2,
-                status: 'ABORTED',
-                display_status: 'ABORTED',
-                progress_percent: 50,
-                completed_task_count: 1
-              },
-              upgrade_items: [
-                {
-                  UpgradeItem: {
-                    stage_id: 2,
-                    status: 'ABORTED',
-                    display_status: 'ABORTED',
-                    progress_percent: 99
-                  }
-                },
-                {
-                  UpgradeItem: {
-                    stage_id: 3,
-                    status: 'PENDING',
-                    display_status: 'PENDING',
-                    progress_percent: 0
-                  }
-                }
-              ]
-            }
-          ]
-        };
-        controller.set('upgradeData', oldData);
-        controller.updateUpgradeData(newData);
-        groups = controller.get('upgradeData.upgradeGroups');
-      });
-
-      describe("checking 1st group", function() {
-        it('status is COMPLETED', function () {
-          expect(groups[0].get('status')).to.equal('COMPLETED');
-        });
-        it('display_status is COMPLETED', function () {
-          expect(groups[0].get('display_status')).to.equal('COMPLETED');
-        });
-        it('progress_percent is 100', function () {
-          expect(groups[0].get('progress_percent')).to.equal(100);
-        });
-        it('completed_task_count = 3', function () {
-          expect(groups[0].get('completed_task_count')).to.equal(3);
-        });
-        it('upgradeItems.0.status is COMPLETED', function () {
-          expect(groups[0].get('upgradeItems')[0].get('status')).to.equal('COMPLETED');
-        });
-        it('upgradeItems.0.display_status is COMPLETED', function () {
-          expect(groups[0].get('upgradeItems')[0].get('display_status')).to.equal('COMPLETED');
-        });
-        it('upgradeItems.0.progress_percent is 100', function () {
-          expect(groups[0].get('upgradeItems')[0].get('progress_percent')).to.equal(100);
-        });
-        it('hasExpandableItems is true', function () {
-          expect(groups[0].get('hasExpandableItems')).to.be.true;
-        });
-      });
-
-      describe('checking 2nd group', function () {
-        it('status is ABORTED', function () {
-          expect(groups[1].get('status')).to.equal('ABORTED');
-        });
-        it('display_status is ABORTED', function () {
-          expect(groups[1].get('display_status')).to.equal('ABORTED');
-        });
-        it('progress_percent is 50', function () {
-          expect(groups[1].get('progress_percent')).to.equal(50);
-        });
-        it('completed_task_count = 1', function () {
-          expect(groups[1].get('completed_task_count')).to.equal(1);
-        });
-        it('upgradeItems.[].status = ["ABORTED", "PENDING"]', function () {
-          expect(groups[1].get('upgradeItems').mapProperty('status')).to.eql(['ABORTED', 'PENDING']);
-        });
-        it('upgradeItems.[].display_status = ["ABORTED", "PENDING"]', function () {
-          expect(groups[1].get('upgradeItems').mapProperty('display_status')).to.eql(['ABORTED', 'PENDING']);
-        });
-        it('upgradeItems.[].progress_percent = [99, 0]', function () {
-          expect(groups[1].get('upgradeItems').mapProperty('progress_percent')).to.eql([99, 0]);
-        });
-        it('hasExpandableItems is false', function () {
-          expect(groups[1].get('hasExpandableItems')).to.be.false;
-        });
-      });
-
-    });
-  });
-
-  describe("#initUpgradeData()", function() {
-    beforeEach(function () {
-      sinon.stub(controller, 'setDBProperty');
-      sinon.stub(controller, 'formatMessages');
-      var newData = {
-        Upgrade: {
-          request_id: 1,
-          downgrade_allowed: false
-        },
-        upgrade_groups: [
-          {
-            UpgradeGroup: {
-              group_id: 1
-            },
-            upgrade_items: [
-              {
-                UpgradeItem: {
-                  stage_id: 1,
-                  status: 'IN_PROGRESS'
-                }
-              },
-              {
-                UpgradeItem: {
-                  stage_id: 2
-                }
-              }
-            ]
-          },
-          {
-            UpgradeGroup: {
-              group_id: 2
-            },
-            upgrade_items: []
-          },
-          {
-            UpgradeGroup: {
-              group_id: 3
-            },
-            upgrade_items: [
-              {
-                UpgradeItem: {
-                  stage_id: 3,
-                  status: 'ABORTED'
-                }
-              },
-              {
-                UpgradeItem: {
-                  stage_id: 4,
-                  status: 'PENDING'
-                }
-              }
-            ]
-          }
-        ]
-      };
-      controller.initUpgradeData(newData);
-    });
-    afterEach(function () {
-      controller.setDBProperty.restore();
-      controller.formatMessages.restore();
-    });
-    it("setDBProperty called with valid arguments", function() {
-      expect(controller.setDBProperty.calledWith('downgradeAllowed', false)).to.be.true;
-    });
-    it('downgradeAllowed is false', function () {
-      expect(controller.get('downgradeAllowed')).to.be.false;
-    });
-    it('upgradeData.Upgrade.request_id is 1', function () {
-      expect(controller.get('upgradeData.Upgrade.request_id')).to.equal(1);
-    });
-    it('upgradeData.upgradeGroups contain valid data', function () {
-      var groups = controller.get('upgradeData.upgradeGroups');
-      expect(groups.mapProperty('group_id')).to.eql([3,2,1]);
-      expect(groups[2].get('upgradeItems').mapProperty('stage_id')).to.eql([2,1]);
-      expect(groups.mapProperty('hasExpandableItems')).to.eql([false, false, true]);
-    });
-  });
-
-  describe("#confirmDowngrade()", function() {
-
-    before(function () {
-      sinon.spy(App, 'showConfirmationPopup');
-      sinon.stub(controller, 'downgrade', Em.K);
-    });
-
-    after(function () {
-      App.showConfirmationPopup.restore();
-      controller.downgrade.restore();
-    });
-
-    it("show confirmation popup", function() {
-      controller.set('currentVersion', Em.Object.create({
-        repository_version: '2.2',
-        repository_name: 'HDP-2.2'
-      }));
-      var popup = controller.confirmDowngrade();
-      expect(App.showConfirmationPopup.calledOnce).to.be.true;
-      popup.onPrimary();
-      expect(controller.downgrade.calledWith(Em.Object.create({
-        repository_version: '2.2',
-        repository_name: 'HDP-2.2'
-      }))).to.be.true;
-    });
-  });
-
-  describe("#upgradeOptions()", function() {
-    var version = Em.Object.create({displayName: 'HDP-2.2'});
-    beforeEach(function () {
-      sinon.spy(App.ModalPopup, 'show');
-      sinon.spy(App, 'showConfirmationFeedBackPopup');
-      sinon.stub(controller, 'getSupportedUpgradeTypes').returns({
-        done: function (callback) {
-          callback([1]);
-          return {
-            always: function (alwaysCallback) {
-              alwaysCallback();
-              return {};
-            }
-          };
-        }
-      });
-      sinon.stub(controller, 'runPreUpgradeCheck', Em.K);
-      sinon.stub(App.RepositoryVersion, 'find').returns([
-        Em.Object.create({
-          status: 'CURRENT'
-        })
-      ]);
-      controller.get('runningCheckRequests').clear();
-    });
-
-    afterEach(function () {
-      App.ModalPopup.show.restore();
-      App.showConfirmationFeedBackPopup.restore();
-      controller.runPreUpgradeCheck.restore();
-      controller.getSupportedUpgradeTypes.restore();
-      controller.get('upgradeMethods').setEach('selected', false);
-      App.RepositoryVersion.find.restore();
-    });
-
-    describe("show confirmation popup", function() {
-
-      beforeEach(function () {
-        controller.set('isDowngrade', false);
-        this.popup = controller.upgradeOptions(false, version);
-      });
-
-      it('popup is shown', function () {
-        expect(App.ModalPopup.show.calledOnce).to.be.true;
-      });
-
-      it('all upgradeMethods have isCheckRequestInProgress = true', function () {
-        expect(controller.get('upgradeMethods').everyProperty('isCheckRequestInProgress')).to.be.true;
-      });
-
-      it('upgradeMethods no one is selected', function () {
-        expect(controller.get('upgradeMethods').someProperty('selected')).to.be.false;
-      });
-
-      describe('#popup.onPrimary', function () {
-
-        beforeEach(function () {
-          controller.get('upgradeMethods')[0].set('selected', true);
-          this.confirmPopup = this.popup.onPrimary();
-        });
-
-        it('showConfirmationFeedBackPopup is called once', function () {
-          expect(App.showConfirmationFeedBackPopup.calledOnce).to.be.true;
-        });
-
-        describe('#confirmPopup.onPrimary', function () {
-          beforeEach(function () {
-            this.confirmPopup.onPrimary();
-          });
-
-          it('runPreUpgradeCheck is called with correct version', function () {
-            expect(controller.runPreUpgradeCheck.calledWith(version)).to.be.true;
-          });
-
-          it('runningCheckRequests has 1 item', function () {
-            expect(controller.get('runningCheckRequests')).to.have.length(1);
-          });
-
-        });
-
-      });
-
-      describe('#popup.disablePrimary', function () {
-
-        beforeEach(function() {
-          this.mock = sinon.stub(App, 'get');
-        });
-
-        afterEach(function() {
-          App.get.restore();
-        });
-
-        it('should be disabled if no method is selected', function () {
-          expect(this.popup.get('disablePrimary')).to.be.true;
-        });
-
-        it('should be disabled if preupgradecheck is supproted and isPrecheckFailed is true', function () {
-          this.mock.returns(true);
-          this.popup.set('selectedMethod', Em.Object.create({
-            selected: true,
-            isPrecheckFailed: true,
-            isCheckRequestInProgress: false
-          }));
-
-          expect(this.popup.get('disablePrimary')).to.be.true;
-        });
-
-        it('should be disabled if preupgradecheck is supproted and isCheckRequestInProgress is true', function () {
-          this.popup.set('selectedMethod', Em.Object.create({
-            selected: true,
-            isPrecheckFailed: false,
-            isCheckRequestInProgress: true
-          }));
-          this.mock.returns(true);
-          expect(this.popup.get('disablePrimary')).to.be.true;
-        });
-
-        it('should be enabled with preupgrade check', function () {
-          this.popup.set('selectedMethod', Em.Object.create({
-            selected: true,
-            isPrecheckFailed: false,
-            isCheckRequestInProgress: false
-          }));
-          this.mock.returns(true);
-          expect(this.popup.get('disablePrimary')).to.be.false;
-        });
-
-        it('should be enabled without preupgrade check', function () {
-          this.popup.set('selectedMethod', Em.Object.create({
-            selected: true
-          }));
-          this.mock.returns(false);
-          expect(this.popup.get('disablePrimary')).to.be.false;
-        });
-
-      });
-
-    });
-
-    describe("NOT show confirmation popup on Downgrade", function() {
-      beforeEach(function () {
-        controller.set('isDowngrade', true);
-        controller.upgradeOptions(false, version);
-      });
-
-      it('runningCheckRequests has 1 item', function () {
-        expect( controller.get('runningCheckRequests')).to.have.length(1);
-      });
-
-    });
-  });
-
-  describe("#confirmUpgrade()", function() {
-    before(function () {
-      sinon.stub(controller, 'upgradeOptions', Em.K);
-    });
-    after(function () {
-      controller.upgradeOptions.restore();
-    });
-    it("show show upgrade options popup window", function() {
-      var version = Em.Object.create({displayName: 'HDP-2.2'});
-      controller.confirmUpgrade(version);
-      expect(controller.upgradeOptions.calledWith(false, version)).to.be.true;
-    });
-  });
-
-  describe("#downgrade", function() {
-    beforeEach(function () {
-      sinon.stub(controller, 'abortUpgrade').returns({
-        done: function(callback) {callback()}
-      });
-      sinon.stub(controller, 'startDowngrade');
-      controller.downgrade('versionInfo');
-    });
-
-    afterEach(function () {
-      controller.abortUpgrade.restore();
-      controller.startDowngrade.restore();
-    });
-
-    it('should run abortUpgrade', function() {
-      expect(controller.abortUpgrade.calledOnce).to.be.true;
-    });
-
-  });
-
-  describe("#startDowngrade()", function() {
-    beforeEach(function () {
-      sinon.stub(App.RepositoryVersion, 'find').returns([
-        Em.Object.create({
-          displayName: 'HDP-2.3',
-          repositoryVersion: '2.3'
-        })
-      ]);
-      controller.set('upgradeVersion', 'HDP-2.3');
-      controller.set('upgradeType', 'NON_ROLLING');
-      controller.startDowngrade(Em.Object.create({
-        id: '1',
-        repository_version: '2.2',
-        repository_name: 'HDP-2.2'
-      }));
-      this.callArgs = testHelpers.findAjaxRequest('name', 'admin.downgrade.start')[0];
-    });
-
-    afterEach(function () {
-      App.RepositoryVersion.find.restore();
-    });
-
-    it('request-data is valid', function () {
-      expect(this.callArgs.data).to.eql({
-        id: '1',
-        value: '2.2',
-        label: 'HDP-2.3',
-        isDowngrade: true,
-        upgradeType: "NON_ROLLING"
-      });
-    });
-    it('request-name is valid', function () {
-      expect(this.callArgs.name).to.be.equal('admin.downgrade.start');
-    });
-    it('request-sender is valid', function () {
-      expect(this.callArgs.sender).to.be.eql(controller);
-    });
-    it('callback is valid', function () {
-      expect(this.callArgs.success).to.be.equal('upgradeSuccessCallback');
-    });
-    it('callback is called', function () {
-      expect(this.callArgs.callback).to.be.called;
-    });
-  });
-
-  describe("#installRepoVersionPopup()", function () {
-    before(function () {
-      sinon.stub(controller, 'installRepoVersion', Em.K);
-      sinon.stub(App.Service, 'find').returns(Em.Object.create({
-        isLoaded: true
-      }));
-    });
-    after(function () {
-      controller.installRepoVersion.restore();
-      App.Service.find.restore();
-    });
-    it("show confirmation popup for non standart and available services", function () {
-      var repo = Em.Object.create({'displayName': 'HDP-2.2', isStandard: false, stackServices: [Em.Object.create({
-        name: 'HDFS',
-        isUpgradable: true,
-        isAvailable: true
-      })]});
-      var popup = controller.installRepoVersionPopup(repo);
-      popup.onPrimary();
-      expect(controller.installRepoVersion.calledWith(repo)).to.be.true;
-    });
-    it("show pre-check popup for non standard and empty available services", function () {
-      var repo = Em.Object.create({'displayName': 'HDP-2.2', isStandard: false, stackServices: []});
-      var popup = controller.installRepoVersionPopup(repo);
-      popup.onPrimary();
-      expect(controller.installRepoVersion.calledWith(repo)).to.be.false;
-    });
-    it("show confirmation popup for standart", function () {
-      var repo = Em.Object.create({'displayName': 'HDP-2.2', isStandard: true, stackServices: []});
-      var popup = controller.installRepoVersionPopup(repo);
-      popup.onPrimary();
-      expect(controller.installRepoVersion.calledWith(repo)).to.be.true;
-    });
-  });
-
-  describe("#installRepoVersion()", function () {
-
-    it("make ajax call", function () {
-      var repo = Em.Object.create({
-        stackVersionType: 'HDP',
-        stackVersionNumber: '2.2',
-        repositoryVersion: '2.2.1',
-        repoId: 1
-      });
-      controller.installRepoVersion(repo);
-      var args = testHelpers.findAjaxRequest('name', 'admin.stack_version.install.repo_version');
-      expect(args).to.exists;
-    });
-  });
-
-  describe("#installRepoVersionSuccess()", function() {
-    var mock = Em.Object.create({
-      id: 1,
-      defaultStatus: 'NOT_REQUIRED',
-      stackVersion: {}
-    });
-    beforeEach(function () {
-      sinon.spy(mock, 'set');
-      sinon.stub(App.db, 'set', Em.K);
-      sinon.stub(App.clusterStatus, 'setClusterStatus', Em.K);
-      sinon.stub(App.RepositoryVersion, 'find').returns(mock);
-      sinon.stub(App, 'showAlertPopup');
-    });
-    afterEach(function () {
-      App.db.set.restore();
-      App.clusterStatus.setClusterStatus.restore();
-      App.RepositoryVersion.find.restore();
-      mock.set.restore();
-      App.showAlertPopup.restore();
-    });
-
-    it("App.showAlertPopup should be called", function() {
-      expect(controller.installRepoVersionSuccess({statusText: 'timeout'}, {}, {id: 1})).to.be.false;
-      expect(App.showAlertPopup.calledWith(
-        Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.title'),
-        Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.timeout')
-      )).to.be.true;
-    });
-
-    it("data sdtored to the local db", function() {
-      controller.installRepoVersionSuccess({Requests: {id: 1}}, {}, {id: 1});
-      expect(App.db.set.calledWith('repoVersionInstall', 'id', [1])).to.be.true;
-    });
-
-    it('clusterStatus is updated', function () {
-      controller.installRepoVersionSuccess({Requests: {id: 1}}, {}, {id: 1});
-      expect(App.clusterStatus.setClusterStatus.calledOnce).to.be.true;
-    });
-
-    it('App.RepositoryVersion models have valid states', function () {
-      controller.installRepoVersionSuccess({Requests: {id: 1}}, {}, {id: 1});
-      expect(App.RepositoryVersion.find.calledWith(1)).to.be.true;
-      expect(App.RepositoryVersion.find(1).get('defaultStatus')).to.equal('INSTALLING');
-      expect(App.RepositoryVersion.find(1).get('stackVersion.state')).to.equal('INSTALLING');
-    });
-  });
-
-  describe("#setUpgradeItemStatus()", function () {
-    var item;
-    beforeEach(function () {
-      item = Em.Object.create({
-        request_id: 1,
-        stage_id: 1,
-        group_id: 1
-      });
-      controller.setUpgradeItemStatus(item, 'PENDING');
-      this.callArgs = testHelpers.findAjaxRequest('name', 'admin.upgrade.upgradeItem.setState')[0];
-    });
-
-    it('request-data is valid', function () {
-      expect(this.callArgs.data).to.be.eql({upgradeId: 1, itemId: 1, groupId: 1, status: 'PENDING'});
-    });
-    it('request-name is valid', function () {
-      expect(this.callArgs.name).to.be.equal('admin.upgrade.upgradeItem.setState');
-    });
-    it('request-sendeer is valid', function () {
-      expect(this.callArgs.sender).to.be.eql(controller);
-    });
-    it('callback is called', function () {
-      expect(this.callArgs.callback).to.be.called;
-    });
-    it('item.status is PENDING', function () {
-      expect(item.get('status')).to.equal('PENDING');
-    });
-  });
-
-  describe("#prepareRepoForSaving()", function () {
-    it("prepare date for saving", function () {
-      var repo = Em.Object.create({
-        operatingSystems: [
-          Em.Object.create({
-            osType: "redhat6",
-            isDisabled: Em.computed.not('isSelected'),
-            repositories: [Em.Object.create({
-                "baseUrl": "111121",
-                "repoId": "HDP-2.2",
-                "repoName": "HDP",
-                hasError: false
-            }),
-              Em.Object.create({
-                "baseUrl": "1",
-                "repoId": "HDP-UTILS-1.1.0.20",
-                "repoName": "HDP-UTILS",
-                hasError: false
-              })]
-           })
-        ]
-      });
-      var result = {
-        "operating_systems": [
-          {
-            "OperatingSystems": {
-              "os_type": "redhat6",
-              "ambari_managed_repositories": true
-            },
-            "repositories": [
-              {
-                "Repositories": {
-                  "base_url": "111121",
-                  "repo_id": "HDP-2.2",
-                  "repo_name": "HDP"
-                }
-              },
-              {
-                "Repositories": {
-                  "base_url": "1",
-                  "repo_id": "HDP-UTILS-1.1.0.20",
-                  "repo_name": "HDP-UTILS"
-                }
-              }
-            ]
-          }
-        ]};
-      expect(controller.prepareRepoForSaving(repo)).to.eql(result);
-    });
-  });
-
-  describe("#getStackVersionNumber()", function(){
-    it("get stack version number", function(){
-      var repo = Em.Object.create({
-        "stackVersionType": 'HDP',
-        "stackVersion": '2.3',
-        "repositoryVersion": '2.2.1'
-      });
-
-      var stackVersion = controller.getStackVersionNumber(repo);
-      expect(stackVersion).to.equal('2.3');
-    });
-
-    it("get default stack version number", function(){
-      App.set('currentStackVersion', '1.2.3');
-      var repo = Em.Object.create({
-        "stackVersionType": 'HDP',
-        "repositoryVersion": '2.2.1'
-      });
-
-      var stackVersion = controller.getStackVersionNumber(repo);
-      expect(stackVersion).to.equal('1.2.3');
-    });
-  });
-
-  describe("#saveRepoOS()", function() {
-    before(function(){
-      this.mock = sinon.stub(controller, 'validateRepoVersions');
-      sinon.stub(controller, 'prepareRepoForSaving', Em.K);
-    });
-    after(function(){
-      this.mock.restore();
-      controller.prepareRepoForSaving.restore();
-    });
-    describe("validation errors present", function() {
-
-      beforeEach(function () {
-        this.mock.returns({
-          done: function(callback) {callback([1]);}
-        });
-        controller.saveRepoOS(Em.Object.create({repoVersionId: 1}), true);
-        this.args = testHelpers.findAjaxRequest('name', 'admin.stack_versions.edit.repo');
-      });
-
-      it('validateRepoVersions is called with valid arguments', function () {
-        expect(controller.validateRepoVersions.calledWith(Em.Object.create({repoVersionId: 1}), true)).to.be.true;
-      });
-
-      it('prepareRepoForSaving is not called', function () {
-        expect(controller.prepareRepoForSaving.called).to.be.false;
-      });
-
-      it('no requests are sent', function () {
-        expect(this.args).to.not.exists;
-      });
-    });
-
-    describe("no validation errors", function() {
-
-      beforeEach(function () {
-        this.mock.returns({
-          done: function(callback) {callback([]);}
-        });
-        controller.saveRepoOS(Em.Object.create({repoVersionId: 1}), true);
-      });
-      it('validateRepoVersions is called with valid arguments', function () {
-        expect(controller.validateRepoVersions.calledWith(Em.Object.create({repoVersionId: 1}), true)).to.be.true;
-      });
-      it('prepareRepoForSaving is called with valid arguments', function () {
-        expect(controller.prepareRepoForSaving.calledWith(Em.Object.create({repoVersionId: 1}))).to.be.true;
-      });
-    });
-  });
-
-  describe("#validateRepoVersions()", function () {
-
-    beforeEach(function() {
-      sinon.stub(controller, 'validationCall').returns({
-        success: function() {
-          return {error: Em.K}
-        }
-      });
-      sinon.stub(controller, 'getStackVersionNumber').returns('v1')
-    });
-
-    afterEach(function() {
-      controller.validationCall.restore();
-      controller.getStackVersionNumber.restore();
-    });
-
-
-    it("validationCall should not be called", function () {
-      controller.validateRepoVersions(Em.Object.create({repoVersionId: 1}), true);
-      expect(controller.validationCall.called).to.be.false;
-    });
-    it("validationCall should be called", function () {
-      var os = Em.Object.create({
-        isSelected: true,
-        repositories: [
-          Em.Object.create()
-        ]
-      });
-      var repo = Em.Object.create({
-        repoVersionId: 1,
-        operatingSystems: [ os ]
-      });
-      controller.validateRepoVersions(repo, false);
-      expect(controller.validationCall.calledOnce).to.be.true;
-    });
-  });
-
-  describe("#validationCall()", function () {
-
-    it("App.ajax.send should be called", function() {
-      controller.validationCall(Em.Object.create(), Em.Object.create(), 'v1');
-      var args = testHelpers.findAjaxRequest('name', 'admin.stack_versions.validate.repo');
-      expect(args[0]).to.exists;
-    });
-  });
-
-  describe("#getUrl()", function() {
-    beforeEach(function(){
-      controller.reopen({
-        realStackUrl: 'realStackUrl',
-        realRepoUrl: 'realRepoUrl',
-        realUpdateUrl: 'realUpdateUrl'
-      });
-    });
-
-    it("full load is true, stack is null", function() {
-      expect(controller.getUrl(null, true)).to.equal('realRepoUrl');
-    });
-    it("full load is true, stack is valid", function() {
-      expect(controller.getUrl({}, true)).to.equal('realStackUrl');
-    });
-    it("full load is false, stack is valid", function() {
-      expect(controller.getUrl({}, false)).to.equal('realUpdateUrl');
-    });
-  });
-
-  describe("#loadStackVersionsToModel()", function () {
-    before(function () {
-      sinon.stub(App.HttpClient, 'get');
-    });
-    after(function () {
-      App.HttpClient.get.restore();
-    });
-    it("HttpClient did get-request", function () {
-      controller.loadStackVersionsToModel();
-      expect(App.HttpClient.get.calledOnce).to.be.true;
-    });
-  });
-
-  describe("#loadRepoVersionsToModel()", function () {
-    before(function () {
-      sinon.stub(App.HttpClient, 'get');
-    });
-    after(function () {
-      App.HttpClient.get.restore();
-    });
-    it("HttpClient did get-request", function () {
-      controller.loadRepoVersionsToModel();
-      expect(App.HttpClient.get.calledOnce).to.be.true;
-    });
-  });
-
-  describe('#currentVersionObserver()', function () {
-
-    var cases = [
-      {
-        stackVersionType: 'HDP',
-        repoVersion: '2.2.1.1.0-1',
-        isStormMetricsSupported: false,
-        title: 'HDP < 2.2.2'
-      },
-      {
-        stackVersionType: 'HDP',
-        repoVersion: '2.2.2.1.0-1',
-        isStormMetricsSupported: true,
-        title: 'HDP 2.2.2'
-      },
-      {
-        stackVersionType: 'HDP',
-        repoVersion: '2.2.3.1.0-1',
-        isStormMetricsSupported: true,
-        title: 'HDP > 2.2.2'
-      },
-      {
-        stackVersionType: 'BIGTOP',
-        repoVersion: '0.8.1.1.0-1',
-        isStormMetricsSupported: true,
-        title: 'not HDP'
-      }
-    ];
-
-    afterEach(function () {
-      App.RepositoryVersion.find.restore();
-    });
-
-    cases.forEach(function (item) {
-      describe(item.title, function () {
-
-        beforeEach(function () {
-          sinon.stub(App.RepositoryVersion, 'find').returns([
-            Em.Object.create({
-              status: 'CURRENT',
-              stackVersionType: item.stackVersionType
-            })
-          ]);
-          controller.set('currentVersion', {
-            repository_version: item.repoVersion
-          });
-        });
-
-        it('isStormMetricsSupported is ' + (item.isStormMetricsSupported ? '' : 'not') + ' supported', function () {
-          expect(App.get('isStormMetricsSupported')).to.equal(item.isStormMetricsSupported);
-        });
-
-      });
-    });
-
-  });
-
-  describe('#updateFinalize', function () {
-
-    beforeEach(function() {
-      controller.set('isFinalizeItem', true);
-      this.stub = sinon.stub(App, 'get');
-    });
-
-    afterEach(function () {
-      this.stub.restore();
-    });
-
-    describe('should do ajax-request', function () {
-
-      beforeEach(function () {
-        this.stub.withArgs('upgradeState').returns('HOLDING');
-        controller.updateFinalize();
-        this.args = testHelpers.findAjaxRequest('name', 'admin.upgrade.finalizeContext');
-      });
-
-      it('request is sent', function () {
-        expect(this.args[0]).to.exists;
-      });
-
-    });
-
-    describe('shouldn\'t do ajax-request', function () {
-
-      beforeEach(function () {
-        this.stub.withArgs('upgradeState').returns('HOLDING_TIMEDOUT');
-        controller.updateFinalize();
-        this.args = testHelpers.findAjaxRequest('name', 'admin.upgrade.finalizeContext');
-      });
-
-      it('request is not sent', function () {
-        expect(this.args).to.not.exists;
-      });
-
-      it('isFinalizeItem is false', function () {
-        expect(controller.get('isFinalizeItem')).to.be.false;
-      });
-
-    });
-
-  });
-
-  describe('#updateFinalizeSuccessCallback', function () {
-
-    it('data exists and Finalize should be true', function() {
-      var data = {
-        items: [
-          {
-            upgrade_groups: [
-              {
-                upgrade_items: [
-                  {
-                    UpgradeItem: {
-                      context: controller.get('finalizeContext'),
-                      status: "HOLDING"
-                    }
-                  }
-                ]
-              }
-            ]
-          }
-        ]
-      };
-      controller.set('isFinalizeItem', false);
-      controller.updateFinalizeSuccessCallback(data);
-      expect(controller.get('isFinalizeItem')).to.be.true;
-    });
-
-    it('data exists and Finalize should be false', function() {
-      var data = {
-        upgrade_groups: [
-          {
-            upgrade_items: [
-              {
-                UpgradeItem: {
-                  context: '!@#$%^&',
-                  status: "HOLDING"
-                }
-              }
-            ]
-          }
-        ]
-      };
-      controller.set('isFinalizeItem', true);
-      controller.updateFinalizeSuccessCallback(data);
-      expect(controller.get('isFinalizeItem')).to.be.false;
-    });
-
-    it('data doesn\'t exist', function() {
-      var data = null;
-      controller.set('isFinalizeItem', true);
-      controller.updateFinalizeSuccessCallback(data);
-      expect(controller.get('isFinalizeItem')).to.be.false;
-    });
-
-  });
-
-  describe('#updateFinalizeErrorCallback', function () {
-
-    it('should set isFinalizeItem to false', function () {
-      controller.set('isFinalizeItem', true);
-      controller.updateFinalizeErrorCallback();
-      expect(controller.get('isFinalizeItem')).to.be.false;
-    });
-
-  });
-
-  describe("#suspendUpgrade()", function() {
-    beforeEach(function () {
-      sinon.stub(controller, 'abortUpgradeWithSuspend').returns({
-        done: Em.clb
-      });
-      sinon.stub(controller, 'setDBProperty', Em.K);
-      sinon.stub(App.clusterStatus, 'setClusterStatus', Em.K);
-      controller.suspendUpgrade();
-    });
-    afterEach(function () {
-      controller.abortUpgradeWithSuspend.restore();
-      controller.setDBProperty.restore();
-      App.clusterStatus.setClusterStatus.restore();
-    });
-    it("upgrade aborted", function() {
-      expect(controller.abortUpgradeWithSuspend.calledOnce).to.be.true;
-    });
-    it('App.upgradeState is ABORTED', function () {
-      expect(App.get('upgradeState')).to.equal('ABORTED');
-    });
-    it('new upgradeState is saved to the localDB', function () {
-      expect(controller.setDBProperty.calledWith('upgradeState', 'ABORTED')).to.be.true;
-    });
-    it('clusterStatus is updated', function () {
-      expect(App.clusterStatus.setClusterStatus.calledOnce).to.be.true;
-    });
-  });
-
-  describe("#resumeUpgrade()", function() {
-    beforeEach(function () {
-      sinon.stub(controller, 'retryUpgrade').returns({
-        done: Em.clb
-      });
-      sinon.stub(controller, 'setDBProperty', Em.K);
-      sinon.stub(App.clusterStatus, 'setClusterStatus', Em.K);
-      controller.resumeUpgrade();
-    });
-    afterEach(function () {
-      controller.retryUpgrade.restore();
-      controller.setDBProperty.restore();
-      App.clusterStatus.setClusterStatus.restore();
-    });
-    it("Upgrade is retrying", function() {
-      expect(controller.retryUpgrade.calledOnce).to.be.true;
-    });
-    it('App.upgradeState is PENDING', function () {
-      expect(App.get('upgradeState')).to.equal('PENDING');
-    });
-    it('new upgradeState is saved to the localDB', function () {
-      expect(controller.setDBProperty.calledWith('upgradeState', 'PENDING')).to.be.true;
-    });
-    it('clusterStatus is updated', function () {
-      expect(App.clusterStatus.setClusterStatus.calledOnce).to.be.true;
-    });
-  });
-
-  describe("#runUpgradeMethodChecks()", function() {
-    beforeEach(function () {
-      sinon.stub(controller, 'runPreUpgradeCheckOnly');
-    });
-    afterEach(function () {
-      controller.runPreUpgradeCheckOnly.restore();
-      controller.get('upgradeMethods').setEach('allowed', true);
-    });
-    it("no allowed upgrade methods", function () {
-      controller.get('upgradeMethods').setEach('allowed', false);
-      controller.runUpgradeMethodChecks();
-      expect(controller.runPreUpgradeCheckOnly.called).to.be.false;
-    });
-    it("Rolling method allowed", function () {
-      controller.get('upgradeMethods').setEach('allowed', true);
-      controller.runUpgradeMethodChecks(Em.Object.create({
-        id: 1,
-        repositoryVersion: '1.2',
-        displayName: 'V1'
-      }));
-      expect(controller.runPreUpgradeCheckOnly.calledWith({
-        id: 1,
-        label: 'V1',
-        type: 'ROLLING'
-      })).to.be.true;
-    });
-  });
-
-  describe("#restoreLastUpgrade()", function () {
-
-    var data = {
-      Upgrade: {
-        associated_version: '1.1',
-        request_id: 1,
-        direction: 'UPGRADE',
-        request_status: 'PENDING',
-        upgrade_type: 'ROLLING',
-        downgrade_allowed: true,
-        skip_failures: true,
-        suspended: false,
-        skip_service_check_failures: true,
-        to_version: '1'
-      }
-    };
-
-    beforeEach(function () {
-      sinon.stub(App.RepositoryVersion, 'find').returns([Em.Object.create({
-        repositoryVersion: '1',
-        displayName: 'HDP-1'
-      })]);
-      sinon.stub(controller, 'setDBProperties');
-      sinon.stub(controller, 'loadRepoVersionsToModel', function () {
-        return {
-          done: function (callback) {
-            callback();
-          }
-        }
-      });
-      sinon.stub(controller, 'setDBProperty');
-      sinon.stub(controller, 'initDBProperties');
-      sinon.stub(controller, 'loadUpgradeData');
-      controller.restoreLastUpgrade(data);
-    });
-    afterEach(function () {
-      App.RepositoryVersion.find.restore();
-      controller.setDBProperties.restore();
-      controller.loadRepoVersionsToModel.restore();
-      controller.setDBProperty.restore();
-      controller.initDBProperties.restore();
-      controller.loadUpgradeData.restore();
-    });
-    it('proper data is saved to the localDB', function () {
-      expect(controller.setDBProperties.getCall(0).args[0]).to.eql({
-        toVersion: '1.1',
-        upgradeId: 1,
-        isDowngrade: false,
-        upgradeState: 'PENDING',
-        upgradeType: "ROLLING",
-        isWizardRestricted: false,
-        downgradeAllowed: true,
-        isSuspended: false,
-        upgradeTypeDisplayName: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.RU.title'),
-        failuresTolerance: {
-          skipComponentFailures: true,
-          skipSCFailures: true
-        }
-      });
-    });
-    it('models are saved', function () {
-      expect(controller.loadRepoVersionsToModel.calledOnce).to.be.true;
-    });
-    it('initDBProperties is called', function () {
-      expect(controller.initDBProperties.calledOnce).to.be.true;
-    });
-  });
-
-  describe("#getServiceCheckItemSuccessCallback()", function() {
-    var testCases = [
-      {
-        title: 'no tasks',
-        data: {
-          tasks: []
-        },
-        expected: {
-          slaveComponentStructuredInfo: null,
-          serviceCheckFailuresServicenames: []
-        }
-      },
-      {
-        title: 'no structured_out property',
-        data: {
-          tasks: [
-            {
-              Tasks: {}
-            }
-          ]
-        },
-        expected: {
-          slaveComponentStructuredInfo: null,
-          serviceCheckFailuresServicenames: []
-        }
-      },
-      {
-        title: 'no failures',
-        data: {
-          tasks: [
-            {
-              Tasks: {
-                structured_out: {}
-              }
-            }
-          ]
-        },
-        expected: {
-          slaveComponentStructuredInfo: null,
-          serviceCheckFailuresServicenames: []
-        }
-      },
-      {
-        title: 'service check failures',
-        data: {
-          tasks: [
-            {
-              Tasks: {
-                structured_out: {
-                  failures: {
-                    service_check: ['HDSF', 'YARN']
-                  }
-                }
-              }
-            }
-          ]
-        },
-        expected: {
-          slaveComponentStructuredInfo: {
-            hosts: [],
-            host_detail: {}
-          },
-          serviceCheckFailuresServicenames: ['HDSF', 'YARN']
-        }
-      },
-      {
-        title: 'host-component failures',
-        data: {
-          tasks: [
-            {
-              Tasks: {
-                structured_out: {
-                  failures: {
-                    service_check: ['HDSF'],
-                    host_component: {
-                      "host1": [
-                        {
-                          component: "DATANODE",
-                          service: 'HDFS'
-                        }
-                      ]
-                    }
-                  }
-                }
-              }
-            }
-          ]
-        },
-        expected: {
-          slaveComponentStructuredInfo: {
-            hosts: ['host1'],
-            host_detail: {
-              "host1": [
-                {
-                  component: "DATANODE",
-                  service: 'HDFS'
-                }
-              ]
-            }
-          },
-          serviceCheckFailuresServicenames: ['HDSF']
-        }
-      }
-    ];
-
-    testCases.forEach(function(test) {
-      it(test.title, function() {
-        controller.set('slaveComponentStructuredInfo', null);
-        controller.set('serviceCheckFailuresServicenames', []);
-        controller.getServiceCheckItemSuccessCallback(test.data);
-        expect(controller.get('serviceCheckFailuresServicenames')).eql(test.expected.serviceCheckFailuresServicenames);
-        expect(controller.get('slaveComponentStructuredInfo')).eql(test.expected.slaveComponentStructuredInfo);
-      });
-    });
-  });
-
-  describe("#getSlaveComponentItemSuccessCallback()", function () {
-    var testCases = [
-      {
-        title: 'no tasks',
-        data: {
-          tasks: []
-        },
-        expected: {
-          slaveComponentStructuredInfo: null
-        }
-      },
-      {
-        title: 'structured_out property absent',
-        data: {
-          tasks: [
-            {
-              Tasks: {}
-            }
-          ]
-        },
-        expected: {
-          slaveComponentStructuredInfo: null
-        }
-      },
-      {
-        title: 'structured_out property present',
-        data: {
-          tasks: [
-            {
-              Tasks: {
-                "structured_out" : {
-                  "hosts" : [
-                    "host1"
-                  ],
-                  "host_detail" : {
-                    "host1" : [
-                      {
-                        "service" : "FLUME",
-                        "component" : "FLUME_HANDLER"
-                      }
-                    ]
-                  }
-                }
-              }
-            }
-          ]
-        },
-        expected: {
-          slaveComponentStructuredInfo: {
-            "hosts" : [
-              "host1"
-            ],
-            "host_detail" : {
-              "host1" : [
-                {
-                  "service" : "FLUME",
-                  "component" : "FLUME_HANDLER"
-                }
-              ]
-            }
-          }
-        }
-      }
-    ];
-
-    testCases.forEach(function (test) {
-      it(test.title, function () {
-        controller.set('slaveComponentStructuredInfo', null);
-        controller.getSlaveComponentItemSuccessCallback(test.data);
-        expect(controller.get('slaveComponentStructuredInfo')).eql(test.expected.slaveComponentStructuredInfo);
-      });
-    });
-  });
-
-  describe('#getConfigsWarnings', function () {
-
-    var cases = [
-      {
-        configs: [],
-        title: 'no warning'
-      },
-      {
-        configsMergeWarning: {},
-        configs: [],
-        title: 'empty data'
-      },
-      {
-        configsMergeWarning: {
-          UpgradeChecks: {}
-        },
-        configs: [],
-        title: 'incomplete data'
-      },
-      {
-        configsMergeWarning: {
-          UpgradeChecks: {
-            failed_detail: {}
-          }
-        },
-        configs: [],
-        title: 'invalid data'
-      },
-      {
-        configsMergeWarning: {
-          UpgradeChecks: {
-            failed_detail: []
-          }
-        },
-        configs: [],
-        title: 'empty configs array'
-      },
-      {
-        configsMergeWarning: {
-          UpgradeChecks: {
-            status: 'FAIL',
-            failed_detail: [
-              {
-                type: 't0',
-                property: 'p0',
-                current: 'c0',
-                new_stack_value: 'n0',
-                result_value: 'r0'
-              },
-              {
-                type: 't1',
-                property: 'p1',
-                current: 'c1',
-                new_stack_value: 'n1'
-              },
-              {
-                type: 't2',
-                property: 'p2',
-                current: 'c2',
-                result_value: 'r2'
-              }
-            ]
-          }
-        },
-        configs: [],
-        title: 'not a warning'
-      },
-      {
-        configsMergeWarning: {
-          UpgradeChecks: {
-            status: 'WARNING',
-            failed_detail: [
-              {
-                type: 't0',
-                property: 'p0',
-                current: 'c0',
-                new_stack_value: 'n0',
-                result_value: 'r0'
-              },
-              {
-                type: 't1',
-                property: 'p1',
-                current: 'c1',
-                new_stack_value: 'n1'
-              },
-              {
-                type: 't2',
-                property: 'p2',
-                current: 'c2',
-                result_value: 'r2'
-              }
-            ]
-          }
-        },
-        configs: [
-          {
-            type: 't0',
-            name: 'p0',
-            currentValue: 'c0',
-            recommendedValue: 'n0',
-            isDeprecated: false,
-            resultingValue: 'r0',
-            wasModified: false,
-            willBeRemoved: false
-          },
-          {
-            type: 't1',
-            name: 'p1',
-            currentValue: 'c1',
-            recommendedValue: 'n1',
-            isDeprecated: false,
-            resultingValue: Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.willBeRemoved'),
-            wasModified: false,
-            willBeRemoved: true
-          },
-          {
-            type: 't2',
-            name: 'p2',
-            currentValue: 'c2',
-            recommendedValue: Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.deprecated'),
-            isDeprecated: true,
-            resultingValue: 'r2',
-            wasModified: false,
-            willBeRemoved: false
-          }
-        ],
-        title: 'normal case'
-      },
-      {
-        configsMergeWarning: {
-          UpgradeChecks: {
-            status: 'WARNING',
-            failed_detail: [
-              {
-                type: 't0',
-                property: 'p0',
-                current: 'c0',
-                new_stack_value: 'n0',
-                result_value: 'r0'
-              },
-              {
-                type: 't1',
-                property: 'p1',
-                current: 'c1',
-                new_stack_value: 'n1'
-              },
-              {
-                type: 't2',
-                property: 'p2',
-                current: 'c2',
-                result_value: 'r2'
-              },
-              {
-                type: 't3',
-                property: 'p3',
-                current: 'c3',
-                new_stack_value: 'c2',
-                result_value: 'c3'
-              }
-            ]
-          }
-        },
-        configs: [
-          {
-            type: 't0',
-            name: 'p0',
-            currentValue: 'c0',
-            recommendedValue: 'n0',
-            isDeprecated: false,
-            resultingValue: 'r0',
-            wasModified: false,
-            willBeRemoved: false
-          },
-          {
-            type: 't1',
-            name: 'p1',
-            currentValue: 'c1',
-            recommendedValue: 'n1',
-            isDeprecated: false,
-            resultingValue: Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.willBeRemoved'),
-            wasModified: false,
-            willBeRemoved: true
-          },
-          {
-            type: 't2',
-            name: 'p2',
-            currentValue: 'c2',
-            recommendedValue: Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.deprecated'),
-            isDeprecated: true,
-            resultingValue: 'r2',
-            wasModified: false,
-            willBeRemoved: false
-          },
-          {
-            "currentValue": "c3",
-            "isDeprecated": false,
-            "name": "p3",
-            "recommendedValue": "c2",
-            "resultingValue": "c3",
-            "type": "t3",
-            "wasModified": true,
-            "willBeRemoved": false
-          }
-        ],
-        title: 'should skip warning when current and result_value are the same'
-      }
-    ];
-
-    cases.forEach(function (item) {
-      it(item.title, function () {
-        expect(controller.getConfigsWarnings(item.configsMergeWarning)).to.eql(item.configs);
-      });
-    });
-
-  });
-
-  describe('#runPreUpgradeCheckOnly', function () {
-
-    var appGetMock,
-      upgradeMethods = controller.get('upgradeMethods'),
-      cases = [
-      {
-        supportsPreUpgradeCheck: false,
-        ru: {
-          isCheckComplete: true,
-          isCheckRequestInProgress: false,
-          action: 'a'
-        },
-        eu: {
-          isCheckComplete: true,
-          isCheckRequestInProgress: false,
-          action: 'a'
-        },
-        ajaxCallCount: 0,
-        runningCheckRequestsLength: 0,
-        title: 'pre-upgrade checks not supported'
-      },
-      {
-        supportsPreUpgradeCheck: true,
-        ru: {
-          isCheckComplete: false,
-          isCheckRequestInProgress: true,
-          action: ''
-        },
-        eu: {
-          isCheckComplete: true,
-          isCheckRequestInProgress: false,
-          action: 'a'
-        },
-        ajaxCallCount: 1,
-        type: 'ROLLING',
-        runningCheckRequestsLength: 1,
-        title: 'rolling upgrade'
-      },
-      {
-        supportsPreUpgradeCheck: true,
-        ru: {
-          isCheckComplete: true,
-          isCheckRequestInProgress: false,
-          action: 'a'
-        },
-        eu: {
-          isCheckComplete: false,
-          isCheckRequestInProgress: true,
-          action: ''
-        },
-        ajaxCallCount: 1,
-        type: 'NON_ROLLING',
-        runningCheckRequestsLength: 1,
-        title: 'express upgrade'
-      }
-    ];
-
-    beforeEach(function () {
-      appGetMock = sinon.stub(App, 'get');
-      controller.get('runningCheckRequests').clear();
-      upgradeMethods.forEach(function (method) {
-        method.setProperties({
-          isCheckComplete: true,
-          isCheckRequestInProgress: false,
-          action: 'a'
-        });
-      });
-      App.ajax.send.restore();
-      sinon.stub(App.ajax, 'send').returns({});
-    });
-
-    afterEach(function () {
-      appGetMock.restore();
-    });
-
-    cases.forEach(function (item) {
-      describe(item.title, function () {
-        var runningCheckRequests;
-        beforeEach(function () {
-          runningCheckRequests = controller.get('runningCheckRequests');
-          appGetMock.returns(item.supportsPreUpgradeCheck);
-          controller.runPreUpgradeCheckOnly({
-            type: item.type
-          });
-          this.ajaxCalls = testHelpers.filterAjaxRequests('name', 'admin.upgrade.pre_upgrade_check');
-        });
-
-        it('ROLLING properties', function () {
-          expect(upgradeMethods.findProperty('type', 'ROLLING').getProperties('isCheckComplete', 'isCheckRequestInProgress', 'action')).to.eql(item.ru);
-        });
-
-        it('NON_ROLLING properties', function () {
-          expect(upgradeMethods.findProperty('type', 'NON_ROLLING').getProperties('isCheckComplete', 'isCheckRequestInProgress', 'action')).to.eql(item.eu);
-        });
-
-        it(item.ajaxCallCount + ' requests sent', function () {
-          expect(this.ajaxCalls.length).to.be.equal(item.ajaxCallCount);
-        });
-
-        it('runningCheckRequests length is ' + item.runningCheckRequestsLength, function () {
-          expect(runningCheckRequests).to.have.length(item.runningCheckRequestsLength);
-        });
-
-        if (item.runningCheckRequestsLength) {
-          it('runningCheckRequests.type is ' + item.type, function () {
-            expect(runningCheckRequests[0].type).to.equal(item.type);
-          });
-        }
-
-      });
-    });
-
-  });
-
-
-  describe("#openConfigsInNewWindow()", function () {
-
-    var mock = {
-      document: {
-        write: function () {}
-      },
-      focus: function () {}
-    };
-
-    beforeEach(function(){
-      sinon.stub(window, 'open', function () {
-        return mock;
-      });
-      sinon.spy(mock.document, 'write');
-      sinon.spy(mock, 'focus');
-      controller.openConfigsInNewWindow({
-        context: [
-          {
-            type: 'type1',
-            name: 'name1',
-            currentValue: 'currentValue1',
-            recommendedValue: 'recommendedValue1',
-            resultingValue: 'resultingValue1'
-          },
-          {
-            type: 'type2',
-            name: 'name2',
-            currentValue: 'currentValue2',
-            recommendedValue: 'recommendedValue2',
-            resultingValue: 'resultingValue2'
-          }
-        ]
-      });
-    });
-
-    afterEach(function(){
-      window.open.restore();
-      mock.document.write.restore();
-      mock.focus.restore();
-    });
-
-    it('new window is open', function () {
-      expect(window.open.calledOnce).to.be.true;
-    });
-
-    it('new window content is valid', function () {
-      /*eslint-disable no-useless-concat */
-      expect(mock.document.write.calledWith('<table style="text-align: left;"><thead><tr>' +
-        '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.configType') + '</th>' +
-        '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.propertyName') + '</th>' +
-        '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.currentValue') + '</th>' +
-        '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.recommendedValue') + '</th>' +
-        '<th>' + Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.resultingValue') + '</th>' +
-        '</tr></thead><tbody>' +
-        '<tr>' +
-        '<td>' + 'type1' + '</td>' +
-        '<td>' + 'name1' + '</td>' +
-        '<td>' + 'currentValue1' + '</td>' +
-        '<td>' + 'recommendedValue1' + '</td>' +
-        '<td>' + 'resultingValue1' + '</td>' +
-        '</tr>' +
-        '<tr>' +
-        '<td>' + 'type2' + '</td>' +
-        '<td>' + 'name2' + '</td>' +
-        '<td>' + 'currentValue2' + '</td>' +
-        '<td>' + 'recommendedValue2' + '</td>' +
-        '<td>' + 'resultingValue2' + '</td>' +
-        '</tr></tbody></table>')).to.be.true;
-      /*eslint-enable no-useless-concat */
-    });
-
-    it('document.focus is called once', function () {
-      expect(mock.focus.calledOnce).to.be.true;
-    });
-  });
-
-  describe("#formatMessages()", function () {
-
-    it("item with malformed text", function() {
-      var item = Em.Object.create({
-        text: null
-      });
-      controller.formatMessages(item);
-      expect(item.get('messages')).to.be.empty;
-      expect(item.get('text')).to.be.null;
-    });
-
-    it("item with correct text", function() {
-      var item = Em.Object.create({
-        text: '[{"message":"msg1"},{"message":"msg2"}]'
-      });
-      controller.formatMessages(item);
-      expect(item.get('messages')).to.be.eql(['msg1', 'msg2']);
-      expect(item.get('text')).to.be.equal('msg1 msg2');
-    });
-  });
-
-  describe("#getUpgradeItemSuccessCallback()", function () {
-
-    beforeEach(function() {
-      controller.set('upgradeData', Em.Object.create({
-        upgradeGroups: [
-          Em.Object.create({
-            group_id: 'g1',
-            upgradeItems: [Em.Object.create({
-              stage_id: 'i1',
-              tasks: [],
-              isTasksLoaded: false
-            })]
-          })
-        ]
-      }));
-    });
-
-    it("group has different id", function() {
-      var data = {UpgradeItem: {group_id: 'g2'}};
-      controller.getUpgradeItemSuccessCallback(data);
-      expect(controller.get('upgradeData.upgradeGroups')[0].get('upgradeItems')[0].get('isTasksLoaded')).to.be.false;
-    });
-
-    it("item has different id", function() {
-      var data = {UpgradeItem: {group_id: 'g1', stage_id: 'i2'}};
-      controller.getUpgradeItemSuccessCallback(data);
-      expect(controller.get('upgradeData.upgradeGroups')[0].get('upgradeItems')[0].get('isTasksLoaded')).to.be.false;
-    });
-
-    it("item has no tasks", function() {
-      var data = {
-        UpgradeItem: {
-          group_id: 'g1',
-          stage_id: 'i1'
-        },
-        tasks: [
-          {
-            Tasks: {id: 't1'}
-          }
-        ]
-      };
-      controller.getUpgradeItemSuccessCallback(data);
-      expect(controller.get('upgradeData.upgradeGroups')[0].get('upgradeItems')[0].get('isTasksLoaded')).to.be.true;
-      expect(controller.get('upgradeData.upgradeGroups')[0].get('upgradeItems')[0].get('tasks')).to.not.be.empty;
-    });
-
-    it("item has tasks", function() {
-      controller.get('upgradeData.upgradeGroups')[0].get('upgradeItems')[0].set('tasks', [
-        Em.Object.create({
-          id: 't1',
-          status: 'OLD'
-        })
-      ]);
-      var data = {
-        UpgradeItem: {
-          group_id: 'g1',
-          stage_id: 'i1'
-        },
-        tasks: [
-          {
-            Tasks: {
-              id: 't1',
-              status: 'NEW'
-            }
-          }
-        ]
-      };
-      controller.getUpgradeItemSuccessCallback(data);
-      expect(controller.get('upgradeData.upgradeGroups')[0].get('upgradeItems')[0].get('isTasksLoaded')).to.be.true;
-      expect(controller.get('upgradeData.upgradeGroups')[0].get('upgradeItems')[0].get('tasks')[0].get('status')).to.be.equal('NEW');
-    });
-  });
-
-  describe("#abortUpgrade()", function () {
-
-    it("isDowngrade is true", function() {
-      controller.set('isDowngrade', true);
-      controller.set('upgradeId', 1);
-      controller.abortUpgrade();
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.abort');
-      expect(args[0]).to.be.eql({
-        name: 'admin.upgrade.abort',
-        sender: controller,
-        data: {
-          upgradeId: 1,
-          isDowngrade: true
-        },
-        error: 'abortDowngradeErrorCallback'
-      });
-    });
-
-    it("isDowngrade is false", function() {
-      controller.set('isDowngrade', false);
-      controller.set('upgradeId', 1);
-      controller.abortUpgrade();
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.abort');
-      expect(args[0]).to.be.eql({
-        name: 'admin.upgrade.abort',
-        sender: controller,
-        data: {
-          upgradeId: 1,
-          isDowngrade: false
-        },
-        error: 'abortUpgradeErrorCallback'
-      });
-    });
-  });
-
-  describe("#abortUpgradeWithSuspend()", function () {
-
-    it("isDowngrade is true", function() {
-      controller.set('isDowngrade', true);
-      controller.set('upgradeId', 1);
-      controller.abortUpgradeWithSuspend();
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.suspend');
-      expect(args[0]).to.be.eql({
-        name: 'admin.upgrade.suspend',
-        sender: controller,
-        data: {
-          upgradeId: 1,
-          isDowngrade: true
-        },
-        error: 'abortDowngradeErrorCallback'
-      });
-    });
-
-    it("isDowngrade is false", function() {
-      controller.set('isDowngrade', false);
-      controller.set('upgradeId', 1);
-      controller.abortUpgradeWithSuspend();
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.suspend');
-      expect(args[0]).to.be.eql({
-        name: 'admin.upgrade.suspend',
-        sender: controller,
-        data: {
-          upgradeId: 1,
-          isDowngrade: false
-        },
-        error: 'abortUpgradeErrorCallback'
-      });
-    });
-  });
-
-  describe("#abortUpgradeErrorCallback()", function () {
-    var header = Em.I18n.t('admin.stackUpgrade.state.paused.fail.header');
-    var body = Em.I18n.t('admin.stackUpgrade.state.paused.fail.body');
-
-    beforeEach(function() {
-      sinon.stub(App, 'showAlertPopup');
-    });
-
-    afterEach(function() {
-      App.showAlertPopup.restore();
-    });
-
-    it("data is null", function() {
-      controller.abortUpgradeErrorCallback(null);
-      expect(App.showAlertPopup.calledWith(header, body)).to.be.true;
-    });
-
-    it("data.responseText is null", function() {
-      controller.abortUpgradeErrorCallback({responseText: null});
-      expect(App.showAlertPopup.calledWith(header, body)).to.be.true;
-    });
-
-    it("data.responseText is incorrect", function() {
-      controller.abortUpgradeErrorCallback({responseText: "//"});
-      expect(App.showAlertPopup.calledWith(header, body)).to.be.true;
-    });
-
-    it("data.responseText is correct", function() {
-      controller.abortUpgradeErrorCallback({responseText: '{"message": "msg"}'});
-      expect(App.showAlertPopup.calledWith(header, body + ' msg')).to.be.true;
-    });
-  });
-
-  describe("#abortDowngradeErrorCallback()", function () {
-    var header = Em.I18n.t('admin.stackDowngrade.state.paused.fail.header');
-    var body = Em.I18n.t('admin.stackDowngrade.state.paused.fail.body');
-
-    beforeEach(function() {
-      sinon.stub(App, 'showAlertPopup');
-    });
-
-    afterEach(function() {
-      App.showAlertPopup.restore();
-    });
-
-    it("data is null", function() {
-      controller.abortDowngradeErrorCallback(null);
-      expect(App.showAlertPopup.calledWith(header, body)).to.be.true;
-    });
-
-    it("data.responseText is null", function() {
-      controller.abortDowngradeErrorCallback({responseText: null});
-      expect(App.showAlertPopup.calledWith(header, body)).to.be.true;
-    });
-
-    it("data.responseText is incorrect", function() {
-      controller.abortDowngradeErrorCallback({responseText: "//"});
-      expect(App.showAlertPopup.calledWith(header, body)).to.be.true;
-    });
-
-    it("data.responseText is correct", function() {
-      controller.abortDowngradeErrorCallback({responseText: '{"message": "msg"}'});
-      expect(App.showAlertPopup.calledWith(header, body + ' msg')).to.be.true;
-    });
-  });
-
-  describe("#retryUpgrade()", function () {
-
-    it("requestInProgress should be true", function() {
-      controller.retryUpgrade();
-      expect(controller.get('requestInProgress')).to.be.true;
-    });
-
-    it("isRetryPending should be true", function() {
-      controller.retryUpgrade();
-      expect(controller.get('isRetryPending')).to.be.true;
-    });
-
-    it("App.ajax.send should be called", function() {
-      controller.set('upgradeId', 1);
-      controller.retryUpgrade();
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.retry');
-      expect(args[0]).to.be.eql({
-        name: 'admin.upgrade.retry',
-        sender: controller,
-        data: {
-          upgradeId: 1
-        }
-      });
-    });
-  });
-
-  describe("#upgradeErrorCallback()", function () {
-    var header = Em.I18n.t('admin.stackVersions.upgrade.start.fail.title');
-    var body = "";
-
-    beforeEach(function() {
-      sinon.stub(App, 'showAlertPopup');
-    });
-
-    afterEach(function() {
-      App.showAlertPopup.restore();
-    });
-
-    it("data is null", function() {
-      controller.upgradeErrorCallback(null);
-      expect(App.showAlertPopup.calledWith(header, body)).to.be.true;
-    });
-
-    it("data.responseText is null", function() {
-      controller.upgradeErrorCallback({responseText: null});
-      expect(App.showAlertPopup.calledWith(header, body)).to.be.true;
-    });
-
-    it("data.responseText is incorrect", function() {
-      controller.upgradeErrorCallback({responseText: "//"});
-      expect(App.showAlertPopup.calledWith(header, body)).to.be.true;
-    });
-
-    it("data.responseText is correct", function() {
-      controller.upgradeErrorCallback({responseText: '{"message": "msg"}'});
-      expect(App.showAlertPopup.calledWith(header, 'msg')).to.be.true;
-    });
-  });
-
-  describe("#updateOptionsSuccessCallback()", function () {
-
-    it("skipComponentFailures: true, skipSCFailures: true", function() {
-      var params = {
-        skipComponentFailures: 'true',
-        skipSCFailures: 'true'
-      };
-      controller.updateOptionsSuccessCallback({}, {}, params);
-      expect(controller.get('failuresTolerance')).to.be.eql(Em.Object.create({
-        skipComponentFailures: true,
-        skipSCFailures: true
-      }));
-    });
-
-    it("skipComponentFailures: false, skipSCFailures: false", function() {
-      var params = {
-        skipComponentFailures: 'false',
-        skipSCFailures: 'false'
-      };
-      controller.updateOptionsSuccessCallback({}, {}, params);
-      expect(controller.get('failuresTolerance')).to.be.eql(Em.Object.create({
-        skipComponentFailures: false,
-        skipSCFailures: false
-      }));
-    });
-  });
-
-  describe("#openUpgradeOptions()", function () {
-
-    beforeEach(function() {
-      sinon.stub(controller, 'upgradeOptions');
-    });
-
-    afterEach(function() {
-      controller.upgradeOptions.restore();
-    });
-
-    it("upgradeOptions should not be called", function() {
-      controller.set('isDowngrade', true);
-      controller.openUpgradeOptions();
-      expect(controller.upgradeOptions.called).to.be.false;
-    });
-
-    it("upgradeOptions should be called", function() {
-      controller.set('isDowngrade', false);
-      controller.openUpgradeOptions();
-      expect(controller.upgradeOptions.calledWith(true, null)).to.be.true;
-    });
-  });
-
-  describe("#getSupportedUpgradeTypes()", function () {
-
-    beforeEach(function() {
-      controller.getSupportedUpgradeTypes({});
-    });
-
-    it("App.ajax.send should be called", function() {
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.get_supported_upgradeTypes');
-      expect(args[0]).to.be.eql({
-        name: "admin.upgrade.get_supported_upgradeTypes",
-        sender: controller,
-        data: {},
-        success: "getSupportedUpgradeTypesSuccess",
-        error: "getSupportedUpgradeTypesError"
-      });
-    });
-
-    it("getSupportedUpgradeError should be empty", function() {
-      expect(controller.get('getSupportedUpgradeError')).to.be.empty;
-    });
-
-    it("isUpgradeTypesLoaded should be false", function() {
-      expect(controller.get('isUpgradeTypesLoaded')).to.be.false;
-    });
-  });
-
-  describe("#getSupportedUpgradeTypesSuccess()", function () {
-    var testCases = [
-      {
-        data: {
-          items: []
-        },
-        expected: false
-      },
-      {
-        data: {
-          items: [{
-            CompatibleRepositoryVersions: {}
-          }]
-        },
-        expected: false
-      },
-      {
-        data: {
-          items: [{
-            CompatibleRepositoryVersions: {
-              upgrade_types: []
-            }
-          }]
-        },
-        expected: false
-      },
-      {
-        data: {
-          items: [{
-            CompatibleRepositoryVersions: {
-              upgrade_types: ['t1']
-            }
-          }]
-        },
-        expected: true
-      }
-    ];
-
-    testCases.forEach(function(test) {
-      it("data: " + JSON.stringify(test.data), function() {
-        controller.set('upgradeMethods', [Em.Object.create({
-          type: 't1',
-          allowed: true
-        })]);
-        controller.getSupportedUpgradeTypesSuccess(test.data);
-        expect(controller.get('upgradeMethods')[0].get('allowed')).to.be.equal(test.expected);
-      });
-    });
-  });
-
-  describe("#getSupportedUpgradeTypesError", function () {
-
-    it("correct responseText", function() {
-      controller.getSupportedUpgradeTypesError({responseText: JSON.stringify({
-        message: 'error'
-      })});
-      expect(controller.get('getSupportedUpgradeError')).to.be.equal('error');
-    });
-
-    it("invalid responseText", function() {
-      controller.getSupportedUpgradeTypesError({
-        responseText: '',
-        statusText: 'statusError'
-      });
-      expect(controller.get('getSupportedUpgradeError')).to.be.equal('statusError');
-    });
-  });
-
-  describe("#runPreUpgradeCheckOnlySuccess()", function () {
-
-    beforeEach(function() {
-      sinon.stub(controller, 'formatPreCheckMessage').returns({precheckResultsMessage: 'formatted'});
-      sinon.stub(controller, 'updateSelectedMethod');
-      sinon.stub(controller, 'addPrecheckMessageTooltip');
-      controller.set('upgradeMethods', [Em.Object.create({
-        type: 'ROLLING'
-      })]);
-    });
-
-    afterEach(function() {
-      controller.formatPreCheckMessage.restore();
-      controller.updateSelectedMethod.restore();
-      controller.addPrecheckMessageTooltip.restore();
-    });
-
-    it("failed check", function() {
-      var data = {
-        items: [
-          {
-            UpgradeChecks: {
-              status: 'FAIL'
-            }
-          }
-        ]
-      };
-      var properties = {
-        precheckResultsTitle: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.title'),
-        precheckResultsData: data,
-        isCheckComplete: true,
-        action: 'openMessage',
-        precheckResultsMessage: '',
-        recheckResultsMessageClass: 'GREEN',
-        isPrecheckFailed: false,
-        precheckResultsMessageIconClass: 'glyphicon glyphicon-ok',
-        bypassedFailures: false
-      };
-      controller.runPreUpgradeCheckOnlySuccess(data, {}, {type: 'ROLLING'});
-      expect(controller.formatPreCheckMessage.calledWith('FAIL', data, properties)).to.be.true;
-      var msg = controller.get('upgradeMethods').findProperty('type', 'ROLLING').get('precheckResultsMessage');
-      expect(msg).to.be.equal('formatted');
-    });
-
-    it("success check", function() {
-      var data = {
-        items: []
-      };
-      controller.runPreUpgradeCheckOnlySuccess(data, {}, {type: 'ROLLING'});
-      var msg = controller.get('upgradeMethods').findProperty('type', 'ROLLING').get('precheckResultsMessage');
-      expect(msg).to.be.equal(Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.allPassed'));
-    });
-
-    it("updateSelectedMethod should be called", function() {
-      var data = {
-        items: []
-      };
-      controller.runPreUpgradeCheckOnlySuccess(data, {}, {type: 'ROLLING'});
-      expect(controller.updateSelectedMethod.calledWith(false)).to.be.true;
-    });
-
-    it("addPrecheckMessageTooltip should be called", function() {
-      var data = {
-        items: []
-      };
-      controller.runPreUpgradeCheckOnlySuccess(data, {}, {type: 'ROLLING'});
-      expect(controller.addPrecheckMessageTooltip.calledOnce).to.be.true;
-    });
-  });
-
-  describe("#formatPreCheckMessage()", function () {
-
-    it("should return formatted message", function() {
-      var data = {
-        items: [{
-          UpgradeChecks: {
-            status: 'FAIL'
-          }
-        }]
-      };
-      expect(controller.formatPreCheckMessage('FAIL', data, {precheckResultsMessage: 'pre'})).to.be.eql({
-        "precheckResultsMessage": "1 Required pre",
-        "precheckResultsMessageClass": "RED",
-        "isPrecheckFailed": true,
-        "precheckResultsMessageIconClass": "glyphicon glyphicon-remove"
-      });
-    });
-  });
-
-  describe("#addPrecheckMessageTooltip()", function () {
-
-    beforeEach(function() {
-      sinon.stub(Em.run, 'later', function(ctx, callback) {
-        callback();
-      });
-      sinon.stub(App, 'tooltip');
-    });
-
-    afterEach(function() {
-      Em.run.later.restore();
-      App.tooltip.restore();
-    });
-
-    it("App.tooltip should be called", function() {
-      controller.addPrecheckMessageTooltip();
-      expect(App.tooltip.calledOnce).to.be.true;
-    });
-  });
-
-  describe("#runPreUpgradeCheckOnlyError()", function () {
-
-    it("upgradeMethod should be updated", function() {
-      controller.set('upgradeMethods', [Em.Object.create({
-        type: 'ROLLING'
-      })]);
-      controller.runPreUpgradeCheckOnlyError({}, {}, '', {}, {type: 'ROLLING'});
-      expect(JSON.stringify(controller.get('upgradeMethods').findProperty('type', 'ROLLING'))).to.be.equal(JSON.stringify({
-        "type": "ROLLING",
-        "precheckResultsMessage": Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.failed.link'),
-        "precheckResultsTitle": Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.failed.title'),
-        "precheckResultsMessageClass": "RED",
-        "isPrecheckFailed": true,
-        "precheckResultsMessageIconClass": "glyphicon glyphicon-warning-sign",
-        "action": "rerunCheck"
-      }));
-    });
-  });
-
-  describe("#updateSelectedMethod()", function () {
-
-    beforeEach(function() {
-      controller.set('upgradeMethods', [
-        Em.Object.create({
-          type: 'ROLLING',
-          isPrecheckFailed: false,
-          selected: true
-        }),
-        Em.Object.create({
-          type: 'NON_ROLLING',
-          isPrecheckFailed: false,
-          selected: true
-        })
-      ]);
-    });
-
-    it("should select upgrade method", function() {
-      controller.set('upgradeType', 'ROLLING');
-      controller.updateSelectedMethod(true);
-      expect(controller.get('upgradeMethods').findProperty('type', 'ROLLING').get('selected')).to.be.true;
-    });
-
-    it("isPrecheckFailed true for ROLLING and NON_ROLLING", function() {
-      controller.updateSelectedMethod(false);
-      expect(controller.get('upgradeMethods').findProperty('type', 'ROLLING').get('selected')).to.be.true;
-      expect(controller.get('upgradeMethods').findProperty('type', 'NON_ROLLING').get('selected')).to.be.true;
-    });
-
-    it("isPrecheckFailed false for ROLLING and NON_ROLLING", function() {
-      controller.get('upgradeMethods').setEach('isPrecheckFailed', true);
-      controller.updateSelectedMethod(false);
-      expect(controller.get('upgradeMethods').findProperty('type', 'ROLLING').get('selected')).to.be.false;
-      expect(controller.get('upgradeMethods').findProperty('type', 'NON_ROLLING').get('selected')).to.be.false;
-    });
-  });
-
-  describe("#runPreUpgradeCheckError()", function () {
-
-    it("requestInProgress should be false", function() {
-      controller.runPreUpgradeCheckError();
-      expect(controller.get('requestInProgress')).to.be.false;
-    });
-  });
-
-  describe("#confirmRetryUpgrade()", function () {
-
-    beforeEach(function() {
-      sinon.spy(App, 'showConfirmationPopup');
-      sinon.stub(controller, 'retryUpgrade');
-    });
-
-    afterEach(function() {
-      App.showConfirmationPopup.restore();
-      controller.retryUpgrade.restore();
-    });
-
-    it("App.showConfirmationPopup should be called", function() {
-      var popup = controller.confirmRetryUpgrade(Em.Object.create());
-      expect(App.showConfirmationPopup.calledOnce).to.be.true;
-      popup.onPrimary();
-      expect(controller.retryUpgrade.calledOnce).to.be.true;
-    });
-  });
-
-  describe("#confirmRetryDowngrade()", function () {
-
-    beforeEach(function() {
-      sinon.spy(App, 'showConfirmationPopup');
-      sinon.stub(controller, 'retryUpgrade');
-    });
-
-    afterEach(function() {
-      App.showConfirmationPopup.restore();
-      controller.retryUpgrade.restore();
-    });
-
-    it("App.showConfirmationPopup should be called", function() {
-      var popup = controller.confirmRetryDowngrade(Em.Object.create());
-      expect(App.showConfirmationPopup.calledOnce).to.be.true;
-      popup.onPrimary();
-      expect(controller.retryUpgrade.calledOnce).to.be.true;
-    });
-  });
-
-  describe("#installRepoVersionError()", function () {
-    var header = Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.title');
-    var mock = Em.Object.create({
-      id: 1,
-      defaultStatus: 'NOT_REQUIRED',
-      stackVersion: {}
-    });
-
-    beforeEach(function() {
-      sinon.stub(App, 'showAlertPopup');
-      sinon.stub(App.RepositoryVersion, 'find').returns(mock);
-    });
-
-    afterEach(function() {
-      App.showAlertPopup.restore();
-      App.RepositoryVersion.find.restore();
-    });
-
-    it("responseText is incorrect", function() {
-      var data = {
-        responseText: null
-      };
-      controller.installRepoVersionError(data, null, mock);
-      expect(App.showAlertPopup.calledWith(header, "")).to.be.true;
-    });
-
-    it("statusText is timeout", function() {
-      var data = {
-        responseText: '',
-        statusText: 'timeout'
-      };
-      controller.installRepoVersionError(data, null, mock);
-      expect(App.showAlertPopup.calledWith(header, Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.timeout'))).to.be.true;
-    });
-
-    it("responseText is correct", function() {
-      var data = {
-        responseText: '{"message":"msg"}'
-      };
-      controller.installRepoVersionError(data, null, mock);
-      expect(App.showAlertPopup.calledWith(header, 'msg')).to.be.true;
-    });
-  });
-
-  describe("#showProgressPopup()", function () {
-    var mock = {
-      initPopup: Em.K
-    };
-
-    beforeEach(function() {
-      sinon.stub(App.router, 'get').withArgs('highAvailabilityProgressPopupController').returns(mock);
-      sinon.stub(mock, 'initPopup');
-      sinon.stub(controller, 'getRepoVersionInstallId').returns([1]);
-    });
-
-    afterEach(function() {
-      App.router.get.restore();
-      mock.initPopup.restore();
-      controller.getRepoVersionInstallId.restore();
-    });
-
-    it("initPopup should be called", function() {
-      controller.showProgressPopup(Em.Object.create({displayName: 'v1'}));
-      expect(mock.initPopup.calledWith(
-        Em.I18n.t('admin.stackVersions.details.install.hosts.popup.title').format('v1'),
-        [1],
-        controller
-      )).to.be.true;
-    });
-  });
-
-  describe('#getRepoVersionInstallId', function() {
-    beforeEach(function() {
-      this.mockDB = sinon.stub(App.db, 'get');
-      this.mockRequests = sinon.stub(App.router, 'get');
-    });
-    afterEach(function() {
-      this.mockDB.restore();
-      this.mockRequests.restore();
-    });
-
-    it('should return id from latest version install', function() {
-      this.mockDB.returns(null);
-      this.mockRequests.returns([Em.Object.create({
-        name: 'Install version',
-        id: 1
-      })]);
-      expect(controller.getRepoVersionInstallId()[0]).to.be.equal(1);
-    });
-    it('should return id from localDB', function() {
-      this.mockDB.returns([2]);
-      this.mockRequests.returns([Em.Object.create({
-        name: 'Install version',
-        id: 2
-      })]);
-      expect(controller.getRepoVersionInstallId()[0]).to.be.equal(2);
-    });
-    it('should return id from latest version install and ignore deprecated localDb value', function() {
-      this.mockDB.returns([2]);
-      this.mockRequests.returns([Em.Object.create({
-        name: 'Install version',
-        id: 3
-      })]);
-      expect(controller.getRepoVersionInstallId()[0]).to.be.equal(3);
-    });
-  });
-
-  describe("#finish()", function () {
-
-    beforeEach(function() {
-      sinon.stub(controller, 'setDBProperties', Em.K);
-      sinon.stub(App.clusterStatus, 'setClusterStatus');
-      sinon.stub(controller, 'initDBProperties');
-      App.set('upgradeState', 'COMPLETED');
-      controller.set('upgradeVersion', '');
-    });
-
-    afterEach(function() {
-      controller.setDBProperties.restore();
-      controller.initDBProperties.restore();
-      App.clusterStatus.setClusterStatus.restore();
-    });
-
-    it("setDBProperties should be called", function() {
-      controller.finish();
-      expect(controller.setDBProperties.calledWith({
-        fromVersion: undefined,
-        upgradeId: undefined,
-        upgradeState: 'NOT_REQUIRED',
-        upgradeVersion: undefined,
-        currentVersion: undefined,
-        upgradeTypeDisplayName: undefined,
-        upgradeType: undefined,
-        isWizardRestricted: false,
-        failuresTolerance: undefined,
-        isDowngrade: undefined,
-        downgradeAllowed: undefined
-      })).to.be.true;
-    });
-
-    it("initDBProperties should be called", function() {
-      controller.finish();
-      expect(controller.initDBProperties).to.be.calledOnce;
-    });
-
-    it("App.clusterStatus.setClusterStatus should be called", function() {
-      controller.finish();
-      expect(App.clusterStatus.setClusterStatus.calledOnce).to.be.true;
-    });
-
-    it("upgradeState should be NOT_REQUIRED", function() {
-      controller.finish();
-      expect(App.get('upgradeState')).to.be.equal('NOT_REQUIRED');
-    });
-
-    it("currentStackVersion should be set", function() {
-      controller.set('upgradeVersion', 'HDP-2.2');
-      controller.finish();
-      expect(controller.get('upgradeVersion')).to.be.equal('HDP-2.2');
-    });
-  });
-
-  describe("#loadRepositories()", function () {
-
-    beforeEach(function() {
-      sinon.stub(App.router, 'get').withArgs('clusterController.isLoaded').returns(true);
-    });
-
-    afterEach(function() {
-      App.router.get.restore();
-    });
-
-    it("App.ajax.send should be called", function() {
-      App.set('currentStackVersion', 'HDP-2.2');
-      controller.loadRepositories();
-      var args = testHelpers.findAjaxRequest('name', 'cluster.load_repositories');
-      expect(args[0]).to.be.eql({
-        name: 'cluster.load_repositories',
-        sender: controller,
-        data: {
-          stackName: 'HDP',
-          stackVersion: '2.2'
-        },
-        success: 'loadRepositoriesSuccessCallback',
-        error: 'loadRepositoriesErrorCallback'
-      });
-    });
-  });
-
-  describe("#loadRepositoriesSuccessCallback()", function () {
-
-    it("allRepos should be set", function() {
-      var data = {
-        items: [
-          {
-            repositories: [
-              {
-                Repositories: {
-                  os_type: 'redhat',
-                  base_url: 'base_url',
-                  repo_id: 'repo_id',
-                  repo_name: 'repo_name',
-                  stack_name: 'stack_name',
-                  stack_version: 'stack_version'
-                }
-              }
-            ]
-          }
-        ]
-      };
-      controller.loadRepositoriesSuccessCallback(data);
-      expect(controller.get('allRepos')[0].name).to.be.equal('redhat');
-      expect(JSON.stringify(controller.get('allRepos')[0].repositories[0])).to.be.equal(JSON.stringify({
-        "baseUrl": "base_url",
-        "osType": "redhat",
-        "repoId": "repo_id",
-        "repoName": "repo_name",
-        "stackName": "stack_name",
-        "stackVersion": "stack_version",
-        "isFirst": true
-      }));
-    });
-  });
-
-  describe("#loadServiceVersionFromVersionDefinitions()", function () {
-
-    it("App.ajax.send should be called", function() {
-      App.set('clusterName', 'c1');
-      controller.loadServiceVersionFromVersionDefinitions();
-      var args = testHelpers.findAjaxRequest('name', 'cluster.load_current_repo_stack_services');
-      expect(args[0]).to.be.eql({
-        name: 'cluster.load_current_repo_stack_services',
-        sender: controller,
-        data: {
-          clusterName: App.get('clusterName')
-        },
-        success: 'loadServiceVersionFromVersionDefinitionsSuccessCallback',
-        error: 'loadServiceVersionFromVersionDefinitionsErrorCallback'
-      });
-    });
-  });
-
-  describe("#loadServiceVersionFromVersionDefinitionsSuccessCallback()", function () {
-    var cases;
-    beforeEach(function() {
-      this.appGetStub = sinon.stub(App, 'get');
-    });
-
-    afterEach(function() {
-      App.get.restore();
-      controller.set('serviceVersionsMap', {});
-    });
-    cases = [
-      {
-        jsonData: {
-          items: [
-            {
-              ClusterStackVersions: {
-                version: '2.3',
-                stack: 'HDP',
-                state: 'NOT_REQUIRED'
-              },
-              repository_versions: [
-                {
-                  RepositoryVersions: {
-                    stack_services: [
-                      { name: 'S3', versions: ['v3']}
-                    ]
-                  }
-                }
-              ]
-            },
-            {
-              ClusterStackVersions: {
-                version: '2.2',
-                stack: 'HDP',
-                state: 'NOT_REQUIRED'
-              },
-              repository_versions: [
-                {
-                  RepositoryVersions: {
-                    stack_services: [
-                      { name: 'S2', versions: ['v2']}
-                    ]
-                  }
-                }
-              ]
-            }
-          ]
-        },
-        currentStackData: {
-          currentStackVersionNumber: '2.2',
-          currentStackName: 'HDP'
-        },
-        m: 'should add stack services from stack version by current stack name and version number',
-        e: { "S2": "v2"}
-      }
-    ];
-
-    cases.forEach(function(test) {
-      it(test.m, function() {
-        this.appGetStub.withArgs('currentStackName').returns(test.currentStackData.currentStackName)
-          .withArgs('currentStackVersionNumber').returns(test.currentStackData.currentStackVersionNumber);
-        controller.loadServiceVersionFromVersionDefinitionsSuccessCallback(test.jsonData);
-        expect(controller.get('serviceVersionsMap')).to.be.eql(test.e);
-      })
-    });
-  });
-
-  describe("#loadCompatibleVersions()", function () {
-
-    beforeEach(function() {
-      sinon.stub(App, 'get').returns('stack');
-    });
-
-    afterEach(function() {
-      App.get.restore();
-    });
-
-    it("App.ajax.send should be called", function() {
-      controller.loadCompatibleVersions();
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.get_compatible_versions');
-      expect(args[0]).to.be.eql({
-        name: 'admin.upgrade.get_compatible_versions',
-        sender: controller,
-        data: {
-          stackName: 'stack',
-          stackVersion: 'stack'
-        },
-        success: 'loadCompatibleVersionsSuccessCallback'
-      });
-    });
-  });
-
-  describe("#loadCompatibleVersionsSuccessCallback()", function () {
-    var mock = [
-      Em.Object.create({
-        repositoryVersion: 'HDP-1',
-        isCompatible: false
-      }),
-      Em.Object.create({
-        repositoryVersion: 'HDP-2',
-        isCompatible: false
-      })
-    ];
-
-    beforeEach(function() {
-      sinon.stub(App.RepositoryVersion, 'find').returns(mock);
-    });
-
-    afterEach(function() {
-      App.RepositoryVersion.find.restore();
-    });
-
-    it("should set isCompatible property", function() {
-      var data = {
-        items: [
-          {
-            CompatibleRepositoryVersions: {
-              repository_version: 'HDP-2'
-            }
-          }
-        ]
-      };
-      controller.loadCompatibleVersionsSuccessCallback(data);
-      expect(mock.mapProperty('isCompatible')).to.be.eql([false, true])
-    });
-  });
-  
-   describe('#confirmRevertPatchUpgrade', function() {
-    beforeEach(function() {
-      sinon.stub(App.RepositoryVersion, 'find').returns(Em.Object.create());
-      sinon.stub(App.ModalPopup, 'show');
-      sinon.stub(controller, 'getServicesToBeReverted');
-    });
-    afterEach(function() {
-      App.RepositoryVersion.find.restore();
-      App.ModalPopup.show.restore();
-      controller.getServicesToBeReverted.restore();
-    });
-
-    it('App.ModalPopup.show should be called', function() {
-      controller.confirmRevertPatchUpgrade(Em.Object.create());
-      expect(App.ModalPopup.show.calledOnce).to.be.true;
-    });
-  });
-
-  describe('#getServicesToBeReverted', function() {
-    beforeEach(function() {
-      sinon.stub(App.Service, 'find').returns(Em.Object.create({isLoaded: true}));
-    });
-    afterEach(function() {
-      App.Service.find.restore();
-    });
-
-    it('should return services which will be reverted', function() {
-      var version = Em.Object.create({
-        stackServices: [
-          Em.Object.create({
-            name: 'S1',
-            isAvailable: false,
-            displayName: 's1',
-            latestVersion: '1.0'
-          }),
-          Em.Object.create({
-            name: 'S2',
-            isAvailable: true,
-            displayName: 's2',
-            latestVersion: '2.0'
-          })
-        ]
-      });
-      var currentStack = Em.Object.create({
-        stackServices: [
-          Em.Object.create({
-            name: 'S2',
-            latestVersion: '2.1'
-          })
-        ]
-      });
-      expect(controller.getServicesToBeReverted(version, currentStack)).to.be.eql([
-        {
-          displayName: 's2',
-          fromVersion: '2.0',
-          toVersion: '2.1'
-        }
-      ]);
-    });
-  });
-
-  describe('#revertPatchUpgrade', function() {
-    it('App.ajax.send should be called', function() {
-      var version = Em.Object.create({
-        repositoryVersion: '1.1',
-        id: 2,
-        displayName: '1.2',
-        upgradeType: 'EXPRESS',
-        stackVersion: Em.Object.create({
-          revertUpgradeId: 1
-        })
-      });
-      controller.revertPatchUpgrade(version);
-      expect(controller.get('requestInProgress')).to.be.true;
-      var args = testHelpers.findAjaxRequest('name', 'admin.upgrade.revert');
-      expect(args[0]).to.exists;
-      expect(args[0].data).to.be.eql({
-        upgradeId: 1,
-        isDowngrade: true,
-        id: 2,
-        value: '1.1',
-        label: '1.2'
-      });
-      args[0].callback();
-      expect(controller.get('requestInProgress')).to.be.false;
-    });
-  });
-
-  describe('#getUpgradeDowngradeHeader', function() {
-
-    it('should return downgrade header', function() {
-      expect(controller.getUpgradeDowngradeHeader('t1', 'v1', true)).to.be.equal(
-        Em.I18n.t('admin.stackUpgrade.dialog.downgrade.header').format('v1')
-      );
-    });
-    it('should return patch upgrade header', function() {
-      expect(controller.getUpgradeDowngradeHeader('t1', 'v1', false, Em.Object.create({isPatch: true}))).to.be.equal(
-        Em.I18n.t('admin.stackUpgrade.dialog.upgrade.patch.header').format('t1', 'v1')
-      );
-    });
-    it('should return maint upgrade header', function() {
-      expect(controller.getUpgradeDowngradeHeader('t1', 'v1', false, Em.Object.create({isMaint: true}))).to.be.equal(
-        Em.I18n.t('admin.stackUpgrade.dialog.upgrade.maint.header').format('t1', 'v1')
-      );
-    });
-    it('should return upgrade header', function() {
-      expect(controller.getUpgradeDowngradeHeader('t1', 'v1', false, false)).to.be.equal(
-        Em.I18n.t('admin.stackUpgrade.dialog.upgrade.header').format('t1', 'v1')
-      );
-    });
-  });
-  
-  describe('#confirmDiscardRepoVersion', function() {
-    beforeEach(function() {
-      sinon.stub(App, 'showConfirmationPopup', Em.clb);
-      sinon.stub(controller, 'discardRepoVersion');
-    });
-    afterEach(function() {
-      App.showConfirmationPopup.restore();
-      controller.discardRepoVersion.restore();
-    });
-
-    it('discardRepoVersion should be called', function() {
-      controller.confirmDiscardRepoVersion(Em.Object.create());
-      expect(App.showConfirmationPopup.calledOnce).to.be.true;
-      expect(controller.discardRepoVersion.calledWith(Em.Object.create())).to.be.true;
-    });
-  });
-
-  describe('#discardRepoVersion', function() {
-
-    it('App.ajax.send should be called', function() {
-      var version = Em.Object.create({
-        id: 2,
-        stackVersionType: 'HDP',
-        stackVersionNumber: '2.5'
-      });
-      controller.discardRepoVersion(version);
-      expect(controller.get('requestInProgress')).to.be.true;
-      var args = testHelpers.findAjaxRequest('name', 'admin.stack_versions.discard');
-      expect(args[0]).to.exists;
-      expect(args[0].data).to.be.eql({
-        id: 2,
-        stackName: 'HDP',
-        stackVersion: '2.5'
-      });
-      args[0].callback();
-      expect(controller.get('requestInProgress')).to.be.false;
-    });
-  });
-
-  describe('#showUpgradeOptions', function () {
-    before(function () {
-      sinon.stub(controller, 'upgradeOptions', Em.K);
-    });
-    after(function () {
-      controller.upgradeOptions.restore();
-    });
-    it("show upgrade options popup window", function() {
-      var version = Em.Object.create({displayName: 'HDP-2.2'});
-      controller.showUpgradeOptions(version);
-      expect(controller.upgradeOptions.calledWith(false, version, true)).to.be.true;
-    });
-
-    it("runningCheckRequests has 1 item" + Em.I18n.t('common.dismiss'), function () {
-      var version = Em.Object.create({displayName: 'HDP-2.2'});
-      var popup = controller.upgradeOptions(false, version, true);
-      expect( controller.get('runningCheckRequests')).to.have.length(1);
-    })
-  });
-});
diff --git a/ambari-web/test/mappers/socket/upgrade_state_mapper_test.js b/ambari-web/test/mappers/socket/upgrade_state_mapper_test.js
deleted file mode 100644
index 322c04f..0000000
--- a/ambari-web/test/mappers/socket/upgrade_state_mapper_test.js
+++ /dev/null
@@ -1,80 +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('mappers/socket/upgrade_state_mapper');
-
-describe('App.upgradeStateMapper', function () {
-
-  describe('#map', function() {
-    var mainAdminStackAndUpgradeController = Em.Object.create({
-      restoreLastUpgrade: sinon.spy(),
-      setDBProperty: sinon.spy(),
-      upgradeId: 1
-    });
-    beforeEach(function() {
-      sinon.stub(App.router, 'get').returns(mainAdminStackAndUpgradeController)
-    });
-    afterEach(function() {
-      App.router.get.restore();
-    });
-
-    it('should call restoreLastUpgrade on CREATE event', function() {
-      var event = {
-        type: 'CREATE',
-        associated_version: "2.5.4.0-121",
-        cluster_id: 2,
-        direction: "DOWNGRADE",
-        downgrade_allowed: false,
-        end_time: -1,
-        progress_percent: 0,
-        request_id: 26,
-        request_status: "PENDING",
-        revert_allowed: false,
-        skip_failures: false,
-        skip_service_check_failures: false,
-        start_time: -1,
-        suspended: false,
-        upgrade_id: 56,
-        upgrade_type: "NON_ROLLING"
-      };
-      App.upgradeStateMapper.map(event);
-      expect(mainAdminStackAndUpgradeController.restoreLastUpgrade.getCall(0).args[0]).to.be.eql({
-        Upgrade: event
-      });
-    });
-
-    it('should set upgrade state on UPDATE event', function() {
-      var event = {
-        end_time: -1,
-        progress_percent: 0,
-        request_id: 1,
-        request_status: "PENDING",
-        start_time: -1,
-        suspended: true,
-        type: "UPDATE"
-      };
-      App.upgradeStateMapper.map(event);
-      expect(App.get('upgradeState')).to.be.equal('PENDING');
-      expect(mainAdminStackAndUpgradeController.get('isSuspended')).to.be.true;
-      expect(mainAdminStackAndUpgradeController.setDBProperty.calledWith('upgradeState', 'PENDING')).to.be.true;
-      expect(mainAdminStackAndUpgradeController.setDBProperty.calledWith('isSuspended', true)).to.be.true;
-    });
-  });
-});
diff --git a/ambari-web/test/views/main/admin/stack_upgrade/menu_view_test.js b/ambari-web/test/views/main/admin/stack_upgrade/menu_view_test.js
deleted file mode 100644
index f118e76..0000000
--- a/ambari-web/test/views/main/admin/stack_upgrade/menu_view_test.js
+++ /dev/null
@@ -1,59 +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');
-var view;
-
-describe('App.MainAdminStackMenuView', function () {
-
-  beforeEach(function () {
-    view = App.MainAdminStackMenuView.create({});
-  });
-
-  describe('#content', function () {
-
-    beforeEach(function () {
-      this.stub = sinon.stub(App, 'get');
-    });
-
-    afterEach(function () {
-      App.get.restore();
-    });
-
-    Em.A([
-        {
-          stackVersionsAvailable: true,
-          m: '`versions` is visible',
-          e: false
-        },
-        {
-          stackVersionsAvailable: false,
-          m: '`versions` is invisible',
-          e: true
-        }
-      ]).forEach(function (test) {
-        it(test.m, function () {
-          this.stub.withArgs('stackVersionsAvailable').returns(test.stackVersionsAvailable);
-          view.propertyDidChange('content');
-          expect(view.get('content').findProperty('name', 'versions').get('hidden')).to.equal(test.e);
-        });
-      });
-
-  });
-
... 3428 lines suppressed ...

-- 
To stop receiving notification emails like this one, please contact
jgolieb@apache.org.