You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by on...@apache.org on 2015/11/10 15:18:00 UTC
ambari git commit: AMBARI-13812. Refactor RM HA step3 controller
(onechiporenko)
Repository: ambari
Updated Branches:
refs/heads/trunk 101dc1d8f -> 9b8701c79
AMBARI-13812. Refactor RM HA step3 controller (onechiporenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/9b8701c7
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/9b8701c7
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/9b8701c7
Branch: refs/heads/trunk
Commit: 9b8701c7934201e4593fced6128841031f7ef2b0
Parents: 101dc1d
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Tue Nov 10 16:15:57 2015 +0200
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Tue Nov 10 16:15:57 2015 +0200
----------------------------------------------------------------------
.../resourceManager/step3_controller.js | 90 ++++-----
.../configs/ha_config_initializer_class.js | 192 +++++++++++++++++++
.../utils/configs/nn_ha_config_initializer.js | 173 +----------------
.../utils/configs/rm_ha_config_initializer.js | 49 +++++
.../resourceManager/step3_controller_test.js | 70 +++++--
5 files changed, 347 insertions(+), 227 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/9b8701c7/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/step3_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/step3_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/step3_controller.js
index 6296f02..5be5b03 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/step3_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/resourceManager/step3_controller.js
@@ -16,7 +16,15 @@
* limitations under the License.
*/
+/**
+ * @typedef {object} rmHaConfigDependencies
+ * @property {string|number} webAddressPort
+ * @property {string|number} httpsWebAddressPort
+ * @property {string|number} zkClientPort
+ */
+
var App = require('app');
+require('utils/configs/rm_ha_config_initializer');
App.RMHighAvailabilityWizardStep3Controller = Em.Controller.extend({
name: "rMHighAvailabilityWizardStep3Controller",
@@ -87,20 +95,9 @@ App.RMHighAvailabilityWizardStep3Controller = Em.Controller.extend({
},
loadConfigsSuccessCallback: function (data, opt, params) {
- var
- zooCfg = data && data.items ? data.items.findProperty('type', 'zoo.cfg') : null,
- yarnSite = data && data.items ? data.items.findProperty('type', 'yarn-site') : null,
- portValue = zooCfg && Em.get(zooCfg, 'properties.clientPort'),
- zkPort = portValue ? portValue : '2181',
- webAddressPort = yarnSite && yarnSite.properties ? yarnSite.properties['yarn.resourcemanager.webapp.address'] : null,
- httpsWebAddressPort = yarnSite && yarnSite.properties ? yarnSite. properties['yarn.resourcemanager.webapp.https.address'] : null;
-
- webAddressPort = webAddressPort && webAddressPort.match(/:[0-9]*/g) ? webAddressPort.match(/:[0-9]*/g)[0] : ":8088";
- httpsWebAddressPort = httpsWebAddressPort && httpsWebAddressPort.match(/:[0-9]*/g) ? httpsWebAddressPort.match(/:[0-9]*/g)[0] : ":8090";
-
params = params.serviceConfig ? params.serviceConfig : arguments[4].serviceConfig;
- this.setDynamicConfigValues(params, zkPort, webAddressPort, httpsWebAddressPort);
+ this.setDynamicConfigValues(params, data);
this.setProperties({
selectedService: params,
isLoaded: true
@@ -108,40 +105,43 @@ App.RMHighAvailabilityWizardStep3Controller = Em.Controller.extend({
},
/**
- * Set values dependent on host selection
- * @param configs
- * @param zkPort
- * @param webAddressPort
- * @param httpsWebAddressPort
+ * Get dependencies for new configs
+ *
+ * @param {{items: object[]}} data
+ * @returns {rmHaConfigDependencies}
+ * @private
+ * @method _prepareDependencies
*/
- setDynamicConfigValues: function (configs, zkPort, webAddressPort, httpsWebAddressPort) {
- var
- configProperties = configs.configs,
- currentRMHost = this.get('content.rmHosts.currentRM'),
- additionalRMHost = this.get('content.rmHosts.additionalRM'),
- zooKeeperHostsWithPort = App.HostComponent.find().filterProperty('componentName', 'ZOOKEEPER_SERVER').map(function (item) {
- return item.get('hostName') + ':' + zkPort;
- }).join(',');
-
- configProperties.findProperty('name', 'yarn.resourcemanager.hostname.rm1').set('value', currentRMHost).set('recommendedValue', currentRMHost);
- configProperties.findProperty('name', 'yarn.resourcemanager.hostname.rm2').set('value', additionalRMHost).set('recommendedValue', additionalRMHost);
- configProperties.findProperty('name', 'yarn.resourcemanager.zk-address').set('value', zooKeeperHostsWithPort).set('recommendedValue', zooKeeperHostsWithPort);
-
- configProperties.findProperty('name', 'yarn.resourcemanager.webapp.address.rm1')
- .set('value', currentRMHost + webAddressPort)
- .set('recommendedValue', currentRMHost + webAddressPort);
-
- configProperties.findProperty('name', 'yarn.resourcemanager.webapp.address.rm2')
- .set('value', additionalRMHost + webAddressPort)
- .set('recommendedValue', additionalRMHost + webAddressPort);
-
- configProperties.findProperty('name', 'yarn.resourcemanager.webapp.https.address.rm1')
- .set('value', currentRMHost + httpsWebAddressPort)
- .set('recommendedValue', currentRMHost + httpsWebAddressPort);
-
- configProperties.findProperty('name', 'yarn.resourcemanager.webapp.https.address.rm2')
- .set('value', additionalRMHost + httpsWebAddressPort)
- .set('recommendedValue', additionalRMHost + httpsWebAddressPort);
+ _prepareDependencies: function (data) {
+ var ret = {};
+ var zooCfg = data && data.items ? data.items.findProperty('type', 'zoo.cfg') : null;
+ var yarnSite = data && data.items ? data.items.findProperty('type', 'yarn-site') : null;
+ var portValue = zooCfg && Em.get(zooCfg, 'properties.clientPort');
+ var webAddressPort = yarnSite && yarnSite.properties ? yarnSite.properties['yarn.resourcemanager.webapp.address'] : '';
+ var httpsWebAddressPort = yarnSite && yarnSite.properties ? yarnSite. properties['yarn.resourcemanager.webapp.https.address'] : '';
+
+ ret.webAddressPort = webAddressPort && webAddressPort.contains(':') ? webAddressPort.split(':')[1] : '8088';
+ ret.httpsWebAddressPort = httpsWebAddressPort && httpsWebAddressPort.contains(':') ? httpsWebAddressPort.split(':')[1] : '8090';
+ ret.zkClientPort = portValue ? portValue : '2181';
+ return ret;
+ },
+
+ /**
+ * Set values to the new configs
+ *
+ * @param {object} configs
+ * @param {object} data
+ * @returns {object}
+ * @method setDynamicConfigValues
+ */
+ setDynamicConfigValues: function (configs, data) {
+ var topologyLocalDB = this.get('content').getProperties(['masterComponentHosts', 'slaveComponentHosts', 'hosts']);
+ var dependencies = this._prepareDependencies(data);
+
+ configs.configs.forEach(function (config) {
+ App.RmHaConfigInitializer.initialValue(config, topologyLocalDB, dependencies);
+ });
+ return configs;
},
/**
http://git-wip-us.apache.org/repos/asf/ambari/blob/9b8701c7/ambari-web/app/utils/configs/ha_config_initializer_class.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/configs/ha_config_initializer_class.js b/ambari-web/app/utils/configs/ha_config_initializer_class.js
new file mode 100644
index 0000000..0273d00
--- /dev/null
+++ b/ambari-web/app/utils/configs/ha_config_initializer_class.js
@@ -0,0 +1,192 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+require('utils/configs/config_initializer_class');
+
+/**
+ * @type {HaConfigInitializerClass}
+ */
+App.HaConfigInitializerClass = App.ConfigInitializerClass.extend({
+
+ /**
+ * Initializer for configs with value equal to the hostName where some component exists
+ * Value may be customized with prefix and suffix (see <code>initializer.modifier</code>)
+ * Port-value is calculated according to <code>initializer.portKey</code> or <code>initializer.port</code> values
+ * If calculated port-value is empty, it will be skipped (and ':' too)
+ * Value-examples: 'SOME_COOL_PREFIXhost1:port1SOME_COOL_SUFFIX', 'host1:port2'
+ *
+ * @param {object} configProperty
+ * @param {extendedTopologyLocalDB} localDB
+ * @param {nnHaConfigDependencies} dependencies
+ * @param {object} initializer
+ * @returns {object}
+ * @private
+ * @method _initAsHostWithPort
+ */
+ _initAsHostWithPort: function (configProperty, localDB, dependencies, initializer) {
+ var hostName = localDB.masterComponentHosts.filterProperty('component', initializer.component).findProperty('isInstalled', initializer.componentExists).hostName;
+ var port = this.__getPort(dependencies, initializer);
+ var value = initializer.modifier.prefix + hostName + (port ? ':' + port : '') + initializer.modifier.suffix;
+ Em.setProperties(configProperty, {
+ value: value,
+ recommendedValue: value
+ });
+ return configProperty;
+ },
+
+ /**
+ * Initializer for configs with value equal to the list of hosts where some component exists
+ * Value may be customized with prefix and suffix (see <code>initializer.modifier</code>)
+ * Delimiter between hostNames also may be customized in the <code>initializer.modifier</code>
+ * Port-value is calculated according to <code>initializer.portKey</code> or <code>initializer.port</code> values
+ * If calculated port-value is empty, it will be skipped (and ':' too)
+ * Value examples: 'SOME_COOL_PREFIXhost1:port,host2:port,host2:portSOME_COOL_SUFFIX', 'host1:port|||host2:port|||host2:port'
+ *
+ * @param {object} configProperty
+ * @param {topologyLocalDB} localDB
+ * @param {nnHaConfigDependencies} dependencies
+ * @param {object} initializer
+ * @returns {object}
+ * @private
+ * @method _initAsHostsWithPort
+ */
+ _initAsHostsWithPort: function (configProperty, localDB, dependencies, initializer) {
+ var hostNames = localDB.masterComponentHosts.filterProperty('component', initializer.component).mapProperty('hostName');
+ var port = this.__getPort(dependencies, initializer);
+ var value = initializer.modifier.prefix + hostNames.map(function (hostName) {
+ return hostName + (port ? ':' + port : '');
+ }).join(initializer.modifier.delimiter) + initializer.modifier.suffix;
+ Em.setProperties(configProperty, {
+ value: value,
+ recommendedValue: value
+ });
+ return configProperty;
+ },
+
+ /**
+ * Returns port-value from <code>dependencies</code> accorfing to <code>initializer.portKey</code> or <code>initializer.port</code> values
+ *
+ * @param {nnHaConfigDependencies} dependencies
+ * @param {object} initializer
+ * @returns {string|number}
+ * @private
+ * @method __getPort
+ */
+ __getPort: function (dependencies, initializer) {
+ var portKey = initializer.portKey;
+ if (portKey) {
+ return dependencies[portKey];
+ }
+ return initializer.port;
+ }
+
+});
+
+App.HaConfigInitializerClass.reopenClass({
+
+ /**
+ * Settings for <code>host_with_port</code>-initializer
+ * Used for configs with value equal to hostName where some component exists concatenated with port-value
+ * Port-value is calculated according to <code>port</code> and <code>portFromDependencies</code> values
+ * If <code>portFromDependencies</code> is <code>true</code>, <code>port</code>-value is used as key of the <code>dependencies</code> (where real port-value is)
+ * Otherwise - <code>port</code>-value used as is
+ * If calculated port-value is empty, it will be skipped (and ':' too)
+ * Value also may be customized with prefix and suffix
+ *
+ * @param {string} component needed component
+ * @param {boolean} componentExists component already exists or just going to be installed
+ * @param {string} prefix=''
+ * @param {string} suffix=''
+ * @param {string} port
+ * @param {boolean} [portFromDependencies=false]
+ * @returns {{type: string, component: string, componentExists: boolean, modifier: {prefix: (string), suffix: (string)}}}
+ * @method getHostWithPortConfig
+ * @static
+ */
+ getHostWithPortConfig: function (component, componentExists, prefix, suffix, port, portFromDependencies) {
+ if (arguments.length < 6) {
+ portFromDependencies = false;
+ }
+ prefix = prefix || '';
+ suffix = suffix || '';
+ var ret = {
+ type: 'host_with_port',
+ component: component,
+ componentExists: componentExists,
+ modifier: {
+ prefix: prefix,
+ suffix: suffix
+ }
+ };
+ if (portFromDependencies) {
+ ret.portKey = port;
+ }
+ else {
+ ret.port = port;
+ }
+ return ret;
+ },
+
+ /**
+ * Settings for <code>hosts_with_port</code>-initializer
+ * Used for configs with value equal to the list of hostNames with port
+ * Value also may be customized with prefix, suffix and delimiter between host:port elements
+ * Port-value is calculated according to <code>port</code> and <code>portFromDependencies</code> values
+ * If <code>portFromDependencies</code> is <code>true</code>, <code>port</code>-value is used as key of the <code>dependencies</code> (where real port-value is)
+ * Otherwise - <code>port</code>-value used as is
+ * If calculated port-value is empty, it will be skipped (and ':' too)
+ *
+ * @param {string} component hosts where this component exists are used as config-value
+ * @param {string} prefix='' substring added before hosts-list
+ * @param {string} suffix='' substring added after hosts-list
+ * @param {string} delimiter=',' delimiter between hosts in the value
+ * @param {string} port if <code>portFromDependencies</code> is <code>false</code> this value is used as port for hosts
+ * if <code>portFromDependencies</code> is <code>true</code> `port` is used as key in the <code>dependencies</code> to get real port-value
+ * @param {boolean} portFromDependencies=false true - use <code>port</code> as key for <code>dependencies</code> to get real port-value,
+ * false - use <code>port</code> as port-value
+ * @returns {{type: string, component: string, modifier: {prefix: (string), suffix: (string), delimiter: (string)}}}
+ * @method getHostsWithPortConfig
+ * @static
+ */
+ getHostsWithPortConfig: function (component, prefix, suffix, delimiter, port, portFromDependencies) {
+ if (arguments.length < 6) {
+ portFromDependencies = false;
+ }
+ prefix = prefix || '';
+ suffix = suffix || '';
+ delimiter = delimiter || ',';
+ var ret = {
+ type: 'hosts_with_port',
+ component: component,
+ modifier: {
+ prefix: prefix,
+ suffix: suffix,
+ delimiter: delimiter
+ }
+ };
+ if (portFromDependencies) {
+ ret.portKey = port;
+ }
+ else {
+ ret.port = port;
+ }
+ return ret;
+ }
+
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/9b8701c7/ambari-web/app/utils/configs/nn_ha_config_initializer.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/configs/nn_ha_config_initializer.js b/ambari-web/app/utils/configs/nn_ha_config_initializer.js
index ef9e9c8..7b7e317 100644
--- a/ambari-web/app/utils/configs/nn_ha_config_initializer.js
+++ b/ambari-web/app/utils/configs/nn_ha_config_initializer.js
@@ -17,7 +17,7 @@
*/
var App = require('app');
-require('utils/configs/config_initializer_class');
+require('utils/configs/ha_config_initializer_class');
/**
* @typedef {topologyLocalDB} extendedTopologyLocalDB
@@ -40,89 +40,6 @@ function getRenameWithNamespaceConfig(toReplace) {
}
/**
- * Settings for <code>host_with_port</code>-initializer
- * Used for configs with value equal to hostName where some component exists concatenated with port-value
- * Port-value is calculated according to <code>port</code> and <code>portFromDependencies</code> values
- * If <code>portFromDependencies</code> is <code>true</code>, <code>port</code>-value is used as key of the <code>dependencies</code> (where real port-value is)
- * Otherwise - <code>port</code>-value used as is
- * Value also may be customized with prefix and suffix
- *
- * @param {string} component needed component
- * @param {boolean} componentExists component already exists or just going to be installed
- * @param {string} prefix=''
- * @param {string} suffix=''
- * @param {string} port
- * @param {boolean} portFromDependencies=false
- * @returns {{type: string, component: string, componentExists: boolean, modifier: {prefix: (string), suffix: (string)}}}
- */
-function getHostWithPortConfig(component, componentExists, prefix, suffix, port, portFromDependencies) {
- if (arguments.length < 6) {
- portFromDependencies = false;
- }
- prefix = prefix || '';
- suffix = suffix || '';
- var ret = {
- type: 'host_with_port',
- component: component,
- componentExists: componentExists,
- modifier: {
- prefix: prefix,
- suffix: suffix
- }
- };
- if (portFromDependencies) {
- ret.portKey = port;
- }
- else {
- ret.port = port;
- }
- return ret;
-}
-
-/**
- * Settings for <code>hosts_with_port</code>-initializer
- * Used for configs with value equal to the list of hostNames with port
- * Value also may be customized with prefix, suffix and delimiter between host:port elements
- * Port-value is calculated according to <code>port</code> and <code>portFromDependencies</code> values
- * If <code>portFromDependencies</code> is <code>true</code>, <code>port</code>-value is used as key of the <code>dependencies</code> (where real port-value is)
- * Otherwise - <code>port</code>-value used as is
- *
- * @param {string} component hosts where this component exists are used as config-value
- * @param {string} prefix='' substring added before hosts-list
- * @param {string} suffix='' substring added after hosts-list
- * @param {string} delimiter=',' delimiter between hosts in the value
- * @param {string} port if <code>portFromDependencies</code> is <code>false</code> this value is used as port for hosts
- * if <code>portFromDependencies</code> is <code>true</code> `port` is used as key in the <code>dependencies</code> to get real port-value
- * @param {boolean} portFromDependencies=false true - use <code>port</code> as key for <code>dependencies</code> to get real port-value,
- * false - use <code>port</code> as port-value
- * @returns {{type: string, component: string, modifier: {prefix: (string), suffix: (string), delimiter: (string)}}}
- */
-function getHostsWithPortConfig(component, prefix, suffix, delimiter, port, portFromDependencies) {
- if (arguments.length < 6) {
- portFromDependencies = false;
- }
- prefix = prefix || '';
- suffix = suffix || '';
- delimiter = delimiter || ',';
- var ret = {
- type: 'hosts_with_port',
- component: component,
- modifier: {
- prefix: prefix,
- suffix: suffix,
- delimiter: delimiter
- }
- };
- if (portFromDependencies) {
- ret.portKey = port;
- }
- else {
- ret.port = port;
- }
- return ret;
-}
-
-/**
* Settings for <code>namespace</code>-initializer
* Used for configs with value equal to the <code>namespaceId</code> (provided by user on the wizard's 1st step)
* Value may be customized with prefix and suffix
@@ -162,42 +79,42 @@ function getReplaceNamespaceConfig(toReplace) {
*
* @class {NnHaConfigInitializer}
*/
-App.NnHaConfigInitializer = App.ConfigInitializerClass.create({
+App.NnHaConfigInitializer = App.HaConfigInitializerClass.create({
initializers: {
'dfs.ha.namenodes.${dfs.nameservices}': getRenameWithNamespaceConfig('${dfs.nameservices}'),
'dfs.namenode.rpc-address.${dfs.nameservices}.nn1': [
- getHostWithPortConfig('NAMENODE', true, '', '', 'nnRpcPort', true),
+ App.HaConfigInitializerClass.getHostWithPortConfig('NAMENODE', true, '', '', 'nnRpcPort', true),
getRenameWithNamespaceConfig('${dfs.nameservices}')
],
'dfs.namenode.rpc-address.${dfs.nameservices}.nn2': [
- getHostWithPortConfig('NAMENODE', false, '', '', '8020', false),
+ App.HaConfigInitializerClass.getHostWithPortConfig('NAMENODE', false, '', '', '8020', false),
getRenameWithNamespaceConfig('${dfs.nameservices}')
],
'dfs.namenode.http-address.${dfs.nameservices}.nn1': [
- getHostWithPortConfig('NAMENODE', true, '', '', 'nnHttpPort', true),
+ App.HaConfigInitializerClass.getHostWithPortConfig('NAMENODE', true, '', '', 'nnHttpPort', true),
getRenameWithNamespaceConfig('${dfs.nameservices}')
],
'dfs.namenode.http-address.${dfs.nameservices}.nn2': [
- getHostWithPortConfig('NAMENODE', false, '', '', '50070', false),
+ App.HaConfigInitializerClass.getHostWithPortConfig('NAMENODE', false, '', '', '50070', false),
getRenameWithNamespaceConfig('${dfs.nameservices}')
],
'dfs.namenode.https-address.${dfs.nameservices}.nn1': [
- getHostWithPortConfig('NAMENODE', true, '', '', 'nnHttpsPort', true),
+ App.HaConfigInitializerClass.getHostWithPortConfig('NAMENODE', true, '', '', 'nnHttpsPort', true),
getRenameWithNamespaceConfig('${dfs.nameservices}')
],
'dfs.namenode.https-address.${dfs.nameservices}.nn2': [
- getHostWithPortConfig('NAMENODE', false, '', '', '50470', false),
+ App.HaConfigInitializerClass.getHostWithPortConfig('NAMENODE', false, '', '', '50470', false),
getRenameWithNamespaceConfig('${dfs.nameservices}')
],
'dfs.client.failover.proxy.provider.${dfs.nameservices}': getRenameWithNamespaceConfig('${dfs.nameservices}'),
'dfs.nameservices': getNamespaceConfig(),
'fs.defaultFS': getNamespaceConfig('hdfs://'),
'dfs.namenode.shared.edits.dir': [
- getHostsWithPortConfig('JOURNALNODE', 'qjournal://', '/${dfs.nameservices}', ';', '8485', false),
+ App.HaConfigInitializerClass.getHostsWithPortConfig('JOURNALNODE', 'qjournal://', '/${dfs.nameservices}', ';', '8485', false),
getReplaceNamespaceConfig('${dfs.nameservices}')
],
- 'ha.zookeeper.quorum': getHostsWithPortConfig('ZOOKEEPER_SERVER', '', '', ',', 'zkClientPort', true)
+ 'ha.zookeeper.quorum': App.HaConfigInitializerClass.getHostsWithPortConfig('ZOOKEEPER_SERVER', '', '', ',', 'zkClientPort', true)
},
uniqueInitializers: {
@@ -303,76 +220,6 @@ App.NnHaConfigInitializer = App.ConfigInitializerClass.create({
},
/**
- * Initializer for configs with value equal to the hostName where some component exists
- * Value may be customized with prefix and suffix (see <code>initializer.modifier</code>)
- * Port-value is calculated according to <code>initializer.portKey</code> or <code>initializer.port</code> values
- * Value-examples: 'SOME_COOL_PREFIXhost1:port1SOME_COOL_SUFFIX', 'host1:port2'
- *
- * @param {object} configProperty
- * @param {extendedTopologyLocalDB} localDB
- * @param {nnHaConfigDependencies} dependencies
- * @param {object} initializer
- * @returns {object}
- * @private
- * @method _initAsHostWithPort
- */
- _initAsHostWithPort: function (configProperty, localDB, dependencies, initializer) {
- var hostName = localDB.masterComponentHosts.filterProperty('component', initializer.component).findProperty('isInstalled', initializer.componentExists).hostName;
- var port = this.__getPort(dependencies, initializer);
- var value = initializer.modifier.prefix + hostName + ':' + port + initializer.modifier.suffix;
- Em.setProperties(configProperty, {
- value: value,
- recommendedValue: value
- });
- return configProperty;
- },
-
- /**
- * Initializer for configs with value equal to the list of hosts where some component exists
- * Value may be customized with prefix and suffix (see <code>initializer.modifier</code>)
- * Delimiter between hostNames also may be customized in the <code>initializer.modifier</code>
- * Port-value is calculated according to <code>initializer.portKey</code> or <code>initializer.port</code> values
- * Value examples: 'SOME_COOL_PREFIXhost1:port,host2:port,host2:portSOME_COOL_SUFFIX', 'host1:port|||host2:port|||host2:port'
- *
- * @param {object} configProperty
- * @param {topologyLocalDB} localDB
- * @param {nnHaConfigDependencies} dependencies
- * @param {object} initializer
- * @returns {object}
- * @private
- * @method _initAsHostsWithPort
- */
- _initAsHostsWithPort: function (configProperty, localDB, dependencies, initializer) {
- var hostNames = localDB.masterComponentHosts.filterProperty('component', initializer.component).mapProperty('hostName');
- var port = this.__getPort(dependencies, initializer);
- var value = initializer.modifier.prefix + hostNames.map(function (hostName) {
- return hostName + ':' + port;
- }).join(initializer.modifier.delimiter) + initializer.modifier.suffix;
- Em.setProperties(configProperty, {
- value: value,
- recommendedValue: value
- });
- return configProperty;
- },
-
- /**
- * Returns port-value from <code>dependencies</code> accorfing to <code>initializer.portKey</code> or <code>initializer.port</code> values
- *
- * @param {nnHaConfigDependencies} dependencies
- * @param {object} initializer
- * @returns {string|number}
- * @private
- * @method __getPort
- */
- __getPort: function (dependencies, initializer) {
- var portKey = initializer.portKey;
- if (portKey) {
- return dependencies[portKey];
- }
- return initializer.port;
- },
-
- /**
* Unique initializer for <code>hbase.rootdir</code>
*
* @param {object} configProperty
http://git-wip-us.apache.org/repos/asf/ambari/blob/9b8701c7/ambari-web/app/utils/configs/rm_ha_config_initializer.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/configs/rm_ha_config_initializer.js b/ambari-web/app/utils/configs/rm_ha_config_initializer.js
new file mode 100644
index 0000000..1b1885a
--- /dev/null
+++ b/ambari-web/app/utils/configs/rm_ha_config_initializer.js
@@ -0,0 +1,49 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+require('utils/configs/config_initializer_class');
+
+/**
+ *
+ * @class {RmHaConfigInitializer}
+ */
+App.RmHaConfigInitializer = App.HaConfigInitializerClass.create({
+
+ initializers: {
+ 'yarn.resourcemanager.hostname.rm1': App.HaConfigInitializerClass.getHostWithPortConfig('RESOURCEMANAGER', true, '', '', ''),
+ 'yarn.resourcemanager.hostname.rm2': App.HaConfigInitializerClass.getHostWithPortConfig('RESOURCEMANAGER', false,'', '', ''),
+ 'yarn.resourcemanager.zk-address': App.HaConfigInitializerClass.getHostsWithPortConfig('ZOOKEEPER_SERVER', '', '', ',', 'zkClientPort', true),
+ 'yarn.resourcemanager.webapp.address.rm1': App.HaConfigInitializerClass.getHostWithPortConfig('RESOURCEMANAGER', true, '', '', 'webAddressPort', true),
+ 'yarn.resourcemanager.webapp.address.rm2': App.HaConfigInitializerClass.getHostWithPortConfig('RESOURCEMANAGER', false, '', '', 'webAddressPort', true),
+ 'yarn.resourcemanager.webapp.https.address.rm1': App.HaConfigInitializerClass.getHostWithPortConfig('RESOURCEMANAGER', true, '', '', 'httpsWebAddressPort', true),
+ 'yarn.resourcemanager.webapp.https.address.rm2': App.HaConfigInitializerClass.getHostWithPortConfig('RESOURCEMANAGER', false, '', '', 'httpsWebAddressPort', true)
+ },
+
+ uniqueInitializers: {},
+
+ initializerTypes: {
+ host_with_port: {
+ method: '_initAsHostWithPort'
+ },
+ hosts_with_port: {
+ method: '_initAsHostsWithPort'
+ }
+ }
+
+});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/9b8701c7/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step3_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step3_controller_test.js b/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step3_controller_test.js
index ae4dda0..b2e8f59 100644
--- a/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step3_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/highAvailability/resourceManager/step3_controller_test.js
@@ -23,7 +23,9 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
describe('#isSubmitDisabled', function () {
- var controller = App.RMHighAvailabilityWizardStep3Controller.create(),
+ var controller = App.RMHighAvailabilityWizardStep3Controller.create({
+ content: Em.Object.create({})
+ }),
cases = [
{
isLoaded: false,
@@ -48,7 +50,9 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
describe('#loadConfigTagsSuccessCallback', function () {
- var controller = App.RMHighAvailabilityWizardStep3Controller.create();
+ var controller = App.RMHighAvailabilityWizardStep3Controller.create({
+ content: Em.Object.create({})
+ });
beforeEach(function () {
sinon.stub(App.ajax, 'send', Em.K);
@@ -82,7 +86,9 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
describe('#loadConfigsSuccessCallback', function () {
- var controller = App.RMHighAvailabilityWizardStep3Controller.create(),
+ var controller = App.RMHighAvailabilityWizardStep3Controller.create({
+ content: Em.Object.create({})
+ }),
cases = [
{
'items': [],
@@ -173,7 +179,6 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
controller.loadConfigsSuccessCallback({
items: item.items
}, {}, item.params);
- expect(controller.setDynamicConfigValues.args[0]).to.eql([{}, item.port, item.webAddressPort, item.httpsWebAddressPort]);
expect(controller.get('selectedService')).to.eql({});
expect(controller.get('isLoaded')).to.be.true;
});
@@ -183,7 +188,9 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
describe('#loadConfigsSuccessCallback=loadConfigsErrorCallback(we have one callback for bouth cases)', function () {
- var controller = App.RMHighAvailabilityWizardStep3Controller.create();
+ var controller = App.RMHighAvailabilityWizardStep3Controller.create({
+ content: Em.Object.create({})
+ });
beforeEach(function () {
sinon.stub(controller, 'setDynamicConfigValues', Em.K);
@@ -197,7 +204,6 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
controller.loadConfigsSuccessCallback({}, {}, {}, {}, {
serviceConfig: {}
});
- expect(controller.setDynamicConfigValues.args[0]).to.eql([{}, '2181', ':8088', ':8090']);
expect(controller.get('selectedService')).to.eql({});
expect(controller.get('isLoaded')).to.be.true;
});
@@ -206,13 +212,39 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
describe('#setDynamicConfigValues', function () {
+ var data = {
+ items: [
+ {
+ type: 'zoo.cfg',
+ properties: {
+ clientPort: 2222
+ }
+ },
+ {
+ type: 'yarn-site',
+ properties: {
+ 'yarn.resourcemanager.webapp.address': 'lclhst:1234',
+ 'yarn.resourcemanager.webapp.https.address': 'lclhst:4321'
+ }
+ }
+ ]
+ };
+
var controller = App.RMHighAvailabilityWizardStep3Controller.create({
- content: {
+ content: Em.Object.create({
+ masterComponentHosts: [
+ {component: 'RESOURCEMANAGER', hostName: 'h0', isInstalled: true},
+ {component: 'RESOURCEMANAGER', hostName: 'h1', isInstalled: false},
+ {component: 'ZOOKEEPER_SERVER', hostName: 'h2', isInstalled: true},
+ {component: 'ZOOKEEPER_SERVER', hostName: 'h3', isInstalled: true}
+ ],
+ slaveComponentHosts: [],
+ hosts: {},
rmHosts: {
currentRM: 'h0',
additionalRM: 'h1'
}
- }
+ })
}),
configs = {
configs: [
@@ -264,24 +296,24 @@ describe('App.RMHighAvailabilityWizardStep3Controller', function () {
});
it('setting new RM properties values', function () {
- controller.setDynamicConfigValues(configs, '2181', ':8088', ':8090');
+ controller.setDynamicConfigValues(configs, data);
expect(configs.configs.findProperty('name', 'yarn.resourcemanager.hostname.rm1').get('value')).to.equal('h0');
expect(configs.configs.findProperty('name', 'yarn.resourcemanager.hostname.rm1').get('recommendedValue')).to.equal('h0');
expect(configs.configs.findProperty('name', 'yarn.resourcemanager.hostname.rm2').get('value')).to.equal('h1');
expect(configs.configs.findProperty('name', 'yarn.resourcemanager.hostname.rm2').get('recommendedValue')).to.equal('h1');
- expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.address.rm1').get('value')).to.equal('h0:8088');
- expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.address.rm1').get('recommendedValue')).to.equal('h0:8088');
- expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.address.rm2').get('value')).to.equal('h1:8088');
- expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.address.rm2').get('recommendedValue')).to.equal('h1:8088');
+ expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.address.rm1').get('value')).to.equal('h0:1234');
+ expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.address.rm1').get('recommendedValue')).to.equal('h0:1234');
+ expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.address.rm2').get('value')).to.equal('h1:1234');
+ expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.address.rm2').get('recommendedValue')).to.equal('h1:1234');
- expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.https.address.rm1').get('value')).to.equal('h0:8090');
- expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.https.address.rm1').get('recommendedValue')).to.equal('h0:8090');
- expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.https.address.rm2').get('value')).to.equal('h1:8090');
- expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.https.address.rm2').get('recommendedValue')).to.equal('h1:8090');
+ expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.https.address.rm1').get('value')).to.equal('h0:4321');
+ expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.https.address.rm1').get('recommendedValue')).to.equal('h0:4321');
+ expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.https.address.rm2').get('value')).to.equal('h1:4321');
+ expect(configs.configs.findProperty('name', 'yarn.resourcemanager.webapp.https.address.rm2').get('recommendedValue')).to.equal('h1:4321');
- expect(configs.configs.findProperty('name', 'yarn.resourcemanager.zk-address').get('value')).to.equal('h2:2181,h3:2181');
- expect(configs.configs.findProperty('name', 'yarn.resourcemanager.zk-address').get('recommendedValue')).to.equal('h2:2181,h3:2181');
+ expect(configs.configs.findProperty('name', 'yarn.resourcemanager.zk-address').get('value')).to.equal('h2:2222,h3:2222');
+ expect(configs.configs.findProperty('name', 'yarn.resourcemanager.zk-address').get('recommendedValue')).to.equal('h2:2222,h3:2222');
});
});