You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ak...@apache.org on 2015/04/27 18:16:46 UTC

[2/2] ambari git commit: AMBARI-10768. Ranger Admin HA Wizard: Configure Components step. (akovalenko)

AMBARI-10768. Ranger Admin HA Wizard: Configure Components step. (akovalenko)


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

Branch: refs/heads/trunk
Commit: e9430b16f5643a86e701559429432152146963ca
Parents: 71f7290
Author: Aleksandr Kovalenko <ak...@hortonworks.com>
Authored: Mon Apr 27 18:40:35 2015 +0300
Committer: Aleksandr Kovalenko <ak...@hortonworks.com>
Committed: Mon Apr 27 19:16:29 2015 +0300

----------------------------------------------------------------------
 .../common-services/RANGER/0.4.0/metainfo.xml   |  2 +-
 .../nameNode/step5_controller.js                | 21 +----
 .../nameNode/step7_controller.js                |  2 -
 .../nameNode/step9_controller.js                | 17 +---
 .../highAvailability/progress_controller.js     | 19 ++--
 .../rangerAdmin/step4_controller.js             | 68 ++++++++++++++-
 .../rangerAdmin/wizard_controller.js            | 10 +++
 .../resourceManager/step4_controller.js         | 32 +------
 .../resourceManager/wizard_controller.js        | 30 -------
 .../main/admin/kerberos/disable_controller.js   | 33 +------
 .../main/admin/kerberos/step5_controller.js     | 15 ----
 .../main/admin/kerberos/step7_controller.js     | 18 +---
 .../main/admin/kerberos/wizard_controller.js    | 32 -------
 .../main/service/reassign/step4_controller.js   | 83 +++---------------
 .../main/service/reassign/step6_controller.js   | 20 +----
 .../main/service/reassign/step7_controller.js   |  1 -
 ambari-web/app/controllers/wizard.js            | 30 +++++++
 ambari-web/app/messages.js                      | 10 ++-
 .../wizard/wizardProgressPageController.js      | 69 ++++++++++++++-
 .../app/mixins/wizard/wizardProgressPageView.js |  6 ++
 .../app/routes/ra_high_availability_routes.js   | 16 ++--
 ambari-web/app/templates/common/progress.hbs    |  2 +-
 .../main/admin/highAvailability/progress.hbs    | 64 --------------
 .../highAvailability/rangerAdmin/step4.hbs      |  5 +-
 .../highAvailability/rangerAdmin/step4_view.js  | 14 ++-
 .../resourceManager/step4_view.js               |  4 +-
 .../views/main/service/reassign/step4_view.js   |  4 +-
 .../views/main/service/reassign/step6_view.js   |  4 +-
 .../views/main/service/reassign/step7_view.js   |  4 +-
 .../progress_controller_test.js                 | 16 ++--
 .../service/reassign/step4_controller_test.js   | 92 +-------------------
 31 files changed, 262 insertions(+), 481 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-server/src/main/resources/common-services/RANGER/0.4.0/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/RANGER/0.4.0/metainfo.xml b/ambari-server/src/main/resources/common-services/RANGER/0.4.0/metainfo.xml
index 5c12736..3105d40 100644
--- a/ambari-server/src/main/resources/common-services/RANGER/0.4.0/metainfo.xml
+++ b/ambari-server/src/main/resources/common-services/RANGER/0.4.0/metainfo.xml
@@ -32,7 +32,7 @@
           <name>RANGER_ADMIN</name>
           <displayName>Ranger Admin</displayName>
           <category>MASTER</category>
-          <cardinality>1</cardinality>
+          <cardinality>1-3</cardinality>
           <versionAdvertised>true</versionAdvertised>
           <commandScript>
             <script>scripts/ranger_admin.py</script>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step5_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step5_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step5_controller.js
index b8835d9..039e3b3 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step5_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step5_controller.js
@@ -22,28 +22,11 @@ App.HighAvailabilityWizardStep5Controller = App.HighAvailabilityProgressPageCont
 
   name:"highAvailabilityWizardStep5Controller",
 
-  isHA: true,
-
-  commands: ['stopAllServices', 'installNameNode', 'installJournalNodes', 'reconfigureHDFS', 'startJournalNodes', 'disableSNameNode'],
+  commands: ['stopServices', 'installNameNode', 'installJournalNodes', 'reconfigureHDFS', 'startJournalNodes', 'disableSNameNode'],
 
   hdfsSiteTag : "",
   coreSiteTag : "",
 
