You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ab...@apache.org on 2017/01/17 10:11:38 UTC

[2/2] ambari git commit: AMBARI-19572 Move Master and HA wizards for all components should show config changes that will be done as part of the wizard. (ababiichuk)

AMBARI-19572 Move Master and HA wizards for all components should show config changes that will be done as part of the wizard. (ababiichuk)


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

Branch: refs/heads/trunk
Commit: cba69d93c0e062b37d89b75db00a16e0fa4369e2
Parents: b7d8f5e
Author: ababiichuk <ab...@hortonworks.com>
Authored: Mon Jan 16 18:54:21 2017 +0200
Committer: ababiichuk <ab...@hortonworks.com>
Committed: Tue Jan 17 12:19:40 2017 +0200

----------------------------------------------------------------------
 .../main/service/reassign/step1_controller.js   |  78 ++-
 .../main/service/reassign/step3_controller.js   | 663 +++++++++++++++++++
 .../main/service/reassign/step4_controller.js   | 629 ++----------------
 .../main/service/reassign_controller.js         |  47 +-
 ambari-web/app/messages.js                      |  21 +-
 ambari-web/app/routes/reassign_master_routes.js |  24 +-
 ambari-web/app/styles/wizard.less               |   2 +-
 .../highAvailability/journalNode/step2.hbs      |  65 +-
 .../templates/main/service/reassign/step3.hbs   |  36 +-
 .../views/main/service/reassign/step3_view.js   |   4 +-
 .../views/main/service/reassign/step5_view.js   |   4 +-
 .../service/reassign/step1_controller_test.js   |  17 +-
 .../service/reassign/step3_controller_test.js   | 634 ++++++++++++++++++
 .../service/reassign/step4_controller_test.js   | 646 +-----------------
 14 files changed, 1582 insertions(+), 1288 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/cba69d93/ambari-web/app/controllers/main/service/reassign/step1_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/reassign/step1_controller.js b/ambari-web/app/controllers/main/service/reassign/step1_controller.js
