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 <ababiic...@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']); }); });