Repository: ambari Updated Branches: refs/heads/trunk 55bfe3aba -> fbc69dce3
AMBARI-10324 Add-service wizard should use enhanced configs when appropriate. (ababiichuk) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/fbc69dce Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/fbc69dce Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/fbc69dce Branch: refs/heads/trunk Commit: fbc69dce33cb0afa9598011d89690f2fabbb66db Parents: 55bfe3a Author: aBabiichuk <[email protected]> Authored: Thu Apr 2 12:24:04 2015 +0300 Committer: aBabiichuk <[email protected]> Committed: Thu Apr 2 12:24:04 2015 +0300 ---------------------------------------------------------------------- .../global/configuration_controller.js | 1 - .../controllers/main/service/info/configs.js | 275 ++++++++++++------- .../service/manage_config_groups_controller.js | 1 - .../app/controllers/wizard/step7_controller.js | 2 +- .../configs/stack_config_properties_mapper.js | 23 +- .../mixins/common/configs/enhanced_configs.js | 254 ++--------------- .../service/configs/preload_requests_chain.js | 73 ++--- .../app/models/configs/stack_config_property.js | 51 +++- .../common/configs/services_config.hbs | 5 + ambari-web/app/utils/ajax/ajax.js | 5 +- ambari-web/app/utils/config.js | 168 +++++------ ambari-web/app/views/common/controls_view.js | 2 +- .../common/configs/enhanced_configs_test.js | 20 -- ambari-web/test/utils/config_test.js | 39 --- 14 files changed, 365 insertions(+), 554 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/controllers/global/configuration_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/global/configuration_controller.js b/ambari-web/app/controllers/global/configuration_controller.js index 9270fac..1f5675f 100644 --- a/ambari-web/app/controllers/global/configuration_controller.js +++ b/ambari-web/app/controllers/global/configuration_controller.js @@ -107,7 +107,6 @@ App.ConfigurationController = Em.Controller.extend({ App.config.loadConfigsByTags(tags).done(function (data) { if (data.items) { data.items.forEach(function (item) { - App.config.loadedConfigurationsCache[item.type + "_" + item.tag] = item.properties; loadedConfigs.push(item); }); } http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/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 185fb48..f9729e5 100644 --- a/ambari-web/app/controllers/main/service/info/configs.js +++ b/ambari-web/app/controllers/main/service/info/configs.js @@ -42,11 +42,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM selectedConfigGroup: null, - configTypesInfo: { - items: [], - supportsFinal: [] - }, - requestInProgress: null, selectedServiceConfigTypes: [], @@ -108,6 +103,32 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM clusterEnvTagVersion: '', /** + * defines which service configs need to be loaded to stepConfigs + * @type {string[]} + */ + servicesToLoad: function() { + return this.get('dependentServiceNames').concat([this.get('content.serviceName')]).uniq(); + }.property('content.serviceName', 'dependentServiceNames'), + + /** + * defines which config groups need to be loaded + * @type {object[]} + */ + configGroupsToLoad: function() { + return this.get('configGroups').concat(this.get('dependentConfigGroups')).uniq(); + }.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'), + + /** * @type {boolean} */ isCurrentSelected: function () { @@ -322,15 +343,12 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM */ loadStep: function () { console.log("TRACE: Loading configure for service"); - var self = this; + var serviceName = this.get('content.serviceName'); this.clearStep(); if (App.get('supports.enhancedConfigs')) { - this.loadConfigTheme(this.get('content.serviceName')).always(function() { - self.setDependentServices(self.get('content.serviceName')); - App.themesMapper.generateAdvancedTabs([self.get('content.serviceName')]); - if (self.get('dependentServiceNames.length') > 0) { - self.loadConfigCurrentVersions(self.get('dependentServiceNames')); - } + this.setDependentServices(serviceName); + this.loadConfigTheme(serviceName).always(function() { + App.themesMapper.generateAdvancedTabs([serviceName]); }); } this.loadClusterEnvSite(); @@ -369,7 +387,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM var selectedConfigGroup = this.get('selectedConfigGroup'); var serviceName = this.get('content.serviceName'); //STEP 1: handle tags from JSON data for host overrides - var configGroupsWithOverrides = selectedConfigGroup.get('isDefault') && !this.get('isHostsConfigsPage') ? this.get('configGroups') : [selectedConfigGroup]; + var configGroupsWithOverrides = selectedConfigGroup.get('isDefault') && !this.get('isHostsConfigsPage') ? this.get('configGroupsToLoad') : [selectedConfigGroup].concat(this.get('dependentConfigGroups')); configGroupsWithOverrides.forEach(function (item) { var groupName = item.get('name'); if (Em.isNone(this.loadedGroupToOverrideSiteToTagMap[groupName])) { @@ -382,12 +400,10 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM }, this); //STEP 2: Create an array of objects defining tag names to be polled and new tag names to be set after submit this.setServiceConfigTags(this.loadedClusterSiteToTagMap); - //STEP 3: Load advanced configs - var advancedConfigs = this.get('advancedConfigs'); //STEP 4: Load on-site config by service from server App.router.get('configurationController').getConfigsByTags(this.get('serviceConfigTags')).done(function(configGroups){ //Merge on-site configs with pre-defined - var configSet = App.config.mergePreDefinedWithLoaded(configGroups, advancedConfigs, self.get('serviceConfigTags'), serviceName); + var configSet = App.config.mergePreDefinedWithLoaded(configGroups, self.get('advancedConfigs'), self.get('serviceConfigTags'), serviceName); configSet = App.config.syncOrderWithPredefined(configSet); var configs = configSet.configs; @@ -402,7 +418,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM self.loadCompareVersionConfigs(self.get('allConfigs')).done(function (isComparison) { //Load and add overriden configs of group if (!isComparison && (!self.get('selectedConfigGroup').get('isDefault') || self.get('isCurrentSelected'))) { - App.config.loadServiceConfigGroupOverrides(self.get('allConfigs'), self.get('loadedGroupToOverrideSiteToTagMap'), self.get('configGroups'), self.onLoadOverrides, self); + App.config.loadServiceConfigGroupOverrides(self.get('allConfigs'), self.get('loadedGroupToOverrideSiteToTagMap'), self.get('configGroupsToLoad'), self.onLoadOverrides, self); } else { self.onLoadOverrides(self.get('allConfigs')); } @@ -594,7 +610,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM compareObject.set('isFinal', compareConfig.isFinal); compareObject.set('value', App.config.formatOverrideValue(serviceConfig, compareConfig.value)); compareObject.set('compareConfigs', null); - this.setSupportsFinal(compareObject); } return compareObject; }, @@ -755,22 +770,24 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM * @method onLoadOverrides */ onLoadOverrides: function (allConfigs) { - var serviceName = this.get('content.serviceName'); - var advancedConfigs = this.get('advancedConfigs'); - //STEP 10: creation of serviceConfig object which contains configs for current service - var serviceConfig = App.config.createServiceConfig(serviceName); - //STEP11: Make SecondaryNameNode invisible on enabling namenode HA - if (serviceConfig.get('serviceName') === 'HDFS') { - App.config.OnNnHAHideSnn(serviceConfig); - } + var serviceNames = this.get('servicesToLoad'); + serviceNames.forEach(function(serviceName) { + var serviceConfig = App.config.createServiceConfig(serviceName); + //Make SecondaryNameNode invisible on enabling namenode HA + if (serviceConfig.get('serviceName') === 'HDFS') { + App.config.OnNnHAHideSnn(serviceConfig); + } + var configsByService = this.get('allConfigs').filterProperty('serviceName', serviceName); + this.loadConfigs(configsByService, serviceConfig); - serviceConfig = App.config.createServiceConfig(this.get('content.serviceName')); - this.loadConfigs(this.get('allConfigs'), serviceConfig); - this.setVisibilityForRangerProperties(serviceConfig); - this.checkOverrideProperty(serviceConfig); - this.checkDatabaseProperties(serviceConfig); - this.get('stepConfigs').pushObject(serviceConfig); - this.set('selectedService', this.get('stepConfigs').objectAt(0)); + this.get('stepConfigs').pushObject(serviceConfig); + }, this); + + var selectedService = this.get('stepConfigs').findProperty('serviceName', this.get('content.serviceName')); + this.set('selectedService', selectedService); + this.setVisibilityForRangerProperties(selectedService); + this.checkOverrideProperty(selectedService); + this.checkDatabaseProperties(selectedService); this.checkForSecureConfig(this.get('selectedService')); this.setProperties({ dataIsLoaded: true, @@ -868,7 +885,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM var serviceConfigProperty = App.ServiceConfigProperty.create(_serviceConfigProperty); - this.setSupportsFinal(serviceConfigProperty); this.setValuesForOverrides(overrides, _serviceConfigProperty, serviceConfigProperty, defaultGroupSelected); this.setEditability(serviceConfigProperty, defaultGroupSelected); @@ -935,21 +951,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM }, /** - * set supportsFinal property of config for admin - * @param {Ember.Object} serviceConfigProperty - * @private - * @method setSupportsFinal - */ - setSupportsFinal: function (serviceConfigProperty) { - if (serviceConfigProperty.get('isMock')) return; - var fileName = serviceConfigProperty.get('filename'); - var matchingConfigType = this.get('configTypesInfo').supportsFinal.find(function(configType) { - return fileName.startsWith(configType); - }); - serviceConfigProperty.set('supportsFinal', !!matchingConfigType); - }, - - /** * set override values * @param overrides * @param _serviceConfigProperty @@ -961,7 +962,8 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM setValuesForOverrides: function (overrides, _serviceConfigProperty, serviceConfigProperty, defaultGroupSelected) { if (Em.isNone(overrides)) return; overrides.forEach(function (override) { - if (defaultGroupSelected || (Em.get(override, 'group') && this.get('selectedConfigGroup.name') === Em.get(override, 'group.name'))) { + if (defaultGroupSelected || (Em.get(override, 'group') && this.get('selectedConfigGroup.name') === Em.get(override, 'group.name')) + || serviceConfigProperty.get('serviceName') !== this.get('content.serviceName')) { var newSCP = this.createNewSCP(override, _serviceConfigProperty, serviceConfigProperty, defaultGroupSelected); var parentOverridesArray = serviceConfigProperty.get('overrides'); if (parentOverridesArray == null) { @@ -1090,13 +1092,39 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM }, /** + * get config properties for that fileNames that was changed + * @param stepConfigs + * @returns {Array} + */ + getModifiedConfigs: function(stepConfigs) { + var modifiedConfigs = stepConfigs + // get only modified and created configs + .filter(function (config) { + return config.get('isNotDefaultValue') || config.get('isNotSaved'); + }) + // get file names and add file names that was modified, for example after property removing + .mapProperty('filename').concat(this.get('modifiedFileNames')).uniq() + // get configs by filename + .map(function (fileName) { + return stepConfigs.filterProperty('filename', fileName); + }); + + if (!!modifiedConfigs.length) { + // concatenate results + modifiedConfigs = modifiedConfigs.reduce(function (current, prev) { + return current.concat(prev); + }); + } + return modifiedConfigs; + }, + + /** * Save changed configs and config groups * @method saveConfigs */ saveConfigs: function () { var selectedConfigGroup = this.get('selectedConfigGroup'); var configs = this.get('stepConfigs').findProperty('serviceName', this.get('content.serviceName')).get('configs'); - var self = this; if (selectedConfigGroup.get('isDefault')) { if (this.get('content.serviceName') === 'YARN') { @@ -1107,24 +1135,8 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM * generates list of properties that was changed * @type {Array} */ - var modifiedConfigs = configs - // get only modified and created configs - .filter(function (config) { - return config.get('isNotDefaultValue') || config.get('isNotSaved'); - }) - // get file names and add file names that was modified, for example after property removing - .mapProperty('filename').concat(this.get('modifiedFileNames')).uniq() - // get configs by filename - .map(function (fileName) { - return configs.filterProperty('filename', fileName); - }); + var modifiedConfigs = this.getModifiedConfigs(configs); - if (!!modifiedConfigs.length) { - // concatenate results - modifiedConfigs = modifiedConfigs.reduce(function (current, prev) { - return current.concat(prev); - }); - } // save modified original configs that have no group this.saveSiteConfigs(modifiedConfigs.filter(function (config) { return !config.get('group'); @@ -1137,44 +1149,94 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM this.doPUTClusterConfigurations(); } else { - var overridenConfigs = []; - var groupHosts = []; - configs.filterProperty('isOverridden', true).forEach(function (config) { - overridenConfigs = overridenConfigs.concat(config.get('overrides')); - }); - // find custom original properties that assigned to selected config group - overridenConfigs = overridenConfigs.concat(configs.filterProperty('group') - .filter(function (config) { - return config.get('group.name') == self.get('selectedConfigGroup.name'); - })); - this.formatConfigValues(overridenConfigs); - selectedConfigGroup.get('hosts').forEach(function (hostName) { - groupHosts.push({"host_name": hostName}); - }); + var overridenConfigs = this.getConfigsForGroup(configs, selectedConfigGroup.get('name')); /** * if there are some changes in dependent configs * need to save these config to in separate request */ - this.saveDependentGroups(); - - this.putConfigGroupChanges({ - ConfigGroup: { - "id": selectedConfigGroup.get('id'), - "cluster_name": App.get('clusterName'), - "group_name": selectedConfigGroup.get('name'), - "tag": selectedConfigGroup.get('service.id'), - "description": selectedConfigGroup.get('description'), - "hosts": groupHosts, - "service_config_version_note": this.get('serviceConfigVersionNote'), - "desired_configs": this.buildGroupDesiredConfigs(overridenConfigs) + this.get('dependentServiceNames').forEach(function(serviceName) { + var serviceConfig = this.get('stepConfigs').findProperty('serviceName', serviceName); + if (serviceConfig && this.get('changedProperties').findProperty('serviceName', serviceName) && this.get('groupsToSave')[serviceName]) { + var stepConfigs = serviceConfig.get('configs'); + + if (this.get('groupsToSave')[serviceName].contains('Default')) { + var data = []; + + var modifiedConfigs = this.getModifiedConfigs(stepConfigs); + + var fileNamesToSave = modifiedConfigs.mapProperty('filename').uniq(); + + var dependentConfigsToSave = this.generateDesiredConfigsJSON(modifiedConfigs, fileNamesToSave, this.get('serviceConfigNote')); + + if (dependentConfigsToSave.length > 0) { + data.pushObject(JSON.stringify({ + Clusters: { + desired_config: dependentConfigsToSave + } + })); + } + this.doPUTClusterConfigurationSites(data, false); + } else { + var overridenConfigs = this.getConfigsForGroup(stepConfigs, selectedConfigGroup.get('name')); + var group = this.get('dependentConfigGroups').findProperty('name', this.get('groupsToSave')[serviceName]); + this.saveGroup(overridenConfigs, group, false); + } } - }, true); + }, this); + + this.saveGroup(overridenConfigs, selectedConfigGroup, true); } }, /** + * get configs that belongs to config group + * @param stepConfigs + * @param configGroupName + */ + getConfigsForGroup: function(stepConfigs, configGroupName) { + var overridenConfigs = []; + + stepConfigs.filterProperty('isOverridden', true).forEach(function (config) { + overridenConfigs = overridenConfigs.concat(config.get('overrides')); + }); + // find custom original properties that assigned to selected config group + overridenConfigs = overridenConfigs.concat(stepConfigs.filterProperty('group') + .filter(function (config) { + return config.get('group.name') == configGroupName; + })); + + this.formatConfigValues(overridenConfigs); + return overridenConfigs; + }, + + /** + * save config group + * @param overridenConfigs + * @param selectedConfigGroup + * @param showPopup + */ + saveGroup: function(overridenConfigs, selectedConfigGroup, showPopup) { + var groupHosts = []; + var fileNamesToSave = overridenConfigs.mapProperty('filename'); + selectedConfigGroup.get('hosts').forEach(function (hostName) { + groupHosts.push({"host_name": hostName}); + }); + this.putConfigGroupChanges({ + ConfigGroup: { + "id": selectedConfigGroup.get('id'), + "cluster_name": App.get('clusterName'), + "group_name": selectedConfigGroup.get('name'), + "tag": selectedConfigGroup.get('service.id'), + "description": selectedConfigGroup.get('description'), + "hosts": groupHosts, + "service_config_version_note": this.get('serviceConfigVersionNote'), + "desired_configs": this.generateDesiredConfigsJSON(overridenConfigs, fileNamesToSave, null, true) + } + }, showPopup); + }, + /** * On save configs handler. Open save configs popup with appropriate message * @private * @method onDoPUTClusterConfigurations @@ -1747,7 +1809,14 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM * if there are such configs */ this.get('dependentServiceNames').forEach(function(serviceName) { - var dependentConfigsToSave = this.getDependentConfigObject(serviceName); + + var serviceConfigs = this.get('stepConfigs').findProperty('serviceName', serviceName).get('configs'); + + var modifiedConfigs = this.getModifiedConfigs(serviceConfigs); + + var fileNamesToSave = modifiedConfigs.mapProperty('filename').uniq(); + + var dependentConfigsToSave = this.generateDesiredConfigsJSON(modifiedConfigs, fileNamesToSave, this.get('serviceConfigNote')); if (dependentConfigsToSave.length > 0) { data.pushObject(JSON.stringify({ Clusters: { @@ -1757,7 +1826,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM } }, this); } - this.doPUTClusterConfigurationSites(data); + this.doPUTClusterConfigurationSites(data, true); } else { this.onDoPUTClusterConfigurations(); } @@ -1910,19 +1979,23 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM * Saves configuration of set of sites. The provided data * contains the site name and tag to be used. * @param {Object[]} services + * @param {boolean} showPopup * @return {$.ajax} * @method doPUTClusterConfigurationSites */ - doPUTClusterConfigurationSites: function (services) { - return App.ajax.send({ + doPUTClusterConfigurationSites: function (services, showPopup) { + var ajaxData = { name: 'common.across.services.configurations', sender: this, data: { data: '[' + services.toString() + ']' }, - success: 'doPUTClusterConfigurationSiteSuccessCallback', error: 'doPUTClusterConfigurationSiteErrorCallback' - }); + }; + if (showPopup) { + ajaxData.success = 'doPUTClusterConfigurationSiteSuccessCallback' + } + return App.ajax.send(ajaxData); }, /** http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/controllers/main/service/manage_config_groups_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/service/manage_config_groups_controller.js b/ambari-web/app/controllers/main/service/manage_config_groups_controller.js index 3cbb229..6842323 100644 --- a/ambari-web/app/controllers/main/service/manage_config_groups_controller.js +++ b/ambari-web/app/controllers/main/service/manage_config_groups_controller.js @@ -250,7 +250,6 @@ App.ManageConfigGroupsController = Em.Controller.extend({ onLoadPropertiesSuccess: function (data, opt, params) { data.items.forEach(function (configs) { var typeTagConfigs = []; - App.config.loadedConfigurationsCache[configs.type + "_" + configs.tag] = configs.properties; var group = params.typeTagToGroupMap[configs.type + "///" + configs.tag]; for (var config in configs.properties) { typeTagConfigs.push(Em.Object.create({ http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/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 e91f6cb..f8dad20 100644 --- a/ambari-web/app/controllers/wizard/step7_controller.js +++ b/ambari-web/app/controllers/wizard/step7_controller.js @@ -27,7 +27,7 @@ var App = require('app'); * */ -App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, { +App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.EnhancedConfigsMixin, { name: 'wizardStep7Controller', http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/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 afec5e6..9220b3f 100644 --- a/ambari-web/app/mappers/configs/stack_config_properties_mapper.js +++ b/ambari-web/app/mappers/configs/stack_config_properties_mapper.js @@ -25,6 +25,7 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({ display_name: 'StackConfigurations.property_display_name', file_name: 'StackConfigurations.type', description: 'StackConfigurations.property_description', + value: 'StackConfigurations.property_value', default_value: 'StackConfigurations.property_value', type: 'StackConfigurations.property_type', service_name: 'StackConfigurations.service_name', @@ -32,11 +33,13 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({ stack_version: 'StackConfigurations.stack_version', property_depended_by: 'StackConfigurations.property_depended_by', value_attributes: 'StackConfigurations.property_value_attributes', + is_final: 'default_is_final', default_is_final: 'default_is_final', supports_final: 'supports_final', - widget: 'widget' - //display_type: 'display_type', //not used for now - //category_name: 'category_name' //not used for now + widget: 'widget', + /**** ui properties ***/ + display_type: 'display_type', + category: 'category' }, map: function (json) { @@ -56,20 +59,21 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({ * for now is not used; uncomment in will be needed * this.mergeWithUI(config); */ + this.mergeWithUI(config); configs.push(this.parseIt(config, this.get('config'))); }, this); }, this); App.store.loadMany(this.get('model'), configs); } console.timeEnd('stackConfigMapper execution time'); - } + }, /******************* METHODS TO MERGE STACK PROPERTIES WITH STORED ON UI (NOT USED FOR NOW)*********************************/ /** * configs that are stored on UI * @type {Object[]}; - * + */ preDefinedSiteProperties: function () { var file = App.get('isHadoop22Stack') ? require('data/HDP2.2/site_properties') : require('data/HDP2/site_properties'); return file.configProperties; @@ -80,10 +84,11 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({ * if there is such property - adds some info to config object * @param {Object} config * @method mergeWithUI - * + */ mergeWithUI: function(config) { var uiConfigProperty = this.getUIConfig(config.StackConfigurations.property_name, config.StackConfigurations.type); - config.category_name = uiConfigProperty ? uiConfigProperty.category : 'General'; + config.display_name = uiConfigProperty ? uiConfigProperty.displayName : config.StackConfigurations.display_name; + config.category = uiConfigProperty ? uiConfigProperty.category : 'Advanced ' + App.config.getConfigTagFromFileName(config.StackConfigurations.type); config.display_type = uiConfigProperty ? uiConfigProperty.displayType : 'string'; }, @@ -94,8 +99,8 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({ * @param siteName * @returns {Object|null} * @method getUIConfig - * + */ getUIConfig: function(propertyName, siteName) { return this.get('preDefinedSiteProperties').filterProperty('filename', siteName).findProperty('name', propertyName); - }*/ + } }); http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/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 6de333a..876823b 100644 --- a/ambari-web/app/mixins/common/configs/enhanced_configs.js +++ b/ambari-web/app/mixins/common/configs/enhanced_configs.js @@ -95,82 +95,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ * @type {Object} */ groupsToSave: {}, - - /***********************************METHODS THAT WORKS WITH MODEL ********************************************/ - - /** - * generates desired_config objects for default config group - * @returns {Object} - * @method getDependentConfigObject - */ - getDependentConfigObject: function(serviceName) { - - var fileNamesToSave = this._getFileNamesToSave(serviceName); - - var configsToSave = this._getConfigsToSave(fileNamesToSave); - - return this.generateDesiredConfigsJSON(configsToSave, fileNamesToSave, this.get('serviceConfigNote')); - }, - - /** - * generates data and save configs for not default groups only - * that uses configs from model App.ConfigProperty - * @param serviceName - * @param configGroup - * @method saveEnhancedConfigsAndGroup - */ - saveModelConfigsWithGroup: function(serviceName, configGroup) { - /** - * for now we are saving configs from model only for dependent services - * so excluding situation in current service is trying to be saved - * this is temporary solution - */ - if (this.get('content.serviceName') !== serviceName) { - - var configsToSave = App.ConfigProperty.find().filter(function(cp) { - return cp.get('configVersion.groupName') == configGroup.get('name') || cp.get('isNotSaved'); - }); - if (configsToSave.length > 0) { - var hostNames = configGroup.get('hosts').map(function(hostName) { - return { - "host_name": hostName - } - }); - - var fileNamesToSave = configsToSave.mapProperty('fileName').uniq(); - - this.putConfigGroupChanges({ - ConfigGroup: { - "id": configGroup.get('id'), - "cluster_name": App.get('clusterName'), - "group_name": configGroup.get('name'), - "tag": configGroup.get('service.id'), - "description": configGroup.get('description'), - "hosts": hostNames, - "service_config_version_note": this.get('serviceConfigNote'), - "desired_configs": this.generateDesiredConfigsJSON(configsToSave, fileNamesToSave, null, true) - } - }) - } - } - }, - - /** - * save configs from model to default config group - * @param serviceName - */ - saveModelConfigs: function(serviceName) { - var desired_configs = this.getDependentConfigObject(serviceName); - if (desired_configs.length > 0) { - var data = [JSON.stringify({ - Clusters: { - desired_config: desired_configs - } - })]; - this.doPUTClusterConfigurationSites(data); - } - }, - /********************************METHODS THAT GENERATES JSON TO SAVE *****************************************/ /** @@ -189,7 +113,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ fileNamesToSave.forEach(function(fName) { if (this.allowSaveSite(fName)) { - var properties = configsToSave.filterProperty('fileName', fName); + var properties = configsToSave.filterProperty('filename', fName); var type = App.config.getConfigTagFromFileName(fName); desired_config.push(this.createDesiredConfig(type, tagVersion, properties, serviceConfigNote, isNotDefaultGroup)); } @@ -303,26 +227,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ /** - * saves properties for dependent service to config group based on <code>groupsToSave<code> - */ - saveDependentGroups: function() { - if (App.get('supports.enhancedConfigs') && this.get('dependentServiceNames.length') && Object.keys(this.get('groupsToSave')).length > 0) { - - this.get('dependentServiceNames').forEach(function(serviceName) { - if (this.get('groupsToSave')[serviceName]) { - if (this.get('groupsToSave')[serviceName].contains('Default')) { - this.saveModelConfigs(serviceName); - } else { - this.saveModelConfigsWithGroup(serviceName, this.get('dependentConfigGroups').findProperty('name', this.get('groupsToSave')[serviceName])); - } - } - }, this); - - } - }, - - - /** * runs <code>setDependentServicesAndFileNames<code> * for stack properties for current service * @method loadDependentConfigs @@ -336,17 +240,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ }, /** - * get service for current config type - * @param {String} configType - config fileName without xml - * @return App.StackService - */ - getServiceByConfigType: function(configType) { - return App.StackService.find().find(function(s) { - return Object.keys(s.get('configTypes')).contains(configType); - }); - }, - - /** * show popup to select config group for dependent services * to which dependent configs will ve saved * @method showSelectGroupsPopup @@ -499,35 +392,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ }, /** - * get file names that need to be saved - * used for default config group - * @param {String} serviceName - * @returns {Ember.Enumerable} - * @private - */ - _getFileNamesToSave: function(serviceName) { - return App.ConfigProperty.find().filter(function(cp) { - return cp.get('isNotDefaultValue') && cp.get('stackConfigProperty.serviceName') === serviceName; - }, this).mapProperty('fileName').uniq(); - }, - - /** - * get configs that need to be saved, for default group - * @param fileNamesToSave - * @returns {App.ConfigProperty[]} - * @private - */ - _getConfigsToSave: function(fileNamesToSave) { - if (Em.isArray(fileNamesToSave) && fileNamesToSave.length) { - return App.ConfigProperty.find().filter(function(cp) { - return fileNamesToSave.contains(cp.get('fileName')) && cp.get('configVersion.isCurrent'); - }); - } else { - return Em.A([]); - } - }, - - /** * save values that are stored in <code>_dependentConfigValues<code> * for current service to step configs * for dependent services to model @@ -537,11 +401,12 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ var self = this; this.get('_dependentConfigValues').forEach(function(dependentConfig) { if (Em.get(dependentConfig, 'saveRecommended')) { // if saveRecommended is false leave properties as is - if (Em.get(dependentConfig, 'serviceName') === self.get('content.serviceName')) { //for current service save dependent properties to step configs - self.get('stepConfigs').objectAt(0).get('configs').forEach(function(stepConfig) { + self.get('stepConfigs').forEach(function(serviceConfigs) { + serviceConfigs.get('configs').forEach(function(stepConfig) { if (stepConfig.get('filename') === App.config.getOriginalFileName(Em.get(dependentConfig, 'fileName')) && stepConfig.get('name') === Em.get(dependentConfig, 'propertyName')) { - if (self.get('selectedConfigGroup.isDefault')) { + if (self.get('selectedConfigGroup.isDefault') || (self.get('groupsToSave')[Em.get(dependentConfig, 'serviceName')] + && self.get('groupsToSave')[Em.get(dependentConfig, 'serviceName')].contains('Default'))) { stepConfig.set('value', Em.get(dependentConfig, 'recommendedValue')) } else { if (!stepConfig.get('overrides')) { @@ -556,33 +421,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ } } }) - } else { //for not current service save dependent properties to model - - App.ConfigProperty.find().forEach(function(cp) { - if (cp.get('name') === Em.get(dependentConfig, 'propertyName') - && cp.get('fileName') === App.config.getOriginalFileName(Em.get(dependentConfig, 'fileName'))) { - - if (self.get('selectedConfigGroup.isDefault') || Em.get(dependentConfig, 'configGroup').contains('Default')) { - if (cp.get('isOriginalSCP')) { - cp.set('value', Em.get(dependentConfig, 'recommendedValue')) - } - } else { - if (cp.get('configVersion.groupName') === self.get('groupsToSave')[dependentConfig.serviceName]) { - cp.set('value', Em.get(dependentConfig, 'recommendedValue')); - } else { - App.store.load(App.ConfigProperty, { - id: Em.get(dependentConfig, 'propertyName') + '_' + Em.get(dependentConfig, 'fileName') + '_', - name: Em.get(dependentConfig, 'propertyName'), - value: Em.get(dependentConfig, 'recommendedValue'), - file_name: App.config.getOriginalFileName(Em.get(dependentConfig, 'fileName')), - is_not_saved: true - }) - } - } - - } - }); - } + }); } }); }, @@ -597,8 +436,8 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ var self = this; this.get('_dependentConfigValues').forEach(function(dependentConfig) { if (!Em.get(dependentConfig, 'saveRecommended')) { // if saveRecommended is false leave properties as is - if (Em.get(dependentConfig, 'serviceName') === self.get('content.serviceName')) { //for current service save dependent properties to step configs - self.get('stepConfigs').objectAt(0).get('configs').forEach(function(stepConfig) { + self.get('stepConfigs').forEach(function(serviceConfigs) { + serviceConfigs.get('configs').forEach(function(stepConfig) { if (stepConfig.get('filename') === App.config.getOriginalFileName(Em.get(dependentConfig, 'fileName')) && stepConfig.get('name') === Em.get(dependentConfig, 'propertyName')) { if (self.get('selectedConfigGroup.isDefault')) { @@ -618,30 +457,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ } } }) - } else { //for not current service save dependent properties to model - - App.ConfigProperty.find().forEach(function(cp) { - if (cp.get('name') === Em.get(dependentConfig, 'propertyName') - && cp.get('fileName') === App.config.getOriginalFileName(Em.get(dependentConfig, 'fileName'))) { - - if (self.get('selectedConfigGroup.isDefault') || Em.get(dependentConfig, 'configGroup').contains('Default')) { - if (cp.get('isOriginalSCP')) { - cp.set('value', Em.get(dependentConfig, 'value')) - } - } else { - if (cp.get('configVersion.groupName') === self.get('groupsToSave')[dependentConfig.serviceName]) { - if (cp.get('isNotSaved')) { - cp.deleteRecord(); - App.store.commit(); - } else { - cp.set('value', Em.get(dependentConfig, 'value')); - } - } - } - - } - }); - } + }); } }); this.set('recommendationTimeStamp', (new Date).getTime()); @@ -653,7 +469,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ * for not default group - overriden property in case there is such property in group * otherwise - property from default group * @param stepConfigs - * @returns {App.ServiceConfigProperty[]} + * @returns {Object[]} * @private */ _getConfigsByGroup: function(stepConfigs) { @@ -661,17 +477,17 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ if (this.get('selectedConfigGroup.isDefault')) { return stepConfigs; } else { - stepConfigs.forEach(function(stepConfig) { - if (stepConfig.get('overrides')) { - var conf = stepConfig.get('overrides').findProperty('group.name', this.get('selectedConfigGroup.name')); - if (conf) { - configsToSend.pushObject(conf); + stepConfigs.forEach(function(serviceConfig) { + var stepConfigToSend = []; + serviceConfig.get('configs').forEach(function(stepConfig) { + if (stepConfig.get('overrides')) { + var conf = stepConfig.get('overrides').findProperty('group.name', this.get('selectedConfigGroup.name')); + stepConfigToSend.pushObject(conf ? conf : stepConfig); } else { - configsToSend.pushObject(stepConfig); + stepConfigToSend.pushObject(stepConfig); } - } else { - configsToSend.pushObject(stepConfig); - } + }, this); + configsToSend.pushObject(stepConfigToSend); }, this) } return configsToSend; @@ -688,7 +504,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ var configs = data.resources[0].recommendations.blueprint.configurations; for (var key in configs) { for (var propertyName in configs[key].properties) { - var service = this.getServiceByConfigType(key); + var service = App.config.getServiceByConfigType(key); var value = this._getCurrentValue(service.get('serviceName'), key, propertyName, this.get('selectedConfigGroup')); if (!Em.isNone(value)) { var dependentProperty = this.get('_dependentConfigValues').findProperty('propertyName', propertyName); @@ -696,8 +512,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ if (value != configs[key].properties[propertyName]) { Em.set(dependentProperty, 'value', value); Em.set(dependentProperty, 'recommendedValue', configs[key].properties[propertyName]); - } else { - this.get('_dependentConfigValues').removeObject(dependentProperty); } } else { var configGroup = this.get('selectedConfigGroup.isDefault') ? @@ -728,16 +542,18 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ * @returns {null|Object} * @private */ - _getCurrentValue: function(serviceName, tag, propertyName, configGroup) { - if (serviceName == this.get('content.serviceName')) { - var stepConfig = this.get('stepConfigs').objectAt(0).get('configs').find(function(stepConfig) { + _getCurrentValue: function (serviceName, tag, propertyName, configGroup) { + var serviceConfig = this.get('stepConfigs').findProperty('serviceName', serviceName); + var groupForService = serviceName == this.get('content.serviceName') ? configGroup.get('name') : this.get('groupsToSave')[serviceName]; + if (serviceConfig) { + var stepConfig = serviceConfig.get('configs').find(function (stepConfig) { return (stepConfig.get('filename') === App.config.getOriginalFileName(tag) && stepConfig.get('name') === propertyName); }); if (stepConfig) { if (configGroup.get('isDefault') || Em.isNone(stepConfig.get('overrides'))) { return stepConfig.get('value'); } else { - var overridenConfig = stepConfig.get('overrides').findProperty('group.name', configGroup.get('name')); + var overridenConfig = stepConfig.get('overrides').findProperty('group.name', groupForService); if (overridenConfig) { return overridenConfig.get('value'); } else { @@ -745,24 +561,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ } } } - } else { - var currentDefaultProperties = App.ConfigProperty.find().filter(function(cp) { - return cp.get('configVersion.isCurrent') && cp.get('configVersion.isDefault'); - }); - if (!this.get('selectedConfigGroup.isDefault') && (!this.get('groupsToSave')[serviceName] || !this.get('groupsToSave')[serviceName].contains('Default'))) { - var currentProperties = App.ConfigProperty.find().filter(function(cp) { - return cp.get('configVersion.isCurrent') && cp.get('configVersion.groupName') === this.get('groupsToSave')[serviceName]; - }, this); - var modelConfig = currentProperties.findProperty('name', propertyName); - if (modelConfig) { - return modelConfig.get('value'); - } - } - - var modelDefaultConfig = currentDefaultProperties.findProperty('name', propertyName); - if (modelDefaultConfig) { - return modelDefaultConfig.get('value'); - } } return null; } http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/mixins/main/service/configs/preload_requests_chain.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mixins/main/service/configs/preload_requests_chain.js b/ambari-web/app/mixins/main/service/configs/preload_requests_chain.js index b40b567..09e7b16 100644 --- a/ambari-web/app/mixins/main/service/configs/preload_requests_chain.js +++ b/ambari-web/app/mixins/main/service/configs/preload_requests_chain.js @@ -25,14 +25,11 @@ var App = require('app'); * Chain: * - loadClusterEnvSite * |- (on success callback) - * loadServiceConfigs - * |- App.config.loadAdvancedConfig - * | - (on complete callback) - * loadServiceConfigVersions - * |- (on success callback) - * loadSelectedVersion - * |- (on complete callback) - * loadServiceTagsAndGroups + * loadServiceConfigVersions + * |- (on success callback) + * loadSelectedVersion + * |- (on complete callback) + * loadServiceTagsAndGroups * @type {Ember.Mixin} */ App.PreloadRequestsChainMixin = Em.Mixin.create({ @@ -70,33 +67,7 @@ App.PreloadRequestsChainMixin = Em.Mixin.create({ // find the latest tag version var maxVersion = Math.max.apply(this, data.items.mapProperty('version')); this.set('clusterEnvTagVersion', data.items.findProperty('version', maxVersion).tag); - this.loadServiceConfigs(); - }, - - /** - * Loads service configurations - * @private - * @method loadServiceConfigs - */ - loadServiceConfigs: function () { - var advancedConfigs = []; - var self = this; - var serviceName = this.get('content.serviceName'); - - var stackService = App.StackService.find().findProperty('serviceName', serviceName); - if (stackService) { - self.set('configTypesInfo', App.config.getConfigTypesInfoFromService(stackService)); - } - - this.trackRequest(App.config.loadAdvancedConfig(serviceName, function (properties, xhr) { - if (xhr.statusText === 'abort') return; - advancedConfigs.pushObjects(properties); - self.set('advancedConfigs', advancedConfigs); - self.trackRequest(App.config.loadClusterConfig(function(clusterProperties) { - self.get('advancedConfigs').pushObjects(clusterProperties); - self.trackRequest(self.loadServiceConfigVersions()); - })); - })); + this.trackRequest(this.loadServiceConfigVersions()); }, /** @@ -163,14 +134,17 @@ App.PreloadRequestsChainMixin = Em.Mixin.create({ if (self.get('dataIsLoaded') && switchToGroup) { this.set('selectedConfigGroup', switchToGroup); } - + var data = { + serviceName: this.get('content.serviceName'), + serviceConfigVersions: versions + }; + if (App.get('supports.enhancedConfigs') && this.get('dependentServiceNames.length')) { + data.additionalParams = '|service_name.in(' + this.get('dependentServiceNames') + ')&is_current=true'; + } this.trackRequest(App.ajax.send({ name: 'service.serviceConfigVersions.get.multiple', sender: this, - data: { - serviceName: this.get('content.serviceName'), - serviceConfigVersions: versions - }, + data: data, success: 'loadSelectedVersionSuccess' }).complete(function (xhr) { if (xhr.statusText === 'abort') return; @@ -194,7 +168,7 @@ App.PreloadRequestsChainMixin = Em.Mixin.create({ sender: this, data: { serviceName: this.get('content.serviceName'), - urlParams: "&config_groups/ConfigGroup/tag.in(" + [this.get('content.serviceName')].concat(this.get('dependentServiceNames')).join(',')+ ')' + urlParams: "&config_groups/ConfigGroup/tag.in(" + this.get('servicesToLoad').join(',') + ')' }, success: 'loadServiceConfigsSuccess' })); @@ -209,9 +183,14 @@ App.PreloadRequestsChainMixin = Em.Mixin.create({ * @method loadSelectedVersionSuccess */ loadSelectedVersionSuccess: function (data, opt, params) { - var serviceConfigsDef = this.get('serviceConfigs').findProperty('serviceName', this.get('content.serviceName')); + var serviceConfigsDef = this.get('serviceConfigs').filter(function(serviceConfig) { + return this.get('servicesToLoad').contains(serviceConfig.get('serviceName')); + }, this); var siteToTagMap = {}; - var configTypesRendered = Object.keys(serviceConfigsDef.get('configTypesRendered')); + var configTypesRendered = []; + serviceConfigsDef.forEach(function(s) { + configTypesRendered = configTypesRendered.concat(Object.keys(s.get('configTypesRendered'))); + }); var selectedVersion = params.serviceConfigVersions.length > 1 ? params.serviceConfigVersions[1] : params.serviceConfigVersions[0]; var configurations = []; @@ -222,7 +201,7 @@ App.PreloadRequestsChainMixin = Em.Mixin.create({ configurations = item.configurations; if (item.configurations.someProperty('type', siteName)) { siteToTagMap[siteName] = item.configurations.findProperty('type', siteName).tag; - } else { + } else if (!siteToTagMap[siteName]) { siteToTagMap[siteName] = 'version1'; } } else { @@ -320,6 +299,12 @@ App.PreloadRequestsChainMixin = Em.Mixin.create({ service: App.Service.find().findProperty('serviceName', item.tag), hosts: item.hosts.mapProperty('host_name') }); + item.desired_configs.forEach(function (config) { + newDependentConfigGroup.configSiteTags.push(App.ConfigSiteTag.create({ + site: config.type, + tag: config.tag + })); + }, this); if (!this.get('dependentConfigGroups').findProperty('name', item.group_name)) { this.get('dependentConfigGroups').push(newDependentConfigGroup); } http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/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 4a87b36..5f66049 100644 --- a/ambari-web/app/models/configs/stack_config_property.js +++ b/ambari-web/app/models/configs/stack_config_property.js @@ -44,6 +44,14 @@ App.StackConfigProperty = DS.Model.extend({ fileName: DS.attr('string'), /** + * same as fileName + * @property {string} + */ + filename: function() { + return this.get('fileName'); + }.property('fileName'), + + /** * description of config property meaning * @property {string} */ @@ -75,20 +83,6 @@ App.StackConfigProperty = DS.Model.extend({ type: DS.attr('array', {defaultValue: []}), /** - * defines what kind of value this property contains - * ex: string, digits, number, directories, custom - * @property {string} - */ - displayType: DS.attr('string', {defaultValue: 'string'}), - - /** - * defines category name of property - * used for advanced tab - * @property {string} - */ - categoryName: DS.attr('string'), - - /** * service name * @property {string} */ @@ -153,8 +147,35 @@ App.StackConfigProperty = DS.Model.extend({ * sub section to which belongs this property * @property {App.SubSection} */ - subSection: DS.belongsTo('App.SubSection') + subSection: DS.belongsTo('App.SubSection'), + + /******************************* UI properties ****************************************/ + + /** + * defines what kind of value this property contains + * ex: string, digits, number, directories, custom + * @property {string} + */ + displayType: DS.attr('string', {defaultValue: 'string'}), + /** + * defines category name of property + * used for advanced tab + * @property {string} + */ + category: DS.attr('string'), + + /** + * config property value same as default + * @property {string} + */ + value: DS.attr('string'), + + /** + * config property isFinal value same as defaultIsFinal + * @property {boolean} + */ + isFinal: DS.attr('boolean', {defaultValue: false}) }); http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/templates/common/configs/services_config.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/common/configs/services_config.hbs b/ambari-web/app/templates/common/configs/services_config.hbs index 0076c11..328a954 100644 --- a/ambari-web/app/templates/common/configs/services_config.hbs +++ b/ambari-web/app/templates/common/configs/services_config.hbs @@ -31,6 +31,11 @@ {{else}} <div class="spinner"></div> {{/if}} +{{#if hasChangedDependencies}} + <div class="alert alert-warning"> + <span>{{dependenciesMessage}}</span> <a href="#" {{action "showChangedDependentConfigs" target="controller"}}>{{t common.showDetails}}</a> + </div> +{{/if}} {{view App.ServiceConfigContainerView}} {{#if controller.isRecommendedLoaded}} <p class="loading align-center"></p> http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/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 ab722cc..22e5715 100644 --- a/ambari-web/app/utils/ajax/ajax.js +++ b/ambari-web/app/utils/ajax/ajax.js @@ -2316,11 +2316,12 @@ var urls = { mock: '/data/configurations/service_version.json' }, 'service.serviceConfigVersions.get.multiple': { - real: '/clusters/{clusterName}/configurations/service_config_versions?service_name={serviceName}&service_config_version.in({serviceConfigVersions})', + real: '/clusters/{clusterName}/configurations/service_config_versions?service_name={serviceName}&service_config_version.in({serviceConfigVersions}){additionalParams}', mock: '/data/configurations/service_version.json', format: function (data) { return { - serviceConfigVersions: data.serviceConfigVersions.join(',') + serviceConfigVersions: data.serviceConfigVersions.join(','), + additionalParams: data.additionalParams || '' } } }, http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/app/utils/config.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js index a7686d4..162ea1e 100644 --- a/ambari-web/app/utils/config.js +++ b/ambari-web/app/utils/config.js @@ -190,44 +190,32 @@ App.config = Em.Object.create({ }, /** - * Cache of loaded configurations. This is useful in not loading - * same configuration multiple times. It is populated in multiple - * places. - * - * Example: - * { - * 'hdfs-site_version3': {...}, - * } - */ - loadedConfigurationsCache: {}, - - /** * identify category by filename of config * @param config * @return {object|null} */ identifyCategory: function (config) { var category = null, - serviceConfigMetaData = this.get('preDefinedServiceConfigs').findProperty('serviceName', config.serviceName), + serviceConfigMetaData = this.get('preDefinedServiceConfigs').findProperty('serviceName', Em.get(config, 'serviceName')), configCategories = (serviceConfigMetaData && serviceConfigMetaData.get('configCategories')) || []; - if (config.filename.contains("env")) { - if (config.category) { - category = configCategories.findProperty("name", config.category); + if (Em.get(config, 'filename') && Em.get(config, 'filename').contains("env")) { + if (Em.get(config, 'category')) { + category = configCategories.findProperty("name", Em.get(config, 'category')); } else { configCategories.forEach(function (_category) { - if (_category.name.contains(this.getConfigTagFromFileName(config.filename))) { + if (_category.name.contains(this.getConfigTagFromFileName(Em.get(config, 'filename')))) { category = _category; } }, this); } } else { configCategories.forEach(function (_category) { - if (_category.siteFileNames && Array.isArray(_category.siteFileNames) && _category.siteFileNames.contains(config.filename)) { + if (_category.siteFileNames && Array.isArray(_category.siteFileNames) && _category.siteFileNames.contains(Em.get(config, 'filename'))) { category = _category; } }); - category = Em.isNone(category) ? configCategories.findProperty('siteFileName', this.getOriginalFileName(config.filename)) : category; + category = Em.isNone(category) ? configCategories.findProperty('siteFileName', this.getOriginalFileName(Em.get(config, 'filename'))) : category; } return category; }, @@ -238,51 +226,44 @@ App.config = Em.Object.create({ * @param config */ handleSpecialProperties: function (config) { - if (config.displayType === 'int' && /\d+m$/.test(config.value)) { - config.value = config.value.slice(0, config.value.length - 1); - config.defaultValue = config.value; + if (Em.get(config, 'displayType') === 'int' && /\d+m$/.test(Em.get(config, 'value') )) { + Em.set(config, 'value', Em.get(config, 'value').slice(0, Em.get(config, 'value.length') - 1)); + Em.set(config, 'defaultValue', Em.get(config, 'value')); } }, /** * calculate config properties: - * category, filename, isUserProperty, description + * category, filename, description * @param config * @param isAdvanced - * @param advancedConfigs + * @param advancedProperty */ - calculateConfigProperties: function (config, isAdvanced, advancedConfigs) { - if (!isAdvanced || this.get('customFileNames').contains(config.filename)) { + calculateConfigProperties: function (config, isAdvanced, advancedProperty) { + if (!isAdvanced || this.get('customFileNames').contains(Em.get(config, 'filename'))) { var categoryMetaData = this.identifyCategory(config); if (categoryMetaData != null) { - config.category = categoryMetaData.get('name'); - if (!isAdvanced) config.isUserProperty = true; - } - if (isAdvanced) { - var advancedProperty = advancedConfigs.filterProperty('filename', config.filename).findProperty('name', config.name); - if (advancedProperty) { - config.description = advancedProperty.description; - } + Em.set(config, 'category', categoryMetaData.get('name')); } } else { - var advancedProperty = null; - var configType = this.getConfigTagFromFileName(config.filename); - if (isAdvanced) { - advancedProperty = advancedConfigs.filterProperty('filename', config.filename).findProperty('name', config.name); - } - config.category = config.category ? config.category : 'Advanced ' + configType; - if (advancedProperty) { - config.description = advancedProperty.description; - } + var configType = this.getConfigTagFromFileName(Em.get(config, 'filename')); + Em.set(config, 'category', Em.get(config, 'category') ? Em.get(config, 'category') : 'Advanced ' + configType); + } + if (advancedProperty) { + Em.set(config, 'description', Em.get(advancedProperty, 'description')); } }, - capacitySchedulerFilter: function () { - var yarnRegex = /^yarn\.scheduler\.capacity\.root\.([a-z]([\_\-a-z0-9]{0,50}))\.(acl_administer_jobs|acl_submit_jobs|state|user-limit-factor|maximum-capacity|capacity)$/i; - return function (_config) { - return (yarnRegex.test(_config.name)); - } - }.property(), + /** + * get service for current config type + * @param {String} configType - config fileName without xml + * @return App.StackService + */ + getServiceByConfigType: function(configType) { + return App.StackService.find().find(function(s) { + return Object.keys(s.get('configTypes')).contains(configType); + }); + }, /** * return: @@ -301,10 +282,13 @@ App.config = Em.Object.create({ var preDefinedConfigs = this.get('preDefinedSiteProperties').concat(contentProperties); var mappingConfigs = []; var filenameExceptions = this.get('filenameExceptions'); - var selectedServiceNames = App.Service.find().mapProperty('serviceName'); tags.forEach(function (_tag) { - var isAdvanced = null; - var filename = (filenameExceptions.contains(_tag.siteName)) ? _tag.siteName : _tag.siteName + ".xml"; + 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; }); @@ -315,13 +299,10 @@ 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) { - advancedConfigs.filterProperty('name', index).forEach(function (_advancedConfig) { - var isServiceInstalled = selectedServiceNames.contains(_advancedConfig.serviceName); - if (isServiceInstalled || _advancedConfig.serviceName == 'MISC') { - configsPropertyDef = _advancedConfig; - } - }, this); + configsPropertyDef = advancedConfig; } var serviceConfigObj = App.ServiceConfig.create({ @@ -329,15 +310,17 @@ App.config = Em.Object.create({ value: properties[index], defaultValue: properties[index], filename: filename, - isUserProperty: false, + isUserProperty: !advancedConfig, isOverridable: true, isReconfigurable: true, - isRequired: advancedConfigs.someProperty('name', index), + isRequired: isAdvanced, isFinal: finalAttributes[index] === "true", defaultIsFinal: finalAttributes[index] === "true", showLabel: true, serviceName: serviceName, - belongsToService: [] + belongsToService: [], + supportsFinal: advancedConfig ? Em.get(advancedConfig, 'supportsFinal') : false + }); if (configsPropertyDef) { @@ -354,22 +337,22 @@ App.config = Em.Object.create({ this.tweakConfigVisibility(serviceConfigObj, properties); if (!this.getBySiteName(serviceConfigObj.get('filename')).someProperty('name', index)) { if (configsPropertyDef) { - if (configsPropertyDef.isRequiredByAgent === false) { + if (Em.get(configsPropertyDef, 'isRequiredByAgent') === false) { continue; } this.handleSpecialProperties(serviceConfigObj); } else { - serviceConfigObj.displayType = stringUtils.isSingleLine(serviceConfigObj.value) ? 'advanced' : 'multiLine'; + serviceConfigObj.set('displayType', stringUtils.isSingleLine(serviceConfigObj.get('value')) ? 'advanced' : 'multiLine'); } - - isAdvanced = advancedConfigs.filterProperty('name', index).someProperty('filename', filename); - serviceConfigObj.id = 'site property'; - serviceConfigObj.displayName = configsPropertyDef && configsPropertyDef.displayName ? configsPropertyDef.displayName : index; - serviceConfigObj.options = configsPropertyDef ? configsPropertyDef.options : null; - serviceConfigObj.radioName = configsPropertyDef ? configsPropertyDef.radioName : null; - serviceConfigObj.serviceName = configsPropertyDef && configsPropertyDef.serviceName ? configsPropertyDef.serviceName : serviceName; - serviceConfigObj.belongsToService = configsPropertyDef && configsPropertyDef.belongsToService ? configsPropertyDef.belongsToService : []; - this.calculateConfigProperties(serviceConfigObj, isAdvanced, advancedConfigs); + 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 { @@ -385,8 +368,8 @@ App.config = Em.Object.create({ tweakConfigVisibility: function (config, allSiteConfigs) { var kdcType = allSiteConfigs['kdc_type']; - if (kdcType === 'active-directory' && (config.name === 'container_dn' || config.name === 'ldap_url')) { - config.isVisible = true; + if (kdcType === 'active-directory' && ['container_dn', 'ldap_url'].contains(Em.get(config, 'name'))) { + Em.set(config, 'isVisible', true); } }, @@ -416,21 +399,23 @@ App.config = Em.Object.create({ * @param configsPropertyDef : Object */ setServiceConfigUiAttributes: function (serviceConfigObj, configsPropertyDef) { - serviceConfigObj.displayType = configsPropertyDef.displayType; - serviceConfigObj.isRequired = (configsPropertyDef.isRequired !== undefined) ? configsPropertyDef.isRequired : true; - serviceConfigObj.isRequiredByAgent = (configsPropertyDef.isRequiredByAgent !== undefined) ? configsPropertyDef.isRequiredByAgent : true; - serviceConfigObj.isReconfigurable = (configsPropertyDef.isReconfigurable !== undefined) ? configsPropertyDef.isReconfigurable : true; - serviceConfigObj.isVisible = (configsPropertyDef.isVisible !== undefined) ? configsPropertyDef.isVisible : true; - serviceConfigObj.unit = (configsPropertyDef.unit !== undefined) ? configsPropertyDef.unit : undefined; - serviceConfigObj.description = (configsPropertyDef.description !== undefined) ? configsPropertyDef.description : undefined; - serviceConfigObj.isOverridable = configsPropertyDef.isOverridable === undefined ? true : configsPropertyDef.isOverridable; - serviceConfigObj.serviceName = configsPropertyDef ? configsPropertyDef.serviceName : null; - serviceConfigObj.index = configsPropertyDef.index; - serviceConfigObj.isSecureConfig = configsPropertyDef.isSecureConfig === undefined ? false : configsPropertyDef.isSecureConfig; - serviceConfigObj.belongsToService = configsPropertyDef.belongsToService; - serviceConfigObj.category = configsPropertyDef.category; - serviceConfigObj.showLabel = configsPropertyDef.showLabel !== false; - serviceConfigObj.dependentConfigPattern = configsPropertyDef.dependentConfigPattern + 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') + }); }, /** @@ -1074,7 +1059,6 @@ App.config = Em.Object.create({ loadServiceConfigGroupOverridesSuccess: function (data, opt, params) { data.items.forEach(function (config) { - App.config.loadedConfigurationsCache[config.type + "_" + config.tag] = config.properties; var group = params.typeTagToGroupMap[config.type + "///" + config.tag]; var properties = config.properties; for (var prop in properties) { @@ -1289,8 +1273,8 @@ App.config = Em.Object.create({ if (stored.category == 'Users and Groups') { configData.index = this.getOriginalConfigAttribute(stored, 'index', advancedConfigs); } - - App.get('config').calculateConfigProperties(configData, isAdvanced, advancedConfigs); + var advancedConfig = advancedConfigs.filterProperty('name', stored.name).findProperty('filename', stored.filename); + App.get('config').calculateConfigProperties(configData, isAdvanced, advancedConfig); return configData; }, http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/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 b611fb6..b41f3c5 100644 --- a/ambari-web/app/views/common/controls_view.js +++ b/ambari-web/app/views/common/controls_view.js @@ -67,7 +67,7 @@ App.SupportsDependentConfigs = Ember.Mixin.create({ * and in case there was changes shows popup with info about changed configs */ sendRequestRorDependentConfigs: function(config) { - if (App.get('supports.enhancedConfigs') && this.get('controller.name') === 'mainServiceInfoConfigsController') { + if (App.get('supports.enhancedConfigs') && App.router.get('clusterInstallCompleted') && ['mainServiceInfoConfigsController','wizardStep7Controller'].contains(this.get('controller.name'))) { var name = config.get('name'); var type = App.config.getConfigTagFromFileName(config.get('filename')); var p = App.StackConfigProperty.find(name + '_' + type); http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/ambari-web/test/mixins/common/configs/enhanced_configs_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/mixins/common/configs/enhanced_configs_test.js b/ambari-web/test/mixins/common/configs/enhanced_configs_test.js index babbd3b..7cdfb1b 100644 --- a/ambari-web/test/mixins/common/configs/enhanced_configs_test.js +++ b/ambari-web/test/mixins/common/configs/enhanced_configs_test.js @@ -23,26 +23,6 @@ describe('App.EnhancedConfigsMixin', function() { var mixinObject = Em.Controller.extend(App.EnhancedConfigsMixin, {}); var instanceObject = mixinObject.create({}); var stackProperty - describe('#_getFileNamesToSave()', function() { - - beforeEach(function() { - App.resetDsStoreTypeMap(App.ConfigProperty); - App.resetDsStoreTypeMap(App.StackConfigProperty); - stackProperty = App.ConfigProperty.createRecord({id: '1', serviceName: 'service1'}); - }); - - it('returns file names that was changed', function() { - App.ConfigProperty.createRecord({id: 'p1_c1', value:'1', defaultValue: '2', fileName: 'file1', stackConfigProperty: stackProperty}); - App.ConfigProperty.createRecord({id: 'p2_c1', value:'1', defaultValue: '1', fileName: 'file2', stackConfigProperty: stackProperty}); - expect(instanceObject._getFileNamesToSave('service1')).to.eql(['file1']) - }); - - it('returns file names that was changed for current service', function() { - App.ConfigProperty.createRecord({id: 'p1_c1', value:'7', defaultValue: '1', fileName: 'file1', stackConfigProperty: stackProperty}); - App.ConfigProperty.createRecord({id: 'p2_c1', value:'8', defaultValue: '1', fileName: 'file2'}); - expect(instanceObject._getFileNamesToSave('service1')).to.eql(['file1']) - }); - }); describe('#allowSaveSite()', function() { http://git-wip-us.apache.org/repos/asf/ambari/blob/fbc69dce/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 98b6b1c..3c10523 100644 --- a/ambari-web/test/utils/config_test.js +++ b/ambari-web/test/utils/config_test.js @@ -74,45 +74,6 @@ describe('App.config', function () { }); }); - describe('#capacitySchedulerFilter', function() { - var testMessage = 'filter should {0} detect `{1}` property'; - describe('Stack version >= 2.0', function() { - before(function() { - setups.setupStackVersion(this, 'HDP-2.1'); - }); - var tests = [ - { - config: { - name: 'yarn.scheduler.capacity.maximum-am-resource-percent' - }, - e: false - }, - { - config: { - name: 'yarn.scheduler.capacity.root.capacity' - }, - e: false - }, - { - config: { - name: 'yarn.scheduler.capacity.root.default.capacity' - }, - e: true - } - ]; - - tests.forEach(function(test){ - it(testMessage.format( !!test.e ? '' : 'not', test.config.name), function() { - expect(App.config.get('capacitySchedulerFilter')(test.config)).to.eql(test.e); - }); - }); - after(function() { - setups.restoreStackVersion(this); - }) - }); - - }); - describe('#fileConfigsIntoTextarea', function () { var filename = 'capacity-scheduler.xml'; var configs = [
