Updated Branches: refs/heads/trunk 2b21ff7ed -> 5eeb4241d
AMBARI-4199 Add Service Wizard: Installed services configs have only default config group. (Denys Buzhor via atkach) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/5eeb4241 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/5eeb4241 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/5eeb4241 Branch: refs/heads/trunk Commit: 5eeb4241d2ab269669aa5f6b8f4d054545d46428 Parents: 2b21ff7 Author: atkach <[email protected]> Authored: Tue Dec 31 14:30:53 2013 +0200 Committer: atkach <[email protected]> Committed: Tue Dec 31 14:30:53 2013 +0200 ---------------------------------------------------------------------- .../controllers/main/service/info/configs.js | 2 +- ambari-web/app/controllers/wizard.js | 6 + .../app/controllers/wizard/step7_controller.js | 222 +++++++++++++++++++ .../app/controllers/wizard/step8_controller.js | 24 +- ambari-web/app/models/config_group.js | 9 + ambari-web/app/utils/config.js | 5 + 6 files changed, 266 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/5eeb4241/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 abc2d72..5c9b97f 100644 --- a/ambari-web/app/controllers/main/service/info/configs.js +++ b/ambari-web/app/controllers/main/service/info/configs.js @@ -379,7 +379,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({ //STEP 3: Load advanced configs from server var advancedConfigs = App.config.loadAdvancedConfig(serviceName) || []; //STEP 4: Load on-site config by service from server - var configGroups = App.router.get('configurationController').getConfigsByTags(this.get('serviceConfigTags')); + var configGroups = App.router.get('configurationController').getConfigsByTags(this.get('serviceConfigTags')); //STEP 5: Merge global and on-site configs with pre-defined var configSet = App.config.mergePreDefinedWithLoaded(configGroups, advancedConfigs, this.get('serviceConfigTags'), serviceName); configSet = App.config.syncOrderWithPredefined(configSet); http://git-wip-us.apache.org/repos/asf/ambari/blob/5eeb4241/ambari-web/app/controllers/wizard.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/wizard.js b/ambari-web/app/controllers/wizard.js index 2a1351f..2a680dd 100644 --- a/ambari-web/app/controllers/wizard.js +++ b/ambari-web/app/controllers/wizard.js @@ -744,11 +744,15 @@ App.WizardController = Em.Controller.extend({ */ saveServiceConfigGroups: function (stepController) { var serviceConfigGroups = []; + var isForUpdate = false; stepController.get('stepConfigs').forEach(function (service) { + // mark group of installed service + if (service.get('selected') === false) isForUpdate = true; service.get('configGroups').forEach(function (configGroup) { var properties = []; configGroup.get('properties').forEach(function (property) { properties.push({ + isRequiredByAgent: property.get('isRequiredByAgent'), name: property.get('name'), value: property.get('value'), filename: property.get('filename') @@ -756,11 +760,13 @@ App.WizardController = Em.Controller.extend({ }); //configGroup copied into plain JS object to avoid Converting circular structure to JSON serviceConfigGroups.push({ + id: configGroup.get('id'), name: configGroup.get('name'), description: configGroup.get('description'), hosts: configGroup.get('hosts'), properties: properties, isDefault: configGroup.get('isDefault'), + isForUpdate: isForUpdate, service: {id: configGroup.get('service.id')} }); }, this) http://git-wip-us.apache.org/repos/asf/ambari/blob/5eeb4241/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 d4ef666..ae8636d 100644 --- a/ambari-web/app/controllers/wizard/step7_controller.js +++ b/ambari-web/app/controllers/wizard/step7_controller.js @@ -54,6 +54,8 @@ App.WizardStep7Controller = Em.Controller.extend({ selectedConfigGroup: null, + serviceConfigsData: require('data/service_configs'), + isSubmitDisabled: function () { return (!this.stepConfigs.filterProperty('showConfig', true).everyProperty('errorCount', 0) || this.get("miscModalVisible")); }.property('[email protected]', 'miscModalVisible'), @@ -81,7 +83,223 @@ App.WizardStep7Controller = Em.Controller.extend({ this.set('filter', ''); this.get('filterColumns').setEach('selected', false); }, + /** + * Load config groups for installed services + */ + loadInstalledServicesConfigGroups: function (servicesNames) { + if (servicesNames.indexOf('MISC') > -1) + servicesNames.splice(servicesNames.indexOf('MISC'), 1); + servicesNames.forEach(function(serviceName) { + App.ajax.send({ + name: 'config.tags_and_groups', + sender: this, + data: { + serviceName: serviceName, + serviceConfigsDef: App.config.get('preDefinedServiceConfigs').findProperty('serviceName', serviceName) + }, + success: 'loadServiceTagsSuccess' + }); + }, this); + }, + + /** + * Load config groups success callback + */ + loadServiceTagsSuccess: function (data, opt, params) { + var serviceConfigsDef = params.serviceConfigsDef; + var serviceName = params.serviceName; + var service = this.get('stepConfigs').findProperty('serviceName', serviceName); + console.debug("loadServiceConfigs(): data=", data); + // Create default configuration group + var defaultConfigGroupHosts = App.Host.find().mapProperty('hostName'); + var selectedConfigGroup; + var siteToTagMap = {}; + for (var site in data.Clusters.desired_configs) { + if (serviceConfigsDef.sites.indexOf(site) > -1) { + siteToTagMap[site] = data.Clusters.desired_configs[site].tag; + } + } + this.loadedClusterSiteToTagMap = siteToTagMap; + //parse loaded config groups + if (App.supports.hostOverrides) { + var configGroups = []; + if (data.config_groups.length) { + data.config_groups.forEach(function (item) { + item = item.ConfigGroup; + if (item.tag === serviceName) { + var groupHosts = item.hosts.mapProperty('host_name'); + var newConfigGroup = App.ConfigGroup.create({ + id: item.id, + name: item.group_name, + description: item.description, + isDefault: false, + parentConfigGroup: null, + service: App.Service.find().findProperty('serviceName', item.tag), + hosts: groupHosts, + configSiteTags: [] + }); + groupHosts.forEach(function (host) { + defaultConfigGroupHosts = defaultConfigGroupHosts.without(host); + }, this); + item.desired_configs.forEach(function (config) { + newConfigGroup.configSiteTags.push(App.ConfigSiteTag.create({ + site: config.type, + tag: config.tag + })); + }, this); + configGroups.push(newConfigGroup); + } + }, this); + } + } + var defaultConfigGroup = App.ConfigGroup.create({ + name: App.Service.DisplayNames[serviceName] + " Default", + description: "Default cluster level " + serviceName + " configuration", + isDefault: true, + hosts: defaultConfigGroupHosts, + parentConfigGroup: null, + service: Em.Object.create({ + id: serviceName + }), + serviceName: serviceName, + configSiteTags: [] + }); + if (!selectedConfigGroup) { + selectedConfigGroup = defaultConfigGroup; + } + configGroups.sort(function(configGroupA, configGroupB){ + return (configGroupA.name > configGroupB.name); + }); + configGroups.unshift(defaultConfigGroup); + if (App.supports.hostOverrides) { + service.set('configGroups', configGroups); + var loadedGroupToOverrideSiteToTagMap = {}; + if (App.supports.hostOverrides) { + var configGroupsWithOverrides = selectedConfigGroup.get('isDefault') ? service.get('configGroups') : [selectedConfigGroup]; + configGroupsWithOverrides.forEach(function (item) { + var groupName = item.get('name'); + loadedGroupToOverrideSiteToTagMap[groupName] = {}; + item.get('configSiteTags').forEach(function (siteTag) { + var site = siteTag.get('site'); + var tag = siteTag.get('tag'); + loadedGroupToOverrideSiteToTagMap[groupName][site] = tag; + }, this); + }, this); + } + App.config.loadServiceConfigHostsOverrides(service.get('configs'), loadedGroupToOverrideSiteToTagMap, service.get('configGroups')); + var serviceConfig = App.config.createServiceConfig(serviceName); + if (serviceConfig.get('serviceName') === 'HDFS') { + App.config.OnNnHAHideSnn(serviceConfig); + } + service.set('selectedConfigGroup', selectedConfigGroup); + this.loadComponentConfigs(service.get('configs'), serviceConfig, service); + } + service.set('configs', serviceConfig.get('configs')); + }, + + loadComponentConfigs: function (configs, componentConfig, component) { + var localDB = App.router.get('mainServiceInfoConfigsController').getInfoForDefaults(); + var recommendedDefaults = {}; + var s = this.get('serviceConfigsData').findProperty('serviceName', component.get('serviceName')); + var defaultGroupSelected = component.get('selectedConfigGroup.isDefault'); + var defaults = []; + if (s.defaultsProviders) { + s.defaultsProviders.forEach(function(defaultsProvider) { + var d = defaultsProvider.getDefaults(localDB); + defaults.push(d); + for (var name in d) { + recommendedDefaults[name] = d[name]; + } + }); + } + if (s.configsValidator) { + s.configsValidator.set('recommendedDefaults', recommendedDefaults); + } + configs.forEach(function (_serviceConfigProperty) { + console.log("config", _serviceConfigProperty); + if (!_serviceConfigProperty) return; + var overrides = _serviceConfigProperty.get('overrides'); + // we will populate the override properties below + _serviceConfigProperty.set('overrides', null); + + if (_serviceConfigProperty.isOverridable === undefined) { + _serviceConfigProperty.set('isOverridable', true); + } + if (_serviceConfigProperty.displayType === 'checkbox') { + switch (_serviceConfigProperty.value) { + case 'true': + _serviceConfigProperty.set('value', true); + _serviceConfigProperty.set('defaultValue', true); + break; + case 'false': + _serviceConfigProperty.set('value', false); + _serviceConfigProperty.set('defaultValue', false); + break; + } + } + var serviceConfigProperty = App.ServiceConfigProperty.create(_serviceConfigProperty); + if (serviceConfigProperty.get('serviceName') === component.get('serviceName')) { + if (s.configsValidator) { + var validators = s.configsValidator.get('configValidators'); + for (var validatorName in validators) { + if (serviceConfigProperty.name == validatorName) { + serviceConfigProperty.set('serviceValidator', s.configsValidator); + } + } + } + serviceConfigProperty.set('isVisible', true); + console.log("config result", serviceConfigProperty); + } else { + serviceConfigProperty.set('isVisible', false); + } + if (overrides != null) { + overrides.forEach(function (override) { + var newSCP = App.ServiceConfigProperty.create(_serviceConfigProperty); + newSCP.set('value', override.value); + newSCP.set('isOriginalSCP', false); // indicated this is overridden value, + newSCP.set('parentSCP', _serviceConfigProperty); + if (App.supports.hostOverrides && defaultGroupSelected) { + var group = component.get('configGroups').findProperty('name', override.group.get('name')); + // prevent cycle in proto object, clean link + if (group.get('properties').length == 0) + group.set('properties', Em.A([])); + group.get('properties').push(newSCP); + newSCP.set('group', override.group); + newSCP.set('isEditable', false); + } + var parentOverridesArray = serviceConfigProperty.get('overrides'); + if (parentOverridesArray == null) { + parentOverridesArray = Ember.A([]); + serviceConfigProperty.set('overrides', parentOverridesArray); + } + serviceConfigProperty.get('overrides').pushObject(newSCP); + console.debug("createOverrideProperty(): Added:", newSCP, " to main-property:", serviceConfigProperty) + }, this); + } else { + serviceConfigProperty.set('overrides', Ember.A([])); + } + if (App.get('isAdmin')) { + if(defaultGroupSelected && !this.get('isHostsConfigsPage')){ + serviceConfigProperty.set('isEditable', serviceConfigProperty.get('isReconfigurable')); + } else { + serviceConfigProperty.set('isEditable', false); + } + } else { + serviceConfigProperty.set('isEditable', false); + } + componentConfig.get('configs').pushObject(serviceConfigProperty); + serviceConfigProperty.validate(); + }, this); + var overrideToAdd = this.get('overrideToAdd'); + if (overrideToAdd) { + overrideToAdd = componentConfig.configs.findProperty('name', overrideToAdd.name); + if (overrideToAdd) { + this.addOverrideProperty(overrideToAdd); + component.set('overrideToAdd', null); + } + } + }, /** * On load function */ @@ -131,6 +349,9 @@ App.WizardStep7Controller = Em.Controller.extend({ this.set('stepConfigs', serviceConfigs); if (App.supports.hostOverridesInstaller) { this.loadConfigGroups(this.get('content.configGroups')); + var installedServicesConfigs = this.get('stepConfigs').filterProperty('selected', false); + if (installedServicesConfigs.length > 0 && !storedConfigs) + this.loadInstalledServicesConfigGroups(installedServicesConfigs.mapProperty('serviceName')); } this.activateSpecialConfigs(); this.set('selectedService', this.get('stepConfigs').filterProperty('showConfig', true).objectAt(0)); @@ -209,6 +430,7 @@ App.WizardStep7Controller = Em.Controller.extend({ var serviceConfigs = this.get('selectedService.configs'); var selectedGroup = this.get('selectedConfigGroup'); var overrideToAdd = this.get('overrideToAdd'); + if(!selectedGroup) return; var displayedConfigGroups = (selectedGroup.get('isDefault')) ? this.get('selectedService.configGroups').filterProperty('isDefault', false) : [this.get('selectedConfigGroup')]; http://git-wip-us.apache.org/repos/asf/ambari/blob/5eeb4241/ambari-web/app/controllers/wizard/step8_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/wizard/step8_controller.js b/ambari-web/app/controllers/wizard/step8_controller.js index c607031..634ffc4 100644 --- a/ambari-web/app/controllers/wizard/step8_controller.js +++ b/ambari-web/app/controllers/wizard/step8_controller.js @@ -1485,6 +1485,7 @@ App.WizardStep8Controller = Em.Controller.extend({ var configGroups = this.get('content.configGroups').filterProperty('isDefault', false); var clusterName = this.get('clusterName'); var sendData = []; + var updateData = []; var serviceConfigController = App.router.get('mainServiceInfoConfigsController'); configGroups.forEach(function (configGroup) { var groupConfigs = []; @@ -1504,11 +1505,26 @@ App.WizardStep8Controller = Em.Controller.extend({ groupConfigs.push(Em.Object.create(property)); }); groupData.desired_configs = serviceConfigController.buildGroupDesiredConfigs.call(serviceConfigController, groupConfigs); - sendData.push({"ConfigGroup": groupData}); + // check for group from installed service + if (configGroup.isForUpdate === true) { + // if group is a new one, create it + if (!configGroup.id) { + sendData.push({"ConfigGroup": groupData}); + } else { + // update an existing group + groupData.id = configGroup.id; + updateData.push({"ConfigGroup": groupData}); + } + } else { + sendData.push({"ConfigGroup": groupData}); + } }, this); if (sendData.length > 0) { this.applyConfigurationGroups(sendData); } + if (updateData.length > 0) { + this.applyInstalledServicesConfigurationGroup(updateData); + } }, applyConfigurationGroups: function (sendData) { @@ -1520,6 +1536,12 @@ App.WizardStep8Controller = Em.Controller.extend({ }); }, + applyInstalledServicesConfigurationGroup: function (updateData) { + updateData.forEach(function(item) { + App.router.get('mainServiceInfoConfigsController').putConfigGroupChanges(item); + }); + }, + createGlobalSiteObj: function () { var globalSiteProperties = {}; var globalSiteObj = this.get('globals'); http://git-wip-us.apache.org/repos/asf/ambari/blob/5eeb4241/ambari-web/app/models/config_group.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models/config_group.js b/ambari-web/app/models/config_group.js index 1bfc348..0c19507 100644 --- a/ambari-web/app/models/config_group.js +++ b/ambari-web/app/models/config_group.js @@ -78,6 +78,15 @@ App.ConfigGroup = Ember.Object.extend({ hosts: [], /** + * In add service wizard we have installed services. + * And on deploy step we need to update existing config groups + * also mark it for be sure that config group data came from + * installed service. + * + */ + isForUpdate: false, + + /** * Provides a display friendly name. This includes trimming * names to a certain length. */ http://git-wip-us.apache.org/repos/asf/ambari/blob/5eeb4241/ambari-web/app/utils/config.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js index c0f210f..610748a 100644 --- a/ambari-web/app/utils/config.js +++ b/ambari-web/app/utils/config.js @@ -391,6 +391,7 @@ App.config = Em.Object.create({ configData.overrides = stored.overrides; configData.filename = stored.filename; configData.description = stored.description; + configData.isRequiredByAgent = (configData.isRequiredByAgent !== undefined) ? configData.isRequiredByAgent : true; } else if (!preDefined && stored) { configData = { @@ -411,6 +412,7 @@ App.config = Em.Object.create({ this.calculateConfigProperties(configData, isAdvanced, advancedConfigs); } else if (preDefined && !stored) { configData = preDefined; + configData.isRequiredByAgent = (configData.isRequiredByAgent !== undefined) ? configData.isRequiredByAgent : true; if (isAdvanced) { var advanced = advancedConfigs.findProperty('name', configData.name); configData.value = configData.displayType == "password" ? '' : advanced.value; @@ -815,6 +817,9 @@ App.config = Em.Object.create({ if (!(overrides in serviceConfig)) { serviceConfig.overrides = []; } + if (!serviceConfig.overrides) { + serviceConfig.set('overrides', []); + } console.log("loadServiceConfigHostsOverrides(): [" + group + "] OVERRODE(" + serviceConfig.name + "): " + serviceConfig.value + " -> " + hostOverrideValue); serviceConfig.overrides.push({value: hostOverrideValue, group: group}); }
