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(/\[|]|'|'/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(/\[|]|'|'/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};