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 2015/08/03 11:30:33 UTC

[1/3] ambari git commit: AMBARI-12618 Service config pages load too slowly. (ababiichuk)

Repository: ambari
Updated Branches:
  refs/heads/branch-2.1 1b3f6f781 -> 9582cc0a7


http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/test/utils/config_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/utils/config_test.js b/ambari-web/test/utils/config_test.js
index a409553..f46a446 100644
--- a/ambari-web/test/utils/config_test.js
+++ b/ambari-web/test/utils/config_test.js
@@ -45,21 +45,6 @@ describe('App.config', function () {
     });
   };
 
-  var setupContentForMergeWithStored = function(context) {
-    loadServiceModelsData(context.installedServiceNames);
-    loadAllServicesConfigs(context);
-    setups.setupStackVersion(this, 'HDP-2.1');
-    context.result = App.config.mergePreDefinedWithStored(context.storedConfigs, modelSetup.setupAdvancedConfigsObject(), context.installedServiceNames);
-  };
-
-  var removeServiceModelData = function(serviceIds) {
-    serviceIds.forEach(function(serviceId) {
-      var record = App.Service.find(serviceId);
-      record.deleteRecord();
-      record.get('stateManager').transitionTo('loading');
-    });
-  };
-
   describe('#handleSpecialProperties', function () {
     var config = {};
     it('value should be transformed to "1024" from "1024m"', function () {
@@ -223,40 +208,6 @@ describe('App.config', function () {
     });
   });
 
-  describe('#addAvancedConfigs()', function() {
-    beforeEach(function() {
-      this.storedConfigs = modelSetup.setupStoredConfigsObject();
-    });
-
-    it('`custom.zoo.cfg` absent in stored configs', function() {
-      expect(this.storedConfigs.findProperty('name', 'custom.zoo.cfg')).to.be.undefined;
-    });
-
-    it('`custom.zoo.cfg.` from advanced configs should be added to stored configs', function() {
-      App.config.addAdvancedConfigs(this.storedConfigs, modelSetup.setupAdvancedConfigsObject(), 'ZOOKEEPER');
-      var property = this.storedConfigs.findProperty('name', 'custom.zoo.cfg');
-      expect(property).to.be.ok;
-      expect(property.category).to.eql('Advanced zoo.cfg');
-    });
-
-    it('`capacity-scheduler.xml` property with name `content` should have `displayType` `multiLine`', function() {
-      App.config.addAdvancedConfigs(this.storedConfigs, modelSetup.setupAdvancedConfigsObject(), 'YARN');
-      expect(this.storedConfigs.filterProperty('filename', 'capacity-scheduler.xml').findProperty('name','content').displayType).to.eql('multiLine');
-    });
-
-    it('storing different configs with the same name', function () {
-      App.config.addAdvancedConfigs(this.storedConfigs, modelSetup.setupAdvancedConfigsObject(), 'HBASE');
-      var properties = this.storedConfigs.filterProperty('name', 'hbase_log_dir');
-      var hbaseProperty = properties.findProperty('filename', 'hbase-env.xml');
-      var amsProperty = properties.findProperty('filename', 'ams-hbase-env.xml');
-      expect(properties).to.have.length(2);
-      expect(hbaseProperty.serviceName).to.equal('HBASE');
-      expect(hbaseProperty.value).to.equal('/hadoop/hbase');
-      expect(amsProperty.serviceName).to.equal('AMBARI_METRICS');
-      expect(amsProperty.value).to.equal('/hadoop/ams-hbase');
-    });
-  });
-
   describe('#trimProperty',function() {
     var testMessage = 'displayType `{0}`, value `{1}`{3} should return `{2}`';
     var tests = [
@@ -389,6 +340,7 @@ describe('App.config', function () {
     });
 
     it('bigtop should use New PostgreSQL Database as its default hive metastore database', function () {
+      App.StackService.createRecord({serviceName: 'HIVE'});
       expect(App.config.get('preDefinedSiteProperties').findProperty('recommendedValue', 'New PostgreSQL Database')).to.be.ok;
     });
 
@@ -409,6 +361,7 @@ describe('App.config', function () {
     });
 
     it('HDP2 should use New MySQL Database as its default hive metastore database', function () {
+      App.StackService.createRecord({serviceName: 'HIVE'});
       expect(App.config.get('preDefinedSiteProperties').findProperty('recommendedValue', 'New MySQL Database')).to.be.ok;
     });
 
@@ -522,185 +475,6 @@ describe('App.config', function () {
 
   });
 
-  describe('#createAdvancedPropertyObject', function() {
-    var tests = [
-      {
-        name: 'proxyuser_group',
-        cases: [
-          {
-            key: 'displayType',
-            e: 'user'
-          },
-          {
-            key: 'serviceName',
-            e: 'MISC'
-          },
-          {
-            key: 'belongsToService',
-            e: ['HIVE', 'OOZIE', 'FALCON']
-          }
-        ]
-      },
-      {
-        name: 'oozie.service.JPAService.jdbc.password',
-        cases: [
-          {
-            key: 'displayType',
-            e: 'password'
-          },
-          {
-            key: 'isVisible',
-            e: true
-          }
-        ]
-      },
-      {
-        name: 'ignore_groupsusers_create',
-        cases: [
-          {
-            key: 'isVisible',
-            e: false
-          }
-        ]
-      },
-      {
-        name: 'user_group',
-        cases: [
-          {
-            key: 'isVisible',
-            e: true
-          },
-          {
-            key: 'index',
-            e: 30
-          },
-          {
-            key: 'displayName',
-            e: 'Hadoop Group'
-          }
-        ]
-      },
-      {
-        name: 'zk_user',
-        cases: [
-          {
-            key: 'displayName',
-            e: 'ZooKeeper User'
-          }
-        ]
-      },
-      {
-        name: 'mapred_user',
-        cases: [
-          {
-            key: 'displayName',
-            e: 'MapReduce User'
-          }
-        ]
-      },
-      {
-        name: 'smokeuser',
-        cases: [
-          {
-            key: 'displayName',
-            e: 'Smoke Test User'
-          }
-        ]
-      }
-    ];
-
-    var properties = [];
-    modelSetup.advancedConfigs.items.forEach(function(item) {
-      properties.push(App.config.createAdvancedPropertyObject(item.StackConfigurations));
-    });
-    App.config.loadClusterConfigSuccess(modelSetup.advancedClusterConfigs, {url: '/cluster/configurations'}, {callback: function (items) {properties = properties.concat(items)}});
-
-    beforeEach(function () {
-      sinon.stub(App, 'get').withArgs('isHadoopWindowsStack').returns(false);
-    });
-
-    afterEach(function () {
-      App.get.restore();
-    });
-
-    tests.forEach(function(test) {
-      test.cases.forEach(function(testCase) {
-        it('config property `{0}` `{1}` key should be`{2}`'.format(test.name, testCase.key, testCase.e), function() {
-          var property = properties.findProperty('name', test.name);
-          expect(Em.get(property, testCase.key)).to.eql(testCase.e);
-        });
-      });
-    });
-  });
-
-  describe('#mergePreDefinedWithLoaded', function() {
-    var result;
-
-    before(function() {
-      sinon.stub(App.config, 'parseValue', function(value) {return value});
-      sinon.stub(App.config, 'getConfigTypesInfoFromService').returns({
-        supportsFinal: ['hdfs-site']
-      });
-      setups.setupStackVersion(this, 'HDP-2.2');
-      loadServiceModelsData(['HDFS', 'STORM']);
-      App.config.loadAdvancedConfigSuccess(modelSetup.advancedConfigs, { url: '/serviceName/configurations'}, {
-        callback: function(advancedConfigs) {
-          App.config.loadClusterConfigSuccess(modelSetup.advancedClusterConfigs, { url: '/cluster/configurations'}, {
-            callback: function(clusterConfigs) {
-              var configCategories = modelSetup.setupConfigGroupsObject();
-              var tags = [
-                {newTagName: null, tagName: 'version1', siteName: 'hadoop-env'},
-                {newTagName: null, tagName: 'version1', siteName: 'hdfs-site'},
-                {newTagName: null, tagName: 'version1', siteName: 'cluster-env'},
-                {newTagName: null, tagName: 'version1', siteName: 'storm-env'}
-              ];
-              var serviceName = 'STORM';
-              result = App.config.mergePreDefinedWithLoaded(configCategories, advancedConfigs.concat(clusterConfigs), tags, serviceName);
-            }
-          });
-        }
-      });
-    });
-
-    after(function() {
-      App.config.parseValue.restore();
-      App.config.getConfigTypesInfoFromService.restore();
-      setups.restoreStackVersion(this);
-      removeServiceModelData(['HDFS', 'STORM']);
-    });
-    
-    var propertyTests = [
-      {
-        name: 'hdfs_user',
-        cases: [
-          {
-            key: 'displayType',
-            e: 'user'
-          },
-          {
-            key: 'isVisible',
-            e: true
-          },
-          {
-            key: 'serviceName',
-            e: 'MISC'
-          },
-          {
-            key: 'category',
-            e: 'Users and Groups'
-          }
-        ]
-      }
-    ];
-    propertyTests.forEach(function(test) {
-      test.cases.forEach(function(testCase) {
-        it('config property `{0}` `{1}` key should be`{2}`'.format(test.name, testCase.key, testCase.e), function() {
-          var property = result.configs.findProperty('name', test.name);
-          expect(Em.get(property, testCase.key)).to.equal(testCase.e);
-        });
-      });
-    });
-  });
 
   describe('#replaceConfigValues', function () {
 
@@ -886,204 +660,6 @@ describe('App.config', function () {
 
   });
 
-  describe('#addUserProperty', function () {
-
-    var cases = [
-        {
-          stored: {
-            id: 0,
-            name: 'prop_name0',
-            serviceName: 's0',
-            value: 'v0',
-            savedValue: 'dv0',
-            filename: 'fn0.xml',
-            overrides: null,
-            isVisible: false,
-            isFinal: true,
-            savedIsFinal: false,
-            supportsFinal: true,
-            category: 'c0'
-          },
-          expected: {
-            id: 0,
-            name: 'prop_name0',
-            displayName: 'Prop Name0',
-            serviceName: 's0',
-            value: 'v0',
-            savedValue: 'dv0',
-            displayType: 'advanced',
-            filename: 'fn0.xml',
-            isUserProperty: false,
-            hasInitialValue: false,
-            isOverridable: true,
-            overrides: null,
-            isRequired: false,
-            isVisible: false,
-            isFinal: true,
-            savedIsFinal: false,
-            supportsFinal: true,
-            showLabel: true,
-            category: 'c0'
-          },
-          title: 'default case'
-        },
-        {
-          stored: {
-            name: 'n1',
-            value: 'multi\nline',
-            filename: 'fn1.xml',
-            isUserProperty: true,
-            hasInitialValue: true,
-            showLabel: false
-          },
-          expected: {
-            displayType: 'multiLine',
-            isUserProperty: true,
-            hasInitialValue: true,
-            showLabel: false
-          },
-          title: 'multiline user property with initial value, label not to be shown'
-        },
-        {
-          stored: {
-            name: 'n2',
-            filename: 'fn2.xml'
-          },
-          expected: {
-            isUserProperty: false,
-            showLabel: true
-          },
-          title: 'isUserProperty and showLabel not set'
-        },
-        {
-          stored: {
-            name: 'ignore_groupsusers_create',
-            category: 'Users and Groups',
-            filename: 'fn3.xml'
-          },
-          expected: {
-            displayName: 'dn0',
-            displayType: 'checkbox',
-            index: 0
-          }
-        },
-        {
-          stored: {
-            name: 'smokeuser',
-            category: 'Users and Groups',
-            filename: 'fn4.xml'
-          },
-          expected: {
-            displayName: 'dn1',
-            index: 1
-          }
-        },
-        {
-          stored: {
-            name: 'user_group',
-            category: 'Users and Groups',
-            filename: 'fn5.xml'
-          },
-          expected: {
-            displayName: 'dn1',
-            index: 2
-          }
-        },
-        {
-          stored: {
-            name: 'mapred_user',
-            category: 'Users and Groups',
-            filename: 'fn6.xml'
-          },
-          expected: {
-            displayName: 'dn1',
-            index: 3
-          }
-        },
-        {
-          stored: {
-            name: 'zk_user',
-            category: 'Users and Groups',
-            filename: 'fn7.xml'
-          },
-          expected: {
-            displayName: 'dn1',
-            index: 4
-          }
-        }
-      ],
-      advancedConfigs = [
-        {
-          name: 'ignore_groupsusers_create',
-          displayName: 'dn0',
-          displayType: 'checkbox',
-          index: 0
-        },
-        {
-          name: 'smokeuser',
-          displayName: 'dn1',
-          index: 1
-        },
-        {
-          name: 'user_group',
-          displayName: 'dn1',
-          index: 2
-        },
-        {
-          name: 'mapred_user',
-          displayName: 'dn1',
-          index: 3
-        },
-        {
-          name: 'zk_user',
-          displayName: 'dn1',
-          index: 4
-        }
-      ];
-
-    cases.forEach(function (item) {
-      it(item.title || item.stored.name, function () {
-        var configData = App.config.addUserProperty(item.stored, true, advancedConfigs);
-        Em.keys(item.expected).forEach(function (key) {
-          expect(configData[key]).to.equal(item.expected[key]);
-        });
-      });
-    });
-
-  });
-
-  describe('#getOriginalConfigAttribute', function () {
-
-    var stored = {
-        name: 'p',
-        displayName: 'dn'
-      },
-      cases = [
-        {
-          advancedConfigs: [
-            {
-              name: 'p',
-              displayName: 'dn0'
-            }
-          ],
-          expected: 'dn0',
-          title: 'should take attribute from advancedConfigs'
-        },
-        {
-          advancedConfigs: [],
-          expected: 'dn',
-          title: 'property is absent in advancedConfigs'
-        }
-      ];
-
-    cases.forEach(function (item) {
-      it(item.title, function () {
-        expect(App.config.getOriginalConfigAttribute(stored, 'displayName', item.advancedConfigs)).to.equal(item.expected);
-      });
-    });
-
-  });
-
   describe('#setConfigValue', function () {
 
     Em.A([
@@ -1366,4 +942,439 @@ describe('App.config', function () {
     });
   });
 
+  describe("#createOverride", function() {
+    var template = {
+      name: "p1",
+      filename: "f1",
+      value: "v1",
+      recommendedValue: "rv1",
+      savedValue: "sv1",
+      isFinal: true,
+      recommendedIsFinal: false,
+      savedIsFinal: true
+    };
+
+    var configProperty = App.ServiceConfigProperty.create(template);
+
+    var group = App.ConfigGroup.create({name: "group1"});
+
+    it('creates override with save properties as original config', function() {
+      var override = App.config.createOverride(configProperty, {}, group);
+      for (var key in template) {
+        expect(override.get(key)).to.eql(template[key]);
+      }
+    });
+
+    it('overrides some values that should be different for override', function() {
+      var override = App.config.createOverride(configProperty, {}, group);
+      expect(override.get('isOriginalSCP')).to.be.false;
+      expect(override.get('overrides')).to.be.null;
+      expect(override.get('group')).to.eql(group);
+      expect(override.get('parentSCP')).to.eql(configProperty);
+    });
+
+    it('overrides some specific values', function() {
+      var overridenTemplate = {
+        value: "v2",
+        recommendedValue: "rv2",
+        savedValue: "sv2",
+        isFinal: true,
+        recommendedIsFinal: false,
+        savedIsFinal: true
+      };
+
+      var override = App.config.createOverride(configProperty, overridenTemplate, group);
+      for (var key in overridenTemplate) {
+        expect(override.get(key)).to.eql(overridenTemplate[key]);
+      }
+    });
+
+    it('throws error due to undefined configGroup', function() {
+      expect(App.config.createOverride.bind(App.config, configProperty, {}, null)).to.throw(Error, 'configGroup can\' be null');
+    });
+
+    it('throws error due to undefined originalSCP', function() {
+      expect(App.config.createOverride.bind(App.config, null, {}, group)).to.throw(Error, 'serviceConfigProperty can\' be null');
+    });
+
+    it('updates originalSCP object ', function() {
+      configProperty.set('overrides', null);
+      configProperty.set('overrideValues', []);
+      configProperty.set('overrideIsFinalValues', []);
+
+      var overridenTemplate2 = {
+        value: "v12",
+        recommendedValue: "rv12",
+        savedValue: "sv12",
+        isFinal: true,
+        recommendedIsFinal: false,
+        savedIsFinal: false
+      };
+
+      var override = App.config.createOverride(configProperty, overridenTemplate2, group);
+
+      expect(configProperty.get('overrides')[0]).to.be.eql(override);
+      expect(configProperty.get('overrideValues')).to.be.eql([overridenTemplate2.value]);
+      expect(configProperty.get('overrideIsFinalValues')).to.be.eql([overridenTemplate2.isFinal]);
+    });
+  });
+
+  describe('#getIsEditable', function() {
+    [{
+        isDefaultGroup: true,
+        isReconfigurable: true,
+        canEdit: true,
+        res: true,
+        m: "isEditable is true"
+      },
+      {
+        isDefaultGroup: false,
+        isReconfigurable: true,
+        canEdit: true,
+        res: false,
+        m: "isEditable is false; config group is not default"
+      },
+      {
+        isDefaultGroup: true,
+        isReconfigurable: false,
+        canEdit: true,
+        res: false,
+        m: "isEditable is true; config is not reconfigurable"
+      },
+      {
+        isDefaultGroup: true,
+        isReconfigurable: true,
+        canEdit: false,
+        res: false,
+        m: "isEditable is true; edition restricted by controller state"
+    }].forEach(function(t) {
+        it(t.m, function() {
+          var configProperty = Ember.Object.create({isReconfigurable: t.isReconfigurable});
+          var configGroup = Ember.Object.create({isDefault: t.isDefaultGroup});
+          var isEditable = App.config.getIsEditable(configProperty, configGroup, t.canEdit);
+          expect(isEditable).to.equal(t.res);
+        })
+      });
+  });
+
+  describe('#getIsSecure', function() {
+    var secureConfigs = App.config.get('secureConfigs');
+    before(function() {
+      App.config.set('secureConfigs', [{name: 'secureConfig'}]);
+    });
+    after(function() {
+      App.config.set('secureConfigs', secureConfigs);
+    });
+
+    it('config is secure', function() {
+      expect(App.config.getIsSecure('secureConfig')).to.equal(true);
+    });
+    it('config is not secure', function() {
+      expect(App.config.getIsSecure('NotSecureConfig')).to.equal(false);
+    });
+  });
+
+  describe('#getDefaultCategory', function() {
+    it('returns custom category', function() {
+      expect(App.config.getDefaultCategory(null, 'filename.xml')).to.equal('Custom filename');
+    });
+    it('returns advanced category', function() {
+      expect(App.config.getDefaultCategory(Em.Object.create, 'filename.xml')).to.equal('Advanced filename');
+    });
+  });
+
+  describe('#getDefaultDisplayType', function() {
+    it('returns content displayType', function() {
+      sinon.stub(App.config, 'isContentProperty', function () {return true});
+      expect(App.config.getDefaultDisplayType('content','f1','anything')).to.equal('content');
+      App.config.isContentProperty.restore();
+    });
+    it('returns singleLine displayType', function() {
+      sinon.stub(App.config, 'isContentProperty', function () {return false});
+      expect(App.config.getDefaultDisplayType('n1','f1','v1')).to.equal('advanced');
+      App.config.isContentProperty.restore();
+    });
+    it('returns multiLine displayType', function() {
+      sinon.stub(App.config, 'isContentProperty', function () {return false});
+      expect(App.config.getDefaultDisplayType('n2', 'f2', 'v1\nv2')).to.equal('multiLine');
+      App.config.isContentProperty.restore();
+    });
+  });
+
+  describe('#getDefaultDisplayName', function() {
+    beforeEach(function() {
+      sinon.stub(App.config, 'getConfigTagFromFileName', function(fName) {return fName} );
+    });
+    afterEach(function() {
+      App.config.getConfigTagFromFileName.restore();
+    });
+
+    it('returns name', function() {
+      sinon.stub(App.config, 'isContentProperty', function() {return false} );
+      expect(App.config.getDefaultDisplayName('name')).to.equal('name');
+      App.config.isContentProperty.restore();
+    });
+    it('returns name for env content', function() {
+      sinon.stub(App.config, 'isContentProperty', function() {return true} );
+      expect(App.config.getDefaultDisplayName('name', 'fileName')).to.equal('fileName template');
+      App.config.isContentProperty.restore();
+    });
+  });
+
+  describe('#isContentProperty', function() {
+    beforeEach(function() {
+      sinon.stub(App.config, 'getConfigTagFromFileName', function(fName) {return fName} );
+    });
+    afterEach(function() {
+      App.config.getConfigTagFromFileName.restore();
+    });
+    var tests = [
+      {
+        name: 'content',
+        fileName: 'something-env',
+        tagEnds: null,
+        res: true,
+        m: 'returns true as it\'s content property'
+      },
+      {
+        name: 'content',
+        fileName: 'something-any-end',
+        tagEnds: ['-any-end'],
+        res: true,
+        m: 'returns true as it\'s content property with specific fileName ending'
+      },
+      {
+        name: 'notContent',
+        fileName: 'something-env',
+        tagEnds: ['-env'],
+        res: false,
+        m: 'returns false as name is not content'
+      },
+      {
+        name: 'content',
+        fileName: 'something-env1',
+        tagEnds: ['-env'],
+        res: false,
+        m: 'returns false as fileName is not correct'
+      }
+    ].forEach(function(t) {
+        it(t.m, function() {
+          expect(App.config.isContentProperty(t.name, t.fileName, t.tagEnds)).to.equal(t.res);
+        });
+      });
+  });
+
+  describe('#formatValue', function() {
+    it('formatValue for masterHosts', function () {
+      var serviceConfigProperty = Em.Object.create({'displayType': 'masterHosts', value: "['h1','h2']"});
+      expect(App.config.formatPropertyValue(serviceConfigProperty)).to.eql(['h1','h2']);
+    });
+
+    it('formatValue for int', function () {
+      var serviceConfigProperty = Em.Object.create({'displayType': 'int', value: '4.0'});
+      expect(App.config.formatPropertyValue(serviceConfigProperty)).to.equal('4');
+    });
+
+    it('formatValue for int with m', function () {
+      var serviceConfigProperty = Em.Object.create({'displayType': 'int', value: '4m'});
+      expect(App.config.formatPropertyValue(serviceConfigProperty)).to.equal('4');
+    });
+
+    it('formatValue for float', function () {
+      var serviceConfigProperty = Em.Object.create({'displayType': 'float', value: '0.40'});
+      expect(App.config.formatPropertyValue(serviceConfigProperty)).to.equal('0.4');
+    });
+
+    it('formatValue for kdc_type', function () {
+      var serviceConfigProperty = Em.Object.create({'name': 'kdc_type', value: 'mit-kdc'});
+      expect(App.config.formatPropertyValue(serviceConfigProperty)).to.equal(Em.I18n.t('admin.kerberos.wizard.step1.option.kdc'));
+    });
+
+    it('don\'t format value', function () {
+      var serviceConfigProperty = Em.Object.create({'name': 'any', displayType: 'any', value: 'any'});
+      expect(App.config.formatPropertyValue(serviceConfigProperty)).to.equal('any');
+    });
+  });
+
+  describe('#getPropertyIfExists', function() {
+    [
+      {
+        propertyName: 'someProperty',
+        defaultValue: 'default',
+        firstObject: { someProperty: '1' },
+        secondObject: { someProperty: '2' },
+        res: '1',
+        m: 'use value from first object'
+      },
+      {
+        propertyName: 'someProperty',
+        defaultValue: 'default',
+        firstObject: { someOtherProperty: '1' },
+        secondObject: { someProperty: '2' },
+        res: '2',
+        m: 'use value from second object'
+      },
+      {
+        propertyName: 'someProperty',
+        defaultValue: 'default',
+        firstObject: { someOtherProperty: '1' },
+        secondObject: { someOtherProperty: '2' },
+        res: 'default',
+        m: 'use default value'
+      },
+      {
+        propertyName: 'someProperty',
+        defaultValue: 'default',
+        res: 'default',
+        m: 'use default value'
+      },
+      {
+        propertyName: 'someProperty',
+        defaultValue: true,
+        firstObject: { someProperty: false },
+        secondObject: { someProperty: true },
+        res: false,
+        m: 'use value from first object, check booleans'
+      },
+      {
+        propertyName: 'someProperty',
+        defaultValue: true,
+        firstObject: { someProperty: 0 },
+        secondObject: { someProperty: 1 },
+        res: 0,
+        m: 'use value from first object, check 0'
+      },
+      {
+        propertyName: 'someProperty',
+        defaultValue: true,
+        firstObject: { someProperty: '' },
+        secondObject: { someProperty: '1' },
+        res: '',
+        m: 'use value from first object, check empty string'
+      }
+    ].forEach(function (t) {
+        it(t.m, function () {
+          expect(App.config.getPropertyIfExists(t.propertyName, t.defaultValue, t.firstObject, t.secondObject)).to.equal(t.res);
+        })
+      });
+  });
+
+  describe('#createDefaultConfig', function() {
+    before(function () {
+      sinon.stub(App.config, 'getDefaultDisplayName', function () {
+        return 'pDisplayName';
+      });
+      sinon.stub(App.config, 'getDefaultDisplayType', function () {
+        return 'pDisplayType';
+      });
+      sinon.stub(App.config, 'getDefaultCategory', function () {
+        return 'pCategory';
+      });
+      sinon.stub(App.config, 'getIsSecure', function () {
+        return false;
+      });
+      sinon.stub(App.config, 'getDefaultIsShowLabel', function () {
+        return true;
+      });
+    });
+
+    after(function () {
+      App.config.getDefaultDisplayName.restore();
+      App.config.getDefaultDisplayType.restore();
+      App.config.getDefaultCategory.restore();
+      App.config.getIsSecure.restore();
+      App.config.getDefaultIsShowLabel.restore();
+    });
+
+    var res = {
+      /** core properties **/
+      name: 'pName',
+      filename: 'pFileName',
+      value: '',
+      savedValue: null,
+      isFinal: false,
+      savedIsFinal: null,
+      /** UI and Stack properties **/
+      recommendedValue: null,
+      recommendedIsFinal: null,
+      supportsFinal: false,
+      serviceName: 'MISC',
+      defaultDirectory: '',
+      displayName: 'pDisplayName',
+      displayType: 'pDisplayType',
+      description: null,
+      category: 'pCategory',
+      isSecureConfig: false,
+      showLabel: true,
+      isVisible: true,
+      isUserProperty: false,
+      isRequired: true,
+      group: null,
+      id: 'site property',
+      isRequiredByAgent: true,
+      isReconfigurable: true,
+      isObserved: false,
+      unit: null,
+      hasInitialValue: false,
+      isOverridable: true,
+      index: null,
+      dependentConfigPattern: null,
+      options: null,
+      radioName: null,
+      belongsToService: []
+    };
+    it('create default config object', function () {
+      expect(App.config.createDefaultConfig('pName', 'pFileName', true)).to.eql(res);
+    });
+    it('runs proper methods', function () {
+      expect(App.config.getDefaultDisplayName.calledWith('pName', 'pFileName')).to.be.true;
+      expect(App.config.getDefaultDisplayType.calledWith('pName', 'pFileName', '')).to.be.true;
+      expect(App.config.getDefaultCategory.calledWith(true, 'pFileName')).to.be.true;
+      expect(App.config.getIsSecure.calledWith('pName')).to.be.true;
+      expect(App.config.getDefaultIsShowLabel.calledWith('pName', 'pFileName')).to.be.true;
+    });
+  });
+
+  describe('#mergeStackConfigsWithUI', function() {
+    beforeEach(function() {
+      sinon.stub(App.config, 'getPropertyIfExists', function(key, value) {return 'res_' + value});
+    });
+
+    afterEach(function() {
+      App.config.getPropertyIfExists.restore();
+    });
+
+    var template = {
+      name: 'pName',
+      filename: 'pFileName',
+      value: 'pValue',
+      savedValue: 'pValue',
+      isFinal: true,
+      savedIsFinal: true,
+
+      serviceName: 'pServiceName',
+      displayName: 'pDisplayName',
+      displayType: 'pDisplayType',
+      category: 'pCategory'
+    };
+
+    var result = {
+      name: 'pName',
+      filename: 'pFileName',
+      value: 'pValue',
+      savedValue: 'pValue',
+      isFinal: true,
+      savedIsFinal: true,
+
+      serviceName: 'res_pServiceName',
+      displayName: 'res_pDisplayName',
+      displayType: 'res_pDisplayType',
+      category: 'res_pCategory'
+    };
+
+    it('called generate property object', function () {
+      expect(App.config.mergeStaticProperties(template, {}, {})).to.eql(result);
+    });
+  });
+
 });


[3/3] ambari git commit: AMBARI-12618 Service config pages load too slowly. (ababiichuk)

Posted by ab...@apache.org.
AMBARI-12618 Service config pages load too slowly. (ababiichuk)


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

Branch: refs/heads/branch-2.1
Commit: 9582cc0a7f5f527aa9f9dd2521c7ce8a48fc26ac
Parents: 1b3f6f7
Author: aBabiichuk <ab...@cybervisiontech.com>
Authored: Mon Aug 3 12:25:11 2015 +0300
Committer: aBabiichuk <ab...@cybervisiontech.com>
Committed: Mon Aug 3 12:25:11 2015 +0300

----------------------------------------------------------------------
 .../controllers/global/cluster_controller.js    |   4 +-
 .../main/admin/kerberos/step2_controller.js     |  14 +-
 .../main/admin/kerberos/wizard_controller.js    |  24 +-
 .../main/admin/serviceAccounts_controller.js    |  19 +-
 .../controllers/main/service/info/configs.js    | 287 +-----
 ambari-web/app/controllers/wizard.js            |  74 +-
 .../app/controllers/wizard/step7_controller.js  | 117 +--
 ambari-web/app/data/HDP2.3/site_properties.js   |   8 +-
 ambari-web/app/data/host_component_mapping.js   | 142 +++
 .../configs/stack_config_properties_mapper.js   |  42 +-
 ambari-web/app/mappers/configs/themes_mapper.js |   2 +-
 .../app/mixins/common/configs/configs_saver.js  |   2 +
 .../mixins/common/configs/enhanced_configs.js   |  10 +-
 .../main/service/configs/config_overridable.js  |  12 +-
 .../app/models/configs/stack_config_property.js |   9 +-
 ambari-web/app/routes/add_service_routes.js     |   1 -
 ambari-web/app/routes/installer.js              |   5 +-
 ambari-web/app/utils/ajax/ajax.js               |   5 +
 ambari-web/app/utils/config.js                  | 992 ++++++-------------
 .../app/views/common/configs/services_config.js |   4 +-
 ambari-web/app/views/common/controls_view.js    |   2 +-
 .../common/modal_popups/select_groups_popup.js  |   6 +-
 .../views/main/admin/serviceAccounts_view.js    |   5 +-
 .../main/service/info/config_test.js            |  93 +-
 .../test/controllers/wizard/step7_test.js       |  37 +-
 ambari-web/test/controllers/wizard_test.js      |  43 -
 ambari-web/test/utils/config_test.js            | 863 ++++++++--------
 27 files changed, 1071 insertions(+), 1751 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/controllers/global/cluster_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/global/cluster_controller.js b/ambari-web/app/controllers/global/cluster_controller.js
index e4a74c0..b9d9711 100644
--- a/ambari-web/app/controllers/global/cluster_controller.js
+++ b/ambari-web/app/controllers/global/cluster_controller.js
@@ -216,7 +216,9 @@ App.ClusterController = Em.Controller.extend({
       updater.updateServices(function () {
         self.updateLoadStatus('services');
         App.config.loadConfigsFromStack(App.Service.find().mapProperty('serviceName')).complete(function () {
-          self.set('isConfigsPropertiesLoaded', true);
+          App.config.loadClusterConfigsFromStack().complete(function() {
+            self.set('isConfigsPropertiesLoaded', true);
+          });
         });
         // service metrics loading doesn't affect overall progress
         updater.updateServiceMetric(function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/controllers/main/admin/kerberos/step2_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/kerberos/step2_controller.js b/ambari-web/app/controllers/main/admin/kerberos/step2_controller.js
index 332da6a..083e0c0 100644
--- a/ambari-web/app/controllers/main/admin/kerberos/step2_controller.js
+++ b/ambari-web/app/controllers/main/admin/kerberos/step2_controller.js
@@ -72,6 +72,10 @@ App.KerberosWizardStep2Controller = App.WizardStep7Controller.extend({
   },
 
 
+  isConfigsLoaded: function () {
+    return this.get('wizardController.stackConfigsLoaded');
+  }.property('wizardController.stackConfigsLoaded'),
+
   /**
    * On load function
    * @method loadStep
@@ -82,18 +86,12 @@ App.KerberosWizardStep2Controller = App.WizardStep7Controller.extend({
       return;
     }
     this.clearStep();
-    //STEP 1: Load advanced configs
-    var advancedConfigs = this.get('content.advancedServiceConfig');
     //STEP 2: Load on-site configs by service from local DB
     var storedConfigs = this.get('content.serviceConfigProperties');
     //STEP 3: Merge pre-defined configs with loaded on-site configs
-    this.set('configs', App.config.mergePreDefinedWithStored(
-      storedConfigs,
-      advancedConfigs,
-      this.get('selectedServiceNames')));
+    this.set('configs', App.config.mergePreDefinedWithStack(this.get('selectedServiceNames')));
     App.config.setPreDefinedServiceConfigs(this.get('addMiscTabToPage'));
-    //STEP 4: Add advanced configs
-    App.config.addAdvancedConfigs(this.get('configs'), advancedConfigs);
+
     this.filterConfigs(this.get('configs'));
     this.applyServicesConfigs(this.get('configs'), storedConfigs);
   },

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/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 e66d6c7..5096602 100644
--- a/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
+++ b/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
@@ -30,6 +30,7 @@ App.KerberosWizardController = App.WizardController.extend({
 
   isKerberosWizard: true,
 
+  stackConfigsLoaded: false,
   /**
    * Used for hiding back button in wizard
    */
@@ -153,21 +154,6 @@ App.KerberosWizardController = App.WizardController.extend({
     this.set('content.serviceConfigProperties', serviceConfigProperties);
   },
 
-  /**
-   * load advanced configs from server
-   */
-  loadAdvancedConfigs: function (dependentController) {
-    var self = this;
-    var loadAdvancedConfigResult = [];
-    dependentController.set('isAdvancedConfigLoaded', false);
-    var serviceName = this.get('content.serviceName');
-    App.config.loadAdvancedConfig(serviceName, function (properties) {
-      loadAdvancedConfigResult.pushObjects(properties);
-      self.set('content.advancedServiceConfig', loadAdvancedConfigResult);
-      dependentController.set('isAdvancedConfigLoaded', true);
-    });
-  },
-
   loadKerberosDescriptorConfigs: function () {
     var kerberosDescriptorConfigs = this.getDBProperty('kerberosDescriptorConfigs');
     this.set('kerberosDescriptorConfigs', kerberosDescriptorConfigs);
@@ -268,9 +254,13 @@ App.KerberosWizardController = App.WizardController.extend({
       {
         type: 'sync',
         callback: function () {
-          var kerberosStep2controller = App.get('router.kerberosWizardStep2Controller');
-          this.loadAdvancedConfigs(kerberosStep2controller);
+          var self = this;
           this.loadServiceConfigProperties();
+          if (!this.get('stackConfigsLoaded')) {
+            App.config.loadConfigsFromStack(['KERBEROS']).complete(function() {
+              self.set('stackConfigsLoaded', true);
+            }, this);
+          }
         }
       }
     ],

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/controllers/main/admin/serviceAccounts_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/serviceAccounts_controller.js b/ambari-web/app/controllers/main/admin/serviceAccounts_controller.js
index 3fcb1df..8629d67 100644
--- a/ambari-web/app/controllers/main/admin/serviceAccounts_controller.js
+++ b/ambari-web/app/controllers/main/admin/serviceAccounts_controller.js
@@ -45,9 +45,7 @@ App.MainAdminServiceAccountsController = App.MainServiceInfoConfigsController.ex
   },
   loadServiceTagSuccess: function (data, opt, params) {
     var self = this;
-    var installedServices = App.Service.find().mapProperty("serviceName");
     var serviceConfigsDef = params.serviceConfigsDef;
-    var serviceName = this.get('selectedService');
     var loadedClusterSiteToTagMap = {};
 
     for (var site in Em.get(data, 'Clusters.desired_configs')) {
@@ -58,15 +56,7 @@ App.MainAdminServiceAccountsController = App.MainServiceInfoConfigsController.ex
     this.setServiceConfigTags(loadedClusterSiteToTagMap);
     // load server stored configurations
     App.router.get('configurationController').getConfigsByTags(this.get('serviceConfigTags')).done(function (serverConfigs) {
-      // load configurations list for installed services
-      App.config.loadAdvancedConfigPartial(installedServices, {
-        queryFilter: 'configurations/StackConfigurations/property_type.matches(.*[USER,GROUP].*)'
-      }, function(advancedConfigs) {
-        // load cluster configs
-        App.config.loadClusterConfig(function(clusterConfigs) {
-          self.createConfigObject(serverConfigs, advancedConfigs.concat(clusterConfigs));
-        });
-      });
+      self.createConfigObject(serverConfigs);
     });
   },
 
@@ -111,11 +101,10 @@ App.MainAdminServiceAccountsController = App.MainServiceInfoConfigsController.ex
    * Generate configuration object that will be rendered
    *
    * @param {Object[]} serverConfigs
-   * @param {Object[]} advancedConfigs
    */
-  createConfigObject: function(serverConfigs, advancedConfigs) {
-    var configSet = App.config.mergePreDefinedWithLoaded(serverConfigs, advancedConfigs, this.get('serviceConfigTags'), this.get('selectedService'));
-    var miscConfigs = configSet.configs.filterProperty('serviceName', this.get('selectedService')).filterProperty('category', 'Users and Groups').filterProperty('isVisible', true).rejectProperty('displayType', 'password').rejectProperty('displayType', 'checkbox');
+  createConfigObject: function(serverConfigs) {
+    var configs = App.config.mergePredefinedWithSaved(serverConfigs, this.get('selectedService'));
+    var miscConfigs = configs.filterProperty('displayType', 'user').filterProperty('category', 'Users and Groups').filterProperty('isVisible', true);
 
     miscConfigs = App.config.miscConfigVisibleProperty(miscConfigs, App.Service.find().mapProperty('serviceName').concat('MISC'));
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/controllers/main/service/info/configs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/info/configs.js b/ambari-web/app/controllers/main/service/info/configs.js
index ce06786..ca2500f 100644
--- a/ambari-web/app/controllers/main/service/info/configs.js
+++ b/ambari-web/app/controllers/main/service/info/configs.js
@@ -106,16 +106,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
   }.property('content.serviceName', 'dependentServiceNames'),
 
   /**
-   * configs from stack for dependent services
-   * @type {App.StackConfigProperty[]}
-   */
-  advancedConfigs: function() {
-    return App.StackConfigProperty.find().filter(function(scp) {
-      return this.get('servicesToLoad').contains(scp.get('serviceName'));
-    }, this);
-  }.property('content.serviceName', 'App.router.clusterController.isStackConfigsLoaded'),
-
-  /**
    * @type {boolean}
    */
   isCurrentSelected: function () {
@@ -134,10 +124,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
     return App.config.get('preDefinedServiceConfigs');
   }.property('App.config.preDefinedServiceConfigs'),
 
-  configMapping: function () {
-    return App.config.get('configMapping');
-  }.property('App.config.configMapping'),
-
   configs: function () {
     return  App.config.get('preDefinedSiteProperties');
   }.property('App.config.preDefinedSiteProperties'),
@@ -213,6 +199,20 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
   ],
 
   /**
+   * get array of config proerties that are shown in settings tab
+   * @type {App.StackConfigProperty[]}
+   */
+  settingsTabProperties: function() {
+    var properties = [];
+    App.Tab.find(this.get('content.serviceName') + '_settings').get('sections').forEach(function(s) {
+      s.get('subSections').forEach(function(ss) {
+        properties = properties.concat(ss.get('configProperties').filterProperty('id'));
+      });
+    });
+    return properties;
+  }.property('content.serviceName', 'App.router.clusterController.isStackConfigsLoaded'),
+
+  /**
    * Dropdown menu items in filter combobox
    * @type {{attributeName: string, attributeValue: string, name: string, selected: boolean}[]}
    */
@@ -366,8 +366,8 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
         });
       }
     });
-    var configs = App.config.mergePredefinedWithSaved(configGroups, this.get('advancedConfigs'), serviceName, this.get('selectedConfigGroup'), this.get('canEdit'));
-    configs = App.config.syncOrderWithPredefined(configs);
+    var configs = App.config.mergePredefinedWithSaved(configGroups, serviceName, this.get('selectedConfigGroup'), this.get('canEdit'));
+    configs = App.config.sortConfigs(configs);
     /**
      * if property defined in stack but somehow it missed from cluster properties (can be after stack upgrade)
      * ui should add this properties to step configs
@@ -376,7 +376,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
 
     //put properties from capacity-scheduler.xml into one config with textarea view
     if (this.get('content.serviceName') === 'YARN') {
-      var configsToSkip = this.get('advancedConfigs').filterProperty('filename', 'capacity-scheduler.xml').filterProperty('subSection');
+      var configsToSkip = this.get('settingsTabProperties').filterProperty('filename', 'capacity-scheduler.xml');
       configs = App.config.fileConfigsIntoTextarea(configs, 'capacity-scheduler.xml', configsToSkip);
     }
 
@@ -386,9 +386,10 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
         configs.findProperty('name', 'kdc_host').set('isRequired', false).set('isVisible', false);
         configs.findProperty('name', 'admin_server_host').set('isRequired', false).set('isVisible', false);
         configs.findProperty('name', 'domains').set('isRequired', false).set('isVisible', false);
+      } else if (kdc_type.get('value') === 'active-directory') {
+        configs.findProperty('name', 'container_dn').set('isVisible', true);
+        configs.findProperty('name', 'ldap_url').set('isVisible', true);
       }
-
-      kdc_type.set('value', App.router.get('mainAdminKerberosController.kdcTypesValues')[kdc_type.get('value')]);
     }
 
     this.set('allConfigs', configs);
@@ -397,26 +398,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
   },
 
   /**
-   * revert certain config values to their innital value
-   * i.e. don't save the KDC Type as "Existing MIT KDC", instead save it as mit-kdc
-   */
-  configValueRevert: function () {
-    var stepConfigs = this.get('stepConfigs').findProperty('serviceName', this.get('content.serviceName'));
-    if (!stepConfigs) { return; }
-
-    var configs = stepConfigs.configs;
-    if (configs) {
-      var kdc_type = configs.findProperty('name', 'kdc_type');
-
-      if (!kdc_type) { return; };
-      if (App.router.get('mainAdminKerberosController.kdcTypesValues')[kdc_type.get('value')]) { return; }
-
-      kdc_type.set('value', kdc_type.get('savedValue'));
-    }
-
-  }.observes('saveInProgress'),
-
-  /**
    * adds properties form stack that doesn't belong to cluster
    * to step configs
    * also set recommended value if isn't exists
@@ -424,14 +405,9 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
    * @return {App.ServiceConfigProperty[]}
    * @method mergeWithStackProperties
    */
-  mergeWithStackProperties: function(configs) {
-    this.get('advancedConfigs').forEach(function(advanced) {
-      var c = configs.findProperty('name', advanced.get('name'));
-      if (c) {
-        if (!c.get('recommendedValue')) {
-          c.set('recommendedValue', advanced.get('value'));
-        }
-      } else if (advanced.get('widget')) {
+  mergeWithStackProperties: function (configs) {
+    this.get('settingsTabProperties').forEach(function (advanced) {
+      if (!configs.someProperty('name', advanced.get('name'))) {
         configs.pushObject(App.ServiceConfigProperty.create({
           name: advanced.get('name'),
           displayName: advanced.get('displayName'),
@@ -467,12 +443,14 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
 
             if (serviceConfig) {
               if (self.get('selectedConfigGroup.isDefault') || configGroup.get('name') == self.get('selectedConfigGroup.name')) {
-                var override = self.createNewSCP({"value": value, "isFinal": isFinal, "group": configGroup}, serviceConfig, self.get('selectedConfigGroup.isDefault'));
-                override.set('isEditable', self.get('canEdit') && configGroup.get('name') == self.get('selectedConfigGroup.name'));
-                if (!serviceConfig.get('overrides')) serviceConfig.set('overrides', []);
-                serviceConfig.get('overrides').pushObject(override);
-                serviceConfig.set('overrideValues', serviceConfig.get('overrides').mapProperty('value'));
-                serviceConfig.set('overrideIsFinalValues', serviceConfig.get('overrides').mapProperty('isFinal'));
+                var overridePlainObject = {
+                  "value": value,
+                  "savedValue": value,
+                  "isFinal": isFinal,
+                  "savedIsFinal": isFinal,
+                  "isEditable": self.get('canEdit') && configGroup.get('name') == self.get('selectedConfigGroup.name')
+                };
+                App.config.createOverride(serviceConfig, overridePlainObject, configGroup);
               }
             } else {
               var isEditable = self.get('canEdit') && configGroup.get('name') == self.get('selectedConfigGroup.name');
@@ -630,187 +608,33 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
   },
 
   /**
-   * trigger addOverrideProperty
-   * @param {Object[]} configs
+   * trigger App.config.createOverride
+   * @param {Object[]} stepConfig
    * @private
    * @method checkOverrideProperty
    */
-  checkOverrideProperty: function (componentConfig) {
+  checkOverrideProperty: function (stepConfig) {
     var overrideToAdd = this.get('overrideToAdd');
-    var value = Em.get(overrideToAdd, 'value');
-    var isEnhanced = !!this.get('overrideToAdd.widget');
+    var value = !!this.get('overrideToAdd.widget') ? Em.get(overrideToAdd, 'value') : '';
     if (overrideToAdd) {
-      overrideToAdd = componentConfig.configs.filter(function(c){
+      overrideToAdd = stepConfig.configs.filter(function(c){
         return c.name == overrideToAdd.name && c.filename == overrideToAdd.filename;
       });
       if (overrideToAdd[0]) {
-        this.addOverrideProperty(overrideToAdd[0], this.get('selectedConfigGroup'), isEnhanced ? value : null);
+        App.config.createOverride(overrideToAdd[0], {"isEditable": true, "value": value}, this.get('selectedConfigGroup'));
         this.set('overrideToAdd', null);
       }
     }
   },
 
   /**
-   * create new overridden property and set appropriate fields
-   * @param override
-   * @param serviceConfigProperty
-   * @param defaultGroupSelected
-   * @returns {*}
-   * @private
-   * @method createNewSCP
-   */
-  createNewSCP: function (override, serviceConfigProperty, defaultGroupSelected) {
-    var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty, {
-      value: Em.get(override, 'value'),
-      savedValue: Em.get(override, 'value'),
-      recommendedValue: serviceConfigProperty.get('recommendedValue'),
-      isFinal: Em.get(override, 'isFinal'),
-      savedIsFinal: Em.get(override, 'isFinal'),
-      recommendedIsFinal: serviceConfigProperty.get('recommendedIsFinal'),
-      group: Em.get(override, 'group'),
-      supportsFinal: serviceConfigProperty.get('supportsFinal'),
-      isOriginalSCP: false,
-      parentSCP: serviceConfigProperty,
-      overrides: null
-    });
-    if (defaultGroupSelected) {
-      newSCP.set('isEditable', false);
-    }
-    newSCP.validate();
-    return newSCP;
-  },
-
-  /**
-   * Array of Objects
-   * {
-   *  hostProperty - hostName property name for current component
-   *  componentName - master componentName
-   *  serviceName - serviceName of component
-   *  serviceUseThis - services that use hostname property of component(componentName)
-   *  m(multiple) - true if can be more than one components installed on cluster
-   * }
-   */
-
-  hostComponentsMapping: [
-    {
-      hostProperty: 'snamenode_host',
-      componentName: 'SECONDARY_NAMENODE',
-      serviceName: 'HDFS',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'jobtracker_host',
-      componentName: 'JOBTRACKER',
-      serviceName: 'MAPREDUCE2',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'hs_host',
-      componentName: 'HISTORYSERVER',
-      serviceName: 'MAPREDUCE2',
-      serviceUseThis: ['YARN']
-    },
-    {
-      hostProperty: 'ats_host',
-      componentName: 'APP_TIMELINE_SERVER',
-      serviceName: 'YARN',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'rm_host',
-      componentName: 'RESOURCEMANAGER',
-      serviceName: 'YARN',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'hivemetastore_host',
-      componentName: 'HIVE_METASTORE',
-      serviceName: 'HIVE',
-      serviceUseThis: ['HIVE'],
-      m: true
-    },
-    {
-      hostProperty: 'hive_ambari_host',
-      componentName: 'HIVE_SERVER',
-      serviceName: 'HIVE',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'oozieserver_host',
-      componentName: 'OOZIE_SERVER',
-      serviceName: 'OOZIE',
-      serviceUseThis: [],
-      m: true
-    },
-    {
-      hostProperty: 'oozie_ambari_host',
-      componentName: 'OOZIE_SERVER',
-      serviceName: 'OOZIE',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'hbasemaster_host',
-      componentName: 'HBASE_MASTER',
-      serviceName: 'HBASE',
-      serviceUseThis: [],
-      m: true
-    },
-    {
-      hostProperty: 'webhcatserver_host',
-      componentName: 'WEBHCAT_SERVER',
-      serviceName: 'HIVE',
-      serviceUseThis: [],
-      m: true
-    },
-    {
-      hostProperty: 'zookeeperserver_hosts',
-      componentName: 'ZOOKEEPER_SERVER',
-      serviceName: 'ZOOKEEPER',
-      serviceUseThis: ['HBASE', 'HIVE'],
-      m: true
-    },
-    {
-      hostProperty: 'stormuiserver_host',
-      componentName: 'STORM_UI_SERVER',
-      serviceName: 'STORM',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'drpcserver_host',
-      componentName: 'DRPC_SERVER',
-      serviceName: 'STORM',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'storm_rest_api_host',
-      componentName: 'STORM_REST_API',
-      serviceName: 'STORM',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'supervisor_hosts',
-      componentName: 'SUPERVISOR',
-      serviceName: 'STORM',
-      serviceUseThis: [],
-      m: true
-    },
-    {
-      hostProperty: 'rangerserver_host',
-      componentName: 'RANGER_ADMIN',
-      serviceName: 'RANGER',
-      serviceUseThis: [],
-      m: true
-    }
-  ],
-
-  /**
    * Adds host name of master component to config
    * @private
    * @method addHostNamesToGlobalConfig
    */
   addHostNamesToConfig: function () {
     var serviceName = this.get('content.serviceName');
-    var configs = this.get('allConfigs');
+    var hostComponentMapping = require('data/host_component_mapping');
     //namenode_host is required to derive "fs.default.name" a property of core-site
     try {
       this.setHostForService('HDFS', 'NAMENODE', 'namenode_host', true);
@@ -818,7 +642,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
       console.log("No NameNode Host available.  This is expected if you're using GLUSTERFS rather than HDFS.");
     }
 
-    var hostProperties = this.get('hostComponentsMapping').filter(function (h) {
+    var hostProperties = hostComponentMapping.filter(function (h) {
       return h.serviceUseThis.contains(serviceName) || h.serviceName == serviceName;
     });
     hostProperties.forEach(function (h) {
@@ -961,39 +785,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
   },
 
   /**
-   * add new overridden property to config property object
-   * @param {object} serviceConfigProperty - config property object
-   * @param {App.ConfigGroup} group - config group for new property
-   * @param {String} value
-   * @param {boolean} isNotSaved TODO
-   * @method addOverrideProperty
-   */
-  addOverrideProperty: function (serviceConfigProperty, group, value, isNotSaved) {
-    if (serviceConfigProperty.get('isOriginalSCP')) {
-      var overrides = serviceConfigProperty.get('overrides');
-      if (!overrides) {
-        overrides = [];
-        serviceConfigProperty.set('overrides', overrides);
-      }
-      // create new override with new value
-      var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty, {
-        value: value || '',
-        recommendedValue: serviceConfigProperty.get('recommendedValue'),
-        recommendedIsFinal: serviceConfigProperty.get('recommendedIsFinal'),
-        isOriginalSCP: false,
-        parentSCP: serviceConfigProperty,
-        isEditable: true,
-        group: group,
-        overrides: null,
-        isNotSaved: isNotSaved
-      });
-      console.debug("createOverrideProperty(): Added:", newSCP, " to main-property:", serviceConfigProperty);
-      newSCP.validate();
-      overrides.pushObject(newSCP);
-    }
-  },
-
-  /**
    * trigger manageConfigurationGroups
    * @method manageConfigurationGroup
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/controllers/wizard.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard.js b/ambari-web/app/controllers/wizard.js
index c34cad9..0cc8e74 100644
--- a/ambari-web/app/controllers/wizard.js
+++ b/ambari-web/app/controllers/wizard.js
@@ -833,43 +833,6 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
   },
 
   /**
-   * load advanced configs from server
-   */
-  loadAdvancedConfigs: function (dependentController) {
-    var self = this;
-    var loadServiceConfigsFn = function (clusterProperties) {
-      var stackServices = self.get('content.services').filter(function (service) {
-        return service.get('isInstalled') || service.get('isSelected');
-      });
-      var loadAdvancedConfigResult = [];
-      dependentController.set('isAdvancedConfigLoaded', false);
-
-      App.config.loadAdvancedConfigAll(stackServices.mapProperty('serviceName'), function (configMap) {
-        stackServices.forEach(function (service) {
-          var serviceName = service.get('serviceName');
-          var properties = configMap[serviceName];
-          var supportsFinal = App.config.getConfigTypesInfoFromService(service).supportsFinal;
-
-          properties.forEach(function (property) {
-            property.supportsFinal = Boolean(supportsFinal.find(function (configType) {
-              return property.filename.startsWith(configType);
-            }));
-            if (property.serviceName == 'MISC' && property.name == 'yarn_user') {
-               property.supportsFinal = false;
-            }
-          });
-          loadAdvancedConfigResult.pushObjects(properties);
-        });
-        loadAdvancedConfigResult.pushObjects(clusterProperties);
-        self.set('content.advancedServiceConfig', loadAdvancedConfigResult);
-        dependentController.set('isAdvancedConfigLoaded', true);
-      });
-    };
-    App.config.loadClusterConfig(loadServiceConfigsFn);
-  },
-
-
-  /**
    * Load serviceConfigProperties to model
    */
   loadServiceConfigProperties: function () {
@@ -891,29 +854,8 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
       }
 
       _content.get('configs').forEach(function (_configProperties) {
-        var configProperty = {
-          id: _configProperties.get('id'),
-          name: _configProperties.get('name'),
-          displayName: _configProperties.get('displayName'),
-          value: _configProperties.get('value'),
-          savedValue: _configProperties.get('savedValue'),
-          recommendedValue: _configProperties.get('recommendedValue'),
-          description: _configProperties.get('description'),
-          serviceName: _configProperties.get('serviceName'),
-          domain: _configProperties.get('domain'),
-          isVisible: _configProperties.get('isVisible'),
-          isFinal: _configProperties.get('isFinal'),
-          recommendedIsFinal: _configProperties.get('isFinal'),
-          supportsFinal: _configProperties.get('supportsFinal'),
-          filename: _configProperties.get('filename'),
-          displayType: _configProperties.get('displayType'),
-          isRequiredByAgent: _configProperties.get('isRequiredByAgent'),
-          hasInitialValue: !!_configProperties.get('hasInitialValue'),
-          isRequired: _configProperties.get('isRequired'), // flag that allow saving property with empty value
-          group: !!_configProperties.get('group') ? _configProperties.get('group.name') : null,
-          showLabel: _configProperties.get('showLabel'),
-          category: _configProperties.get('category')
-        };
+        var configProperty = App.config.createDefaultConfig(_configProperties.get('name'), _configProperties.get('filename'), _configProperties.get('isUserProperty'), {value: _configProperties.get('value')});
+        configProperty = App.config.mergeStaticProperties(configProperty, _configProperties, ['name', 'filename']);
 
         if (this.isExcludedConfig(configProperty)) {
           configProperty.value = '';
@@ -1248,11 +1190,13 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
         return s.get('isSelected') || s.get('isInstalled');
       }).mapProperty('serviceName');
       // Load stack configs before loading themes
-      App.config.loadConfigsFromStack(serviceNames).done(function () {
-        self.loadConfigThemeForServices(serviceNames).always(function () {
-          self.set('stackConfigsLoaded', true);
-          App.themesMapper.generateAdvancedTabs(serviceNames);
-          dfd.resolve();
+      App.config.loadClusterConfigsFromStack().always(function() {
+        App.config.loadConfigsFromStack(serviceNames).done(function () {
+          self.loadConfigThemeForServices(serviceNames).always(function () {
+            self.set('stackConfigsLoaded', true);
+            App.themesMapper.generateAdvancedTabs(serviceNames);
+            dfd.resolve();
+          });
         });
       });
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/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 67fb944..1d3eea4 100644
--- a/ambari-web/app/controllers/wizard/step7_controller.js
+++ b/ambari-web/app/controllers/wizard/step7_controller.js
@@ -106,20 +106,14 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
   serviceConfigTags: [],
 
   /**
-   * Are advanced configs loaded
-   * @type {bool}
-   */
-  isAdvancedConfigLoaded: true,
-
-  /**
    * Are applied to service configs loaded
    * @type {bool}
    */
   isAppliedConfigLoaded: true,
 
   isConfigsLoaded: function () {
-    return (this.get('isAdvancedConfigLoaded') && this.get('isAppliedConfigLoaded'));
-  }.property('isAdvancedConfigLoaded', 'isAppliedConfigLoaded'),
+    return (this.get('wizardController.stackConfigsLoaded') && this.get('isAppliedConfigLoaded'));
+  }.property('wizardController.stackConfigsLoaded', 'isAppliedConfigLoaded'),
 
   /**
    * Number of errors in the configs in the selected service
@@ -540,7 +534,9 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
     if (overrideToAdd) {
       overrideToAdd = componentConfig.get('configs').findProperty('name', overrideToAdd.name);
       if (overrideToAdd) {
-        this.addOverrideProperty(overrideToAdd);
+        var group = this.get('selectedService.configGroups').findProperty('name', this.get('selectedConfigGroup.name'));
+        var newSCP = App.config.createOverride(overrideToAdd, {isEditable: true}, group);
+        group.get('properties').pushObject(newSCP);
         component.set('overrideToAdd', null);
       }
     }
@@ -624,19 +620,12 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
     this.clearStep();
 
     var self = this;
-    //STEP 1: Load advanced configs
-    var advancedConfigs = this.get('content.advancedServiceConfig');
     //STEP 2: Load on-site configs by service from local DB
     var storedConfigs = this.get('content.serviceConfigProperties');
     //STEP 3: Merge pre-defined configs with loaded on-site configs
-    var configs = App.config.mergePreDefinedWithStored(
-      storedConfigs,
-      advancedConfigs,
-      this.get('selectedServiceNames').concat(this.get('installedServiceNames'))
-    );
+    var configs = (storedConfigs && storedConfigs.length) ? storedConfigs
+      : App.config.mergePreDefinedWithStack(this.get('selectedServiceNames').concat(this.get('installedServiceNames')));
     App.config.setPreDefinedServiceConfigs(this.get('addMiscTabToPage'));
-    //STEP 4: Add advanced configs
-    App.config.addAdvancedConfigs(configs, advancedConfigs);
 
     this.set('groupsToDelete', this.get('wizardController').getDBProperty('groupsToDelete') || []);
     if (this.get('wizardController.name') === 'addServiceController') {
@@ -668,51 +657,37 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
     this.activateSpecialConfigs();
     this.selectProperService();
     var self = this;
-    this.loadServerSideConfigsRecommendations().always(function () {
-      // format descriptor configs
-      var serviceConfigPropertiesNames = (self.get('content.serviceConfigProperties') || []).mapProperty('name'),
-       serviceConfigPropertiesFileNames = (self.get('content.serviceConfigProperties') || []).mapProperty('filename'),
-       recommendedToDelete = self.get('_dependentConfigValues').filterProperty('toDelete');
-      recommendedToDelete.forEach(function (c) {
-        var name = Em.get(c, 'propertyName'),
-         filename = Em.get(c, 'fileName');
-        if (serviceConfigPropertiesNames.contains(name) && serviceConfigPropertiesFileNames.contains(filename)) {
-          Em.set(c, 'toDelete', false);
-        }
-      });
-
-      var rangerService = App.StackService.find().findProperty('serviceName', 'RANGER');
-      if (rangerService && !rangerService.get('isInstalled') && !rangerService.get('isSelected')) {
-        App.config.removeRangerConfigs(self.get('stepConfigs'));
-      }
-      if (!self.get('content.serviceConfigProperties.length')) {
-        // for Add Service just remove or add dependent properties and ignore config values changes
-        // for installed services only
+    var rangerService = App.StackService.find().findProperty('serviceName', 'RANGER');
+    if (rangerService && !rangerService.get('isInstalled') && !rangerService.get('isSelected')) {
+      App.config.removeRangerConfigs(self.get('stepConfigs'));
+    }
+    if (this.get('content.serviceConfigProperties.length') > 0) {
+      this.completeConfigLoading();
+    } else {
+      this.loadServerSideConfigsRecommendations().always(function () {
         if (self.get('wizardController.name') == 'addServiceController') {
+          // for Add Service just remove or add dependent properties and ignore config values changes
+          // for installed services only
           self.addRemoveDependentConfigs(self.get('installedServiceNames'));
           self.clearDependenciesForInstalledServices(self.get('installedServiceNames'), self.get('stepConfigs'));
         }
         // * add dependencies based on recommendations
         // * update config values with recommended
-        // * remove properties recieved from recommendations
+        // * remove properties received from recommendations
         self.updateDependentConfigs();
-      } else {
-        // control flow for managing dependencies for stored configs,
-        // * Don't update values with recommended to save user's input
-        // * add dependencies based on user's input for parent configs
-        // * remove dependencies based on user's input for parent configs
-        self.addRemoveDependentConfigs();
-      }
-      self.restoreRecommendedConfigs();
-      self.clearDependentConfigsByService(App.StackService.find().filterProperty('isSelected').mapProperty('serviceName'));
-      self.set('isRecommendedLoaded', true);
-      if (self.get('content.skipConfigStep')) {
-        App.router.send('next');
-      }
-      self.set('hash', self.getHash());
-    });
+        self.completeConfigLoading();
+      });
+    }
   },
 
+  completeConfigLoading: function() {
+    this.clearDependentConfigsByService(App.StackService.find().filterProperty('isSelected').mapProperty('serviceName'));
+    this.set('isRecommendedLoaded', true);
+    if (this.get('content.skipConfigStep')) {
+      App.router.send('next');
+    }
+    this.set('hash', this.getHash());
+  },
   /**
    * After user navigates back to step7, values for depended configs should be set to values set by user and not to default values
    * @method restoreRecommendedConfigs
@@ -1178,7 +1153,11 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
       configOverrides = overrides.filterProperty('name', config.get('name'));
     if (!selectedGroup) return config;
     if (overrideToAdd && overrideToAdd.get('name') === config.get('name')) {
-      configOverrides.push(this.addOverrideProperty(config));
+      var valueForOverride = (config.get('widget') || config.get('displayType') == 'checkbox') ? config.get('value') : '';
+      var group = this.get('selectedService.configGroups').findProperty('name', selectedGroup.get('name'));
+      var newSCP = App.config.createOverride(config, {value: valueForOverride, recommendedValue: valueForOverride}, group);
+      configOverrides.push(newSCP);
+      group.get('properties').pushObject(newSCP);
       this.set('overrideToAdd', null);
     }
     configOverrides.setEach('isEditable', !selectedGroup.get('isDefault'));
@@ -1188,34 +1167,6 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
   },
 
   /**
-   * create overriden property and push it into Config group
-   * @param serviceConfigProperty
-   * @param group
-   * @param value
-   * @param isNotSaved
-   * @param {App.ServiceConfigProperty} serviceConfigProperty
-   * @return {App.ServiceConfigProperty}
-   * @method addOverrideProperty
-   */
-  addOverrideProperty: function (serviceConfigProperty, group, value, isNotSaved) {
-    var overrides = serviceConfigProperty.get('overrides') || [];
-    var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty);
-    group = group || this.get('selectedService.configGroups').findProperty('name', this.get('selectedConfigGroup.name'));
-    var valueForOverride = (serviceConfigProperty.get('widget') || serviceConfigProperty.get('displayType') == 'checkbox') ? serviceConfigProperty.get('value') : '';
-    newSCP.set('group', group);
-    newSCP.set('value', value || valueForOverride);
-    newSCP.set('recommendedValue', value || valueForOverride);
-    newSCP.set('isOriginalSCP', false); // indicated this is overridden value,
-    newSCP.set('parentSCP', serviceConfigProperty);
-    newSCP.set('isEditable', true);
-    newSCP.set('isNotSaved', isNotSaved);
-    group.get('properties').pushObject(newSCP);
-    overrides.pushObject(newSCP);
-    newSCP.validate();
-    return newSCP;
-  },
-
-  /**
    * @method manageConfigurationGroup
    */
   manageConfigurationGroup: function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/data/HDP2.3/site_properties.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/data/HDP2.3/site_properties.js b/ambari-web/app/data/HDP2.3/site_properties.js
index 152d58d..1babe76 100644
--- a/ambari-web/app/data/HDP2.3/site_properties.js
+++ b/ambari-web/app/data/HDP2.3/site_properties.js
@@ -41,7 +41,13 @@ var excludedConfigs = [
   'xa_ldap_ad_domain',
   'xa_ldap_ad_url',
   'policymgr_http_enabled',
-  'policymgr_external_url'
+  'policymgr_external_url',
+  'hbase.regionserver.global.memstore.lowerLimit',
+  'hbase.regionserver.global.memstore.upperLimit',
+  "port",
+  "hive.metastore.heapsize",
+  "hive.client.heapsize",
+  "SQL_COMMAND_INVOKER"
 ];
 
 var hdp23properties = hdp22properties.filter(function (item) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/data/host_component_mapping.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/data/host_component_mapping.js b/ambari-web/app/data/host_component_mapping.js
new file mode 100644
index 0000000..be5f891
--- /dev/null
+++ b/ambari-web/app/data/host_component_mapping.js
@@ -0,0 +1,142 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var App = require('app');
+
+/**
+ * Array of Objects
+ * {
+   *  hostProperty - hostName property name for current component
+   *  componentName - master componentName
+   *  serviceName - serviceName of component
+   *  serviceUseThis - services that use hostname property of component(componentName)
+   *  m(multiple) - true if can be more than one components installed on cluster
+   * }
+ */
+
+module.exports = [
+  {
+    hostProperty: 'snamenode_host',
+    componentName: 'SECONDARY_NAMENODE',
+    serviceName: 'HDFS',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'jobtracker_host',
+    componentName: 'JOBTRACKER',
+    serviceName: 'MAPREDUCE2',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'hs_host',
+    componentName: 'HISTORYSERVER',
+    serviceName: 'MAPREDUCE2',
+    serviceUseThis: ['YARN']
+  },
+  {
+    hostProperty: 'ats_host',
+    componentName: 'APP_TIMELINE_SERVER',
+    serviceName: 'YARN',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'rm_host',
+    componentName: 'RESOURCEMANAGER',
+    serviceName: 'YARN',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'hivemetastore_host',
+    componentName: 'HIVE_METASTORE',
+    serviceName: 'HIVE',
+    serviceUseThis: ['HIVE'],
+    m: true
+  },
+  {
+    hostProperty: 'hive_ambari_host',
+    componentName: 'HIVE_SERVER',
+    serviceName: 'HIVE',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'oozieserver_host',
+    componentName: 'OOZIE_SERVER',
+    serviceName: 'OOZIE',
+    serviceUseThis: [],
+    m: true
+  },
+  {
+    hostProperty: 'oozie_ambari_host',
+    componentName: 'OOZIE_SERVER',
+    serviceName: 'OOZIE',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'hbasemaster_host',
+    componentName: 'HBASE_MASTER',
+    serviceName: 'HBASE',
+    serviceUseThis: [],
+    m: true
+  },
+  {
+    hostProperty: 'webhcatserver_host',
+    componentName: 'WEBHCAT_SERVER',
+    serviceName: 'HIVE',
+    serviceUseThis: [],
+    m: true
+  },
+  {
+    hostProperty: 'zookeeperserver_hosts',
+    componentName: 'ZOOKEEPER_SERVER',
+    serviceName: 'ZOOKEEPER',
+    serviceUseThis: ['HBASE', 'HIVE'],
+    m: true
+  },
+  {
+    hostProperty: 'stormuiserver_host',
+    componentName: 'STORM_UI_SERVER',
+    serviceName: 'STORM',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'drpcserver_host',
+    componentName: 'DRPC_SERVER',
+    serviceName: 'STORM',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'storm_rest_api_host',
+    componentName: 'STORM_REST_API',
+    serviceName: 'STORM',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'supervisor_hosts',
+    componentName: 'SUPERVISOR',
+    serviceName: 'STORM',
+    serviceUseThis: [],
+    m: true
+  },
+  {
+    hostProperty: 'rangerserver_host',
+    componentName: 'RANGER_ADMIN',
+    serviceName: 'RANGER',
+    serviceUseThis: [],
+    m: true
+  }
+];

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/mappers/configs/stack_config_properties_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/configs/stack_config_properties_mapper.js b/ambari-web/app/mappers/configs/stack_config_properties_mapper.js
index 09f3cf9..e907020 100644
--- a/ambari-web/app/mappers/configs/stack_config_properties_mapper.js
+++ b/ambari-web/app/mappers/configs/stack_config_properties_mapper.js
@@ -34,25 +34,34 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({
     property_depended_by: 'StackConfigurations.property_depended_by',
     property_depends_on: 'StackConfigurations.property_depends_on',
     value_attributes: 'StackConfigurations.property_value_attributes',
-    is_final: 'default_is_final',
-    recommended_is_final: 'default_is_final',
+    is_final: 'recommended_is_final',
+    recommended_is_final: 'recommended_is_final',
     supports_final: 'supports_final',
     widget: 'widget',
     /**** ui properties ***/
     display_type: 'display_type',
-    category: 'category'
+    category: 'category',
+    index: 'index'
   },
 
   map: function (json) {
-    console.time('stackConfigMapper execution time');
+    console.time('stackConfigPropertiesMapper execution time');
+    if (json && json.Versions) {
+      //hack for cluster versions
+      json = {items: [json]};
+      var clusterConfigs = true;
+    }
     if (json && json.items) {
       var configs = [];
       json.items.forEach(function(stackItem) {
-        var configTypeInfo = Em.get(stackItem, 'StackServices.config_types');
+        var configTypeInfo = clusterConfigs ? Em.get(stackItem, 'Versions.config_types') : Em.get(stackItem, 'StackServices.config_types');
 
         stackItem.configurations.forEach(function(config) {
+          if (clusterConfigs) {
+            config.StackConfigurations = config.StackLevelConfigurations;
+          }
           var configType = App.config.getConfigTagFromFileName(config.StackConfigurations.type);
-          config.id = config.StackConfigurations.property_name + '_' + configType;
+          config.id = App.config.configId(config.StackConfigurations.property_name, configType);
           config.recommended_is_final = config.StackConfigurations.final === "true";
           config.supports_final = !!configTypeInfo[configType] && configTypeInfo[configType].supports.final === "true";
           // Map from /dependencies to property_depended_by
@@ -90,10 +99,10 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({
       }, this);
       App.store.loadMany(this.get('model'), configs);
     }
-    console.timeEnd('stackConfigMapper execution time');
+    console.timeEnd('stackConfigPropertiesMapper execution time');
   },
 
-  /******************* METHODS TO MERGE STACK PROPERTIES WITH STORED ON UI (NOT USED FOR NOW)*********************************/
+  /******************* METHODS TO MERGE STACK PROPERTIES WITH STORED ON UI *********************************/
 
   /**
    * find UI config with current name and fileName
@@ -102,13 +111,18 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({
    * @method mergeWithUI
    */
   mergeWithUI: function(config) {
-    var uiConfigProperty = this.getUIConfig(config.StackConfigurations.property_name, config.StackConfigurations.type);
-    var displayType = App.permit(App.config.advancedConfigIdentityData(config.StackConfigurations), 'displayType').displayType || 'string';
-    if (!config.StackConfigurations.property_display_name) {
-      config.StackConfigurations.property_display_name = uiConfigProperty && uiConfigProperty.displayName ? uiConfigProperty.displayName : config.StackConfigurations.property_name;
+    var c = config.StackConfigurations;
+    var uiConfigProperty = this.getUIConfig(c.property_name, c.type);
+    var advancedData = App.config.advancedConfigIdentityData(c);
+
+    if (!c.property_display_name) {
+      c.property_display_name = App.config.getPropertyIfExists('displayName', App.config.getDefaultDisplayName(c.property_name, c.type), advancedData, uiConfigProperty);
     }
-    config.category = uiConfigProperty ? uiConfigProperty.category : 'Advanced ' + App.config.getConfigTagFromFileName(config.StackConfigurations.type);
-    config.display_type = uiConfigProperty ? uiConfigProperty.displayType || displayType : displayType;
+    c.service_name = App.config.getPropertyIfExists('serviceName', c.service_name, advancedData, uiConfigProperty);
+
+    config.category = App.config.getPropertyIfExists('category', App.config.getDefaultCategory(true, c.type), advancedData, uiConfigProperty);
+    config.display_type = App.config.getPropertyIfExists('displayType', App.config.getDefaultDisplayType(c.property_name, c.type, c.property_value), advancedData, uiConfigProperty);
+    config.index = App.config.getPropertyIfExists('index', null, advancedData, uiConfigProperty);
   },
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/mappers/configs/themes_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/configs/themes_mapper.js b/ambari-web/app/mappers/configs/themes_mapper.js
index eda0e52..e632860 100644
--- a/ambari-web/app/mappers/configs/themes_mapper.js
+++ b/ambari-web/app/mappers/configs/themes_mapper.js
@@ -164,7 +164,7 @@ App.themesMapper = App.QuickDataMapper.create({
   getConfigId: function(json) {
     if (json && json.config && typeof json.config === "string") {
       var split = json.config.split("/");
-      return split[1] + "_" + split[0];
+      return App.config.configId(split[1], split[0]);
     } else {
       console.warn('getConfigId: invalid input data');
       return null;

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/mixins/common/configs/configs_saver.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/configs/configs_saver.js b/ambari-web/app/mixins/common/configs/configs_saver.js
index b00a28e..252229c 100644
--- a/ambari-web/app/mixins/common/configs/configs_saver.js
+++ b/ambari-web/app/mixins/common/configs/configs_saver.js
@@ -555,6 +555,8 @@ App.ConfigsSaverMixin = Em.Mixin.create({
       return property.get('value').toString();
     }
     switch (name) {
+      case 'kdc_type':
+        return App.router.get('mainAdminKerberosController.kdcTypesValues')[property.get('value')];
       case 'storm.zookeeper.servers':
       case 'nimbus.seeds':
         if (Em.isArray(value)) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/mixins/common/configs/enhanced_configs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/configs/enhanced_configs.js b/ambari-web/app/mixins/common/configs/enhanced_configs.js
index 5e5f653..b08e7b2 100644
--- a/ambari-web/app/mixins/common/configs/enhanced_configs.js
+++ b/ambari-web/app/mixins/common/configs/enhanced_configs.js
@@ -555,7 +555,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
       var properties = configs[siteName].property_attributes || {};
       Em.keys(properties).forEach(function (propertyName) {
         var cp = configProperties.findProperty('name', propertyName);
-        var stackProperty = App.StackConfigProperty.find().findProperty('id', propertyName + '_' + siteName);
+        var stackProperty = App.StackConfigProperty.find().findProperty('id', App.config.configId(propertyName, siteName));
         var attributes = properties[propertyName] || {};
         Em.keys(attributes).forEach(function (attributeName) {
           if (attributeName == 'delete') {
@@ -684,7 +684,13 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
             overriddenProperty.set('value', Em.get(propertyToAdd, 'recommendedValue'));
             overriddenProperty.set('recommendedValue', Em.get(propertyToAdd, 'recommendedValue'));
           } else {
-            this.addOverrideProperty(cp, selectedGroup, Em.get(propertyToAdd, 'recommendedValue'), !Em.get(propertyToAdd, 'isDeleted'));
+            var overridePlainObject = {
+              "value": Em.get(propertyToAdd, 'recommendedValue'),
+              "recommendedValue": Em.get(propertyToAdd, 'recommendedValue'),
+              "isNotSaved": !Em.get(propertyToAdd, 'isDeleted'),
+              "isEditable": true
+            };
+            App.config.createOverride(cp, overridePlainObject, selectedGroup);
           }
         }
         Em.setProperties(propertyToAdd, {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/mixins/main/service/configs/config_overridable.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/main/service/configs/config_overridable.js b/ambari-web/app/mixins/main/service/configs/config_overridable.js
index 1dc3d24..4f42b34 100644
--- a/ambari-web/app/mixins/main/service/configs/config_overridable.js
+++ b/ambari-web/app/mixins/main/service/configs/config_overridable.js
@@ -53,7 +53,6 @@ App.ConfigOverridable = Em.Mixin.create({
         configGroups,
         serviceConfigProperty,
         function (selectedGroupInPopup) {
-          console.log("launchConfigGroupSelectionCreationDialog(): Selected/Created:", selectedGroupInPopup);
           if (selectedGroupInPopup) {
             serviceConfigController.set('overrideToAdd', serviceConfigProperty);
             serviceConfigController.set('selectedConfigGroup', selectedGroupInPopup);
@@ -63,8 +62,11 @@ App.ConfigOverridable = Em.Mixin.create({
       );
     }
     else {
-      var valueForOverride = (serviceConfigProperty.get('widget') || serviceConfigProperty.get('displayType') == 'checkbox') ? serviceConfigProperty.get('value') : null;
-      serviceConfigController.addOverrideProperty(serviceConfigProperty, selectedConfigGroup, valueForOverride);
+      var valueForOverride = (serviceConfigProperty.get('widget') || serviceConfigProperty.get('displayType') == 'checkbox') ? serviceConfigProperty.get('value') : '';
+      var override = App.config.createOverride(serviceConfigProperty, { "value": valueForOverride, "isEditable": true }, selectedConfigGroup);
+      if (isInstaller) {
+        selectedConfigGroup.get('properties').pushObject(override);
+      }
     }
     Em.$('body>.tooltip').remove();
   },
@@ -126,8 +128,10 @@ App.ConfigOverridable = Em.Mixin.create({
         if (this.get('optionSelectConfigGroup')) {
           var selectedConfigGroup = this.get('selectedConfigGroup');
           this.hide();
-          App.get('router.mainServiceInfoConfigsController').loadSelectedVersion(null, this.get('selectedConfigGroup'));
           callback(selectedConfigGroup);
+          if (!isInstaller) {
+            App.get('router.mainServiceInfoConfigsController').doSelectConfigGroup({context: selectedConfigGroup});
+          }
         } else {
           var newConfigGroupName = this.get('newConfigGroupName').trim();
           var newConfigGroup = App.ConfigGroup.create({

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/models/configs/stack_config_property.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/configs/stack_config_property.js b/ambari-web/app/models/configs/stack_config_property.js
index 7caeadf..a1925a4 100644
--- a/ambari-web/app/models/configs/stack_config_property.js
+++ b/ambari-web/app/models/configs/stack_config_property.js
@@ -86,7 +86,7 @@ App.StackConfigProperty = DS.Model.extend({
    * service name
    * @property {string}
    */
-  serviceName:  DS.attr('string'),
+  serviceName:  DS.attr('string', {defaultValue: 'MISC'}),
 
   /**
    * stack name
@@ -182,7 +182,12 @@ App.StackConfigProperty = DS.Model.extend({
    * config property isFinal value same as recommendedIsFinal
    * @property {boolean}
    */
-  isFinal: DS.attr('boolean', {defaultValue: false})
+  isFinal: DS.attr('boolean', {defaultValue: false}),
+
+  /**
+   * @type {boolean}
+   */
+  index: DS.attr('number', {defaultValue: null})
 });
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/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 9a4071f..96937f9 100644
--- a/ambari-web/app/routes/add_service_routes.js
+++ b/ambari-web/app/routes/add_service_routes.js
@@ -214,7 +214,6 @@ module.exports = App.WizardRoute.extend({
       controller.dataLoading().done(function () {
         var wizardStep7Controller = router.get('wizardStep7Controller');
         controller.loadAllPriorSteps().done(function () {
-          controller.loadAdvancedConfigs(wizardStep7Controller);
           wizardStep7Controller.getConfigTags();
           wizardStep7Controller.set('wizardController', controller);
           controller.usersLoading().done(function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/routes/installer.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/routes/installer.js b/ambari-web/app/routes/installer.js
index c57da9c..4422f2b 100644
--- a/ambari-web/app/routes/installer.js
+++ b/ambari-web/app/routes/installer.js
@@ -302,11 +302,8 @@ module.exports = Em.Route.extend(App.RouterRedirections, {
     },
     connectOutlets: function (router, context) {
       var controller = router.get('installerController');
-
+      var wizardStep7Controller = router.get('wizardStep7Controller');
       controller.loadAllPriorSteps().done(function () {
-        var wizardStep7Controller = router.get('wizardStep7Controller');
-        controller.loadAdvancedConfigs(wizardStep7Controller);
-        wizardStep7Controller.set('isAdvancedConfigLoaded', false);
         wizardStep7Controller.set('wizardController', controller);
         controller.connectOutlet('wizardStep7', controller.get('content'));
       });

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/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 ef6cee3..bde7af6 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -640,6 +640,11 @@ var urls = {
 
   /*************************STACK CONFIGS**************************************/
 
+  'configs.stack_configs.load.cluster_configs': {
+    'real': '{stackVersionUrl}?fields=configurations/*,Versions/config_types/*',
+    'mock': '/data/stacks/HDP-2.2/configurations.json'
+  },
+
   'configs.stack_configs.load.all': {
     'real': '{stackVersionUrl}/services?fields=configurations/*,StackServices/config_types/*',
     'mock': '/data/stacks/HDP-2.2/configurations.json'


[2/3] ambari git commit: AMBARI-12618 Service config pages load too slowly. (ababiichuk)

Posted by ab...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/utils/config.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js
index 50c0326..e77a836 100644
--- a/ambari-web/app/utils/config.js
+++ b/ambari-web/app/utils/config.js
@@ -28,7 +28,7 @@ App.config = Em.Object.create({
    * filename exceptions used to support substandard sitenames which don't have "xml" extension
    * @type {string[]}
    */
-  filenameExceptions: [],
+  filenameExceptions: ['alert_notification'],
 
   preDefinedServiceConfigs: [],
 
@@ -171,65 +171,10 @@ App.config = Em.Object.create({
     }
   },
 
-  /**
-   * Create array of service properties for Log4j files
-   * @returns {Array}
-   */
-  createContentProperties: function (configs) {
-    var services = App.StackService.find();
-    var contentProperties = [];
-    if (configs) {
-      services.forEach(function (service) {
-        if (service.get('configTypes')) {
-          Object.keys(service.get('configTypes')).forEach(function (type) {
-            var contentProperty = configs.filterProperty('filename', type + '.xml').someProperty('name', 'content');
-            if (contentProperty && (type.endsWith('-log4j') || type.endsWith('-env'))) {
-              var property = {
-                "id": "site property",
-                "name": "content",
-                "displayName": type.endsWith('-env') ? type + ' template' : "content",
-                "value": "",
-                "description": type + " properties",
-                "displayType": "content",
-                "isOverridable": true,
-                "isRequired": false,
-                "isVisible": true,
-                "showLabel": type.endsWith('-env'),
-                "serviceName": service.get('serviceName'),
-                "filename": type + '.xml',
-                "category": "Advanced " + type
-              };
-              contentProperties.pushObject(property);
-            }
-          }, this);
-        }
-      }, this);
-    }
-    return contentProperties;
-  },
-
   //configs with these filenames go to appropriate category not in Advanced
   customFileNames: ['flume-conf.xml'],
 
   /**
-   * Function should be used post-install as precondition check should not be done only after installer wizard
-   * @param siteNames {String|Array}
-   * @returns {Array}
-   */
-  getBySiteName: function (siteNames) {
-    var computedConfigs = this.get('configMapping').computed();
-    var siteProperties = [];
-    if (typeof siteNames === "string") {
-      siteProperties = computedConfigs.filterProperty('filename', siteNames);
-    } else if (siteNames instanceof Array) {
-      siteNames.forEach(function (_siteName) {
-        siteProperties = siteProperties.concat(computedConfigs.filterProperty('filename', _siteName));
-      }, this);
-    }
-    return siteProperties;
-  },
-
-  /**
    * identify category by filename of config
    * @param config
    * @return {object|null}
@@ -306,14 +251,20 @@ App.config = Em.Object.create({
   },
 
 
-  mergePredefinedWithSaved: function (configCategories, advancedConfigs, serviceName, selectedConfigGroup, canEdit) {
+  /**
+   * generates config objects
+   * @param configCategories
+   * @param serviceName
+   * @param selectedConfigGroup
+   * @param canEdit
+   * @returns {Array}
+   */
+  mergePredefinedWithSaved: function (configCategories, serviceName, selectedConfigGroup, canEdit) {
     var configs = [];
-    var contentProperties = this.createContentProperties(advancedConfigs);
-    var preDefinedConfigs = this.get('preDefinedSiteProperties').concat(contentProperties);
-    var filenameExceptions = this.get('filenameExceptions');
+
     configCategories.forEach(function (siteConfig) {
       var service = this.getServiceByConfigType(siteConfig.type);
-      if (service) {
+      if (service && serviceName != 'MISC') {
         serviceName = service.get('serviceName');
       }
       var filename = App.config.getOriginalFileName(siteConfig.type);
@@ -322,486 +273,300 @@ App.config = Em.Object.create({
       var properties = siteConfig.properties || {};
 
       for (var index in properties) {
-        var configsPropertyDef = preDefinedConfigs.filterProperty('name', index).findProperty('filename', filename);
-        var advancedConfig = advancedConfigs.filterProperty('name', index).findProperty('filename', filename);
-        var isAdvanced = Boolean(advancedConfig);
-        if (!configsPropertyDef) {
-          configsPropertyDef = advancedConfig;
-        }
-        var value = this.parseValue(properties[index], configsPropertyDef, advancedConfig);
-        var serviceConfigObj = Em.Object.create({
-          name: index,
-          displayName: (configsPropertyDef && Em.get(configsPropertyDef, 'displayName')) || index,
-          value: value,
-          savedValue: value,
-          recommendedValue: advancedConfig ? Em.get(advancedConfig, 'recommendedValue') : null,
-          filename: filename,
-          isUserProperty: !configsPropertyDef,
-          isVisible: !!service,
-          isOverridable: true,
-          isReconfigurable: true,
-          isRequired: isAdvanced,
-          isFinal: finalAttributes[index] === "true",
-          savedIsFinal: finalAttributes[index] === "true",
-          recommendedIsFinal: advancedConfig ? Em.get(advancedConfig, 'recommendedIsFinal') : null,
-          showLabel: true,
-          serviceName: serviceName,
-          belongsToService: [],
-          supportsFinal: advancedConfig ? Em.get(advancedConfig, 'supportsFinal') : this.shouldSupportFinal(serviceName, siteConfig.type)
-        });
-        if (configsPropertyDef) {
-          this.setServiceConfigUiAttributes(serviceConfigObj, configsPropertyDef);
-          // check if defined UI config present in config list obtained from server.
-          // in case when config is absent on server and defined UI config is required
-          // by server, this config should be ignored
-          var serverProperty = properties[serviceConfigObj.get('name')];
-          if (Em.isNone(serverProperty) && serviceConfigObj.get('isRequiredByAgent')) {
-            continue;
-          }
+        var id = this.configId(index, siteConfig.type);
+        var configsPropertyDef = this.get('preDefinedSitePropertiesMap')[id];
+        var advancedConfig = App.StackConfigProperty.find(id);
+
+        var template = this.createDefaultConfig(index, filename, !!advancedConfig, configsPropertyDef);
+        var serviceConfigObj = this.mergeStaticProperties(template, advancedConfig);
+
+        if (serviceConfigObj.isRequiredByAgent !== false) {
+          var formattedValue = this.formatPropertyValue(serviceConfigObj, properties[index]);
+          serviceConfigObj.value = serviceConfigObj.savedValue = formattedValue;
+          serviceConfigObj.isFinal = serviceConfigObj.savedIsFinal = finalAttributes[index] === "true";
+          serviceConfigObj.isEditable = this.getIsEditable(serviceConfigObj, selectedConfigGroup, canEdit);
+          serviceConfigObj.isVisible = serviceConfigObj.isVisible === false ? false : serviceName === 'MISC' ? true : serviceConfigObj.displayType !== 'user';
         }
 
-        this.tweakConfigVisibility(serviceConfigObj, properties);
-        if (!this.getBySiteName(serviceConfigObj.get('filename')).someProperty('name', index)) {
-          if (configsPropertyDef) {
-            if (Em.get(configsPropertyDef, 'isRequiredByAgent') === false) {
-              configs.push(App.ServiceConfigProperty.create(serviceConfigObj));
-              continue;
-            }
-            this.handleSpecialProperties(serviceConfigObj);
-          } else {
-            serviceConfigObj.set('displayType', stringUtils.isSingleLine(serviceConfigObj.get('value')) ? 'advanced' : 'multiLine');
-          }
-          serviceConfigObj.setProperties({
-            'id': 'site property',
-            'displayName': configsPropertyDef && Em.get(configsPropertyDef, 'displayName') ? Em.get(configsPropertyDef, 'displayName') : index,
-            'options': configsPropertyDef ? Em.get(configsPropertyDef, 'options') : null,
-            'radioName': configsPropertyDef ? Em.get(configsPropertyDef, 'radioName') : null,
-            'serviceName': configsPropertyDef && Em.get(configsPropertyDef, 'serviceName') ? Em.get(configsPropertyDef, 'serviceName') : serviceName,
-            'belongsToService': configsPropertyDef && Em.get(configsPropertyDef, 'belongsToService') ? Em.get(configsPropertyDef, 'belongsToService') : []
-          });
-          this.calculateConfigProperties(serviceConfigObj, isAdvanced, advancedConfig);
-          this.setValueByDisplayType(serviceConfigObj);
-          if (this.get('secureConfigs').mapProperty('name').contains(serviceConfigObj.get('name'))) {
-            serviceConfigObj.set('isSecure', true);
-          }
-          serviceConfigObj.set('isEditable', canEdit && selectedConfigGroup.get('isDefault') && serviceConfigObj.get('isReconfigurable'));
-          var serviceConfigProperty = App.ServiceConfigProperty.create(serviceConfigObj);
-          serviceConfigProperty.validate();
-          configs.push(serviceConfigProperty);
-        }
+        var serviceConfigProperty = App.ServiceConfigProperty.create(serviceConfigObj);
+        serviceConfigProperty.validate();
+        configs.push(serviceConfigProperty);
       }
     }, this);
     return configs;
   },
+
   /**
-   * return:
-   *   configs,
-   *   mappingConfigs
-   *
-   * @param configCategories
-   * @param advancedConfigs
-   * @param tags
-   * @param serviceName
-   * @return {object}
+   * This method sets default values for config property
+   * These property values has the lowest priority and can be overriden be stack/UI
+   * config property but is used when such properties are absent in stack/UI configs
+   * @param {string} name
+   * @param {string} fileName
+   * @param {boolean} definedInStack
+   * @param {Object} [coreObject]
+   * @returns {Object}
    */
-  mergePreDefinedWithLoaded: function (configCategories, advancedConfigs, tags, serviceName) {
-    var configs = [];
-    var contentProperties = this.createContentProperties(advancedConfigs);
-    var preDefinedConfigs = this.get('preDefinedSiteProperties').concat(contentProperties);
-    var mappingConfigs = [];
-    var filenameExceptions = this.get('filenameExceptions');
-    tags.forEach(function (_tag) {
-      var service = this.getServiceByConfigType(_tag.siteName);
-      if (service) {
-        serviceName = service.get('serviceName');
-      }
-
-      var filename = App.config.getOriginalFileName(_tag.siteName);
-      var siteConfig = configCategories.filter(function (serviceConfigProperties) {
-        return _tag.tagName === serviceConfigProperties.tag && _tag.siteName === serviceConfigProperties.type;
-      });
-      siteConfig = siteConfig[0] || {};
-
-      var attributes = siteConfig['properties_attributes'] || {};
-      var finalAttributes = attributes.final || {};
-      var properties = siteConfig.properties || {};
-      for (var index in properties) {
-        var configsPropertyDef = preDefinedConfigs.filterProperty('name', index).findProperty('filename', filename);
-        var advancedConfig = advancedConfigs.filterProperty('name', index).findProperty('filename', filename);
-        var isAdvanced = Boolean(advancedConfig);
-        if (!configsPropertyDef) {
-          configsPropertyDef = advancedConfig;
-        }
-        var value = this.parseValue(properties[index], configsPropertyDef, advancedConfig);
-        var serviceConfigObj = App.ServiceConfig.create({
-          name: index,
-          value: value,
-          savedValue: value,
-          recommendedValue: advancedConfig ? Em.get(advancedConfig, 'recommendedValue') : null,
-          filename: filename,
-          isUserProperty: !advancedConfig,
-          isVisible: !!service,
-          isOverridable: true,
-          isReconfigurable: true,
-          isRequired: isAdvanced,
-          isFinal: finalAttributes[index] === "true",
-          savedIsFinal: finalAttributes[index] === "true",
-          recommendedIsFinal: advancedConfig ? Em.get(advancedConfig, 'recommendedIsFinal') : null,
-          showLabel: true,
-          serviceName: serviceName,
-          belongsToService: [],
-          supportsFinal: advancedConfig ? Em.get(advancedConfig, 'supportsFinal') : this.shouldSupportFinal(serviceName, _tag.siteName)
-
-        });
-        if (configsPropertyDef) {
-          this.setServiceConfigUiAttributes(serviceConfigObj, configsPropertyDef);
-          // check if defined UI config present in config list obtained from server.
-          // in case when config is absent on server and defined UI config is required
-          // by server, this config should be ignored
-          var serverProperty = properties[serviceConfigObj.get('name')];
-          if (Em.isNone(serverProperty) && serviceConfigObj.get('isRequiredByAgent')) {
-            continue;
-          }
-        }
+  createDefaultConfig: function(name, fileName, definedInStack, coreObject) {
+    return $.extend({
+      /** core properties **/
+      name: name,
+      filename: fileName,
+      value: '',
+      savedValue: null,
+      isFinal: false,
+      savedIsFinal: null,
+      /** UI and Stack properties **/
+      recommendedValue: null,
+      recommendedIsFinal: null,
+      supportsFinal: false,
+      serviceName: 'MISC',
+      defaultDirectory: '',
+      displayName: this.getDefaultDisplayName(name, fileName),
+      displayType: this.getDefaultDisplayType(name, fileName, coreObject ? coreObject.value : ''),
+      description: null,
+      category: this.getDefaultCategory(definedInStack, fileName),
+      isSecureConfig: this.getIsSecure(name),
+      showLabel: this.getDefaultIsShowLabel(name, fileName),
+      isVisible: true,
+      isUserProperty: !definedInStack,
+      isRequired: definedInStack,
+      group: null,
+      id: 'site property',
+      isRequiredByAgent:  true,
+      isReconfigurable: true,
+      isObserved: false,
+      unit: null,
+      hasInitialValue: false,
+      isOverridable: true,
+      index: null,
+      dependentConfigPattern: null,
+      options: null,
+      radioName: null,
+      belongsToService: []
+    }, coreObject);
+  },
 
-        this.tweakConfigVisibility(serviceConfigObj, properties);
-        if (!this.getBySiteName(serviceConfigObj.get('filename')).someProperty('name', index)) {
-          if (configsPropertyDef) {
-            if (Em.get(configsPropertyDef, 'isRequiredByAgent') === false) {
-              configs.push(serviceConfigObj);
-              continue;
-            }
-            this.handleSpecialProperties(serviceConfigObj);
-          } else {
-            serviceConfigObj.set('displayType', stringUtils.isSingleLine(serviceConfigObj.get('value')) ? 'advanced' : 'multiLine');
-          }
-          serviceConfigObj.setProperties({
-            'id': 'site property',
-            'displayName': configsPropertyDef && Em.get(configsPropertyDef, 'displayName') ? Em.get(configsPropertyDef, 'displayName') : index,
-            'options': configsPropertyDef ? Em.get(configsPropertyDef, 'options') : null,
-            'radioName': configsPropertyDef ? Em.get(configsPropertyDef, 'radioName') : null,
-            'serviceName': configsPropertyDef && Em.get(configsPropertyDef, 'serviceName') ? Em.get(configsPropertyDef, 'serviceName') : serviceName,
-            'belongsToService': configsPropertyDef && Em.get(configsPropertyDef, 'belongsToService') ? Em.get(configsPropertyDef, 'belongsToService') : []
-          });
-          this.calculateConfigProperties(serviceConfigObj, isAdvanced, advancedConfig);
-          this.setValueByDisplayType(serviceConfigObj);
-          configs.push(serviceConfigObj);
-        } else {
-          mappingConfigs.push(serviceConfigObj);
-        }
+  /**
+   * This method merge properties form <code>stackConfigProperty<code> which are taken from stack
+   * with <code>UIConfigProperty<code> which are hardcoded on UI
+   * @param coreObject
+   * @param stackProperty
+   * @param preDefined
+   * @param [propertiesToSkip]
+   * @param [preDefinedOnly]
+   */
+  mergeStaticProperties: function(coreObject, stackProperty, preDefined, propertiesToSkip, preDefinedOnly) {
+    propertiesToSkip = propertiesToSkip || ['name', 'filename', 'value', 'savedValue', 'isFinal', 'savedIsFinal'];
+    preDefinedOnly = preDefinedOnly || ['id'];
+    for (var k in coreObject) {
+      if (!propertiesToSkip.contains(k)) {
+        coreObject[k] = this.getPropertyIfExists(k, coreObject[k], !preDefinedOnly.contains(k) ? stackProperty : null, preDefined);
       }
-    }, this);
-    return {
-      configs: configs,
-      mappingConfigs: mappingConfigs
     }
+    return coreObject;
   },
 
   /**
-   * additional parsing when value is int of float
-   * ex: if value is "0.40" result will be "0.4"
+   * This method using for merging some properties from two objects
+   * if property exists in <code>firstPriority<code> result will be it's property
+   * else if property exists in <code>secondPriority<code> result will be it's property
+   * otherwise <code>defaultValue<code> will be returned
+   * @param {String} propertyName
+   * @param {*} defaultValue=null
+   * @param {Em.Object|Object} firstPriority
+   * @param {Em.Object|Object} [secondPriority=null]
+   * @returns {*}
+   */
+  getPropertyIfExists: function(propertyName, defaultValue, firstPriority, secondPriority) {
+    if (firstPriority && !Em.isNone(Em.get(firstPriority, propertyName))) {
+      return Em.get(firstPriority, propertyName);
+    } else if (secondPriority && !Em.isNone(Em.get(secondPriority, propertyName))) {
+      return Em.get(secondPriority, propertyName);
+    } else {
+      return defaultValue;
+    }
+  },
+
+  /**
+   * Get displayType for properties that has not defined value
+   * @param name
+   * @param type
    * @param value
-   * @param predefinedConfig
-   * @param advancedConfig
-   * @returns {String}
+   * @returns {string}
    */
-  parseValue: function(value, predefinedConfig, advancedConfig) {
-    var type = predefinedConfig ? Em.get(predefinedConfig, 'displayType') :
-      advancedConfig && Em.get(advancedConfig, 'valueAttributes.type');
-    switch (type) {
-      case 'int':
-        var res = parseInt(value);
-        return isNaN(res) ? "" : res.toString();
-      case 'float':
-        var res = parseFloat(value);
-        return isNaN(res) ? "" : res.toString();
-      default:
-        return value;
+  getDefaultDisplayType: function(name, type, value) {
+    if (this.isContentProperty(name, type)) {
+      return 'content';
     }
+    return value && !stringUtils.isSingleLine(value) ? 'multiLine' : 'advanced';
   },
 
+  /**
+   * Get the default value of displayName
+   * @param name
+   * @param fileName
+   * @returns {*}
+   */
+  getDefaultDisplayName: function(name, fileName) {
+    return this.isContentProperty(name, fileName, ['-env']) ? this.getConfigTagFromFileName(fileName) + ' template' : name
+  },
 
-  tweakConfigVisibility: function (config, allSiteConfigs) {
-    var kdcType = allSiteConfigs['kdc_type'];
-    if (kdcType === 'active-directory' && ['container_dn', 'ldap_url'].contains(Em.get(config, 'name'))) {
-      Em.set(config, 'isVisible', true);
-    }
+  /**
+   * Get category for properties that has not defined value
+   * @param stackConfigProperty
+   * @param fileName
+   * @returns {string}
+   */
+  getDefaultCategory: function(stackConfigProperty, fileName) {
+    return (stackConfigProperty ? 'Advanced ' : 'Custom ') + this.getConfigTagFromFileName(fileName);
   },
 
-  setValueByDisplayType: function (serviceConfigObj) {
-    if (serviceConfigObj.get('displayType') == 'directories' && (serviceConfigObj.get('category') == 'DataNode' || serviceConfigObj.get('category') == 'NameNode')) {
-      var dirs = serviceConfigObj.get('value').split(',').sort();
-      serviceConfigObj.set('value', dirs.join(','));
-      serviceConfigObj.set('savedValue', dirs.join(','));
-    }
+  /**
+   * Get isSecureConfig for properties that has not defined value
+   * @param propertyName
+   * @returns {boolean}
+   */
+  getIsSecure: function(propertyName) {
+    return this.get('secureConfigs').mapProperty('name').contains(propertyName);
+  },
 
-    if (serviceConfigObj.get('displayType') == 'directory' && serviceConfigObj.get('category') == 'SNameNode') {
-      var dirs = serviceConfigObj.get('value').split(',').sort();
-      serviceConfigObj.set('value', dirs[0]);
-      serviceConfigObj.set('savedValue', dirs[0]);
-    }
+  /**
+   * Calculate isEditable rely on controller state selected group and config restriction
+   * @param {Object} serviceConfigProperty
+   * @param {Object} selectedConfigGroup
+   * @param {boolean} canEdit
+   * @returns {boolean}
+   */
+  getIsEditable: function(serviceConfigProperty, selectedConfigGroup, canEdit) {
+    return canEdit && Em.get(selectedConfigGroup, 'isDefault') && Em.get(serviceConfigProperty, 'isReconfigurable')
+  },
 
-    if (serviceConfigObj.get('displayType') == 'masterHosts') {
-      if (typeof(serviceConfigObj.get('value')) == 'string') {
-        var value = serviceConfigObj.get('value').replace(/\[|]|'|&apos;/g, "").split(',');
-        serviceConfigObj.set('value', value);
-        serviceConfigObj.set('savedValue', value);
-      }
+  /**
+   *
+   * @param name
+   * @param fileName
+   */
+  getDefaultIsShowLabel: function(name, fileName) {
+    return !this.isContentProperty(name, fileName) || this.isContentProperty(name, fileName, ['-env']);
+  },
+
+  /**
+   * format property value depending on displayType
+   * and one exception for 'kdc_type'
+   * @param serviceConfigProperty
+   * @param [originalValue]
+   * @returns {*}
+   */
+  formatPropertyValue: function(serviceConfigProperty, originalValue) {
+    var value = originalValue || Em.get(serviceConfigProperty, 'value'),
+        displayType = Em.get(serviceConfigProperty, 'displayType') || Em.get(serviceConfigProperty, 'valueAttributes.type'),
+        category = Em.get(serviceConfigProperty, 'category');
+    switch (displayType) {
+      case 'directories':
+        if (['DataNode', 'NameNode'].contains(category)) {
+          return value.split(',').sort().join(',');//TODO check if this code is used
+        }
+        break;
+      case 'directory':
+        if (['SNameNode'].contains(category)) {
+          return value.split(',').sort()[0];//TODO check if this code is used
+        }
+        break;
+      case 'masterHosts':
+        if (typeof(value) == 'string') {
+          return value.replace(/\[|]|'|&apos;/g, "").split(',');
+        }
+        break;
+      case 'int':
+        if (/\d+m$/.test(value) ) {
+          return value.slice(0, value.length - 1);
+        } else {
+          var int = parseInt(value);
+          return isNaN(int) ? "" : int.toString();
+        }
+        break;
+      case 'float':
+        var float = parseFloat(value);
+        return isNaN(float) ? "" : float.toString();
+    }
+    if (Em.get(serviceConfigProperty, 'name') === 'kdc_type') {
+      return App.router.get('mainAdminKerberosController.kdcTypesValues')[value];
     }
+    return value;
   },
 
   /**
-   * @param serviceConfigObj : Object
-   * @param configsPropertyDef : Object
+   * defines if property with <code>name<code> and <code>fileName<code>
+   * are special content property. By default result will be true if property name is 'content'
+   * and tag ends on '-env' or '-log4j', but some other tag endings can be passed in <code>tagEnds<code>
+   * @param {string} name
+   * @param {string} fileName
+   * @param {string[]} [tagEnds]
+   * @returns {boolean}
    */
-  setServiceConfigUiAttributes: function (serviceConfigObj, configsPropertyDef) {
-    serviceConfigObj.setProperties({
-      'displayType': Em.get(configsPropertyDef, 'displayType'),
-      'isRequired': (Em.get(configsPropertyDef, 'isRequired') !== undefined) ? Em.get(configsPropertyDef, 'isRequired') : true,
-      'isRequiredByAgent': (Em.get(configsPropertyDef, 'isRequiredByAgent') !== undefined) ? Em.get(configsPropertyDef, 'isRequiredByAgent') : true,
-      'isReconfigurable': (Em.get(configsPropertyDef, 'isReconfigurable') !== undefined) ? Em.get(configsPropertyDef, 'isReconfigurable') : true,
-      'isVisible': (Em.get(configsPropertyDef, 'isVisible') !== undefined) ? Em.get(configsPropertyDef, 'isVisible') : true,
-      'unit': Em.get(configsPropertyDef, 'unit'),
-      'description': Em.get(configsPropertyDef, 'description'),
-      'isOverridable': Em.get(configsPropertyDef, 'isOverridable') === undefined ? true : Em.get(configsPropertyDef, 'isOverridable'),
-      'serviceName': configsPropertyDef ? Em.get(configsPropertyDef, 'serviceName') : serviceConfigObj.get('serviceName'),
-      'index': Em.get(configsPropertyDef, 'index'),
-      'isSecureConfig': Em.get(configsPropertyDef, 'isSecureConfig') === undefined ? false : Em.get(configsPropertyDef, 'isSecureConfig'),
-      'belongsToService': Em.get(configsPropertyDef, 'belongsToService'),
-      'category': Em.get(configsPropertyDef, 'category'),
-      'showLabel': Em.get(configsPropertyDef, 'showLabel') !== false,
-      'dependentConfigPattern': Em.get(configsPropertyDef, 'dependentConfigPattern')
-    });
+  isContentProperty: function(name, fileName, tagEnds) {
+    if (tagEnds && tagEnds.length) {
+      //tagEnds = tagEnds || ['-env', '-log4j'];
+      var  type = this.getConfigTagFromFileName(fileName);
+      return name == 'content' && tagEnds.some(function(tagEnd) { return type.endsWith(tagEnd)});
+    } else {
+      return name == 'content';
+    }
   },
 
   /**
-   * synchronize order of config properties with order, that on UI side
    *
-   * @method syncOrderWithPredefined
-   * @param {Object[]} siteConfigs
-   * @return {Object[]}
+   * @param configs
+   * @returns {Object[]}
    */
-  syncOrderWithPredefined: function (siteConfigs) {
-    var siteStart = [];
-    var preDefinedSiteProperties = this.get('preDefinedSiteProperties').mapProperty('name');
-    var contentProperties = this.createContentProperties(siteConfigs).mapProperty('name');
-    var siteProperties = preDefinedSiteProperties.concat(contentProperties);
-    siteProperties.forEach(function (name) {
-      var _site = siteConfigs.filterProperty('name', name);
-      if (_site.length == 1) {
-        siteStart.push(_site[0]);
-        siteConfigs = siteConfigs.without(_site[0]);
-      } else if (_site.length > 1) {
-        _site.forEach(function (site) {
-          siteStart.push(site);
-          siteConfigs = siteConfigs.without(site);
-        }, this);
-      }
-    }, this);
-
-    return siteStart.concat(siteConfigs.sortProperty('name'))
+  sortConfigs: function(configs) {
+    return configs.sort(function(a, b) {
+      return Em.get(a, 'index') == Em.get(b, 'index') ? Em.get(a, 'name') > Em.get(b, 'name') : Em.get(a, 'index') > Em.get(b, 'index');
+    });
   },
 
   /**
    * merge stored configs with pre-defined
-   * @param storedConfigs
-   * @param advancedConfigs
-   * @param selectedServiceNames
    * @return {Array}
    */
-  mergePreDefinedWithStored: function (storedConfigs, advancedConfigs, selectedServiceNames) {
+  mergePreDefinedWithStack: function (selectedServiceNames) {
     var mergedConfigs = [];
-    var contentProperties = advancedConfigs ? this.createContentProperties(advancedConfigs) : [];
-    var preDefinedConfigs = this.get('preDefinedSiteProperties').concat(contentProperties);
-    var self = this;
-    storedConfigs = (storedConfigs) ? storedConfigs : [];
 
-    var preDefinedNames = preDefinedConfigs.mapProperty('name');
-    var storedNames = storedConfigs.mapProperty('name');
-    var names = preDefinedNames.concat(storedNames).uniq();
     var configTypes = App.StackService.find().filter(function(service) {
       return selectedServiceNames.contains(service.get('serviceName'));
     }).map(function(item) {
       return Em.keys(item.get('configTypes'));
-    }).reduce(function(p,c) { return p.concat(c); })
-    .uniq().compact().filter(function(configType) { return !!configType; });
-
-    names.forEach(function (name) {
-      var storedCfgs = storedConfigs.filterProperty('name', name);
-      var preDefinedCfgs = [];
-      var preDefinedConfig = preDefinedConfigs.filterProperty('name', name);
-      preDefinedConfig.forEach(function (_preDefinedConfig) {
-        if (selectedServiceNames.contains(_preDefinedConfig.serviceName) || _preDefinedConfig.serviceName === 'MISC') {
-          if (_preDefinedConfig.serviceName != 'MISC' && _preDefinedConfig.filename && !configTypes.contains(self.getConfigTagFromFileName(_preDefinedConfig.filename))) {
-            return;
-          }
-          preDefinedCfgs.push($.extend(true, {}, _preDefinedConfig));
-        }
-      }, this);
+    }).reduce(function(p,c) { return p.concat(c); }).concat(['cluster-env', 'alert_notification'])
+      .uniq().compact().filter(function(configType) { return !!configType; });
 
-      var configData = {};
-      var isAdvanced = advancedConfigs && advancedConfigs.someProperty('name', name);
-      if (storedCfgs.length <= 1 && preDefinedCfgs.length <= 1) {
-        var stored = storedCfgs[0];
-        var preDefined = preDefinedCfgs[0];
-
-        if (preDefined && stored) {
-          configData = preDefined;
-          configData.value = stored.value;
-          configData.savedValue = stored.savedValue;
-          configData.recommendedValue = stored.recommendedValue;
-          configData.overrides = stored.overrides;
-          configData.displayName = stored.displayName;
-          configData.name = stored.name;
-          configData.filename = stored.filename;
-          configData.description = stored.description;
-          configData.isVisible = stored.isVisible;
-          configData.isFinal = stored.isFinal;
-          configData.supportsFinal = stored.supportsFinal;
-          configData.isRequired = (configData.isRequired !== undefined) ? configData.isRequired : true;
-          configData.isRequiredByAgent = (configData.isRequiredByAgent !== undefined) ? configData.isRequiredByAgent : true;
-          configData.showLabel = !!stored.showLabel;
-        }
-        else if (!preDefined && stored) {
-          configData = this.addUserProperty(stored, isAdvanced, advancedConfigs);
-        }
-        else if (preDefined && !stored) {
-          configData = preDefined;
-          // skip property if predefined config doesn't exist or ignored in stack property definition for current stack.
-          // if `isRequiredByAgent` is set to `false` then this property used by UI only to display properties like
-          // host names or some misc properties that won't be persisted.
-          var isPresentInConfigApi = advancedConfigs && advancedConfigs.filterProperty('filename', preDefined.filename).someProperty('name', name);
-          if (Em.get(preDefined, 'isRequiredByAgent') !== false && !isPresentInConfigApi &&
-              Em.get(preDefined, 'filename') != 'alert_notification' &&
-              ![
-                'hive_hostname',
-                'oozie_hostname',
-                'hive_existing_oracle_host',
-                'hive_existing_postgresql_host',
-                'hive_existing_mysql_host',
-                'hive_existing_mssql_server_host',
-                'hive_existing_mssql_server_2_host',
-                'oozie_existing_oracle_host',
-                'oozie_existing_postgresql_host',
-                'oozie_existing_mysql_host',
-                'oozie_existing_mssql_server_host',
-                'oozie_existing_mssql_server_2_host'
-              ].contains(Em.get(preDefined, 'name'))) {
-            return;
-          }
-          configData.isRequiredByAgent = (configData.isRequiredByAgent !== undefined) ? configData.isRequiredByAgent : true;
-          if (isAdvanced) {
-            var advanced = advancedConfigs.filterProperty('filename', configData.filename).findProperty('name', configData.name);
-            this.setPropertyFromStack(configData, advanced);
-          }
+    var predefinedIds = Object.keys(this.get('preDefinedSitePropertiesMap'));
+    var stackIds = App.StackConfigProperty.find().mapProperty('id');
+
+    var configIds = stackIds.concat(predefinedIds).uniq();
+
+    configIds.forEach(function(id) {
+
+      var preDefined = this.get('preDefinedSitePropertiesMap')[id];
+      var advanced = App.StackConfigProperty.find(id);
+
+      var name = preDefined ? preDefined.name : advanced.get('name');
+      var filename = preDefined ? preDefined.filename : advanced.get('filename');
+      if (configTypes.contains(this.getConfigTagFromFileName(filename))) {
+        var configData = this.createDefaultConfig(name, filename, true, preDefined || {});
+
+        configData = this.mergeStaticProperties(configData, advanced.get('id') ? advanced : null, null, ['name', 'filename']);
+
+        if (['directory' ,'directories'].contains(configData.displayType)) {
+          configData.value = configData.recommendedValue || configData.defaultDirectory || '';
         }
 
         mergedConfigs.push(configData);
-      } else {
-        preDefinedCfgs.forEach(function (cfg) {
-          configData = cfg;
-          configData.isRequiredByAgent = (configData.isRequiredByAgent !== undefined) ? configData.isRequiredByAgent : true;
-          var storedCfg = storedCfgs.findProperty('filename', cfg.filename);
-          if (storedCfg) {
-            configData.value = storedCfg.value;
-            configData.recommendedValue = storedCfg.recommendedValue;
-            configData.savedValue = storedCfg.savedValue;
-            configData.overrides = storedCfg.overrides;
-            configData.filename = storedCfg.filename;
-            configData.description = storedCfg.description;
-            configData.isFinal = storedCfg.isFinal;
-            configData.supportsFinal = storedCfg.supportsFinal;
-            configData.showLabel = !!storedCfg.showLabel;
-            configData.displayName = storedCfg.displayName;
-          } else if (isAdvanced) {
-            advanced = advancedConfigs.filterProperty('filename', configData.filename).findProperty('name', configData.name);
-            this.setPropertyFromStack(configData, advanced);
-          }
-          mergedConfigs.push(configData);
-        }, this);
       }
+
     }, this);
     return mergedConfigs;
   },
 
-  /**
-   *
-   * @param configData {Object} Configs that will be bound to the view on step-7 of installer wizard
-   * @param advanced {Object} Config property loaded from Server side stack definition
-   */
-  setPropertyFromStack: function (configData, advanced) {
-
-    // Password fields should be made blank by default in installer wizard
-    // irrespective of whatever value is sent from stack definition.
-    // This forces the user to fill the password field.
-    if (configData.displayType == 'password') {
-      configData.value = '';
-    } else {
-      configData.value = advanced ? advanced.value : configData.value;
-    }
-    configData.recommendedValue = configData.value;
-    configData.filename = advanced ? advanced.filename : configData.filename;
-    configData.displayName = advanced && advanced.displayName ? advanced.displayName : configData.displayName;
-    configData.name = advanced && advanced.name ? advanced.name : configData.name;
-    configData.description = advanced ? advanced.description : configData.description;
-    configData.isFinal = !!(advanced && (advanced.isFinal === "true"));
-    configData.supportsFinal = !!(advanced && advanced.supportsFinal);
-  },
-
-  /**
-   * look over advanced configs and add missing configs to serviceConfigs
-   * filter fetched configs by service if passed
-   * @param serviceConfigs
-   * @param advancedConfigs
-   * @param serviceName
-   */
-  addAdvancedConfigs: function (serviceConfigs, advancedConfigs, serviceName) {
-    var miscConfigs = serviceConfigs.filterProperty('serviceName', 'MISC');
-    var configsToVerifying = (serviceName) ? serviceConfigs.filterProperty('serviceName', serviceName).concat(miscConfigs) : serviceConfigs.slice();
-    var definedService = this.get('preDefinedServiceConfigs').findProperty('serviceName', serviceName);
-    if (definedService) {
-      var definedConfigs = (serviceName) ? definedService.get('configs') : [];
-
-      if (definedConfigs.length) {
-        advancedConfigs = advancedConfigs.filter(function (property) {
-          return !(definedConfigs.someProperty('name', property.name) && !serviceConfigs.someProperty('name', property.name));
-        }, this);
-      }
-    }
-    if (advancedConfigs) {
-      advancedConfigs.forEach(function (_config) {
-        var configType = this.getConfigTagFromFileName(_config.filename);
-        var configCategory = _config.category || 'Advanced ' + configType;
-        var categoryMetaData = null;
-        if (_config) {
-          if (!(this.get('configMapping').computed().someProperty('name', _config.name) ||
-            configsToVerifying.filterProperty('name', _config.name).someProperty('filename', _config.filename))) {
-            if (this.get('customFileNames').contains(_config.filename)) {
-              categoryMetaData = this.identifyCategory(_config);
-              if (categoryMetaData != null) {
-                configCategory = categoryMetaData.get('name');
-              }
-            }
-            _config.id = "site property";
-            _config.category = configCategory;
-            _config.displayName = _config.displayName || _config.name;
-            _config.recommendedValue = _config.value;
-            // make all advanced configs optional and populated by default
-            /*
-             * if (/\${.*}/.test(_config.value) || (service.serviceName !==
-             * 'OOZIE' && service.serviceName !== 'HBASE')) { _config.isRequired =
-             * false; _config.value = ''; } else if
-             * (/^\s+$/.test(_config.value)) { _config.isRequired = false; }
-             */
-            _config.isRequired = true;
-            _config.displayType = _config.displayType ? _config.displayType : stringUtils.isSingleLine(_config.value) ? 'advanced' : 'multiLine';
-            serviceConfigs.push(_config);
-          }
-        }
-      }, this);
-    }
-  },
-
   miscConfigVisibleProperty: function (configs, serviceToShow) {
     configs.forEach(function (item) {
       if (item.get('isVisible') && item.belongsToService && item.belongsToService.length) {
@@ -964,204 +729,6 @@ App.config = Em.Object.create({
   },
 
   /**
-   * Fetch cluster configs from server
-   *
-   * @param callback
-   * @return {$.ajax}
-   */
-  loadClusterConfig: function (callback) {
-    return App.ajax.send({
-      name: 'config.cluster',
-      sender: this,
-      data: {
-        stackVersionUrl: App.get('stackVersionURL'),
-        callback: callback
-      },
-      success: 'loadClusterConfigSuccess',
-      error: 'loadClusterConfigError'
-    });
-  },
-
-  loadClusterConfigSuccess: function (data, opt, params) {
-    console.log("TRACE: In success function for the loadClusterConfigSuccess; url is ", opt.url);
-    var properties = [];
-    if (data.items.length) {
-      data.items.forEach(function (item) {
-        item.StackLevelConfigurations.property_type = item.StackLevelConfigurations.property_type || [];
-        item.StackLevelConfigurations.service_name = 'MISC';
-        var property = this.createAdvancedPropertyObject(item.StackLevelConfigurations);
-        if (property) properties.push(property);
-      }, this);
-    }
-    params.callback(properties);
-  },
-
-  loadClusterConfigError: function (request, ajaxOptions, error, opt, params) {
-    console.log('ERROR: Failed to load cluster-env configs');
-    params.callback([]);
-  },
-
-
-  /**
-   * Generate serviceProperties save it to localDB
-   * called from stepController step6WizardController
-   *
-   * @method loadAdvancedConfig
-   * @param serviceName
-   * @param callback
-   * @return {object|null}
-   */
-  loadAdvancedConfig: function (serviceName, callback) {
-    return App.ajax.send({
-      name: 'config.advanced',
-      sender: this,
-      data: {
-        serviceName: serviceName,
-        stackVersionUrl: App.get('stackVersionURL'),
-        stackVersion: App.get('currentStackVersionNumber'),
-        callback: callback
-      },
-      success: 'loadAdvancedConfigSuccess',
-      error: 'loadAdvancedConfigError'
-    });
-  },
-
-  /**
-   * Generate serviceProperties save it to localDB
-   * called from stepController step6WizardController
-   *
-   * @method loadAdvancedConfig
-   * @param {Array} serviceNames
-   * @param callback
-   * @return {object|null}
-   */
-  loadAdvancedConfigAll: function (serviceNames, callback) {
-    return App.ajax.send({
-      name: 'config.advanced.multiple.services',
-      sender: this,
-      data: {
-        serviceNames: serviceNames.join(','),
-        stackVersionUrl: App.get('stackVersionURL'),
-        stackVersion: App.get('currentStackVersionNumber'),
-        callback: callback
-      },
-      success: 'loadAdvancedConfigAllSuccess',
-      error: 'loadAdvancedConfigAllError'
-    });
-  },
-
-  loadAdvancedConfigAllSuccess: function (data, opt, params, request) {
-    console.log("TRACE: In success function for the loadAdvancedConfig; url is ", opt.url);
-    var serviceConfigMap = {};
-    if (data.items.length) {
-      data.items.forEach(function (service) {
-        var properties = [];
-        service.configurations.forEach(function(item){
-          properties.push(this.createAdvancedPropertyObject(item.StackConfigurations));
-        }, this);
-        serviceConfigMap[service.StackServices.service_name] = properties;
-      }, this);
-    }
-    params.callback(serviceConfigMap, request);
-  },
-
-  loadAdvancedConfigAllError: function (request, ajaxOptions, error, opt, params) {
-    console.log('ERROR: failed to load stack configs for', params.serviceNames);
-    params.callback([], request);
-  },
-
-  /**
-   * Load advanced configs by service names etc.
-   * Use this method when you need to get configs for
-   * particular services by single request
-   *
-   * @method loadAdvancedConfigPartial
-   * @param {String[]} serviceNames
-   * @param {Object} opt
-   * @param {Function} callback
-   * @returns {$.ajax}
-   */
-  loadAdvancedConfigPartial: function (serviceNames, opt, callback) {
-    var data = {
-      serviceList: serviceNames.join(','),
-      stackVersionUrl: App.get('stackVersionURL'),
-      stackVersion: App.get('currentStackVersionNumber'),
-      queryFilter: ('&' + opt.queryFilter) || '',
-      callback: callback
-    };
-    return App.ajax.send({
-      name: 'config.advanced.partial',
-      sender: this,
-      data: data,
-      success: 'loadAdvancedConfigPartialSuccess',
-      error: 'loadAdvancedConfigError'
-    });
-  },
-
-  loadAdvancedConfigSuccess: function (data, opt, params, request) {
-    console.log("TRACE: In success function for the loadAdvancedConfig; url is ", opt.url);
-    var properties = [];
-    if (data.items.length) {
-      data.items.forEach(function (item) {
-        var property = this.createAdvancedPropertyObject(item.StackConfigurations);
-        if (property) properties.push(property);
-      }, this);
-    }
-    params.callback(properties, request);
-  },
-
-  loadAdvancedConfigError: function (request, ajaxOptions, error, opt, params) {
-    console.log('ERROR: failed to load stack configs for', params.serviceName);
-    params.callback([], request);
-  },
-
-  loadAdvancedConfigPartialSuccess: function (data, opt, params, request) {
-    var properties = [];
-    if (data.items.length && data.items.mapProperty('configurations').length) {
-      var configurations = data.items.mapProperty('configurations').reduce(function (p, c) {
-        return p.concat(c);
-      });
-      configurations.forEach(function (item) {
-        var property = this.createAdvancedPropertyObject(item.StackConfigurations);
-        if (property) properties.push(property);
-      }, this);
-    }
-    params.callback(properties, request);
-  },
-
-  /**
-   * Bootstrap configuration property object according to
-   * format that we using in our application.
-   *
-   * @method createAdvancedPropertyObject
-   * @param {Object} item
-   * @returns {Object|Boolean}
-   */
-  createAdvancedPropertyObject: function (item) {
-    var serviceName = item.service_name;
-    var fileName = item.type;
-    /**
-     * Properties from mapred-queue-acls.xml are ignored
-     * Properties from capacity-scheduler.xml are ignored unless HDP stack version is 2.x or
-     * HDP stack version is 1.x
-     */
-    if (fileName == 'mapred-queue-acls.xml') return false;
-    item.isVisible = fileName != 'cluster-env.xml';
-    var property = {
-      serviceName: serviceName,
-      name: item.property_name,
-      value: item.property_value,
-      description: item.property_description,
-      isVisible: item.isVisible,
-      isFinal: item.final === "true",
-      recommendedIsFinal: item.final === "true",
-      filename: item.filename || fileName
-    };
-
-    return $.extend(property, this.advancedConfigIdentityData(item));
-  },
-
-  /**
    * Add additional properties to advanced property config object.
    * Additional logic based on `property_type`.
    *
@@ -1192,7 +759,9 @@ App.config = Em.Object.create({
         propertyData.isReconfigurable = false;
         propertyData.displayName = nameToDisplayNameMap[config.property_name] || App.format.normalizeName(config.property_name);
         propertyData.displayType = checkboxProperties.contains(config.property_name) ? 'checkbox' : 'user';
-        if (config.service_name && !config.property_type.contains('ADDITIONAL_USER_PROPERTY')) {
+        if (config.property_type.contains('ADDITIONAL_USER_PROPERTY')) {
+          propertyData.index = 999;//it means these configs should be shown last (if somehow we will have more that 1000 configs in tab - it wouldn't work)
+        } else if (config.service_name) {
           var propertyIndex = config.service_name == 'MISC' ? 30 : App.StackService.find().mapProperty('serviceName').indexOf(config.service_name);
           propertyData.belongsToService = [config.service_name];
           propertyData.index = propertyIndex;
@@ -1514,11 +1083,6 @@ App.config = Em.Object.create({
     return configData;
   },
 
-  getOriginalConfigAttribute: function (stored, key, advancedConfigs) {
-    return advancedConfigs.findProperty('name', stored.name) ?
-      advancedConfigs.findProperty('name', stored.name)[key] : stored[key];
-  },
-
   complexConfigsTemplate: [
     {
       "id": "site property",
@@ -1727,6 +1291,22 @@ App.config = Em.Object.create({
   },
 
   /**
+   * load cluster stack configs from server and run mapper
+   * @returns {$.ajax}
+   * @method loadConfigsFromStack
+   */
+  loadClusterConfigsFromStack: function () {
+    return App.ajax.send({
+      name: 'configs.stack_configs.load.cluster_configs',
+      sender: this,
+      data: {
+        stackVersionUrl: App.get('stackVersionURL')
+      },
+      success: 'saveConfigsToModel'
+    });
+  },
+
+  /**
    * load stack configs from server and run mapper
    * @param {String[]} [serviceNames=null]
    * @returns {$.ajax}
@@ -1773,7 +1353,39 @@ App.config = Em.Object.create({
       return !!matchingConfigType;
     }
   },
+  /**
+   * @param {App.ServiceConfigProperty} serviceConfigProperty
+   * @param {Object} override - plain object with properties that is different from parent SCP
+   * @param {App.ServiceConfigGroup} configGroup
+   * @returns {App.ServiceConfigProperty}
+   */
+  createOverride: function(serviceConfigProperty, override, configGroup) {
+    Em.assert('serviceConfigProperty can\' be null', serviceConfigProperty);
+    Em.assert('configGroup can\' be null', configGroup);
 
+    if (Em.isNone(serviceConfigProperty.get('overrides'))) serviceConfigProperty.set('overrides', []);
+
+    var newOverride = App.ServiceConfigProperty.create(serviceConfigProperty);
+    if (!Em.isNone(override)) {
+      for (var key in override) {
+        newOverride.set(key, override[key]);
+      }
+    }
+
+    newOverride.setProperties({
+      'isOriginalSCP': false,
+      'overrides': null,
+      'group': configGroup,
+      'parentSCP': serviceConfigProperty
+    });
+
+    serviceConfigProperty.get('overrides').pushObject(newOverride);
+    serviceConfigProperty.set('overrideValues', serviceConfigProperty.get('overrides').mapProperty('value'));
+    serviceConfigProperty.set('overrideIsFinalValues', serviceConfigProperty.get('overrides').mapProperty('isFinal'));
+
+    newOverride.validate();
+    return newOverride;
+  },
   /**
    * Remove all ranger-related configs, that should be available only if Ranger is installed
    * @param configs - stepConfigs object

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/views/common/configs/services_config.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/services_config.js b/ambari-web/app/views/common/configs/services_config.js
index 77ccff8..1b5a930 100644
--- a/ambari-web/app/views/common/configs/services_config.js
+++ b/ambari-web/app/views/common/configs/services_config.js
@@ -23,7 +23,9 @@ App.ServicesConfigView = Em.View.extend({
   templateName: require('templates/common/configs/services_config'),
 
   didInsertElement: function () {
-    this.get('controller').loadStep();
+    Em.run.next(this, function() {
+      this.get('controller') && this.get('controller').loadStep();
+    });
   }
 
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/views/common/controls_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/controls_view.js b/ambari-web/app/views/common/controls_view.js
index 0ca78b0..f3782b4 100644
--- a/ambari-web/app/views/common/controls_view.js
+++ b/ambari-web/app/views/common/controls_view.js
@@ -93,7 +93,7 @@ App.SupportsDependentConfigs = Ember.Mixin.create({
       var saveRecommended = (this.get('config.value') === this.get('config.recommendedValue'));
       var controller = this.get('controller');
       var type = App.config.getConfigTagFromFileName(config.get('filename'));
-      var p = App.StackConfigProperty.find(name + '_' + type);
+      var p = App.StackConfigProperty.find(App.config.configId(name, type));
       if (p && p.get('propertyDependedBy.length') > 0) {
         return controller.getRecommendationsForDependencies([{
           "type": type,

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/views/common/modal_popups/select_groups_popup.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/modal_popups/select_groups_popup.js b/ambari-web/app/views/common/modal_popups/select_groups_popup.js
index 7b5a280..c2632c4 100644
--- a/ambari-web/app/views/common/modal_popups/select_groups_popup.js
+++ b/ambari-web/app/views/common/modal_popups/select_groups_popup.js
@@ -89,11 +89,11 @@ App.showSelectGroupsPopup = function (selectedServiceName, selectedConfigGroup,
                   selectedGroupOverride.set('recommendedValue', recommendedValue);
                   selectedGroupOverride.set('value', recommendedValue);
                 } else {
-                  App.get('router.mainServiceInfoConfigsController').addOverrideProperty(cp, configGroup, recommendedValue);
+                  App.config.createOverride(cp, {"value": recommendedValue, "recommendedValue": recommendedValue,"isEditable": true}, configGroup);
                 }
               }
             } else {
-              App.get('router.mainServiceInfoConfigsController').addOverrideProperty(cp, configGroup, recommendedValue);
+              App.config.createOverride(cp, {"value": recommendedValue, "recommendedValue": recommendedValue,"isEditable": true}, configGroup);
             }
           }, this)
         }
@@ -104,4 +104,4 @@ App.showSelectGroupsPopup = function (selectedServiceName, selectedConfigGroup,
       this.get('selectedConfigGroup').set('dependentConfigGroups', this.get('selectedGroups'));
     }
   });
-};
\ No newline at end of file
+};

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/views/main/admin/serviceAccounts_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin/serviceAccounts_view.js b/ambari-web/app/views/main/admin/serviceAccounts_view.js
index 5ff90fd..904f2e3 100644
--- a/ambari-web/app/views/main/admin/serviceAccounts_view.js
+++ b/ambari-web/app/views/main/admin/serviceAccounts_view.js
@@ -21,6 +21,9 @@ var App = require('app');
 App.MainAdminServiceAccountsView = Em.View.extend({
   templateName: require('templates/main/admin/serviceAccounts'),
   didInsertElement: function() {
-    this.get('controller').loadUsers();
+    var self = this;
+    App.router.get('mainController').isLoading.call(App.router.get('clusterController'), 'isConfigsPropertiesLoaded').done(function () {
+      self.get('controller').loadUsers();
+    });
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/test/controllers/main/service/info/config_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/info/config_test.js b/ambari-web/test/controllers/main/service/info/config_test.js
index 6c7c273..f2198e0 100644
--- a/ambari-web/test/controllers/main/service/info/config_test.js
+++ b/ambari-web/test/controllers/main/service/info/config_test.js
@@ -188,31 +188,6 @@ describe("App.MainServiceInfoConfigsController", function () {
     });
   });
 
-  describe("#addOverrideProperty", function () {
-    var serviceConfigProperty = Em.Object.create({
-      overrides: [],
-      isOriginalSCP: true
-    });
-
-    var group = {};
-    var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty);
-    newSCP.set('value', '1');
-    newSCP.set('isOriginalSCP', false);
-    newSCP.set('parentSCP', serviceConfigProperty);
-    newSCP.set('isEditable', true);
-    newSCP.set('group', group);
-
-
-    it("add new overridden property", function () {
-      mainServiceInfoConfigsController.addOverrideProperty(serviceConfigProperty, group, '1');
-      expect(serviceConfigProperty.get("overrides")[0].get('name')).to.equal(newSCP.get('name'));
-      expect(serviceConfigProperty.get("overrides")[0].get('isOriginalSCP')).to.be.false;
-      expect(serviceConfigProperty.get("overrides")[0].get('isEditable')).to.be.true;
-      expect(serviceConfigProperty.get("overrides")[0].get('group')).to.eql({});
-      expect(serviceConfigProperty.get("overrides")[0].get('parentSCP')).to.eql(serviceConfigProperty);
-    });
-  });
-
   describe("#showComponentsShouldBeRestarted", function () {
 
     var tests = [
@@ -738,20 +713,20 @@ describe("App.MainServiceInfoConfigsController", function () {
       }];
 
     beforeEach(function() {
-      sinon.stub(mainServiceInfoConfigsController,"addOverrideProperty", Em.K)
+      sinon.stub(App.config,"createOverride", Em.K)
     });
     afterEach(function() {
-      mainServiceInfoConfigsController.addOverrideProperty.restore();
+      App.config.createOverride.restore();
     });
     tests.forEach(function(t) {
       it(t.m, function() {
         mainServiceInfoConfigsController.set("overrideToAdd", t.overrideToAdd);
         mainServiceInfoConfigsController.checkOverrideProperty(t.componentConfig);
         if(t.add) {
-          expect(mainServiceInfoConfigsController.addOverrideProperty.calledWith(t.overrideToAdd)).to.equal(true);
+          expect(App.config.createOverride.calledWith(t.overrideToAdd)).to.equal(true);
           expect(mainServiceInfoConfigsController.get("overrideToAdd")).to.equal(null);
         } else {
-          expect(mainServiceInfoConfigsController.addOverrideProperty.calledOnce).to.equal(false);
+          expect(App.config.createOverride.calledOnce).to.equal(false);
         }
       });
     });
@@ -767,43 +742,6 @@ describe("App.MainServiceInfoConfigsController", function () {
     });
   });
 
-  describe("#createNewSCP", function() {
-    var tests = [
-      {
-        overrides: {
-          value: "value",
-          group: {
-            value: "group1"
-          }
-        },
-        serviceConfigProperty: Em.Object.create({
-          value: "parentSCP",
-          supportsFinal: true
-        }),
-        defaultGroupSelected: true,
-
-        newSCP: {
-          value: "value",
-          isOriginalSCP: false,
-          parentSCP:Em.Object.create({
-            value: "parentSCP",
-            supportsFinal: true
-          }),
-          group: {
-            value: "group1"
-          },
-          isEditable: false
-        }
-      }
-    ];
-    tests.forEach(function(t) {
-      it("", function() {
-        var newSCP = mainServiceInfoConfigsController.createNewSCP(t.overrides, t.serviceConfigProperty, t.defaultGroupSelected);
-        expect(newSCP.getProperties("value", "isOriginalSCP", "parentSCP", "group", "isEditable")).to.eql(t.newSCP);
-      });
-    });
-  });
-
   describe("#setCompareDefaultGroupConfig", function() {
     beforeEach(function() {
       sinon.stub(mainServiceInfoConfigsController, "getComparisonConfig").returns("compConfig");
@@ -1135,29 +1073,6 @@ describe("App.MainServiceInfoConfigsController", function () {
 
   });
 
-  describe('#mergeWithStackProperties', function () {
-
-    it('should set recommended value', function () {
-      mainServiceInfoConfigsController.reopen({
-        advancedConfigs: [
-          Em.Object.create({
-            name: 'n1',
-            value: 'v1'
-          })
-        ]
-      });
-      var configs = [
-        Em.Object.create({
-          name: 'n1',
-          recommendedValue: null
-        })
-      ];
-      configs = mainServiceInfoConfigsController.mergeWithStackProperties(configs);
-      expect(configs.findProperty('name', 'n1').get('recommendedValue')).to.equal('v1');
-    });
-
-  });
-
   describe('#_onLoadComplete', function () {
 
     beforeEach(function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/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 1229a31..80433ab 100644
--- a/ambari-web/test/controllers/wizard/step7_test.js
+++ b/ambari-web/test/controllers/wizard/step7_test.js
@@ -643,29 +643,6 @@ describe('App.InstallerStep7Controller', function () {
     });
   });
 
-  describe('#addOverrideProperty', function () {
-    it('should add override property', function () {
-      var groupName = 'groupName',
-        selectedService = {configGroups: [Em.Object.create({name: groupName, properties: []})]},
-        selectedConfigGroup = {name: groupName},
-        serviceConfigProperty = Em.Object.create({overrides: []}),
-        expected = Em.Object.create({
-          value: '',
-          isOriginalSCP: false,
-          isEditable: true
-        });
-      installerStep7Controller.reopen({selectedService: selectedService, selectedConfigGroup: selectedConfigGroup});
-      var newSCP = installerStep7Controller.addOverrideProperty(serviceConfigProperty);
-      Em.keys(expected).forEach(function (k) {
-        expect(newSCP.get(k)).to.equal(expected.get(k));
-      });
-      var group = installerStep7Controller.get('selectedService.configGroups').findProperty('name', groupName);
-      expect(newSCP.get('group')).to.eql(group);
-      expect(newSCP.get('parentSCP')).to.eql(serviceConfigProperty);
-      expect(group.get('properties.length')).to.equal(1);
-    });
-  });
-
   describe('#resolveYarnConfigs', function () {
     it('should set property to true', function () {
       var allSelectedServiceNames = ['SLIDER', 'YARN'],
@@ -1409,11 +1386,11 @@ describe('App.InstallerStep7Controller', function () {
         wizardController: Em.Object.create({
           getDBProperty: function (k) {
             return this.get(k);
-          }
+          },
+          stackConfigsLoaded: true
         })
       });
-      sinon.stub(App.config, 'mergePreDefinedWithStored', Em.K);
-      sinon.stub(App.config, 'addAdvancedConfigs', Em.K);
+      sinon.stub(App.config, 'mergePreDefinedWithStack', Em.K);
       sinon.stub(App.config, 'fileConfigsIntoTextarea', Em.K);
       sinon.stub(installerStep7Controller, 'clearStep', Em.K);
       sinon.stub(installerStep7Controller, 'getConfigTags', Em.K);
@@ -1427,8 +1404,7 @@ describe('App.InstallerStep7Controller', function () {
       sinon.stub(App.router, 'send', Em.K);
     });
     afterEach(function () {
-      App.config.mergePreDefinedWithStored.restore();
-      App.config.addAdvancedConfigs.restore();
+      App.config.mergePreDefinedWithStack.restore();
       App.config.fileConfigsIntoTextarea.restore();
       installerStep7Controller.clearStep.restore();
       installerStep7Controller.getConfigTags.restore();
@@ -1446,14 +1422,13 @@ describe('App.InstallerStep7Controller', function () {
       expect(installerStep7Controller.clearStep.calledOnce).to.equal(true);
     });
     it('shouldn\'t do nothing if isAdvancedConfigLoaded is false', function () {
-      installerStep7Controller.set('isAdvancedConfigLoaded', false);
+      installerStep7Controller.set('wizardController.stackConfigsLoaded', false);
       installerStep7Controller.loadStep();
       expect(installerStep7Controller.clearStep.called).to.equal(false);
     });
     it('should use App.config to map configs', function () {
       installerStep7Controller.loadStep();
-      expect(App.config.mergePreDefinedWithStored.calledOnce).to.equal(true);
-      expect(App.config.addAdvancedConfigs.calledOnce).to.equal(true);
+      expect(App.config.mergePreDefinedWithStack.calledOnce).to.equal(true);
     });
     it('should call setInstalledServiceConfigs for addServiceController', function () {
       installerStep7Controller.set('wizardController.name', 'addServiceController');

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/test/controllers/wizard_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard_test.js b/ambari-web/test/controllers/wizard_test.js
index 7edd262..c1ec31e 100644
--- a/ambari-web/test/controllers/wizard_test.js
+++ b/ambari-web/test/controllers/wizard_test.js
@@ -92,49 +92,6 @@ describe('App.WizardController', function () {
     });
   });
 
-  describe('#loadAdvancedConfigs', function() {
-    beforeEach(function () {
-      sinon.stub(App.config, 'loadClusterConfig', function(callback){
-        callback();
-      });
-      sinon.stub(App.config, 'loadAdvancedConfigAll', function(val,callback) {
-        var properties = {
-          "s1" : [
-            {
-              supportsFinal: '',
-              filename: 'name'
-            }
-          ]
-        };
-        callback(properties);
-      });
-    });
-    afterEach(function () {
-      App.config.loadClusterConfig.restore();
-      App.config.loadAdvancedConfigAll.restore();
-    });
-    it('Should load configs', function() {
-      var data = Em.Object.create({
-        isAdvancedConfigLoaded: true
-      });
-      var services = Em.A([
-        Em.Object.create({
-          isInstalled: true,
-          serviceName: 's1'
-        })
-      ]);
-      wizardController.set('content.services', services);
-      wizardController.loadAdvancedConfigs(data);
-      var res = JSON.parse(JSON.stringify(wizardController.get('content.advancedServiceConfig')));
-      expect(res).to.be.eql([
-        {
-          "supportsFinal": false,
-          "filename": "name"
-        }
-      ]);
-    });
-  });
-
   describe('#launchBootstrapSuccessCallback', function() {
     it('Save bootstrapRequestId', function() {
       var data = {requestId: 123};