index 9f30bb7..c631e85 100644
--- a/ambari-web/app/controllers/main/service/reassign/step1_controller.js
+++ b/ambari-web/app/controllers/main/service/reassign/step1_controller.js
@@ -26,9 +26,18 @@ App.ReassignMasterWizardStep1Controller = Em.Controller.extend({
    * @type {object}
    */
   dbPropertyMap: {
-    'HIVE_SERVER': 'javax.jdo.option.ConnectionDriverName',
-    'HIVE_METASTORE': 'javax.jdo.option.ConnectionDriverName',
-    'OOZIE_SERVER': 'oozie.service.JPAService.jdbc.driver'
+    'HIVE_SERVER': {
+      type: 'hive-site',
+      name: 'javax.jdo.option.ConnectionDriverName'
+    },
+    'HIVE_METASTORE': {
+      type: 'hive-site',
+      name: 'javax.jdo.option.ConnectionDriverName'
+    },
+    'OOZIE_SERVER': {
+      type: 'oozie-site',
+      name: 'oozie.service.JPAService.jdbc.driver'
+    }
   },
 
   loadConfigsTags: function () {
@@ -79,55 +88,78 @@ App.ReassignMasterWizardStep1Controller = Em.Controller.extend({
   },
 
   onLoadConfigs: function (data) {
-    var databaseProperty = null,
-        databaseType = null,
-        properties = {},
-        isRemoteDB = null;
+    var databaseProperty,
+      databaseType = null,
+      databaseTypeMatch,
+      properties = {},
+      configs = {},
+      dbPropertyMapItem = Em.getWithDefault(this.get('dbPropertyMap'), this.get('content.reassign.component_name'), null),
+      serviceDbProp = this.get('content.reassign.service_id').toLowerCase() + '_database';
 
     data.items.forEach(function(item) {
-      $.extend(properties, item.properties);
+      configs[item.type] = item.properties;
     });
 
-    this.set('content.serviceProperties', properties);
+    this.get('content').setProperties({
+      serviceProperties: properties,
+      configs: configs
+    });
 
-    databaseProperty = properties[ Em.getWithDefault(this.get('dbPropertyMap'), this.get('content.reassign.component_name'), null) ];
-    databaseType = databaseProperty.match(/MySQL|PostgreS|Oracle|Derby|MSSQL|Anywhere/gi)[0];
+    if (dbPropertyMapItem) {
+      databaseProperty = Em.getWithDefault(configs, dbPropertyMapItem.type, {})[dbPropertyMapItem.name];
+      databaseTypeMatch = databaseProperty && databaseProperty.match(/MySQL|PostgreS|Oracle|Derby|MSSQL|Anywhere/gi);
+      if (databaseTypeMatch) {
+        databaseType = databaseTypeMatch[0];
+      }
+    }
     this.set('databaseType', databaseType);
 
     if (this.get('content.reassign.component_name') == 'OOZIE_SERVER' && databaseType !== 'derby') {
       App.router.reassignMasterController.set('content.hasManualSteps', false);
     }
 
-    var serviceDbProp = this.get('content.reassign.service_id').toLowerCase() + "_database";
-    properties['is_remote_db'] = /Existing/ig.test( properties[serviceDbProp] );
+    properties['is_remote_db'] = /Existing/ig.test(properties[serviceDbProp]);
 
     properties['database_hostname'] = this.getDatabaseHost();
 
     this.saveDatabaseType(databaseType);
     this.saveServiceProperties(properties);
+    this.saveConfigs(configs);
   },
 
   saveDatabaseType: function(type) {
-    if(type) {
+    if (type) {
       App.router.get(this.get('content.controllerName')).saveDatabaseType(type);
     }
   },
 
   saveServiceProperties: function(properties) {
-    if(properties) {
+    if (properties) {
       App.router.get(this.get('content.controllerName')).saveServiceProperties(properties);
     }
   },
 
+  saveConfigs: function(configs) {
+    if (configs) {
+      App.router.get(this.get('content.controllerName')).saveConfigs(configs);
+    }
+  },
+
   getDatabaseHost: function() {
-    var db_type = this.get('databaseType');
-    var connectionURLPRops = {
-      'HIVE': 'javax.jdo.option.ConnectionURL',
-      'OOZIE': 'oozie.service.JPAService.jdbc.url'
-    };
-
-    var service = this.get('content.reassign.service_id');
-    var connectionURL = this.get('content.serviceProperties')[connectionURLPRops[service]];
+    var db_type = this.get('databaseType'),
+      connectionURLProps = {
+        'HIVE': {
+          type: 'hive-site',
+          name: 'javax.jdo.option.ConnectionURL'
+        },
+        'OOZIE': {
+          type: 'oozie-site',
+          name: 'oozie.service.JPAService.jdbc.url'
+        }
+      },
+      service = this.get('content.reassign.service_id'),
+      connectionURLPropsItem = connectionURLProps[service],
+      connectionURL = Em.getWithDefault(this.get('content.configs'), connectionURLPropsItem.type, {})[connectionURLPropsItem.name];
 
     connectionURL = connectionURL.replace("jdbc:" + db_type + "://", "");
     connectionURL = connectionURL.replace("/hive?createDatabaseIfNotExist=true", "");

http://git-wip-us.apache.org/repos/asf/ambari/blob/cba69d93/ambari-web/app/controllers/main/service/reassign/step3_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/reassign/step3_controller.js b/ambari-web/app/controllers/main/service/reassign/step3_controller.js
index d717dea..f13cf0b 100644
--- a/ambari-web/app/controllers/main/service/reassign/step3_controller.js
+++ b/ambari-web/app/controllers/main/service/reassign/step3_controller.js
@@ -21,6 +21,669 @@ var App = require('app');
 App.ReassignMasterWizardStep3Controller = Em.Controller.extend({
   name: 'reassignMasterWizardStep3Controller',
 
+  componentSpecificTypesMap: {
+    'NAMENODE': [
+      {
+        serviceName: 'HBASE',
+        configTypes: ['hbase-site']
+      },
+      {
+        serviceName: 'ACCUMULO',
+        configTypes: ['accumulo-site']
+      },
+      {
+        serviceName: 'HAWQ',
+        configTypes: ['hawq-site', 'hdfs-client']
+      }
+    ],
+    'RESOURCEMANAGER': [
+      {
+        serviceName: 'HAWQ',
+        configTypes: ['hawq-site', 'yarn-client']
+      }
+    ]
+  },
+
+  /**
+   * additional configs with template values
+   * Part of value to substitute has following format: "<replace-value>"
+   */
+  additionalConfigsMap: [
+    {
+      componentName: 'RESOURCEMANAGER',
+      configs: {
+        'yarn-site': {
+          'yarn.resourcemanager.address': '<replace-value>:8050',
+          'yarn.resourcemanager.admin.address': '<replace-value>:8141',
+          'yarn.resourcemanager.resource-tracker.address': '<replace-value>:8025',
+          'yarn.resourcemanager.scheduler.address': '<replace-value>:8030',
+          'yarn.resourcemanager.webapp.address': '<replace-value>:8088',
+          'yarn.resourcemanager.hostname': '<replace-value>'
+        }
+      }
+    },
+    {
+      componentName: 'JOBTRACKER',
+      configs: {
+        'mapred-site': {
+          'mapred.job.tracker.http.address': '<replace-value>:50030',
+          'mapred.job.tracker': '<replace-value>:50300'
+        }
+      }
+    },
+    {
+      componentName: 'SECONDARY_NAMENODE',
+      configs: {
+        'hdfs-site': {
+          'dfs.secondary.http.address': '<replace-value>:50090'
+        }
+      },
+      configs_Hadoop2: {
+        'hdfs-site': {
+          'dfs.namenode.secondary.http-address': '<replace-value>:50090'
+        }
+      }
+    },
+    {
+      componentName: 'NAMENODE',
+      configs: {
+        'hdfs-site': {
+          'dfs.http.address': '<replace-value>:50070',
+          'dfs.https.address': '<replace-value>:50470'
+        },
+        'core-site': {
+          'fs.default.name': 'hdfs://<replace-value>:8020'
+        }
+      },
+      configs_Hadoop2: {
+        'hdfs-site': {
+          'dfs.namenode.rpc-address': '<replace-value>:8020',
+          'dfs.namenode.http-address': '<replace-value>:50070',
+          'dfs.namenode.https-address': '<replace-value>:50470'
+        },
+        'core-site': {
+          'fs.defaultFS': 'hdfs://<replace-value>:8020'
+        }
+      }
+    },
+    {
+      componentName: 'APP_TIMELINE_SERVER',
+      configs: {
+        'yarn-site': {
+          'yarn.timeline-service.webapp.address': '<replace-value>:8188',
+          'yarn.timeline-service.webapp.https.address': '<replace-value>:8190',
+          'yarn.timeline-service.address': '<replace-value>:10200'
+        }
+      }
+    },
+    {
+      componentName: 'OOZIE_SERVER',
+      configs: {
+        'oozie-site': {
+          'oozie.base.url': 'http://<replace-value>:11000/oozie'
+        },
+        'core-site': {
+          'hadoop.proxyuser.oozie.hosts': '<replace-value>'
+        }
+      }
+    },
+    {
+      componentName: 'HIVE_METASTORE',
+      configs: {
+        'hive-site': {}
+      }
+    },
+    {
+      componentName: 'MYSQL_SERVER',
+      configs: {
+        'hive-site': {
+          'javax.jdo.option.ConnectionURL': 'jdbc:mysql://<replace-value>/hive?createDatabaseIfNotExist=true'
+        }
+      }
+    },
+    {
+      componentName: 'HISTORYSERVER',
+      configs: {
+        'mapred-site': {
+          'mapreduce.jobhistory.webapp.address': '<replace-value>:19888',
+          'mapreduce.jobhistory.address': '<replace-value>:10020'
+        }
+      }
+    }
+  ],
+
+  secureConfigsMap: [
+    {
+      componentName: 'NAMENODE',
+      configs: [
+        {
+          site: 'hdfs-site',
+          keytab: 'dfs.namenode.keytab.file',
+          principal: 'dfs.namenode.kerberos.principal'
+        },
+        {
+          site: 'hdfs-site',
+          keytab: 'dfs.web.authentication.kerberos.keytab',
+          principal: 'dfs.web.authentication.kerberos.principal'
+        }
+      ]
+    },
+    {
+      componentName: 'SECONDARY_NAMENODE',
+      configs: [
+        {
+          site: 'hdfs-site',
+          keytab: 'dfs.secondary.namenode.keytab.file',
+          principal: 'dfs.secondary.namenode.kerberos.principal'
+        },
+        {
+          site: 'hdfs-site',
+          keytab: 'dfs.web.authentication.kerberos.keytab',
+          principal: 'dfs.web.authentication.kerberos.principal'
+        }
+      ]
+    },
+    {
+      componentName: 'RESOURCEMANAGER',
+      configs: [
+        {
+          site: 'yarn-site',
+          keytab: 'yarn.resourcemanager.keytab',
+          principal: 'yarn.resourcemanager.principal'
+        },
+        {
+          site: 'yarn-site',
+          keytab: 'yarn.resourcemanager.webapp.spnego-keytab-file',
+          principal: 'yarn.resourcemanager.webapp.spnego-principal'
+        }
+      ]
+    },
+    {
+      componentName: 'OOZIE_SERVER',
+      configs: [
+        {
+          site: 'oozie-site',
+          keytab: 'oozie.authentication.kerberos.keytab',
+          principal: 'oozie.authentication.kerberos.principal'
+        },
+        {
+          site: 'oozie-site',
+          keytab: 'oozie.service.HadoopAccessorService.keytab.file',
+          principal: 'oozie.service.HadoopAccessorService.kerberos.principal'
+        }
+      ]
+    },
+    {
+      componentName: 'WEBHCAT_SERVER',
+      configs: [
+        {
+          site: 'webhcat-site',
+          keytab: 'templeton.kerberos.keytab',
+          principal: 'templeton.kerberos.principal'
+        }
+      ]
+    },
+    {
+      componentName: 'HIVE_SERVER',
+      configs: [
+        {
+          site: 'hive-site',
+          keytab: 'hive.server2.authentication.kerberos.keytab',
+          principal: 'hive.server2.authentication.kerberos.principal'
+        },
+        {
+          site: 'hive-site',
+          keytab: 'hive.server2.authentication.spnego.keytab',
+          principal: 'hive.server2.authentication.spnego.principal'
+        }
+      ]
+    },
+    {
+      componentName: 'HIVE_METASTORE',
+      configs: [
+        {
+          site: 'hive-site',
+          keytab: 'hive.metastore.kerberos.keytab.file',
+          principal: 'hive.metastore.kerberos.principal'
+        }
+      ]
+    }
+
+  ],
+
+  isLoaded: false,
+
+  versionLoaded: true,
+
+  hideDependenciesInfoBar: true,
+
+  configs: null,
+
+  secureConfigs: [],
+
+  stepConfigs: [],
+
+  propertiesToChange: {},
+
+  isSubmitDisabled: Em.computed.and('wizardController.isComponentWithReconfiguration', '!isLoaded'),
+
+  loadStep: function () {
+    if (this.get('wizardController.isComponentWithReconfiguration')) {
+      this.set('isLoaded', false);
+      App.ajax.send({
+        name: 'config.tags',
+        sender: this,
+        success: 'onLoadConfigsTags'
+      });
+    }
+  },
+
+  clearStep: function () {
+    this.setProperties({
+      configs: null,
+      secureConfigs: [],
+      propertiesToChange: {}
+    });
+  },
+
+  onLoadConfigsTags: function (data) {
+    var urlParams = this.getConfigUrlParams(this.get('content.reassign.component_name'), data);
+
+    App.ajax.send({
+      name: 'reassign.load_configs',
+      sender: this,
+      data: {
+        urlParams: urlParams.join('|')
+      },
+      success: 'onLoadConfigs'
+    });
+  },
+
+  getConfigUrlParams: function (componentName, data) {
+    var urlParams = [];
+
+    this.get('wizardController.serviceToConfigSiteMap')[componentName].forEach(function(site){
+      urlParams.push('(type=' + site + '&tag=' + data.Clusters.desired_configs[site].tag + ')');
+    });
+
+    // specific cases for certain components
+    var specificTypes = this.get('componentSpecificTypesMap')[componentName];
+    if (specificTypes) {
+      var services = App.Service.find();
+      specificTypes.forEach(function (service) {
+        if (services.someProperty('serviceName', service.serviceName)) {
+          service.configTypes.forEach(function (site) {
+            urlParams.push('(type=' + site + '&tag=' + data.Clusters.desired_configs[site].tag + ')');
+          });
+        }
+      });
+    }
+
+    return urlParams;
+  },
+
+  renderServiceConfigs: function (configs) {
+    var self = this,
+      configCategories = [],
+      displayedConfigs = [],
+      serviceConfig = App.ServiceConfig.create({
+        serviceName: 'MISC',
+        configCategories: configCategories,
+        showConfig: true,
+        configs: displayedConfigs
+      });
+    App.get('router.mainController.isLoading').call(App.get('router.clusterController'), 'isConfigsPropertiesLoaded').done(function () {
+      Em.keys(self.get('propertiesToChange')).forEach(function (type) {
+        var service = App.config.get('serviceByConfigTypeMap')[type];
+        if (service) {
+          var serviceName = service.get('serviceName');
+          if (!configCategories.someProperty('name', serviceName)) {
+            configCategories.push(App.ServiceConfigCategory.create({
+              name: serviceName,
+              displayName: service.get('displayName')
+            }));
+          }
+          this.get('propertiesToChange')[type].forEach(function (property) {
+            var propertyName = property.name,
+              stackProperty = App.configsCollection.getConfigByName(propertyName, type) || {},
+              displayedProperty = App.ServiceConfigProperty.create({
+                name: propertyName,
+                displayName: propertyName,
+                fileName: type
+              }, stackProperty, {
+                value: configs[type][propertyName],
+                category: serviceName,
+                isEditable: Boolean(stackProperty.isEditable !== false && !property.isSecure)
+              });
+            displayedConfigs.push(displayedProperty);
+          });
+        }
+      }, self);
+      self.setProperties({
+        stepConfigs: [serviceConfig],
+        selectedService: serviceConfig,
+        isLoaded: true
+      });
+    });
+  },
+
+  onLoadConfigs: function (data) {
+    // Find hawq-site.xml location
+    var hawqSiteIndex = -1;
+    for(var i = 0; i < data.items.length; i++){
+      if(data.items[i].type == 'hawq-site'){
+        hawqSiteIndex = i;
+        break;
+      }
+    }
+
+    // if certain services are deployed, include related site files to additionalConfigsMap and relatedServicesMap.
+    if(hawqSiteIndex >= 0){ // if HAWQ is deployed
+      var hawqSiteProperties = {
+        'hawq_rm_yarn_address': '<replace-value>:8050',
+        'hawq_rm_yarn_scheduler_address': '<replace-value>:8030'
+      }
+
+      var rmComponent = this.get('additionalConfigsMap').findProperty('componentName', "RESOURCEMANAGER");
+      rmComponent.configs["hawq-site"] = hawqSiteProperties;
+
+      if(data.items[hawqSiteIndex].properties["hawq_global_rm_type"].toLowerCase() === "yarn"){
+        this.get('wizardController.relatedServicesMap')['RESOURCEMANAGER'].append('HAWQ');
+      }
+
+    }
+
+    var componentName = this.get('content.reassign.component_name');
+    var targetHostName = this.get('content.reassignHosts.target');
+    var configs = {};
+    var secureConfigs = [];
+
+    data.items.forEach(function (item) {
+      configs[item.type] = item.properties;
+    });
+
+    this.setAdditionalConfigs(configs, componentName, targetHostName);
+    this.setSecureConfigs(secureConfigs, configs, componentName);
+
+    this.set('secureConfigs', secureConfigs);
+
+    switch (componentName) {
+      case 'NAMENODE':
+        App.MoveNameNodeConfigInitializer.setup(this._getNnInitializerSettings(configs));
+        configs = this.setDynamicConfigs(configs, App.MoveNameNodeConfigInitializer);
+        App.MoveNameNodeConfigInitializer.cleanup();
+        break;
+      case 'RESOURCEMANAGER':
+        App.MoveRmConfigInitializer.setup(this._getRmInitializerSettings(configs));
+        var additionalDependencies = this._getRmAdditionalDependencies(configs);
+        configs = this.setDynamicConfigs(configs, App.MoveRmConfigInitializer, additionalDependencies);
+        App.MoveRmConfigInitializer.cleanup();
+        break;
+      case 'HIVE_METASTORE':
+        App.MoveHmConfigInitializer.setup(this._getHiveInitializerSettings(configs));
+        configs = this.setDynamicConfigs(configs, App.MoveHmConfigInitializer);
+        App.MoveHmConfigInitializer.cleanup();
+        break;
+      case 'HIVE_SERVER':
+        App.MoveHsConfigInitializer.setup(this._getHiveInitializerSettings(configs));
+        configs = this.setDynamicConfigs(configs, App.MoveHsConfigInitializer);
+        App.MoveHsConfigInitializer.cleanup();
+        break;
+      case 'WEBHCAT_SERVER':
+        App.MoveWsConfigInitializer.setup(this._getWsInitializerSettings(configs));
+        configs = this.setDynamicConfigs(configs, App.MoveWsConfigInitializer);
+        App.MoveWsConfigInitializer.cleanup();
+        break;
+      case 'OOZIE_SERVER':
+        App.MoveOSConfigInitializer.setup(this._getOsInitializerSettings(configs));
+        configs = this.setDynamicConfigs(configs, App.MoveOSConfigInitializer);
+        App.MoveOSConfigInitializer.cleanup();
+    }
+
+    this.renderServiceConfigs(configs);
+    this.set('configs', configs);
+  },
+
+  /**
+   * set additional configs
+   * configs_Hadoop2 - configs which belongs to Hadoop 2 stack only
+   * @param configs
+   * @param componentName
+   * @param replaceValue
+   * @return {Boolean}
+   */
+  setAdditionalConfigs: function (configs, componentName, replaceValue) {
+    var component = this.get('additionalConfigsMap').findProperty('componentName', componentName);
+
+    if (Em.isNone(component)) return false;
+    var additionalConfigs = (component.configs_Hadoop2) ? component.configs_Hadoop2 : component.configs;
+
+    for (var site in additionalConfigs) {
+      if (additionalConfigs.hasOwnProperty(site)) {
+        for (var property in additionalConfigs[site]) {
+          if (additionalConfigs[site].hasOwnProperty(property)) {
+            if (App.get('isHaEnabled') && componentName === 'NAMENODE' && (property === 'fs.defaultFS' || property === 'dfs.namenode.rpc-address')) continue;
+
+            configs[site][property] = additionalConfigs[site][property].replace('<replace-value>', replaceValue);
+            if (!this.get('propertiesToChange').hasOwnProperty(site)) {
+              this.get('propertiesToChange')[site] = [];
+            }
+            this.get('propertiesToChange')[site].push({
+              name: property
+            });
+          }
+        }
+      }
+    }
+    return true;
+  },
+
+  /**
+   * set secure configs for component
+   * @param secureConfigs
+   * @param configs
+   * @param componentName
+   * @return {Boolean}
+   */
+  setSecureConfigs: function (secureConfigs, configs, componentName) {
+    var securityEnabled = App.get('isKerberosEnabled');
+    var component = this.get('secureConfigsMap').findProperty('componentName', componentName);
+    if (Em.isNone(component) || !securityEnabled) return false;
+
+    component.configs.forEach(function (config) {
+      secureConfigs.push({
+        keytab: configs[config.site][config.keytab],
+        principal: configs[config.site][config.principal]
+      });
+      if (!this.get('propertiesToChange').hasOwnProperty(config.site)) {
+        this.get('propertiesToChange')[config.site] = [];
+      }
+      this.get('propertiesToChange')[config.site].push(
+        {
+          name: config.keytab,
+          isSecure: true
+        },
+        {
+          name: config.principal,
+          isSecure: true
+        }
+      );
+    }, this);
+    return true;
+  },
+
+  /**
+   * Get additional dependencies-data for App.MoveNameNodeConfigInitializer
+   *
+   * @param {object} configs
+   * @returns {object}
+   * @private
+   * @method _getNnInitializerSettings
+   */
+  _getNnInitializerSettings: function (configs) {
+    var ret = {};
+    if (App.get('isHaEnabled')) {
+      ret.namespaceId = configs['hdfs-site']['dfs.nameservices'];
+      ret.suffix = (configs['hdfs-site']['dfs.namenode.http-address.' + ret.namespaceId + '.nn1'].indexOf(this.get('content.reassignHosts.source')) != -1) ? 'nn1' : 'nn2';
+    }
+    return ret;
+  },
+
+  /**
+   * Settings used to the App.MoveRmConfigInitializer setup
+   *
+   * @param {object} configs
+   * @returns {{suffix: string}}
+   * @private
+   * @method _getRmInitializerSettings
+   */
+  _getRmInitializerSettings: function (configs) {
+    return {
+      suffix: configs['yarn-site']['yarn.resourcemanager.hostname.rm1'] === this.get('content.reassignHosts.source') ? 'rm1': 'rm2'
+    };
+  },
+
+  /**
+   * Get additional dependencies-data for App.MoveRmConfigInitializer
+   *
+   * @param {object} configs
+   * @returns {object}
+   * @private
+   * @method _getRmAdditionalDependencies
+   */
+  _getRmAdditionalDependencies: function (configs) {
+    var ret = {};
+    var rm1 = configs['yarn-site']['yarn.resourcemanager.hostname.rm1'];
+    if (rm1) {
+      ret.rm1 = rm1;
+    }
+    var rm2 = configs['yarn-site']['yarn.resourcemanager.hostname.rm2'];
+    if (rm2) {
+      ret.rm2 = rm2;
+    }
+    return ret;
+  },
+
+  /**
+   * Settings used to the App.MoveHsConfigInitializer and App.MoveHmConfigInitializer setup
+   *
+   * @param {object} configs
+   * @returns {{hiveUser: string}}
+   * @private
+   * @method _getHiveInitializerSettings
+   */
+  _getHiveInitializerSettings: function (configs) {
+    return {
+      hiveUser: configs['hive-env']['hive_user']
+    };
+  },
+
+  /**
+   * Settings used to the App.MoveWsConfigInitializer setup
+   *
+   * @param {object} configs
+   * @returns {{webhcatUser: string}}
+   * @private
+   * @method _getWsInitializerSettings
+   */
+  _getWsInitializerSettings: function (configs) {
+    return {
+      webhcatUser: configs['hive-env']['webhcat_user']
+    };
+  },
+
+  /**
+   * Settings used to the App.MoveOSConfigInitializer setup
+   *
+   * @param {object} configs
+   * @returns {object}
+   * @private
+   * @method _getOsInitializerSettings
+   */
+  _getOsInitializerSettings: function (configs) {
+    var ret = {};
+    var cfg = configs['oozie-env']['oozie_user'];
+    if (cfg) {
+      ret.oozieUser = cfg;
+    }
+    return ret;
+  },
+
+  /**
+   * Set config values according to the new cluster topology
+   *
+   * @param {object} configs
+   * @param {MoveComponentConfigInitializerClass} initializer
+   * @param {object} [additionalDependencies={}]
+   * @returns {object}
+   * @method setDynamicConfigs
+   */
+  setDynamicConfigs: function (configs, initializer, additionalDependencies) {
+    additionalDependencies = additionalDependencies || {};
+    var topologyDB = this._prepareTopologyDB(),
+      dependencies = this._prepareDependencies(additionalDependencies),
+      initializerObjects = initializer.get('initializers'),
+      uniqueInitializerObjects = initializer.get('uniqueInitializers');
+    Em.keys(configs).forEach(function (site) {
+      Em.keys(configs[site]).forEach(function (config) {
+        // temporary object for initializer
+        var cfg = {
+          name: config,
+          filename: site,
+          value: configs[site][config]
+        };
+        configs[site][config] = initializer.initialValue(cfg, topologyDB, dependencies).value;
+        if (initializerObjects[config] || uniqueInitializerObjects[config]) {
+          if (!this.get('propertiesToChange').hasOwnProperty(site)) {
+            this.get('propertiesToChange')[site] = [];
+          }
+          this.get('propertiesToChange')[site].push({
+            name: config
+          });
+        }
+      }, this);
+    }, this);
+    return configs;
+  },
+
+  /**
+   *
+   * @returns {extendedTopologyLocalDB}
+   * @private
+   * @method _prepareTopologyDB
+   */
+  _prepareTopologyDB: function () {
+    var ret = this.get('content').getProperties(['masterComponentHosts', 'slaveComponentHosts', 'hosts']);
+    ret.installedServices = App.Service.find().mapProperty('serviceName');
+    return ret;
+  },
+
+  /**
+   * Create dependencies for Config Initializers
+   *
+   * @param {object} additionalDependencies  some additional information that should be added
+   * @returns {reassignComponentDependencies}
+   * @private
+   * @method _prepareDependencies
+   */
+  _prepareDependencies: function (additionalDependencies) {
+    additionalDependencies = additionalDependencies || {};
+    var ret = {};
+    ret.sourceHostName = this.get('content.reassignHosts.source');
+    ret.targetHostName = this.get('content.reassignHosts.target');
+    return Em.merge(ret, additionalDependencies);
+  },
+
+  updateServiceConfigs: function () {
+    var configs = this.get('configs');
+    if (configs) {
+      this.get('selectedService.configs').forEach(function (property) {
+        var type = App.config.getConfigTagFromFileName(property.fileName);
+        configs[type][property.name] = property.value;
+      }, this);
+    }
+  },
+
   submit: function() {
     App.get('router.mainAdminKerberosController').getKDCSessionState(function() {
       App.router.send("next");

http://git-wip-us.apache.org/repos/asf/ambari/blob/cba69d93/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 c9cc28f..b383da7 100644
--- a/ambari-web/app/controllers/main/service/reassign/step4_controller.js
+++ b/ambari-web/app/controllers/main/service/reassign/step4_controller.js
@@ -70,267 +70,19 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro
 
   hostComponents: [],
 
-  /**
-   * List of components, that do not need reconfiguration for moving to another host
-   * Reconfigure command will be skipped
-   */
-  componentsWithoutReconfiguration: ['METRICS_COLLECTOR'],
-
-  /**
-   * Map with lists of related services.
-   * Used to define list of services to stop/start.
-   */
-  relatedServicesMap: {
-    'JOBTRACKER': ['PIG', 'OOZIE'],
-    'RESOURCEMANAGER': ['YARN', 'MAPREDUCE2', 'TEZ', 'PIG', 'OOZIE', 'SLIDER', 'SPARK'],
-    'APP_TIMELINE_SERVER': ['YARN', 'MAPREDUCE2', 'TEZ', 'OOZIE', 'SLIDER', 'SPARK'],
-    'HIVE_SERVER': ['HIVE', 'FALCON', 'ATLAS', 'OOZIE'],
-    'HIVE_METASTORE': ['HIVE', 'PIG', 'FALCON', 'ATLAS', 'OOZIE'],
-    'WEBHCAT_SERVER': ['HIVE'],
-    'OOZIE_SERVER': ['OOZIE', 'FALCON', 'KNOX'],
-    'MYSQL_SERVER': ['HIVE', 'OOZIE', 'RANGER', 'RANGER_KMS'],
-    'METRICS_COLLECTOR': ['AMBARI_METRICS']
-  },
-
   dbPropertyMap: {
-    'HIVE_SERVER': 'javax.jdo.option.ConnectionDriverName',
-    'HIVE_METASTORE': 'javax.jdo.option.ConnectionDriverName',
-    'OOZIE_SERVER': 'oozie.service.JPAService.jdbc.url'
-  },
-
-  /**
-   * additional configs with template values
-   * Part of value to substitute has following format: "<replace-value>"
-   */
-  additionalConfigsMap: [
-    {
-      componentName: 'RESOURCEMANAGER',
-      configs: {
-        'yarn-site': {
-          'yarn.resourcemanager.address': '<replace-value>:8050',
-          'yarn.resourcemanager.admin.address': '<replace-value>:8141',
-          'yarn.resourcemanager.resource-tracker.address': '<replace-value>:8025',
-          'yarn.resourcemanager.scheduler.address': '<replace-value>:8030',
-          'yarn.resourcemanager.webapp.address': '<replace-value>:8088',
-          'yarn.resourcemanager.hostname': '<replace-value>'
-        }
-      }
-    },
-    {
-      componentName: 'JOBTRACKER',
-      configs: {
-        'mapred-site': {
-          'mapred.job.tracker.http.address': '<replace-value>:50030',
-          'mapred.job.tracker': '<replace-value>:50300'
-        }
-      }
-    },
-    {
-      componentName: 'SECONDARY_NAMENODE',
-      configs: {
-        'hdfs-site': {
-          'dfs.secondary.http.address': '<replace-value>:50090'
-        }
-      },
-      configs_Hadoop2: {
-        'hdfs-site': {
-          'dfs.namenode.secondary.http-address': '<replace-value>:50090'
-        }
-      }
-    },
-    {
-      componentName: 'NAMENODE',
-      configs: {
-        'hdfs-site': {
-          'dfs.http.address': '<replace-value>:50070',
-          'dfs.https.address': '<replace-value>:50470'
-        },
-        'core-site': {
-          'fs.default.name': 'hdfs://<replace-value>:8020'
-        }
-      },
-      configs_Hadoop2: {
-        'hdfs-site': {
-          'dfs.namenode.rpc-address': '<replace-value>:8020',
-          'dfs.namenode.http-address': '<replace-value>:50070',
-          'dfs.namenode.https-address': '<replace-value>:50470'
-        },
-        'core-site': {
-          'fs.defaultFS': 'hdfs://<replace-value>:8020'
-        }
-      }
-    },
-    {
-      componentName: 'APP_TIMELINE_SERVER',
-      configs: {
-        'yarn-site': {
-          'yarn.timeline-service.webapp.address': '<replace-value>:8188',
-          'yarn.timeline-service.webapp.https.address': '<replace-value>:8190',
-          'yarn.timeline-service.address': '<replace-value>:10200'
-        }
-      }
-    },
-    {
-      componentName: 'OOZIE_SERVER',
-        configs: {
-          'oozie-site': {
-            'oozie.base.url': 'http://<replace-value>:11000/oozie'
-          },
-          'core-site': {
-            'hadoop.proxyuser.oozie.hosts': '<replace-value>'
-          }
-        }
-    },
-    {
-      componentName: 'HIVE_METASTORE',
-      configs: {
-        'hive-site': {}
-      }
-    },
-    {
-      componentName: 'MYSQL_SERVER',
-      configs: {
-        'hive-site': {
-          'javax.jdo.option.ConnectionURL': 'jdbc:mysql://<replace-value>/hive?createDatabaseIfNotExist=true'
-        }
-      }
-    },
-    {
-      componentName: 'HISTORYSERVER',
-      configs: {
-        'mapred-site': {
-          'mapreduce.jobhistory.webapp.address': '<replace-value>:19888',
-          'mapreduce.jobhistory.address': '<replace-value>:10020'
-        }
-      }
-    }
-  ],
-
-  secureConfigsMap: [
-    {
-      componentName: 'NAMENODE',
-      configs: [
-        {
-          site: 'hdfs-site',
-          keytab: 'dfs.namenode.keytab.file',
-          principal: 'dfs.namenode.kerberos.principal'
-        },
-        {
-          site: 'hdfs-site',
-          keytab: 'dfs.web.authentication.kerberos.keytab',
-          principal: 'dfs.web.authentication.kerberos.principal'
-        }
-      ]
-    },
-    {
-      componentName: 'SECONDARY_NAMENODE',
-      configs: [
-        {
-          site: 'hdfs-site',
-          keytab: 'dfs.secondary.namenode.keytab.file',
-          principal: 'dfs.secondary.namenode.kerberos.principal'
-        },
-        {
-          site: 'hdfs-site',
-          keytab: 'dfs.web.authentication.kerberos.keytab',
-          principal: 'dfs.web.authentication.kerberos.principal'
-        }
-      ]
+    'HIVE_SERVER': {
+      type: 'hive-site',
+      name: 'javax.jdo.option.ConnectionDriverName'
     },
-    {
-      componentName: 'RESOURCEMANAGER',
-      configs: [
-        {
-          site: 'yarn-site',
-          keytab: 'yarn.resourcemanager.keytab',
-          principal: 'yarn.resourcemanager.principal'
-        },
-        {
-          site: 'yarn-site',
-          keytab: 'yarn.resourcemanager.webapp.spnego-keytab-file',
-          principal: 'yarn.resourcemanager.webapp.spnego-principal'
-        }
-      ]
-    },
-    {
-      componentName: 'OOZIE_SERVER',
-      configs: [
-        {
-          site: 'oozie-site',
-          keytab: 'oozie.authentication.kerberos.keytab',
-          principal: 'oozie.authentication.kerberos.principal'
-        },
-        {
-          site: 'oozie-site',
-          keytab: 'oozie.service.HadoopAccessorService.keytab.file',
-          principal: 'oozie.service.HadoopAccessorService.kerberos.principal'
-        }
-      ]
-    },
-    {
-      componentName: 'WEBHCAT_SERVER',
-      configs: [
-        {
-          site: 'webhcat-site',
-          keytab: 'templeton.kerberos.keytab',
-          principal: 'templeton.kerberos.principal'
-        }
-      ]
+    'HIVE_METASTORE': {
+      type: 'hive-site',
+      name: 'javax.jdo.option.ConnectionDriverName'
     },
-    {
-      componentName: 'HIVE_SERVER',
-      configs: [
-        {
-          site: 'hive-site',
-          keytab: 'hive.server2.authentication.kerberos.keytab',
-          principal: 'hive.server2.authentication.kerberos.principal'
-        },
-        {
-          site: 'hive-site',
-          keytab: 'hive.server2.authentication.spnego.keytab',
-          principal: 'hive.server2.authentication.spnego.principal'
-        }
-      ]
-    },
-    {
-      componentName: 'HIVE_METASTORE',
-      configs: [
-        {
-          site: 'hive-site',
-          keytab: 'hive.metastore.kerberos.keytab.file',
-          principal: 'hive.metastore.kerberos.principal'
-        }
-      ]
-    }
-
-  ],
-
-  /**
-   * set additional configs
-   * configs_Hadoop2 - configs which belongs to Hadoop 2 stack only
-   * @param configs
-   * @param componentName
-   * @param replaceValue
-   * @return {Boolean}
-   */
-  setAdditionalConfigs: function (configs, componentName, replaceValue) {
-    var component = this.get('additionalConfigsMap').findProperty('componentName', componentName);
-
-    if (Em.isNone(component)) return false;
-    var additionalConfigs = (component.configs_Hadoop2) ? component.configs_Hadoop2 : component.configs;
-
-    for (var site in additionalConfigs) {
-      if (additionalConfigs.hasOwnProperty(site)) {
-        for (var property in additionalConfigs[site]) {
-          if (additionalConfigs[site].hasOwnProperty(property)) {
-            if (App.get('isHaEnabled') && componentName === 'NAMENODE' && (property === 'fs.defaultFS' || property === 'dfs.namenode.rpc-address')) continue;
-
-            configs[site][property] = additionalConfigs[site][property].replace('<replace-value>', replaceValue);
-          }
-        }
-      }
+    'OOZIE_SERVER': {
+      type: 'oozie-site',
+      name: 'oozie.service.JPAService.jdbc.url'
     }
-    return true;
   },
 
   /**
@@ -397,7 +149,7 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro
       this.removeTasks(['startZooKeeperServers', 'startNameNode']);
     }
 
-    if (this.get('componentsWithoutReconfiguration').contains(componentName)) {
+    if (!this.get('wizardController.isComponentWithReconfiguration')) {
       this.removeTasks(['reconfigure']);
     }
 
@@ -457,7 +209,7 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro
    * make server call to stop services
    */
   stopRequiredServices: function () {
-    this.stopServices(this.get('relatedServicesMap')[this.get('content.reassign.component_name')], true);
+    this.stopServices(this.get('wizardController.relatedServicesMap')[this.get('content.reassign.component_name')], true);
   },
 
   createHostComponents: function () {
@@ -502,309 +254,11 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro
   },
 
   reconfigure: function () {
-    this.loadConfigsTags();
-  },
-
-  loadConfigsTags: function () {
-    App.ajax.send({
-      name: 'config.tags',
-      sender: this,
-      success: 'onLoadConfigsTags',
-      error: 'onTaskError'
-    });
-  },
-
-  serviceToConfigSiteMap: {
-    'NAMENODE': ['hdfs-site', 'core-site'],
-    'SECONDARY_NAMENODE': ['hdfs-site', 'core-site'],
-    'JOBTRACKER': ['mapred-site'],
-    'RESOURCEMANAGER': ['yarn-site'],
-    'WEBHCAT_SERVER': ['hive-env', 'webhcat-site', 'core-site'],
-    'APP_TIMELINE_SERVER': ['yarn-site', 'yarn-env'],
-    'OOZIE_SERVER': ['oozie-site', 'core-site', 'oozie-env'],
-    'HIVE_SERVER': ['hive-site', 'webhcat-site', 'hive-env', 'core-site'],
-    'HIVE_METASTORE': ['hive-site', 'webhcat-site', 'hive-env', 'core-site'],
-    'MYSQL_SERVER': ['hive-site'],
-    'HISTORYSERVER': ['mapred-site']
-  },
-
-  /**
-   * construct URL parameters for config call
-   * @param componentName
-   * @param data
-   * @return {Array}
-   */
-  getConfigUrlParams: function (componentName, data) {
-    var urlParams = [];
-
-    this.get('serviceToConfigSiteMap')[componentName].forEach(function(site){
-      urlParams.push('(type=' + site + '&tag=' + data.Clusters.desired_configs[site].tag + ')');
-    });
-
-    // specific cases for NameNode component
-    if (componentName === 'NAMENODE') {
-        if (App.Service.find().someProperty('serviceName', 'HBASE')) {
-          urlParams.push('(type=hbase-site&tag=' + data.Clusters.desired_configs['hbase-site'].tag + ')');
-        }
-        if (App.Service.find().someProperty('serviceName', 'ACCUMULO')) {
-          urlParams.push('(type=accumulo-site&tag=' + data.Clusters.desired_configs['accumulo-site'].tag + ')');
-        }
-        if (App.Service.find().someProperty('serviceName', 'HAWQ')) {
-          urlParams.push('(type=hawq-site&tag=' + data.Clusters.desired_configs['hawq-site'].tag + ')');
-          urlParams.push('(type=hdfs-client&tag=' + data.Clusters.desired_configs['hdfs-client'].tag + ')');
-        }
-    }
-
-    if (componentName === 'RESOURCEMANAGER') {
-        if (App.Service.find().someProperty('serviceName', 'HAWQ')) {
-          urlParams.push('(type=hawq-site&tag=' + data.Clusters.desired_configs['hawq-site'].tag + ')');
-          urlParams.push('(type=yarn-client&tag=' + data.Clusters.desired_configs['yarn-client'].tag + ')');
-        }
-    }
-
-    return urlParams;
-  },
-
-  onLoadConfigsTags: function (data) {
-    var urlParams = this.getConfigUrlParams(this.get('content.reassign.component_name'), data);
-
-    App.ajax.send({
-      name: 'reassign.load_configs',
-      sender: this,
-      data: {
-        urlParams: urlParams.join('|')
-      },
-      success: 'onLoadConfigs',
-      error: 'onTaskError'
-    });
-  },
-
-  /**
-   *
-   * @returns {extendedTopologyLocalDB}
-   * @private
-   * @method _prepareTopologyDB
-   */
-  _prepareTopologyDB: function () {
-    var ret = this.get('content').getProperties(['masterComponentHosts', 'slaveComponentHosts', 'hosts']);
-    ret.installedServices = App.Service.find().mapProperty('serviceName');
-    return ret;
-  },
-
-  /**
-   * Create dependencies for Config Initializers
-   *
-   * @param {object} additionalDependencies  some additional information that should be added
-   * @returns {reassignComponentDependencies}
-   * @private
-   * @method _prepareDependencies
-   */
-  _prepareDependencies: function (additionalDependencies) {
-    additionalDependencies = additionalDependencies || {};
-    var ret = {};
-    ret.sourceHostName = this.get('content.reassignHosts.source');
-    ret.targetHostName = this.get('content.reassignHosts.target');
-    return Em.merge(ret, additionalDependencies);
-  },
-
-  /**
-   * Get additional dependencies-data for App.MoveRmConfigInitializer
-   *
-   * @param {object} configs
-   * @returns {object}
-   * @private
-   * @method _getRmAdditionalDependencies
-   */
-  _getRmAdditionalDependencies: function (configs) {
-    var ret = {};
-    var rm1 = configs['yarn-site']['yarn.resourcemanager.hostname.rm1'];
-    if (rm1) {
-      ret.rm1 = rm1;
-    }
-    var rm2 = configs['yarn-site']['yarn.resourcemanager.hostname.rm2'];
-    if (rm2) {
-      ret.rm2 = rm2;
-    }
-    return ret;
-  },
-
-  /**
-   * Settings used to the App.MoveOSConfigInitializer setup
-   *
-   * @param {object} configs
-   * @returns {object}
-   * @private
-   * @method _getOsInitializerSettings
-   */
-  _getOsInitializerSettings: function (configs) {
-    var ret = {};
-    var cfg = configs['oozie-env']['oozie_user'];
-    if (cfg) {
-      ret.oozieUser = cfg;
-    }
-    return ret;
-  },
-
-  /**
-   * Get additional dependencies-data for App.MoveNameNodeConfigInitializer
-   *
-   * @param {object} configs
-   * @returns {object}
-   * @private
-   * @method _getNnInitializerSettings
-   */
-  _getNnInitializerSettings: function (configs) {
-    var ret = {};
-    if (App.get('isHaEnabled')) {
-      ret.namespaceId = configs['hdfs-site']['dfs.nameservices'];
-      ret.suffix = (configs['hdfs-site']['dfs.namenode.http-address.' + ret.namespaceId + '.nn1'].indexOf(this.get('content.reassignHosts.source')) != -1) ? 'nn1' : 'nn2';
-    }
-    return ret;
-  },
-
-  /**
-   * Settings used to the App.MoveHsConfigInitializer and App.MoveHmConfigInitializer setup
-   *
-   * @param {object} configs
-   * @returns {{hiveUser: string}}
-   * @private
-   * @method _getHiveInitializerSettings
-   */
-  _getHiveInitializerSettings: function (configs) {
-    return {
-      hiveUser: configs['hive-env']['hive_user']
-    };
-  },
-
-  /**
-   * Settings used to the App.MoveWsConfigInitializer setup
-   *
-   * @param {object} configs
-   * @returns {{webhcatUser: string}}
-   * @private
-   * @method _getWsInitializerSettings
-   */
-  _getWsInitializerSettings: function (configs) {
-    return {
-      webhcatUser: configs['hive-env']['webhcat_user']
-    };
-  },
-
-  /**
-   * Settings used to the App.MoveRmConfigInitializer setup
-   *
-   * @param {object} configs
-   * @returns {{suffix: string}}
-   * @private
-   * @method _getRmInitializerSettings
-   */
-  _getRmInitializerSettings: function (configs) {
-    return {
-      suffix: configs['yarn-site']['yarn.resourcemanager.hostname.rm1'] === this.get('content.reassignHosts.source') ? 'rm1': 'rm2'
-    };
-  },
-
-  onLoadConfigs: function (data) {
-    // Find hawq-site.xml location
-    var hawqSiteIndex = -1;
-    for(var i = 0; i < data.items.length; i++){
-      if(data.items[i].type == 'hawq-site'){
-        hawqSiteIndex = i;
-        break;
-      }
-    }
-
-    // if certain services are deployed, include related site files to additionalConfigsMap and relatedServicesMap.
-    if(hawqSiteIndex >= 0){ // if HAWQ is deployed
-      var hawqSiteProperties = {
-        'hawq_rm_yarn_address': '<replace-value>:8050',
-        'hawq_rm_yarn_scheduler_address': '<replace-value>:8030'
-      }
-
-      var rmComponent = this.get('additionalConfigsMap').findProperty('componentName', "RESOURCEMANAGER");
-      rmComponent.configs["hawq-site"] = hawqSiteProperties;
-
-      if(data.items[hawqSiteIndex].properties["hawq_global_rm_type"].toLowerCase() === "yarn"){
-        this.get('relatedServicesMap')['RESOURCEMANAGER'].append('HAWQ');
-      }
-
-    }
-
-    var componentName = this.get('content.reassign.component_name');
-    var targetHostName = this.get('content.reassignHosts.target');
-    var configs = {};
-    var secureConfigs = [];
-
-    data.items.forEach(function (item) {
-      configs[item.type] = item.properties;
-    }, this);
-
-    this.setAdditionalConfigs(configs, componentName, targetHostName);
-    this.setSecureConfigs(secureConfigs, configs, componentName);
-
-    switch (componentName) {
-      case 'NAMENODE':
-        App.MoveNameNodeConfigInitializer.setup(this._getNnInitializerSettings(configs));
-        configs = this.setDynamicConfigs(configs, App.MoveNameNodeConfigInitializer);
-        App.MoveNameNodeConfigInitializer.cleanup();
-        break;
-      case 'RESOURCEMANAGER':
-        App.MoveRmConfigInitializer.setup(this._getRmInitializerSettings(configs));
-        var additionalDependencies = this._getRmAdditionalDependencies(configs);
-        configs = this.setDynamicConfigs(configs, App.MoveRmConfigInitializer, additionalDependencies);
-        App.MoveRmConfigInitializer.cleanup();
-        break;
-      case 'HIVE_METASTORE':
-        App.MoveHmConfigInitializer.setup(this._getHiveInitializerSettings(configs));
-        configs = this.setDynamicConfigs(configs, App.MoveHmConfigInitializer);
-        App.MoveHmConfigInitializer.cleanup();
-        break;
-      case 'HIVE_SERVER':
-        App.MoveHsConfigInitializer.setup(this._getHiveInitializerSettings(configs));
-        configs = this.setDynamicConfigs(configs, App.MoveHsConfigInitializer);
-        App.MoveHsConfigInitializer.cleanup();
-        break;
-      case 'WEBHCAT_SERVER':
-        App.MoveWsConfigInitializer.setup(this._getWsInitializerSettings(configs));
-        configs = this.setDynamicConfigs(configs, App.MoveWsConfigInitializer);
-        App.MoveWsConfigInitializer.cleanup();
-        break;
-      case 'OOZIE_SERVER':
-        App.MoveOSConfigInitializer.setup(this._getOsInitializerSettings(configs));
-        configs = this.setDynamicConfigs(configs, App.MoveOSConfigInitializer);
-        App.MoveOSConfigInitializer.cleanup();
-    }
-
+    var configs = this.get('content.configs'),
+      secureConfigs = this.get('content.secureConfigs'),
+      componentName = this.get('content.reassign.component_name');
     this.saveClusterStatus(secureConfigs, this.getComponentDir(configs, componentName));
     this.saveConfigsToServer(configs);
-    this.saveServiceProperties(configs);
-  },
-
-  /**
-   * Set config values according to the new cluster topology
-   *
-   * @param {object} configs
-   * @param {MoveComponentConfigInitializerClass} initializer
-   * @param {object} [additionalDependencies={}]
-   * @returns {object}
-   * @method setDynamicConfigs
-   */
-  setDynamicConfigs: function (configs, initializer, additionalDependencies) {
-    additionalDependencies = additionalDependencies || {};
-    var topologyDB = this._prepareTopologyDB();
-    var dependencies = this._prepareDependencies(additionalDependencies);
-    Em.keys(configs).forEach(function (site) {
-      Em.keys(configs[site]).forEach(function (config) {
-        // temporary object for initializer
-        var cfg = {
-          name: config,
-          filename: site,
-          value: configs[site][config]
-        };
-        configs[site][config] = initializer.initialValue(cfg, topologyDB, dependencies).value;
-      });
-    });
-    return configs;
   },
 
   /**
@@ -884,27 +338,6 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro
   },
 
   /**
-   * set secure configs for component
-   * @param secureConfigs
-   * @param configs
-   * @param componentName
-   * @return {Boolean}
-   */
-  setSecureConfigs: function (secureConfigs, configs, componentName) {
-    var securityEnabled = App.get('isKerberosEnabled');
-    var component = this.get('secureConfigsMap').findProperty('componentName', componentName);
-    if (Em.isNone(component) || !securityEnabled) return false;
-
-    component.configs.forEach(function (config) {
-      secureConfigs.push({
-        keytab: configs[config.site][config.keytab],
-        principal: configs[config.site][config.principal]
-      });
-    });
-    return true;
-  },
-
-  /**
    * derive component directory from configurations
    * @param configs
    * @param componentName
@@ -966,7 +399,7 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro
    * make server call to start services
    */
   startRequiredServices: function () {
-    var relatedServices = this.get('relatedServicesMap')[this.get('content.reassign.component_name')];
+    var relatedServices = this.get('wizardController.relatedServicesMap')[this.get('content.reassign.component_name')];
     if (relatedServices) {
       this.startServices(false, relatedServices, true);
     } else {
@@ -1150,10 +583,11 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro
   }.property('propertiesPattern'),
 
   getConnectionProperty: function(regexp) {
-    var propertyName = this.get('requiredProperties').filter(function(item) {
+    var configType = this.get('requiredProperties.type'),
+      propertyName = this.get('requiredProperties.names').filter(function(item) {
       return regexp.test(item);
     })[0];
-    return this.get('content.serviceProperties')[propertyName];
+    return Em.getWithDefault(this.get('content.configs'), configType, {})[propertyName];
   },
 
   /**
@@ -1174,18 +608,35 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro
   /** @property {object} requiredProperties - properties that necessary for database connection **/
   requiredProperties: function() {
     var propertiesMap = {
-      OOZIE: ['oozie.db.schema.name','oozie.service.JPAService.jdbc.username','oozie.service.JPAService.jdbc.password','oozie.service.JPAService.jdbc.driver','oozie.service.JPAService.jdbc.url'],
-      HIVE: ['ambari.hive.db.schema.name','javax.jdo.option.ConnectionUserName','javax.jdo.option.ConnectionPassword','javax.jdo.option.ConnectionDriverName','javax.jdo.option.ConnectionURL']
+      OOZIE: {
+        type: 'oozie-site',
+        names: ['oozie.db.schema.name', 'oozie.service.JPAService.jdbc.username', 'oozie.service.JPAService.jdbc.password', 'oozie.service.JPAService.jdbc.driver', 'oozie.service.JPAService.jdbc.url']
+      },
+      HIVE: {
+        type: 'hive-site',
+        names: ['ambari.hive.db.schema.name', 'javax.jdo.option.ConnectionUserName', 'javax.jdo.option.ConnectionPassword', 'javax.jdo.option.ConnectionDriverName', 'javax.jdo.option.ConnectionURL']
+      }
     };
 
     return propertiesMap[this.get('content.reassign.service_id')];
   }.property(),
 
   dbType: function() {
-    var databaseTypes = /MySQL|PostgreS|Oracle|Derby|MSSQL|Anywhere/gi;
-    var databaseProp = this.get('content.serviceProperties')[Em.getWithDefault(this.get('dbPropertyMap'), this.get('content.reassign.component_name'), null)];
+    var databaseTypes = /MySQL|PostgreS|Oracle|Derby|MSSQL|Anywhere/gi,
+      dbPropertyMapItem = Em.getWithDefault(this.get('dbPropertyMap'), this.get('content.reassign.component_name'), null),
+      databasePropMatch,
+      databaseProp,
+      result;
+
+    if (dbPropertyMapItem) {
+      databaseProp = Em.getWithDefault(this.get('content.configs'), dbPropertyMapItem.type, {})[dbPropertyMapItem.name];
+      databasePropMatch = databaseProp && databaseProp.match(databaseTypes);
+      if (databasePropMatch) {
+        result = databasePropMatch[0];
+      }
+    }
 
-    return databaseProp.match(databaseTypes)[0];
+    return result;
   }.property(),
 
   prepareDBCheckAction: function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/cba69d93/ambari-web/app/controllers/main/service/reassign_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/reassign_controller.js b/ambari-web/app/controllers/main/service/reassign_controller.js
index 07d6e2c..e512835 100644
--- a/ambari-web/app/controllers/main/service/reassign_controller.js
+++ b/ambari-web/app/controllers/main/service/reassign_controller.js
@@ -131,6 +131,8 @@ App.ReassignMasterController = App.WizardController.extend({
           this.loadTasksRequestIds();
           this.loadRequestIds();
           this.loadReassignComponentsInMM();
+          this.loadConfigs();
+          this.loadSecureConfigs();
         }
       }
     ],
@@ -138,13 +140,46 @@ App.ReassignMasterController = App.WizardController.extend({
       {
         type: 'sync',
         callback: function () {
-          this.loadSecureConfigs();
           this.loadComponentDir();
         }
       }
     ]
   },
 
+  serviceToConfigSiteMap: {
+    'NAMENODE': ['hdfs-site', 'core-site'],
+    'SECONDARY_NAMENODE': ['hdfs-site', 'core-site'],
+    'JOBTRACKER': ['mapred-site'],
+    'RESOURCEMANAGER': ['yarn-site'],
+    'WEBHCAT_SERVER': ['hive-env', 'webhcat-site', 'core-site'],
+    'APP_TIMELINE_SERVER': ['yarn-site', 'yarn-env'],
+    'OOZIE_SERVER': ['oozie-site', 'core-site', 'oozie-env'],
+    'HIVE_SERVER': ['hive-site', 'webhcat-site', 'hive-env', 'core-site'],
+    'HIVE_METASTORE': ['hive-site', 'webhcat-site', 'hive-env', 'core-site'],
+    'MYSQL_SERVER': ['hive-site'],
+    'HISTORYSERVER': ['mapred-site']
+  },
+
+  /**
+   * Map with lists of related services.
+   * Used to define list of services to stop/start.
+   */
+  relatedServicesMap: {
+    'JOBTRACKER': ['PIG', 'OOZIE'],
+    'RESOURCEMANAGER': ['YARN', 'MAPREDUCE2', 'TEZ', 'PIG', 'OOZIE', 'SLIDER', 'SPARK'],
+    'APP_TIMELINE_SERVER': ['YARN', 'MAPREDUCE2', 'TEZ', 'OOZIE', 'SLIDER', 'SPARK'],
+    'HIVE_SERVER': ['HIVE', 'FALCON', 'ATLAS', 'OOZIE'],
+    'HIVE_METASTORE': ['HIVE', 'PIG', 'FALCON', 'ATLAS', 'OOZIE'],
+    'WEBHCAT_SERVER': ['HIVE'],
+    'OOZIE_SERVER': ['OOZIE', 'FALCON', 'KNOX'],
+    'MYSQL_SERVER': ['HIVE', 'OOZIE', 'RANGER', 'RANGER_KMS'],
+    'METRICS_COLLECTOR': ['AMBARI_METRICS']
+  },
+
+  isComponentWithReconfiguration: function () {
+    return this.get('serviceToConfigSiteMap').hasOwnProperty(this.get('content.reassign.component_name'));
+  }.property('content.reassign.component_name'),
+
   addManualSteps: function () {
     var hasManualSteps = this.get('content.componentsWithManualCommands').contains(this.get('content.reassign.component_name'));
     this.set('content.hasManualSteps', hasManualSteps);
@@ -285,6 +320,16 @@ App.ReassignMasterController = App.WizardController.extend({
     this.set('content.serviceProperties', serviceProperties);
   },
 
+  saveConfigs: function (configs) {
+    this.setDBProperty('configs', configs);
+    this.set('content.configs', configs);
+  },
+
+  loadConfigs: function () {
+    var configs = this.getDBProperty('configs');
+    this.set('content.configs', configs);
+  },
+
   saveDatabaseType: function (type) {
     this.setDBProperty('databaseType', type);
     this.set('content.databaseType', type);

http://git-wip-us.apache.org/repos/asf/ambari/blob/cba69d93/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 7ed5826..cacb798 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -1316,7 +1316,8 @@ Em.I18n.translations = {
   'admin.manageJournalNode.wizard.step8.header': 'Start All Services',
 
   'admin.manageJournalNode.wizard.step1.body': 'Add, or Remove JournalNodes',
-  'admin.manageJournalNode.wizard.step3.confirm.config.body': '<b>Configuration Change Review.</b></br>' +
+  'admin.manageJournalNode.wizard.step3.confirm.hosts.body': '<b>Confirm your host selections.</b>',
+  'admin.manageJournalNode.wizard.step3.confirm.config.body': '<p><b>Review Configuration Changes.</b></p>' +
   'As part of this process, configuration changes are required. Please review the changes below, and note that they are for <b>review only</b>.  Future steps in this wizard will update this configuration, and restart <b>all</b> services automatically.',
 
   'admin.manageJournalNode.wizard.step4.task0.title' : 'Stop Standby NameNode',
@@ -1541,7 +1542,7 @@ Em.I18n.translations = {
     '</ol>',
   'admin.highAvailability.wizard.step3.confirm.host.body':'<b>Confirm your host selections.</b>',
   'admin.highAvailability.wizard.step3.confirm.config.body':'<div class="alert alert-info">' +
-    '<b>Review Configuration Changes.</b></br>' +
+    '<p><b>Review Configuration Changes.</b></p>' +
     'The following lists the configuration changes that will be made by the Wizard to enable NameNode HA. This information is for <b> review only </b> and is not editable except for the  <b>dfs.journalnode.edits.dir</b> property' +
     '</div>',
   'admin.highAvailability.wizard.step2.body':'Select a host that will be running the additional NameNode.<br/> In addition,' +
@@ -1568,7 +1569,7 @@ Em.I18n.translations = {
   'admin.rm_highAvailability.wizard.step3.header': 'Review',
   'admin.rm_highAvailability.wizard.step3.confirm.host.body':'<b>Confirm your host selections.</b>',
   'admin.rm_highAvailability.wizard.step3.confirm.config.body':'<div class="alert alert-info">' +
-      '<b>Review Configuration Changes.</b></br>' +
+      '<p><b>Review Configuration Changes.</b></p>' +
       'The following lists the configuration changes that will be made by the Wizard to enable ResourceManager HA. This information is for <b> review only </b> and is not editable.' +
       '</div>',
   'admin.rm_highAvailability.wizard.step3.currentRM': 'Current ResourceManager',
@@ -1600,7 +1601,7 @@ Em.I18n.translations = {
   'admin.ra_highAvailability.wizard.step3.alert_message': '<b>Confirm your host selections.</b>',
   'admin.ra_highAvailability.wizard.step3.currentRA': 'Current Ranger Admin',
   'admin.ra_highAvailability.wizard.step3.additionalRA': 'Additional Ranger Admin',
-  'admin.rm_highAvailability.wizard.step3.configs_changes': '<b>Review Configuration Changes.</b></br>' +
+  'admin.rm_highAvailability.wizard.step3.configs_changes': '<p><b>Review Configuration Changes.</b></p>' +
   '<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 All Services',
@@ -2284,10 +2285,12 @@ Em.I18n.translations = {
   'services.reassign.step2.body':'Assign {0} to new host.',
   'services.reassign.step2.body.namenodeHA':'Move {0} to new host. You can move only one master component at a time.',
   'services.reassign.step3.header':'Review',
-  'services.reassign.step3.body':'Please review the changes you made',
+  'services.reassign.step3.body':'<b>Confirm your host selections.</b>',
   'services.reassign.step3.targetHost':'Target Host:',
   'services.reassign.step3.sourceHost':'Source Host:',
   'services.reassign.step3.component':'Component name:',
+  'services.reassign.step3.configs':'<div class="alert alert-info">' +
+    '<p><b>Review Configuration Changes.</b></p>The Wizard will make the following configuration changes.</div>',
   'services.reassign.step4.header':'Configure Component',
 
   'services.reassign.step4.tasks.stopRequiredServices.title':'Stop Required Services',
@@ -3245,8 +3248,8 @@ Em.I18n.translations = {
   'admin.addHawqStandby.wizard.step3.header': 'Review',
   'admin.addHawqStandby.wizard.step3.configs_changes': 'Review Configuration Changes.',
   'admin.addHawqStandby.wizard.step3.confirm.host.body':'<b>Confirm your host selections.</b>',
-  'admin.addHawqStandby.wizard.step3.confirm.config.body':'<div class="alert alert-info">' +
-      '<b>Review Configuration Changes.</b><br/><br/>' +
+  'admin.addHawqStandby.wizard.step3.confirm.config.body':'<p class="alert alert-info">' +
+      '<p><b>Review Configuration Changes.</b></p>' +
       'The following lists the configuration changes that will be made by the Wizard to add HAWQ Standby Master. ' +
       'This information is for <b> review only </b> and is not editable.</div>',
   'admin.addHawqStandby.wizard.step3.hawqMaster': 'Current HAWQ Master',
@@ -3277,7 +3280,7 @@ Em.I18n.translations = {
   'admin.removeHawqStandby.wizard.step2.header': 'Review',
   'admin.removeHawqStandby.wizard.step2.hawqStandby': '<b>Current HAWQ Standby:</b>',
   'admin.removeHawqStandby.wizard.step2.confirm.config.body':'<div class="alert alert-info">' +
-      '<b>Review Configuration Changes.</b></br></br>After removing the HAWQ Standby Master, the Wizard removes the ' +
+      '<p><b>Review Configuration Changes.</b></p>After removing the HAWQ Standby Master, the Wizard removes the ' +
       'hawq_standby_address_host property from hawq-site.xml. As a best practice, you should configure a new HAWQ Standby Master host after the Wizard completes.</div>',
   'admin.removeHawqStandby.wizard.step2.confirm.host.body':'<b>Review HAWQ Standby Master role changes.</b>',
   'admin.removeHawqStandby.wizard.step2.confirmPopup.body': 'Do you wish to continue with removing HAWQ Standby Master? Please confirm, before proceeding as you will not be able to rollback from Ambari.',
@@ -3312,7 +3315,7 @@ Em.I18n.translations = {
   'admin.activateHawqStandby.wizard.step2.toBeActivated': 'TO BE ACTIVATED AS NEW HAWQ MASTER',
   'admin.activateHawqStandby.step4.save.configuration.note': 'This configuration is created by Activate HAWQ Standby wizard',
   'admin.activateHawqStandby.wizard.step2.confirm.config.body': '<div class="alert alert-info">' +
-      '<b>Review Configuration Changes.</b><br/><br/>The Wizard will make the following configuration changes. '+
+      '<p><b>Review Configuration Changes.</b></p>The Wizard will make the following configuration changes. '+
       'This information is for review only, and cannot be edited.<br/><br/><b>After activating the HAWQ Standby ' +
       'Master, the wizard removes the hawq_standby_address_host property from hawq-site.xml.</b> ' +
       'As a best practice, you should configure a new HAWQ Standby Master host after the wizard completes.</div>',

http://git-wip-us.apache.org/repos/asf/ambari/blob/cba69d93/ambari-web/app/routes/reassign_master_routes.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/routes/reassign_master_routes.js b/ambari-web/app/routes/reassign_master_routes.js
index 10ad0e9..a2a9743 100644
--- a/ambari-web/app/routes/reassign_master_routes.js
+++ b/ambari-web/app/routes/reassign_master_routes.js
@@ -170,16 +170,21 @@ module.exports = App.WizardRoute.extend({
   step3: Em.Route.extend({
     route: '/step3',
     connectOutlets: function (router) {
-      var controller = router.get('reassignMasterController');
+      var controller = router.get('reassignMasterController'),
+        stepController = router.get('reassignMasterWizardStep3Controller');
       controller.setCurrentStep('3');
       controller.dataLoading().done(function () {
         controller.loadAllPriorSteps();
+        stepController.set('wizardController', controller);
         controller.connectOutlet('reassignMasterWizardStep3', controller.get('content'));
       })
     },
     back: Em.Router.transitionTo('step2'),
     next: function (router) {
-      var controller = router.get('reassignMasterController');
+      var controller = router.get('reassignMasterController'),
+        stepController = router.get('reassignMasterWizardStep3Controller'),
+        configs = stepController.get('configs'),
+        secureConfigs = stepController.get('secureConfigs');
       App.db.setReassignTasksStatuses(undefined);
       App.db.setReassignTasksRequestIds(undefined);
       App.clusterStatus.setClusterStatus({
@@ -189,9 +194,16 @@ module.exports = App.WizardRoute.extend({
         localdb: App.db.data
       });
       controller.saveReassignComponentsInMM(controller.getReassignComponentsInMM());
+      stepController.updateServiceConfigs();
+      controller.saveConfigs(configs);
+      controller.saveSecureConfigs(secureConfigs);
       router.transitionTo('step4');
     },
 
+    exit: function (router) {
+      router.get('reassignMasterWizardStep3Controller').clearStep();
+    },
+
     unroutePath: function () {
       return false;
     }
@@ -200,11 +212,13 @@ module.exports = App.WizardRoute.extend({
   step4: Em.Route.extend({
     route: '/step4',
     connectOutlets: function (router) {
-      var controller = router.get('reassignMasterController');
+      var controller = router.get('reassignMasterController'),
+        stepController = router.get('reassignMasterWizardStep4Controller');
       controller.setCurrentStep('4');
       controller.setLowerStepsDisable(4);
       router.get('mainController').isLoading.call(router.get('clusterController'), 'isServiceContentFullyLoaded').done(function () {
         controller.loadAllPriorSteps();
+        stepController.set('wizardController', controller);
         controller.connectOutlet('reassignMasterWizardStep4', controller.get('content'));
       });
     },
@@ -304,11 +318,13 @@ module.exports = App.WizardRoute.extend({
   step7: Em.Route.extend({
     route: '/step7',
     connectOutlets: function (router) {
-      var controller = router.get('reassignMasterController');
+      var controller = router.get('reassignMasterController'),
+        stepController = router.get('reassignMasterWizardStep7Controller');
       controller.setCurrentStep('7');
       controller.setLowerStepsDisable(7);
       controller.dataLoading().done(function () {
         controller.loadAllPriorSteps();
+        stepController.set('wizardController', controller);
         controller.connectOutlet('reassignMasterWizardStep7', controller.get('content'));
       });
     },

http://git-wip-us.apache.org/repos/asf/ambari/blob/cba69d93/ambari-web/app/styles/wizard.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/wizard.less b/ambari-web/app/styles/wizard.less
index 2dbdd03..579b21b 100644
--- a/ambari-web/app/styles/wizard.less
+++ b/ambari-web/app/styles/wizard.less
@@ -377,7 +377,7 @@
     margin-top: 8px;
   }
 
-  #ha-step3-review-table, #manage-journal-node-step2-review-table {
+  #ha-step3-review-table, #manage-journal-node-step2-review-table, #reassign-review-table {
     td {
       text-align: left;
       vertical-align: top;

http://git-wip-us.apache.org/repos/asf/ambari/blob/cba69d93/ambari-web/app/templates/main/admin/highAvailability/journalNode/step2.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/highAvailability/journalNode/step2.hbs b/ambari-web/app/templates/main/admin/highAvailability/journalNode/step2.hbs
index 0cd177d..d537585 100644
--- a/ambari-web/app/templates/main/admin/highAvailability/journalNode/step2.hbs
+++ b/ambari-web/app/templates/main/admin/highAvailability/journalNode/step2.hbs
@@ -18,63 +18,66 @@
 
 <div class="wizard-content col-md-9">
   <h4 class="step-title">{{t admin.manageJournalNode.wizard.step2.header}}</h4>
+  <p class="step-description">
+    {{t admin.manageJournalNode.wizard.step3.confirm.hosts.body}}
+  </p>
   <div class="panel panel-default">
     <div class="panel-body">
-    <div id="manage-journal-node-step2-content" class="well pre-scrollable">
-      <div id="step8-info">
-        <table id="manage-journal-node-step2-review-table">
+      <div id="manage-journal-node-step2-content" class="well pre-scrollable">
+        <div id="step8-info">
+          <table id="manage-journal-node-step2-review-table">
             {{#if view.journalNodesToAdd.length}}
-            <tr>
+              <tr>
                 <td>{{t admin.highAvailability.wizard.step3.journalNode}}</td>
                 <td>
-                    <ul>
-                        {{#each item in view.journalNodesToAdd}}
-                            <li>{{item}}</li>
-                        {{/each}}
-                    </ul>
+                  <ul>
+                    {{#each item in view.journalNodesToAdd}}
+                      <li>{{item}}</li>
+                    {{/each}}
+                  </ul>
                 </td>
                 <td>
-                    <ul>
-                        {{#each item in view.journalNodesToAdd}}
-                            <li><span class="to-be-installed-green"><i class="icon-plus"></i>
+                  <ul>
+                    {{#each item in view.journalNodesToAdd}}
+                      <li><span class="to-be-installed-green"><i class="icon-plus"></i>
                                 &nbsp;{{t admin.highAvailability.wizard.step3.toBeInstalled}}</span></li>
-                        {{/each}}
-                    </ul>
+                    {{/each}}
+                  </ul>
                 </td>
-            </tr>
+              </tr>
             {{/if}}
 
             {{#if view.journalNodesToDelete.length}}
-            <tr>
+              <tr>
                 <td>{{t admin.highAvailability.wizard.step3.journalNode}}</td>
                 <td>
-                    <ul>
-                        {{#each item in view.journalNodesToDelete}}
-                            <li>{{item}}</li>
-                        {{/each}}
-                    </ul>
+                  <ul>
+                    {{#each item in view.journalNodesToDelete}}
+                      <li>{{item}}</li>
+                    {{/each}}
+                  </ul>
                 </td>
                 <td>
-                    <ul>
-                        {{#each item in view.journalNodesToDelete}}
-                            <li><span class="to-be-disabled-red"><i class="icon-minus"></i>
+                  <ul>
+                    {{#each item in view.journalNodesToDelete}}
+                      <li><span class="to-be-disabled-red"><i class="icon-minus"></i>
                                 &nbsp;{{t admin.highAvailability.wizard.step3.toBeDeleted}}</span></li>
-                        {{/each}}
-                    </ul>
+                    {{/each}}
+                  </ul>
                 </td>
-            </tr>
+              </tr>
             {{/if}}
-        </table>
+          </table>
+        </div>
       </div>
-    </div>
       <div id="serviceConfig">
         {{#if controller.isLoaded}}
           <div class="alert alert-info">
             {{{t admin.manageJournalNode.wizard.step3.confirm.config.body}}}
           </div>
-            {{view App.ServiceConfigView isNotEditableBinding="controller.isNotEditable"}}
+          {{view App.ServiceConfigView isNotEditableBinding="controller.isNotEditable"}}
         {{else}}
-            {{view App.SpinnerView}}
+          {{view App.SpinnerView}}
         {{/if}}
       </div>
     </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/cba69d93/ambari-web/app/templates/main/service/reassign/step3.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/service/reassign/step3.hbs b/ambari-web/app/templates/main/service/reassign/step3.hbs
index 1f88fb5..1f6a393 100644
--- a/ambari-web/app/templates/main/service/reassign/step3.hbs
+++ b/ambari-web/app/templates/main/service/reassign/step3.hbs
@@ -28,17 +28,37 @@
   <div class="panel panel-default">
     <div class="panel-body">
       <div id="step8-content" class="well pre-scrollable">
-        <div id="printReview">
-          <a class="btn btn-info pull-right" {{action printReview target="view"}}>{{t common.print}}</a> <br/>
-        </div>
         <div id="step8-info">
-          <p><b>{{t services.reassign.step3.component}}</b> {{controller.content.reassign.display_name}}</p>
-
-          <p><b>{{t services.reassign.step3.sourceHost}}</b> {{view.sourceHost}}</p>
-
-          <p><b>{{t services.reassign.step3.targetHost}}</b> {{view.targetHost}}</p>
+          <table id="reassign-review-table">
+            <tr>
+              <td><b>{{t services.reassign.step3.component}}</b></td>
+              <td colspan="2">{{controller.content.reassign.display_name}}</td>
+            </tr>
+            <tr>
+              <td><b>{{t services.reassign.step3.sourceHost}}</b></td>
+              <td>{{view.sourceHost}}</td>
+              <td><span class="to-be-disabled-red"><i class="glyphicon glyphicon-minus"></i>&nbsp;{{t admin.highAvailability.wizard.step3.toBeDeleted}}</span></td>
+            </tr>
+            <tr>
+              <td><b>{{t services.reassign.step3.targetHost}}</b></td>
+              <td>{{view.targetHost}}</td>
+              <td><span class="to-be-installed-green"><i class="glyphicon glyphicon-plus"></i>&nbsp;{{t admin.highAvailability.wizard.step3.toBeInstalled}}</span></td>
+            </tr>
+          </table>
         </div>
       </div>
+      {{#if wizardController.isComponentWithReconfiguration}}
+        {{#if isLoaded}}
+          {{#if stepConfigs.length}}
+            <div id="serviceConfig">
+              {{t services.reassign.step3.configs}}
+              {{view App.ServiceConfigView}}
+            </div>
+          {{/if}}
+        {{else}}
+          {{view App.SpinnerView}}
+        {{/if}}
+      {{/if}}
     </div>
   </div>
 </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/cba69d93/ambari-web/app/views/main/service/reassign/step3_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/reassign/step3_view.js b/ambari-web/app/views/main/service/reassign/step3_view.js
index 003fcb6..b6a379e 100644
--- a/ambari-web/app/views/main/service/reassign/step3_view.js
+++ b/ambari-web/app/views/main/service/reassign/step3_view.js
@@ -27,8 +27,8 @@ App.ReassignMasterWizardStep3View = Em.View.extend({
 
   targetHost: Em.computed.alias('controller.content.reassignHosts.target'),
 
-  printReview: function () {
-    $("#step8-info").jqprint();
+  didInsertElement: function () {
+    this.get('controller').loadStep();
   },
 
   jdbcSetupMessage: function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/cba69d93/ambari-web/app/views/main/service/reassign/step5_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/reassign/step5_view.js b/ambari-web/app/views/main/service/reassign/step5_view.js
index 3a063b5..9c4f39d 100644
--- a/ambari-web/app/views/main/service/reassign/step5_view.js
+++ b/ambari-web/app/views/main/service/reassign/step5_view.js
@@ -43,8 +43,8 @@ App.ReassignMasterWizardStep5View = Em.View.extend({
     }
 
     if (this.get('controller.content.reassign.component_name') === 'APP_TIMELINE_SERVER') {
-      user = this.get('controller.content.serviceProperties.yarn-env.yarn_user');
-      path = this.get('controller.content.serviceProperties.yarn-site')['yarn.timeline-service.leveldb-timeline-store.path'];
+      user = this.get('controller.content.configs.yarn-env.yarn_user');
+      path = this.get('controller.content.configs.yarn-site')['yarn.timeline-service.leveldb-timeline-store.path'];
     }
 
     return Em.I18n.t('services.reassign.step5.body.' + this.get('controller.content.reassign.component_name').toLowerCase() + ha).

http://git-wip-us.apache.org/repos/asf/ambari/blob/cba69d93/ambari-web/test/controllers/main/service/reassign/step1_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/reassign/step1_controller_test.js b/ambari-web/test/controllers/main/service/reassign/step1_controller_test.js
index a43d91f..7dbf24a 100644
--- a/ambari-web/test/controllers/main/service/reassign/step1_controller_test.js
+++ b/ambari-web/test/controllers/main/service/reassign/step1_controller_test.js
@@ -33,7 +33,7 @@ describe('App.ReassignMasterWizardStep1Controller', function () {
   });
   controller.set('_super', Em.K);
 
-  describe('#loadConfigTags', function() {
+  describe('#loadConfigsTags', function() {
     beforeEach(function() {
       this.stub = sinon.stub(App.router, 'get');
     });
@@ -42,7 +42,7 @@ describe('App.ReassignMasterWizardStep1Controller', function () {
       this.stub.restore();
     });
 
-    it('tests loadConfigTags', function() {
+    it('tests loadConfigsTags', function() {
       controller.loadConfigsTags();
       var args = testHelpers.findAjaxRequest('name', 'config.tags');
       expect(args).exists;
@@ -77,8 +77,11 @@ describe('App.ReassignMasterWizardStep1Controller', function () {
     });
 
     it('tests getDatabaseHost', function() {
-      controller.set('content.serviceProperties', {
-        'javax.jdo.option.ConnectionURL': "jdbc:mysql://c6401/hive?createDatabaseIfNotExist=true"
+      controller.set('content.configs', {
+        'hive-site': {
+          'javax.jdo.option.ConnectionURL': 'jdbc:mysql://c6401/hive?createDatabaseIfNotExist=true'
+
+        }
       });
 
       controller.set('content.reassign.service_id', 'HIVE');
@@ -108,7 +111,8 @@ describe('App.ReassignMasterWizardStep1Controller', function () {
       sinon.stub(controller, 'getDatabaseHost', Em.K);
       sinon.stub(controller, 'saveDatabaseType', Em.K);
       sinon.stub(controller, 'saveServiceProperties', Em.K);
-    
+      sinon.stub(controller, 'saveConfigs', Em.K);
+
       reassignCtrl = App.router.reassignMasterController;
       reassignCtrl.set('content.hasManualSteps', true);
     });
@@ -117,12 +121,14 @@ describe('App.ReassignMasterWizardStep1Controller', function () {
       controller.getDatabaseHost.restore();
       controller.saveDatabaseType.restore();
       controller.saveServiceProperties.restore();
+      controller.saveConfigs.restore();
     });
   
     it('should not set hasManualSteps to false for oozie with derby db', function() {
       var data = {
         items: [
           {
+            type: 'oozie-site',
             properties: {
               'oozie.service.JPAService.jdbc.driver': 'jdbc:derby:${oozie.data.dir}/${oozie.db.schema.name}-db;create=true'
             }
@@ -141,6 +147,7 @@ describe('App.ReassignMasterWizardStep1Controller', function () {
       var data = {
         items: [
           {
+            type: 'oozie-site',
             properties: {
               'oozie.service.JPAService.jdbc.driver': 'mysql'
             }