You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ab...@apache.org on 2019/07/09 13:15:58 UTC
[ambari] branch branch-2.7 updated: AMBARI-25331 [HA]
RESOURCEMANAGER is not starting after adding and removing journal nodes.
(ababiichuk)
This is an automated email from the ASF dual-hosted git repository.
ababiichuk pushed a commit to branch branch-2.7
in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/branch-2.7 by this push:
new 8c2015b AMBARI-25331 [HA] RESOURCEMANAGER is not starting after adding and removing journal nodes. (ababiichuk)
8c2015b is described below
commit 8c2015b34dcdf0755b4f181873bcef636c06c55c
Author: aBabiichuk <ab...@hortonworks.com>
AuthorDate: Tue Jul 9 16:15:52 2019 +0300
AMBARI-25331 [HA] RESOURCEMANAGER is not starting after adding and removing journal nodes. (ababiichuk)
---
.../main/admin/federation/step3_controller.js | 16 +++-----
.../journalNode/step2_controller.js | 45 ++++++++++++++++++----
.../journalNode/wizard_controller.js | 16 ++++----
ambari-web/app/controllers/wizard.js | 13 +++++++
.../wizards/move_journal_node_properties.js | 18 ++++++++-
ambari-web/app/routes/manage_journalnode_routes.js | 2 +-
.../journalNode/step2_controller_test.js | 36 +++++++++++++----
.../journalNode/wizard_controller_test.js | 16 ++++----
8 files changed, 118 insertions(+), 44 deletions(-)
diff --git a/ambari-web/app/controllers/main/admin/federation/step3_controller.js b/ambari-web/app/controllers/main/admin/federation/step3_controller.js
index 1f9890b..c4e0775 100644
--- a/ambari-web/app/controllers/main/admin/federation/step3_controller.js
+++ b/ambari-web/app/controllers/main/admin/federation/step3_controller.js
@@ -140,6 +140,7 @@ App.NameNodeFederationWizardStep3Controller = Em.Controller.extend(App.Blueprint
var result = [];
var configsToRemove = [];
var hdfsSiteConfigs = this.get('serverConfigData').items.findProperty('type', 'hdfs-site').properties;
+ var wizardController = App.router.get(this.get('content.controllerName'));
if (!hdfsSiteConfigs['dfs.namenode.servicerpc-address.' + dependencies.nameservice1 + '.nn1'] && !hdfsSiteConfigs['dfs.namenode.servicerpc-address.' + dependencies.nameservice1 + '.nn2']) {
configsToRemove = configsToRemove.concat([
@@ -205,10 +206,10 @@ App.NameNodeFederationWizardStep3Controller = Em.Controller.extend(App.Blueprint
configs.forEach(function (config) {
if (!configsToRemove.contains(config.name)) {
config.isOverridable = false;
- config.name = this.replaceDependencies(config.name, dependencies);
- config.displayName = this.replaceDependencies(config.displayName, dependencies);
- config.value = this.replaceDependencies(config.value, dependencies);
- config.recommendedValue = this.replaceDependencies(config.recommendedValue, dependencies);
+ config.name = wizardController.replaceDependencies(config.name, dependencies);
+ config.displayName = wizardController.replaceDependencies(config.displayName, dependencies);
+ config.value = wizardController.replaceDependencies(config.value, dependencies);
+ config.recommendedValue = wizardController.replaceDependencies(config.recommendedValue, dependencies);
result.push(config);
}
}, this);
@@ -229,13 +230,6 @@ App.NameNodeFederationWizardStep3Controller = Em.Controller.extend(App.Blueprint
};
},
- replaceDependencies: function (value, dependencies) {
- Em.keys(dependencies).forEach(function (key) {
- value = value.replace(new RegExp('{{' + key + '}}', 'g'), dependencies[key]);
- });
- return value;
- },
-
removeConfigs: function (configsToRemove, configs) {
Em.keys(configsToRemove).forEach(function (site) {
var siteConfigs = configs.items.findProperty('type', site);
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/journalNode/step2_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/journalNode/step2_controller.js
index 108c97a..7b52ff4 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/journalNode/step2_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/journalNode/step2_controller.js
@@ -82,7 +82,7 @@ App.ManageJournalNodeWizardStep2Controller = Em.Controller.extend({
onLoadConfigs: function (data) {
this.set('serverConfigData', data);
- this.set('content.nameServiceId', data.items[0].properties['dfs.nameservices']);
+ this.set('content.nameServiceIds', data.items[0].properties['dfs.nameservices'].split(','));
this.tweakServiceConfigs(this.get('moveJNConfig.configs'));
this.renderServiceConfigs(this.get('moveJNConfig'));
this.set('isLoaded', true);
@@ -91,10 +91,10 @@ App.ManageJournalNodeWizardStep2Controller = Em.Controller.extend({
/**
* Generate set of data used to correctly initialize config values and names
*/
- _prepareDependencies: function () {
+ _prepareDependencies: function (nameServiceId) {
var ret = {};
var configsFromServer = this.get('serverConfigData.items');
- ret.namespaceId = this.get('content.nameServiceId');
+ ret.namespaceId = nameServiceId || this.get('content.nameServiceIds')[0];
ret.serverConfigs = configsFromServer;
return ret;
},
@@ -113,16 +113,45 @@ App.ManageJournalNodeWizardStep2Controller = Em.Controller.extend({
return localDB;
},
- tweakServiceConfigs: function (configs) {
+ tweakServiceConfigs: function (allConfigsDescriptor) {
+ var hasNameNodeFederation = App.get('hasNameNodeFederation');
+ var configs = hasNameNodeFederation
+ ? allConfigsDescriptor.filterProperty('presentForFederatedHDFS')
+ : allConfigsDescriptor.filterProperty('presentForNonFederatedHDFS');
+ var nameSpaceDependentConfigs = configs.filterProperty('dependsOnNameServiceId');
+ var nameSpaceIndependentConfigs = configs.rejectProperty('dependsOnNameServiceId');
var localDB = this._prepareLocalDB();
- var dependencies = this._prepareDependencies();
+ var commonDependencies = this._prepareDependencies();
+ var generatedConfigs = [];
+ var wizardController = App.router.get(this.get('content.controllerName'));
+ var journalNodes = this.get('content.masterComponentHosts').filterProperty('component', 'JOURNALNODE');
- configs.forEach(function (config) {
- App.NnHaConfigInitializer.initialValue(config, localDB, dependencies);
+ nameSpaceIndependentConfigs.forEach(function (config) {
+ App.NnHaConfigInitializer.initialValue(config, localDB, commonDependencies);
config.isOverridable = false;
+ generatedConfigs.push(config);
});
- return configs;
+ this.get('content.nameServiceIds').forEach(function (nameServiceId) {
+ var dependencies = this._prepareDependencies(nameServiceId);
+ dependencies.journalnodes = journalNodes.map(function (c) {
+ return c.hostName + ':8485';
+ }).join(';');
+ nameSpaceDependentConfigs.forEach(function (config) {
+ var generatedConfig = $.extend({}, config, {
+ isOverridable: false,
+ name: wizardController.replaceDependencies(config.name, dependencies),
+ displayName: wizardController.replaceDependencies(config.displayName, dependencies),
+ value: wizardController.replaceDependencies(config.value, dependencies),
+ recommendedValue: wizardController.replaceDependencies(config.recommendedValue, dependencies)
+ });
+ generatedConfigs.push(generatedConfig);
+ }, this);
+ }, this);
+
+ this.set('moveJNConfig.configs', generatedConfigs);
+
+ return generatedConfigs;
},
renderServiceConfigs: function (_serviceConfig) {
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/journalNode/wizard_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/journalNode/wizard_controller.js
index e39e22c..c224ab8 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/journalNode/wizard_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/journalNode/wizard_controller.js
@@ -42,7 +42,7 @@ App.ManageJournalNodeWizardController = App.WizardController.extend({
serviceConfigProperties: [],
serviceName: 'MISC',
hdfsUser: "hdfs",
- nameServiceId: '',
+ nameServiceIds: [],
failedTask: null,
requestIds: null
}),
@@ -104,7 +104,7 @@ App.ManageJournalNodeWizardController = App.WizardController.extend({
{
type: 'sync',
callback: function () {
- this.loadNameServiceId();
+ this.loadNameServiceIds();
this.loadServiceConfigProperties();
}
}
@@ -205,14 +205,14 @@ App.ManageJournalNodeWizardController = App.WizardController.extend({
this.set('content.' + tag, tagVal);
},
- saveNameServiceId: function (nameServiceId) {
- this.setDBProperty('nameServiceId', nameServiceId);
- this.set('content.nameServiceId', nameServiceId);
+ saveNameServiceIds: function (nameServiceIds) {
+ this.setDBProperty('nameServiceIds', nameServiceIds);
+ this.set('content.nameServiceIds', nameServiceIds);
},
- loadNameServiceId: function () {
- var nameServiceId = this.getDBProperty('nameServiceId');
- this.set('content.nameServiceId', nameServiceId);
+ loadNameServiceIds: function () {
+ var nameServiceIds = this.getDBProperty('nameServiceIds');
+ this.set('content.nameServiceIds', nameServiceIds);
},
/**
diff --git a/ambari-web/app/controllers/wizard.js b/ambari-web/app/controllers/wizard.js
index f2adde7..4dea603 100644
--- a/ambari-web/app/controllers/wizard.js
+++ b/ambari-web/app/controllers/wizard.js
@@ -1529,5 +1529,18 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
});
}
});
+ },
+
+ /**
+ * Replace placeholders for config properties which have dynamic names/values with actual data
+ * @param value
+ * @param dependencies
+ * @returns {*}
+ */
+ replaceDependencies: function (value, dependencies) {
+ Em.keys(dependencies).forEach(function (key) {
+ value = value.replace(new RegExp('{{' + key + '}}', 'g'), dependencies[key]);
+ });
+ return value;
}
});
diff --git a/ambari-web/app/data/configs/wizards/move_journal_node_properties.js b/ambari-web/app/data/configs/wizards/move_journal_node_properties.js
index 87a6cfd..b69d7f6 100644
--- a/ambari-web/app/data/configs/wizards/move_journal_node_properties.js
+++ b/ambari-web/app/data/configs/wizards/move_journal_node_properties.js
@@ -35,7 +35,23 @@ module.exports =
"value": "qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster",
"category": "HDFS",
"filename": "hdfs-site",
- "serviceName": 'MISC'
+ "serviceName": 'MISC',
+ "presentForNonFederatedHDFS": true,
+ "presentForFederatedHDFS": false,
+ "dependsOnNameServiceId": false
+ },
+ {
+ "name": "dfs.namenode.shared.edits.dir.{{namespaceId}}",
+ "displayName": "dfs.namenode.shared.edits.dir.{{namespaceId}}",
+ "description": "The URI which identifies the group of JNs where the NameNodes will write/read edits.",
+ "isReconfigurable": false,
+ "recommendedValue": "qjournal://{{journalnodes}}/{{namespaceId}}",
+ "value": "qjournal://{{journalnodes}}/{{namespaceId}}",
+ "category": "HDFS",
+ "filename": "hdfs-site",
+ "presentForNonFederatedHDFS": false,
+ "presentForFederatedHDFS": true,
+ "dependsOnNameServiceId": true
}
]
}
diff --git a/ambari-web/app/routes/manage_journalnode_routes.js b/ambari-web/app/routes/manage_journalnode_routes.js
index ae119f4..58c1a39 100644
--- a/ambari-web/app/routes/manage_journalnode_routes.js
+++ b/ambari-web/app/routes/manage_journalnode_routes.js
@@ -120,7 +120,7 @@ module.exports = App.WizardRoute.extend({
var stepController = router.get('manageJournalNodeWizardStep2Controller');
controller.saveServiceConfigProperties(stepController);
controller.saveConfigTag(stepController.get("hdfsSiteTag"));
- controller.saveNameServiceId(stepController.get('content.nameServiceId'));
+ controller.saveNameServiceIds(stepController.get('content.nameServiceIds'));
App.set('router.nextBtnClickInProgress', false);
if (controller.get('isDeleteOnly')) {
router.transitionTo('step4');
diff --git a/ambari-web/test/controllers/main/admin/highAvailability/journalNode/step2_controller_test.js b/ambari-web/test/controllers/main/admin/highAvailability/journalNode/step2_controller_test.js
index 17230bb..420f8de 100644
--- a/ambari-web/test/controllers/main/admin/highAvailability/journalNode/step2_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/highAvailability/journalNode/step2_controller_test.js
@@ -111,7 +111,7 @@ describe('App.ManageJournalNodeWizardStep2Controller', function () {
items: [
{
properties: {
- 'dfs.nameservices': 'id'
+ 'dfs.nameservices': 'id0,id1'
}
}
]
@@ -142,9 +142,9 @@ describe('App.ManageJournalNodeWizardStep2Controller', function () {
expect(controller.get('serverConfigData')).to.be.eql(data);
});
- it('nameServiceId should be "id"', function() {
+ it('nameServiceIds should be ["id0", "id1"]', function() {
controller.onLoadConfigs(data);
- expect(controller.get('content.nameServiceId')).to.be.equal('id');
+ expect(controller.get('content.nameServiceIds')).to.eql(['id0', 'id1']);
});
it('isLoaded should be true', function() {
@@ -157,7 +157,7 @@ describe('App.ManageJournalNodeWizardStep2Controller', function () {
it('should return configs object', function() {
controller.set('serverConfigData', {items: []});
- controller.set('content.nameServiceId', 'id1');
+ controller.set('content.nameServiceIds', ['id1', 'id2']);
expect(controller._prepareDependencies()).to.be.eql({
namespaceId: 'id1',
serverConfigs: []
@@ -200,22 +200,44 @@ describe('App.ManageJournalNodeWizardStep2Controller', function () {
sinon.stub(controller, '_prepareLocalDB').returns({});
sinon.stub(controller, '_prepareDependencies').returns({});
sinon.stub(App.NnHaConfigInitializer, 'initialValue');
+ sinon.stub(App, 'get', function (key) {
+ if (key === 'hasNameNodeFederation') {
+ return false;
+ }
+ return Em.get(App, key);
+ });
+ controller.set('content.controllerName', 'manageJournalNodeWizardController');
+ controller.set('content.masterComponentHosts', []);
+ controller.set('content.nameServiceIds', []);
});
afterEach(function() {
controller._prepareLocalDB.restore();
controller._prepareDependencies.restore();
App.NnHaConfigInitializer.initialValue.restore();
+ App.get.restore();
});
it('App.NnHaConfigInitializer.initialValue should be called', function() {
- controller.tweakServiceConfigs([{}]);
+ controller.tweakServiceConfigs([
+ {
+ dependsOnNameServiceId: false,
+ presentForNonFederatedHDFS: true
+ }
+ ]);
expect(App.NnHaConfigInitializer.initialValue.calledOnce).to.be.true;
});
it('should return array of configs', function() {
- expect(controller.tweakServiceConfigs([{}])).to.be.eql([{
- isOverridable: false
+ expect(controller.tweakServiceConfigs([
+ {
+ dependsOnNameServiceId: false,
+ presentForNonFederatedHDFS: true
+ }
+ ])).to.be.eql([{
+ dependsOnNameServiceId: false,
+ isOverridable: false,
+ presentForNonFederatedHDFS: true
}]);
});
});
diff --git a/ambari-web/test/controllers/main/admin/highAvailability/journalNode/wizard_controller_test.js b/ambari-web/test/controllers/main/admin/highAvailability/journalNode/wizard_controller_test.js
index fe8778f..fc0fd09 100644
--- a/ambari-web/test/controllers/main/admin/highAvailability/journalNode/wizard_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/highAvailability/journalNode/wizard_controller_test.js
@@ -308,28 +308,28 @@ describe('App.ManageJournalNodeWizardController', function () {
});
});
- describe('#saveNameServiceId', function() {
+ describe('#saveNameServiceIds', function() {
beforeEach(function() {
sinon.stub(controller, 'setDBProperty');
});
it('nameServiceId should be set', function() {
- controller.saveNameServiceId('id1');
- expect(controller.setDBProperty.calledWith('nameServiceId', 'id1')).to.be.true;
- expect(controller.get('content.nameServiceId')).to.be.equal('id1');
+ controller.saveNameServiceIds(['id0', 'id1']);
+ expect(controller.setDBProperty.calledWith('nameServiceIds', ['id0', 'id1'])).to.be.true;
+ expect(controller.get('content.nameServiceIds')).to.eql(['id0', 'id1']);
});
});
- describe('#loadNameServiceId', function() {
+ describe('#loadNameServiceIds', function() {
beforeEach(function() {
- sinon.stub(controller, 'getDBProperty').returns('id1');
+ sinon.stub(controller, 'getDBProperty').returns(['id0', 'id1']);
});
it('nameServiceId should be set', function() {
- controller.loadNameServiceId();
- expect(controller.get('content.nameServiceId')).to.be.equal('id1');
+ controller.loadNameServiceIds();
+ expect(controller.get('content.nameServiceIds')).to.eql(['id0', 'id1']);
});
});