AMBARI-6537 Add Service Wizard: adding a service turns on restart indicator for all services. (Buzhor Denys via ababiichuk)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4a2307c6 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4a2307c6 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4a2307c6 Branch: refs/heads/trunk Commit: 4a2307c6e21c386fbe2e421ca41916601e780728 Parents: 7781586 Author: aBabiichuk <ababiic...@cybervisiontech.com> Authored: Fri Jul 18 12:57:53 2014 +0300 Committer: aBabiichuk <ababiic...@cybervisiontech.com> Committed: Fri Jul 18 12:57:53 2014 +0300 ---------------------------------------------------------------------- ambari-web/app/controllers/installer.js | 2 +- .../app/controllers/main/admin/security.js | 26 +++--- .../controllers/main/service/info/configs.js | 9 +- ambari-web/app/controllers/wizard.js | 19 +++-- .../app/controllers/wizard/step7_controller.js | 88 ++++++++++---------- .../app/controllers/wizard/step8_controller.js | 74 +++++++++------- ambari-web/app/utils/config.js | 1 + 7 files changed, 119 insertions(+), 100 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/4a2307c6/ambari-web/app/controllers/installer.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/installer.js b/ambari-web/app/controllers/installer.js index 00f186a..a563ec2 100644 --- a/ambari-web/app/controllers/installer.js +++ b/ambari-web/app/controllers/installer.js @@ -58,7 +58,7 @@ App.InstallerController = App.WizardController.extend({ 'selectedServiceNames', 'serviceConfigGroups', 'serviceConfigProperties', - 'configsToUpdate', + 'fileNamesToUpdate', 'bootStatus', 'stacksVersions', 'currentStep', http://git-wip-us.apache.org/repos/asf/ambari/blob/4a2307c6/ambari-web/app/controllers/main/admin/security.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/admin/security.js b/ambari-web/app/controllers/main/admin/security.js index 8ed62c5..308fc80 100644 --- a/ambari-web/app/controllers/main/admin/security.js +++ b/ambari-web/app/controllers/main/admin/security.js @@ -288,19 +288,21 @@ App.MainAdminSecurityController = Em.Controller.extend({ tagName: this.get('tag.hdfs-site') } ]; + var self = this; - var data = App.router.get('configurationController').getConfigsByTags(tags); - var configs = data.findProperty('tag', this.get('tag.hadoop-env')).properties; - if (configs && (configs['security_enabled'] === 'true' || configs['security_enabled'] === true)) { - this.set('securityEnabled', true); - } - else { - this.set('securityEnabled', false); - var hdfsConfigs = data.findProperty('tag', this.get('tag.hdfs-site')).properties; - this.setNnHaStatus(hdfsConfigs); - } - this.loadUsers(configs); - this.set('dataIsLoaded', true); + App.router.get('configurationController').getConfigsByTags(tags).done(function(data) { + var configs = data.findProperty('tag', self.get('tag.hadoop-env')).properties; + if (configs && (configs['security_enabled'] === 'true' || configs['security_enabled'] === true)) { + self.set('securityEnabled', true); + } + else { + self.set('securityEnabled', false); + var hdfsConfigs = data.findProperty('tag', self.get('tag.hdfs-site')).properties; + self.setNnHaStatus(hdfsConfigs); + } + self.loadUsers(configs); + self.set('dataIsLoaded', true); + }); }, setNnHaStatus: function (hdfsConfigs) { http://git-wip-us.apache.org/repos/asf/ambari/blob/4a2307c6/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 27d9967..24e20e7 100644 --- a/ambari-web/app/controllers/main/service/info/configs.js +++ b/ambari-web/app/controllers/main/service/info/configs.js @@ -1667,12 +1667,11 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({ var heapsizeException = ['hadoop_heapsize', 'yarn_heapsize', 'nodemanager_heapsize', 'resourcemanager_heapsize', 'apptimelineserver_heapsize', 'jobhistory_heapsize']; var siteProperties = {}; siteObj.forEach(function (_siteObj) { - if (_siteObj.isRequiredByAgent !== false) { - if (/_heapsize|_newsize|_maxnewsize$/.test(_siteObj.name) && !heapsizeException.contains(_siteObj.name)) { - Em.set(_siteObj, "value", _siteObj.value + "m"); - } - siteProperties[_siteObj.name] = App.config.escapeXMLCharacters(_siteObj.value); + if (_siteObj.isRequiredByAgent == false) return; + if (/_heapsize|_newsize|_maxnewsize$/.test(_siteObj.name) && !heapsizeException.contains(_siteObj.name)) { + Em.set(_siteObj, "value", _siteObj.value + "m"); } + siteProperties[_siteObj.name] = App.config.escapeXMLCharacters(_siteObj.value); switch (siteName) { case 'falcon-startup.properties': case 'falcon-runtime.properties': http://git-wip-us.apache.org/repos/asf/ambari/blob/4a2307c6/ambari-web/app/controllers/wizard.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/wizard.js b/ambari-web/app/controllers/wizard.js index a0ac6e5..e2ba26d 100644 --- a/ambari-web/app/controllers/wizard.js +++ b/ambari-web/app/controllers/wizard.js @@ -817,7 +817,7 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, { */ saveServiceConfigProperties: function (stepController) { var serviceConfigProperties = []; - var updateServiceConfigProperties = []; + var fileNamesToUpdate = []; stepController.get('stepConfigs').forEach(function (_content) { if (_content.serviceName === 'YARN' && !App.supports.capacitySchedulerUi) { @@ -837,6 +837,7 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, { filename: _configProperties.get('filename'), displayType: _configProperties.get('displayType'), isRequiredByAgent: _configProperties.get('isRequiredByAgent'), + hasInitialValue: !!_configProperties.get('hasInitialValue'), isRequired: _configProperties.get('isRequired') // flag that allow saving property with empty value }; serviceConfigProperties.push(configProperty); @@ -846,23 +847,23 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, { // get only modified configs var configs = _content.get('configs').filterProperty('isNotDefaultValue').filter(function (config) { var notAllowed = ['masterHost', 'masterHosts', 'slaveHosts', 'slaveHost']; - return !notAllowed.contains(config.get('displayType')); + return !notAllowed.contains(config.get('displayType')) && !!config.filename; }); // if modified configs detected push all service's configs for update - if (configs.length) - updateServiceConfigProperties = updateServiceConfigProperties.concat(serviceConfigProperties.filterProperty('serviceName', _content.get('serviceName'))); + if (configs.length) { + fileNamesToUpdate = fileNamesToUpdate.concat(configs.mapProperty('filename').uniq()); + } // watch for properties that are not modified but have to be updated if (_content.get('configs').someProperty('forceUpdate')) { // check for already added modified properties - if (!updateServiceConfigProperties.findProperty('serviceName', _content.get('serviceName'))) { - updateServiceConfigProperties = updateServiceConfigProperties.concat(serviceConfigProperties.filterProperty('serviceName', _content.get('serviceName'))); - } + var forceUpdatedFileNames = configs.filterProperty('forceUpdate', true).mapProperty('filename').uniq(); + fileNamesToUpdate = fileNamesToUpdate.concat(forceUpdatedFileNames).uniq(); } } }, this); this.setDBProperty('serviceConfigProperties', serviceConfigProperties); this.set('content.serviceConfigProperties', serviceConfigProperties); - this.setDBProperty('configsToUpdate', updateServiceConfigProperties); + this.setDBProperty('fileNamesToUpdate', fileNamesToUpdate); }, /** * save Config groups @@ -1021,4 +1022,4 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, { getCluster: function () { return jQuery.extend({}, this.get('clusterStatusTemplate'), {name: App.router.getClusterName()}); } -}); \ No newline at end of file +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/4a2307c6/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 5911f1b..41ea574 100644 --- a/ambari-web/app/controllers/wizard/step7_controller.js +++ b/ambari-web/app/controllers/wizard/step7_controller.js @@ -648,7 +648,7 @@ App.WizardStep7Controller = Em.Controller.extend({ } this.clearStep(); App.config.setPreDefinedServiceConfigs(); - + var self = this; //STEP 1: Load advanced configs var advancedConfigs = this.get('content.advancedServiceConfig'); //STEP 2: Load on-site configs by service from local DB @@ -671,14 +671,21 @@ App.WizardStep7Controller = Em.Controller.extend({ this.set('groupsToDelete', this.get('wizardController').getDBProperty('groupsToDelete') || []); if (this.get('wizardController.name') === 'addServiceController') { - this.setInstalledServiceConfigs(this.get('serviceConfigTags'), configs); + App.router.get('configurationController').getConfigsByTags(this.get('serviceConfigTags')).done(function (loadedConfigs) { + self.setInstalledServiceConfigs(self.get('serviceConfigTags'), configs, loadedConfigs); + self.applyServicesConfigs(configs, storedConfigs); + }); + } else { + this.applyServicesConfigs(configs, storedConfigs); } + }, + + applyServicesConfigs: function (configs, storedConfigs) { if (this.get('allSelectedServiceNames').contains('STORM') || this.get('installedServiceNames').contains('STORM')) { this.resolveServiceDependencyConfigs('STORM', configs); } //STEP 6: Distribute configs by service and wrap each one in App.ServiceConfigProperty (configs -> serviceConfigs) this.setStepConfigs(configs, storedConfigs); - this.checkHostOverrideInstaller(); this.activateSpecialConfigs(); this.selectProperService(); @@ -686,7 +693,6 @@ App.WizardStep7Controller = Em.Controller.extend({ App.router.send('next'); } }, - /** * If <code>App.supports.hostOverridesInstaller</code> is enabled should load config groups * and (if some services are already installed) load config groups for installed services @@ -802,51 +808,49 @@ App.WizardStep7Controller = Em.Controller.extend({ * @param configs * @method setInstalledServiceConfigs */ - setInstalledServiceConfigs: function (serviceConfigTags, configs) { + setInstalledServiceConfigs: function (serviceConfigTags, configs, configsByTags) { var configsMap = {}; var configTypeMap = {}; var configMixin = App.get('config'); var self = this; - App.router.get('configurationController').getConfigsByTags(serviceConfigTags).done(function (configsByTags) { - configsByTags.forEach(function (configSite) { - $.extend(configsMap, configSite.properties); - for (var name in configSite.properties) { - configTypeMap[name] = configSite.type; - } - }); - configs.forEach(function (_config) { - if (!Em.isNone(configsMap[_config.name])) { - // prevent overriding already edited properties - if (_config.defaultValue != configsMap[_config.name]) - _config.value = configsMap[_config.name]; - _config.defaultValue = configsMap[_config.name]; - _config.hasInitialValue = true; - App.config.handleSpecialProperties(_config); - delete configsMap[_config.name]; - } - }); - - self.setServiceDatabaseConfigs(configs); - //add user properties - for (var name in configsMap) { - configs.push(configMixin.addUserProperty({ - id: 'site property', - name: name, - serviceName: configMixin.getServiceNameByConfigType(configTypeMap[name]), - value: configsMap[name], - defaultValue: configsMap[name], - filename: (configMixin.get('filenameExceptions').contains(configTypeMap[name])) ? configTypeMap[name] : configTypeMap[name] + '.xml', - category: 'Advanced', - isUserProperty: true, - isOverridable: true, - overrides: [], - isRequired: true, - isVisible: true, - showLabel: true - }, false, [])); + configsByTags.forEach(function (configSite) { + $.extend(configsMap, configSite.properties); + for (var name in configSite.properties) { + configTypeMap[name] = configSite.type; + } + }); + configs.forEach(function (_config) { + if (!Em.isNone(configsMap[_config.name])) { + // prevent overriding already edited properties + if (_config.defaultValue != configsMap[_config.name]) + _config.value = configsMap[_config.name]; + _config.defaultValue = configsMap[_config.name]; + _config.hasInitialValue = true; + App.config.handleSpecialProperties(_config); + delete configsMap[_config.name]; } }); + self.setServiceDatabaseConfigs(configs); + //add user properties + for (var name in configsMap) { + configs.push(configMixin.addUserProperty({ + id: 'site property', + name: name, + serviceName: configMixin.getServiceNameByConfigType(configTypeMap[name]), + value: configsMap[name], + defaultValue: configsMap[name], + filename: (configMixin.get('filenameExceptions').contains(configTypeMap[name])) ? configTypeMap[name] : configTypeMap[name] + '.xml', + category: 'Advanced', + hasInitialValue: true, + isUserProperty: true, + isOverridable: true, + overrides: [], + isRequired: true, + isVisible: true, + showLabel: true + }, false, [])); + } }, /** * Check if Oozie or Hive use existing database then need http://git-wip-us.apache.org/repos/asf/ambari/blob/4a2307c6/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 8545c01..5dccf72 100644 --- a/ambari-web/app/controllers/wizard/step8_controller.js +++ b/ambari-web/app/controllers/wizard/step8_controller.js @@ -820,44 +820,32 @@ App.WizardStep8Controller = Em.Controller.extend({ * Update configurations for installed services. * Do separated PUT-request for each siteName for each service * - * @param {Array} configsToUpdate - configs need to update - * Format: - * <code> - * [ - * {serviceName: 's1', id: 'site property', filename: 'f1.xml', name: 'n1', value: 'v1'}, - * {serviceName: 's2', id: 'site property', filename: 'f1.xml', name: 'n2', value: 'v2'}, - * {serviceName: 's2', id: '', filename: 'f2.xml', name: 'n3', value: 'v3'} - * ] - * </code> + * @param {Array} fileNamesToUpdate - file names that should be updated * @method updateConfigurations */ - updateConfigurations: function (configsToUpdate) { + updateConfigurations: function (fileNamesToUpdate) { var configurationController = App.router.get('mainServiceInfoConfigsController'); - var configs = configsToUpdate.filter(function(config) { - return !!config.filename && !/^(core)/.test(config.filename) && config.filename.indexOf('env')==-1; - }); - var serviceNames = configs.mapProperty('serviceName').uniq(); + var configs = this.get('configs').slice(0); var configsMap = []; - serviceNames.forEach(function (serviceName) { - var serviceConfigs = configs.filterProperty('serviceName', serviceName); + fileNamesToUpdate.forEach(function(fileName){ + if (!fileName || /^(core)/.test(fileName)) return; var tagName = 'version' + (new Date).getTime(); - serviceConfigs.forEach(function(config) { - config.value = App.config.trimProperty(config, false); + var configsToSave = configs.filterProperty('filename', fileName); + configsToSave.forEach(function(item) { + item.value = App.config.trimProperty(item, false); }); - serviceConfigs.mapProperty('filename').uniq().forEach(function (siteName) { - configsMap.push(configurationController.createSiteObj(siteName.replace(".xml", ""), tagName, serviceConfigs.filterProperty('filename', siteName))); - }); - }); + configsMap.push(configurationController.createSiteObj(fileName.replace(".xml", ""), tagName, configsToSave)); + }, this); if (!configsMap.length) return; - var configData = configsMap.map(function (_serviceConfig) { + var configData = configsMap.map(function (siteConfigObject) { return JSON.stringify({ Clusters: { desired_config: { - type: _serviceConfig.type, - tag: _serviceConfig.tag, - properties: _serviceConfig.properties + type: siteConfigObject.type, + tag: siteConfigObject.tag, + properties: siteConfigObject.properties } } }); @@ -987,8 +975,8 @@ App.WizardStep8Controller = Em.Controller.extend({ this.createCluster(); this.createSelectedServices(); if (this.get('content.controllerName') !== 'addHostController') { - if (this.get('wizardController').getDBProperty('configsToUpdate') && this.get('wizardController').getDBProperty('configsToUpdate').length) { - this.updateConfigurations(this.get('wizardController').getDBProperty('configsToUpdate')); + if (this.get('wizardController').getDBProperty('fileNamesToUpdate') && this.get('wizardController').getDBProperty('fileNamesToUpdate').length) { + this.updateConfigurations(this.get('wizardController').getDBProperty('fileNamesToUpdate')); } this.createConfigurations(); this.applyConfigurationsToCluster(); @@ -1363,6 +1351,30 @@ App.WizardStep8Controller = Em.Controller.extend({ }, /** + * Compare generated config object with current configs that were filled + * on "Customize Services" page. + * + * @param {Object} properties - generated by createSiteObj|createCoreSiteObj + * @param {Array} configs - current configs to compare + * @return {Boolean} + * @method isConfigsChanged + **/ + isConfigsChanged: function (properties, configs) { + var isChanged = false; + for (var property in properties) { + var config = configs.findProperty('name', property); + // if config not found then it's looks like a new config + if (!config) { + isChanged = true; + } else { + if (!config.hasInitialValue || config.isNotDefaultValue) { + isChanged = true; + } + } + } + return isChanged; + }, + /** * Create config objects for cluster and services * @method createConfigurations */ @@ -1380,9 +1392,9 @@ App.WizardStep8Controller = Em.Controller.extend({ if (this.get('content.controllerName') == 'addServiceController') { tag = 'version' + (new Date).getTime(); coreSiteObject.tag = tag; - this.get('serviceConfigTags').pushObject(coreSiteObject); - //for Add Service save config of new and installed services either - selectedServices = selectedServices.concat(this.get('installedServices')); + var coreSiteConfigs = this.get('configs').filterProperty('filename','core-site.xml'); + if (this.isConfigsChanged(coreSiteObject.properties, coreSiteConfigs)) + this.get('serviceConfigTags').pushObject(coreSiteObject); } var objMap = { http://git-wip-us.apache.org/repos/asf/ambari/blob/4a2307c6/ambari-web/app/utils/config.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js index 3c532ea..8402861 100644 --- a/ambari-web/app/utils/config.js +++ b/ambari-web/app/utils/config.js @@ -1002,6 +1002,7 @@ App.config = Em.Object.create({ filename: stored.filename, category: 'Advanced', isUserProperty: stored.isUserProperty === true, + hasInitialValue: !!stored.hasInitialValue, isOverridable: true, overrides: stored.overrides, isRequired: true,