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/04/02 11:31:04 UTC
ambari git commit: AMBARI-10324 Add-service wizard should use
enhanced configs when appropriate. (ababiichuk)
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 <ab...@cybervisiontech.com>
Authored: Thu Apr 2 12:24:04 2015 +0300
Committer: aBabiichuk <ab...@cybervisiontech.com>
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 = [