Repository: ambari Updated Branches: refs/heads/trunk 105a62060 -> f34f2df9c
AMBARI-10342 Dependent config changes not being shown to user. (ababiichuk) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/f34f2df9 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/f34f2df9 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/f34f2df9 Branch: refs/heads/trunk Commit: f34f2df9c106b140dcd9c098dc19fadfcb4d8017 Parents: 105a620 Author: aBabiichuk <[email protected]> Authored: Fri Apr 3 13:19:36 2015 +0300 Committer: aBabiichuk <[email protected]> Committed: Fri Apr 3 13:19:36 2015 +0300 ---------------------------------------------------------------------- .../controllers/global/cluster_controller.js | 4 +- .../controllers/main/service/info/configs.js | 19 +- .../configs/stack_config_properties_mapper.js | 4 +- .../mixins/common/configs/enhanced_configs.js | 249 +++++++++---------- ambari-web/app/models/service_config.js | 3 +- .../configs/widgets/config_widget_view.js | 2 +- .../widgets/slider_config_widget_view.js | 8 +- 7 files changed, 138 insertions(+), 151 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/f34f2df9/ambari-web/app/controllers/global/cluster_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/global/cluster_controller.js b/ambari-web/app/controllers/global/cluster_controller.js index 9fd1a46..1dafc13 100644 --- a/ambari-web/app/controllers/global/cluster_controller.js +++ b/ambari-web/app/controllers/global/cluster_controller.js @@ -280,9 +280,7 @@ App.ClusterController = Em.Controller.extend({ }); updater.updateServiceMetric(function () { - if (App.get('supports.enhancedConfigs')) { - App.config.loadConfigsFromStack(App.Service.find().mapProperty('serviceName')); - } + App.config.loadConfigsFromStack(App.Service.find().mapProperty('serviceName')); updater.updateComponentConfig(function () { self.updateLoadStatus('componentConfigs'); http://git-wip-us.apache.org/repos/asf/ambari/blob/f34f2df9/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 f9729e5..9a40545 100644 --- a/ambari-web/app/controllers/main/service/info/configs.js +++ b/ambari-web/app/controllers/main/service/info/configs.js @@ -770,6 +770,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM * @method onLoadOverrides */ onLoadOverrides: function (allConfigs) { + var self = this; var serviceNames = this.get('servicesToLoad'); serviceNames.forEach(function(serviceName) { var serviceConfig = App.config.createServiceConfig(serviceName); @@ -789,11 +790,13 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM this.checkOverrideProperty(selectedService); this.checkDatabaseProperties(selectedService); this.checkForSecureConfig(this.get('selectedService')); - this.setProperties({ - dataIsLoaded: true, - versionLoaded: true, - hash: this.getHash(), - isInit: false + this.getRecommendationsForDependencies(null, true, function() { + self.setProperties({ + dataIsLoaded: true, + versionLoaded: true, + hash: self.getHash(), + isInit: false + }); }); }, @@ -2450,9 +2453,10 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM * @param {object} serviceConfigProperty - config property object * @param {App.ConfigGroup} group - config group for new property * @param {String} value + * @param {boolean} isNotSaved TODO * @method addOverrideProperty */ - addOverrideProperty: function (serviceConfigProperty, group, value) { + addOverrideProperty: function (serviceConfigProperty, group, value, isNotSaved) { if (serviceConfigProperty.get('isOriginalSCP')) { var overrides = serviceConfigProperty.get('overrides'); if (!overrides) { @@ -2466,7 +2470,8 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ServerValidatorM parentSCP: serviceConfigProperty, isEditable: true, group: group, - overrides: null + overrides: null, + isNotSaved: isNotSaved }); console.debug("createOverrideProperty(): Added:", newSCP, " to main-property:", serviceConfigProperty); overrides.pushObject(newSCP); http://git-wip-us.apache.org/repos/asf/ambari/blob/f34f2df9/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 9220b3f..377095a 100644 --- a/ambari-web/app/mappers/configs/stack_config_properties_mapper.js +++ b/ambari-web/app/mappers/configs/stack_config_properties_mapper.js @@ -87,7 +87,9 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({ */ mergeWithUI: function(config) { var uiConfigProperty = this.getUIConfig(config.StackConfigurations.property_name, config.StackConfigurations.type); - config.display_name = uiConfigProperty ? uiConfigProperty.displayName : config.StackConfigurations.display_name; + if (!config.StackConfigurations.property_display_name) { + 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 : 'string'; }, http://git-wip-us.apache.org/repos/asf/ambari/blob/f34f2df9/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 02738c5..549b783 100644 --- a/ambari-web/app/mixins/common/configs/enhanced_configs.js +++ b/ambari-web/app/mixins/common/configs/enhanced_configs.js @@ -51,6 +51,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ * ex: * { * saveRecommended: {boolean}, //by default is true (checkbox binding) + * saveRecommendedDefault: {boolean}, used for cancel operation to restore previous state * fileName: {string}, //file name without '.xml' * propertyName: {string}, * configGroup: {string}, @@ -268,10 +269,13 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ /** * sends request to get values for dependent configs * @param changedConfigs + * @param initial + * @param onComplete * @returns {$.ajax|null} */ - getRecommendationsForDependencies: function(changedConfigs) { - if (Em.isArray(changedConfigs) && changedConfigs.length > 0) { + getRecommendationsForDependencies: function(changedConfigs, initial, onComplete) { + if (Em.isArray(changedConfigs) && changedConfigs.length > 0 || initial) { + var self = this; var recommendations = this.get('hostGroups'); var configs = this._getConfigsByGroup(this.get('stepConfigs')); recommendations.blueprint.configurations = blueprintUtils.buildConfigsJSON(this.get('services'), configs); @@ -282,7 +286,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ services: this.get('serviceNames'), recommendations: recommendations }; - if (App.get('supports.enhancedConfigs')) { + if (App.get('supports.enhancedConfigs') && changedConfigs) { dataToSend.recommend = 'configuration-dependencies'; dataToSend.changed_configurations = changedConfigs; } @@ -291,11 +295,17 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ sender: this, data: { stackVersionUrl: App.get('stackVersionURL'), - dataToSend: dataToSend + dataToSend: dataToSend, + initial: initial }, success: 'dependenciesSuccess', error: 'dependenciesError', - callback: this.onRecommendationsReceived.bind(this) + callback: function() { + self.onRecommendationsReceived(); + if (onComplete) { + onComplete() + } + } }); } else { return null; @@ -315,18 +325,20 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ * if case properties that was changes belongs to not default group * user should pick to what config group from dependent service dependent properties will be saved * @param data + * @param opt + * @param params * @method dependenciesSuccess */ - dependenciesSuccess: function (data) { + dependenciesSuccess: function (data, opt, params) { var self = this; if (!this.get('selectedConfigGroup.isDefault')) { self.showSelectGroupsPopup(function () { - self._saveRecommendedValues(data); - self._saveDependentConfigs(); + self._saveRecommendedValues(data, params.initial); + self._updateDependentConfigs(self.get('selectedConfigGroup.isDefault')); }); } else { - self._saveRecommendedValues(data); - self._saveDependentConfigs(); + self._saveRecommendedValues(data, params.initial); + self._updateDependentConfigs(self.get('selectedConfigGroup.isDefault')); } }, @@ -338,8 +350,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ var self = this; if (self.get('_dependentConfigValues.length') > 0) { App.showDependentConfigsPopup(this.get('_dependentConfigValues'), function() { - self._saveDependentConfigs(); - self._discardChanges(); + self._updateDependentConfigs(self.get('selectedConfigGroup.isDefault')); if (callback) { callback(); } @@ -391,74 +402,56 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ /** * save values that are stored in <code>_dependentConfigValues<code> - * for current service to step configs - * for dependent services to model + * to step configs + * @param isDefaultConfigGroup * @private */ - _saveDependentConfigs: function() { + _updateDependentConfigs: function(isDefaultConfigGroup) { var self = this; - this.get('_dependentConfigValues').forEach(function(dependentConfig) { - if (Em.get(dependentConfig, 'saveRecommended')) { // if saveRecommended is false leave properties as is - 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') || (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')) { - stepConfig.set('overrides', Em.A([])); - } - var overridenConfig = stepConfig.get('overrides').findProperty('group.name', Em.get(dependentConfig, 'configGroup')); - if (overridenConfig) { - overridenConfig.set('value', Em.get(dependentConfig, 'recommendedValue')); - } else { - self.addOverrideProperty(stepConfig.set('isNotSaved', true), self.get('selectedConfigGroup'), Em.get(dependentConfig, 'recommendedValue')); - } + var dependentConfigs = this.get('_dependentConfigValues'); + this.get('stepConfigs').forEach(function(serviceConfigs) { + var selectedGroup = self.getGroupForService(serviceConfigs.get('serviceName')); + serviceConfigs.get('configs').forEach(function(cp) { + var dependentConfig = dependentConfigs.filterProperty('propertyName', cp.get('name')).findProperty('fileName', App.config.getConfigTagFromFileName(cp.get('filename'))); + if (dependentConfig) { + var valueToSave = dependentConfig.saveRecommended ? dependentConfig.recommendedValue : dependentConfig.value; + if (isDefaultConfigGroup || selectedGroup.get('isDefault')) { + cp.set('value', valueToSave); + } else { + var overridenConfig = cp.get('overrides') && cp.get('overrides').findProperty('group.name', selectedGroup.get('name')); + if (overridenConfig) { + overridenConfig.set('value', valueToSave); + } + if (dependentConfig.saveRecommended) { + if (!overridenConfig) { + self.addOverrideProperty(cp, selectedGroup, valueToSave, true); + } + } else { + if (overridenConfig && overridenConfig.get('isNotSaved')) { + cp.get('overrides').removeObject(overridenConfig); } } - }) - }); - } + } + } + }) }); }, /** - * opposite to <code>_saveDependentConfigs<code> - * restore values that was before applying changes for dependent configs - * do this action only for properties that has <code>saveRecommended<code> - false - * @private + * get config group object for current service + * @param serviceName + * @returns {*} */ - _discardChanges: function () { - var self = this; - this.get('_dependentConfigValues').forEach(function(dependentConfig) { - if (!Em.get(dependentConfig, 'saveRecommended')) { // if saveRecommended is false leave properties as is - 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')) { - stepConfig.set('value', Em.get(dependentConfig, 'value')) - } else { - if (!stepConfig.get('overrides')) { - stepConfig.set('overrides', Em.A([])); - } - var overridenConfig = stepConfig.get('overrides').findProperty('group.name', Em.get(dependentConfig, 'configGroup')); - if (overridenConfig) { - if (overridenConfig.get('isNotSaved')) { - stepConfig.get('overrides').removeObject(overridenConfig); - } else { - overridenConfig.set('value', Em.get(dependentConfig, 'value')); - } - } - } - } - }) - }); + getGroupForService: function(serviceName) { + if (this.get('content.serviceName') === serviceName) { + return this.get('selectedConfigGroup') + } else { + if (this.get('selectedConfigGroup.isDefault')) { + return this.get('dependentConfigGroups').filterProperty('service.serviceName', serviceName).findProperty('isDefault'); + } else { + return this.get('dependentConfigGroups').findProperty('name', this.get('groupsToSave')[serviceName]); } - }); - this.set('recommendationTimeStamp', (new Date).getTime()); + } }, /** @@ -471,60 +464,79 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ * @private */ _getConfigsByGroup: function(stepConfigs) { - var configsToSend = []; if (this.get('selectedConfigGroup.isDefault')) { return stepConfigs; } else { + var configsToSend = []; + 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); + var group = this.getGroupForService(serviceConfig.get('serviceName')); + serviceConfig.get('configs').forEach(function(cp) { + if (group && !group.get('isDefault') && cp.get('overrides')) { + var conf = cp.get('overrides').findProperty('group.name', group.get('name')); + stepConfigToSend.pushObject(conf ? conf : cp); } else { - stepConfigToSend.pushObject(stepConfig); + stepConfigToSend.pushObject(cp); } }, this); - configsToSend.pushObject(stepConfigToSend); - }, this) + App.config.createServiceConfig(serviceConfig.get('serviceName')); + var stepConfig = App.config.createServiceConfig(serviceConfig.get('serviceName')); + stepConfig.set('configs', stepConfigToSend); + configsToSend.pushObject(stepConfig); + }, this); + + return configsToSend; } - return configsToSend; }, /** * saves values from response for dependent configs to <code>_dependentConfigValues<code> * @param data + * @param updateOnlyBoundaries * @method saveRecommendedValues * @private */ - _saveRecommendedValues: function(data) { + _saveRecommendedValues: function(data, updateOnlyBoundaries) { Em.assert('invalid data', data && data.resources[0] && Em.get(data.resources[0], 'recommendations.blueprint.configurations')); var configs = data.resources[0].recommendations.blueprint.configurations; + /** get all configs by config group **/ + var stepConfigsByGroup = this._getConfigsByGroup(this.get('stepConfigs')); for (var key in configs) { + + /** defines main info for file name (service name, config group, config that belongs to filename) **/ + var serviceName = App.config.getServiceByConfigType(key).get('serviceName'); + var stepConfig = stepConfigsByGroup.findProperty('serviceName', serviceName); + var configProperties = stepConfig ? stepConfig.get('configs').filterProperty('filename', App.config.getOriginalFileName(key)) : []; + + var group = this.getGroupForService(serviceName); + for (var propertyName in configs[key].properties) { - var service = App.config.getServiceByConfigType(key); - var value = this._getCurrentValue(service.get('serviceName'), key, propertyName, this.get('selectedConfigGroup')); + /** if property exists and has value **/ + var cp = configProperties.findProperty('name', propertyName); + var value = cp && cp.get('value'); + if (!Em.isNone(value)) { - var dependentProperty = this.get('_dependentConfigValues').findProperty('propertyName', propertyName); - if (dependentProperty) { - if (value != configs[key].properties[propertyName]) { - Em.set(dependentProperty, 'value', value); - Em.set(dependentProperty, 'recommendedValue', configs[key].properties[propertyName]); - } - } else { - var configGroup = this.get('selectedConfigGroup.isDefault') ? - service.get('serviceName') + ' Default' : this.get('groupsToSave')[service.get('serviceName')] || this.get('selectedConfigGroup.name'); - if (value != configs[key].properties[propertyName]) { - this.get('_dependentConfigValues').pushObject({ - saveRecommended: true, - saveRecommendedDefault: true, - fileName: key, - propertyName: propertyName, - configGroup: configGroup, - value: value, - serviceName: service.get('serviceName'), - recommendedValue: configs[key].properties[propertyName] - }); + if (!updateOnlyBoundaries) { //on first initial request we don't need to change values + var dependentProperty = this.get('_dependentConfigValues').findProperty('propertyName', propertyName); + if (dependentProperty) { + if (value != configs[key].properties[propertyName]) { + Em.set(dependentProperty, 'value', value); + Em.set(dependentProperty, 'recommendedValue', configs[key].properties[propertyName]); + } + } else { + if (value != configs[key].properties[propertyName]) { + this.get('_dependentConfigValues').pushObject({ + saveRecommended: true, + saveRecommendedDefault: true, + fileName: key, + propertyName: propertyName, + configGroup: group.get('name'), + value: value, + serviceName: serviceName, + recommendedValue: configs[key].properties[propertyName] + }); + } } } /** @@ -540,42 +552,13 @@ App.EnhancedConfigsMixin = Em.Mixin.create({ if (configs[key].property_attributes[propertyName].max) { stackProperty.set('valueAttributes.maximum', configs[key].property_attributes[propertyName].max); } + if (configs[key].property_attributes[propertyName].step) { + stackProperty.set('valueAttributes.step', configs[key].property_attributes[propertyName].step); + } } } } } } - }, - - /** - * get current value for property by serviceName, tag and ConfigGroup - * @param serviceName - * @param tag - * @param propertyName - * @param configGroup - * @returns {null|Object} - * @private - */ - _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', groupForService); - if (overridenConfig) { - return overridenConfig.get('value'); - } else { - return stepConfig.get('value'); - } - } - } - } - return null; } }); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/f34f2df9/ambari-web/app/models/service_config.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models/service_config.js b/ambari-web/app/models/service_config.js index 7b1f08b..3913fb4 100644 --- a/ambari-web/app/models/service_config.js +++ b/ambari-web/app/models/service_config.js @@ -271,8 +271,7 @@ App.ServiceConfigProperty = Em.Object.extend({ var supportsFinal = this.get('supportsFinal'); var isFinal = this.get('isFinal'); var defaultIsFinal = this.get('defaultIsFinal'); - var isEditable = this.get('isEditable'); - return isEditable && ((defaultValue != null && value !== defaultValue) || (supportsFinal && isFinal !== defaultIsFinal)); + return (defaultValue != null && value !== defaultValue) || (supportsFinal && isFinal !== defaultIsFinal); }.property('value', 'defaultValue', 'isEditable', 'isFinal', 'defaultIsFinal'), /** http://git-wip-us.apache.org/repos/asf/ambari/blob/f34f2df9/ambari-web/app/views/common/configs/widgets/config_widget_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/common/configs/widgets/config_widget_view.js b/ambari-web/app/views/common/configs/widgets/config_widget_view.js index ba441b5..a1aaeab 100644 --- a/ambari-web/app/views/common/configs/widgets/config_widget_view.js +++ b/ambari-web/app/views/common/configs/widgets/config_widget_view.js @@ -56,7 +56,7 @@ App.ConfigWidgetView = Em.View.extend(App.SupportsDependentConfigs, App.WidgetPo * @type {String} */ configLabel: function() { - return this.get('config.displayName') || this.get('config.name'); + return this.get('config.stackConfigProperty.displayName') || this.get('config.displayName') || this.get('config.name'); }.property('config.name', 'config.displayName'), http://git-wip-us.apache.org/repos/asf/ambari/blob/f34f2df9/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js b/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js index 8098337..8e00238 100644 --- a/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js +++ b/ambari-web/app/views/common/configs/widgets/slider_config_widget_view.js @@ -51,11 +51,11 @@ App.SliderConfigWidgetView = App.ConfigWidgetView.extend({ if (self.get('slider')) { self.get('slider').destroy(); self.initSlider(); - if (self.get('config.value') > valueAttributes.get('maximum')) { - self.set('mirrorValue', valueAttributes.get('maximum')) + if (self.get('config.value') > Em.get(valueAttributes, 'maximum')) { + self.set('mirrorValue', Em.get(valueAttributes, 'maximum')) } - if (self.get('config.value') < valueAttributes.get('minimum')) { - self.set('mirrorValue', valueAttributes.get('minimum')) + if (self.get('config.value') < Em.get(valueAttributes, 'minimum')) { + self.set('mirrorValue', Em.get(valueAttributes, 'minimum')) } } })
