Repository: ambari Updated Branches: refs/heads/trunk 4fbab311d -> ac4d262f4
AMBARI-12372 Utils config small refactor. (ababiichuk) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/ac4d262f Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/ac4d262f Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/ac4d262f Branch: refs/heads/trunk Commit: ac4d262f4a0d15351f1eeaa6abdb8c8c2b8b81db Parents: 4fbab31 Author: aBabiichuk <ababiic...@cybervisiontech.com> Authored: Fri Jul 10 17:44:16 2015 +0300 Committer: aBabiichuk <ababiic...@cybervisiontech.com> Committed: Fri Jul 10 18:19:22 2015 +0300 ---------------------------------------------------------------------- .../main/admin/serviceAccounts_controller.js | 4 +- .../configs/stack_config_properties_mapper.js | 8 +- ambari-web/app/utils/config.js | 321 +++++------------- ambari-web/test/utils/config_test.js | 325 ++++++++++--------- 4 files changed, 254 insertions(+), 404 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/ac4d262f/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..1d72d0c 100644 --- a/ambari-web/app/controllers/main/admin/serviceAccounts_controller.js +++ b/ambari-web/app/controllers/main/admin/serviceAccounts_controller.js @@ -114,8 +114,8 @@ App.MainAdminServiceAccountsController = App.MainServiceInfoConfigsController.ex * @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'); + var configs = App.config.mergePredefinedWithSaved(serverConfigs, advancedConfigs, this.get('selectedService')); + var miscConfigs = configs.filterProperty('serviceName', this.get('selectedService')).filterProperty('category', 'Users and Groups').filterProperty('isVisible', true).rejectProperty('displayType', 'password').rejectProperty('displayType', 'checkbox'); miscConfigs = App.config.miscConfigVisibleProperty(miscConfigs, App.Service.find().mapProperty('serviceName').concat('MISC')); http://git-wip-us.apache.org/repos/asf/ambari/blob/ac4d262f/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 5913943..8315565 100644 --- a/ambari-web/app/mappers/configs/stack_config_properties_mapper.js +++ b/ambari-web/app/mappers/configs/stack_config_properties_mapper.js @@ -83,7 +83,7 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({ console.timeEnd('stackConfigMapper 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 @@ -98,7 +98,11 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({ config.StackConfigurations.property_display_name = uiConfigProperty && uiConfigProperty.displayName ? uiConfigProperty.displayName : config.StackConfigurations.property_name; } config.category = uiConfigProperty ? uiConfigProperty.category : 'Advanced ' + App.config.getConfigTagFromFileName(config.StackConfigurations.type); - config.display_type = uiConfigProperty ? uiConfigProperty.displayType || displayType : displayType; + if (App.config.isContentProperty(config.StackConfigurations.property_name, config.StackConfigurations.type)) { + config.display_type = 'content'; + } else { + config.display_type = uiConfigProperty ? uiConfigProperty.displayType || displayType : displayType; + } }, /** http://git-wip-us.apache.org/repos/asf/ambari/blob/ac4d262f/ambari-web/app/utils/config.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js index 7bb9670..b209526 100644 --- a/ambari-web/app/utils/config.js +++ b/ambari-web/app/utils/config.js @@ -185,24 +185,6 @@ App.config = Em.Object.create({ 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} @@ -290,12 +272,10 @@ App.config = Em.Object.create({ */ mergePredefinedWithSaved: function (configCategories, advancedConfigs, serviceName, selectedConfigGroup, canEdit) { var configs = []; - var contentProperties = this.createContentProperties(advancedConfigs); - var preDefinedConfigs = this.get('preDefinedSiteProperties').concat(contentProperties); 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); @@ -304,17 +284,18 @@ App.config = Em.Object.create({ var properties = siteConfig.properties || {}; for (var index in properties) { - var configsPropertyDef = preDefinedConfigs.filterProperty('name', index).findProperty('filename', filename); + var configsPropertyDef = this.get('preDefinedSiteProperties').filterProperty('name', index).findProperty('filename', filename); var advancedConfig = advancedConfigs.filterProperty('name', index).findProperty('filename', filename); - - var serviceConfigObj = this.mergeStackConfigsWithUI(index, filename, properties[index], finalAttributes[index] === "true", service, advancedConfig, configsPropertyDef); + var template = this.createDefaultConfig(index, filename, properties[index], finalAttributes[index] === "true", serviceName, !!advancedConfig, configsPropertyDef && configsPropertyDef.id === 'puppet var'); + var serviceConfigObj = this.mergeStackConfigsWithUI(template, advancedConfig, configsPropertyDef); if (serviceConfigObj.get('isRequiredByAgent') !== false) { var formattedValue = this.formatPropertyValue(serviceConfigObj); serviceConfigObj.setProperties({ 'value': formattedValue, 'savedValue': formattedValue, - 'isEditable': this.getIsEditable(serviceConfigObj, selectedConfigGroup, canEdit) + 'isEditable': this.getIsEditable(serviceConfigObj, selectedConfigGroup, canEdit), + 'isVisible': serviceName === 'MISC' ? true : serviceConfigObj.get('displayType') !== 'user' }); } @@ -327,18 +308,20 @@ App.config = Em.Object.create({ }, /** - * This method merge properties form <code>stackConfigProperty<code> which are taken from stack - * with <code>UIConfigProperty<code> which are hardcoded on UI - * @param name - * @param fileName - * @param value - * @param isFinal - * @param service - * @param stackConfigProperty - * @param UIConfigProperty + * 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 {string} value + * @param {boolean} isFinal + * @param {string} serviceName + * @param {boolean} definedInStack + * @param {boolean} [isPuppetVar=false]; + * @returns {Object} */ - mergeStackConfigsWithUI: function(name, fileName, value, isFinal, service, stackConfigProperty, UIConfigProperty) { - return Em.Object.create({ + createDefaultConfig: function(name, fileName, value, isFinal, serviceName, definedInStack, isPuppetVar) { + return { /** core properties **/ name: name, filename: fileName, @@ -347,32 +330,48 @@ App.config = Em.Object.create({ isFinal: isFinal, savedIsFinal: isFinal, /** UI and Stack properties **/ - recommendedValue: this.getPropertyIfExists('recommendedValue', null, stackConfigProperty, UIConfigProperty), - recommendedIsFinal: this.getPropertyIfExists('recommendedIsFinal', null, stackConfigProperty, UIConfigProperty), - displayName: this.getPropertyIfExists('displayName', name, stackConfigProperty, UIConfigProperty), - description: this.getPropertyIfExists('description', null, stackConfigProperty, UIConfigProperty), - supportsFinal: this.getPropertyIfExists('supportsFinal', false, stackConfigProperty, UIConfigProperty), - /** properties with calculations **/ - displayType: this.getPropertyIfExists('displayType', this.getDefaultDisplayType(value), UIConfigProperty, stackConfigProperty), - category: this.getPropertyIfExists('category', this.getDefaultCategory(stackConfigProperty, fileName), UIConfigProperty), - isSecureConfig: this.getPropertyIfExists('isSecureConfig', this.getIsSecure(name), UIConfigProperty), - serviceName: this.getPropertyIfExists('serviceName', service ? service.get('serviceName') : 'MISC', stackConfigProperty, UIConfigProperty), - isVisible: this.getPropertyIfExists('isVisible', !!service, UIConfigProperty), - isUserProperty: this.getPropertyIfExists('isUserProperty', !stackConfigProperty, UIConfigProperty), - isRequired: this.getPropertyIfExists('isRequired', !!stackConfigProperty, UIConfigProperty), - /** UI properties **/ - id: this.getPropertyIfExists('id', 'site property', UIConfigProperty), - isRequiredByAgent: this.getPropertyIfExists('isRequiredByAgent', true, UIConfigProperty), - isReconfigurable: this.getPropertyIfExists('isReconfigurable', true, UIConfigProperty), - unit: this.getPropertyIfExists('unit', null, UIConfigProperty), - isOverridable: this.getPropertyIfExists('isOverridable', true, UIConfigProperty), - index: this.getPropertyIfExists('index', null, UIConfigProperty), - showLabel: this.getPropertyIfExists('showLabel', true, UIConfigProperty), - dependentConfigPattern: this.getPropertyIfExists('dependentConfigPattern', null, UIConfigProperty), - options: this.getPropertyIfExists('options', null, UIConfigProperty), - radioName: this.getPropertyIfExists('radioName', null, UIConfigProperty), - belongsToService: this.getPropertyIfExists('belongsToService', [], UIConfigProperty) - }); + recommendedValue: null, + recommendedIsFinal: null, + supportsFinal: false, + serviceName: serviceName, + displayName: this.getDefaultDisplayName(name, fileName), + displayType: this.getDefaultDisplayType(value), + description: null, + category: this.getDefaultCategory(definedInStack, fileName), + isSecureConfig: this.getIsSecure(name), + showLabel: !this.isContentProperty(name, fileName, ['-log4j']), + isVisible: true, + isUserProperty: !definedInStack, + isRequired: definedInStack, + id: isPuppetVar ? 'puppet var' : 'site property', + isRequiredByAgent: true, + isReconfigurable: true, + unit: null, + isOverridable: true, + index: null, + dependentConfigPattern: null, + options: null, + radioName: null, + belongsToService: [] + } + }, + + /** + * This method merge properties form <code>stackConfigProperty<code> which are taken from stack + * with <code>UIConfigProperty<code> which are hardcoded on UI + * @param template + * @param stackConfigProperty + * @param UIConfigProperty + */ + mergeStackConfigsWithUI: function(template, stackConfigProperty, UIConfigProperty) { + var doNotOverride = ['name', 'filename', 'value', 'savedValue', 'isFinal', 'savedIsFinal', 'id']; + var configProperty = Em.Object.create(template); + for (var key in template) { + if (!doNotOverride.contains(key)) { + configProperty.set(key, this.getPropertyIfExists(key, template[key], stackConfigProperty, UIConfigProperty)); + } + } + return configProperty; }, /** @@ -406,6 +405,16 @@ App.config = Em.Object.create({ }, /** + * 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 + }, + + /** * Get category for properties that has not defined value * @param stackConfigProperty * @param fileName @@ -478,184 +487,18 @@ App.config = Em.Object.create({ }, /** - * return: - * configs, - * mappingConfigs - * - * @param configCategories - * @param advancedConfigs - * @param tags - * @param serviceName - * @return {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; - } - } - - 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); - return { - configs: configs, - mappingConfigs: mappingConfigs - } - }, - - /** - * additional parsing when value is int of float - * ex: if value is "0.40" result will be "0.4" - * @param value - * @param predefinedConfig - * @param advancedConfig - * @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; - } - }, - - - 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); - } - }, - - 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(',')); - } - - 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]); - } - - 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 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) { + tagEnds = tagEnds || ['-env', '-log4j']; + var type = this.getConfigTagFromFileName(fileName); + return name == 'content' && tagEnds.some(function(tagEnd) { return type.endsWith(tagEnd)}); }, /** http://git-wip-us.apache.org/repos/asf/ambari/blob/ac4d262f/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 00cb096..970060f 100644 --- a/ambari-web/test/utils/config_test.js +++ b/ambari-web/test/utils/config_test.js @@ -619,74 +619,6 @@ describe('App.config', function () { }); }); - 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 () { @@ -1442,14 +1374,77 @@ describe('App.config', function () { }); describe('#getDefaultDisplayType', function() { - it('returns singleLine displayTyepe', function() { + it('returns singleLine displayType', function() { expect(App.config.getDefaultDisplayType('v1')).to.equal('advanced'); }); - it('returns multiline displayTyepe', function() { + it('returns multiLine displayType', function() { expect(App.config.getDefaultDisplayType('v1\nv2')).to.equal('multiLine'); }); }); + 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']"}); @@ -1545,109 +1540,117 @@ describe('App.config', function () { }); }); - describe('#mergeStackConfigsWithUI', function() { - beforeEach(function() { - sinon.stub(App.config, 'getPropertyIfExists', function(propertyName, defaultValue) {return defaultValue}); - sinon.stub(App.config, 'getDefaultCategory', function(stackConfigProperty, filename) {return 'Advanced ' + filename}); - sinon.stub(App.config, 'getIsSecure', function() {return false}); - sinon.stub(App.config, 'getDefaultDisplayType', function() {return 'string'}); + 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, 'isContentProperty', function() { + return false; + }); }); - afterEach(function() { - App.config.getPropertyIfExists.restore(); + after(function() { + App.config.getDefaultDisplayName.restore(); + App.config.getDefaultDisplayType.restore(); App.config.getDefaultCategory.restore(); App.config.getIsSecure.restore(); - App.config.getDefaultDisplayType.restore(); + App.config.isContentProperty.restore(); }); - var service = Em.Object.create({ serviceName:'sName' }); - var template = { - name: 'pName', - filename: 'pFileName', - value: 'v', - savedValue: 'v', - isFinal: true, - savedIsFinal: true, - recommendedValue: null, - recommendedIsFinal: null, - displayName: 'pName', - description: null, - displayType: 'string', - category: 'Advanced pFileName', - isSecureConfig: false, - serviceName: 'sName', - isVisible: true, - isUserProperty: false, - isRequired: true, - id: 'site property', - supportsFinal: false, - isRequiredByAgent: true, - isReconfigurable: true, - unit: null, - isOverridable: true, - index: null, - showLabel: true, - dependentConfigPattern: null, - options: null, - radioName: null, - belongsToService: [] + + var res = { + name: 'pName', + filename: 'pFileName', + value: 'pValue', + savedValue: 'pValue', + isFinal: true, + savedIsFinal: true, + recommendedValue: null, + recommendedIsFinal: null, + supportsFinal: false, + serviceName: 'pServiceName', + displayName: 'pDisplayName', + displayType: 'pDisplayType', + description: null, + category: 'pCategory', + isSecureConfig: false, + showLabel: true, + isVisible: true, + isUserProperty: false, + isRequired: true, + id: 'site property', + isRequiredByAgent: true, + isReconfigurable: true, + unit: null, + isOverridable: true, + index: null, + dependentConfigPattern: null, + options: null, + radioName: null, + belongsToService: [] }; - it('performs merge UI and Stack properties', function() { - for (var key in template){ - expect(App.config.mergeStackConfigsWithUI('pName', 'pFileName', 'v', true, service, Em.Object.create({}), Em.Object.create({}))[key]).to.eql(template[key]); - } + it('create default config object', function() { + expect(App.config.createDefaultConfig('pName','pFileName','pValue',true,'pServiceName',true, false)).to.eql(res); + }); + it('runs proper methods', function() { + expect(App.config.getDefaultDisplayName.calledWith('pName','pFileName')).to.be.true; + expect(App.config.getDefaultDisplayType.calledWith('pValue')).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.isContentProperty.calledWith('pName', 'pFileName', ['-log4j'])).to.be.true; }); + }); - it('performs merge UI and Stack properties (without stackProperty)', function() { - template.isUserProperty = true; - template.isRequired = false; - for (var key in template){ - expect(App.config.mergeStackConfigsWithUI('pName', 'pFileName', 'v', true, service, null, Em.Object.create({}))[key]).to.eql(template[key]); - } + describe('#mergeStackConfigsWithUI', function() { + beforeEach(function() { + sinon.stub(App.config, 'getPropertyIfExists', function(key, value) {return 'res_' + value}); }); - it('performs merge UI and Stack properties (unknown service)', function () { - template.serviceName = 'MISC'; - template.isUserProperty = false; - template.isRequired = true; - template.isVisible = false; - for (var key in template) { - expect(App.config.mergeStackConfigsWithUI('pName', 'pFileName', 'v', true, null, Em.Object.create({}), Em.Object.create({}))[key]).to.eql(template[key]); - } + afterEach(function() { + App.config.getPropertyIfExists.restore(); }); - it('called getPropertyIfExists couple of times', function () { - App.config.mergeStackConfigsWithUI('pName', 'pFileName', 'v', true, null, Em.Object.create({}), Em.Object.create({})); - expect(App.config.getPropertyIfExists.callCount).to.equal(23); - }); - - it('called getPropertyIfExists with args', function () { - var stackConfigProperty = Em.Object.create({stackProperty: true}); - var UIConfigProperty = Em.Object.create({UIProperty: true}); - App.config.mergeStackConfigsWithUI('pName', 'pFileName', 'v', true, service, stackConfigProperty, UIConfigProperty); - - expect(App.config.getPropertyIfExists.calledWith('recommendedValue', null, stackConfigProperty, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('recommendedIsFinal', null, stackConfigProperty, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('displayName', 'pName', stackConfigProperty, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('description', null, stackConfigProperty, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('supportsFinal', false, stackConfigProperty, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('id', 'site property', UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('isRequiredByAgent', true, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('isReconfigurable', true, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('unit', null, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('isOverridable', true, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('index', null, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('showLabel', true, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('dependentConfigPattern', null, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('options', null, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('belongsToService', [], UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('radioName', null, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('displayType', 'string', UIConfigProperty, stackConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('category', 'Advanced pFileName', UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('isSecureConfig', false, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('serviceName', 'sName', stackConfigProperty, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('isVisible', true, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('isUserProperty', false, UIConfigProperty)).to.be.true; - expect(App.config.getPropertyIfExists.calledWith('isRequired', true, UIConfigProperty)).to.be.true; + var template = { + name: 'pName', + filename: 'pFileName', + value: 'pValue', + savedValue: 'pValue', + isFinal: true, + savedIsFinal: true, + id: 'site property', + + serviceName: 'pServiceName', + displayName: 'pDisplayName', + displayType: 'pDisplayType', + category: 'pCategory' + }; + + var result = { + name: 'pName', + filename: 'pFileName', + value: 'pValue', + savedValue: 'pValue', + isFinal: true, + savedIsFinal: true, + id: 'site property', + + serviceName: 'res_pServiceName', + displayName: 'res_pDisplayName', + displayType: 'res_pDisplayType', + category: 'res_pCategory' + }; + + it('called generate property object', function () { + expect(App.config.mergeStackConfigsWithUI(template, {}, {})).to.eql(Em.Object.create(result)); }); });