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