http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/controllers/main/service/reassign/step3_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/service/reassign/step3_controller.js b/ambari-web/app/controllers/main/service/reassign/step3_controller.js index d717dea..d4edb1e 100644 --- a/ambari-web/app/controllers/main/service/reassign/step3_controller.js +++ b/ambari-web/app/controllers/main/service/reassign/step3_controller.js @@ -21,6 +21,678 @@ var App = require('app'); App.ReassignMasterWizardStep3Controller = Em.Controller.extend({ name: 'reassignMasterWizardStep3Controller', + componentSpecificTypesMap: { + 'NAMENODE': [ + { + serviceName: 'HBASE', + configTypes: ['hbase-site'] + }, + { + serviceName: 'ACCUMULO', + configTypes: ['accumulo-site'] + }, + { + serviceName: 'HAWQ', + configTypes: ['hawq-site', 'hdfs-client'] + } + ], + 'RESOURCEMANAGER': [ + { + serviceName: 'HAWQ', + configTypes: ['hawq-site', 'yarn-client'] + } + ] + }, + + /** + * additional configs with template values + * Part of value to substitute has following format: "<replace-value>" + */ + additionalConfigsMap: [ + { + componentName: 'RESOURCEMANAGER', + configs: { + 'yarn-site': { + 'yarn.resourcemanager.address': '<replace-value>:8050', + 'yarn.resourcemanager.admin.address': '<replace-value>:8141', + 'yarn.resourcemanager.resource-tracker.address': '<replace-value>:8025', + 'yarn.resourcemanager.scheduler.address': '<replace-value>:8030', + 'yarn.resourcemanager.webapp.address': '<replace-value>:8088', + 'yarn.resourcemanager.hostname': '<replace-value>' + } + } + }, + { + componentName: 'JOBTRACKER', + configs: { + 'mapred-site': { + 'mapred.job.tracker.http.address': '<replace-value>:50030', + 'mapred.job.tracker': '<replace-value>:50300' + } + } + }, + { + componentName: 'SECONDARY_NAMENODE', + configs: { + 'hdfs-site': { + 'dfs.secondary.http.address': '<replace-value>:50090' + } + }, + configs_Hadoop2: { + 'hdfs-site': { + 'dfs.namenode.secondary.http-address': '<replace-value>:50090' + } + } + }, + { + componentName: 'NAMENODE', + configs: { + 'hdfs-site': { + 'dfs.http.address': '<replace-value>:50070', + 'dfs.https.address': '<replace-value>:50470' + }, + 'core-site': { + 'fs.default.name': 'hdfs://<replace-value>:8020' + } + }, + configs_Hadoop2: { + 'hdfs-site': { + 'dfs.namenode.rpc-address': '<replace-value>:8020', + 'dfs.namenode.http-address': '<replace-value>:50070', + 'dfs.namenode.https-address': '<replace-value>:50470' + }, + 'core-site': { + 'fs.defaultFS': 'hdfs://<replace-value>:8020' + } + } + }, + { + componentName: 'APP_TIMELINE_SERVER', + configs: { + 'yarn-site': { + 'yarn.timeline-service.webapp.address': '<replace-value>:8188', + 'yarn.timeline-service.webapp.https.address': '<replace-value>:8190', + 'yarn.timeline-service.address': '<replace-value>:10200' + } + } + }, + { + componentName: 'OOZIE_SERVER', + configs: { + 'oozie-site': { + 'oozie.base.url': 'http://<replace-value>:11000/oozie' + }, + 'core-site': { + 'hadoop.proxyuser.oozie.hosts': '<replace-value>' + } + } + }, + { + componentName: 'HIVE_METASTORE', + configs: { + 'hive-site': {} + } + }, + { + componentName: 'MYSQL_SERVER', + configs: { + 'hive-site': { + 'javax.jdo.option.ConnectionURL': 'jdbc:mysql://<replace-value>/hive?createDatabaseIfNotExist=true' + } + } + }, + { + componentName: 'HISTORYSERVER', + configs: { + 'mapred-site': { + 'mapreduce.jobhistory.webapp.address': '<replace-value>:19888', + 'mapreduce.jobhistory.address': '<replace-value>:10020' + } + } + } + ], + + secureConfigsMap: [ + { + componentName: 'NAMENODE', + configs: [ + { + site: 'hdfs-site', + keytab: 'dfs.namenode.keytab.file', + principal: 'dfs.namenode.kerberos.principal' + }, + { + site: 'hdfs-site', + keytab: 'dfs.web.authentication.kerberos.keytab', + principal: 'dfs.web.authentication.kerberos.principal' + } + ] + }, + { + componentName: 'SECONDARY_NAMENODE', + configs: [ + { + site: 'hdfs-site', + keytab: 'dfs.secondary.namenode.keytab.file', + principal: 'dfs.secondary.namenode.kerberos.principal' + }, + { + site: 'hdfs-site', + keytab: 'dfs.web.authentication.kerberos.keytab', + principal: 'dfs.web.authentication.kerberos.principal' + } + ] + }, + { + componentName: 'RESOURCEMANAGER', + configs: [ + { + site: 'yarn-site', + keytab: 'yarn.resourcemanager.keytab', + principal: 'yarn.resourcemanager.principal' + }, + { + site: 'yarn-site', + keytab: 'yarn.resourcemanager.webapp.spnego-keytab-file', + principal: 'yarn.resourcemanager.webapp.spnego-principal' + } + ] + }, + { + componentName: 'OOZIE_SERVER', + configs: [ + { + site: 'oozie-site', + keytab: 'oozie.authentication.kerberos.keytab', + principal: 'oozie.authentication.kerberos.principal' + }, + { + site: 'oozie-site', + keytab: 'oozie.service.HadoopAccessorService.keytab.file', + principal: 'oozie.service.HadoopAccessorService.kerberos.principal' + } + ] + }, + { + componentName: 'WEBHCAT_SERVER', + configs: [ + { + site: 'webhcat-site', + keytab: 'templeton.kerberos.keytab', + principal: 'templeton.kerberos.principal' + } + ] + }, + { + componentName: 'HIVE_SERVER', + configs: [ + { + site: 'hive-site', + keytab: 'hive.server2.authentication.kerberos.keytab', + principal: 'hive.server2.authentication.kerberos.principal' + }, + { + site: 'hive-site', + keytab: 'hive.server2.authentication.spnego.keytab', + principal: 'hive.server2.authentication.spnego.principal' + } + ] + }, + { + componentName: 'HIVE_METASTORE', + configs: [ + { + site: 'hive-site', + keytab: 'hive.metastore.kerberos.keytab.file', + principal: 'hive.metastore.kerberos.principal' + } + ] + } + + ], + + isLoaded: false, + + versionLoaded: true, + + hideDependenciesInfoBar: true, + + configs: null, + + configsAttributes: null, + + secureConfigs: [], + + stepConfigs: [], + + propertiesToChange: {}, + + isSubmitDisabled: Em.computed.and('wizardController.isComponentWithReconfiguration', '!isLoaded'), + + loadStep: function () { + if (this.get('wizardController.isComponentWithReconfiguration')) { + this.set('isLoaded', false); + App.ajax.send({ + name: 'config.tags', + sender: this, + success: 'onLoadConfigsTags' + }); + } + }, + + clearStep: function () { + this.setProperties({ + configs: null, + configsAttributes: null, + secureConfigs: [], + propertiesToChange: {} + }); + }, + + onLoadConfigsTags: function (data) { + var urlParams = this.getConfigUrlParams(this.get('content.reassign.component_name'), data); + + App.ajax.send({ + name: 'reassign.load_configs', + sender: this, + data: { + urlParams: urlParams.join('|') + }, + success: 'onLoadConfigs' + }); + }, + + getConfigUrlParams: function (componentName, data) { + var urlParams = []; + + this.get('wizardController.serviceToConfigSiteMap')[componentName].forEach(function(site){ + urlParams.push('(type=' + site + '&tag=' + data.Clusters.desired_configs[site].tag + ')'); + }); + + // specific cases for certain components + var specificTypes = this.get('componentSpecificTypesMap')[componentName]; + if (specificTypes) { + var services = App.Service.find(); + specificTypes.forEach(function (service) { + if (services.someProperty('serviceName', service.serviceName)) { + service.configTypes.forEach(function (site) { + urlParams.push('(type=' + site + '&tag=' + data.Clusters.desired_configs[site].tag + ')'); + }); + } + }); + } + + return urlParams; + }, + + renderServiceConfigs: function (configs) { + var self = this, + configCategories = [], + displayedConfigs = [], + serviceConfig = App.ServiceConfig.create({ + serviceName: 'MISC', + configCategories: configCategories, + showConfig: true, + configs: displayedConfigs + }); + App.get('router.mainController.isLoading').call(App.get('router.clusterController'), 'isConfigsPropertiesLoaded').done(function () { + Em.keys(self.get('propertiesToChange')).forEach(function (type) { + var service = App.config.get('serviceByConfigTypeMap')[type]; + if (service) { + var serviceName = service.get('serviceName'); + if (!configCategories.someProperty('name', serviceName)) { + configCategories.push(App.ServiceConfigCategory.create({ + name: serviceName, + displayName: service.get('displayName') + })); + } + this.get('propertiesToChange')[type].forEach(function (property) { + var propertyName = property.name, + stackProperty = App.configsCollection.getConfigByName(propertyName, type) || {}, + displayedProperty = App.ServiceConfigProperty.create({ + name: propertyName, + displayName: propertyName, + fileName: type + }, stackProperty, { + value: configs[type][propertyName], + category: serviceName, + isEditable: Boolean(stackProperty.isEditable !== false && !property.isSecure) + }); + displayedConfigs.push(displayedProperty); + }); + } + }, self); + self.setProperties({ + stepConfigs: [serviceConfig], + selectedService: serviceConfig, + isLoaded: true + }); + }); + }, + + onLoadConfigs: function (data) { + // Find hawq-site.xml location + var hawqSiteIndex = -1; + for(var i = 0; i < data.items.length; i++){ + if(data.items[i].type == 'hawq-site'){ + hawqSiteIndex = i; + break; + } + } + + // if certain services are deployed, include related site files to additionalConfigsMap and relatedServicesMap. + if(hawqSiteIndex >= 0){ // if HAWQ is deployed + var hawqSiteProperties = { + 'hawq_rm_yarn_address': '<replace-value>:8050', + 'hawq_rm_yarn_scheduler_address': '<replace-value>:8030' + } + + var rmComponent = this.get('additionalConfigsMap').findProperty('componentName', "RESOURCEMANAGER"); + rmComponent.configs["hawq-site"] = hawqSiteProperties; + + if(data.items[hawqSiteIndex].properties["hawq_global_rm_type"].toLowerCase() === "yarn"){ + this.get('wizardController.relatedServicesMap')['RESOURCEMANAGER'].append('HAWQ'); + } + + } + + var componentName = this.get('content.reassign.component_name'); + var targetHostName = this.get('content.reassignHosts.target'); + var configs = {}; + var attributes = {}; + var secureConfigs = []; + + data.items.forEach(function (item) { + configs[item.type] = item.properties; + if (item.properties_attributes) { + attributes[item.type] = item.properties_attributes; + } + }); + + this.set('configsAttributes', attributes); + + this.setAdditionalConfigs(configs, componentName, targetHostName); + this.setSecureConfigs(secureConfigs, configs, componentName); + + this.set('secureConfigs', secureConfigs); + + switch (componentName) { + case 'NAMENODE': + App.MoveNameNodeConfigInitializer.setup(this._getNnInitializerSettings(configs)); + configs = this.setDynamicConfigs(configs, App.MoveNameNodeConfigInitializer); + App.MoveNameNodeConfigInitializer.cleanup(); + break; + case 'RESOURCEMANAGER': + App.MoveRmConfigInitializer.setup(this._getRmInitializerSettings(configs)); + var additionalDependencies = this._getRmAdditionalDependencies(configs); + configs = this.setDynamicConfigs(configs, App.MoveRmConfigInitializer, additionalDependencies); + App.MoveRmConfigInitializer.cleanup(); + break; + case 'HIVE_METASTORE': + App.MoveHmConfigInitializer.setup(this._getHiveInitializerSettings(configs)); + configs = this.setDynamicConfigs(configs, App.MoveHmConfigInitializer); + App.MoveHmConfigInitializer.cleanup(); + break; + case 'HIVE_SERVER': + App.MoveHsConfigInitializer.setup(this._getHiveInitializerSettings(configs)); + configs = this.setDynamicConfigs(configs, App.MoveHsConfigInitializer); + App.MoveHsConfigInitializer.cleanup(); + break; + case 'WEBHCAT_SERVER': + App.MoveWsConfigInitializer.setup(this._getWsInitializerSettings(configs)); + configs = this.setDynamicConfigs(configs, App.MoveWsConfigInitializer); + App.MoveWsConfigInitializer.cleanup(); + break; + case 'OOZIE_SERVER': + App.MoveOSConfigInitializer.setup(this._getOsInitializerSettings(configs)); + configs = this.setDynamicConfigs(configs, App.MoveOSConfigInitializer); + App.MoveOSConfigInitializer.cleanup(); + } + + this.renderServiceConfigs(configs); + this.set('configs', configs); + }, + + /** + * set additional configs + * configs_Hadoop2 - configs which belongs to Hadoop 2 stack only + * @param configs + * @param componentName + * @param replaceValue + * @return {Boolean} + */ + setAdditionalConfigs: function (configs, componentName, replaceValue) { + var component = this.get('additionalConfigsMap').findProperty('componentName', componentName); + + if (Em.isNone(component)) return false; + var additionalConfigs = (component.configs_Hadoop2) ? component.configs_Hadoop2 : component.configs; + + for (var site in additionalConfigs) { + if (additionalConfigs.hasOwnProperty(site)) { + for (var property in additionalConfigs[site]) { + if (additionalConfigs[site].hasOwnProperty(property)) { + if (App.get('isHaEnabled') && componentName === 'NAMENODE' && (property === 'fs.defaultFS' || property === 'dfs.namenode.rpc-address')) continue; + + configs[site][property] = additionalConfigs[site][property].replace('<replace-value>', replaceValue); + if (!this.get('propertiesToChange').hasOwnProperty(site)) { + this.get('propertiesToChange')[site] = []; + } + this.get('propertiesToChange')[site].push({ + name: property + }); + } + } + } + } + return true; + }, + + /** + * set secure configs for component + * @param secureConfigs + * @param configs + * @param componentName + * @return {Boolean} + */ + setSecureConfigs: function (secureConfigs, configs, componentName) { + var securityEnabled = App.get('isKerberosEnabled'); + var component = this.get('secureConfigsMap').findProperty('componentName', componentName); + if (Em.isNone(component) || !securityEnabled) return false; + + component.configs.forEach(function (config) { + secureConfigs.push({ + keytab: configs[config.site][config.keytab], + principal: configs[config.site][config.principal] + }); + if (!this.get('propertiesToChange').hasOwnProperty(config.site)) { + this.get('propertiesToChange')[config.site] = []; + } + this.get('propertiesToChange')[config.site].push( + { + name: config.keytab, + isSecure: true + }, + { + name: config.principal, + isSecure: true + } + ); + }, this); + return true; + }, + + /** + * Get additional dependencies-data for App.MoveNameNodeConfigInitializer + * + * @param {object} configs + * @returns {object} + * @private + * @method _getNnInitializerSettings + */ + _getNnInitializerSettings: function (configs) { + var ret = {}; + if (App.get('isHaEnabled')) { + ret.namespaceId = configs['hdfs-site']['dfs.nameservices']; + ret.suffix = (configs['hdfs-site']['dfs.namenode.http-address.' + ret.namespaceId + '.nn1'].indexOf(this.get('content.reassignHosts.source')) != -1) ? 'nn1' : 'nn2'; + } + return ret; + }, + + /** + * Settings used to the App.MoveRmConfigInitializer setup + * + * @param {object} configs + * @returns {{suffix: string}} + * @private + * @method _getRmInitializerSettings + */ + _getRmInitializerSettings: function (configs) { + return { + suffix: configs['yarn-site']['yarn.resourcemanager.hostname.rm1'] === this.get('content.reassignHosts.source') ? 'rm1': 'rm2' + }; + }, + + /** + * Get additional dependencies-data for App.MoveRmConfigInitializer + * + * @param {object} configs + * @returns {object} + * @private + * @method _getRmAdditionalDependencies + */ + _getRmAdditionalDependencies: function (configs) { + var ret = {}; + var rm1 = configs['yarn-site']['yarn.resourcemanager.hostname.rm1']; + if (rm1) { + ret.rm1 = rm1; + } + var rm2 = configs['yarn-site']['yarn.resourcemanager.hostname.rm2']; + if (rm2) { + ret.rm2 = rm2; + } + return ret; + }, + + /** + * Settings used to the App.MoveHsConfigInitializer and App.MoveHmConfigInitializer setup + * + * @param {object} configs + * @returns {{hiveUser: string}} + * @private + * @method _getHiveInitializerSettings + */ + _getHiveInitializerSettings: function (configs) { + return { + hiveUser: configs['hive-env']['hive_user'] + }; + }, + + /** + * Settings used to the App.MoveWsConfigInitializer setup + * + * @param {object} configs + * @returns {{webhcatUser: string}} + * @private + * @method _getWsInitializerSettings + */ + _getWsInitializerSettings: function (configs) { + return { + webhcatUser: configs['hive-env']['webhcat_user'] + }; + }, + + /** + * Settings used to the App.MoveOSConfigInitializer setup + * + * @param {object} configs + * @returns {object} + * @private + * @method _getOsInitializerSettings + */ + _getOsInitializerSettings: function (configs) { + var ret = {}; + var cfg = configs['oozie-env']['oozie_user']; + if (cfg) { + ret.oozieUser = cfg; + } + return ret; + }, + + /** + * Set config values according to the new cluster topology + * + * @param {object} configs + * @param {MoveComponentConfigInitializerClass} initializer + * @param {object} [additionalDependencies={}] + * @returns {object} + * @method setDynamicConfigs + */ + setDynamicConfigs: function (configs, initializer, additionalDependencies) { + additionalDependencies = additionalDependencies || {}; + var topologyDB = this._prepareTopologyDB(), + dependencies = this._prepareDependencies(additionalDependencies), + initializerObjects = initializer.get('initializers'), + uniqueInitializerObjects = initializer.get('uniqueInitializers'); + Em.keys(configs).forEach(function (site) { + Em.keys(configs[site]).forEach(function (config) { + // temporary object for initializer + var cfg = { + name: config, + filename: site, + value: configs[site][config] + }; + configs[site][config] = initializer.initialValue(cfg, topologyDB, dependencies).value; + if (initializerObjects[config] || uniqueInitializerObjects[config]) { + if (!this.get('propertiesToChange').hasOwnProperty(site)) { + this.get('propertiesToChange')[site] = []; + } + this.get('propertiesToChange')[site].push({ + name: config + }); + } + }, this); + }, this); + return configs; + }, + + /** + * + * @returns {extendedTopologyLocalDB} + * @private + * @method _prepareTopologyDB + */ + _prepareTopologyDB: function () { + var ret = this.get('content').getProperties(['masterComponentHosts', 'slaveComponentHosts', 'hosts']); + ret.installedServices = App.Service.find().mapProperty('serviceName'); + return ret; + }, + + /** + * Create dependencies for Config Initializers + * + * @param {object} additionalDependencies some additional information that should be added + * @returns {reassignComponentDependencies} + * @private + * @method _prepareDependencies + */ + _prepareDependencies: function (additionalDependencies) { + additionalDependencies = additionalDependencies || {}; + var ret = {}; + ret.sourceHostName = this.get('content.reassignHosts.source'); + ret.targetHostName = this.get('content.reassignHosts.target'); + return Em.merge(ret, additionalDependencies); + }, + + updateServiceConfigs: function () { + var configs = this.get('configs'); + if (configs) { + this.get('selectedService.configs').forEach(function (property) { + var type = App.config.getConfigTagFromFileName(property.fileName); + configs[type][property.name] = property.value; + }, this); + } + }, + submit: function() { App.get('router.mainAdminKerberosController').getKDCSessionState(function() { App.router.send("next");
http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/controllers/main/service/reassign/step4_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/service/reassign/step4_controller.js b/ambari-web/app/controllers/main/service/reassign/step4_controller.js index e14cb2a..f87d05b 100644 --- a/ambari-web/app/controllers/main/service/reassign/step4_controller.js +++ b/ambari-web/app/controllers/main/service/reassign/step4_controller.js @@ -72,267 +72,19 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro dependentHostComponents: [], - /** - * List of components, that do not need reconfiguration for moving to another host - * Reconfigure command will be skipped - */ - componentsWithoutReconfiguration: ['METRICS_COLLECTOR'], - - /** - * Map with lists of related services. - * Used to define list of services to stop/start. - */ - relatedServicesMap: { - 'JOBTRACKER': ['PIG', 'OOZIE'], - 'RESOURCEMANAGER': ['YARN', 'MAPREDUCE2', 'TEZ', 'PIG', 'OOZIE', 'SLIDER', 'SPARK'], - 'APP_TIMELINE_SERVER': ['YARN', 'MAPREDUCE2', 'TEZ', 'OOZIE', 'SLIDER', 'SPARK'], - 'HIVE_SERVER': ['HIVE', 'FALCON', 'ATLAS', 'OOZIE'], - 'HIVE_METASTORE': ['HIVE', 'PIG', 'FALCON', 'ATLAS', 'OOZIE'], - 'WEBHCAT_SERVER': ['HIVE'], - 'OOZIE_SERVER': ['OOZIE', 'FALCON', 'KNOX'], - 'MYSQL_SERVER': ['HIVE', 'OOZIE', 'RANGER', 'RANGER_KMS'], - 'METRICS_COLLECTOR': ['AMBARI_METRICS'] - }, - dbPropertyMap: { - 'HIVE_SERVER': 'javax.jdo.option.ConnectionDriverName', - 'HIVE_METASTORE': 'javax.jdo.option.ConnectionDriverName', - 'OOZIE_SERVER': 'oozie.service.JPAService.jdbc.url' - }, - - /** - * additional configs with template values - * Part of value to substitute has following format: "<replace-value>" - */ - additionalConfigsMap: [ - { - componentName: 'RESOURCEMANAGER', - configs: { - 'yarn-site': { - 'yarn.resourcemanager.address': '<replace-value>:8050', - 'yarn.resourcemanager.admin.address': '<replace-value>:8141', - 'yarn.resourcemanager.resource-tracker.address': '<replace-value>:8025', - 'yarn.resourcemanager.scheduler.address': '<replace-value>:8030', - 'yarn.resourcemanager.webapp.address': '<replace-value>:8088', - 'yarn.resourcemanager.hostname': '<replace-value>' - } - } - }, - { - componentName: 'JOBTRACKER', - configs: { - 'mapred-site': { - 'mapred.job.tracker.http.address': '<replace-value>:50030', - 'mapred.job.tracker': '<replace-value>:50300' - } - } - }, - { - componentName: 'SECONDARY_NAMENODE', - configs: { - 'hdfs-site': { - 'dfs.secondary.http.address': '<replace-value>:50090' - } - }, - configs_Hadoop2: { - 'hdfs-site': { - 'dfs.namenode.secondary.http-address': '<replace-value>:50090' - } - } - }, - { - componentName: 'NAMENODE', - configs: { - 'hdfs-site': { - 'dfs.http.address': '<replace-value>:50070', - 'dfs.https.address': '<replace-value>:50470' - }, - 'core-site': { - 'fs.default.name': 'hdfs://<replace-value>:8020' - } - }, - configs_Hadoop2: { - 'hdfs-site': { - 'dfs.namenode.rpc-address': '<replace-value>:8020', - 'dfs.namenode.http-address': '<replace-value>:50070', - 'dfs.namenode.https-address': '<replace-value>:50470' - }, - 'core-site': { - 'fs.defaultFS': 'hdfs://<replace-value>:8020' - } - } - }, - { - componentName: 'APP_TIMELINE_SERVER', - configs: { - 'yarn-site': { - 'yarn.timeline-service.webapp.address': '<replace-value>:8188', - 'yarn.timeline-service.webapp.https.address': '<replace-value>:8190', - 'yarn.timeline-service.address': '<replace-value>:10200' - } - } - }, - { - componentName: 'OOZIE_SERVER', - configs: { - 'oozie-site': { - 'oozie.base.url': 'http://<replace-value>:11000/oozie' - }, - 'core-site': { - 'hadoop.proxyuser.oozie.hosts': '<replace-value>' - } - } - }, - { - componentName: 'HIVE_METASTORE', - configs: { - 'hive-site': {} - } - }, - { - componentName: 'MYSQL_SERVER', - configs: { - 'hive-site': { - 'javax.jdo.option.ConnectionURL': 'jdbc:mysql://<replace-value>/hive?createDatabaseIfNotExist=true' - } - } - }, - { - componentName: 'HISTORYSERVER', - configs: { - 'mapred-site': { - 'mapreduce.jobhistory.webapp.address': '<replace-value>:19888', - 'mapreduce.jobhistory.address': '<replace-value>:10020' - } - } - } - ], - - secureConfigsMap: [ - { - componentName: 'NAMENODE', - configs: [ - { - site: 'hdfs-site', - keytab: 'dfs.namenode.keytab.file', - principal: 'dfs.namenode.kerberos.principal' - }, - { - site: 'hdfs-site', - keytab: 'dfs.web.authentication.kerberos.keytab', - principal: 'dfs.web.authentication.kerberos.principal' - } - ] - }, - { - componentName: 'SECONDARY_NAMENODE', - configs: [ - { - site: 'hdfs-site', - keytab: 'dfs.secondary.namenode.keytab.file', - principal: 'dfs.secondary.namenode.kerberos.principal' - }, - { - site: 'hdfs-site', - keytab: 'dfs.web.authentication.kerberos.keytab', - principal: 'dfs.web.authentication.kerberos.principal' - } - ] + 'HIVE_SERVER': { + type: 'hive-site', + name: 'javax.jdo.option.ConnectionDriverName' }, - { - componentName: 'RESOURCEMANAGER', - configs: [ - { - site: 'yarn-site', - keytab: 'yarn.resourcemanager.keytab', - principal: 'yarn.resourcemanager.principal' - }, - { - site: 'yarn-site', - keytab: 'yarn.resourcemanager.webapp.spnego-keytab-file', - principal: 'yarn.resourcemanager.webapp.spnego-principal' - } - ] - }, - { - componentName: 'OOZIE_SERVER', - configs: [ - { - site: 'oozie-site', - keytab: 'oozie.authentication.kerberos.keytab', - principal: 'oozie.authentication.kerberos.principal' - }, - { - site: 'oozie-site', - keytab: 'oozie.service.HadoopAccessorService.keytab.file', - principal: 'oozie.service.HadoopAccessorService.kerberos.principal' - } - ] - }, - { - componentName: 'WEBHCAT_SERVER', - configs: [ - { - site: 'webhcat-site', - keytab: 'templeton.kerberos.keytab', - principal: 'templeton.kerberos.principal' - } - ] + 'HIVE_METASTORE': { + type: 'hive-site', + name: 'javax.jdo.option.ConnectionDriverName' }, - { - componentName: 'HIVE_SERVER', - configs: [ - { - site: 'hive-site', - keytab: 'hive.server2.authentication.kerberos.keytab', - principal: 'hive.server2.authentication.kerberos.principal' - }, - { - site: 'hive-site', - keytab: 'hive.server2.authentication.spnego.keytab', - principal: 'hive.server2.authentication.spnego.principal' - } - ] - }, - { - componentName: 'HIVE_METASTORE', - configs: [ - { - site: 'hive-site', - keytab: 'hive.metastore.kerberos.keytab.file', - principal: 'hive.metastore.kerberos.principal' - } - ] - } - - ], - - /** - * set additional configs - * configs_Hadoop2 - configs which belongs to Hadoop 2 stack only - * @param configs - * @param componentName - * @param replaceValue - * @return {Boolean} - */ - setAdditionalConfigs: function (configs, componentName, replaceValue) { - var component = this.get('additionalConfigsMap').findProperty('componentName', componentName); - - if (Em.isNone(component)) return false; - var additionalConfigs = (component.configs_Hadoop2) ? component.configs_Hadoop2 : component.configs; - - for (var site in additionalConfigs) { - if (additionalConfigs.hasOwnProperty(site)) { - for (var property in additionalConfigs[site]) { - if (additionalConfigs[site].hasOwnProperty(property)) { - if (App.get('isHaEnabled') && componentName === 'NAMENODE' && (property === 'fs.defaultFS' || property === 'dfs.namenode.rpc-address')) continue; - - configs[site][property] = additionalConfigs[site][property].replace('<replace-value>', replaceValue); - } - } - } + 'OOZIE_SERVER': { + type: 'oozie-site', + name: 'oozie.service.JPAService.jdbc.url' } - return true; }, /** @@ -418,7 +170,7 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro this.removeTasks(['startZooKeeperServers', 'startNameNode']); } - if (this.get('componentsWithoutReconfiguration').contains(componentName)) { + if (!this.get('wizardController.isComponentWithReconfiguration')) { this.removeTasks(['reconfigure']); } @@ -478,7 +230,7 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro * make server call to stop services */ stopRequiredServices: function () { - this.stopServices(this.get('relatedServicesMap')[this.get('content.reassign.component_name')], true); + this.stopServices(this.get('wizardController.relatedServicesMap')[this.get('content.reassign.component_name')], true); }, createHostComponents: function () { @@ -523,313 +275,12 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro }, reconfigure: function () { - this.loadConfigsTags(); - }, - - loadConfigsTags: function () { - App.ajax.send({ - name: 'config.tags', - sender: this, - success: 'onLoadConfigsTags', - error: 'onTaskError' - }); - }, - - serviceToConfigSiteMap: { - 'NAMENODE': ['hdfs-site', 'core-site'], - 'SECONDARY_NAMENODE': ['hdfs-site', 'core-site'], - 'JOBTRACKER': ['mapred-site'], - 'RESOURCEMANAGER': ['yarn-site'], - 'WEBHCAT_SERVER': ['hive-env', 'webhcat-site', 'core-site'], - 'APP_TIMELINE_SERVER': ['yarn-site', 'yarn-env'], - 'OOZIE_SERVER': ['oozie-site', 'core-site', 'oozie-env'], - 'HIVE_SERVER': ['hive-site', 'webhcat-site', 'hive-env', 'core-site'], - 'HIVE_METASTORE': ['hive-site', 'webhcat-site', 'hive-env', 'core-site'], - 'MYSQL_SERVER': ['hive-site'], - 'HISTORYSERVER': ['mapred-site'] - }, - - /** - * construct URL parameters for config call - * @param componentName - * @param data - * @return {Array} - */ - getConfigUrlParams: function (componentName, data) { - var urlParams = []; - - this.get('serviceToConfigSiteMap')[componentName].forEach(function(site){ - urlParams.push('(type=' + site + '&tag=' + data.Clusters.desired_configs[site].tag + ')'); - }); - - // specific cases for NameNode component - if (componentName === 'NAMENODE') { - if (App.Service.find().someProperty('serviceName', 'HBASE')) { - urlParams.push('(type=hbase-site&tag=' + data.Clusters.desired_configs['hbase-site'].tag + ')'); - } - if (App.Service.find().someProperty('serviceName', 'ACCUMULO')) { - urlParams.push('(type=accumulo-site&tag=' + data.Clusters.desired_configs['accumulo-site'].tag + ')'); - } - if (App.Service.find().someProperty('serviceName', 'HAWQ')) { - urlParams.push('(type=hawq-site&tag=' + data.Clusters.desired_configs['hawq-site'].tag + ')'); - urlParams.push('(type=hdfs-client&tag=' + data.Clusters.desired_configs['hdfs-client'].tag + ')'); - } - } - - if (componentName === 'RESOURCEMANAGER') { - if (App.Service.find().someProperty('serviceName', 'HAWQ')) { - urlParams.push('(type=hawq-site&tag=' + data.Clusters.desired_configs['hawq-site'].tag + ')'); - urlParams.push('(type=yarn-client&tag=' + data.Clusters.desired_configs['yarn-client'].tag + ')'); - } - } - - return urlParams; - }, - - onLoadConfigsTags: function (data) { - var urlParams = this.getConfigUrlParams(this.get('content.reassign.component_name'), data); - - App.ajax.send({ - name: 'reassign.load_configs', - sender: this, - data: { - urlParams: urlParams.join('|') - }, - success: 'onLoadConfigs', - error: 'onTaskError' - }); - }, - - /** - * - * @returns {extendedTopologyLocalDB} - * @private - * @method _prepareTopologyDB - */ - _prepareTopologyDB: function () { - var ret = this.get('content').getProperties(['masterComponentHosts', 'slaveComponentHosts', 'hosts']); - ret.installedServices = App.Service.find().mapProperty('serviceName'); - return ret; - }, - - /** - * Create dependencies for Config Initializers - * - * @param {object} additionalDependencies some additional information that should be added - * @returns {reassignComponentDependencies} - * @private - * @method _prepareDependencies - */ - _prepareDependencies: function (additionalDependencies) { - additionalDependencies = additionalDependencies || {}; - var ret = {}; - ret.sourceHostName = this.get('content.reassignHosts.source'); - ret.targetHostName = this.get('content.reassignHosts.target'); - return Em.merge(ret, additionalDependencies); - }, - - /** - * Get additional dependencies-data for App.MoveRmConfigInitializer - * - * @param {object} configs - * @returns {object} - * @private - * @method _getRmAdditionalDependencies - */ - _getRmAdditionalDependencies: function (configs) { - var ret = {}; - var rm1 = configs['yarn-site']['yarn.resourcemanager.hostname.rm1']; - if (rm1) { - ret.rm1 = rm1; - } - var rm2 = configs['yarn-site']['yarn.resourcemanager.hostname.rm2']; - if (rm2) { - ret.rm2 = rm2; - } - return ret; - }, - - /** - * Settings used to the App.MoveOSConfigInitializer setup - * - * @param {object} configs - * @returns {object} - * @private - * @method _getOsInitializerSettings - */ - _getOsInitializerSettings: function (configs) { - var ret = {}; - var cfg = configs['oozie-env']['oozie_user']; - if (cfg) { - ret.oozieUser = cfg; - } - return ret; - }, - - /** - * Get additional dependencies-data for App.MoveNameNodeConfigInitializer - * - * @param {object} configs - * @returns {object} - * @private - * @method _getNnInitializerSettings - */ - _getNnInitializerSettings: function (configs) { - var ret = {}; - if (App.get('isHaEnabled')) { - ret.namespaceId = configs['hdfs-site']['dfs.nameservices']; - ret.suffix = (configs['hdfs-site']['dfs.namenode.http-address.' + ret.namespaceId + '.nn1'].indexOf(this.get('content.reassignHosts.source')) != -1) ? 'nn1' : 'nn2'; - } - return ret; - }, - - /** - * Settings used to the App.MoveHsConfigInitializer and App.MoveHmConfigInitializer setup - * - * @param {object} configs - * @returns {{hiveUser: string}} - * @private - * @method _getHiveInitializerSettings - */ - _getHiveInitializerSettings: function (configs) { - return { - hiveUser: configs['hive-env']['hive_user'] - }; - }, - - /** - * Settings used to the App.MoveWsConfigInitializer setup - * - * @param {object} configs - * @returns {{webhcatUser: string}} - * @private - * @method _getWsInitializerSettings - */ - _getWsInitializerSettings: function (configs) { - return { - webhcatUser: configs['hive-env']['webhcat_user'] - }; - }, - - /** - * Settings used to the App.MoveRmConfigInitializer setup - * - * @param {object} configs - * @returns {{suffix: string}} - * @private - * @method _getRmInitializerSettings - */ - _getRmInitializerSettings: function (configs) { - return { - suffix: configs['yarn-site']['yarn.resourcemanager.hostname.rm1'] === this.get('content.reassignHosts.source') ? 'rm1': 'rm2' - }; - }, - - onLoadConfigs: function (data) { - // Find hawq-site.xml location - var hawqSiteIndex = -1; - for(var i = 0; i < data.items.length; i++){ - if(data.items[i].type == 'hawq-site'){ - hawqSiteIndex = i; - break; - } - } - - // if certain services are deployed, include related site files to additionalConfigsMap and relatedServicesMap. - if(hawqSiteIndex >= 0){ // if HAWQ is deployed - var hawqSiteProperties = { - 'hawq_rm_yarn_address': '<replace-value>:8050', - 'hawq_rm_yarn_scheduler_address': '<replace-value>:8030' - } - - var rmComponent = this.get('additionalConfigsMap').findProperty('componentName', "RESOURCEMANAGER"); - rmComponent.configs["hawq-site"] = hawqSiteProperties; - - if(data.items[hawqSiteIndex].properties["hawq_global_rm_type"].toLowerCase() === "yarn"){ - this.get('relatedServicesMap')['RESOURCEMANAGER'].append('HAWQ'); - } - - } - - var componentName = this.get('content.reassign.component_name'); - var targetHostName = this.get('content.reassignHosts.target'); - var configs = {}; - var attributes = {}; - var secureConfigs = []; - - data.items.forEach(function (item) { - configs[item.type] = item.properties; - if (item.properties_attributes) { - attributes[item.type] = item.properties_attributes; - } - }, this); - - this.setAdditionalConfigs(configs, componentName, targetHostName); - this.setSecureConfigs(secureConfigs, configs, componentName); - - switch (componentName) { - case 'NAMENODE': - App.MoveNameNodeConfigInitializer.setup(this._getNnInitializerSettings(configs)); - configs = this.setDynamicConfigs(configs, App.MoveNameNodeConfigInitializer); - App.MoveNameNodeConfigInitializer.cleanup(); - break; - case 'RESOURCEMANAGER': - App.MoveRmConfigInitializer.setup(this._getRmInitializerSettings(configs)); - var additionalDependencies = this._getRmAdditionalDependencies(configs); - configs = this.setDynamicConfigs(configs, App.MoveRmConfigInitializer, additionalDependencies); - App.MoveRmConfigInitializer.cleanup(); - break; - case 'HIVE_METASTORE': - App.MoveHmConfigInitializer.setup(this._getHiveInitializerSettings(configs)); - configs = this.setDynamicConfigs(configs, App.MoveHmConfigInitializer); - App.MoveHmConfigInitializer.cleanup(); - break; - case 'HIVE_SERVER': - App.MoveHsConfigInitializer.setup(this._getHiveInitializerSettings(configs)); - configs = this.setDynamicConfigs(configs, App.MoveHsConfigInitializer); - App.MoveHsConfigInitializer.cleanup(); - break; - case 'WEBHCAT_SERVER': - App.MoveWsConfigInitializer.setup(this._getWsInitializerSettings(configs)); - configs = this.setDynamicConfigs(configs, App.MoveWsConfigInitializer); - App.MoveWsConfigInitializer.cleanup(); - break; - case 'OOZIE_SERVER': - App.MoveOSConfigInitializer.setup(this._getOsInitializerSettings(configs)); - configs = this.setDynamicConfigs(configs, App.MoveOSConfigInitializer); - App.MoveOSConfigInitializer.cleanup(); - } - + var configs = this.get('content.configs'), + attributes = this.get('content.configsAttributes'), + secureConfigs = this.get('content.secureConfigs'), + componentName = this.get('content.reassign.component_name'); this.saveClusterStatus(secureConfigs, this.getComponentDir(configs, componentName)); this.saveConfigsToServer(configs, attributes); - this.saveServiceProperties(configs); - }, - - /** - * Set config values according to the new cluster topology - * - * @param {object} configs - * @param {MoveComponentConfigInitializerClass} initializer - * @param {object} [additionalDependencies={}] - * @returns {object} - * @method setDynamicConfigs - */ - setDynamicConfigs: function (configs, initializer, additionalDependencies) { - additionalDependencies = additionalDependencies || {}; - var topologyDB = this._prepareTopologyDB(); - var dependencies = this._prepareDependencies(additionalDependencies); - Em.keys(configs).forEach(function (site) { - Em.keys(configs[site]).forEach(function (config) { - // temporary object for initializer - var cfg = { - name: config, - filename: site, - value: configs[site][config] - }; - configs[site][config] = initializer.initialValue(cfg, topologyDB, dependencies).value; - }); - }); - return configs; }, /** @@ -912,27 +363,6 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro }, /** - * set secure configs for component - * @param secureConfigs - * @param configs - * @param componentName - * @return {Boolean} - */ - setSecureConfigs: function (secureConfigs, configs, componentName) { - var securityEnabled = App.get('isKerberosEnabled'); - var component = this.get('secureConfigsMap').findProperty('componentName', componentName); - if (Em.isNone(component) || !securityEnabled) return false; - - component.configs.forEach(function (config) { - secureConfigs.push({ - keytab: configs[config.site][config.keytab], - principal: configs[config.site][config.principal] - }); - }); - return true; - }, - - /** * derive component directory from configurations * @param configs * @param componentName @@ -994,7 +424,7 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro * make server call to start services */ startRequiredServices: function () { - var relatedServices = this.get('relatedServicesMap')[this.get('content.reassign.component_name')]; + var relatedServices = this.get('wizardController.relatedServicesMap')[this.get('content.reassign.component_name')]; if (relatedServices) { this.startServices(false, relatedServices, true); } else { @@ -1178,10 +608,11 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro }.property('propertiesPattern'), getConnectionProperty: function(regexp) { - var propertyName = this.get('requiredProperties').filter(function(item) { + var configType = this.get('requiredProperties.type'), + propertyName = this.get('requiredProperties.names').filter(function(item) { return regexp.test(item); })[0]; - return this.get('content.serviceProperties')[propertyName]; + return Em.getWithDefault(this.get('content.configs'), configType, {})[propertyName]; }, /** @@ -1202,18 +633,35 @@ App.ReassignMasterWizardStep4Controller = App.HighAvailabilityProgressPageContro /** @property {object} requiredProperties - properties that necessary for database connection **/ requiredProperties: function() { var propertiesMap = { - OOZIE: ['oozie.db.schema.name','oozie.service.JPAService.jdbc.username','oozie.service.JPAService.jdbc.password','oozie.service.JPAService.jdbc.driver','oozie.service.JPAService.jdbc.url'], - HIVE: ['ambari.hive.db.schema.name','javax.jdo.option.ConnectionUserName','javax.jdo.option.ConnectionPassword','javax.jdo.option.ConnectionDriverName','javax.jdo.option.ConnectionURL'] + OOZIE: { + type: 'oozie-site', + names: ['oozie.db.schema.name', 'oozie.service.JPAService.jdbc.username', 'oozie.service.JPAService.jdbc.password', 'oozie.service.JPAService.jdbc.driver', 'oozie.service.JPAService.jdbc.url'] + }, + HIVE: { + type: 'hive-site', + names: ['ambari.hive.db.schema.name', 'javax.jdo.option.ConnectionUserName', 'javax.jdo.option.ConnectionPassword', 'javax.jdo.option.ConnectionDriverName', 'javax.jdo.option.ConnectionURL'] + } }; return propertiesMap[this.get('content.reassign.service_id')]; }.property(), dbType: function() { - var databaseTypes = /MySQL|PostgreS|Oracle|Derby|MSSQL|Anywhere/gi; - var databaseProp = this.get('content.serviceProperties')[Em.getWithDefault(this.get('dbPropertyMap'), this.get('content.reassign.component_name'), null)]; + var databaseTypes = /MySQL|PostgreS|Oracle|Derby|MSSQL|Anywhere/gi, + dbPropertyMapItem = Em.getWithDefault(this.get('dbPropertyMap'), this.get('content.reassign.component_name'), null), + databasePropMatch, + databaseProp, + result; + + if (dbPropertyMapItem) { + databaseProp = Em.getWithDefault(this.get('content.configs'), dbPropertyMapItem.type, {})[dbPropertyMapItem.name]; + databasePropMatch = databaseProp && databaseProp.match(databaseTypes); + if (databasePropMatch) { + result = databasePropMatch[0]; + } + } - return databaseProp.match(databaseTypes)[0]; + return result; }.property(), prepareDBCheckAction: function() { http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/controllers/main/service/reassign_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/service/reassign_controller.js b/ambari-web/app/controllers/main/service/reassign_controller.js index 07d6e2c..5b3e951 100644 --- a/ambari-web/app/controllers/main/service/reassign_controller.js +++ b/ambari-web/app/controllers/main/service/reassign_controller.js @@ -65,7 +65,9 @@ App.ReassignMasterController = App.WizardController.extend({ hasCheckDBStep: false, componentsWithCheckDBStep: ['HIVE_METASTORE', 'HIVE_SERVER', 'OOZIE_SERVER'], componentsWithoutSecurityConfigs: ['MYSQL_SERVER'], - reassignComponentsInMM: [] + reassignComponentsInMM: [], + configs: null, + configsAttributes: null }), /** @@ -131,6 +133,8 @@ App.ReassignMasterController = App.WizardController.extend({ this.loadTasksRequestIds(); this.loadRequestIds(); this.loadReassignComponentsInMM(); + this.loadConfigs(); + this.loadSecureConfigs(); } } ], @@ -138,13 +142,46 @@ App.ReassignMasterController = App.WizardController.extend({ { type: 'sync', callback: function () { - this.loadSecureConfigs(); this.loadComponentDir(); } } ] }, + serviceToConfigSiteMap: { + 'NAMENODE': ['hdfs-site', 'core-site'], + 'SECONDARY_NAMENODE': ['hdfs-site', 'core-site'], + 'JOBTRACKER': ['mapred-site'], + 'RESOURCEMANAGER': ['yarn-site'], + 'WEBHCAT_SERVER': ['hive-env', 'webhcat-site', 'core-site'], + 'APP_TIMELINE_SERVER': ['yarn-site', 'yarn-env'], + 'OOZIE_SERVER': ['oozie-site', 'core-site', 'oozie-env'], + 'HIVE_SERVER': ['hive-site', 'webhcat-site', 'hive-env', 'core-site'], + 'HIVE_METASTORE': ['hive-site', 'webhcat-site', 'hive-env', 'core-site'], + 'MYSQL_SERVER': ['hive-site'], + 'HISTORYSERVER': ['mapred-site'] + }, + + /** + * Map with lists of related services. + * Used to define list of services to stop/start. + */ + relatedServicesMap: { + 'JOBTRACKER': ['PIG', 'OOZIE'], + 'RESOURCEMANAGER': ['YARN', 'MAPREDUCE2', 'TEZ', 'PIG', 'OOZIE', 'SLIDER', 'SPARK'], + 'APP_TIMELINE_SERVER': ['YARN', 'MAPREDUCE2', 'TEZ', 'OOZIE', 'SLIDER', 'SPARK'], + 'HIVE_SERVER': ['HIVE', 'FALCON', 'ATLAS', 'OOZIE'], + 'HIVE_METASTORE': ['HIVE', 'PIG', 'FALCON', 'ATLAS', 'OOZIE'], + 'WEBHCAT_SERVER': ['HIVE'], + 'OOZIE_SERVER': ['OOZIE', 'FALCON', 'KNOX'], + 'MYSQL_SERVER': ['HIVE', 'OOZIE', 'RANGER', 'RANGER_KMS'], + 'METRICS_COLLECTOR': ['AMBARI_METRICS'] + }, + + isComponentWithReconfiguration: function () { + return this.get('serviceToConfigSiteMap').hasOwnProperty(this.get('content.reassign.component_name')); + }.property('content.reassign.component_name'), + addManualSteps: function () { var hasManualSteps = this.get('content.componentsWithManualCommands').contains(this.get('content.reassign.component_name')); this.set('content.hasManualSteps', hasManualSteps); @@ -285,6 +322,20 @@ App.ReassignMasterController = App.WizardController.extend({ this.set('content.serviceProperties', serviceProperties); }, + saveConfigs: function (configs, attributes) { + var configsObject = { + configs: configs, + configsAttributes: attributes + }; + this.setDBProperties(configsObject); + this.get('content').setProperties(configsObject); + }, + + loadConfigs: function () { + var configsObject = this.getDBProperties(['configs', 'configsAttributes']); + this.get('content').setProperties(configsObject); + }, + saveDatabaseType: function (type) { this.setDBProperty('databaseType', type); this.set('content.databaseType', type); http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/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 66ea208..90cd804 100644 --- a/ambari-web/app/controllers/wizard/step7_controller.js +++ b/ambari-web/app/controllers/wizard/step7_controller.js @@ -42,7 +42,7 @@ var App = require('app'); * @property {?object[]} slaveComponentHosts */ -App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.EnhancedConfigsMixin, App.ToggleIsRequiredMixin, App.GroupsMappingMixin, App.TrackRequestMixin, { +App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.EnhancedConfigsMixin, App.ToggleIsRequiredMixin, App.GroupsMappingMixin, { name: 'wizardStep7Controller', @@ -1511,8 +1511,7 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E }, onSecondary: function () { this._super(); - self.set('submitButtonClicked', false); - App.set('router.nextBtnClickInProgress', false); + self.setButtonClickFinish(); deferred.reject(); } }); @@ -1535,8 +1534,7 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E } }, onSecondary: function() { - App.set('router.nextBtnClickInProgress', false); - self.set('submitButtonClicked', false); + self.setButtonClickFinish(); this.hide(); }, onClose: function() { @@ -1570,6 +1568,14 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E return false; } App.set('router.nextBtnClickInProgress', true); + if (this.get('wizardController.name') === 'addServiceController' && this.get('hasChangedDependencies')) { + return this.showChangedDependentConfigs({}, this.proceedWithChecks.bind(this), this.setButtonClickFinish.bind(this)); + } else { + return this.proceedWithChecks(); + } + }, + + proceedWithChecks: function () { if (this.get('supportsPreInstallChecks')) { var preInstallChecksController = App.router.get('preInstallChecksController'); if (preInstallChecksController.get('preInstallChecksWhereRun')) { @@ -1580,6 +1586,11 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E return this.postSubmit(); }, + setButtonClickFinish: function () { + this.set('submitButtonClicked', false); + App.set('router.nextBtnClickInProgress', false); + }, + postSubmit: function () { var self = this; this.set('submitButtonClicked', true); @@ -1588,8 +1599,7 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E }) .fail(function (value) { if ("invalid_configs" === value) { - self.set('submitButtonClicked', false); - App.set('router.nextBtnClickInProgress', false); + self.setButtonClickFinish(); } else { // Failed due to validation mechanism failure. // Should proceed with other checks http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/messages.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js index 33195e0..134990e 100644 --- a/ambari-web/app/messages.js +++ b/ambari-web/app/messages.js @@ -1295,7 +1295,8 @@ Em.I18n.translations = { 'admin.manageJournalNode.wizard.step8.header': 'Start All Services', 'admin.manageJournalNode.wizard.step1.body': 'Add, or Remove JournalNodes', - 'admin.manageJournalNode.wizard.step3.confirm.config.body': '<b>Configuration Change Review.</b></br>' + + 'admin.manageJournalNode.wizard.step3.confirm.hosts.body': '<b>Confirm your host selections.</b>', + 'admin.manageJournalNode.wizard.step3.confirm.config.body': '<p><b>Review Configuration Changes.</b></p>' + 'As part of this process, configuration changes are required. Please review the changes below, and note that they are for <b>review only</b>. Future steps in this wizard will update this configuration, and restart <b>all</b> services automatically.', 'admin.manageJournalNode.wizard.step4.task0.title' : 'Stop Standby NameNode', @@ -1579,8 +1580,9 @@ Em.I18n.translations = { 'admin.ra_highAvailability.wizard.step3.alert_message': '<b>Confirm your host selections.</b>', 'admin.ra_highAvailability.wizard.step3.currentRA': 'Current Ranger Admin', 'admin.ra_highAvailability.wizard.step3.additionalRA': 'Additional Ranger Admin', - 'admin.rm_highAvailability.wizard.step3.configs_changes': '<b>Review Configuration Changes.</b></br>' + - '<i>policymgr_external_url</i> in admin-properties.xml will be changed by the Wizard to enable Ranger Admin HA', + 'admin.rm_highAvailability.wizard.step3.configs_changes': '<p><b>Review Configuration Changes.</b></p>' + + 'The following lists the configuration changes that will be made by the Wizard to enable Ranger Admin HA. ' + + 'This information is for <b> review only </b> and is not editable.', 'admin.ra_highAvailability.wizard.step4.header': 'Install, Start and Test', 'admin.ra_highAvailability.wizard.step4.task0.title': 'Stop All Services', 'admin.ra_highAvailability.wizard.step4.task1.title': 'Install Additional Ranger Admin', @@ -2260,10 +2262,12 @@ Em.I18n.translations = { 'services.reassign.step2.body':'Assign {0} to new host.', 'services.reassign.step2.body.namenodeHA':'Move {0} to new host. You can move only one master component at a time.', 'services.reassign.step3.header':'Review', - 'services.reassign.step3.body':'Please review the changes you made', + 'services.reassign.step3.body':'<b>Confirm your host selections.</b>', 'services.reassign.step3.targetHost':'Target Host:', 'services.reassign.step3.sourceHost':'Source Host:', 'services.reassign.step3.component':'Component name:', + 'services.reassign.step3.configs':'<div class="alert alert-info">' + + '<p><b>Review Configuration Changes.</b></p>The Wizard will make the following configuration changes.</div>', 'services.reassign.step4.header':'Configure Component', 'services.reassign.step4.tasks.stopRequiredServices.title':'Stop Required Services', @@ -2632,17 +2636,12 @@ Em.I18n.translations = { 'host.host.componentFilter.slave':'Slave Components', 'host.host.componentFilter.client':'Client Components', 'hosts.host.deleteComponent.popup.msg1':'Are you sure you want to delete {0}?', - 'hosts.host.deleteComponent.popup.deleteZooKeeperServer':'Deleting <i>ZooKeeper Server</i> may reconfigure such properties:<ul><li>zookeeper.connect</li><li>ha.zookeeper.quorum</li><li>hbase.zookeeper.quorum</li><li>templeton.zookeeper.hosts</li><li>yarn.resourcemanager.zk-address</li><li>hive.zookeeper.quorum</li><li>hive.cluster.delegation.token.store.zookeeper.connectString</li><li>storm.zookeeper.servers</li><li>instance.zookeeper.host</li></ul>', - 'hosts.host.deleteComponent.popup.deleteRangerKMSServer': 'Deleting <i>Ranger KMS Server</i> may reconfigure such properties:<ul><li>hadoop.security.key.provider.path</li><li>dfs.encryption.key.provider.uri</li>', 'hosts.host.deleteComponent.popup.deleteJournalNodeMsg': 'You are about to open <i>Manage Journal Node Wizard</i>. Are you sure?', 'hosts.host.deleteComponent.popup.warning':'<b>WARNING!</b> Delete the last <i>{0}</i> component in the cluster?</br>Deleting the last component in the cluster could result in permanent loss of service data.', 'hosts.host.deleteComponent.popup.confirm':'Confirm Delete', 'hosts.host.installComponent.popup.confirm':'Confirm Install', 'hosts.host.installComponent.msg':'Are you sure you want to install {0}?', 'hosts.host.addComponent.msg':'Are you sure you want to add {0}?', - 'hosts.host.addComponent.ZOOKEEPER_SERVER':'Adding ZooKeeper Server may reconfigure such properties:<ul><li>zookeeper.connect</li><li>ha.zookeeper.quorum</li><li>hbase.zookeeper.quorum</li><li>templeton.zookeeper.hosts</li><li>yarn.resourcemanager.zk-address</li><li>hive.zookeeper.quorum</li><li>hive.cluster.delegation.token.store.zookeeper.connectString</li><li>storm.zookeeper.servers</li><li>instance.zookeeper.host</li></ul>', - 'hosts.host.addComponent.NIMBUS': 'Adding Nimbus will reconfigure <b>nimbus.seeds</b>, <b>topology.min.replication.count</b>, <b>topology.max.replication.wait.time.sec</b> properties if they are defined.', - 'hosts.host.addComponent.RANGER_KMS_SERVER': 'Adding Ranger KMS Server may reconfigure such properties:<ul><li>hadoop.security.key.provider.path</li><li>dfs.encryption.key.provider.uri</li>', 'hosts.host.addComponent.deleteHostWithZooKeeper':'Deleting host with ZooKeeper Server may reconfigure such properties:<ul><li>ha.zookeeper.quorum</li><li>hbase.zookeeper.quorum</li><li>templeton.zookeeper.hosts</li><li>yarn.resourcemanager.zk-address</li><li>hive.zookeeper.quorum</li><li>hive.cluster.delegation.token.store.zookeeper.connectString</li></ul>', 'host.host.addComponent.popup.dependedComponents.body': '{0} requires {1} to be installed along with it on the same host. Please add them first and then try adding {0}', 'host.host.addComponent.popup.dependedComponents.header': 'Component dependencies', @@ -2650,7 +2649,7 @@ Em.I18n.translations = { 'hosts.host.zooKeeper.configs.save.note': 'This configuration is created by ambari while installing/deleting zookeeper component on a host', 'hosts.host.addComponent.securityNote':'You are running your cluster in secure mode. You must set up the keytab for {0} on {1} before you proceed. Otherwise, the component will not be able to start properly.', 'hosts.host.addComponent.popup.confirm':'Confirm Add', - 'hosts.host.manualKerberosWarning': '<br/><strong>Because Kerberos has been manually installed on the cluster, you will have to create/distribute principals and keytabs when this operation is finished.</strong>', + 'hosts.host.manualKerberosWarning': '<strong>Because Kerberos has been manually installed on the cluster, you will have to create/distribute principals and keytabs when this operation is finished.</strong>', 'hosts.host.deleteComponent.popup.deleteNimbus':'Deleting <i>Storm Nimbus</i> will reconfigure <b>nimbus.seeds</b>, <b>topology.min.replication.count</b>, <b>topology.max.replication.wait.time.sec</b> properties if they are defined.', 'hosts.host.storm.configs.save.note': 'This configuration is created by ambari while installing/deleting storm component on a host', 'hosts.host.datanode.decommission':'Decommission DataNode', @@ -2668,8 +2667,6 @@ Em.I18n.translations = { 'hosts.host.hbase_regionserver.decommission.warning':'Last RegionServer can\'t be decommissioned', 'hosts.host.decommissioned':'Decommissioned', 'hosts.host.decommissioning':'Decommissioning', - 'hosts.host.addComponent.HIVE_METASTORE':'Adding <i>Hive Metastore</i> will reconfigure such properties:<ul><li>hive.metastore.uris</li><li>templeton.hive.properties</li></ul>', - 'hosts.host.addComponent.WEBHCAT_SERVER':'You are about to add <i>WebHCat Server</i>. Are you sure?', 'hosts.host.addComponent.JOURNALNODE': 'You are about to open <i>Manage Journal Node Wizard</i>. Are you sure?', 'hosts.host.deleteComponent.popup.deleteHiveMetastore':'Deleting <i>Hive Metastore</i> will reconfigure such properties:<ul><li>hive.metastore.uris</li><li>templeton.hive.properties</li></ul>', 'hosts.host.deleteComponent.popup.deleteWebHCatServer':'You are about to delete <i>WebHCat Server</i>. Are you sure?', @@ -3259,8 +3256,8 @@ Em.I18n.translations = { 'admin.removeHawqStandby.wizard.step2.header': 'Review', 'admin.removeHawqStandby.wizard.step2.hawqStandby': '<b>Current HAWQ Standby:</b>', 'admin.removeHawqStandby.wizard.step2.confirm.config.body':'<div class="alert alert-info">' + - '<b>Review Configuration Changes.</b></br></br>After removing the HAWQ Standby Master, the Wizard removes the ' + - 'hawq_standby_address_host property from hawq-site.xml. As a best practice, you should configure a new HAWQ Standby Master host after the Wizard completes.</div>', + '<p><b>Review Configuration Changes.</b></p>After removing the HAWQ Standby Master, the Wizard removes the ' + + 'hawq_standby_address_host property from hawq-site.xml. As a best practice, you should configure a new HAWQ Standby Master host after the Wizard completes.</div>', 'admin.removeHawqStandby.wizard.step2.confirm.host.body':'<b>Review HAWQ Standby Master role changes.</b>', 'admin.removeHawqStandby.wizard.step2.confirmPopup.body': 'Do you wish to continue with removing HAWQ Standby Master? Please confirm, before proceeding as you will not be able to rollback from Ambari.', 'admin.removeHawqStandby.wizard.step3.header': 'Finalize Setup', @@ -3294,10 +3291,10 @@ Em.I18n.translations = { 'admin.activateHawqStandby.wizard.step2.toBeActivated': 'TO BE ACTIVATED AS NEW HAWQ MASTER', 'admin.activateHawqStandby.step4.save.configuration.note': 'This configuration is created by Activate HAWQ Standby wizard', 'admin.activateHawqStandby.wizard.step2.confirm.config.body': '<div class="alert alert-info">' + - '<b>Review Configuration Changes.</b><br/><br/>The Wizard will make the following configuration changes. '+ - 'This information is for review only, and cannot be edited.<br/><br/><b>After activating the HAWQ Standby ' + - 'Master, the wizard removes the hawq_standby_address_host property from hawq-site.xml.</b> ' + - 'As a best practice, you should configure a new HAWQ Standby Master host after the wizard completes.</div>', + '<p><b>Review Configuration Changes.</b></p>The Wizard will make the following configuration changes. '+ + 'This information is for review only, and cannot be edited.<br/><br/><b>After activating the HAWQ Standby ' + + 'Master, the wizard removes the hawq_standby_address_host property from hawq-site.xml.</b> ' + + 'As a best practice, you should configure a new HAWQ Standby Master host after the wizard completes.</div>', 'admin.activateHawqStandby.wizard.step2.confirm.host.body':'<b>Review HAWQ Master & Standby Master role changes.</b>', 'admin.activateHawqStandby.wizard.step2.confirmPopup.body': 'Do you wish to continue with activating HAWQ Standy Master? ' + 'Please confirm, before proceeding as you will not be able to rollback from Ambari.', http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/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 f7cc4cf..3e653ae 100644 --- a/ambari-web/app/mixins/common/configs/enhanced_configs.js +++ b/ambari-web/app/mixins/common/configs/enhanced_configs.js @@ -158,6 +158,11 @@ App.EnhancedConfigsMixin = Em.Mixin.create(App.ConfigWithOverrideRecommendationP this.set('recommendationsConfigs', null); }, + clearRecommendations: function () { + this.clearRecommendationsInfo(); + this.clearAllRecommendations(); + }, + /** * sends request to get values for dependent configs * @param {{type: string, name: string}[]} changedConfigs - list of changed configs to track recommendations http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/mixins/common/track_request_mixin.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mixins/common/track_request_mixin.js b/ambari-web/app/mixins/common/track_request_mixin.js index c665253..dd97b97 100644 --- a/ambari-web/app/mixins/common/track_request_mixin.js +++ b/ambari-web/app/mixins/common/track_request_mixin.js @@ -38,14 +38,14 @@ App.TrackRequestMixin = Em.Mixin.create({ this.get('requestsInProgress').pushObject({ request: request, id: requestId, - status: request.state(), - completed: ['resolved', 'rejected'].contains(request.state()) + status: Em.tryInvoke(request, 'state'), + completed: ['resolved', 'rejected'].contains(Em.tryInvoke(request, 'state')) }); request.always(function() { var requestInProgress = self.get('requestsInProgress').findProperty('id', requestId) || {}; Em.setProperties(requestInProgress, { completed: true, - status: request.state() + status: Em.tryInvoke(request, 'state') }); }); }, http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/mixins/main/service/groups_mapping.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mixins/main/service/groups_mapping.js b/ambari-web/app/mixins/main/service/groups_mapping.js index 40cd0cb..6c166c8 100644 --- a/ambari-web/app/mixins/main/service/groups_mapping.js +++ b/ambari-web/app/mixins/main/service/groups_mapping.js @@ -23,7 +23,7 @@ var App = require('app'); * * @type {Em.Mixin} */ -App.GroupsMappingMixin = Em.Mixin.create({ +App.GroupsMappingMixin = Em.Mixin.create(App.TrackRequestMixin, { /** * Load config groups http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/routes/ra_high_availability_routes.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/routes/ra_high_availability_routes.js b/ambari-web/app/routes/ra_high_availability_routes.js index 9995937..13ddd8f 100644 --- a/ambari-web/app/routes/ra_high_availability_routes.js +++ b/ambari-web/app/routes/ra_high_availability_routes.js @@ -129,12 +129,14 @@ module.exports = App.WizardRoute.extend({ controller.dataLoading().done(function () { controller.setCurrentStep('3'); controller.loadAllPriorSteps().done(function () { + var stepController = router.get('rAHighAvailabilityWizardStep3Controller'); + stepController.set('wizardController', controller); controller.connectOutlet('rAHighAvailabilityWizardStep3', controller.get('content')); }); }); }, next: function (router) { - router.transitionTo('step4'); + router.transitionTo('step4');iiii }, back: function (router) { router.transitionTo('step2'); @@ -149,6 +151,8 @@ module.exports = App.WizardRoute.extend({ controller.setCurrentStep('4'); controller.setLowerStepsDisable(4); controller.loadAllPriorSteps().done(function () { + var stepController = router.get('rAHighAvailabilityWizardStep4Controller'); + stepController.set('wizardController', controller); controller.connectOutlet('rAHighAvailabilityWizardStep4', controller.get('content')); }); }); http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/routes/reassign_master_routes.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/routes/reassign_master_routes.js b/ambari-web/app/routes/reassign_master_routes.js index 35bd96f..d5cbadb 100644 --- a/ambari-web/app/routes/reassign_master_routes.js +++ b/ambari-web/app/routes/reassign_master_routes.js @@ -169,16 +169,22 @@ module.exports = App.WizardRoute.extend({ step3: Em.Route.extend({ route: '/step3', connectOutlets: function (router) { - var controller = router.get('reassignMasterController'); + var controller = router.get('reassignMasterController'), + stepController = router.get('reassignMasterWizardStep3Controller'); controller.setCurrentStep('3'); controller.dataLoading().done(function () { controller.loadAllPriorSteps(); + stepController.set('wizardController', controller); controller.connectOutlet('reassignMasterWizardStep3', controller.get('content')); }) }, back: Em.Router.transitionTo('step2'), next: function (router) { - var controller = router.get('reassignMasterController'); + var controller = router.get('reassignMasterController'), + stepController = router.get('reassignMasterWizardStep3Controller'), + configs = stepController.get('configs'), + attributes = stepController.get('configsAttributes'), + secureConfigs = stepController.get('secureConfigs'); App.db.setReassignTasksStatuses(undefined); App.db.setReassignTasksRequestIds(undefined); App.clusterStatus.setClusterStatus({ @@ -188,9 +194,16 @@ module.exports = App.WizardRoute.extend({ localdb: App.db.data }); controller.saveReassignComponentsInMM(controller.getReassignComponentsInMM()); + stepController.updateServiceConfigs(); + controller.saveConfigs(configs, attributes); + controller.saveSecureConfigs(secureConfigs); router.transitionTo('step4'); }, + exit: function (router) { + router.get('reassignMasterWizardStep3Controller').clearStep(); + }, + unroutePath: function () { return false; } @@ -199,11 +212,13 @@ module.exports = App.WizardRoute.extend({ step4: Em.Route.extend({ route: '/step4', connectOutlets: function (router) { - var controller = router.get('reassignMasterController'); + var controller = router.get('reassignMasterController'), + stepController = router.get('reassignMasterWizardStep4Controller'); controller.setCurrentStep('4'); controller.setLowerStepsDisable(4); router.get('mainController').isLoading.call(router.get('clusterController'), 'isServiceContentFullyLoaded').done(function () { controller.loadAllPriorSteps(); + stepController.set('wizardController', controller); controller.connectOutlet('reassignMasterWizardStep4', controller.get('content')); }); }, @@ -303,11 +318,13 @@ module.exports = App.WizardRoute.extend({ step7: Em.Route.extend({ route: '/step7', connectOutlets: function (router) { - var controller = router.get('reassignMasterController'); + var controller = router.get('reassignMasterController'), + stepController = router.get('reassignMasterWizardStep7Controller'); controller.setCurrentStep('7'); controller.setLowerStepsDisable(7); controller.dataLoading().done(function () { controller.loadAllPriorSteps(); + stepController.set('wizardController', controller); controller.connectOutlet('reassignMasterWizardStep7', controller.get('content')); }); }, http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/styles/application.less ---------------------------------------------------------------------- diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less index f7cab50..c100408 100644 --- a/ambari-web/app/styles/application.less +++ b/ambari-web/app/styles/application.less @@ -1087,7 +1087,7 @@ h1 { margin-top: 8px; } - #ha-step3-review-table, #manage-journal-node-step2-review-table { + #ha-step3-review-table, #manage-journal-node-step2-review-table, #reassign-review-table { td { text-align: left; vertical-align: top; @@ -5990,28 +5990,52 @@ input[type="radio"].align-checkbox, input[type="checkbox"].align-checkbox { td { min-width: 120px; word-break: break-all; + &.check-box-col { + min-width: 5px; + width: 5px; + } + &.config-dependency-name { + min-width: @config-dependency-t-name-width; + } + &.config-dependency-service { + min-width: @config-dependency-t-service-width; + max-width: @config-dependency-t-service-width; + } + &.config-dependency-group { + max-width: @config-dependency-t-group-width; + } + &.config-dependency-filename { + max-width: @config-dependency-t-filename-width; + } + &.config-dependency-value, + &.config-dependency-recommended-value { + width: @config-dependency-t-value-width; + min-width: @config-dependency-t-value-width; + } + .diff { + td { + color: #fff; + &.empty { + width: 50%; + } + &.delete { + background-color: @health-status-red !important; + } + &.insert { + background-color: @health-status-green !important; + } + &.replace { + background-color: @health-status-orange !important; + } + } + } } - td.check-box-col { - min-width: 5px; - width: 5px; - } - td.config-dependency-name { - min-width: @config-dependency-t-name-width; - } - td.config-dependency-service { - min-width: @config-dependency-t-service-width; - max-width: @config-dependency-t-service-width; - } - td.config-dependency-group { - max-width: @config-dependency-t-group-width; - } - td.config-dependency-filename { - max-width: @config-dependency-t-filename-width; - } - td.config-dependency-value, - td.config-dependency-recommended-value { - width: @config-dependency-t-value-width; - min-width: @config-dependency-t-value-width; + .config-dependencies-headings-wrapper { + width: 100%; + .config-dependencies-heading { + float: left; + width: 50%; + } } } http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/templates/common/modal_popups/dependent_configs_table.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/common/modal_popups/dependent_configs_table.hbs b/ambari-web/app/templates/common/modal_popups/dependent_configs_table.hbs index b6fff84..be811e3 100644 --- a/ambari-web/app/templates/common/modal_popups/dependent_configs_table.hbs +++ b/ambari-web/app/templates/common/modal_popups/dependent_configs_table.hbs @@ -29,15 +29,17 @@ <th>{{t common.configGroup}}</th> <th>{{t common.fileName}}</th> <th> - <div class="span6"> - {{t popup.dependent.configs.table.currentValue}} - </div> - <div class="span6"> - {{#if view.isEditable}} - {{t popup.dependent.configs.table.recommendedValue}} - {{else}} - {{t popup.dependent.configs.table.newValue}} - {{/if}} + <div class="config-dependencies-headings-wrapper"> + <div class="config-dependencies-heading"> + {{t popup.dependent.configs.table.currentValue}} + </div> + <div class="config-dependencies-heading"> + {{#if view.isEditable}} + {{t popup.dependent.configs.table.recommendedValue}} + {{else}} + {{t popup.dependent.configs.table.newValue}} + {{/if}} + </div> </div> </th> </tr> http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/templates/main/admin/highAvailability/journalNode/step2.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/admin/highAvailability/journalNode/step2.hbs b/ambari-web/app/templates/main/admin/highAvailability/journalNode/step2.hbs index 456e9ed..731e4f5 100644 --- a/ambari-web/app/templates/main/admin/highAvailability/journalNode/step2.hbs +++ b/ambari-web/app/templates/main/admin/highAvailability/journalNode/step2.hbs @@ -19,6 +19,10 @@ <h2>{{t admin.manageJournalNode.wizard.step2.header}}</h2> +<div class="alert alert-info"> + {{t admin.manageJournalNode.wizard.step3.confirm.hosts.body}} +</div> + <div id="manage-journal-node-step2-content" class="well pre-scrollable"> <div id="step8-info"> <table id="manage-journal-node-step2-review-table"> http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/templates/main/admin/highAvailability/rangerAdmin/step3.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/admin/highAvailability/rangerAdmin/step3.hbs b/ambari-web/app/templates/main/admin/highAvailability/rangerAdmin/step3.hbs index 32ea830..68fca6b 100644 --- a/ambari-web/app/templates/main/admin/highAvailability/rangerAdmin/step3.hbs +++ b/ambari-web/app/templates/main/admin/highAvailability/rangerAdmin/step3.hbs @@ -46,6 +46,13 @@ <div class="alert alert-info"> {{{t admin.rm_highAvailability.wizard.step3.configs_changes}}} </div> +{{#if isLoaded}} + <div id="serviceConfig"> + {{view App.ServiceConfigView}} + </div> +{{else}} + {{view App.SpinnerView}} +{{/if}} <div class="btn-area"> <a class="btn" {{action back}}>← {{t common.back}}</a> <a class="btn btn-success pull-right" {{action next}}>{{t common.next}} →</a> http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/templates/main/host/details/addComponentPopup.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/host/details/addComponentPopup.hbs b/ambari-web/app/templates/main/host/details/addComponentPopup.hbs deleted file mode 100644 index ff69b9e..0000000 --- a/ambari-web/app/templates/main/host/details/addComponentPopup.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{{! -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -}} - -{{addComponentMsg}}<br />{{{manualKerberosWarning}}} http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/templates/main/host/details/addDeleteComponentPopup.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/host/details/addDeleteComponentPopup.hbs b/ambari-web/app/templates/main/host/details/addDeleteComponentPopup.hbs new file mode 100644 index 0000000..d1e7aa6 --- /dev/null +++ b/ambari-web/app/templates/main/host/details/addDeleteComponentPopup.hbs @@ -0,0 +1,48 @@ +{{! +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +}} + +{{#if view.lastComponent}} + <div class="alert-error row-fluid"> + <div class='tinyspan tinyoffset'>{{view Ember.Checkbox checkedBinding="view.parentView.isChecked"}}</div> + <div class="span10">{{{view.lastComponentError}}}</div> + </div> +{{/if}} +{{#if view.anyHostsWithoutComponent}} + {{#if view.hasHostsSelect}} + <div>{{view.selectHostMsg}}</div> + <div> + {{view Ember.Select contentBinding="view.hostsWithoutComponent" selectionBinding="view.selectedHost"}} + </div> + {{/if}} + {{#if controller.isReconfigureRequired}} + {{#if controller.isConfigsLoadingInProgress}} + {{view App.SpinnerView}} + {{else}} + {{view.commonMessage}} + {{#if controller.hasPropertiesToChange}} + {{view App.DependentConfigsListView isAfterRecommendation=false recommendationsBinding="controller.recommendedPropertiesToChange" requiredChangesBinding="controller.requiredPropertiesToChange"}} + {{/if}} + {{{view.manualKerberosWarning}}} + {{/if}} + {{else}} + <div>{{view.commonMessage}}</div> + <div>{{{view.manualKerberosWarning}}}</div> + {{/if}} +{{else}} + {{view.thereIsNoHostsMsg}} +{{/if}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/templates/main/host/details/deleteComponentPopup.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/host/details/deleteComponentPopup.hbs b/ambari-web/app/templates/main/host/details/deleteComponentPopup.hbs deleted file mode 100644 index 10b24fd..0000000 --- a/ambari-web/app/templates/main/host/details/deleteComponentPopup.hbs +++ /dev/null @@ -1,43 +0,0 @@ -{{! -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -}} - -<p>{{{deleteComponentMsg}}}</p> -{{#if lastComponent}} - <div class="alert-error row-fluid"> - <div class='tinyspan tinyoffset'>{{view Ember.Checkbox checkedBinding="isChecked"}}</div> - <div class='span10'>{{{lastComponentError}}}</div> - </div> -{{/if}} -{{#if isZkServer}} - <div class='alert'>{{{deleteZkServerMsg}}}</div> -{{/if}} -{{#if isHiveMetastore}} - <div class='alert'>{{{deleteHiveMetastoreMsg}}}</div> -{{/if}} -{{#if isWebHCatServer}} - <div class='alert'>{{{deleteWebHCatServerMsg}}}</div> -{{/if}} -{{#if isNimbus}} - <div class='alert'>{{{deleteNimbusMsg}}}</div> -{{/if}} -{{#if isRangerKMSServer}} - <div class='alert'>{{{deleteRangerKMSServereMsg}}}</div> -{{/if}} -{{#if isJournalNode}} - <div class='alert'>{{{deleteJournalNodeMsg}}}</div> -{{/if}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/templates/main/service/add_host_popup.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/service/add_host_popup.hbs b/ambari-web/app/templates/main/service/add_host_popup.hbs deleted file mode 100644 index 7431080..0000000 --- a/ambari-web/app/templates/main/service/add_host_popup.hbs +++ /dev/null @@ -1,28 +0,0 @@ -{{! -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -}} - -{{#if anyHostsWithoutComponent}} - {{selectHostMsg}}<br /> - <div> - {{view Ember.Select contentBinding="hostsWithoutComponent" selectionBinding="selectedHost"}} - </div> - - {{addComponentMsg}}<br /><br /> -{{else}} - {{thereIsNoHostsMsg}} -{{/if}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/304bd060/ambari-web/app/templates/main/service/info/delete_service_warning_popup.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/service/info/delete_service_warning_popup.hbs b/ambari-web/app/templates/main/service/info/delete_service_warning_popup.hbs new file mode 100644 index 0000000..92f2097 --- /dev/null +++ b/ambari-web/app/templates/main/service/info/delete_service_warning_popup.hbs @@ -0,0 +1,26 @@ +{{! +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +}} + +{{view.warningMessage}} +{{#if controller.isRecommendationInProgress}} + {{view App.SpinnerView}} +{{else}} + {{#if controller.changedProperties.length}} + {{view App.DependentConfigsListView recommendationsBinding="controller.changedProperties"}} + {{/if}} +{{/if}} \ No newline at end of file
