You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ab...@apache.org on 2015/12/18 15:42:42 UTC
ambari git commit: AMBARI-14371 No eventual config changes should not
recommend extra config changes. (ababiichuk)
Repository: ambari
Updated Branches:
refs/heads/trunk d7d0ba288 -> 4c3d38c6f
AMBARI-14371 No eventual config changes should not recommend extra config changes. (ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4c3d38c6
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4c3d38c6
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4c3d38c6
Branch: refs/heads/trunk
Commit: 4c3d38c6f989b72a12b0c1461ba0ffca6d66ee76
Parents: d7d0ba2
Author: AndriyBabiychuk <ba...@gmail.com>
Authored: Fri Dec 18 16:42:35 2015 +0200
Committer: AndriyBabiychuk <ba...@gmail.com>
Committed: Fri Dec 18 16:42:35 2015 +0200
----------------------------------------------------------------------
.../mixins/common/configs/enhanced_configs.js | 80 ++++++++++++++------
ambari-web/app/mixins/common/serverValidator.js | 1 +
.../models/configs/objects/service_config.js | 15 +++-
.../configs/objects/service_config_property.js | 17 +++++
.../app/utils/configs/config_initializer.js | 6 +-
.../utils/configs/config_initializer_class.js | 4 +-
ambari-web/app/views/common/controls_view.js | 4 +-
.../widgets/list_config_widget_view_test.js | 20 ++++-
8 files changed, 113 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/4c3d38c6/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 678ce87..230493b 100644
--- a/ambari-web/app/mixins/common/configs/enhanced_configs.js
+++ b/ambari-web/app/mixins/common/configs/enhanced_configs.js
@@ -261,7 +261,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
configGroup = this.get('selectedConfigGroup');
}
var recommendations = this.get('hostGroups');
- recommendations.blueprint.configurations = blueprintUtils.buildConfigsJSON(this.get('services'), this.get('stepConfigs'));
delete recommendations.config_groups;
var dataToSend = {
@@ -269,9 +268,15 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
hosts: this.get('hostNames'),
services: this.get('serviceNames')
};
- if (changedConfigs) {
- dataToSend.recommend = 'configuration-dependencies';
- dataToSend.changed_configurations = changedConfigs;
+ var clearConfigsOnAddService = this.isConfigHasInitialState();
+ if (clearConfigsOnAddService) {
+ recommendations.blueprint.configurations = this.get('initialConfigValues');
+ } else {
+ recommendations.blueprint.configurations = blueprintUtils.buildConfigsJSON(this.get('services'), this.get('stepConfigs'));
+ if (changedConfigs) {
+ dataToSend.recommend = 'configuration-dependencies';
+ dataToSend.changed_configurations = changedConfigs;
+ }
}
if (!configGroup.get('isDefault') && configGroup.get('hosts.length') > 0) {
var configGroups = this.buildConfigGroupJSON(this.get('selectedService.configs'), configGroup);
@@ -285,7 +290,8 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
stackVersionUrl: App.get('stackVersionURL'),
dataToSend: dataToSend,
selectedConfigGroup: configGroup.get('isDefault') ? null : configGroup.get('name'),
- initial: initial
+ initial: initial,
+ clearConfigsOnAddService: clearConfigsOnAddService
},
success: 'dependenciesSuccess',
error: 'dependenciesError',
@@ -301,6 +307,46 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
},
/**
+ * Defines if there is any changes made by user.
+ * Check all properties except recommended properties from popup
+ *
+ * @returns {boolean}
+ */
+ isConfigHasInitialState: function() {
+ return !this.get('stepConfigs').filter(function(stepConfig) {
+ return stepConfig.get('changedConfigProperties').filter(function(c) {
+ return !this.get('changedProperties').map(function(changed) {
+ return App.config.configId(changed.propertyName, changed.fileName);
+ }).contains(App.config.configId(c.get('name'), c.get('filename')));
+ }, this).length;
+ }, this).length;
+ },
+
+
+ /**
+ * Set all config values to their default (initialValue)
+ */
+ clearConfigValues: function() {
+ this.get('stepConfigs').forEach(function(stepConfig) {
+ stepConfig.get('changedConfigProperties').forEach(function(c) {
+ var recommendedProperty = this.get('_dependentConfigValues').find(function(d) {
+ return App.config.configId(d.propertyName, d.fileName) == App.config.configId(c.get('name'), c.get('filename'));
+ });
+ if (recommendedProperty) {
+ var initialValue = recommendedProperty.value;
+ if (Em.isNone(initialValue)) {
+ stepConfig.get('configs').removeObject(c);
+ } else {
+ c.set('value', initialValue);
+ c.set('recommendedValue', initialValue);
+ }
+ this.get('_dependentConfigValues').removeObject(recommendedProperty);
+ }
+ }, this)
+ }, this);
+ },
+
+ /**
* generates JSON with config group info to send it for recommendations
* @param configs
* @param configGroup
@@ -338,6 +384,10 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
dependenciesSuccess: function (data, opt, params) {
this._saveRecommendedValues(data, params.initial, params.dataToSend.changed_configurations, params.selectedConfigGroup);
this.set("recommendationsConfigs", Em.get(data.resources[0] , "recommendations.blueprint.configurations"));
+ if (params.clearConfigsOnAddService) {
+ this.clearDependenciesForInstalledServices(this.get('installedServiceNames'), this.get('stepConfigs'));
+ this.clearConfigValues();
+ }
if (!params.initial) {
this.updateDependentConfigs();
}
@@ -649,26 +699,6 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
},
/**
- * Add and remove dependencies based on recommendations
- *
- * @param {String[]} [serviceNames=undefined] - list of services to apply changes
- */
- addRemoveDependentConfigs: function(serviceNames) {
- var self = this;
- this.get('stepConfigs').forEach(function(serviceConfigs) {
- if (serviceNames && !serviceNames.contains(serviceConfigs.get('serviceName'))) {
- return;
- }
- var selectedGroup = self.getGroupForService(serviceConfigs.get('serviceName'));
- if (selectedGroup) {
- self._addRecommendedProperties(serviceConfigs, selectedGroup);
- self._removeUnRecommendedProperties(serviceConfigs, selectedGroup);
- }
- });
- },
-
-
- /**
* add configs that was recommended and wasn't present in stepConfigs
* @param stepConfigs
* @param selectedGroup
http://git-wip-us.apache.org/repos/asf/ambari/blob/4c3d38c6/ambari-web/app/mixins/common/serverValidator.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/serverValidator.js b/ambari-web/app/mixins/common/serverValidator.js
index b3fb3ad..0306a97 100644
--- a/ambari-web/app/mixins/common/serverValidator.js
+++ b/ambari-web/app/mixins/common/serverValidator.js
@@ -149,6 +149,7 @@ App.ServerValidatorMixin = Em.Mixin.create({
})
}
+ this.set('initialConfigValues', recommendations.blueprint.configurations);
return App.ajax.send({
'name': 'config.recommendations',
'sender': this,
http://git-wip-us.apache.org/repos/asf/ambari/blob/4c3d38c6/ambari-web/app/models/configs/objects/service_config.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/configs/objects/service_config.js b/ambari-web/app/models/configs/objects/service_config.js
index f5da880..2bc151b 100644
--- a/ambari-web/app/models/configs/objects/service_config.js
+++ b/ambari-web/app/models/configs/objects/service_config.js
@@ -60,7 +60,7 @@ App.ServiceConfig = Ember.Object.extend({
}.observes('configsWithErrors'),
observeForeignKeys: function() {
- //TODO refactor or move this login to other place
+ //TODO refactor or move this logic to other place
var configs = this.get('configs');
configs.forEach(function (item) {
if (item.get('isVisible')) {
@@ -103,6 +103,19 @@ App.ServiceConfig = Ember.Object.extend({
return configs.someProperty('isNotDefaultValue');
},
+ /**
+ * Collection of properties that were changed:
+ * for saved properties use - <code>isNotDefaultValue<code>
+ * for not saved properties (on wizards, for new services) use
+ * - <code>isNotInitialValue<code>
+ * for added properties use - <code>isNotSaved<code>
+ */
+ changedConfigProperties: function() {
+ return this.get('configs').filter(function(c) {
+ return c.get('isNotDefaultValue') || c.get('isNotSaved') || c.get('isNotInitialValue');
+ }, this);
+ }.property('configs.@each.isNotDefaultValue', 'configs.@each.isNotSaved', 'configs.@each.isNotInitialValue'),
+
isPropertiesChanged: function() {
var requiredByAgent = this.get('configs').filterProperty('isRequiredByAgent');
var isNotSaved = requiredByAgent.someProperty('isNotSaved');
http://git-wip-us.apache.org/repos/asf/ambari/blob/4c3d38c6/ambari-web/app/models/configs/objects/service_config_property.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/configs/objects/service_config_property.js b/ambari-web/app/models/configs/objects/service_config_property.js
index 7a3fbb7..3a4ca3d 100644
--- a/ambari-web/app/models/configs/objects/service_config_property.js
+++ b/ambari-web/app/models/configs/objects/service_config_property.js
@@ -201,6 +201,23 @@ App.ServiceConfigProperty = Em.Object.extend({
additionalView: null,
/**
+ * If config is saved we should compare config <code>value<code> with <code>savedValue<code> to
+ * find out if it was changed, but if config in not saved there is no <code>savedValue<code>, so
+ * we should use <code>initialValue<code> instead.
+ */
+ isNotInitialValue: function() {
+ if (Em.isNone(this.get('savedValue')) && !Em.isNone(this.get('initialValue'))) {
+ var value = this.get('value'), initialValue = this.get('initialValue');
+ if (this.get('stackConfigProperty.valueAttributes.type') == 'float') {
+ initialValue = !Em.isNone(initialValue) ? '' + parseFloat(initialValue) : null;
+ value = '' + parseFloat(value);
+ }
+ return initialValue !== value;
+ }
+ return false;
+ }.property('initialValue', 'savedValue', 'value', 'stackConfigProperty.valueAttributes.type'),
+
+ /**
* Is property has active override with error
*/
isValidOverride: function () {
http://git-wip-us.apache.org/repos/asf/ambari/blob/4c3d38c6/ambari-web/app/utils/configs/config_initializer.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/configs/config_initializer.js b/ambari-web/app/utils/configs/config_initializer.js
index 56ff46e..8c156bb 100644
--- a/ambari-web/app/utils/configs/config_initializer.js
+++ b/ambari-web/app/utils/configs/config_initializer.js
@@ -573,7 +573,9 @@ App.ConfigInitializer = App.ConfigInitializerClass.create({
var re = new RegExp(regex);
recommendedValue = recommendedValue.replace(re, replaceWith);
Em.set(configProperty, 'recommendedValue', recommendedValue);
- Em.set(configProperty, 'value', Em.isNone(Em.get(configProperty, 'recommendedValue')) ? '' : recommendedValue);
+ var value = Em.isNone(Em.get(configProperty, 'recommendedValue')) ? '' : recommendedValue;
+ Em.set(configProperty, 'value', value);
+ Em.set(configProperty, 'initialValue', value);
return configProperty;
},
@@ -823,4 +825,4 @@ App.ConfigInitializer = App.ConfigInitializerClass.create({
return allMountPoints;
}
-});
\ No newline at end of file
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/4c3d38c6/ambari-web/app/utils/configs/config_initializer_class.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/configs/config_initializer_class.js b/ambari-web/app/utils/configs/config_initializer_class.js
index eb29702..3e96fca 100644
--- a/ambari-web/app/utils/configs/config_initializer_class.js
+++ b/ambari-web/app/utils/configs/config_initializer_class.js
@@ -160,7 +160,7 @@ App.ConfigInitializerClass = Em.Object.extend({
var args = [].slice.call(arguments);
return this[uniqueInitializer].apply(this, args);
}
-
+ Em.set(configProperty, 'initialValue', Em.get(configProperty, 'value'));
return configProperty;
},
@@ -295,4 +295,4 @@ App.ConfigInitializerClass = Em.Object.extend({
return source;
}
-});
\ No newline at end of file
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/4c3d38c6/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 cef2eb2..2644192 100644
--- a/ambari-web/app/views/common/controls_view.js
+++ b/ambari-web/app/views/common/controls_view.js
@@ -79,14 +79,14 @@ App.SupportsDependentConfigs = Ember.Mixin.create({
* @returns {$.Deferred}
*/
sendRequestRorDependentConfigs: function(config) {
- if (!config || !config.get('isValid')) return $.Deferred().resolve().promise();
+ if (!config || (!config.get('isValid') && config.get('isNotDefaultValue'))) return $.Deferred().resolve().promise();
if (['mainServiceInfoConfigsController','wizardStep7Controller'].contains(this.get('controller.name'))) {
var name = config.get('name');
var saveRecommended = (config.get('value') === config.get('recommendedValue'));
var controller = this.get('controller');
var type = App.config.getConfigTagFromFileName(config.get('filename'));
var p = App.configsCollection.getConfig(App.config.configId(name, type));
- if ((p && Em.get(p, 'propertyDependedBy.length') > 0 || p.displayType === 'user') && config.get('oldValue') !== config.get('value')) {
+ if ((p && Em.get(p, 'propertyDependedBy.length') > 0 || Em.get(p, 'displayType') === 'user') && config.get('oldValue') !== config.get('value')) {
var old = config.get('oldValue');
config.set('oldValue', config.get('value'));
return controller.getRecommendationsForDependencies([{
http://git-wip-us.apache.org/repos/asf/ambari/blob/4c3d38c6/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js b/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js
index d72e38e..16a24e9 100644
--- a/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js
+++ b/ambari-web/test/views/common/configs/widgets/list_config_widget_view_test.js
@@ -129,7 +129,12 @@ describe('App.ListConfigWidgetView', function () {
});
describe('#calculateVal', function () {
-
+ beforeEach(function() {
+ sinon.stub(view, 'sendRequestRorDependentConfigs', Em.K)
+ });
+ afterEach(function() {
+ view.sendRequestRorDependentConfigs.restore();
+ });
it('value updates if some option', function () {
view.toggleOption({context: view.get('options')[2]});
expect(view.get('config.value')).to.equal('2,1,3');
@@ -145,11 +150,15 @@ describe('App.ListConfigWidgetView', function () {
beforeEach(function() {
sinon.stub(view, 'restoreDependentConfigs', Em.K);
- sinon.stub(view.get('controller'), 'removeCurrentFromDependentList', Em.K)
+ sinon.stub(view.get('controller'), 'removeCurrentFromDependentList', Em.K);
+ sinon.stub(view, 'sendRequestRorDependentConfigs', function() {return {
+ done: function() {}
+ }});
});
afterEach(function() {
view.restoreDependentConfigs.restore();
view.get('controller.removeCurrentFromDependentList').restore();
+ view.sendRequestRorDependentConfigs.restore();
});
it('should restore saved value', function () {
view.toggleOption({context: view.get('options')[0]});
@@ -165,6 +174,13 @@ describe('App.ListConfigWidgetView', function () {
describe('#toggleOption', function () {
+ beforeEach(function() {
+ sinon.stub(view, 'sendRequestRorDependentConfigs', Em.K)
+ });
+ afterEach(function() {
+ view.sendRequestRorDependentConfigs.restore();
+ });
+
it('should doesn\'t do nothing if maximum number of options is selected', function () {
view.toggleOption({context: view.get('options')[2]});
expect(view.get('options')[2].get('isSelected')).to.be.true;