瀏覽代碼

AMBARI-3492. Reassign Master Wizard: move HA NameNode in 2.x stack (non-secure). (akovalenko)

Aleksandr Kovalenko 11 年之前
父節點
當前提交
a0dd6770e2
共有 31 個文件被更改,包括 287 次插入140 次删除
  1. 6 5
      ambari-web/app/controllers.js
  2. 2 0
      ambari-web/app/controllers/main/admin/highAvailability/step5_controller.js
  3. 2 0
      ambari-web/app/controllers/main/admin/highAvailability/step7_controller.js
  4. 2 0
      ambari-web/app/controllers/main/admin/highAvailability/step9_controller.js
  5. 1 1
      ambari-web/app/controllers/main/service/item.js
  6. 2 1
      ambari-web/app/controllers/main/service/reassign/step1_controller.js
  7. 46 0
      ambari-web/app/controllers/main/service/reassign/step2_controller.js
  8. 1 2
      ambari-web/app/controllers/main/service/reassign/step3_controller.js
  9. 27 10
      ambari-web/app/controllers/main/service/reassign/step4_controller.js
  10. 1 1
      ambari-web/app/controllers/main/service/reassign/step5_controller.js
  11. 6 3
      ambari-web/app/controllers/main/service/reassign/step6_controller.js
  12. 11 0
      ambari-web/app/controllers/main/service/reassign_controller.js
  13. 9 3
      ambari-web/app/controllers/wizard/step5_controller.js
  14. 50 48
      ambari-web/app/messages.js
  15. 27 12
      ambari-web/app/routes/reassign_master_routes.js
  16. 1 1
      ambari-web/app/templates/main/admin/highAvailability/progress.hbs
  17. 6 6
      ambari-web/app/templates/main/service/reassign.hbs
  18. 1 1
      ambari-web/app/templates/main/service/reassign/step1.hbs
  19. 5 5
      ambari-web/app/templates/main/service/reassign/step3.hbs
  20. 0 0
      ambari-web/app/templates/main/service/reassign/step4.hbs
  21. 1 1
      ambari-web/app/templates/main/service/reassign/step5.hbs
  22. 0 0
      ambari-web/app/templates/main/service/reassign/step6.hbs
  23. 11 0
      ambari-web/app/utils/db.js
  24. 6 5
      ambari-web/app/views.js
  25. 8 3
      ambari-web/app/views/main/service/item.js
  26. 26 0
      ambari-web/app/views/main/service/reassign/step1_view.js
  27. 1 5
      ambari-web/app/views/main/service/reassign/step2_view.js
  28. 10 9
      ambari-web/app/views/main/service/reassign/step3_view.js
  29. 7 7
      ambari-web/app/views/main/service/reassign/step4_view.js
  30. 5 5
      ambari-web/app/views/main/service/reassign/step5_view.js
  31. 6 6
      ambari-web/app/views/main/service/reassign/step6_view.js

+ 6 - 5
ambari-web/app/controllers.js

@@ -62,6 +62,12 @@ require('controllers/main/service/info/configs');
 require('controllers/main/service/info/audit');
 require('controllers/main/service/add_controller');
 require('controllers/main/service/reassign_controller');
+require('controllers/main/service/reassign/step1_controller');
+require('controllers/main/service/reassign/step2_controller');
+require('controllers/main/service/reassign/step3_controller');
+require('controllers/main/service/reassign/step4_controller');
+require('controllers/main/service/reassign/step5_controller');
+require('controllers/main/service/reassign/step6_controller');
 require('controllers/main/host');
 require('controllers/main/host/details');
 require('controllers/main/host/configs_service');
@@ -114,11 +120,6 @@ require('controllers/wizard/step7_controller');
 require('controllers/wizard/step8_controller');
 require('controllers/wizard/step9_controller');
 require('controllers/wizard/step10_controller');
-require('controllers/wizard/step11_controller');
-require('controllers/wizard/step12_controller');
-require('controllers/wizard/step13_controller');
-require('controllers/wizard/step14_controller');
-require('controllers/wizard/step15_controller');
 require('controllers/wizard/stack_upgrade/step1_controller');
 require('controllers/wizard/stack_upgrade/step2_controller');
 require('controllers/wizard/stack_upgrade/step3_controller');

+ 2 - 0
ambari-web/app/controllers/main/admin/highAvailability/step5_controller.js

@@ -22,6 +22,8 @@ App.HighAvailabilityWizardStep5Controller = App.HighAvailabilityProgressPageCont
 
   name:"highAvailabilityWizardStep5Controller",
 
+  isHA: true,
+
   commands: ['stopAllServices', 'installNameNode', 'installJournalNodes', 'startJournalNodes', 'disableSNameNode', 'reconfigureHDFS'],
 
   hdfsSiteTag : "",

+ 2 - 0
ambari-web/app/controllers/main/admin/highAvailability/step7_controller.js

@@ -22,6 +22,8 @@ App.HighAvailabilityWizardStep7Controller = App.HighAvailabilityProgressPageCont
 
   name:"highAvailabilityWizardStep7Controller",
 
