Repository: ambari
Updated Branches:
  refs/heads/trunk 549783cde -> f9696fe8b


AMBARI-20535. Add Service wizard: "Configure Services" and "Configure 
identities" pages should be coincided      (akovalenko)


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

Branch: refs/heads/trunk
Commit: f9696fe8baedd9b9f318e0bcf0181dd050cf1c0a
Parents: 549783c
Author: Aleksandr Kovalenko <[email protected]>
Authored: Thu Mar 23 17:19:40 2017 +0200
Committer: Aleksandr Kovalenko <[email protected]>
Committed: Thu Mar 23 18:38:32 2017 +0200

----------------------------------------------------------------------
 .../app/controllers/main/admin/kerberos.js      |   1 +
 .../main/admin/kerberos/step4_controller.js     | 126 +-----
 .../main/admin/kerberos/wizard_controller.js    |  14 -
 .../controllers/main/service/add_controller.js  |  37 +-
 ambari-web/app/controllers/wizard.js            |   9 +
 .../app/controllers/wizard/step7_controller.js  | 135 ++++--
 .../app/controllers/wizard/step8_controller.js  |   2 +-
 .../app/mixins/wizard/addSecurityConfigs.js     | 444 ++++++++++++++++++-
 ambari-web/app/routes/add_kerberos_routes.js    |   2 +-
 ambari-web/app/routes/add_service_routes.js     |  99 ++---
 ambari-web/app/templates/main/service/add.hbs   |   7 +-
 ambari-web/app/utils/ajax/ajax.js               |   4 +
 .../admin/kerberos/step4_controller_test.js     | 166 -------
 .../main/service/add_controller_test.js         |  54 ---
 .../test/controllers/wizard/step7_test.js       |  32 +-
 .../test/controllers/wizard/step8_test.js       |   7 +-
 16 files changed, 603 insertions(+), 536 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/main/admin/kerberos.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/kerberos.js 
