Repository: ambari Updated Branches: refs/heads/trunk d7a4c60d5 -> 382e7f3df
AMBARI-6826 FE: Ambari installer should populate default configs via /recommendations. (ababiichuk) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/382e7f3d Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/382e7f3d Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/382e7f3d Branch: refs/heads/trunk Commit: 382e7f3dfd547e4945caecf03164d939fb19b32c Parents: d7a4c60 Author: aBabiichuk <[email protected]> Authored: Tue Aug 12 15:04:30 2014 +0300 Committer: aBabiichuk <[email protected]> Committed: Tue Aug 12 15:07:37 2014 +0300 ---------------------------------------------------------------------- .../stacks/HDP-2.1/recommendations_configs.json | 175 +++++++++++++++++++ .../controllers/main/service/info/configs.js | 18 +- .../app/controllers/wizard/step7_controller.js | 80 +++++++-- ambari-web/app/data/service_configs.js | 2 + ambari-web/app/models/stack_service.js | 6 +- ambari-web/app/utils/ajax/ajax.js | 19 +- ambari-web/app/utils/config.js | 46 +++-- 7 files changed, 316 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/382e7f3d/ambari-web/app/assets/data/stacks/HDP-2.1/recommendations_configs.json ---------------------------------------------------------------------- diff --git a/ambari-web/app/assets/data/stacks/HDP-2.1/recommendations_configs.json b/ambari-web/app/assets/data/stacks/HDP-2.1/recommendations_configs.json new file mode 100644 index 0000000..4efe599 --- /dev/null +++ b/ambari-web/app/assets/data/stacks/HDP-2.1/recommendations_configs.json @@ -0,0 +1,175 @@ +{ + "hosts": ["ab2test-5.c.pramod-thangali.internal", "ab2test-6.c.pramod-thangali.internal", "ab2test-7.c.pramod-thangali.internal"], + "services": ["HDFS", "MAPREDUCE2", "YARN", "TEZ", "NAGIOS", "GANGLIA", "HIVE", "HCATALOG", "WEBHCAT", "SQOOP", "OOZIE", "ZOOKEEPER", "FALCON", "STORM", "FLUME", "PIG"], + "recommendations": { + "blueprint": { + "host_groups": [ + { + "name": "host-group-3", + "components": [ + { + "name": "NAMENODE" + }, + { + "name": "STORM_UI_SERVER" + }, + { + "name": "GANGLIA_SERVER" + }, + { + "name": "ZOOKEEPER_SERVER" + }, + { + "name": "STORM_REST_API" + }, + { + "name": "NIMBUS" + }, + { + "name": "DRPC_SERVER" + }, + { + "name": "MYSQL_SERVER" + }, + { + "name": "NAGIOS_SERVER" + } + ] + }, + { + "name": "host-group-1", + "components": [ + { + "name": "YARN_CLIENT" + }, + { + "name": "NODEMANAGER" + }, + { + "name": "HDFS_CLIENT" + }, + { + "name": "HIVE_CLIENT" + }, + { + "name": "SQOOP" + }, + { + "name": "GANGLIA_MONITOR" + }, + { + "name": "DATANODE" + }, + { + "name": "FLUME_HANDLER" + }, + { + "name": "MAPREDUCE2_CLIENT" + }, + { + "name": "SUPERVISOR" + }, + { + "name": "OOZIE_CLIENT" + }, + { + "name": "ZOOKEEPER_CLIENT" + }, + { + "name": "PIG" + }, + { + "name": "ZOOKEEPER_SERVER" + }, + { + "name": "JOURNALNODE" + }, + { + "name": "ZKFC" + }, + { + "name": "TEZ_CLIENT" + }, + { + "name": "FALCON_CLIENT" + }, + { + "name": "HCAT" + } + ] + }, + { + "name": "host-group-2", + "components": [ + { + "name": "FALCON_SERVER" + }, + { + "name": "OOZIE_SERVER" + }, + { + "name": "HIVE_SERVER" + }, + { + "name": "APP_TIMELINE_SERVER" + }, + { + "name": "HISTORYSERVER" + }, + { + "name": "HIVE_METASTORE" + }, + { + "name": "ZOOKEEPER_SERVER" + }, + { + "name": "RESOURCEMANAGER" + }, + { + "name": "WEBHCAT_SERVER" + }, + { + "name": "SECONDARY_NAMENODE" + } + ] + } + ], + "configurations": { + "core-site": {}, + "global": { + "properties": {} + }, + "hbase-site": {}, + "hdfs-site": {}, + "yarn-site": {} + } + }, + "blueprint_cluster_binding": { + "host_groups": [ + { + "name": "host-group-3", + "hosts": [ + { + "fqdn": "ab2test-5.c.pramod-thangali.internal" + } + ] + }, + { + "name": "host-group-1", + "hosts": [ + { + "fqdn": "ab2test-7.c.pramod-thangali.internal" + } + ] + }, + { + "name": "host-group-2", + "hosts": [ + { + "fqdn": "ab2test-6.c.pramod-thangali.internal" + } + ] + } + ] + } +}} http://git-wip-us.apache.org/repos/asf/ambari/blob/382e7f3d/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 20b4222..b2cd153 100644 --- a/ambari-web/app/controllers/main/service/info/configs.js +++ b/ambari-web/app/controllers/main/service/info/configs.js @@ -193,6 +193,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({ restartHosts: Em.A(), + //TODO after moving validation/recommendation to BE defaultsInfo must be deleted defaultsInfo: null, /** * On load function @@ -637,7 +638,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({ App.config.OnNnHAHideSnn(serviceConfig); } - if (serviceName || serviceConfig.serviceName === 'MISC') { + if ((serviceName || serviceConfig.serviceName === 'MISC') && !App.supports.serverRecommendValidate) { // set recommended Defaults first then load the configs (including set validator) var s = App.StackService.find().findProperty('serviceName', this.get('content.serviceName')); var defaultsProvider = s.get('defaultsProviders'); @@ -647,6 +648,13 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({ Em.run(this, 'setDefaults'); } } else { + if (App.supports.serverRecommendValidate) { + var serviceConfig = App.config.createServiceConfig(this.get('content.serviceName')); + this.loadConfigs(this.get('allConfigs'), serviceConfig); + this.checkOverrideProperty(serviceConfig); + this.checkDatabaseProperties(serviceConfig); + this.get('stepConfigs').pushObject(serviceConfig); + } this.set('selectedService', this.get('stepConfigs').objectAt(0)); this.checkForSecureConfig(this.get('selectedService')); this.set('dataIsLoaded', true); @@ -656,6 +664,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({ } }, + //TODO after moving validation/recommendation to BE getInfoForDefaults must be deleted setDefaults: function(){ var serviceConfig = App.config.createServiceConfig(this.get('content.serviceName')); this.loadConfigs(this.get('allConfigs'), serviceConfig); @@ -720,6 +729,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({ }, this) }, + //TODO after moving validation/recommendation to BE getInfoForDefaults must be deleted /** * Get info about hosts and host components to configDefaultsProviders * @returns {{masterComponentHosts: Array, slaveComponentHosts: Array, hosts: {}}} @@ -750,6 +760,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({ } }, + //TODO after moving validation/recommendation to BE getInfoForDefaultsSuccessCallback must be deleted getInfoForDefaultsSuccessCallback: function (response) { var defaultsInfo = { masterComponentHosts: this.getMasterComponents(), @@ -760,6 +771,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({ this.setRecommendedDefaults(this.get('advancedConfigs')); }, + //TODO after moving validation/recommendation to BE getSlaveComponents must be deleted /** * parse json response and build slave components array * @param response @@ -790,6 +802,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({ return slaveComponentHosts; }, + //TODO after moving validation/recommendation to BE getMasterComponents must be deleted /** * build master components array of data from HostComponent model * @return {Array} @@ -806,6 +819,8 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({ }); return masterComponentHosts; }, + + //TODO after moving validation/recommendation to BE getHostsInfo must be deleted /** * parse json response and build hosts map * @param response @@ -886,6 +901,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({ } }, + //TODO after moving validation/recommendation to BE setRecommendedDefaults must be deleted /** * set recommended defaults for advanced configs for current service * @param {Array} advancedConfigs http://git-wip-us.apache.org/repos/asf/ambari/blob/382e7f3d/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 0df2bf5..962baa4 100644 --- a/ambari-web/app/controllers/wizard/step7_controller.js +++ b/ambari-web/app/controllers/wizard/step7_controller.js @@ -113,6 +113,8 @@ App.WizardStep7Controller = Em.Controller.extend({ serviceConfigsData: require('data/service_configs'), + recommendedConfigs: null, + /** * Are advanced configs loaded * @type {bool} @@ -383,6 +385,7 @@ App.WizardStep7Controller = Em.Controller.extend({ service.set('configs', serviceConfig.get('configs')); }, + //TODO after moving validation/recommendation to BE _getRecommendedDefaultsForComponent must be deleted /** * Get object with recommended default values for config properties * Format: @@ -414,6 +417,7 @@ App.WizardStep7Controller = Em.Controller.extend({ return recommendedDefaults; }, + //TODO after moving validation/recommendation to BE getInfoForDefaults must be deleted /** * Get info about hosts and host components to configDefaultsProviders * Work specifically in Add Service wizard @@ -596,9 +600,11 @@ App.WizardStep7Controller = Em.Controller.extend({ var s = App.StackService.find(component.get('serviceName')), defaultGroupSelected = component.get('selectedConfigGroup.isDefault'); - if (s && s.get('configsValidator')) { - var recommendedDefaults = this._getRecommendedDefaultsForComponent(component.get('serviceName')); - s.get('configsValidator').set('recommendedDefaults', recommendedDefaults); + if(!App.supports.serverRecommendValidate) { + if (s && s.get('configsValidator')) { + var recommendedDefaults = this._getRecommendedDefaultsForComponent(component.get('serviceName')); + s.get('configsValidator').set('recommendedDefaults', recommendedDefaults); + } } configs.forEach(function (serviceConfigProperty) { @@ -715,12 +721,25 @@ App.WizardStep7Controller = Em.Controller.extend({ 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(); - if (this.get('content.skipConfigStep')) { - App.router.send('next'); + var self = this; + if (App.supports.serverRecommendValidate) { + this.loadDefaultConfigs(function() { + self.setStepConfigs(configs, storedConfigs); + self.checkHostOverrideInstaller(); + self.activateSpecialConfigs(); + self.selectProperService(); + if (self.get('content.skipConfigStep')) { + App.router.send('next'); + } + }); + } else { + this.setStepConfigs(configs, storedConfigs); + this.checkHostOverrideInstaller(); + this.activateSpecialConfigs(); + this.selectProperService(); + if (this.get('content.skipConfigStep')) { + App.router.send('next'); + } } }, /** @@ -751,7 +770,7 @@ App.WizardStep7Controller = Em.Controller.extend({ masterComponentHosts: this.get('wizardController.content.masterComponentHosts'), slaveComponentHosts: this.get('wizardController.content.slaveComponentHosts') }; - var serviceConfigs = App.config.renderConfigs(configs, storedConfigs, this.get('allSelectedServiceNames'), this.get('installedServiceNames'), localDB); + var serviceConfigs = App.config.renderConfigs(configs, storedConfigs, this.get('allSelectedServiceNames'), this.get('installedServiceNames'), localDB, this.get('recommendedConfigs')); if (this.get('wizardController.name') === 'addServiceController') { serviceConfigs.setEach('showConfig', true); serviceConfigs.setEach('selected', false); @@ -806,8 +825,7 @@ App.WizardStep7Controller = Em.Controller.extend({ selectProperService: function () { if (this.get('wizardController.name') === 'addServiceController') { this.set('selectedService', this.get('stepConfigs').filterProperty('selected', true).get('firstObject')); - } - else { + } else { this.set('selectedService', this.get('stepConfigs').filterProperty('showConfig', true).objectAt(0)); } }, @@ -906,6 +924,42 @@ App.WizardStep7Controller = Em.Controller.extend({ }, false, [])); } }, + + loadDefaultConfigs: function(callback) { + var selectedServices = App.StackService.find().filterProperty('isSelected').mapProperty('serviceName'); + var installedServices = App.StackService.find().filterProperty('isInstalled').mapProperty('serviceName'); + var services = installedServices.concat(selectedServices).uniq(); + this.set('isDefaultsLoaded', false); + var hostNames = Object.keys(this.get('content.hosts')); + App.ajax.send({ + 'name': 'wizard.step7.loadrecommendations.configs', + 'sender': this, + 'data': { + stackVersionUrl: App.get('stackVersionURL'), + hosts: hostNames, + services: services, + recommendations: App.router.get('installerController.recommendations') + }, + 'success': 'loadDefaultConfigsSuccess' + }) + .retry({ + times: App.maxRetries, + timeout: App.timeout + }) + .then(function () { + callback(); + }, function () { + App.showReloadPopup(); + console.log('Load recommendations failed'); + }); + }, + + loadDefaultConfigsSuccess: function(data) { + if (!data) { + console.warn('error while loading default config values'); + } + this.set("recommendedConfigs", Em.get(data.resources[0] , "recommendations.blueprint.configurations")); + }, /** * Check if Oozie or Hive use existing database then need * to restore missed properties @@ -1139,7 +1193,7 @@ App.WizardStep7Controller = Em.Controller.extend({ */ activateSpecialConfigs: function () { var miscConfigs = this.get('stepConfigs').findProperty('serviceName', 'MISC').configs; - miscConfigs = App.config.miscConfigVisibleProperty(miscConfigs, this.get('selectedServiceNames')); + App.config.miscConfigVisibleProperty(miscConfigs, this.get('selectedServiceNames')); }, /** http://git-wip-us.apache.org/repos/asf/ambari/blob/382e7f3d/ambari-web/app/data/service_configs.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/data/service_configs.js b/ambari-web/app/data/service_configs.js index bd957df..f7e4442 100644 --- a/ambari-web/app/data/service_configs.js +++ b/ambari-web/app/data/service_configs.js @@ -18,6 +18,7 @@ var App = require('app'); require('models/service_config'); +//TODO after moving validation/recommendation to BE belov requirement must be deleted require('utils/configs/defaults_providers/user_defaults_provider'); require('utils/configs/validators/user_configs_validator'); @@ -29,6 +30,7 @@ module.exports = [ Em.Object.create({ serviceName: 'MISC', displayName: 'Misc', + //TODO after moving validation/recommendation to BE configsValidator and defaultsProviders must be deleted configsValidator: App.userConfigsValidator, defaultsProviders: [App.userDefaultsProvider.create()], configCategories: [ http://git-wip-us.apache.org/repos/asf/ambari/blob/382e7f3d/ambari-web/app/models/stack_service.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models/stack_service.js b/ambari-web/app/models/stack_service.js index 61c89fa..551c01f 100644 --- a/ambari-web/app/models/stack_service.js +++ b/ambari-web/app/models/stack_service.js @@ -20,6 +20,7 @@ var App = require('app'); require('utils/helper'); require('mixins/models/service_mixin'); require('models/service_config'); +//TODO after moving validation/recommendation to BE belove requirements must be deleted require('utils/configs/defaults_providers/yarn_defaults_provider'); require('utils/configs/defaults_providers/tez_defaults_provider'); require('utils/configs/defaults_providers/hive_defaults_provider'); @@ -159,12 +160,12 @@ App.StackService = DS.Model.extend(App.ServiceModelMixin, { customReviewHandler: function () { return App.StackService.reviewPageHandlers[this.get('serviceName')]; }.property('serviceName'), - + //TODO after moving validation/recommendation to BE defaultsProviders must be deleted defaultsProviders: function () { var defaultConfigsHandler = App.StackService.defaultConfigsHandler[this.get('serviceName')]; return defaultConfigsHandler && defaultConfigsHandler.defaultsProviders; }.property('serviceName'), - + //TODO after moving validation/recommendation to BE configsValidator must be deleted configsValidator: function () { var defaultConfigsHandler = App.StackService.defaultConfigsHandler[this.get('serviceName')]; return defaultConfigsHandler && defaultConfigsHandler.configsValidator; @@ -253,6 +254,7 @@ App.StackService.reviewPageHandlers = { } }; +//TODO after moving validation/recommendation to BE defaultConfigsHandler must be deleted App.StackService.defaultConfigsHandler = { YARN: {defaultsProviders: [App.YARNDefaultsProvider.create()], configsValidator: App.YARNConfigsValidator}, MAPREDUCE2: {defaultsProviders: [App.YARNDefaultsProvider.create()], configsValidator: App.MapReduce2ConfigsValidator}, http://git-wip-us.apache.org/repos/asf/ambari/blob/382e7f3d/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 832d347..fc1f81c 100644 --- a/ambari-web/app/utils/ajax/ajax.js +++ b/ambari-web/app/utils/ajax/ajax.js @@ -1246,7 +1246,24 @@ var urls = { return { data: JSON.stringify({ hosts: data.hosts, - services: data.services + services: data.services, + recommend: "host_groups" + }) + } + } + }, + + 'wizard.step7.loadrecommendations.configs': { + 'real': '{stackVersionUrl}/recommendations', + 'mock': '/data/stacks/HDP-2.1/recommendations_configs.json', + 'type': 'POST', + 'format': function (data) { + return { + data: JSON.stringify({ + hosts: data.hosts, + services: data.services, + recommendations: data.recommendations, + recommend: "configurations" }) } } http://git-wip-us.apache.org/repos/asf/ambari/blob/382e7f3d/ambari-web/app/utils/config.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js index d3d9a14..c69695e 100644 --- a/ambari-web/app/utils/config.js +++ b/ambari-web/app/utils/config.js @@ -630,7 +630,7 @@ App.config = Em.Object.create({ * @param localDB * @return {Array} */ - renderConfigs: function (configs, storedConfigs, allSelectedServiceNames, installedServiceNames, localDB) { + renderConfigs: function (configs, storedConfigs, allSelectedServiceNames, installedServiceNames, localDB, recommended) { var renderedServiceConfigs = []; var services = []; @@ -670,23 +670,43 @@ App.config = Em.Object.create({ // Use calculated default values for some configs var recommendedDefaults = {}; - if (!storedConfigs && service.get('defaultsProviders')) { - service.get('defaultsProviders').forEach(function (defaultsProvider) { - var defaults = defaultsProvider.getDefaults(localDB); - for (var name in defaults) { - var config = configsByService.findProperty('name', name); - if (!config) { - continue; + if (App.supports.serverRecommendValidate) { + if (!storedConfigs && service.get('configTypes')) { + Object.keys(service.get('configTypes')).forEach(function (type) { + if (!recommended || !recommended[type]) { + return; } - if (!!defaults[name]) { + var defaults = recommended[type].properties; + for (var name in defaults) { + var config = configsByService.findProperty('name', name); + if (!config) { + continue; + } recommendedDefaults[name] = defaults[name]; config.set('value', defaults[name]); config.set('defaultValue', defaults[name]); - } else { - recommendedDefaults[name] = config.get('defaultValue'); } - } - }); + }); + } + } else { + if (!storedConfigs && service.get('defaultsProviders')) { + service.get('defaultsProviders').forEach(function (defaultsProvider) { + var defaults = defaultsProvider.getDefaults(localDB); + for (var name in defaults) { + var config = configsByService.findProperty('name', name); + if (!config) { + continue; + } + if (!!defaults[name]) { + recommendedDefaults[name] = defaults[name]; + config.set('value', defaults[name]); + config.set('defaultValue', defaults[name]); + } else { + recommendedDefaults[name] = config.get('defaultValue'); + } + } + }); + } } if (service.get('configsValidator')) { service.get('configsValidator').set('recommendedDefaults', recommendedDefaults);