+  isHA: true,
+
   commands: ['startZooKeeperServers', 'startNameNode'],
 
   startZooKeeperServers: function () {

+ 2 - 0
ambari-web/app/controllers/main/admin/highAvailability/step9_controller.js

@@ -22,6 +22,8 @@ App.HighAvailabilityWizardStep9Controller = App.HighAvailabilityProgressPageCont
 
   name:"highAvailabilityWizardStep9Controller",
 
+  isHA: true,
+
   commands: ['startSecondNameNode', 'installZKFC', 'startZKFC', 'reconfigureHBase', 'startAllServices', 'deleteSNameNode'],
 
   hbaseSiteTag: "",

+ 1 - 1
ambari-web/app/controllers/main/service/item.js

@@ -198,7 +198,7 @@ App.MainServiceItemController = Em.Controller.extend({
    * @param hostComponent
    */
   reassignMaster: function (hostComponent) {
-    var component = App.HostComponent.find().findProperty('componentName', hostComponent.get('componentName'));
+    var component = App.HostComponent.find().findProperty('componentName', hostComponent);
     console.log('In Reassign Master', hostComponent);
     var reassignMasterController = App.router.get('reassignMasterController');
     reassignMasterController.saveComponentToReassign(component);

+ 2 - 1
ambari-web/app/controllers/wizard/step12_controller.js → ambari-web/app/controllers/main/service/reassign/step1_controller.js

@@ -18,4 +18,5 @@
 
 var App = require('app');
 
-App.WizardStep12Controller = Em.Controller.extend()
+App.ReassignMasterWizardStep1Controller = Em.Controller.extend();
+

+ 46 - 0
ambari-web/app/controllers/main/service/reassign/step2_controller.js

@@ -0,0 +1,46 @@
+/**
+ * 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.ReassignMasterWizardStep2Controller = App.WizardStep5Controller.extend({
+
+  loadStep: function() {
+    this._super();
+    this.rebalanceComponentHosts('NAMENODE');
+  },
+
+  loadComponents: function () {
+    var components = this.get('components').filterProperty('isMaster', true);
+    var masterComponents = this.get('content.masterComponentHosts');
+    var result = [];
+    masterComponents.forEach(function (master) {
+      result.push({
+        component_name: master.component,
+        display_name: App.format.role(master.component),
+        selectedHost: master.hostName,
+        isInstalled: true,
+        serviceId: App.HostComponent.find().findProperty('componentName', master.component).get('serviceName'),
+        availableHosts: [],
+        isHiveCoHost: ['HIVE_METASTORE', 'WEBHCAT_SERVER'].contains(master.component)
+      });
+    }, this);
+    return result;
+  }
+});
+

+ 1 - 2
ambari-web/app/controllers/wizard/step11_controller.js → ambari-web/app/controllers/main/service/reassign/step3_controller.js

@@ -18,5 +18,4 @@
 
 var App = require('app');
 
-App.WizardStep11Controller = Em.Controller.extend();
-
+App.ReassignMasterWizardStep3Controller = Em.Controller.extend()

+ 27 - 10
ambari-web/app/controllers/wizard/step13_controller.js → ambari-web/app/controllers/main/service/reassign/step4_controller.js

@@ -18,7 +18,9 @@
 
 var App = require('app');
 
-App.WizardStep13Controller = App.HighAvailabilityProgressPageController.extend({
+App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageController.extend({
+
+  isReassign: true,
 
   commands: ['stopServices', 'createHostComponents', 'putHostComponentsInMaintenanceMode', 'reconfigure', 'installHostComponents', 'deleteHostComponents', 'startServices'],
 
@@ -31,7 +33,11 @@ App.WizardStep13Controller = App.HighAvailabilityProgressPageController.extend({
   serviceNames: [],
 
   loadStep: function () {
-    this.get('hostComponents').pushObject(this.get('content.reassign.component_name'));
+    if (this.get('content.reassign.component_name') === 'NAMENODE' && !App.HostComponent.find().someProperty('componentName', 'SECONDARY_NAMENODE')) {
+      this.get('hostComponents').pushObjects(['NAMENODE', 'ZKFC']);
+    } else {
+      this.get('hostComponents').pushObject(this.get('content.reassign.component_name'));
+    }
     this.get('serviceNames').pushObject(this.get('content.reassign.service_id'));
     this._super();
   },
@@ -50,7 +56,7 @@ App.WizardStep13Controller = App.HighAvailabilityProgressPageController.extend({
       serviceNames += App.Service.find().findProperty('serviceName', service).get('displayName');
     }, this);
     for (var i = 0; i < commands.length; i++) {
-      var title = Em.I18n.t('installer.step13.task' + i + '.title').format(hostComponentsNames, serviceNames);
+      var title = Em.I18n.t('services.reassign.step4.task' + i + '.title').format(hostComponentsNames, serviceNames);
       this.get('tasks').pushObject(Ember.Object.create({
         title: title,
         status: 'PENDING',
@@ -106,7 +112,7 @@ App.WizardStep13Controller = App.HighAvailabilityProgressPageController.extend({
   createHostComponents: function () {
     this.set('multiTaskCounter', 0);
     var hostComponents = this.get('hostComponents');
-    var hostName = this.get('content.masterComponentHosts').findProperty('component', this.get('content.reassign.component_name')).hostName;
+    var hostName = this.get('content.reassignHosts.target');
     for (var i = 0; i < hostComponents.length; i++) {
       this.createComponent(hostComponents[i], hostName);
     }
@@ -119,7 +125,7 @@ App.WizardStep13Controller = App.HighAvailabilityProgressPageController.extend({
   putHostComponentsInMaintenanceMode: function () {
     this.set('multiTaskCounter', 0);
     var hostComponents = this.get('hostComponents');
-    var hostName = this.get('content.reassign.host_id');
+    var hostName = this.get('content.reassignHosts.source');
     for (var i = 0; i < hostComponents.length; i++) {
       App.ajax.send({
         name: 'reassign.maintenance_mode',
@@ -137,7 +143,7 @@ App.WizardStep13Controller = App.HighAvailabilityProgressPageController.extend({
   installHostComponents: function () {
     this.set('multiTaskCounter', 0);
     var hostComponents = this.get('hostComponents');
-    var hostName = this.get('content.masterComponentHosts').findProperty('component', this.get('content.reassign.component_name')).hostName;
+    var hostName = this.get('content.reassignHosts.target');
     for (var i = 0; i < hostComponents.length; i++) {
       this.installComponent(hostComponents[i], hostName, hostComponents.length);
     }
@@ -196,7 +202,8 @@ App.WizardStep13Controller = App.HighAvailabilityProgressPageController.extend({
   onLoadConfigs: function (data) {
     var isHadoop2Stack = App.get('isHadoop2Stack');
     var componentName = this.get('content.reassign.component_name');
-    var targetHostName = this.get('content.masterComponentHosts').findProperty('component', this.get('content.reassign.component_name')).hostName;
+    var targetHostName = this.get('content.reassignHosts.target');
+    var sourceHostName = this.get('content.reassignHosts.source');
     var configs = {};
     var componentDir = '';
     this.set('configsSitesNumber', data.items.length);
@@ -210,13 +217,23 @@ App.WizardStep13Controller = App.HighAvailabilityProgressPageController.extend({
           componentDir = configs['hdfs-site']['dfs.namenode.name.dir'];
           configs['hdfs-site']['dfs.namenode.http-address'] = targetHostName + ':50070';
           configs['hdfs-site']['dfs.namenode.https-address'] = targetHostName + ':50470';
+          configs['core-site']['fs.defaultFS'] = 'hdfs://' + targetHostName + ':8020';
+          if (!App.HostComponent.find().someProperty('componentName', 'SECONDARY_NAMENODE')) {
+            var nameServices = configs['hdfs-site']['dfs.nameservices'];
+            if (configs['hdfs-site']['dfs.namenode.http-address.' + nameServices + '.nn1'] === sourceHostName + ':50070') {
+              configs['hdfs-site']['dfs.namenode.http-address.' + nameServices + '.nn1'] = targetHostName + ':50070';
+              configs['hdfs-site']['dfs.namenode.rpc-address.' + nameServices + '.nn1'] = targetHostName + ':8020';
+            } else {
+              configs['hdfs-site']['dfs.namenode.http-address.' + nameServices + '.nn2'] = targetHostName + ':50070';
+              configs['hdfs-site']['dfs.namenode.rpc-address.' + nameServices + '.nn2'] = targetHostName + ':8020';
+            }
+          }
         } else {
           componentDir = configs['hdfs-site']['dfs.name.dir'];
           configs['hdfs-site']['dfs.http.address'] = targetHostName + ':50070';
           configs['hdfs-site']['dfs.https.address'] = targetHostName + ':50470';
+          configs['core-site']['fs.default.name'] = 'hdfs://' + targetHostName + ':8020';
         }
-        configs['core-site']['fs.default.name'] = 'hdfs://' + targetHostName + ':8020';
-        configs['hdfs-site']['dfs.safemode.threshold.pct'] = '1.1f';
         if (App.Service.find().someProperty('serviceName', 'HBASE')) {
           configs['hbase-site']['hbase.rootdir'] = configs['hbase-site']['hbase.rootdir'].replace(/\/\/[^\/]*/, '//' + targetHostName);
         }
@@ -292,7 +309,7 @@ App.WizardStep13Controller = App.HighAvailabilityProgressPageController.extend({
   deleteHostComponents: function () {
     this.set('multiTaskCounter', 0);
     var hostComponents = this.get('hostComponents');
-    var hostName = this.get('content.reassign.host_id');
+    var hostName = this.get('content.reassignHosts.source');
     for (var i = 0; i < hostComponents.length; i++) {
       App.ajax.send({
         name: 'reassign.remove_component',

+ 1 - 1
ambari-web/app/controllers/wizard/step14_controller.js → ambari-web/app/controllers/main/service/reassign/step5_controller.js

@@ -18,6 +18,6 @@
 
 var App = require('app');
 
-App.WizardStep14Controller = Em.Controller.extend({
+App.ReassignMasterWizardStep5Controller = Em.Controller.extend({
 
 })

+ 6 - 3
ambari-web/app/controllers/wizard/step15_controller.js → ambari-web/app/controllers/main/service/reassign/step6_controller.js

@@ -18,7 +18,10 @@
 
 var App = require('app');
 
-App.WizardStep15Controller = App.HighAvailabilityProgressPageController.extend({
+App.ReassignMasterWizardStep6Controller = App.HighAvailabilityProgressPageController.extend({
+
+  isReassign: true,
+
   commands: ['deleteHostComponents', 'startServices'],
 
   clusterDeployState: 'REASSIGN_MASTER_INSTALLING',
@@ -27,7 +30,7 @@ App.WizardStep15Controller = App.HighAvailabilityProgressPageController.extend({
     var commands = this.get('commands');
     var currentStep = App.router.get('reassignMasterController.currentStep');
     for (var i = 0; i < commands.length; i++) {
-      var title = Em.I18n.t('installer.step15.task' + i + '.title').format(App.format.role(this.get('content.reassign.component_name')),
+      var title = Em.I18n.t('services.reassign.step6.task' + i + '.title').format(App.format.role(this.get('content.reassign.component_name')),
           App.Service.find().findProperty('serviceName', this.get('content.reassign.service_id')).get('displayName'));
       this.get('tasks').pushObject(Ember.Object.create({
         title: title,
@@ -67,7 +70,7 @@ App.WizardStep15Controller = App.HighAvailabilityProgressPageController.extend({
   },
 
   deleteHostComponents: function () {
-    var hostName = this.get('content.reassign.host_id');
+    var hostName = this.get('content.reassignHosts.source');
     App.ajax.send({
       name: 'reassign.remove_component',
       sender: this,

+ 11 - 0
ambari-web/app/controllers/main/service/reassign_controller.js

@@ -236,6 +236,16 @@ App.ReassignMasterController = App.WizardController.extend({
     this.set('content.componentDir', componentDir);
   },
 
+  saveReassignHosts: function(reassignHosts){
+    App.db.setReassignMasterWizardReassignHosts(reassignHosts);
+    this.set('content.reassignHosts', reassignHosts);
+  },
+
+  loadReassignHosts: function(){
+    var reassignHosts = App.db.getReassignMasterWizardReassignHosts();
+    this.set('content.reassignHosts', reassignHosts);
+  },
+
   /**
    * Load data for all steps until <code>current step</code>
    */
@@ -250,6 +260,7 @@ App.ReassignMasterController = App.WizardController.extend({
         this.loadRequestIds();
         this.loadLogs();
       case '3':
+        this.loadReassignHosts();
       case '2':
         this.loadServicesFromServer();
         this.loadMasterComponentHosts();

+ 9 - 3
ambari-web/app/controllers/wizard/step5_controller.js

@@ -37,19 +37,22 @@ App.WizardStep5Controller = Em.Controller.extend({
     return this.get('servicesMasters').objectAt(0) && this.get('servicesMasters').objectAt(0).component_name == 'HIVE_SERVER' && this.get('isReassignWizard');
   }.property('isReassignWizard', 'servicesMasters'),
 
+  /**
+   * Define state for submit button. Return true only for Reassign Master Wizard and if more than one master component was reassigned.
+   */
   isSubmitDisabled: function () {
     if (!this.get('isReassignWizard')) {
       return false;
     }
-    var reassigned = false;
+    var reassigned = 0;
     var arr1 = App.HostComponent.find().filterProperty('componentName', this.get('content.reassign.component_name')).mapProperty('host.hostName');
     var arr2 = this.get('servicesMasters').mapProperty('selectedHost');
     arr1.forEach(function (host) {
       if (!arr2.contains(host)) {
-        reassigned = true;
+        reassigned++;
       }
     }, this);
-    return !reassigned;
+    return reassigned !== 1;
   }.property('servicesMasters.@each.selectedHost'),
 
   hosts:[],
@@ -222,6 +225,7 @@ App.WizardStep5Controller = Em.Controller.extend({
     var showRemoveControlHb = !services.contains('HBASE') && masterComponents.filterProperty('component_name', 'HBASE_MASTER').length > 1;
     var zid = 1;
     var hid = 1;
+    var nid = 1;
     var result = [];
 
     masterComponents.forEach(function (item) {
@@ -235,6 +239,8 @@ App.WizardStep5Controller = Em.Controller.extend({
       } else if (App.supports.multipleHBaseMasters && item.component_name === "HBASE_MASTER") {
         componentObj.set('zId', hid++);
         componentObj.set("showRemoveControl", showRemoveControlHb);
+      }  else if (item.component_name === "NAMENODE") {
+        componentObj.set('zId', nid++);
       }
       componentObj.set("availableHosts", this.get("hosts"));
       result.push(componentObj);

+ 50 - 48
ambari-web/app/messages.js

@@ -548,54 +548,7 @@ Em.I18n.translations = {
   'installer.step10.startStatus.started':'All services started',
   'installer.step10.installTime.seconds':'Install and start completed in {0} seconds',
   'installer.step10.installTime.minutes':'Install and start completed in {0} minutes and {1} seconds',
-  'installer.step11.header':'Prerequisites',
-  'installer.step12.header':'Review',
-  'installer.step12.body':'Please review the changes you made',
-  'installer.step12.targetHost':'Target Host:',
-  'installer.step12.sourceHost':'Source Host:',
-  'installer.step12.component':'Component name:',
-  'installer.step13.header':'Install, Start and Test',
-  'installer.step13.task0.title':'{1} stop',
-  'installer.step13.task1.title':'{0} create',
-  'installer.step13.task2.title':'{0} disable',
-  'installer.step13.task3.title':'{1} reconfigure',
-  'installer.step13.task4.title':'{0} install',
-  'installer.step13.task5.title':'{1} remove',
-  'installer.step13.task6.title':'{0} start',
-  'installer.step13.status.success': 'Successfully reassigned {0}',
-  'installer.step13.status.success.withManualSteps': 'Proceed to the next step',
-  'installer.step13.status.failed': 'Failed to reassign {0}',
-  'installer.step13.status.info': 'Reassigning {0}. \nPlease wait while all tasks will be completed.',
-  'installer.step13.retry': 'You can click on the Retry or Abort button to retry failed task or abort changes',
-  'installer.step13.abortError': 'Error in aborting changes.',
-  'installer.step14.header': 'Manual commands',
-  'installer.step14.body.namenode': '<ol>' +
-  '<li>Copy contents of <b>{0}</b> from source host <b>{1}</b> to the target host <b>{2}</b> same locations</li>' +
-      '<li>Login to the target host <b>{2}</b> and change permissions for the NameNode dirs by running:' +
-      '<div class="code-snippet">chown -R hdfs:hadoop /hadoop/hdfs/namenode/</div></li>' +
-      '<li>Create marker directory by running:' +
-      '<div class="code-snippet">mkdir -p /var/run/hadoop/hdfs/namenode/formatted</div></li>' +
-      '<li>Proceed next' +
-      '</ol>',
-  'installer.step14.body.secondary_namenode': '<ol>' +
-      '<li>Copy contents of <b>{0}</b> from source host <b>{1}</b> to the target host <b>{2}</b> same locations</li>' +
-      '<li>Login to the target host <b>{2}</b> and change permissions for the SNameNode dirs by running:' +
-      '<div class="code-snippet">chown -R hdfs:hadoop /hadoop/hdfs/namesecondary/</div></li>' +
-      '<li>Proceed next' +
-      '</ol>',
-  'installer.step14.body.jobtracker': '<ol>' +
-      '<li>Copy contents of <b>{0}</b> from source host <b>{1}</b> to the target host <b>{2}</b> same locations</li>' +
-      '<li>Login to the target host <b>{2}</b> and change permissions for the JobTracker dirs by running:' +
-      '<div class="code-snippet">chown -R mapred:hadoop /hadoop/mapred/</div></li>' +
-      '<li>Proceed next' +
-      '</ol>',
-  'installer.step15.header': 'Install, Start and Test',
-  'installer.step15.task0.title':'{0} remove',
-  'installer.step15.task1.title':'{1} start',
-  'installer.step15.status.success': 'Successfully reassigned {0}',
-  'installer.step15.status.failed': 'Failed to reassign {0}',
-  'installer.step15.status.info': 'Reassigning {0}. \nPlease wait while all tasks will be completed.',
-
+  
   'installer.stackUpgrade.header':'Stack Upgrade Wizard',
   'installer.stackUpgrade.step1.newVersion':'New Version',
   'installer.stackUpgrade.step1.installedVersion':'Installed Version',
@@ -1113,6 +1066,55 @@ Em.I18n.translations = {
   'services.service.startAll':'Start All',
   'services.service.stopAll':'Stop All',
 
+  'services.reassign.step1.header':'Prerequisites',
+  'services.reassign.step2.header':'Assign Masters',
+  'services.reassign.step3.header':'Review',
+  'services.reassign.step3.body':'Please review the changes you made',
+  'services.reassign.step3.targetHost':'Target Host:',
+  'services.reassign.step3.sourceHost':'Source Host:',
+  'services.reassign.step3.component':'Component name:',
+  'services.reassign.step4.header':'Install, Start and Test',
+  'services.reassign.step4.task0.title':'{1} stop',
+  'services.reassign.step4.task1.title':'{0} create',
+  'services.reassign.step4.task2.title':'{0} disable',
+  'services.reassign.step4.task3.title':'{1} reconfigure',
+  'services.reassign.step4.task4.title':'{0} install',
+  'services.reassign.step4.task5.title':'{1} remove',
+  'services.reassign.step4.task6.title':'{0} start',
+  'services.reassign.step4.status.success': 'Successfully reassigned {0}',
+  'services.reassign.step4.status.success.withManualSteps': 'Proceed to the next step',
+  'services.reassign.step4.status.failed': 'Failed to reassign {0}',
+  'services.reassign.step4.status.info': 'Reassigning {0}. \nPlease wait while all tasks will be completed.',
+  'services.reassign.step4.retry': 'You can click on the Retry or Abort button to retry failed task or abort changes',
+  'services.reassign.step4.abortError': 'Error in aborting changes.',
+  'services.reassign.step5.header': 'Manual commands',
+  'services.reassign.step5.body.namenode': '<ol>' +
+      '<li>Copy contents of <b>{0}</b> from source host <b>{1}</b> to the target host <b>{2}</b> same locations</li>' +
+      '<li>Login to the target host <b>{2}</b> and change permissions for the NameNode dirs by running:' +
+      '<div class="code-snippet">chown -R hdfs:hadoop /hadoop/hdfs/namenode/</div></li>' +
+      '<li>Create marker directory by running:' +
+      '<div class="code-snippet">mkdir -p /var/run/hadoop/hdfs/namenode/formatted</div></li>' +
+      '<li>Proceed next' +
+      '</ol>',
+  'services.reassign.step5.body.secondary_namenode': '<ol>' +
+      '<li>Copy contents of <b>{0}</b> from source host <b>{1}</b> to the target host <b>{2}</b> same locations</li>' +
+      '<li>Login to the target host <b>{2}</b> and change permissions for the SNameNode dirs by running:' +
+      '<div class="code-snippet">chown -R hdfs:hadoop /hadoop/hdfs/namesecondary/</div></li>' +
+      '<li>Proceed next' +
+      '</ol>',
+  'services.reassign.step5.body.jobtracker': '<ol>' +
+      '<li>Copy contents of <b>{0}</b> from source host <b>{1}</b> to the target host <b>{2}</b> same locations</li>' +
+      '<li>Login to the target host <b>{2}</b> and change permissions for the JobTracker dirs by running:' +
+      '<div class="code-snippet">chown -R mapred:hadoop /hadoop/mapred/</div></li>' +
+      '<li>Proceed next' +
+      '</ol>',
+  'services.reassign.step6.header': 'Install, Start and Test',
+  'services.reassign.step6.task0.title':'{0} remove',
+  'services.reassign.step6.task1.title':'{1} start',
+  'services.reassign.step6.status.success': 'Successfully reassigned {0}',
+  'services.reassign.step6.status.failed': 'Failed to reassign {0}',
+  'services.reassign.step6.status.info': 'Reassigning {0}. \nPlease wait while all tasks will be completed.',
+
   /** services page constants **/
 
   'service.hbase.activeMaster': 'Active Master',

+ 27 - 12
ambari-web/app/routes/reassign_master_routes.js

@@ -71,7 +71,7 @@ module.exports = Em.Route.extend({
       controller.setCurrentStep('1');
       controller.dataLoading().done(function () {
         controller.loadAllPriorSteps();
-        controller.connectOutlet('wizardStep11');
+        controller.connectOutlet('reassignMasterWizardStep1');
       })
     },
     next: function (router) {
@@ -88,15 +88,30 @@ module.exports = Em.Route.extend({
       controller.setCurrentStep('2');
       controller.dataLoading().done(function () {
         controller.loadAllPriorSteps();
-        controller.connectOutlet('wizardStep5', controller.get('content'));
+        controller.connectOutlet('reassignMasterWizardStep2', controller.get('content'));
       })
 
     },
     back: Em.Router.transitionTo('step1'),
     next: function (router) {
       var controller = router.get('reassignMasterController');
-      var wizardStep5Controller = router.get('wizardStep5Controller');
-      controller.saveMasterComponentHosts(wizardStep5Controller);
+      var reassignMasterWizardStep2 = router.get('reassignMasterWizardStep2Controller');
+      controller.saveMasterComponentHosts(reassignMasterWizardStep2);
+      var reassignHosts = {};
+      var componentName = reassignMasterWizardStep2.get('content.reassign.component_name');
+      var masterAssignmentsHosts = reassignMasterWizardStep2.get('selectedServicesMasters').filterProperty('component_name', componentName).mapProperty('selectedHost');
+      var currentMasterHosts = App.HostComponent.find().filterProperty('componentName', componentName).mapProperty('host.hostName');
+      masterAssignmentsHosts.forEach(function (host) {
+        if (!currentMasterHosts.contains(host)) {
+          reassignHosts.target =  host;
+        }
+      }, this);
+      currentMasterHosts.forEach(function (host) {
+        if (!masterAssignmentsHosts.contains(host)) {
+          reassignHosts.source = host;
+        }
+      }, this);
+      controller.saveReassignHosts(reassignHosts);
       router.transitionTo('step3');
     }
   }),
@@ -109,7 +124,7 @@ module.exports = Em.Route.extend({
       controller.setCurrentStep('3');
       controller.dataLoading().done(function () {
         controller.loadAllPriorSteps();
-        controller.connectOutlet('wizardStep12', controller.get('content'));
+        controller.connectOutlet('reassignMasterWizardStep3', controller.get('content'));
       })
     },
     back: Em.Router.transitionTo('step2'),
@@ -134,7 +149,7 @@ module.exports = Em.Route.extend({
       controller.dataLoading().done(function () {
         controller.loadAllPriorSteps();
         controller.setLowerStepsDisable(4);
-        controller.connectOutlet('wizardStep13', controller.get('content'));
+        controller.connectOutlet('reassignMasterWizardStep4', controller.get('content'));
       })
     },
     next: function (router) {
@@ -150,8 +165,8 @@ module.exports = Em.Route.extend({
 
     complete: function (router) {
       var controller = router.get('reassignMasterController');
-      var wizardStep13Controller = router.get('wizardStep13Controller');
-      if (!wizardStep13Controller.get('isSubmitDisabled')) {
+      var reassignMasterWizardStep4 = router.get('reassignMasterWizardStep4Controller');
+      if (!reassignMasterWizardStep4.get('isSubmitDisabled')) {
         controller.finish();
         controller.get('popup').hide();
         App.clusterStatus.setClusterStatus({
@@ -178,7 +193,7 @@ module.exports = Em.Route.extend({
       controller.dataLoading().done(function () {
         controller.loadAllPriorSteps();
         controller.setLowerStepsDisable(5);
-        controller.connectOutlet('wizardStep14', controller.get('content'));
+        controller.connectOutlet('reassignMasterWizardStep5', controller.get('content'));
       })
     },
     next: Em.Router.transitionTo('step6'),
@@ -197,14 +212,14 @@ module.exports = Em.Route.extend({
       controller.dataLoading().done(function () {
         controller.loadAllPriorSteps();
         controller.setLowerStepsDisable(6);
-        controller.connectOutlet('wizardStep15', controller.get('content'));
+        controller.connectOutlet('reassignMasterWizardStep6', controller.get('content'));
       })
     },
 
     next: function (router) {
       var controller = router.get('reassignMasterController');
-      var wizardStep15Controller = router.get('wizardStep15Controller');
-      if (!wizardStep15Controller.get('isSubmitDisabled')) {
+      var reassignMasterWizardStep6 = router.get('reassignMasterWizardStep6Controller');
+      if (!reassignMasterWizardStep6.get('isSubmitDisabled')) {
         controller.finish();
         controller.get('popup').hide();
         App.clusterStatus.setClusterStatus({

+ 1 - 1
ambari-web/app/templates/main/admin/highAvailability/progress.hbs

@@ -22,7 +22,7 @@
   {{#each task in controller.tasks}}
   {{#view view.taskView contentBinding="task"}}
     <div class="item">
-      <div {{bindAttr class=":pull-left view.linkClass controller.isRollback::span4 controller.isRollback:span3"}}>
+      <div {{bindAttr class=":pull-left view.linkClass controller.isHA:span4 controller.isRollback:span3 controller.isReassign:span5"}}>
         <i {{bindAttr class="view.icon view.iconColor"}}></i>
         <a {{bindAttr class=""}} {{action "hostsLogPopup" task target="view"}} >{{task.title}}</a>
       </div>

+ 6 - 6
ambari-web/app/templates/main/service/reassign.hbs

@@ -25,13 +25,13 @@
           <div class="well">
             <ul class="nav nav-pills nav-stacked">
               <li class="nav-header">{{t services.reassign.header}}</li>
-              <li {{bindAttr class="isStep1:active view.isStep1Disabled:disabled"}}><a href="javascript:void(null);"  {{action gotoStep1 target="controller"}}>{{t installer.step11.header}}</a></li>
-              <li {{bindAttr class="isStep2:active view.isStep2Disabled:disabled"}}><a href="javascript:void(null);"  {{action gotoStep2 target="controller"}}>{{t installer.step5.reassign.header}}</a></li>
-              <li {{bindAttr class="isStep3:active view.isStep3Disabled:disabled"}}><a href="javascript:void(null);"  {{action gotoStep3 target="controller"}}>{{t installer.step12.header}}</a></li>
-              <li {{bindAttr class="isStep4:active view.isStep4Disabled:disabled"}}><a href="javascript:void(null);"  {{action gotoStep4 target="controller"}}>{{t installer.step13.header}}</a></li>
+              <li {{bindAttr class="isStep1:active view.isStep1Disabled:disabled"}}><a href="javascript:void(null);"  {{action gotoStep1 target="controller"}}>{{t services.reassign.step1.header}}</a></li>
+              <li {{bindAttr class="isStep2:active view.isStep2Disabled:disabled"}}><a href="javascript:void(null);"  {{action gotoStep2 target="controller"}}>{{t services.reassign.step2.header}}</a></li>
+              <li {{bindAttr class="isStep3:active view.isStep3Disabled:disabled"}}><a href="javascript:void(null);"  {{action gotoStep3 target="controller"}}>{{t services.reassign.step3.header}}</a></li>
+              <li {{bindAttr class="isStep4:active view.isStep4Disabled:disabled"}}><a href="javascript:void(null);"  {{action gotoStep4 target="controller"}}>{{t services.reassign.step4.header}}</a></li>
               {{#if controller.content.hasManualSteps}}
-              <li {{bindAttr class="isStep5:active view.isStep5Disabled:disabled"}}><a href="javascript:void(null);"  {{action gotoStep3 target="controller"}}>{{t installer.step14.header}}</a></li>
-              <li {{bindAttr class="isStep6:active view.isStep6Disabled:disabled"}}><a href="javascript:void(null);"  {{action gotoStep4 target="controller"}}>{{t installer.step15.header}}</a></li>
+              <li {{bindAttr class="isStep5:active view.isStep5Disabled:disabled"}}><a href="javascript:void(null);"  {{action gotoStep3 target="controller"}}>{{t services.reassign.step5.header}}</a></li>
+              <li {{bindAttr class="isStep6:active view.isStep6Disabled:disabled"}}><a href="javascript:void(null);"  {{action gotoStep4 target="controller"}}>{{t services.reassign.step6.header}}</a></li>
               {{/if}}
             </ul>
           </div>

+ 1 - 1
ambari-web/app/templates/wizard/step11.hbs → ambari-web/app/templates/main/service/reassign/step1.hbs

@@ -16,7 +16,7 @@
 * limitations under the License.
 }}
 
-<h2>{{t installer.step11.header}}</h2>
+<h2>{{t services.reassign.step1.header}}</h2>
 <div class="btn-area">
   <a class="btn btn-success pull-right" {{bindAttr disabled="isSubmitDisabled"}} {{action next}}>{{t common.next}} &rarr;</a>
 </div>

+ 5 - 5
ambari-web/app/templates/wizard/step12.hbs → ambari-web/app/templates/main/service/reassign/step3.hbs

@@ -16,10 +16,10 @@
 * limitations under the License.
 }}
 
-<h2>{{t installer.step12.header}}</h2>
+<h2>{{t services.reassign.step3.header}}</h2>
 
 <div class="alert alert-info">
-  {{t installer.step12.body}}
+  {{t services.reassign.step3.body}}
 </div>
 
 <div id="step8-content" class="well pre-scrollable">
@@ -27,11 +27,11 @@
     <a class="btn btn-info pull-right" {{action printReview target="view"}}>{{t common.print}}</a> <br/>
   </div>
   <div id="step8-info">
-    <p><b>{{t installer.step12.component}}</b> {{controller.content.reassign.display_name}}</p>
+    <p><b>{{t services.reassign.step3.component}}</b> {{controller.content.reassign.display_name}}</p>
 
-    <p><b>{{t installer.step12.sourceHost}}</b> {{view.sourceHost}}</p>
+    <p><b>{{t services.reassign.step3.sourceHost}}</b> {{view.sourceHost}}</p>
 
-    <p><b>{{t installer.step12.targetHost}}</b> {{view.targetHost}}</p>
+    <p><b>{{t services.reassign.step3.targetHost}}</b> {{view.targetHost}}</p>
   </div>
 </div>
 <div class="btn-area">

+ 0 - 0
ambari-web/app/templates/wizard/step13.hbs → ambari-web/app/templates/main/service/reassign/step4.hbs


+ 1 - 1
ambari-web/app/templates/wizard/step14.hbs → ambari-web/app/templates/main/service/reassign/step5.hbs

@@ -15,7 +15,7 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 }}
-<h2>{{t installer.step14.header}}</h2>
+<h2>{{t services.reassign.step5.header}}</h2>
 <div class="alert alert-info">
   {{{view.bodyText}}}
 </div>

+ 0 - 0
ambari-web/app/templates/wizard/step15.hbs → ambari-web/app/templates/main/service/reassign/step6.hbs


+ 11 - 0
ambari-web/app/utils/db.js

@@ -418,6 +418,12 @@ App.db.setReassignMasterWizardComponentDir = function (componentDir) {
   localStorage.setObject('ambari', App.db.data);
 };
 
+App.db.setReassignMasterWizardReassignHosts = function (reassignHosts) {
+  App.db.data = localStorage.getObject('ambari');
+  App.db.data.ReassignMaster.reassignHosts = reassignHosts;
+  localStorage.setObject('ambari', App.db.data);
+};
+
 /*
  *  getter methods
  */
@@ -686,4 +692,9 @@ App.db.getReassignMasterWizardComponentDir = function () {
   return App.db.data.ReassignMaster.componentDir;
 };
 
+App.db.getReassignMasterWizardReassignHosts = function () {
+  App.db.data = localStorage.getObject('ambari');
+  return App.db.data.ReassignMaster.reassignHosts;
+};
+
 module.exports = App.db;

+ 6 - 5
ambari-web/app/views.js

@@ -186,6 +186,12 @@ require('views/main/service/info/metrics/flume/jvm_threads_runnable');
 require('views/main/service/info/metrics/flume/cpu_user');
 require('views/main/service/add_view');
 require('views/main/service/reassign_view');
+require('views/main/service/reassign/step1_view');
+require('views/main/service/reassign/step2_view');
+require('views/main/service/reassign/step3_view');
+require('views/main/service/reassign/step4_view');
+require('views/main/service/reassign/step5_view');
+require('views/main/service/reassign/step6_view');
 require('views/main/charts/menu');
 require('views/main/charts/heatmap');
 require('views/main/charts/heatmap/heatmap_rack');
@@ -217,11 +223,6 @@ require('views/wizard/step7_view');
 require('views/wizard/step8_view');
 require('views/wizard/step9_view');
 require('views/wizard/step10_view');
-require('views/wizard/step11_view');
-require('views/wizard/step12_view');
-require('views/wizard/step13_view');
-require('views/wizard/step14_view');
-require('views/wizard/step15_view');
 require('views/wizard/stack_upgrade/step1_view');
 require('views/wizard/stack_upgrade/step2_view');
 require('views/wizard/stack_upgrade/step3_view');

+ 8 - 3
ambari-web/app/views/main/service/item.js

@@ -23,7 +23,9 @@ App.MainServiceItemView = Em.View.extend({
   maintenance: function(){
     var options = [];
     var service = this.get('controller.content');
-    switch(service.get('serviceName')) {
+    var allMasters = this.get('controller.content.hostComponents').filterProperty('isMaster').mapProperty('componentName').uniq();
+    var reassignableMasters = ['NAMENODE', 'SECONDARY_NAMENODE', 'JOBTRACKER', 'RESOURCEMANAGER'];
+    switch (service.get('serviceName')) {
       case 'GANGLIA':
       case 'NAGIOS':
         break;
@@ -31,8 +33,11 @@ App.MainServiceItemView = Em.View.extend({
       case 'HDFS':
       case 'MAPREDUCE':
         if (App.supports.reassignMaster) {
-          this.get('controller.content.hostComponents').filterProperty('isMaster').forEach (function (hostComponent){
-            options.push({action: 'reassignMaster', context: hostComponent, 'label': Em.I18n.t('services.service.actions.reassign.master').format(hostComponent.get('displayName'))});
+          allMasters.forEach(function (hostComponent) {
+            if (reassignableMasters.contains(hostComponent)) {
+              options.push({action: 'reassignMaster', context: hostComponent,
+                'label': Em.I18n.t('services.service.actions.reassign.master').format(App.format.role(hostComponent))});
+            }
           })
         }
       default:

+ 26 - 0
ambari-web/app/views/main/service/reassign/step1_view.js

@@ -0,0 +1,26 @@
+/**
+ * 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.ReassignMasterWizardStep1View = Em.View.extend({
+
+  templateName: require('templates/main/service/reassign/step1')
+
+});

+ 1 - 5
ambari-web/app/views/wizard/step11_view.js → ambari-web/app/views/main/service/reassign/step2_view.js

@@ -19,8 +19,4 @@
 
 var App = require('app');
 
-App.WizardStep11View = Em.View.extend({
-
-  templateName: require('templates/wizard/step11')
-
-});
+App.ReassignMasterWizardStep2View = App.WizardStep5View.extend();

+ 10 - 9
ambari-web/app/views/wizard/step12_view.js → ambari-web/app/views/main/service/reassign/step3_view.js

@@ -19,18 +19,19 @@
 
 var App = require('app');
 
-App.WizardStep12View = Em.View.extend({
+App.ReassignMasterWizardStep3View = Em.View.extend({
 
-  templateName: require('templates/wizard/step12'),
+  templateName: require('templates/main/service/reassign/step3'),
 
-  sourceHost: function () {
-    return this.get('controller.content.reassign.host_id')
-  }.property('controller.content.reassign.host_id'),
-  targetHost: function () {
-    return this.get('controller.content.masterComponentHosts').findProperty('component', this.get('controller.content.reassign.component_name')).hostName;
-  }.property('controller.content.masterComponentHosts'),
+  sourceHost: function(){
+    return this.get('controller.content.reassignHosts.source');
+  }.property('controller.content.reassignHosts.source'),
 
-  printReview: function() {
+  targetHost: function(){
+    return this.get('controller.content.reassignHosts.target');
+  }.property('controller.content.reassignHosts.target'),
+
+  printReview: function () {
     $("#step8-info").jqprint();
   }
 });

+ 7 - 7
ambari-web/app/views/wizard/step13_view.js → ambari-web/app/views/main/service/reassign/step4_view.js

@@ -19,23 +19,23 @@
 
 var App = require('app');
 
-App.WizardStep13View = App.HighAvailabilityProgressPageView.extend({
+App.ReassignMasterWizardStep4View = App.HighAvailabilityProgressPageView.extend({
 
-  headerTitle: Em.I18n.t('installer.step13.header'),
+  headerTitle: Em.I18n.t('services.reassign.step4.header'),
 
   noticeInProgress: function () {
-    return Em.I18n.t('installer.step13.status.info').format(App.format.role(this.get('controller.content.reassign.component_name')))
+    return Em.I18n.t('services.reassign.step4.status.info').format(App.format.role(this.get('controller.content.reassign.component_name')))
   }.property('controller.content.reassign.component_name'),
 
   noticeFailed: function () {
-    return Em.I18n.t('installer.step13.status.failed').format(App.format.role(this.get('controller.content.reassign.component_name')))
+    return Em.I18n.t('services.reassign.step4.status.failed').format(App.format.role(this.get('controller.content.reassign.component_name')))
   }.property('controller.content.reassign.component_name'),
 
   noticeCompleted: function () {
     if (this.get('controller.content.hasManualSteps')) {
-      return Em.I18n.t('installer.step13.status.success.withManualSteps').format(App.format.role(this.get('controller.content.reassign.component_name')));
+      return Em.I18n.t('services.reassign.step4.status.success.withManualSteps').format(App.format.role(this.get('controller.content.reassign.component_name')));
     } else {
-      return Em.I18n.t('installer.step13.status.success').format(App.format.role(this.get('controller.content.reassign.component_name')));
+      return Em.I18n.t('services.reassign.step4.status.success').format(App.format.role(this.get('controller.content.reassign.component_name')));
     }
   }.property('controller.content.reassign.component_name'),
 
@@ -47,5 +47,5 @@ App.WizardStep13View = App.HighAvailabilityProgressPageView.extend({
     }
   }.property('controller.content.hasManualSteps'),
 
-  templateName: require('templates/wizard/step13')
+  templateName: require('templates/main/service/reassign/step4')
 });

+ 5 - 5
ambari-web/app/views/wizard/step14_view.js → ambari-web/app/views/main/service/reassign/step5_view.js

@@ -19,14 +19,14 @@
 
 var App = require('app');
 
-App.WizardStep14View = Em.View.extend({
+App.ReassignMasterWizardStep5View = Em.View.extend({
 
   bodyText: function () {
     var componentDir = this.get('controller.content.componentDir');
-    var sourceHost = this.get('controller.content.reassign.host_id');
-    var targetHost = this.get('controller.content.masterComponentHosts').findProperty('component', this.get('controller.content.reassign.component_name')).hostName;
-    return  Em.I18n.t('installer.step14.body.' + this.get('controller.content.reassign.component_name').toLowerCase()).format(componentDir, sourceHost, targetHost);
+    var sourceHost = this.get('controller.content.reassignHosts.source');
+    var targetHost = this.get('controller.content.reassignHosts.target');
+    return  Em.I18n.t('services.reassign.step5.body.' + this.get('controller.content.reassign.component_name').toLowerCase()).format(componentDir, sourceHost, targetHost);
   }.property('controller.content.reassign.component_name', 'controller.content.componentDir', 'controller.content.masterComponentHosts', 'controller.content.reassign.host_id'),
 
-  templateName: require('templates/wizard/step14')
+  templateName: require('templates/main/service/reassign/step5')
 });

+ 6 - 6
ambari-web/app/views/wizard/step15_view.js → ambari-web/app/views/main/service/reassign/step6_view.js

@@ -19,23 +19,23 @@
 
 var App = require('app');
 
-App.WizardStep15View = App.HighAvailabilityProgressPageView.extend({
+App.ReassignMasterWizardStep6View = App.HighAvailabilityProgressPageView.extend({
 
-  headerTitle: Em.I18n.t('installer.step15.header'),
+  headerTitle: Em.I18n.t('services.reassign.step6.header'),
 
   noticeInProgress: function () {
-    return Em.I18n.t('installer.step15.status.info').format(App.format.role(this.get('controller.content.reassign.component_name')))
+    return Em.I18n.t('services.reassign.step6.status.info').format(App.format.role(this.get('controller.content.reassign.component_name')))
   }.property('controller.content.reassign.component_name'),
 
   noticeFailed: function () {
-    return Em.I18n.t('installer.step15.status.failed').format(App.format.role(this.get('controller.content.reassign.component_name')))
+    return Em.I18n.t('services.reassign.step6.status.failed').format(App.format.role(this.get('controller.content.reassign.component_name')))
   }.property('controller.content.reassign.component_name'),
 
   noticeCompleted: function () {
-    return Em.I18n.t('installer.step15.status.success').format(App.format.role(this.get('controller.content.reassign.component_name')))
+    return Em.I18n.t('services.reassign.step6.status.success').format(App.format.role(this.get('controller.content.reassign.component_name')))
   }.property('controller.content.reassign.component_name'),
 
   submitButtonText: Em.I18n.t('common.complete'),
 
-  templateName: require('templates/wizard/step15')
+  templateName: require('templates/main/service/reassign/step6')
 });