b/ambari-web/app/controllers/main/admin/kerberos.js
index 762f4d0..564fb35 100644
--- a/ambari-web/app/controllers/main/admin/kerberos.js
+++ b/ambari-web/app/controllers/main/admin/kerberos.js
@@ -360,6 +360,7 @@ App.MainAdminKerberosController = 
App.KerberosWizardStep4Controller.extend({
   setStepConfigs: function (properties) {
     this.get('stepConfigs').clear();
     this._super(properties);
+    this.set('selectedService', this.get('stepConfigs')[0]);
     this.get('stepConfigs').forEach(function (serviceConfig) {
       serviceConfig.set('initConfigsLength', 
serviceConfig.get('configs.length'));
     });

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/main/admin/kerberos/step4_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/kerberos/step4_controller.js 
b/ambari-web/app/controllers/main/admin/kerberos/step4_controller.js
index f23814c..275045e 100644
--- a/ambari-web/app/controllers/main/admin/kerberos/step4_controller.js
+++ b/ambari-web/app/controllers/main/admin/kerberos/step4_controller.js
@@ -17,12 +17,10 @@
  */
 
 var App = require('app');
-var blueprintUtils = require('utils/blueprint');
 require('controllers/wizard/step7_controller');
 
 App.KerberosWizardStep4Controller = 
App.WizardStep7Controller.extend(App.AddSecurityConfigs, 
App.ToggleIsRequiredMixin, App.KDCCredentialsControllerMixin, {
   name: 'kerberosWizardStep4Controller',
-  isWithinAddService: Em.computed.equal('wizardController.name', 
'addServiceController'),
 
   // stores configurations loaded by ConfigurationsController.getConfigsByTags
   servicesConfigurations: null,
@@ -36,10 +34,6 @@ App.KerberosWizardStep4Controller = 
App.WizardStep7Controller.extend(App.AddSecu
 
   loadStep: function() {
     var self, stored;
-    if (this.get('wizardController.skipConfigureIdentitiesStep')) {
-      App.router.send('next');
-      return;
-    }
     self = this;
     this.clearStep();
     stored = this.get('wizardController').loadCachedStepConfigValues(this) || 
[];
@@ -72,25 +66,12 @@ App.KerberosWizardStep4Controller = 
App.WizardStep7Controller.extend(App.AddSecu
    * @returns {$.Deferred}
    */
   getDescriptor: function() {
-    var self = this;
     var dfd = $.Deferred();
     var successCallback = function(data) {
       dfd.resolve(data);
     };
-    var checkDescriptor = function() {
-      if (self.get('isWithinAddService')) {
-        return App.ajax.send({
-          sender: self,
-          name: 'admin.kerberize.cluster_descriptor_artifact'
-        });
-      }
-      return $.Deferred().resolve().promise();
-    };
 
-    checkDescriptor().always(function(data, status) {
-      self.storeClusterDescriptorStatus(status === 'success');
-      self.loadClusterDescriptorConfigs(self.get('isWithinAddService') ? 
self.get('selectedServiceNames') : false).then(successCallback);
-    });
+    this.loadClusterDescriptorConfigs(false).then(successCallback);
     return dfd.promise();
   },
 
@@ -486,26 +467,6 @@ App.KerberosWizardStep4Controller = 
App.WizardStep7Controller.extend(App.AddSecu
   },
 
   /**
-   * Returns payload for recommendations request.
-   * Takes services' configurations and merge them with kerberos descriptor 
properties.
-   *
-   * @param {object[]} configurations services' configurations fetched from API
-   * @param {App.ServiceConfigProperty[]} kerberosDescriptor descriptor configs
-   * @returns {object} payload for recommendations request
-   */
-  getBlueprintPayloadObject: function(configurations, kerberosDescriptor) {
-    var recommendations = 
blueprintUtils.generateHostGroups(App.get('allHostNames'));
-    var mergedConfigurations = 
this.mergeDescriptorToConfigurations(configurations, 
this.createServicesStackDescriptorConfigs(kerberosDescriptor));
-    recommendations.blueprint.configurations = 
mergedConfigurations.reduce(function(p, c) {
-      p[c.type] = {};
-      p[c.type].properties = c.properties;
-      return p;
-    }, {});
-
-    return recommendations;
-  },
-
-  /**
    * @override
    */
   _saveRecommendedValues: function(data) {
@@ -551,89 +512,6 @@ App.KerberosWizardStep4Controller = 
App.WizardStep7Controller.extend(App.AddSecu
    */
   getServicesConfigObject: function() {
     return this.get('stepConfigs').findProperty('name', 'ADVANCED');
-  },
-
-  /**
-   * Returns map with appropriate action and properties to process with.
-   * Key is an action e.g. `add`, `update`, `delete` and value is  an object 
`fileName` -> `propertyName`: `propertyValue`.
-   *
-   * @param {object} recommendedConfigurations
-   * @param {object[]} servicesConfigurations services' configurations fetched 
from API
-   * @param {App.ServiceConfigProperty[]} allConfigs all current 
configurations stored in controller, basically kerberos descriptor
-   * @returns {object}
-   */
-  groupRecommendationProperties: function(recommendedConfigurations, 
servicesConfigurations, allConfigs) {
-    var resultMap = {
-      update: {},
-      add: {},
-      delete: {}
-    };
-
-    /**
-     * Adds property to associated group `add`,`delete`,`update`.
-     *
-     * @param {object} propertyMap <code>resultMap</code> object
-     * @param {string} name property name
-     * @param {string} propertyValue property value
-     * @param {string} fileName property file name
-     * @return {object} <code>resultMap</code>
-     * @param {string} group, `add`,`delete`,`update`
-     */
-    var addProperty = function(propertyMap, name, propertyValue, fileName, 
group) {
-      var ret = $.extend(true, {}, propertyMap);
-      if (ret.hasOwnProperty(group)) {
-        if (!ret[group].hasOwnProperty(fileName)) {
-          ret[group][fileName] = {};
-        }
-        ret[group][fileName][name] = propertyValue;
-      }
-      return ret;
-    };
-
-    return Em.keys(recommendedConfigurations || {}).reduce(function(acc, 
fileName) {
-      var propertyMap = acc;
-      var recommendedProperties = Em.getWithDefault(recommendedConfigurations, 
fileName + '.properties', {});
-      var recommendedAttributes = Em.getWithDefault(recommendedConfigurations, 
fileName + '.property_attributes', {});
-      // check for properties that should be delted
-      Em.keys(recommendedAttributes).forEach(function(propertyName) {
-        var attribute = recommendedAttributes[propertyName];
-        // delete properties which are present in kerberos descriptor
-        if (attribute.hasOwnProperty('delete') && 
allConfigs.filterProperty('filename', fileName).someProperty('name', 
propertyName)) {
-          propertyMap = addProperty(propertyMap, propertyName, '', fileName, 
'delete');
-        }
-      });
-
-      return Em.keys(recommendedProperties).reduce(function(a, propertyName) {
-        var propertyValue = recommendedProperties[propertyName];
-        // check if property exist in saved configurations on server
-        var isExist = 
Em.getWithDefault(servicesConfigurations.findProperty('type', fileName) || {}, 
'properties', {}).hasOwnProperty(propertyName);
-        if (!isExist) {
-          return addProperty(a, propertyName, propertyValue, fileName, 'add');
-        }
-        // when property exist check that it present in current step configs 
(kerberos descriptor)
-        // and add it as property to `update`
-        if (allConfigs.filterProperty('filename', 
fileName).someProperty('name', propertyName)) {
-          return addProperty(a, propertyName, propertyValue, fileName, 
'update');
-        }
-        return a;
-      }, propertyMap);
-    }, resultMap);
-  },
-
-  /**
-   *
-   * @method getServiceByFilename
-   * @param {string}fileName
-   * @returns {string}
-   */
-  getServiceByFilename: function(fileName) {
-    // core-site properties goes to HDFS
-    if (fileName === 'core-site' && 
App.Service.find().someProperty('serviceName', 'HDFS')) {
-      return 'HDFS';
-    }
-    var associatedService = App.StackService.find().filter(function(service) {
-      return Em.keys(service.get('configTypes')).contains(fileName);
-    })[0];
-    return associatedService ? associatedService.get('serviceName') : '';
   }
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js 
b/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
index 2f07e1f..93ffcaa 100644
--- a/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
+++ b/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
@@ -154,11 +154,6 @@ App.KerberosWizardController = 
App.WizardController.extend(App.InstallComponent,
     this.set('content.kerberosOption', stepController.get('selectedItem'));
   },
 
-  loadKerberosDescriptorConfigs: function () {
-    var kerberosDescriptorConfigs = 
this.getDBProperty('kerberosDescriptorConfigs');
-    this.set('kerberosDescriptorConfigs', kerberosDescriptorConfigs);
-  },
-
   /**
    * Override the visibility of a list of form items with a new value
    *
@@ -183,15 +178,6 @@ App.KerberosWizardController = 
App.WizardController.extend(App.InstallComponent,
     this.set('content.kerberosOption', this.getDBProperty('kerberosOption'));
   },
 
-  /**
-   * @method saveKerberosDescriptorConfigs
-   * @param {App.ServiceConfigProperty[]} kerberosDescriptorConfigs
-   */
-  saveKerberosDescriptorConfigs: function (kerberosDescriptorConfigs) {
-    this.setDBProperty('kerberosDescriptorConfigs', kerberosDescriptorConfigs);
-    this.set('kerberosDescriptorConfigs', kerberosDescriptorConfigs);
-  },
-
   createKerberosResources: function (callback) {
     var self = this;
     this.createKerberosService().done(function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/main/service/add_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/add_controller.js 
b/ambari-web/app/controllers/main/service/add_controller.js
index 0989f76..dc8f76c 100644
--- a/ambari-web/app/controllers/main/service/add_controller.js
+++ b/ambari-web/app/controllers/main/service/add_controller.js
@@ -22,7 +22,7 @@ App.AddServiceController = 
App.WizardController.extend(App.AddSecurityConfigs, {
 
   name: 'addServiceController',
 
-  totalSteps: 8,
+  totalSteps: 7,
 
   /**
    * @type {string}
@@ -122,6 +122,7 @@ App.AddServiceController = 
App.WizardController.extend(App.AddSecurityConfigs, {
         callback: function () {
           var self = this;
           var dfd = $.Deferred();
+          this.load('cluster');
           this.loadKerberosDescriptorConfigs().done(function() {
             self.loadServiceConfigGroups();
             self.loadConfigThemes().then(function() {
@@ -134,18 +135,6 @@ App.AddServiceController = 
App.WizardController.extend(App.AddSecurityConfigs, {
           return dfd.promise();
         }
       }
-    ],
-    '5': [
-      {
-        type: 'sync',
-        callback: function () {
-          this.checkSecurityStatus();
-          this.load('cluster');
-          this.set('content.additionalClients', []);
-          this.set('installClientQueueLength', 0);
-          this.set('installClietsQueue', App.ajaxQueue.create({abortOnError: 
false}));
-        }
-      }
     ]
   },
 
@@ -323,12 +312,17 @@ App.AddServiceController = 
App.WizardController.extend(App.AddSecurityConfigs, {
    */
   loadKerberosDescriptorConfigs: function() {
     var self = this,
-        dfd = $.Deferred();
+        dfd = $.Deferred(),
+        mergedDescriptorConfigs;
     if (App.get('isKerberosEnabled')) {
-      this.loadClusterDescriptorConfigs().then(function(properties) {
-        self.set('kerberosDescriptorConfigs', 
self.createServicesStackDescriptorConfigs(properties));
-      }).always(function(){
-        dfd.resolve();
+      this.loadClusterDescriptorStackConfigs().then(function (stackProperties) 
{
+        self.loadClusterDescriptorConfigs().then(function(properties) {
+          self.set('kerberosDescriptorData', properties);
+          mergedDescriptorConfigs = 
self.mergeDescriptorStackWithConfigs(stackProperties, properties);
+          self.set('kerberosDescriptorConfigs', mergedDescriptorConfigs);
+        }).always(function(){
+          dfd.resolve();
+        });
       });
     } else {
       dfd.resolve();
@@ -568,13 +562,6 @@ App.AddServiceController = 
App.WizardController.extend(App.AddSecurityConfigs, {
     }
   },
 
-  checkSecurityStatus: function() {
-    if (!App.get('isKerberosEnabled')) {
-      this.set('skipConfigureIdentitiesStep', true);
-      this.get('isStepDisabled').findProperty('step', 5).set('value', true);
-    }
-  },
-
   loadServiceConfigGroups: function () {
     this._super();
     this.set('areInstalledConfigGroupsLoaded', 
!Em.isNone(this.getDBProperty('serviceConfigGroups')));

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/wizard.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard.js 
b/ambari-web/app/controllers/wizard.js
index 7af9ab0..d9d05bc 100644
--- a/ambari-web/app/controllers/wizard.js
+++ b/ambari-web/app/controllers/wizard.js
@@ -1487,6 +1487,15 @@ App.WizardController = 
Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
     return 
App.get('router.configurationController').loadFromServer([{'siteName': 
'hadoop-env'}]);
   },
 
+  loadKerberosDescriptorConfigs: function () {
+    var kerberosDescriptorConfigs = 
this.getDBProperty('kerberosDescriptorConfigs');
+    this.set('kerberosDescriptorConfigs', kerberosDescriptorConfigs);
+  },
+
+  saveKerberosDescriptorConfigs: function (kerberosDescriptorConfigs) {
+    this.setDBProperty('kerberosDescriptorConfigs', kerberosDescriptorConfigs);
+    this.set('kerberosDescriptorConfigs', kerberosDescriptorConfigs);
+  },
   /**
    * reset stored wizard data and reload App
    * @param {App.WizardController} controller - wizard controller

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/wizard/step7_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step7_controller.js 
b/ambari-web/app/controllers/wizard/step7_controller.js
index 0207e6b..dd3bfcb 100644
--- a/ambari-web/app/controllers/wizard/step7_controller.js
+++ b/ambari-web/app/controllers/wizard/step7_controller.js
@@ -42,7 +42,7 @@ var App = require('app');
  * @property {?object[]} slaveComponentHosts
  */
 
-App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, 
App.EnhancedConfigsMixin, App.ToggleIsRequiredMixin, App.GroupsMappingMixin, {
+App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, 
App.EnhancedConfigsMixin, App.ToggleIsRequiredMixin, App.GroupsMappingMixin, 
App.AddSecurityConfigs, App.KDCCredentialsControllerMixin, {
 
   name: 'wizardStep7Controller',
 
@@ -429,7 +429,9 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
    */
   _updateIsEditableFlagForConfig: function (serviceConfigProperty, 
defaultGroupSelected) {
     if (App.isAuthorized('AMBARI.ADD_DELETE_CLUSTERS')) {
-      if (App.get('isKerberosEnabled') && 
serviceConfigProperty.get('isConfigIdentity')) {
+      if (App.get('isKerberosEnabled') &&
+          serviceConfigProperty.get('isConfigIdentity') &&
+          
!App.StackService.find().filterProperty('isSelected').mapProperty('serviceName').contains(Em.get(serviceConfigProperty,
 'serviceName'))) {
         serviceConfigProperty.set('isEditable', false);
       } else if (defaultGroupSelected && !Em.get(serviceConfigProperty, 
'group')) {
         if (serviceConfigProperty.get('serviceName') === 'MISC') {
@@ -488,7 +490,7 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
         self.applyServicesConfigs(configs);
       });
     } else {
-      this.applyServicesConfigs(configs);
+      this.applyServicesConfigs(configs, true);
     }
   },
 
@@ -515,13 +517,14 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
     return configs
   },
 
-  applyServicesConfigs: function (configs) {
+  applyServicesConfigs: function (configs, isRestoring) {
+    var self = this;
     console.time('applyServicesConfigs execution time: ');
     if (!this.get('installedServiceNames').contains('HAWQ') && 
this.get('allSelectedServiceNames').contains('HAWQ')) {
       this.updateHawqConfigs(configs);
     }
     if (App.get('isKerberosEnabled') && this.get('wizardController.name') === 
'addServiceController') {
-      this.addKerberosDescriptorConfigs(configs, 
this.get('wizardController.kerberosDescriptorConfigs') || []);
+      this.addKerberosDescriptorConfigs(configs, 
this.get('wizardController.kerberosDescriptorConfigs') || [], isRestoring);
     }
     var stepConfigs = this.createStepConfigs();
     var serviceConfigs = this.renderConfigs(stepConfigs, configs);
@@ -536,7 +539,6 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
     this.checkHostOverrideInstaller();
     this.selectProperService();
     var isInstallerWizard = (this.get("content.controllerName") === 
'installerController');
-    var self = this;
     var rangerService = App.StackService.find().findProperty('serviceName', 
'RANGER');
     var isRangerServiceAbsent =  rangerService && 
!rangerService.get('isInstalled') && !rangerService.get('isSelected');
     if (isRangerServiceAbsent) {
@@ -638,21 +640,33 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
    * @param {App.ServiceConfigProperty[]} descriptor - parsed kerberos 
descriptor
    * @method addKerberosDescriptorConfigs
    */
-  addKerberosDescriptorConfigs: function (configs, descriptor) {
+  addKerberosDescriptorConfigs: function (configs, descriptor, isRestoring) {
+    var servicesToBeInstalled = 
this.get('content.services').filterProperty('isSelected').mapProperty('serviceName');
     descriptor.forEach(function (item) {
-      var property = configs.findProperty('name', item.get('name'));
+      var service = item.get('serviceName');
+      if (!servicesToBeInstalled.contains(service)) return false;
+      var name = item.get('name');
+      var filename = Em.get(item, 'filename');
+      var property = configs.filterProperty('serviceName', 
service).findProperty('name', name);
+      var propertyObj = {
+        isSecureConfig: true,
+        value: Em.get(isRestoring && property ? property : item, 'value'),
+        defaultValue: Em.get(item, 'value'),
+        displayName: name,
+        isOverridable: false,
+        isConfigIdentity: Em.get(item, 'isConfigIdentity'),
+        isUserProperty: !!Em.get(item, 'isUserProperty'),
+        category: (Em.get(item, 'isUserProperty') ? 'Custom ' : 'Advanced ') + 
filename
+      };
       if (property) {
-        Em.setProperties(property, {
-          isSecureConfig: true,
-          displayName: Em.get(item, 'name'),
-          isUserProperty: false,
-          isOverridable: false,
-          isConfigIdentity: Em.get(item, 'isConfigIdentity'),
+        Em.setProperties(property, $.extend(propertyObj, {
+          savedValue: Em.get(item, 'value'),
           description: Em.get(item, 'isConfigIdentity')
-            ? App.config.kerberosIdentitiesDescription(Em.get(property, 
'description'))
-            : Em.get(property, 'description'),
-          category: 'Advanced ' + Em.get(item, 'filename')
-        });
+              ? App.config.kerberosIdentitiesDescription(Em.get(property, 
'description'))
+              : Em.get(property, 'description')
+        }));
+      } else {
+        
configs.push(App.ServiceConfigProperty.create(App.config.getDefaultConfig(name, 
filename, propertyObj)));
       }
     });
   },
@@ -974,8 +988,8 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
    * @return {$.ajax|null}
    * @method getConfigTags
    */
-  getConfigTags: function () {
-    this.set('isAppliedConfigLoaded', false);
+  getConfigTags: function (resetFlag) {
+    if (resetFlag) this.set('isAppliedConfigLoaded', false);
     return App.ajax.send({
       name: 'config.tags',
       sender: this,
@@ -983,6 +997,27 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
     });
   },
 
+  getServicesConfigurations: function() {
+    var dfd = $.Deferred();
+    var configs, servicesConfigurations;
+    configs = this.get('wizardController').getConfigsAndFilenames(this, 
true).serviceConfigProperties;
+    servicesConfigurations = configs.reduce(function(configTags, property) {
+      var fileName = App.config.getConfigTagFromFileName(property.filename),
+          configType;
+      if (!configTags.someProperty('type', fileName)) {
+        configTags.push({
+          type: fileName,
+          properties: {}
+        });
+      }
+      configType = configTags.findProperty('type', fileName);
+      configType.properties[property.name] = property.value;
+      return configTags;
+    }, []);
+    dfd.resolve(servicesConfigurations);
+    return dfd.promise();
+  },
+
   /**
    * Success callback for config tags request
    * Updates <code>serviceConfigTags</code> with tags received from server
@@ -1211,7 +1246,9 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
   _setEditableValue: function (config) {
     var selectedGroup = this.get('selectedConfigGroup');
     if (!selectedGroup) return config;
-    if (App.get('isKerberosEnabled') && config.get('isConfigIdentity')) {
+    if (App.get('isKerberosEnabled') &&
+        config.get('isConfigIdentity') &&
+        
!App.StackService.find().filterProperty('isSelected').mapProperty('serviceName').contains(Em.get(config,
 'serviceName'))) {
       config.set('isEditable', false);
     } else {
       var isEditable = config.get('isEditable'),
@@ -1511,7 +1548,8 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
       },
       onSecondary: function () {
         this._super();
-        self.setButtonClickFinish();
+        self.set('submitButtonClicked', false);
+        App.set('router.nextBtnClickInProgress', false);
         deferred.reject();
       }
     });
@@ -1534,7 +1572,8 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
             }
           },
           onSecondary: function() {
-            self.setButtonClickFinish();
+            App.set('router.nextBtnClickInProgress', false);
+            self.set('submitButtonClicked', false);
             this.hide();
           },
           onClose: function() {
@@ -1568,14 +1607,6 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
       return false;
     }
     App.set('router.nextBtnClickInProgress', true);
-    if (this.get('wizardController.name') === 'addServiceController' && 
this.get('hasChangedDependencies')) {
-      return this.showChangedDependentConfigs({}, 
this.proceedWithChecks.bind(this), this.setButtonClickFinish.bind(this));
-    } else {
-      return this.proceedWithChecks();
-    }
-  },
-
-  proceedWithChecks: function () {
     if (this.get('supportsPreInstallChecks')) {
       var preInstallChecksController = 
App.router.get('preInstallChecksController');
       if (preInstallChecksController.get('preInstallChecksWhereRun')) {
@@ -1586,11 +1617,6 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
     return this.postSubmit();
   },
 
-  setButtonClickFinish: function () {
-    this.set('submitButtonClicked', false);
-    App.set('router.nextBtnClickInProgress', false);
-  },
-
   postSubmit: function () {
     var self = this;
     this.set('submitButtonClicked', true);
@@ -1599,7 +1625,8 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
     })
       .fail(function (value) {
         if ("invalid_configs" === value) {
-          self.setButtonClickFinish();
+          self.set('submitButtonClicked', false);
+          App.set('router.nextBtnClickInProgress', false);
         } else {
           // Failed due to validation mechanism failure.
           // Should proceed with other checks
@@ -1650,5 +1677,37 @@ App.WizardStep7Controller = 
Em.Controller.extend(App.ServerValidatorMixin, App.E
 
   hasStepConfigIssues: function() {
     return !this.get('stepConfigs').filterProperty('showConfig', 
true).everyProperty('hasConfigIssues', false);
-  }.property('[email protected]')
+  }.property('[email protected]'),
+
+  checkDescriptor: function() {
+    if (App.get('isKerberosEnabled')) {
+      return App.ajax.send({
+        sender: self,
+        name: 'admin.kerberize.cluster_descriptor_artifact'
+      });
+    }
+    return $.Deferred().resolve().promise();
+  },
+
+  /**
+   * Store status of kerberos descriptor located in cluster artifacts.
+   * This status needed for Add Service Wizard to select appropriate method to 
create
+   * or update descriptor.
+   *
+   * @param  {Boolean} isExists <code>true</code> if cluster descriptor present
+   */
+  storeClusterDescriptorStatus: function(isExists) {
+    this.get('wizardController').setDBProperty('isClusterDescriptorExists', 
isExists);
+  },
+
+   /**
+   * Get all configs, that should be stored in kerberos_descriptor
+   * @returns {Array}
+   */
+  getDescriptorConfigs: function () {
+     return this.get('stepConfigs').reduce(function (allConfigs, service) {
+      return 
allConfigs.concat(service.get('configs').filterProperty('isSecureConfig'));
+    }, []);
+  }
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/controllers/wizard/step8_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step8_controller.js 
b/ambari-web/app/controllers/wizard/step8_controller.js
index efd8834..4678d03 100644
--- a/ambari-web/app/controllers/wizard/step8_controller.js
+++ b/ambari-web/app/controllers/wizard/step8_controller.js
@@ -877,7 +877,7 @@ App.WizardStep8Controller = 
Em.Controller.extend(App.AddSecurityConfigs, App.wiz
    * @method updateKerberosDescriptor
    */
   updateKerberosDescriptor: function(instant) {
-    var kerberosDescriptor = App.db.get('KerberosWizard', 
'kerberosDescriptorConfigs');
+    var kerberosDescriptor = 
this.get('wizardController').getDBProperty('kerberosDescriptorConfigs');
     var descriptorExists = 
this.get('wizardController').getDBProperty('isClusterDescriptorExists') === 
true;
 
     var ajaxOpts = {

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/mixins/wizard/addSecurityConfigs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/wizard/addSecurityConfigs.js 
b/ambari-web/app/mixins/wizard/addSecurityConfigs.js
index b5f3e6a..2e6d3bc 100644
--- a/ambari-web/app/mixins/wizard/addSecurityConfigs.js
+++ b/ambari-web/app/mixins/wizard/addSecurityConfigs.js
@@ -17,6 +17,7 @@
  */
 
 var App = require('app');
+var blueprintUtils = require('utils/blueprint');
 
 /**
  * Mixin for loading and setting secure configs
@@ -52,19 +53,6 @@ App.AddSecurityConfigs = Em.Mixin.create({
   ],
 
   /**
-   * Store status of kerberos descriptor located in cluster artifacts.
-   * This status needed for Add Service Wizard to select appropriate method to 
create
-   * or update descriptor.
-   *
-   * @param  {Boolean} isExists <code>true</code> if cluster descriptor present
-   */
-  storeClusterDescriptorStatus: function(isExists) {
-    if (this.get('isWithinAddService')) {
-      this.get('wizardController').setDBProperty('isClusterDescriptorExists', 
isExists);
-    }
-  },
-
-  /**
    *
    * @param {object[]} items - stack descriptor json response
    * @returns {App.ServiceConfigProperty[]}
@@ -321,8 +309,8 @@ App.AddSecurityConfigs = Em.Mixin.create({
   updateKerberosDescriptor: function (kerberosDescriptor, configs) {
     configs.forEach(function (_config) {
       var isConfigUpdated;
-      var isStackResouce = true;
-      isConfigUpdated = this.updateResourceIdentityConfigs(kerberosDescriptor, 
_config, isStackResouce);
+      var isStackResource = true;
+      isConfigUpdated = this.updateResourceIdentityConfigs(kerberosDescriptor, 
_config, isStackResource);
       if (!isConfigUpdated) {
         kerberosDescriptor.services.forEach(function (_service) {
           isConfigUpdated = this.updateResourceIdentityConfigs(_service, 
_config);
@@ -372,13 +360,13 @@ App.AddSecurityConfigs = Em.Mixin.create({
       if (Array.isArray(configurations)) {
         configurations.forEach(function (_configuration) {
           for (var key in _configuration) {
-            if (Object.keys(_configuration[key]).contains(config.name) && 
config.filename === key) {
+            if (Object.keys(_configuration[key]).contains(config.name) && 
App.config.getConfigTagFromFileName(config.filename) === key) {
               _configuration[key][config.name] = config.value;
               isConfigUpdated = true
             }
           }
         }, this);
-      } else if (Object.keys(configurations).contains(config.name) && 
config.filename === 'stackConfigs') {
+      } else if (Object.keys(configurations).contains(config.name) && 
App.config.getConfigTagFromFileName(config.filename) === 'stackConfigs') {
         configurations[config.name] = config.value;
         isConfigUpdated = true;
       }
@@ -434,5 +422,427 @@ App.AddSecurityConfigs = Em.Mixin.create({
         queryParams: '?' + queryParams
       }
     });
+  },
+
+  loadClusterDescriptorStackConfigs: function () {
+    return App.ajax.send({
+      sender: this,
+      name: 'admin.kerberize.cluster_descriptor.stack'
+    });
+  },
+
+  mergeDescriptorStackWithConfigs: function (descriptorStack, 
descriptorConfigs) {
+    var result = [];
+    var stackConfigs = 
this.createServicesStackDescriptorConfigs(descriptorStack);
+    var currentConfigs = 
this.createServicesStackDescriptorConfigs(descriptorConfigs);
+
+    stackConfigs.forEach(function (stackConfig) {
+      var currentConfig =  currentConfigs.filterProperty('name', 
stackConfig.get('name')).findProperty('filename', stackConfig.get('filename'));
+      if (currentConfig) {
+        currentConfigs = currentConfigs.without(currentConfig);
+        result.push(currentConfig);
+      } else {
+        result.push(stackConfig);
+      }
+    });
+
+    // add all properties from descriptor/COMPOSITE, that are absent in 
descriptor/STACK as custom properties
+    currentConfigs.setEach('isUserProperty', true);
+    result = result.concat(currentConfigs);
+
+    return result;
+  },
+
+  /**
+   * Prepare step configs using stack descriptor properties.
+   *
+   * @param {App.ServiceConfigProperty[]} configs
+   * @param {App.ServiceConfigProperty[]} stackConfigs converted kerberos 
descriptor
+   */
+  setStepConfigs: function(configs, stackConfigs, showAdminProperties) {
+    var configProperties = this.prepareConfigProperties(configs, 
showAdminProperties),
+        stackConfigProperties = stackConfigs ? 
this.prepareConfigProperties(stackConfigs, showAdminProperties) : [],
+        alterProperties = ['value','initialValue', 'defaultValue'];
+    if (this.get('wizardController.name') === 'addServiceController') {
+      // config properties for installed services should be disabled on Add 
Service Wizard
+      configProperties.forEach(function(item) {
+        if 
(this.get('installedServiceNames').contains(item.get('serviceName')) || 
item.get('serviceName') == 'Cluster') {
+          item.set('isEditable', false);
+        } else if (stackConfigs) {
+          var stackConfigProperty = 
stackConfigProperties.filterProperty('filename', 
item.get('filename')).findProperty('name', item.get('name'));
+          if (stackConfigProperty) {
+            alterProperties.forEach(function (alterProperty) {
+              item.set(alterProperty, stackConfigProperty.get(alterProperty));
+            });
+          }
+        }
+      }, this);
+      // Concat properties that are present in the stack's kerberos  
descriptor but not in the cluster kerberos descriptor
+      stackConfigProperties.forEach(function(_stackConfigProperty){
+        var isPropertyInClusterDescriptor = 
configProperties.filterProperty('filename', 
_stackConfigProperty.get('filename')).someProperty('name', 
_stackConfigProperty.get('name'));
+        if (!isPropertyInClusterDescriptor) {
+          if 
(this.get('installedServiceNames').contains(_stackConfigProperty.get('serviceName'))
 || _stackConfigProperty.get('serviceName') === 'Cluster') {
+            _stackConfigProperty.set('isEditable', false);
+          }
+          configProperties.pushObject(_stackConfigProperty);
+        }
+      }, this);
+    }
+    configProperties = App.config.sortConfigs(configProperties);
+    var stepConfigs = this.createServiceConfig(configProperties);
+    this.get('stepConfigs').pushObjects(stepConfigs);
+    return stepConfigs;
+  },
+
+  /**
+   * Filter configs by installed services for Kerberos Wizard or by installed 
+ selected services
+   * for Add Service Wizard.
+   * Set property value observer.
+   * Set realm property with value from previous configuration step.
+   * Set appropriate category for all configs.
+   * Hide KDC related credentials properties if kerberos was manually enabled.
+   *
+   * @param {App.ServiceConfigProperty[]} configs
+   * @returns {App.ServiceConfigProperty[]}
+   */
+  prepareConfigProperties: function(configs, showAdminProperties) {
+    var self = this;
+    // stored configs from previous steps (Configure Kerberos or Customize 
Services for ASW)
+    var storedServiceConfigs = 
this.get('wizardController.content.serviceConfigProperties');
+    var installedServiceNames = ['Cluster', 
'AMBARI'].concat(App.Service.find().mapProperty('serviceName'));
+    var configProperties = configs.slice(0);
+    var siteProperties = App.configsCollection.getAll();
+    var realmValue;
+    // override stored values
+    App.config.mergeStoredValue(configProperties, 
this.get('wizardController').loadCachedStepConfigValues(this));
+
+    // show admin properties in add service wizard
+    if (showAdminProperties) {
+      installedServiceNames = 
installedServiceNames.concat(this.get('selectedServiceNames'));
+    }
+    configProperties = configProperties.filter(function(item) {
+      return installedServiceNames.contains(item.get('serviceName'));
+    });
+    if (this.get('wizardController.name') !== 'addServiceController') {
+      realmValue = storedServiceConfigs.findProperty('name', 'realm').value;
+      configProperties.findProperty('name', 'realm').set('value', realmValue);
+      configProperties.findProperty('name', 'realm').set('savedValue', 
realmValue);
+      configProperties.findProperty('name', 'realm').set('recommendedValue', 
realmValue);
+    }
+
+    configProperties.setEach('isSecureConfig', false);
+    configProperties.forEach(function(property, item, allConfigs) {
+      if (['spnego_keytab', 
'spnego_principal'].contains(property.get('name'))) {
+        property.addObserver('value', self, 'spnegoPropertiesObserver');
+      }
+      if (property.get('observesValueFrom') && allConfigs.someProperty('name', 
property.get('observesValueFrom'))) {
+        var observedValue = Em.get(allConfigs.findProperty('name', 
property.get('observesValueFrom')), 'value');
+        property.set('value', observedValue);
+        property.set('recommendedValue', observedValue);
+        property.set('isVisible', true);
+      }
+      if (property.get('serviceName') === 'Cluster') {
+        property.set('category', 'Global');
+      }
+      else {
+        property.set('category', property.get('serviceName'));
+      }
+      // All user identity except storm should be grouped under "Ambari 
Principals" category
+      if (property.get('identityType') == 'user') property.set('category', 
'Ambari Principals');
+      var siteProperty = siteProperties.findProperty('name', 
property.get('name'));
+      if (siteProperty) {
+        if (siteProperty.category === property.get('category')) {
+          property.set('displayName',siteProperty.displayName);
+          if (siteProperty.index) {
+            property.set('index', siteProperty.index);
+          }
+        }
+        if (siteProperty.displayType) {
+          property.set('displayType', siteProperty.displayType);
+        }
+      }
+      this.tweakConfigProperty(property);
+    },this);
+
+    return configProperties;
+  },
+
+  /**
+   * Function to override kerberos descriptor's property values
+   */
+  tweakConfigProperty: function(config) {
+    var defaultHiveMsPort = "9083",
+        hiveMSHosts,
+        port,
+        hiveMSHostNames,
+        configValue;
+    if (config.name === 'templeton.hive.properties') {
+      hiveMSHosts = App.HostComponent.find().filterProperty('componentName', 
'HIVE_METASTORE');
+      if (hiveMSHosts.length > 1) {
+        hiveMSHostNames = hiveMSHosts.mapProperty('hostName');
+        port = config.value.match(/:[0-9]{2,4}/);
+        port = port ? port[0].slice(1) : defaultHiveMsPort;
+        for (var i = 0; i < hiveMSHostNames.length; i++) {
+          hiveMSHostNames[i] = "thrift://" + hiveMSHostNames[i] + ":" + port;
+        }
+        configValue = config.value.replace(/thrift.+[0-9]{2,},/i, 
hiveMSHostNames.join('\\,') + ",");
+        config.set('value', configValue);
+        config.set('recommendedValue', configValue);
+      }
+    }
+  },
+
+  /**
+   * Sync up values between inherited property and its reference.
+   *
+   * @param {App.ServiceConfigProperty} configProperty
+   */
+  spnegoPropertiesObserver: function(configProperty) {
+    var stepConfig = this.get('stepConfigs').findProperty('name', 'KERBEROS') 
|| this.get('stepConfigs').findProperty('name', 'ADVANCED');
+
+    stepConfig.get('configs').forEach(function(config) {
+      if (config.get('observesValueFrom') === configProperty.get('name')) {
+        Em.run.once(this, function() {
+          config.set('value', configProperty.get('value'));
+          config.set('recommendedValue', configProperty.get('value'));
+        });
+      }
+    }, this);
+  },
+    /**
+   * Prepare all necessary data for recommendations payload.
+   *
+   * #mutates initialConfigValues
+   * @returns {$.Deferred.promise()}
+   */
+  bootstrapRecommendationPayload: function(kerberosDescriptor) {
+    var dfd = $.Deferred();
+    var self = this;
+
+    this.getServicesConfigurations().then(function(configurations) {
+      var recommendations = self.getBlueprintPayloadObject(configurations, 
kerberosDescriptor);
+      self.set('servicesConfigurations', configurations);
+      self.set('initialConfigValues', 
recommendations.blueprint.configurations);
+      dfd.resolve(recommendations);
+    });
+    return dfd.promise();
+  },
+
+  getServicesConfigurations: function() {
+    var dfd = $.Deferred();
+    var self = this;
+    this.getConfigTags().then(function() {
+      
App.router.get('configurationController').getConfigsByTags(self.get('serviceConfigTags')).done(function
 (configurations) {
+        dfd.resolve(configurations);
+      });
+    });
+
+    return dfd.promise();
+  },
+
+  /**
+   * Returns payload for recommendations request.
+   * Takes services' configurations and merge them with kerberos descriptor 
properties.
+   *
+   * @param {object[]} configurations services' configurations fetched from API
+   * @param {App.ServiceConfigProperty[]} kerberosDescriptor descriptor configs
+   * @returns {object} payload for recommendations request
+   */
+  getBlueprintPayloadObject: function(configurations, kerberosDescriptor) {
+    var recommendations = 
blueprintUtils.generateHostGroups(App.get('allHostNames'));
+    var mergedConfigurations = 
this.mergeDescriptorToConfigurations(configurations, 
this.createServicesStackDescriptorConfigs(kerberosDescriptor));
+    recommendations.blueprint.configurations = 
mergedConfigurations.reduce(function(p, c) {
+      p[c.type] = {};
+      p[c.type].properties = c.properties;
+      return p;
+    }, {});
+
+    return recommendations;
+  },
+
+  /**
+   * Returns map with appropriate action and properties to process with.
+   * Key is an action e.g. `add`, `update`, `delete` and value is  an object 
`fileName` -> `propertyName`: `propertyValue`.
+   *
+   * @param {object} recommendedConfigurations
+   * @param {object[]} servicesConfigurations services' configurations fetched 
from API
+   * @param {App.ServiceConfigProperty[]} allConfigs all current 
configurations stored in controller, basically kerberos descriptor
+   * @returns {object}
+   */
+  groupRecommendationProperties: function(recommendedConfigurations, 
servicesConfigurations, allConfigs) {
+    var resultMap = {
+      update: {},
+      add: {},
+      delete: {}
+    };
+
+    /**
+     * Adds property to associated group `add`,`delete`,`update`.
+     *
+     * @param {object} propertyMap <code>resultMap</code> object
+     * @param {string} name property name
+     * @param {string} propertyValue property value
+     * @param {string} fileName property file name
+     * @return {object} <code>resultMap</code>
+     * @param {string} group, `add`,`delete`,`update`
+     */
+    var addProperty = function(propertyMap, name, propertyValue, fileName, 
group) {
+      var ret = $.extend(true, {}, propertyMap);
+      if (ret.hasOwnProperty(group)) {
+        if (!ret[group].hasOwnProperty(fileName)) {
+          ret[group][fileName] = {};
+        }
+        ret[group][fileName][name] = propertyValue;
+      }
+      return ret;
+    };
+
+    return Em.keys(recommendedConfigurations || {}).reduce(function(acc, 
fileName) {
+      var propertyMap = acc;
+      var recommendedProperties = Em.getWithDefault(recommendedConfigurations, 
fileName + '.properties', {});
+      var recommendedAttributes = Em.getWithDefault(recommendedConfigurations, 
fileName + '.property_attributes', {});
+      // check for properties that should be delted
+      Em.keys(recommendedAttributes).forEach(function(propertyName) {
+        var attribute = recommendedAttributes[propertyName];
+        // delete properties which are present in kerberos descriptor
+        if (attribute.hasOwnProperty('delete') && 
allConfigs.filterProperty('filename', fileName).someProperty('name', 
propertyName)) {
+          propertyMap = addProperty(propertyMap, propertyName, '', fileName, 
'delete');
+        }
+      });
+
+      return Em.keys(recommendedProperties).reduce(function(a, propertyName) {
+        var propertyValue = recommendedProperties[propertyName];
+        // check if property exist in saved configurations on server
+        var isExist = 
Em.getWithDefault(servicesConfigurations.findProperty('type', fileName) || {}, 
'properties', {}).hasOwnProperty(propertyName);
+        if (!isExist) {
+          return addProperty(a, propertyName, propertyValue, fileName, 'add');
+        }
+        // when property exist check that it present in current step configs 
(kerberos descriptor)
+        // and add it as property to `update`
+        if (allConfigs.filterProperty('filename', 
fileName).someProperty('name', propertyName)) {
+          return addProperty(a, propertyName, propertyValue, fileName, 
'update');
+        }
+        return a;
+      }, propertyMap);
+    }, resultMap);
+  },
+
+  /**
+   *
+   * @method getServiceByFilename
+   * @param {string}fileName
+   * @returns {string}
+   */
+  getServiceByFilename: function(fileName) {
+    // core-site properties goes to HDFS
+    if (fileName === 'core-site' && 
App.Service.find().someProperty('serviceName', 'HDFS')) {
+      return 'HDFS';
+    }
+    var associatedService = App.StackService.find().filter(function(service) {
+      return Em.keys(service.get('configTypes')).contains(fileName);
+    })[0];
+    return associatedService ? associatedService.get('serviceName') : '';
+  },
+
+  loadServerSideConfigsRecommendations: function(recommendations) {
+    return App.ajax.send({
+      'name': 'config.recommendations',
+      'sender': this,
+      'data': {
+        stackVersionUrl: App.get('stackVersionURL'),
+        dataToSend: {
+          recommend: 'configurations',
+          hosts: App.get('allHostNames'),
+          services: this.get('serviceNames'),
+          recommendations: recommendations
+        }
+      },
+      'success': 'loadRecommendationsSuccess',
+      'error': 'loadRecommendationsError'
+    });
+  },
+
+  loadRecommendationsError: function(req, ajaxOpts, error, opt) {
+    var resp;
+    try {
+      resp = $.parseJSON(req.responseText);
+    } catch (e) { }
+    return App.ModalPopup.show({
+      header: Em.I18n.t('common.error'),
+      secondary: false,
+      bodyClass: App.AjaxDefaultErrorPopupBodyView.extend({
+        type: opt.type || 'GET',
+        url: opt.url,
+        status: req.status,
+        message: resp && resp.message || req.responseText
+      })
+    });
+  },
+
+  /**
+   * Callback executed when all configs specified by tags are loaded.
+   * Here we handle configurations for instlled services and Kerberos.
+   * Gather needed info for recommendation request such as configurations 
object.
+   *
+   * @override
+   */
+  getConfigTagsSuccess: function(data) {
+    // here we get all installed services including KERBEROS
+    var serviceNames = 
App.Service.find().mapProperty('serviceName').concat(['KERBEROS']).uniq();
+    // collect all config types for selected services
+    var installedServiceSites = Array.prototype.concat.apply([], 
App.config.get('preDefinedServiceConfigs').filter(function(serviceConfig) {
+      return serviceNames.contains(Em.get(serviceConfig, 'serviceName'));
+    }).map(function (service) {
+      // when service have no configs return <code>null</code> instead return 
config types
+      if (!service.get('configTypes')) return null;
+      return Object.keys(service.get('configTypes'));
+    }, this).compact()).uniq(); // cleanup <code>null</code>
+
+    // take all configs for selected services by config types recieved from 
API response
+    var serviceConfigTags = 
Em.keys(data.Clusters.desired_configs).reduce(function(tags, site) {
+      if (data.Clusters.desired_configs.hasOwnProperty(site)) {
+        // push cluster-env.xml also since it not associated with any service 
but need to further processing
+        if (installedServiceSites.contains(site) || site === 'cluster-env') {
+          tags.push({
+            siteName: site,
+            tagName: data.Clusters.desired_configs[site].tag,
+            newTagName: null
+          });
+        }
+      }
+      return tags;
+    }, []);
+    // store configurations
+    this.set('serviceConfigTags', serviceConfigTags);
+    this.set('isAppliedConfigLoaded', true);
+  },
+
+  /**
+   * Add/update property in `properties` object for each config type with
+   * associated kerberos descriptor config value.
+   *
+   * @private
+   * @param {object[]} configurations
+   * @param {App.ServiceConfigProperty[]} kerberosDescriptor
+   * @returns {object[]}
+   */
+  mergeDescriptorToConfigurations: function(configurations, 
kerberosDescriptor) {
+    return configurations.map(function(configType) {
+      var properties = $.extend({}, configType.properties);
+      var filteredDescriptor = kerberosDescriptor.filterProperty('filename', 
configType.type);
+      if (filteredDescriptor.length) {
+        filteredDescriptor.forEach(function(descriptorConfig) {
+          var configName = Em.get(descriptorConfig, 'name');
+          properties[configName] = Em.get(descriptorConfig, 'value');
+        });
+      }
+      return {
+        type: configType.type,
+        version: configType.version,
+        tag: configType.tag,
+        properties: properties
+      };
+    });
   }
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/routes/add_kerberos_routes.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/routes/add_kerberos_routes.js 
b/ambari-web/app/routes/add_kerberos_routes.js
index f556acb..3dbf050 100644
--- a/ambari-web/app/routes/add_kerberos_routes.js
+++ b/ambari-web/app/routes/add_kerberos_routes.js
@@ -174,7 +174,7 @@ module.exports = App.WizardRoute.extend({
         
kerberosWizardStep2Controller.get('stepConfigs')[0].get('configs').findProperty('name',
 'manage_krb5_conf').set('value', 'false');
       }
 
-      
kerberosWizardController.saveServiceConfigProperties(kerberosWizardStep2Controller).always(function()
 {
+      
kerberosWizardController.saveServiceConfigProperties(kerberosWizardStep2Controller,
 true).always(function() {
         kerberosWizardController.clearTasksData();
         if (kerberosWizardController.get('skipClientInstall')) {
           kerberosWizardController.setDBProperty('kerberosDescriptorConfigs', 
null);

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/routes/add_service_routes.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/routes/add_service_routes.js 
b/ambari-web/app/routes/add_service_routes.js
index 9ff0b10..773042b 100644
--- a/ambari-web/app/routes/add_service_routes.js
+++ b/ambari-web/app/routes/add_service_routes.js
@@ -232,6 +232,9 @@ module.exports = App.WizardRoute.extend({
           addServiceController.setDBProperty('serviceConfigGroups', undefined);
           App.ServiceConfigGroup.find().clear();
           
addServiceController.clearServiceConfigProperties().always(function() {
+            if (App.get('isKerberosEnabled')) {
+              addServiceController.setDBProperty('kerberosDescriptorConfigs', 
null);
+            }
             router.transitionTo('step4');
           });
         });
@@ -248,7 +251,7 @@ module.exports = App.WizardRoute.extend({
       controller.dataLoading().done(function () {
         var wizardStep7Controller = router.get('wizardStep7Controller');
         controller.loadAllPriorSteps().done(function () {
-          wizardStep7Controller.getConfigTags();
+          wizardStep7Controller.getConfigTags(true);
           wizardStep7Controller.set('wizardController', controller);
           controller.usersLoading().done(function () {
             
router.get('mainController').isLoading.call(router.get('clusterController'), 
'isClusterNameLoaded').done(function () {
@@ -275,69 +278,36 @@ module.exports = App.WizardRoute.extend({
     next: function (router) {
       var addServiceController = router.get('addServiceController');
       var wizardStep7Controller = router.get('wizardStep7Controller');
-      addServiceController.saveServiceConfigGroups(wizardStep7Controller, 
true);
-      
addServiceController.saveServiceConfigProperties(wizardStep7Controller).always(function()
 {
+      var kerberosDescriptor = addServiceController.get('kerberosDescriptor');
+      wizardStep7Controller.checkDescriptor().always(function (data, status) {
+        wizardStep7Controller.storeClusterDescriptorStatus(status === 
'success');
         if (App.get('isKerberosEnabled')) {
-          
addServiceController.clearCachedStepConfigValues(router.get('kerberosWizardStep4Controller'));
-          router.transitionTo('step5');
-          return;
+          wizardStep7Controller.updateKerberosDescriptor(kerberosDescriptor, 
wizardStep7Controller.getDescriptorConfigs());
+          
addServiceController.saveKerberosDescriptorConfigs(kerberosDescriptor);
+          if (router.get('mainAdminKerberosController.isManualKerberos')) {
+            router.get('wizardStep8Controller').set('wizardController', 
router.get('addServiceController'));
+            router.get('wizardStep8Controller').updateKerberosDescriptor(true);
+          }
         }
-        router.transitionTo('step6');
+        addServiceController.saveServiceConfigGroups(wizardStep7Controller, 
true);
+        
addServiceController.saveServiceConfigProperties(wizardStep7Controller).always(function()
 {
+          router.transitionTo('step5');
+        });
       });
     }
   }),
 
-  step5: Em.Route.extend({
+  step5: App.StepRoute.extend({
     route: '/step5',
     connectOutlets: function (router) {
       App.logger.setTimer(consoleMsg.format(5));
       var controller = router.get('addServiceController');
       controller.setCurrentStep('5');
       controller.dataLoading().done(function () {
-        var kerberosStep4Controller = 
router.get('kerberosWizardStep4Controller');
-        controller.loadAllPriorSteps().done(function () {
-          kerberosStep4Controller.set('wizardController', controller);
-          App.logger.logTimerIfMoreThan(consoleMsg.format(5));
-          controller.connectOutlet('kerberosWizardStep4', 
controller.get('content'));
-        });
-      });
-    },
-    back: function (router) {
-      var controller = router.get('addServiceController');
-      if (!controller.get('content.skipConfigStep')) {
-        return router.transitionTo('step4');
-      }
-      if (!controller.get('content.skipSlavesStep')) {
-        return router.transitionTo('step3');
-      }
-      if (!controller.get('content.skipMasterStep')) {
-        return router.transitionTo('step2');
-      }
-      return router.transitionTo('step1');
-    },
-    next: function (router) {
-      if (App.Cluster.find().objectAt(0).get('isKerberosEnabled')) {
-        if (router.get('mainAdminKerberosController.isManualKerberos')) {
-          router.get('wizardStep8Controller').set('wizardController', 
router.get('addServiceController'));
-          router.get('wizardStep8Controller').updateKerberosDescriptor(true);
-        }
-        
router.get('addServiceController').cacheStepConfigValues(router.get('kerberosWizardStep4Controller'));
-      }
-      router.transitionTo('step6');
-    }
-  }),
-
-  step6: App.StepRoute.extend({
-    route: '/step6',
-    connectOutlets: function (router, context) {
-      App.logger.setTimer(consoleMsg.format(6));
-      var controller = router.get('addServiceController');
-      controller.setCurrentStep('6');
-      controller.dataLoading().done(function () {
         controller.loadAllPriorSteps().done(function () {
           var wizardStep8Controller = router.get('wizardStep8Controller');
           wizardStep8Controller.set('wizardController', controller);
-          App.logger.logTimerIfMoreThan(consoleMsg.format(6));
+          App.logger.logTimerIfMoreThan(consoleMsg.format(5));
           controller.connectOutlet('wizardStep8', controller.get('content'));
         });
       });
@@ -347,9 +317,6 @@ module.exports = App.WizardRoute.extend({
     },
     backTransition: function (router) {
       var controller = router.get('addServiceController');
-      if (App.get('isKerberosEnabled')) {
-        return router.transitionTo('step5');
-      }
       if (!controller.get('content.skipConfigStep')) {
         return router.transitionTo('step4');
       }
@@ -367,30 +334,30 @@ module.exports = App.WizardRoute.extend({
         router.get('wizardStep8Controller').set('servicesInstalled', true);
         addServiceController.setInfoForStep9();
         addServiceController.saveClusterState('ADD_SERVICES_INSTALLING_3');
-        App.router.transitionTo('step7');
+        App.router.transitionTo('step6');
       });
     }
   }),
 
-  step7: Em.Route.extend({
-    route: '/step7',
+  step6: Em.Route.extend({
+    route: '/step6',
     connectOutlets: function (router, context) {
-      App.logger.setTimer(consoleMsg.format(7));
+      App.logger.setTimer(consoleMsg.format(6));
       var controller = router.get('addServiceController');
-      controller.setCurrentStep('7');
+      controller.setCurrentStep('6');
       if (!App.get('testMode')) {              //if test mode is ON don't 
disable prior steps link.
-        controller.setLowerStepsDisable(7);
+        controller.setLowerStepsDisable(6);
       }
       controller.dataLoading().done(function () {
         controller.loadAllPriorSteps().done(function () {
           var wizardStep9Controller = router.get('wizardStep9Controller');
           wizardStep9Controller.set('wizardController', controller);
-          App.logger.setTimer(consoleMsg.format(7));
+          App.logger.setTimer(consoleMsg.format(6));
           controller.connectOutlet('wizardStep9', controller.get('content'));
         });
       });
     },
-    back: Em.Router.transitionTo('step6'),
+    back: Em.Router.transitionTo('step5'),
     retry: function (router, context) {
       var addServiceController = router.get('addServiceController');
       var wizardStep9Controller = router.get('wizardStep9Controller');
@@ -418,23 +385,23 @@ module.exports = App.WizardRoute.extend({
 
       // We need to do recovery based on whether we are in Add Host or 
Installer wizard
       addServiceController.saveClusterState('ADD_SERVICES_INSTALLED_4');
-      router.transitionTo('step8');
+      router.transitionTo('step7');
     }
   }),
 
-  step8: Em.Route.extend({
-    route: '/step8',
+  step7: Em.Route.extend({
+    route: '/step7',
     connectOutlets: function (router, context) {
       var controller = router.get('addServiceController');
-      controller.setCurrentStep('8');
-      controller.setLowerStepsDisable(8);
+      controller.setCurrentStep('7');
+      controller.setLowerStepsDisable(7);
       controller.dataLoading().done(function () {
         controller.loadAllPriorSteps().done(function () {
           controller.connectOutlet('wizardStep10', controller.get('content'));
         });
       });
     },
-    back: Em.Router.transitionTo('step7'),
+    back: Em.Router.transitionTo('step6'),
     complete: function (router, context) {
       var addServiceController = router.get('addServiceController');
       addServiceController.get('popup').onClose();

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/templates/main/service/add.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/service/add.hbs 
b/ambari-web/app/templates/main/service/add.hbs
index 2873a87..28dc83a 100644
--- a/ambari-web/app/templates/main/service/add.hbs
+++ b/ambari-web/app/templates/main/service/add.hbs
@@ -24,10 +24,9 @@
         <li {{bindAttr class="isStep2:active view.isStep2Disabled:disabled 
view.isStep2Completed:completed"}}><a href="javascript:void(null);"  {{action 
gotoStep2 target="controller"}}><i class="step-marker"><span 
class="step-index">2</span></i><p class="step-name">{{t 
installer.step5.header}}</p></a></li>
         <li {{bindAttr class="isStep3:active view.isStep3Disabled:disabled 
view.isStep3Completed:completed"}}><a href="javascript:void(null);"  {{action 
gotoStep3 target="controller"}}><i class="step-marker"><span 
class="step-index">3</span></i><p class="step-name">{{t 
installer.step6.header}}</p></a></li>
         <li {{bindAttr class="isStep4:active view.isStep4Disabled:disabled 
view.isStep4Completed:completed"}}><a href="javascript:void(null);"  {{action 
gotoStep4 target="controller"}}><i class="step-marker"><span 
class="step-index">4</span></i><p class="step-name">{{t 
installer.step7.header}}</p></a></li>
-        <li {{bindAttr class="isStep5:active view.isStep5Disabled:disabled 
view.isStep5Completed:completed"}}><a href="javascript:void(null);"  {{action 
gotoStep5 target="controller"}}><i class="step-marker"><span 
class="step-index">5</span></i><p class="step-name">{{t 
admin.kerberos.wizard.step4.header}}</p></a></li>
-        <li {{bindAttr class="isStep6:active view.isStep6Disabled:disabled 
view.isStep6Completed:completed"}}><a href="javascript:void(null);"  {{action 
gotoStep5 target="controller"}}><i class="step-marker"><span 
class="step-index">6</span></i><p class="step-name">{{t 
installer.step8.header}}</p></a></li>
-        <li {{bindAttr class="isStep7:active view.isStep7Disabled:disabled 
view.isStep7Completed:completed"}}><a href="javascript:void(null);"  {{action 
gotoStep6 target="controller"}}><i class="step-marker"><span 
class="step-index">7</span></i><p class="step-name">{{t 
installer.step9.header}}</p></a></li>
-        <li {{bindAttr class="isStep8:active view.isStep8Disabled:disabled 
view.isStep8Completed:completed"}}><a href="javascript:void(null);"  {{action 
gotoStep7 target="controller"}}><i class="step-marker"><span 
class="step-index">8</span></i><p class="step-name">{{t 
installer.step10.header}}</p></a></li>
+        <li {{bindAttr class="isStep6:active view.isStep5Disabled:disabled 
view.isStep5Completed:completed"}}><a href="javascript:void(null);"  {{action 
gotoStep5 target="controller"}}><i class="step-marker"><span 
class="step-index">5</span></i><p class="step-name">{{t 
installer.step8.header}}</p></a></li>
+        <li {{bindAttr class="isStep7:active view.isStep6Disabled:disabled 
view.isStep6Completed:completed"}}><a href="javascript:void(null);"  {{action 
gotoStep6 target="controller"}}><i class="step-marker"><span 
class="step-index">6</span></i><p class="step-name">{{t 
installer.step9.header}}</p></a></li>
+        <li {{bindAttr class="isStep8:active view.isStep7Disabled:disabled 
view.isStep7Completed:completed"}}><a href="javascript:void(null);"  {{action 
gotoStep7 target="controller"}}><i class="step-marker"><span 
class="step-index">7</span></i><p class="step-name">{{t 
installer.step10.header}}</p></a></li>
       </ul>
     </div>
     {{outlet}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js 
b/ambari-web/app/utils/ajax/ajax.js
index b63027e..614eb79 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -1592,6 +1592,10 @@ var urls = {
     'real': 
'/clusters/{clusterName}/kerberos_descriptors/COMPOSITE{queryParams}',
     'mock': '/data/wizard/kerberos/stack_descriptors.json'
   },
+  'admin.kerberize.cluster_descriptor.stack': {
+    'real': '/clusters/{clusterName}/kerberos_descriptors/STACK',
+    'mock': '/data/wizard/kerberos/stack_descriptors.json'
+  },
   'admin.kerberos.cluster.artifact.create': {
     'type': 'POST',
     'real': '/clusters/{clusterName}/artifacts/{artifactName}',

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/test/controllers/main/admin/kerberos/step4_controller_test.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/test/controllers/main/admin/kerberos/step4_controller_test.js 
b/ambari-web/test/controllers/main/admin/kerberos/step4_controller_test.js
index 422ac26..894d167 100644
--- a/ambari-web/test/controllers/main/admin/kerberos/step4_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/kerberos/step4_controller_test.js
@@ -34,8 +34,6 @@ describe('App.KerberosWizardStep4Controller', function() {
     c = getController();
   });
 
-  App.TestAliases.testAsComputedEqual(getController(), 'isWithinAddService', 
'wizardController.name', 'addServiceController');
-
   describe("#clearStep()", function () {
 
     beforeEach(function() {
@@ -213,85 +211,6 @@ describe('App.KerberosWizardStep4Controller', function() {
     });
   });
 
-  describe('#setStepConfigs', function() {
-    describe('Add Service Wizard', function() {
-
-      var properties = Em.A([
-        Em.Object.create({ name: 'realm', value: '', serviceName: 'Cluster' }),
-        Em.Object.create({ name: 'spnego_keytab', value: 
'spnego_keytab_value', serviceName: 'Cluster', isEditable: true }),
-        Em.Object.create({ name: 'hdfs_keytab', value: '', serviceName: 
'HDFS', observesValueFrom: 'spnego_keytab', isEditable: true }),
-        Em.Object.create({ name: 'falcon_keytab', value: 
'falcon_keytab_value', serviceName: 'FALCON', isEditable: true }),
-        Em.Object.create({ name: 'mapreduce_keytab', value: 
'mapreduce_keytab_value', serviceName: 'MAPREDUCE2', isEditable: true })
-      ]);
-
-      var res;
-      var controller;
-      before(function() {
-        sinon.stub(App.StackService, 'find').returns([
-          Em.Object.create({
-            serviceName: 'KERBEROS',
-            configCategories: [],
-            configTypeList: []
-          }),
-          Em.Object.create({
-            serviceName: 'HDFS',
-            configCategories: [],
-            configTypeList: []
-          }),
-          Em.Object.create({
-            serviceName: 'MAPREDUCE2',
-            configTypeList: []
-          })
-        ]);
-        sinon.stub(App.Service, 'find').returns([
-          Em.Object.create({
-            serviceName: 'HDFS'
-          }),
-          Em.Object.create({
-            serviceName: 'KERBEROS'
-          })
-        ]);
-        controller = App.KerberosWizardStep4Controller.create({
-          selectedServiceNames: ['FALCON', 'MAPREDUCE2'],
-          installedServiceNames: ['HDFS', 'KERBEROS'],
-          wizardController: Em.Object.create({
-            name: 'addServiceController',
-            getDBProperty: function() {
-              return Em.A([
-                Em.Object.create({ name: 'realm', value: 'realm_value' })
-              ]);
-            },
-            loadCachedStepConfigValues : function() {
-              return null;
-            }
-          })
-        });
-        sinon.stub(App.router, 
'get').withArgs('mainAdminKerberosController.isManualKerberos').returns(false);
-        var stepConfigs = controller.setStepConfigs(properties);
-        res = 
stepConfigs[0].get('configs').concat(stepConfigs[1].get('configs'));
-      });
-
-      Em.A([
-        { name: 'spnego_keytab', e: false },
-        { name: 'falcon_keytab', e: true },
-        { name: 'hdfs_keytab', e: false },
-        { name: 'mapreduce_keytab', e: true }
-      ]).forEach(function(test) {
-        it('Add Service: property `{0}` should be {1} 
editable'.format(test.name, !!test.e ? '' : 'not '), function() {
-          expect(res.findProperty('name', 
test.name).get('isEditable')).to.eql(test.e);
-        });
-      });
-
-      after(function() {
-        controller.destroy();
-        controller = null;
-        App.StackService.find.restore();
-        App.Service.find.restore();
-        App.router.get.restore();
-      });
-    });
-  });
-
   describe("#createCategoryForServices()", function() {
     var controller = App.KerberosWizardStep4Controller.create({
       wizardController: {
@@ -336,66 +255,6 @@ describe('App.KerberosWizardStep4Controller', function() {
     });
   });
 
-  describe('#loadStep', function() {
-    var controller;
-    describe('skip "Configure Identities" step. ', function() {
-      beforeEach(function() {
-        controller = App.KerberosWizardStep4Controller.create({});
-        this.wizardController = App.AddServiceController.create({});
-        controller.set('wizardController', this.wizardController);
-        sinon.stub(controller, 'clearStep').returns(true);
-        sinon.stub(controller, 'getDescriptor').returns({ then: function() { 
return { always: function() {}}}});
-        sinon.stub(controller, 'setStepConfigs').returns(true);
-        sinon.stub(App.router, 'send').withArgs('next');
-      });
-
-      afterEach(function() {
-        controller.clearStep.restore();
-
-        controller.setStepConfigs.restore();
-        App.router.send.restore();
-      });
-
-      var tests = [
-        {
-          securityEnabled: true,
-          stepSkipped: false
-        },
-        {
-          securityEnabled: false,
-          stepSkipped: true
-        }
-      ];
-
-      tests.forEach(function(test) {
-        var message = 'Security {0} configure identities step should be 
{1}'.format(!!test.securityEnabled ? 'enabled' : 'disabled', !!test.stepSkipped 
? 'skipped' : 'not skipped');
-        describe(message, function() {
-
-          beforeEach(function () {
-            sinon.stub(App, 
'get').withArgs('isKerberosEnabled').returns(test.securityEnabled);
-            this.wizardController.checkSecurityStatus();
-            controller.loadStep();
-          });
-
-          afterEach(function () {
-            App.get.restore();
-          });
-
-          it('`send` is ' + (test.stepSkipped ? '' : 'not') + ' called with 
`next`', function () {
-            
expect(App.router.send.calledWith('next')).to.be.eql(test.stepSkipped);
-          });
-
-        });
-      }, this);
-
-      it('step should not be disabled for Add Kerberos wizard', function() {
-        controller.set('wizardController', 
App.KerberosWizardController.create({}));
-        controller.loadStep();
-        expect(App.router.send.calledWith('next')).to.be.false;
-      });
-    });
-  });
-
   describe('#mergeDescriptorToConfigurations', function() {
     var genAppConfigProperty = function(name, fileName, value) {
       return App.ServiceConfigProperty.create({
@@ -598,35 +457,15 @@ describe('App.KerberosWizardStep4Controller', function() {
     };
 
     beforeEach(function() {
-      c.reopen({
-        isWithinAddService: true,
-        selectedServiceNames: []
-      });
-      sinon.stub(c, 'storeClusterDescriptorStatus');
       sinon.stub(c, 'loadClusterDescriptorConfigs').returns(mock);
       sinon.stub(mock, 'then');
     });
 
     afterEach(function() {
       c.loadClusterDescriptorConfigs.restore();
-      c.storeClusterDescriptorStatus.restore();
       mock.then.restore();
     });
 
-    it("App.ajax.send should be called", function() {
-      c.getDescriptor();
-      var args = testHelpers.findAjaxRequest('name', 
'admin.kerberize.cluster_descriptor_artifact');
-      expect(args[0]).to.be.eql({
-        sender: c,
-        name: 'admin.kerberize.cluster_descriptor_artifact'
-      });
-    });
-
-    it("storeClusterDescriptorStatus should be called", function() {
-      c.getDescriptor();
-      expect(c.storeClusterDescriptorStatus.calledOnce).to.be.true;
-    });
-
     it("loadClusterDescriptorConfigs should be called", function() {
       c.getDescriptor();
       expect(c.loadClusterDescriptorConfigs.calledOnce).to.be.true;
@@ -637,11 +476,6 @@ describe('App.KerberosWizardStep4Controller', function() {
       expect(mock.then.calledOnce).to.be.true;
     });
 
-    it("then should be called, isWithinAddService is false", function() {
-      c.set('isWithinAddService', false);
-      c.getDescriptor();
-      expect(mock.then.calledOnce).to.be.true;
-    });
   });
 
   describe("#tweakConfigProperty()", function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/test/controllers/main/service/add_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/add_controller_test.js 
b/ambari-web/test/controllers/main/service/add_controller_test.js
index ffde1f7..a52c38f 100644
--- a/ambari-web/test/controllers/main/service/add_controller_test.js
+++ b/ambari-web/test/controllers/main/service/add_controller_test.js
@@ -415,60 +415,6 @@ describe('App.AddServiceController', function() {
     }, this);
   });
 
-  describe('#checkSecurityStatus', function () {
-
-    var cases = [
-      {
-        securityEnabled: true,
-        skipConfigureIdentitiesStep: false,
-        isStep5Disabled: false,
-        title: 'security enabled'
-      },
-      {
-        securityEnabled: false,
-        skipConfigureIdentitiesStep: true,
-        isStep5Disabled: true,
-        title: 'security disabled'
-      }
-    ];
-
-    beforeEach(function () {
-      addServiceController.setProperties({
-        skipConfigureIdentitiesStep: false,
-        isStepDisabled: [
-          Em.Object.create({
-            step: 5,
-            value: false
-          })
-        ]
-      });
-    });
-
-    afterEach(function () {
-      App.get.restore();
-    });
-
-    cases.forEach(function (item) {
-      describe(item.title, function () {
-
-        beforeEach(function () {
-          sinon.stub(App, 
'get').withArgs('isKerberosEnabled').returns(item.securityEnabled);
-          addServiceController.checkSecurityStatus();
-        });
-
-        it('skipConfigureIdentitiesStep is ' + 
item.skipConfigureIdentitiesStep, function () {
-          
expect(addServiceController.get('skipConfigureIdentitiesStep')).to.equal(item.skipConfigureIdentitiesStep);
-        });
-
-        it('step 5 is ' + (item.isStep5Disabled ? 'disabved' : 'enabled'), 
function () {
-          
expect(addServiceController.get('isStepDisabled').findProperty('step', 
5).get('value')).to.equal(item.isStep5Disabled);
-        });
-
-      });
-    });
-
-  });
-
   describe('#loadServiceConfigGroups', function () {
 
     var dbMock,

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/test/controllers/wizard/step7_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step7_test.js 
b/ambari-web/test/controllers/wizard/step7_test.js
index d5d157d..919e735 100644
--- a/ambari-web/test/controllers/wizard/step7_test.js
+++ b/ambari-web/test/controllers/wizard/step7_test.js
@@ -1448,6 +1448,9 @@ describe('App.InstallerStep7Controller', function () {
 
     beforeEach(function() {
       sinon.stub(App.config, 'kerberosIdentitiesDescription');
+      installerStep7Controller.set('content.services', [
+        {isSelected: true, serviceName: 's1'}
+      ]);
     });
 
     afterEach(function() {
@@ -1455,13 +1458,14 @@ describe('App.InstallerStep7Controller', function () {
     });
 
     var configs = [
-      { name: 'prop1', displayName: 'Prop1', description: 'd1' },
-      { name: 'prop2', displayName: 'Prop2', description: 'd1' },
-      { name: 'prop3', displayName: 'Prop3', description: 'd1' }
+      { name: 'prop1', displayName: 'Prop1', description: 'd1', serviceName: 
's1' },
+      { name: 'prop2', displayName: 'Prop2', description: 'd1', serviceName: 
's2' },
+      { name: 'prop3', displayName: 'Prop3', description: 'd1', serviceName: 
's2' },
+      { name: 'prop4', displayName: 'Prop4', description: 'd1', serviceName: 
's3' }
     ];
     var descriptor = [
-      Em.Object.create({ name: 'prop4', filename: 'file-1'}),
-      Em.Object.create({ name: 'prop1', filename: 'file-1'})
+      Em.Object.create({ name: 'prop4', filename: 'file-1', serviceName: 
's2'}),
+      Em.Object.create({ name: 'prop1', filename: 'file-1', serviceName: 's1'})
     ];
     var propertiesAttrTests = [
       {
@@ -2059,22 +2063,4 @@ describe('App.InstallerStep7Controller', function () {
 
   });
 
-  describe('#setButtonClickFinish', function () {
-
-    beforeEach(function () {
-      installerStep7Controller.set('submitButtonClicked', true);
-      App.set('router.nextBtnClickInProgress', true);
-      installerStep7Controller.setButtonClickFinish();
-    });
-
-    it('submitButtonClicked should be false', function () {
-      expect(installerStep7Controller.get('submitButtonClicked')).to.be.false;
-    });
-
-    it('nextBtnClickInProgress should be false', function () {
-      expect(App.get('router.nextBtnClickInProgress')).to.be.false;
-    });
-
-  });
-
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/f9696fe8/ambari-web/test/controllers/wizard/step8_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step8_test.js 
b/ambari-web/test/controllers/wizard/step8_test.js
index bdc4f4c..15b9245 100644
--- a/ambari-web/test/controllers/wizard/step8_test.js
+++ b/ambari-web/test/controllers/wizard/step8_test.js
@@ -2291,15 +2291,16 @@ describe('App.WizardStep8Controller', function () {
     };
 
     beforeEach(function () {
-      sinon.stub(App.db, 'get').withArgs('KerberosWizard', 
'kerberosDescriptorConfigs').returns(1234);
       sinon.stub(installerStep8Controller, 'addRequestToAjaxQueue', Em.K);
       sinon.stub(installerStep8Controller, 
'get').withArgs('wizardController').returns(Em.Object.create({
-        getDBProperty: function() { return true; }
+        getDBProperty: function(key) {
+          if (key === 'kerberosDescriptorConfigs') return 1234;
+          if (key === 'isClusterDescriptorExists') return true;
+        }
       }));
     });
 
     afterEach(function () {
-      App.db.get.restore();
       installerStep8Controller.addRequestToAjaxQueue.restore();
       installerStep8Controller.get.restore();
     });

Reply via email to