-  stopAllServices: function () {
-    App.ajax.send({
-      name: 'common.services.update',
-      data: {
-        context: "Stop all services",
-        "ServiceInfo": {
-          "state": "INSTALLED"
-        }
-      },
-      sender: this,
-      success: 'startPolling',
-      error: 'onTaskError'
-    });
-  },
-
   installNameNode: function () {
     var hostName = this.get('content.masterComponentHosts').filterProperty('component', 'NAMENODE').findProperty('isInstalled', false).hostName;
     this.createComponent('NAMENODE', hostName, "HDFS");
@@ -98,7 +81,7 @@ App.HighAvailabilityWizardStep5Controller = App.HighAvailabilityProgressPageCont
    */
   updateConfigProperties: function(data) {
     var siteNames = ['hdfs-site','core-site'];
-    var configData = this.reconfigureSites(siteNames, data);
+    var configData = this.reconfigureSites(siteNames, data, Em.I18n.t('admin.highAvailability.step4.save.configuration.note').format(App.format.role('NAMENODE')));
     App.ajax.send({
       name: 'common.service.configurations',
       sender: this,

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step7_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step7_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step7_controller.js
index b67fa53..0bfd1c9 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step7_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step7_controller.js
@@ -22,8 +22,6 @@ App.HighAvailabilityWizardStep7Controller = App.HighAvailabilityProgressPageCont
 
   name:"highAvailabilityWizardStep7Controller",
 
-  isHA: true,
-
   commands: ['startZooKeeperServers', 'startNameNode'],
 
   startZooKeeperServers: function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step9_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step9_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step9_controller.js
index e8fa9ed..4a92447 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step9_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/nameNode/step9_controller.js
@@ -22,8 +22,6 @@ App.HighAvailabilityWizardStep9Controller = App.HighAvailabilityProgressPageCont
 
   name:"highAvailabilityWizardStep9Controller",
 
-  isHA: true,
-
   commands: ['startSecondNameNode', 'installZKFC', 'startZKFC', 'reconfigureHBase', 'deleteSNameNode', 'startAllServices'],
 
   hbaseSiteTag: "",
@@ -61,7 +59,7 @@ App.HighAvailabilityWizardStep9Controller = App.HighAvailabilityProgressPageCont
 
   reconfigureHBase: function () {
     var data = this.get('content.serviceConfigProperties');
-    var configData = this.reconfigureSites(['hbase-site'],data);
+    var configData = this.reconfigureSites(['hbase-site'], data, Em.I18n.t('admin.highAvailability.step4.save.configuration.note').format(App.format.role('NAMENODE')));
     App.ajax.send({
       name: 'common.service.configurations',
       sender: this,
@@ -84,18 +82,7 @@ App.HighAvailabilityWizardStep9Controller = App.HighAvailabilityProgressPageCont
   },
 
   startAllServices: function () {
-    App.ajax.send({
-      name: 'common.services.update',
-      data: {
-        context: "Start all services",
-        "ServiceInfo": {
-          "state": "STARTED"
-        }
-      },
-      sender: this,
-      success: 'startPolling',
-      error: 'onTaskError'
-    });
+    this.startServices(false);
   },
 
   deleteSNameNode: function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/admin/highAvailability/progress_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/progress_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/progress_controller.js
index bd3bbd1..6a31695 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/progress_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/progress_controller.js
@@ -72,27 +72,22 @@ App.HighAvailabilityProgressPageController = App.HighAvailabilityWizardControlle
   },
 
   /**
-   *
+   * Prepare object to send to the server to save configs
+   * Split all configs by site names and tag and note
    * @param siteNames Array
+   * @param data Object
+   * @param note String
    */
-  reconfigureSites: function(siteNames, data) {
+  reconfigureSites: function(siteNames, data, note) {
     var tagName = App.get('testMode') ? 'version1' : 'version' + (new Date).getTime();
-    var componentName;
-    switch (this.get('content.controllerName')) {
-      case 'rMHighAvailabilityWizardController':
-        componentName =  'RESOURCEMANAGER';
-        break;
-      default:
-        componentName =  'NAMENODE';
-    }
     return siteNames.map(function(_siteName) {
       var config = data.items.findProperty('type', _siteName);
       var configToSave = {
         type: _siteName,
         tag: tagName,
         properties: config && config.properties,
-        service_config_version_note: Em.I18n.t('admin.highAvailability.step4.save.configuration.note').format(App.format.role(componentName))
-      }
+        service_config_version_note: note || ''
+      };
       if (config && config.properties_attributes) {
         configToSave.properties_attributes = config.properties_attributes;
       }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/admin/highAvailability/rangerAdmin/step4_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/rangerAdmin/step4_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/rangerAdmin/step4_controller.js
index fb6423f..5729fb3 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/rangerAdmin/step4_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/rangerAdmin/step4_controller.js
@@ -18,7 +18,71 @@
 
 var App = require('app');
 
-App.RAHighAvailabilityWizardStep4Controller = Em.Controller.extend({
-  name: "rAHighAvailabilityWizardStep4Controller"
+App.RAHighAvailabilityWizardStep4Controller = App.HighAvailabilityProgressPageController.extend({
+
+  name: "rAHighAvailabilityWizardStep4Controller",
+
+  clusterDeployState: 'RA_HIGH_AVAILABILITY_DEPLOY',
+
+  commands: ['stopRequiredServices', 'installRangerAdmin', 'reconfigureRanger', 'startAllServices'],
+
+  tasksMessagesPrefix: 'admin.ra_highAvailability.wizard.step',
+
+  stopRequiredServices: function () {
+    this.stopServices(['HDFS']);
+  },
+
+  installRangerAdmin: function () {
+    var hostNames = this.get('content.raHosts.additionalRA');
+    this.createComponent('RANGER_ADMIN', hostNames, "RANGER");
+  },
+
+  reconfigureRanger: function () {
+    this.loadConfigsTags();
+  },
+
+  loadConfigsTags: function () {
+    App.ajax.send({
+      name: 'config.tags',
+      sender: this,
+      success: 'onLoadConfigsTags',
+      error: 'onTaskError'
+    });
+  },
+
+  onLoadConfigsTags: function (data) {
+    App.ajax.send({
+      name: 'reassign.load_configs',
+      sender: this,
+      data: {
+        urlParams: '(type=admin-properties&tag=' + data.Clusters.desired_configs['admin-properties'].tag + ')'
+      },
+      success: 'onLoadConfigs',
+      error: 'onTaskError'
+    });
+  },
+
+  onLoadConfigs: function (data) {
+    data.items.findProperty('type', 'admin-properties').properties['policymgr_external_url'] = this.get('content.loadBalancerURL');
+    var configData = this.reconfigureSites(['admin-properties'], data, Em.I18n.t('admin.highAvailability.step4.save.configuration.note').format(App.format.role('RANGER_ADMIN')));
+
+    App.ajax.send({
+      name: 'common.service.configurations',
+      sender: this,
+      data: {
+        desired_config: configData
+      },
+      success: 'onSaveConfigs',
+      error: 'onTaskError'
+    });
+  },
+
+  onSaveConfigs: function () {
+    this.onTaskCompleted();
+  },
+
+  startAllServices: function () {
+    this.startServices(true);
+  }
 });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/admin/highAvailability/rangerAdmin/wizard_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/rangerAdmin/wizard_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/rangerAdmin/wizard_controller.js
index ae3e230..a8768b6 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/rangerAdmin/wizard_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/rangerAdmin/wizard_controller.js
@@ -86,6 +86,16 @@ App.RAHighAvailabilityWizardController = App.WizardController.extend({
           this.load('raHosts');
         }
       }
+    ],
+    '4': [
+      {
+        type: 'sync',
+        callback: function () {
+          this.loadTasksStatuses();
+          this.loadTasksRequestIds();
+          this.loadRequestIds();
+        }
+      }
     ]
   },
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/step4_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/step4_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/step4_controller.js
index 1caa3e0..94060ba 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/step4_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/step4_controller.js
@@ -24,8 +24,6 @@ App.RMHighAvailabilityWizardStep4Controller = App.HighAvailabilityProgressPageCo
 
   name: "rMHighAvailabilityWizardStep4Controller",
 
-  isRMHA: true,
-
   clusterDeployState: 'RM_HIGH_AVAILABILITY_DEPLOY',
 
   commands: ['stopRequiredServices', 'installResourceManager', 'reconfigureYARN', 'startAllServices'],
@@ -33,19 +31,7 @@ App.RMHighAvailabilityWizardStep4Controller = App.HighAvailabilityProgressPageCo
   tasksMessagesPrefix: 'admin.rm_highAvailability.wizard.step',
 
   stopRequiredServices: function () {
-    var list = App.Service.find().mapProperty("serviceName").without("HDFS").join(',');
-    App.ajax.send({
-      name: 'common.services.update',
-      sender: this,
-      data: {
-        "context": "Stop without HDFS",
-        "ServiceInfo": {
-          "state": "INSTALLED"
-        },
-        urlParams: "ServiceInfo/service_name.in(" + list + ")"},
-      success: 'startPolling',
-      error: 'onTaskError'
-    });
+    this.stopServices(['HDFS']);
   },
 
   installResourceManager: function () {
@@ -84,7 +70,7 @@ App.RMHighAvailabilityWizardStep4Controller = App.HighAvailabilityProgressPageCo
       data.items[0].properties[property.name] = property.value;
     });
 
-    var configData = this.reconfigureSites(['yarn-site'],data);
+    var configData = this.reconfigureSites(['yarn-site'], data, Em.I18n.t('admin.highAvailability.step4.save.configuration.note').format(App.format.role('RESOURCEMANAGER')));
 
     App.ajax.send({
       name: 'common.service.configurations',
@@ -102,19 +88,7 @@ App.RMHighAvailabilityWizardStep4Controller = App.HighAvailabilityProgressPageCo
   },
 
   startAllServices: function () {
-    App.ajax.send({
-      name: 'common.services.update',
-      sender: this,
-      data: {
-        "context": "Start all services",
-        "ServiceInfo": {
-          "state": "STARTED"
-        },
-        urlParams: "params/run_smoke_test=true"
-      },
-      success: 'startPolling',
-      error: 'onTaskError'
-    });
+    this.startServices(true);
   }
 });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/wizard_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/wizard_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/wizard_controller.js
index c5a3e9e..efa5119 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/wizard_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/wizard_controller.js
@@ -83,36 +83,6 @@ App.RMHighAvailabilityWizardController = App.WizardController.extend({
     this.set('content.configs', configs);
   },
 
-  saveTasksStatuses: function (tasksStatuses) {
-    this.set('content.tasksStatuses', tasksStatuses);
-    this.setDBProperty('tasksStatuses', tasksStatuses);
-  },
-
-  loadTasksStatuses: function() {
-    var tasksStatuses = this.getDBProperty('tasksStatuses');
-    this.set('content.tasksStatuses', tasksStatuses);
-  },
-
-  saveTasksRequestIds: function (tasksRequestIds) {
-    this.set('content.tasksRequestIds', tasksRequestIds);
-    this.setDBProperty('tasksRequestIds', tasksRequestIds);
-  },
-
-  loadTasksRequestIds: function() {
-    var tasksRequestIds = this.getDBProperty('tasksRequestIds');
-    this.set('content.tasksRequestIds', tasksRequestIds);
-  },
-
-  saveRequestIds: function (requestIds) {
-    this.set('content.requestIds', requestIds);
-    this.setDBProperty('requestIds', requestIds);
-  },
-
-  loadRequestIds: function() {
-    var requestIds = this.getDBProperty('requestIds');
-    this.set('content.requestIds', requestIds);
-  },
-
   /**
    * Load data for all steps until <code>current step</code>
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/admin/kerberos/disable_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/kerberos/disable_controller.js b/ambari-web/app/controllers/main/admin/kerberos/disable_controller.js
index 8df1f4f..358f922 100644
--- a/ambari-web/app/controllers/main/admin/kerberos/disable_controller.js
+++ b/ambari-web/app/controllers/main/admin/kerberos/disable_controller.js
@@ -24,7 +24,7 @@ App.KerberosDisableController = App.KerberosProgressPageController.extend(App.Wi
 
   name: 'kerberosDisableController',
   clusterDeployState: 'DEFAULT',
-  commands: ['stopServices', 'unkerberize', 'deleteKerberos', 'startServices'],
+  commands: ['stopServices', 'unkerberize', 'deleteKerberos', 'startAllServices'],
 
   tasksMessagesPrefix: 'admin.kerberos.disable.step',
 
@@ -36,21 +36,6 @@ App.KerberosDisableController = App.KerberosProgressPageController.extend(App.Wi
     this._super();
   },
 
-  stopServices: function () {
-    App.ajax.send({
-      name: 'common.services.update',
-      sender: this,
-      data: {
-        context: "Stop services",
-        "ServiceInfo": {
-          "state": "INSTALLED"
-        }
-      },
-      success: 'startPolling',
-      error: 'onTaskError'
-    });
-  },
-
   unkerberize: function () {
     return App.ajax.send({
       name: 'admin.unkerberize.cluster',
@@ -72,20 +57,8 @@ App.KerberosDisableController = App.KerberosProgressPageController.extend(App.Wi
     });
   },
 
-  startServices: function () {
-    App.ajax.send({
-      name: 'common.services.update',
-      sender: this,
-      data: {
-        "context": "Start services",
-        "ServiceInfo": {
-          "state": "STARTED"
-        },
-        urlParams: "params/run_smoke_test=true"
-      },
-      success: 'startPolling',
-      error: 'onTaskError'
-    });
+  startAllServices: function () {
+    this.startServices(true);
   }
 
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/admin/kerberos/step5_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/kerberos/step5_controller.js b/ambari-web/app/controllers/main/admin/kerberos/step5_controller.js
index 3b62cfd..84422d8 100644
--- a/ambari-web/app/controllers/main/admin/kerberos/step5_controller.js
+++ b/ambari-web/app/controllers/main/admin/kerberos/step5_controller.js
@@ -21,21 +21,6 @@ App.KerberosWizardStep5Controller = App.KerberosProgressPageController.extend({
   clusterDeployState: 'KERBEROS_DEPLOY',
   commands: ['stopServices'],
 
-  stopServices: function () {
-    App.ajax.send({
-      name: 'common.services.update',
-      data: {
-        context: "Stop services",
-        "ServiceInfo": {
-          "state": "INSTALLED"
-        }
-      },
-      sender: this,
-      success: 'startPolling',
-      error: 'onTaskError'
-    });
-  },
-
   loadStep: function() {
     this.checkComponentsRemoval();
     this._super();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/admin/kerberos/step7_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/kerberos/step7_controller.js b/ambari-web/app/controllers/main/admin/kerberos/step7_controller.js
index af39815..7ecf1dd 100644
--- a/ambari-web/app/controllers/main/admin/kerberos/step7_controller.js
+++ b/ambari-web/app/controllers/main/admin/kerberos/step7_controller.js
@@ -19,22 +19,10 @@
 App.KerberosWizardStep7Controller = App.KerberosProgressPageController.extend({
   name: 'kerberosWizardStep7Controller',
   clusterDeployState: 'KERBEROS_DEPLOY',
-  commands: ['startServices'],
+  commands: ['startAllServices'],
 
-  startServices: function () {
-    App.ajax.send({
-      name: 'common.services.update',
-      sender: this,
-      data: {
-        "context": "Start services",
-        "ServiceInfo": {
-          "state": "STARTED"
-        },
-        urlParams: "params/run_smoke_test=true"
-      },
-      success: 'startPolling',
-      error: 'onTaskError'
-    });
+  startAllServices: function () {
+    this.startServices(true);
   },
 
   isSubmitDisabled: function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js b/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
index f3e1584..495deb8 100644
--- a/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
+++ b/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
@@ -130,12 +130,6 @@ App.KerberosWizardController = App.WizardController.extend({
     this.save('cluster');
   },
 
-
-  saveTasksStatuses: function (statuses) {
-    this.setDBProperty('tasksStatuses',statuses);
-    this.set('content.tasksStatuses', statuses);
-  },
-
   saveConfigTag: function (tag) {
     App.db.setKerberosWizardConfigTag(tag);
     this.set('content.' + [tag.name], tag.value);
@@ -146,11 +140,6 @@ App.KerberosWizardController = App.WizardController.extend({
     this.set('content.kerberosOption', stepController.get('selectedItem'));
   },
 
-  loadTasksStatuses: function () {
-    var statuses = this.getDBProperty('tasksStatuses');
-    this.set('content.tasksStatuses', statuses);
-  },
-
   /**
    * Load serviceConfigProperties to model
    */
@@ -180,31 +169,10 @@ App.KerberosWizardController = App.WizardController.extend({
     this.kerberosDescriptorConfigs =  kerberosDescriptorConfigs;
   },
 
-
-  saveRequestIds: function (requestIds) {
-    this.setDBProperty('requestIds',requestIds);
-    this.set('content.requestIds', requestIds);
-  },
-
   loadKerberosOption: function () {
     this.set('content.kerberosOption', this.getDBProperty('kerberosOption'));
   },
 
-  loadRequestIds: function () {
-    var requestIds = this.getDBProperty('requestIds');
-    this.set('content.requestIds', requestIds);
-  },
-
-  saveTasksRequestIds: function (requestIds) {
-    this.setDBProperty('tasksRequestIds',requestIds);
-    this.set('content.tasksRequestIds', requestIds);
-  },
-
-  loadTasksRequestIds: function () {
-    var requestIds = this.getDBProperty('tasksRequestIds');
-    this.set('content.tasksRequestIds', requestIds);
-  },
-
   saveKerberosDescriptorConfigs: function (kerberosDescriptorConfigs) {
     this.setDBProperty('kerberosDescriptorConfigs',kerberosDescriptorConfigs);
     this.kerberosDescriptorConfigs =  kerberosDescriptorConfigs;

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/service/reassign/step4_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/reassign/step4_controller.js b/ambari-web/app/controllers/main/service/reassign/step4_controller.js
index 33111b7..8682eaf 100644
--- a/ambari-web/app/controllers/main/service/reassign/step4_controller.js
+++ b/ambari-web/app/controllers/main/service/reassign/step4_controller.js
@@ -20,12 +20,10 @@ var App = require('app');
 
 App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageController.extend({
 
-  isReassign: true,
-
-  commands: ['stopServices', 'cleanMySqlServer', 'createHostComponents', 'putHostComponentsInMaintenanceMode', 'reconfigure', 'installHostComponents', 'startZooKeeperServers', 'startNameNode', 'deleteHostComponents', 'configureMySqlServer',
-  'startMySqlServer', 'startNewMySqlServer' , 'startServices'],
+  commands: ['stopRequiredServices', 'cleanMySqlServer', 'createHostComponents', 'putHostComponentsInMaintenanceMode', 'reconfigure', 'installHostComponents', 'startZooKeeperServers', 'startNameNode', 'deleteHostComponents', 'configureMySqlServer',
+  'startMySqlServer', 'startNewMySqlServer' , 'startRequiredServices'],
   // custom commands for Components with DB Configuration and Check
-  commandsForDB: ['createHostComponents', 'installHostComponents', 'configureMySqlServer', 'startMySqlServer', 'testDBConnection', 'stopServices', 'cleanMySqlServer', 'putHostComponentsInMaintenanceMode', 'reconfigure', 'deleteHostComponents', 'configureMySqlServer', 'startServices'],
+  commandsForDB: ['createHostComponents', 'installHostComponents', 'configureMySqlServer', 'startMySqlServer', 'testDBConnection', 'stopRequiredServices', 'cleanMySqlServer', 'putHostComponentsInMaintenanceMode', 'reconfigure', 'deleteHostComponents', 'configureMySqlServer', 'startRequiredServices'],
 
   clusterDeployState: 'REASSIGN_MASTER_INSTALLING',
 
@@ -329,9 +327,9 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro
     if (this.get('content.hasManualSteps')) {
       if (this.get('content.reassign.component_name') === 'NAMENODE' && App.get('isHaEnabled')) {
         // Only for reassign NameNode with HA enabled
-        this.removeTasks(['deleteHostComponents', 'startServices']);
+        this.removeTasks(['deleteHostComponents', 'startRequiredServices']);
       } else {
-        this.removeTasks(['startZooKeeperServers', 'startNameNode', 'deleteHostComponents', 'startServices']);
+        this.removeTasks(['startZooKeeperServers', 'startNameNode', 'deleteHostComponents', 'startRequiredServices']);
       }
     } else {
       this.removeTasks(['startZooKeeperServers', 'startNameNode']);
@@ -406,39 +404,10 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro
   },
 
   /**
-   * compute data for call to stop services
-   * @return {Object}
-   */
-  getStopServicesData: function () {
-    var data = {
-      "ServiceInfo": {
-        "state": "INSTALLED"
-      }
-    };
-    var unrelatedServices = this.get('unrelatedServicesMap')[this.get('content.reassign.component_name')];
-    if (unrelatedServices) {
-      var list = App.Service.find().mapProperty("serviceName").filter(function (s) {
-        return !unrelatedServices.contains(s)
-      }).join(',');
-      data.context = "Stop required services";
-      data.urlParams = "ServiceInfo/service_name.in(" + list + ")";
-    } else {
-      data.context = "Stop all services";
-    }
-    return data;
-  },
-
-  /**
    * make server call to stop services
    */
-  stopServices: function () {
-    App.ajax.send({
-      name: 'common.services.update',
-      sender: this,
-      data: this.getStopServicesData(),
-      success: 'startPolling',
-      error: 'onTaskError'
-    });
+  stopRequiredServices: function () {
+    this.stopServices(this.get('unrelatedServicesMap')[this.get('content.reassign.component_name')]);
   },
 
   createHostComponents: function () {
@@ -787,45 +756,13 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro
   /**
    * make server call to start services
    */
-  startServices: function () {
-    App.ajax.send({
-      name: 'common.services.update',
-      sender: this,
-      data: this.getStartServicesData(),
-      success: 'startPolling',
-      error: 'onTaskError'
-    });
-  },
-
-  /**
-   * compute data for call to start services
-   * @return {Object}
-   */
-  getStartServicesData: function () {
+  startRequiredServices: function () {
     var unrelatedServices = this.get('unrelatedServicesMap')[this.get('content.reassign.component_name')];
-    var data = {};
-
     if (unrelatedServices) {
-      var list = App.Service.find().mapProperty("serviceName").filter(function (s) {
-        return !unrelatedServices.contains(s)
-      }).join(',');
-      data = {
-        "context": "Start required services",
-        "ServiceInfo": {
-          "state": "STARTED"
-        },
-        "urlParams": "ServiceInfo/service_name.in(" + list + ")"
-      };
+      this.startServices(false, unrelatedServices);
     } else {
-      data = {
-        "context": "Start all services",
-        "ServiceInfo": {
-          "state": "STARTED"
-        },
-        "urlParams": "params/run_smoke_test=true"
-      };
+      this.startServices(true);
     }
-    return data;
   },
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/service/reassign/step6_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/reassign/step6_controller.js b/ambari-web/app/controllers/main/service/reassign/step6_controller.js
index e3cdab7..b16e2aa 100644
--- a/ambari-web/app/controllers/main/service/reassign/step6_controller.js
+++ b/ambari-web/app/controllers/main/service/reassign/step6_controller.js
@@ -20,9 +20,7 @@ var App = require('app');
 
 App.ReassignMasterWizardStep6Controller = App.HighAvailabilityProgressPageController.extend(App.WizardEnableDone, {
 
-  isReassign: true,
-
-  commands: ['stopMysqlService', 'putHostComponentsInMaintenanceMode', 'deleteHostComponents', 'startServices'],
+  commands: ['stopMysqlService', 'putHostComponentsInMaintenanceMode', 'deleteHostComponents', 'startAllServices'],
 
   clusterDeployState: 'REASSIGN_MASTER_INSTALLING',
 
@@ -109,20 +107,8 @@ App.ReassignMasterWizardStep6Controller = App.HighAvailabilityProgressPageContro
     }
   },
 
-  startServices: function () {
-    App.ajax.send({
-      name: 'common.services.update',
-      sender: this,
-      data: {
-        "context": "Start all services",
-        "ServiceInfo": {
-          "state": "STARTED"
-        },
-        urlParams: "params/run_smoke_test=true"
-      },
-      success: 'startPolling',
-      error: 'onTaskError'
-    });
+  startAllServices: function () {
+    this.startServices(true);
   },
 
   deleteHostComponents: function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/main/service/reassign/step7_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/reassign/step7_controller.js b/ambari-web/app/controllers/main/service/reassign/step7_controller.js
index 2617a6a..9451cd9 100644
--- a/ambari-web/app/controllers/main/service/reassign/step7_controller.js
+++ b/ambari-web/app/controllers/main/service/reassign/step7_controller.js
@@ -20,7 +20,6 @@ var App = require('app');
 
 App.ReassignMasterWizardStep7Controller = App.ReassignMasterWizardStep4Controller.extend({
   name: 'reassignMasterWizardStep7Controller',
-  isReassign: true,
   commands: ['putHostComponentsInMaintenanceMode', 'deleteHostComponents', 'cleanMySqlServer', 'configureMySqlServer', 'startServices'],
   clusterDeployState: 'REASSIGN_MASTER_INSTALLING',
   multiTaskCounter: 0,

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/controllers/wizard.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard.js b/ambari-web/app/controllers/wizard.js
index 0730add..87027b9 100644
--- a/ambari-web/app/controllers/wizard.js
+++ b/ambari-web/app/controllers/wizard.js
@@ -1252,5 +1252,35 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
       this.set('stackConfigsLoaded', true);
     }
     return dfd.promise();
+  },
+
+  saveTasksStatuses: function (tasksStatuses) {
+    this.set('content.tasksStatuses', tasksStatuses);
+    this.setDBProperty('tasksStatuses', tasksStatuses);
+  },
+
+  loadTasksStatuses: function() {
+    var tasksStatuses = this.getDBProperty('tasksStatuses');
+    this.set('content.tasksStatuses', tasksStatuses);
+  },
+
+  saveTasksRequestIds: function (tasksRequestIds) {
+    this.set('content.tasksRequestIds', tasksRequestIds);
+    this.setDBProperty('tasksRequestIds', tasksRequestIds);
+  },
+
+  loadTasksRequestIds: function() {
+    var tasksRequestIds = this.getDBProperty('tasksRequestIds');
+    this.set('content.tasksRequestIds', tasksRequestIds);
+  },
+
+  saveRequestIds: function (requestIds) {
+    this.set('content.requestIds', requestIds);
+    this.setDBProperty('requestIds', requestIds);
+  },
+
+  loadRequestIds: function() {
+    var requestIds = this.getDBProperty('requestIds');
+    this.set('content.requestIds', requestIds);
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 0a0ed35..1d5077e 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -1238,6 +1238,10 @@ Em.I18n.translations = {
   'admin.rm_highAvailability.wizard.step3.configs_changes': '<b>Review Configuration Changes.</b></br>' +
   '<i>policymgr_external_url</i> in admin-properties.xml will be changed by the Wizard to enable Ranger Admin HA',
   'admin.ra_highAvailability.wizard.step4.header': 'Install, Start and Test',
+  'admin.ra_highAvailability.wizard.step4.task0.title': 'Stop Required Services',
+  'admin.ra_highAvailability.wizard.step4.task1.title': 'Install Additional Ranger Admin',
+  'admin.ra_highAvailability.wizard.step4.task2.title': 'Reconfigure Ranger',
+  'admin.ra_highAvailability.wizard.step4.task3.title': 'Start All Services',
   'admin.ra_highAvailability.closePopup':'Enable Ranger Admin HA Wizard is in progress. You must allow the wizard to complete for Ambari to be in usable state. ' +
   'If you choose to quit, you must follow manual instructions to complete or revert enabling Ranger Admin HA as documented in the Ambari User Guide. Are you sure you want to exit the wizard?',
 
@@ -1792,7 +1796,7 @@ Em.I18n.translations = {
   'services.reassign.step3.component':'Component name:',
   'services.reassign.step4.header':'Configure Component',
 
-  'services.reassign.step4.tasks.stopServices.title':'Stop Required Services',
+  'services.reassign.step4.tasks.stopRequiredServices.title':'Stop Required Services',
   'services.reassign.step4.tasks.createHostComponents.title':'Create {0}',
   'services.reassign.step4.tasks.putHostComponentsInMaintenanceMode.title':'Disable {0}',
   'services.reassign.step4.tasks.reconfigure.title':'Reconfigure {0}',
@@ -1801,7 +1805,7 @@ Em.I18n.translations = {
   'services.reassign.step4.tasks.startZooKeeperServers.title':'Start ZooKeeper Servers',
   'services.reassign.step4.tasks.startNameNode.title':'Start NameNode',
   'services.reassign.step4.tasks.deleteHostComponents.title':'Delete disabled {0}',
-  'services.reassign.step4.tasks.startServices.title':'Start Required Services',
+  'services.reassign.step4.tasks.startRequiredServices.title':'Start Required Services',
   'services.reassign.step4.tasks.cleanMySqlServer.title':'Clean MYSQL Server',
   'services.reassign.step4.tasks.testHiveMysqlConnection.title':'Test MYSQL Connection',
   'services.reassign.step4.tasks.configureMySqlServer.title':'Configure MYSQL Server',
@@ -1911,7 +1915,7 @@ Em.I18n.translations = {
   'services.reassign.step6.header': 'Start and Test services',
   'services.reassign.step6.tasks.putHostComponentsInMaintenanceMode.title':'Disable {0}',
   'services.reassign.step6.tasks.deleteHostComponents.title': 'Delete disabled {0}',
-  'services.reassign.step6.tasks.startServices.title': 'Start All Services',
+  'services.reassign.step6.tasks.startAllServices.title': 'Start All Services',
   'services.reassign.step6.tasks.stopMysqlService.title': 'Stop Mysql Server',
   'services.reassign.step6.status.success': 'Successfully moved <b>{0}</b> from <b>{1}</b> host to <b>{2}</b> host.',
   'services.reassign.step6.status.failed': 'Failed to move <b>{0}</b> from <b>{1}</b> host to <b>{2}</b> host.',

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/mixins/wizard/wizardProgressPageController.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/wizard/wizardProgressPageController.js b/ambari-web/app/mixins/wizard/wizardProgressPageController.js
index 74e83cd..d8168a3 100644
--- a/ambari-web/app/mixins/wizard/wizardProgressPageController.js
+++ b/ambari-web/app/mixins/wizard/wizardProgressPageController.js
@@ -387,7 +387,74 @@ App.wizardProgressPageControllerMixin = Em.Mixin.create({
     });
   },
 
-  
+  /**
+   * make server call to stop all services, except <code>excludedServices</code>
+   * @param excludedServices
+   * @returns {$.ajax}
+   */
+  stopServices: function (excludedServices) {
+    var data = {
+      'ServiceInfo': {
+        'state': 'INSTALLED'
+      }
+    };
+
+    if (excludedServices && excludedServices.length) {
+      var servicesList =  App.Service.find().mapProperty("serviceName").filter(function (s) {
+        return !excludedServices.contains(s)
+      }).join(',');
+      data.context = "Stop required services";
+      data.urlParams = "ServiceInfo/service_name.in(" + servicesList + ")";
+    } else {
+      data.context = "Stop all services";
+    }
+
+    return App.ajax.send({
+      name: 'common.services.update',
+      sender: this,
+      data: data,
+      success: 'startPolling',
+      error: 'onTaskError'
+    });
+  },
+
+  /**
+   * make server call to start all services, except <code>excludedServices</code>
+   * and run smoke tests if <code>runSmokeTest</code> is true
+   * @param runSmokeTest
+   * @param excludedServices
+   * @returns {$.ajax}
+   */
+  startServices: function (runSmokeTest, excludedServices) {
+    var data = {
+      'ServiceInfo': {
+        'state': 'STARTED'
+      }
+    };
+
+    if (excludedServices && excludedServices.length) {
+      var servicesList = App.Service.find().mapProperty("serviceName").filter(function (s) {
+        return !excludedServices.contains(s)
+      }).join(',');
+      data.context = "Start required services";
+      data.urlParams = "ServiceInfo/service_name.in(" + servicesList + ")";
+    } else {
+      data.context = "Start all services";
+    }
+
+    if (runSmokeTest) {
+      data.urlParams = data.urlParams ? data.urlParams + '&params/run_smoke_test=true' : 'params/run_smoke_test=true';
+    }
+
+    return App.ajax.send({
+      name: 'common.services.update',
+      sender: this,
+      data: data,
+      success: 'startPolling',
+      error: 'onTaskError'
+    });
+  },
+
   /**
    * Create component on single or multiple hosts.
    *

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/mixins/wizard/wizardProgressPageView.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/wizard/wizardProgressPageView.js b/ambari-web/app/mixins/wizard/wizardProgressPageView.js
index 02eeda4..bc278b9 100644
--- a/ambari-web/app/mixins/wizard/wizardProgressPageView.js
+++ b/ambari-web/app/mixins/wizard/wizardProgressPageView.js
@@ -67,6 +67,12 @@ App.wizardProgressPageViewMixin = Em.Mixin.create({
 
   noticeClass: 'alert alert-info',
 
+  /**
+   * Class to define task label width
+   * @type {String}
+   */
+  labelWidth: 'span4',
+
   onStatusChange: function () {
     var status = this.get('controller.status');
     if (status === 'COMPLETED') {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/routes/ra_high_availability_routes.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/routes/ra_high_availability_routes.js b/ambari-web/app/routes/ra_high_availability_routes.js
index 6fd4b67..fe93992 100644
--- a/ambari-web/app/routes/ra_high_availability_routes.js
+++ b/ambari-web/app/routes/ra_high_availability_routes.js
@@ -106,7 +106,7 @@ module.exports = App.WizardRoute.extend({
         controller.loadAllPriorSteps().done(function(){
           controller.connectOutlet('rAHighAvailabilityWizardStep1', controller.get('content'));
         });
-      })
+      });
     },
     next: function (router) {
       router.get('rAHighAvailabilityWizardController').save('loadBalancerURL');
@@ -123,7 +123,7 @@ module.exports = App.WizardRoute.extend({
         controller.loadAllPriorSteps().done(function(){
           controller.connectOutlet('rAHighAvailabilityWizardStep2', controller.get('content'));
         });
-      })
+      });
     },
     next: function (router) {
       var wizardController = router.get('rAHighAvailabilityWizardController');
@@ -151,7 +151,7 @@ module.exports = App.WizardRoute.extend({
         controller.setCurrentStep('3');
         controller.loadAllPriorSteps().done(function () {
           controller.connectOutlet('rAHighAvailabilityWizardStep3', controller.get('content'));
-        })
+        });
       });
     },
     next: function (router) {
@@ -168,8 +168,11 @@ module.exports = App.WizardRoute.extend({
       var controller = router.get('rAHighAvailabilityWizardController');
       controller.dataLoading().done(function () {
         controller.setCurrentStep('4');
-        controller.connectOutlet('rAHighAvailabilityWizardStep4', controller.get('content'));
-      })
+        controller.setLowerStepsDisable(4);
+        controller.loadAllPriorSteps().done(function () {
+          controller.connectOutlet('rAHighAvailabilityWizardStep4', controller.get('content'));
+        });
+      });
     },
     next: function (router) {
       router.get('updateController').set('isWorking', true);
@@ -186,9 +189,6 @@ module.exports = App.WizardRoute.extend({
           //location.reload();
         }
       });
-    },
-    back: function (router) {
-      router.transitionTo('step3');
     }
   })
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/templates/common/progress.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/progress.hbs b/ambari-web/app/templates/common/progress.hbs
index 5f5c38d..8e122cb 100644
--- a/ambari-web/app/templates/common/progress.hbs
+++ b/ambari-web/app/templates/common/progress.hbs
@@ -29,7 +29,7 @@
     {{#each task in controller.tasks}}
       {{#view view.taskView contentBinding="task"}}
         <div class="item">
-          <div {{bindAttr class=":pull-left view.linkClass isKerberosWizard:span4 controller.isHA:span4 controller.isRMHA:span5 controller.isRollback:span3 controller.isReassign:span5"}}>
+          <div {{bindAttr class=":pull-left view.linkClass view.parentView.labelWidth"}}>
             <i {{bindAttr class="view.icon view.iconColor"}}></i>
             <a {{action "showHostProgressPopup" task target="controller"}} >{{task.title}}</a>
           </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/templates/main/admin/highAvailability/progress.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/highAvailability/progress.hbs b/ambari-web/app/templates/main/admin/highAvailability/progress.hbs
deleted file mode 100644
index 2dfd7f6..0000000
--- a/ambari-web/app/templates/main/admin/highAvailability/progress.hbs
+++ /dev/null
@@ -1,64 +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="ha-progress-page">
-  <h2>{{view.headerTitle}}</h2>
-
-  <div {{bindAttr class="view.noticeClass"}}>{{{view.notice}}}</div>
-  {{#each task in controller.tasks}}
-  {{#view view.taskView contentBinding="task"}}
-    <div class="item">
-      <div {{bindAttr class=":pull-left view.linkClass controller.isHA:span4 controller.isRMHA:span5 controller.isRollback:span3 controller.isReassign:span5"}}>
-        <i {{bindAttr class="view.icon view.iconColor"}}></i>
-        <a {{action "showHostProgressPopup" task target="controller"}} >{{task.title}}</a>
-      </div>
-      <div {{bindAttr class="view.showProgressBar::hide :row :span5 :pull-left" }}>
-        <div {{bindAttr class=":progress-bar controller.isRollback::span8 controller.isRollback:span3"}}>
-          <div class="progress-striped active progress-info progress">
-            <div class="bar" {{bindAttr style="view.barWidth"}}></div>
-          </div>
-        </div>
-        <div {{bindAttr class=":span1 view.hidePercent:noDisplay"}}>{{task.progress}}&#37;</div>
-      </div>
-      <div>
-      {{#if task.showRetry}}
-        <a {{action retryTask target="controller"}} class="btn btn-primary retry"
-           rel="tooltip" data-trigger="click" {{bindAttr title="view.showDBTooltip:testDBRetryTooltip"}}>
-          <i class="icon-repeat icon-white"></i>
-          {{t common.retry}}
-        </a>
-      {{/if}}
-      {{#if task.showRollback}}
-        <a {{action rollback target="controller"}} class="btn btn-primary retry">
-          <i class="icon-repeat icon-white"></i>
-          {{t common.rollBack}}
-        </a>
-      {{/if}}
-      {{#if task.showSkip}}
-        <a {{action skipTask target="controller"}} class="btn btn-primary retry">
-          <i class="icon-step-forward icon-white"></i>
-          {{t common.skip}}
-        </a>
-      {{/if}}
-      </div>
-    </div>
-  {{/view}}
-  {{/each}}
-  <div class="btn-area">
-    <button class="btn btn-success pull-right" {{bindAttr disabled="controller.isSubmitDisabled"}} {{action done target="controller"}}>{{view.submitButtonText}}</button>
-  </div>
-</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/templates/main/admin/highAvailability/rangerAdmin/step4.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/highAvailability/rangerAdmin/step4.hbs b/ambari-web/app/templates/main/admin/highAvailability/rangerAdmin/step4.hbs
index 1ba7cc5..08dc3b9 100644
--- a/ambari-web/app/templates/main/admin/highAvailability/rangerAdmin/step4.hbs
+++ b/ambari-web/app/templates/main/admin/highAvailability/rangerAdmin/step4.hbs
@@ -15,7 +15,4 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 }}
-<div class="btn-area">
-  <a class="btn" {{action back}}>&larr; {{t common.back}}</a>
-  <a class="btn btn-success pull-right" {{action next}}>{{t common.next}} &rarr;</a>
-</div>
+{{template "templates/common/progress"}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/views/main/admin/highAvailability/rangerAdmin/step4_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin/highAvailability/rangerAdmin/step4_view.js b/ambari-web/app/views/main/admin/highAvailability/rangerAdmin/step4_view.js
index cd3b9b1..0fc5a6e 100644
--- a/ambari-web/app/views/main/admin/highAvailability/rangerAdmin/step4_view.js
+++ b/ambari-web/app/views/main/admin/highAvailability/rangerAdmin/step4_view.js
@@ -19,8 +19,16 @@
 
 var App = require('app');
 
-App.RAHighAvailabilityWizardStep4View = Em.View.extend({
+App.RAHighAvailabilityWizardStep4View = App.HighAvailabilityProgressPageView.extend({
 
-  templateName: require('templates/main/admin/highAvailability/rangerAdmin/step4')
+  templateName: require('templates/main/admin/highAvailability/rangerAdmin/step4'),
 
-});
+  headerTitle: Em.I18n.t('admin.ra_highAvailability.wizard.step4.header'),
+
+  noticeInProgress: Em.I18n.t('admin.rm_highAvailability.wizard.step4.notice.inProgress'),
+
+  noticeCompleted: Em.I18n.t('admin.rm_highAvailability.wizard.step4.notice.completed'),
+
+  submitButtonText: Em.I18n.t('common.complete')
+
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/views/main/admin/highAvailability/resourceManager/step4_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin/highAvailability/resourceManager/step4_view.js b/ambari-web/app/views/main/admin/highAvailability/resourceManager/step4_view.js
index a2f8b2b..a257d1a 100644
--- a/ambari-web/app/views/main/admin/highAvailability/resourceManager/step4_view.js
+++ b/ambari-web/app/views/main/admin/highAvailability/resourceManager/step4_view.js
@@ -29,6 +29,8 @@ App.RMHighAvailabilityWizardStep4View = App.HighAvailabilityProgressPageView.ext
 
   noticeCompleted: Em.I18n.t('admin.rm_highAvailability.wizard.step4.notice.completed'),
 
-  submitButtonText: Em.I18n.t('common.complete')
+  submitButtonText: Em.I18n.t('common.complete'),
+
+  labelWidth: 'span5'
 
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/views/main/service/reassign/step4_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/reassign/step4_view.js b/ambari-web/app/views/main/service/reassign/step4_view.js
index 3ffdb4b..132c29e 100644
--- a/ambari-web/app/views/main/service/reassign/step4_view.js
+++ b/ambari-web/app/views/main/service/reassign/step4_view.js
@@ -47,5 +47,7 @@ App.ReassignMasterWizardStep4View = App.HighAvailabilityProgressPageView.extend(
     }
   }.property('controller.content.hasManualSteps'),
 
-  templateName: require('templates/main/service/reassign/step4')
+  templateName: require('templates/main/service/reassign/step4'),
+
+  labelWidth: 'span5'
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/views/main/service/reassign/step6_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/reassign/step6_view.js b/ambari-web/app/views/main/service/reassign/step6_view.js
index 4833ab7..9c718e9 100644
--- a/ambari-web/app/views/main/service/reassign/step6_view.js
+++ b/ambari-web/app/views/main/service/reassign/step6_view.js
@@ -37,5 +37,7 @@ App.ReassignMasterWizardStep6View = App.HighAvailabilityProgressPageView.extend(
 
   submitButtonText: Em.I18n.t('common.complete'),
 
-  templateName: require('templates/main/service/reassign/step6')
+  templateName: require('templates/main/service/reassign/step6'),
+
+  labelWidth: 'span5'
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/app/views/main/service/reassign/step7_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/reassign/step7_view.js b/ambari-web/app/views/main/service/reassign/step7_view.js
index 2e5f470..0eacb0c 100644
--- a/ambari-web/app/views/main/service/reassign/step7_view.js
+++ b/ambari-web/app/views/main/service/reassign/step7_view.js
@@ -39,5 +39,7 @@ App.ReassignMasterWizardStep7View = App.HighAvailabilityProgressPageView.extend(
     return Em.I18n.t('common.complete') + ' &rarr;';
   }.property(),
 
-  templateName: require('templates/main/service/reassign/step7')
+  templateName: require('templates/main/service/reassign/step7'),
+
+  labelWidth: 'span5'
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/test/controllers/main/admin/highAvailability/progress_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/highAvailability/progress_controller_test.js b/ambari-web/test/controllers/main/admin/highAvailability/progress_controller_test.js
index ff54663..1c4d584 100644
--- a/ambari-web/test/controllers/main/admin/highAvailability/progress_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/highAvailability/progress_controller_test.js
@@ -30,9 +30,6 @@ describe('App.HighAvailabilityProgressPageController', function () {
   describe('#reconfigureSites()', function () {
     var tests = [
       {
-        content: {
-          controllerName: "rMHighAvailabilityWizardController"
-        },
         siteNames: ["site1", "site2"],
         data: {
           items: [
@@ -63,6 +60,7 @@ describe('App.HighAvailabilityProgressPageController', function () {
             }
           ]
         },
+        note: 'note1',
         result: [
           {
             type: "site1",
@@ -71,7 +69,7 @@ describe('App.HighAvailabilityProgressPageController', function () {
               site1_property1: "site1_property1_value",
               site1_property2: "site1_property2_value"
             },
-            service_config_version_note: Em.I18n.t('admin.highAvailability.step4.save.configuration.note').format("ResourceManager"),
+            service_config_version_note: 'note1',
             properties_attributes: {
               final: {
                 site1_property1: "true"
@@ -85,14 +83,11 @@ describe('App.HighAvailabilityProgressPageController', function () {
               site2_property1: "site2_property1_value",
               site2_property2: "site2_property2_value"
             },
-            service_config_version_note: Em.I18n.t('admin.highAvailability.step4.save.configuration.note').format("ResourceManager")
+            service_config_version_note: 'note1'
           }
         ]
       },
       {
-        content: {
-          controllerName: "anyOther"
-        },
         siteNames: ["site1"],
         data: {
           items: [
@@ -110,6 +105,7 @@ describe('App.HighAvailabilityProgressPageController', function () {
             }
           ]
         },
+        note: 'note2',
         result: [
           {
             type: "site1",
@@ -118,7 +114,7 @@ describe('App.HighAvailabilityProgressPageController', function () {
               site1_property1: "site1_property1_value",
               site1_property2: "site1_property2_value"
             },
-            service_config_version_note: Em.I18n.t('admin.highAvailability.step4.save.configuration.note').format("NameNode"),
+            service_config_version_note: 'note2',
             properties_attributes: {
               final: {
                 site1_property1: "true"
@@ -136,7 +132,7 @@ describe('App.HighAvailabilityProgressPageController', function () {
     it("reconfigures configs after HA", function() {
       tests.forEach(function(t) {
         controller.set('content', t.content);
-        expect(controller.reconfigureSites(t.siteNames, t.data)).to.eql(t.result);
+        expect(controller.reconfigureSites(t.siteNames, t.data, t.note)).to.eql(t.result);
       });
     });
   });

http://git-wip-us.apache.org/repos/asf/ambari/blob/e9430b16/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js b/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js
index 8c4233f..4b26a87 100644
--- a/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js
+++ b/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js
@@ -130,7 +130,7 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
       });
 
       controller.set('tasks', [
-        {id: 1, command: 'stopServices'},
+        {id: 1, command: 'stopRequiredServices'},
         {id: 2, command: 'cleanMySqlServer'},
         {id: 3, command: 'createHostComponents'},
         {id: 4, command: 'putHostComponentsInMaintenanceMode'},
@@ -141,7 +141,7 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
         {id: 9, command: 'deleteHostComponents'},
         {id: 10, command: 'configureMySqlServer'},
         {id: 11, command: 'startMySqlServer'},
-        {id: 12, command: 'startServices'}
+        {id: 12, command: 'startRequiredServices'}
       ]);
     });
 
@@ -317,49 +317,10 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
     });
   });
 
-  describe('#getStopServicesData()', function () {
-    it('restarting YARN component', function () {
-      controller.set('content.reassign.component_name', 'RESOURCEMANAGER');
-      sinon.stub(App.Service, 'find', function () {
-        return [
-          {
-            serviceName: 'HDFS'
-          },
-          {
-            serviceName: 'SERVICE1'
-          }
-        ];
-      });
-
-      expect(controller.getStopServicesData()).to.eql({
-        "ServiceInfo": {
-          "state": "INSTALLED"
-        },
-        "context": "Stop required services",
-        "urlParams": "ServiceInfo/service_name.in(SERVICE1)"
-      });
-      App.Service.find.restore();
-    });
-    it('restarting non-YARN component', function () {
-      controller.set('content.reassign.component_name', 'NAMENODE');
-      expect(controller.getStopServicesData()).to.eql({
-        "ServiceInfo": {
-          "state": "INSTALLED"
-        },
-        "context": "Stop all services"
-      });
-    });
-  });
-
   describe('#stopServices()', function () {
     it('', function () {
-      sinon.stub(controller, 'getStopServicesData', Em.K);
-
       controller.stopServices();
       expect(App.ajax.send.calledOnce).to.be.true;
-      expect(controller.getStopServicesData.calledOnce).to.be.true;
-
-      controller.getStopServicesData.restore();
     });
   });
 
@@ -1008,61 +969,12 @@ describe('App.ReassignMasterWizardStep4Controller', function () {
   });
 
   describe('#startServices()', function () {
-    beforeEach(function () {
-      sinon.stub(controller, 'getStartServicesData', Em.K);
-    });
-    afterEach(function () {
-      controller.getStartServicesData.restore();
-    });
-
     it('', function () {
       controller.startServices();
-      expect(controller.getStartServicesData.calledOnce).to.be.true;
       expect(App.ajax.send.calledOnce).to.be.true;
     });
   });
 
-  describe('#getStartServicesData()', function () {
-    beforeEach(function () {
-      sinon.stub(App.Service, 'find', function () {
-        return [
-          {serviceName: 'SERVICE1'},
-          {serviceName: 'SERVICE2'}
-        ]
-      })
-    });
-    afterEach(function () {
-      App.Service.find.restore();
-    });
-
-    it('No unrelated services', function () {
-      controller.set('unrelatedServicesMap', {
-        'COMP1': ['SERVICE1']
-      });
-      controller.set('content.reassign.component_name', 'COMP2');
-      expect(controller.getStartServicesData()).to.eql({
-        "context": "Start all services",
-        "ServiceInfo": {
-          "state": "STARTED"
-        },
-        "urlParams": "params/run_smoke_test=true"
-      });
-    });
-    it('Present unrelated services', function () {
-      controller.set('unrelatedServicesMap', {
-        'COMP1': ['SERVICE1']
-      });
-      controller.set('content.reassign.component_name', 'COMP1');
-      expect(controller.getStartServicesData()).to.eql({
-        "context": "Start required services",
-        "ServiceInfo": {
-          "state": "STARTED"
-        },
-        "urlParams": "ServiceInfo/service_name.in(SERVICE2)"
-      });
-    });
-  });
-
   describe('#deleteHostComponents()', function () {
 
     it('No host components', function () {