This is an automated email from the ASF dual-hosted git repository. akovalenko pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/trunk by this push: new 658c93d AMBARI-23634. NN Federation Wizard: should work fine for multiple runs (akovalenko) 658c93d is described below commit 658c93dc66f2d91d7b701ae92ca1cc8ff48395e7 Author: Aleksandr Kovalenko <akovale...@apache.org> AuthorDate: Fri Apr 20 17:39:16 2018 +0300 AMBARI-23634. NN Federation Wizard: should work fine for multiple runs (akovalenko) --- .../main/admin/federation/step3_controller.js | 65 ++++++---- .../main/admin/federation/step4_controller.js | 64 +++++----- .../data/configs/wizards/federation_properties.js | 140 +++++++++------------ 3 files changed, 138 insertions(+), 131 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 748c19f..448db0a 100644 --- a/ambari-web/app/controllers/main/admin/federation/step3_controller.js +++ b/ambari-web/app/controllers/main/admin/federation/step3_controller.js @@ -23,7 +23,6 @@ App.NameNodeFederationWizardStep3Controller = Em.Controller.extend(App.Blueprint selectedService: null, stepConfigs: [], serverConfigData: {}, - federationConfig: {}, once: false, isLoaded: false, isConfigsLoaded: false, @@ -43,7 +42,6 @@ App.NameNodeFederationWizardStep3Controller = Em.Controller.extend(App.Blueprint this.set('serverConfigData', {}); this.set('isConfigsLoaded', false); this.set('isLoaded', false); - this.set('federationConfig', $.extend(true, {}, require('data/configs/wizards/federation_properties').federationConfig)) }, loadStep: function () { @@ -85,7 +83,10 @@ App.NameNodeFederationWizardStep3Controller = Em.Controller.extend(App.Blueprint onLoad: function () { if (this.get('isConfigsLoaded') && App.router.get('clusterController.isHDFSNameSpacesLoaded')) { - var federationConfig = this.get('federationConfig'); + var federationConfig = $.extend(true, {}, require('data/configs/wizards/federation_properties').federationConfig); + if (App.get('hasNameNodeFederation')) { + federationConfig.configs = federationConfig.configs.rejectProperty('firstRun'); + } federationConfig.configs = this.tweakServiceConfigs(federationConfig.configs); this.removeConfigs(this.get('configsToRemove'), this.get('serverConfigData')); this.renderServiceConfigs(federationConfig); @@ -99,12 +100,16 @@ App.NameNodeFederationWizardStep3Controller = Em.Controller.extend(App.Blueprint var journalNodes = App.HostComponent.find().filterProperty('componentName', 'JOURNALNODE'); var nameNodes = this.get('content.masterComponentHosts').filterProperty('component', 'NAMENODE'); var hdfsSiteConfigs = configsFromServer.findProperty('type', 'hdfs-site').properties; - ret.nameservice1 = App.HDFSService.find().objectAt(0).get('masterComponentGroups')[0].name; - ret.nameservice2 = this.get('content.nameServiceId'); + var nameServices = App.HDFSService.find().objectAt(0).get('masterComponentGroups').mapProperty('name'); + ret.nameServicesList = nameServices.join(','); + ret.nameservice1 = nameServices[0]; + ret.newNameservice = this.get('content.nameServiceId'); ret.namenode1 = hdfsSiteConfigs['dfs.namenode.rpc-address.' + ret.nameservice1 + '.nn1'].split(':')[0]; ret.namenode2 = hdfsSiteConfigs['dfs.namenode.rpc-address.' + ret.nameservice1 + '.nn2'].split(':')[0]; - ret.namenode3 = nameNodes.filterProperty('isInstalled', false).mapProperty('hostName')[0]; - ret.namenode4 = nameNodes.filterProperty('isInstalled', false).mapProperty('hostName')[1]; + ret.newNameNode1Index = 'nn' + (nameNodes.length - 1); + ret.newNameNode2Index = 'nn' + nameNodes.length; + ret.newNameNode1 = nameNodes.filterProperty('isInstalled', false).mapProperty('hostName')[0]; + ret.newNameNode2 = nameNodes.filterProperty('isInstalled', false).mapProperty('hostName')[1]; ret.journalnodes = journalNodes.map(function (c) { return c.get('hostName') + ':8485' }).join(';'); @@ -121,23 +126,13 @@ App.NameNodeFederationWizardStep3Controller = Em.Controller.extend(App.Blueprint ret.journalnode_edits_dir = hdfsSiteConfigs['dfs.journalnode.edits.dir']; - if (App.Service.find().someProperty('serviceName', 'RANGER')) { - var hdfsRangerConfigs = configsFromServer.findProperty('type', 'ranger-hdfs-security').properties; - - if (hdfsRangerConfigs['ranger.plugin.hdfs.service.name'] === '{{repo_name}}') { - ret.ranger_service_name_ns1 = ret.clustername + '_hadoop_' + ret.nameservice1; - ret.ranger_service_name_ns2 = ret.clustername + '_hadoop_' + ret.nameservice2; - } else { - ret.ranger_service_name_ns1 = hdfsRangerConfigs['ranger.plugin.hdfs.service.name'] + '_' + ret.nameservice1; - ret.ranger_service_name_ns2 = hdfsRangerConfigs['ranger.plugin.hdfs.service.name'] + '_' + ret.nameservice2; - } - } - return ret; }, tweakServiceConfigs: function (configs) { var dependencies = this.prepareDependencies(); + var nameServices = App.HDFSService.find().objectAt(0).get('masterComponentGroups').mapProperty('name'); + nameServices.push(dependencies.newNameservice); var result = []; var configsToRemove = []; var hdfsSiteConfigs = this.get('serverConfigData').items.findProperty('type', 'hdfs-site').properties; @@ -146,11 +141,25 @@ App.NameNodeFederationWizardStep3Controller = Em.Controller.extend(App.Blueprint configsToRemove = configsToRemove.concat([ 'dfs.namenode.servicerpc-address.{{nameservice1}}.nn1', 'dfs.namenode.servicerpc-address.{{nameservice1}}.nn2', - 'dfs.namenode.servicerpc-address.{{nameservice2}}.nn3', - 'dfs.namenode.servicerpc-address.{{nameservice2}}.nn4' + 'dfs.namenode.servicerpc-address.{{newNameservice}}.{{newNameNode1Index}}', + 'dfs.namenode.servicerpc-address.{{newNameservice}}.{{newNameNode2Index}}' ]); } + if (App.Service.find().someProperty('serviceName', 'RANGER')) { + var hdfsRangerConfigs = this.get('serverConfigData').items.findProperty('type', 'ranger-hdfs-security').properties; + + if (hdfsRangerConfigs['ranger.plugin.hdfs.service.name'] === '{{repo_name}}') { + nameServices.forEach(function (nameService) { + configs.push(this.createRangerServiceProperty(nameService, dependencies.clustername + '_hadoop_' + nameService)); + }, this); + } else { + nameServices.forEach(function (nameService) { + configs.push(this.createRangerServiceProperty(nameService, hdfsRangerConfigs['ranger.plugin.hdfs.service.name'] + '_' + nameService)); + }, this); + } + } + configs.forEach(function (config) { if (!configsToRemove.contains(config.name)) { config.isOverridable = false; @@ -165,6 +174,20 @@ App.NameNodeFederationWizardStep3Controller = Em.Controller.extend(App.Blueprint return result; }, + createRangerServiceProperty: function(nameservice, value) { + var name = "ranger.tagsync.atlas.hdfs.instance." + App.get('clusterName') + ".nameservice." + nameservice + ".ranger.service"; + return { + "name": name, + "displayName": name, + "isReconfigurable": false, + "recommendedValue": value, + "value": value, + "category": "RANGER", + "filename": "ranger-tagsync-site", + "serviceName": 'MISC' + }; + }, + replaceDependencies: function (value, dependencies) { Em.keys(dependencies).forEach(function (key) { value = value.replace(new RegExp('{{' + key + '}}', 'g'), dependencies[key]); diff --git a/ambari-web/app/controllers/main/admin/federation/step4_controller.js b/ambari-web/app/controllers/main/admin/federation/step4_controller.js index 969b5bd..f5022ed 100644 --- a/ambari-web/app/controllers/main/admin/federation/step4_controller.js +++ b/ambari-web/app/controllers/main/admin/federation/step4_controller.js @@ -132,50 +132,50 @@ App.NameNodeFederationWizardStep4Controller = App.HighAvailabilityProgressPageCo createWidgets: function () { var self = this; - this.getNameNodeWidgets().done(function (data) { - var newWidgetsIds = []; - var oldWidgetIds = []; - var nameservice1 = App.HDFSService.find().objectAt(0).get('masterComponentGroups')[0].name; - var nameservice2 = self.get('content.nameServiceId'); - var widgetsCount = data.items.length; - data.items.forEach(function (widget) { - if (!widget.WidgetInfo.tag) { - var oldId = widget.WidgetInfo.id; - oldWidgetIds.push(oldId); + this.getNameNodeWidgets().done(function (data) { + var newWidgetsIds = []; + var oldWidgetIds = []; + var nameservice1 = App.HDFSService.find().objectAt(0).get('masterComponentGroups')[0].name; + var nameservice2 = self.get('content.nameServiceId'); + var widgetsCount = data.items.length; + data.items.forEach(function (widget) { + if (!widget.WidgetInfo.tag) { + var oldId = widget.WidgetInfo.id; + oldWidgetIds.push(oldId); delete widget.href; delete widget.WidgetInfo.id; delete widget.WidgetInfo.cluster_name; delete widget.WidgetInfo.author; - widget.WidgetInfo.tag = nameservice1; + widget.WidgetInfo.tag = nameservice1; widget.WidgetInfo.metrics = JSON.parse(widget.WidgetInfo.metrics); widget.WidgetInfo.values = JSON.parse(widget.WidgetInfo.values); - self.createWidget(widget).done(function (w) { - newWidgetsIds.push(w.resources[0].WidgetInfo.id); - widget.WidgetInfo.tag = nameservice2; self.createWidget(widget).done(function (w) { newWidgetsIds.push(w.resources[0].WidgetInfo.id); - self.deleteWidget(oldId).done(function () { - if (!--widgetsCount) { - self.getDefaultHDFStWidgetLayout().done(function (layout) { - layout = layout.items[0].WidgetLayoutInfo; - layout.widgets = layout.widgets.filter(function (w) { - return !oldWidgetIds.contains(w.WidgetInfo.id); - }).map(function (w) { - return w.WidgetInfo.id; - }).concat(newWidgetsIds); - self.updateDefaultHDFStWidgetLayout(layout).done(function () { - self.onTaskCompleted(); + widget.WidgetInfo.tag = nameservice2; + self.createWidget(widget).done(function (w) { + newWidgetsIds.push(w.resources[0].WidgetInfo.id); + self.deleteWidget(oldId).done(function () { + if (!--widgetsCount) { + self.getDefaultHDFStWidgetLayout().done(function (layout) { + layout = layout.items[0].WidgetLayoutInfo; + layout.widgets = layout.widgets.filter(function (w) { + return !oldWidgetIds.contains(w.WidgetInfo.id); + }).map(function (w) { + return w.WidgetInfo.id; + }).concat(newWidgetsIds); + self.updateDefaultHDFStWidgetLayout(layout).done(function () { + self.onTaskCompleted(); + }); }); - }); - } + } + }); }); }); - }); - } else { - widgetsCount--; - } + } else { + widgetsCount--; + } + }); }); - }); }, createWidget: function (data) { diff --git a/ambari-web/app/data/configs/wizards/federation_properties.js b/ambari-web/app/data/configs/wizards/federation_properties.js index ef4a4d0..a0e632b 100644 --- a/ambari-web/app/data/configs/wizards/federation_properties.js +++ b/ambari-web/app/data/configs/wizards/federation_properties.js @@ -28,8 +28,8 @@ module.exports = sites: ['core-site'], configs: [ { - "name": "dfs.journalnode.edits.dir.{{nameservice2}}", - "displayName": "dfs.journalnode.edits.dir.{{nameservice2}}", + "name": "dfs.journalnode.edits.dir.{{newNameservice}}", + "displayName": "dfs.journalnode.edits.dir.{{newNameservice}}", "description": "The Directory where the JournalNode will store its local state.", "isReconfigurable": true, "recommendedValue": "", @@ -49,15 +49,16 @@ module.exports = "displayType": "directory", "category": "HDFS", "filename": "hdfs-site", - "serviceName": 'MISC' + "serviceName": 'MISC', + "firstRun": true }, { "name": "dfs.nameservices", "displayName": "dfs.nameservices", "description": "Comma-separated list of nameservices.", "isReconfigurable": false, - "recommendedValue": "{{nameservice1}},{{nameservice2}}", - "value": "{{nameservice1}},{{nameservice2}}", + "recommendedValue": "{{nameServicesList}},{{newNameservice}}", + "value": "{{nameServicesList}},{{newNameservice}}", "category": "HDFS", "filename": "hdfs-site", "serviceName": 'MISC' @@ -67,92 +68,92 @@ module.exports = "displayName": "dfs.internal.nameservices", "description": "Comma-separated list of nameservices.", "isReconfigurable": false, - "recommendedValue": "{{nameservice1}},{{nameservice2}}", - "value": "{{nameservice1}},{{nameservice2}}", + "recommendedValue": "{{nameServicesList}},{{newNameservice}}", + "value": "{{nameServicesList}},{{newNameservice}}", "category": "HDFS", "filename": "hdfs-site", "serviceName": 'MISC' }, { - "name": "dfs.ha.namenodes.{{nameservice2}}", - "displayName": "dfs.ha.namenodes.{{nameservice2}}", + "name": "dfs.ha.namenodes.{{newNameservice}}", + "displayName": "dfs.ha.namenodes.{{newNameservice}}", "description": "The prefix for a given nameservice, contains a comma-separated list of namenodes for a given nameservice.", "isReconfigurable": false, - "recommendedValue": "nn3,nn4", - "value": "nn3,nn4", + "recommendedValue": "{{newNameNode1Index}},{{newNameNode2Index}}", + "value": "{{newNameNode1Index}},{{newNameNode2Index}}", "category": "HDFS", "filename": "hdfs-site", "serviceName": 'MISC' }, { - "name": "dfs.namenode.rpc-address.{{nameservice2}}.nn3", - "displayName": "dfs.namenode.rpc-address.{{nameservice2}}.nn3", - "description": "RPC address that handles all clients requests for nn3.", + "name": "dfs.namenode.rpc-address.{{newNameservice}}.{{newNameNode1Index}}", + "displayName": "dfs.namenode.rpc-address.{{newNameservice}}.{{newNameNode1Index}}", + "description": "RPC address that handles all clients requests for {{newNameNode1Index}}.", "isReconfigurable": false, - "recommendedValue": "{{namenode3}}:{{nnRpcPort}}", - "value": "{{namenode3}}:{{nnRpcPort}}", + "recommendedValue": "{{newNameNode1}}:{{nnRpcPort}}", + "value": "{{newNameNode1}}:{{nnRpcPort}}", "category": "HDFS", "filename": "hdfs-site", "serviceName": 'MISC' }, { - "name": "dfs.namenode.rpc-address.{{nameservice2}}.nn4", - "displayName": "dfs.namenode.rpc-address.{{nameservice2}}.nn4", - "description": "RPC address that handles all clients requests for nn4.", + "name": "dfs.namenode.rpc-address.{{newNameservice}}.{{newNameNode2Index}}", + "displayName": "dfs.namenode.rpc-address.{{newNameservice}}.{{newNameNode2Index}}", + "description": "RPC address that handles all clients requests for {{newNameNode2Index}}.", "isReconfigurable": false, - "recommendedValue": "{{namenode4}}:{{nnRpcPort}}", - "value": "{{namenode4}}:{{nnRpcPort}}", + "recommendedValue": "{{newNameNode2}}:{{nnRpcPort}}", + "value": "{{newNameNode2}}:{{nnRpcPort}}", "category": "HDFS", "filename": "hdfs-site", "serviceName": 'MISC' }, { - "name": "dfs.namenode.http-address.{{nameservice2}}.nn3", - "displayName": "dfs.namenode.http-address.{{nameservice2}}.nn3", - "description": "The fully-qualified HTTP address for nn3 NameNode.", + "name": "dfs.namenode.http-address.{{newNameservice}}.{{newNameNode1Index}}", + "displayName": "dfs.namenode.http-address.{{newNameservice}}.{{newNameNode1Index}}", + "description": "The fully-qualified HTTP address for {{newNameNode1Index}} NameNode.", "isReconfigurable": false, - "recommendedValue": "{{namenode3}}:{{nnHttpPort}}", - "value": "{{namenode3}}:{{nnHttpPort}}", + "recommendedValue": "{{newNameNode1}}:{{nnHttpPort}}", + "value": "{{newNameNode1}}:{{nnHttpPort}}", "category": "HDFS", "filename": "hdfs-site", "serviceName": 'MISC' }, { - "name": "dfs.namenode.http-address.{{nameservice2}}.nn4", - "displayName": "dfs.namenode.http-address.{{nameservice2}}.nn4", - "description": "The fully-qualified HTTP address for nn4 NameNode.", + "name": "dfs.namenode.http-address.{{newNameservice}}.{{newNameNode2Index}}", + "displayName": "dfs.namenode.http-address.{{newNameservice}}.{{newNameNode2Index}}", + "description": "The fully-qualified HTTP address for {{newNameNode2Index}} NameNode.", "isReconfigurable": false, - "recommendedValue": "{{namenode4}}:{{nnHttpPort}}", - "value": "{{namenode4}}:{{nnHttpPort}}", + "recommendedValue": "{{newNameNode2}}:{{nnHttpPort}}", + "value": "{{newNameNode2}}:{{nnHttpPort}}", "category": "HDFS", "filename": "hdfs-site", "serviceName": 'MISC' }, { - "name": "dfs.namenode.https-address.{{nameservice2}}.nn3", - "displayName": "dfs.namenode.https-address.{{nameservice2}}.nn3", - "description": "The fully-qualified HTTPS address for nn3 NameNode.", + "name": "dfs.namenode.https-address.{{newNameservice}}.{{newNameNode1Index}}", + "displayName": "dfs.namenode.https-address.{{newNameservice}}.{{newNameNode1Index}}", + "description": "The fully-qualified HTTPS address for {{newNameNode1Index}} NameNode.", "isReconfigurable": false, - "recommendedValue": "{{namenode3}}:{{nnHttpsPort}}", - "value": "{{namenode3}}:{{nnHttpsPort}}", + "recommendedValue": "{{newNameNode1}}:{{nnHttpsPort}}", + "value": "{{newNameNode1}}:{{nnHttpsPort}}", "category": "HDFS", "filename": "hdfs-site", "serviceName": 'MISC' }, { - "name": "dfs.namenode.https-address.{{nameservice2}}.nn4", - "displayName": "dfs.namenode.https-address.{{nameservice2}}.nn4", - "description": "The fully-qualified HTTPS address for nn4 NameNode.", + "name": "dfs.namenode.https-address.{{newNameservice}}.{{newNameNode2Index}}", + "displayName": "dfs.namenode.https-address.{{newNameservice}}.{{newNameNode2Index}}", + "description": "The fully-qualified HTTPS address for {{newNameNode2Index}} NameNode.", "isReconfigurable": false, - "recommendedValue": "{{namenode4}}:{{nnHttpsPort}}", - "value": "{{namenode4}}:{{nnHttpsPort}}", + "recommendedValue": "{{newNameNode2}}:{{nnHttpsPort}}", + "value": "{{newNameNode2}}:{{nnHttpsPort}}", "category": "HDFS", "filename": "hdfs-site", "serviceName": 'MISC' }, { - "name": "dfs.client.failover.proxy.provider.{{nameservice2}}", - "displayName": "dfs.client.failover.proxy.provider.{{nameservice2}}", + "name": "dfs.client.failover.proxy.provider.{{newNameservice}}", + "displayName": "dfs.client.failover.proxy.provider.{{newNameservice}}", "description": "The Java class that HDFS clients use to contact the Active NameNode.", "recommendedValue": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider", "isReconfigurable": false, @@ -170,15 +171,16 @@ module.exports = "value": "qjournal://{{journalnodes}}/{{nameservice1}}", "category": "HDFS", "filename": "hdfs-site", - "serviceName": 'MISC' + "serviceName": 'MISC', + "firstRun": true }, { - "name": "dfs.namenode.shared.edits.dir.{{nameservice2}}", - "displayName": "dfs.namenode.shared.edits.dir.{{nameservice2}}", + "name": "dfs.namenode.shared.edits.dir.{{newNameservice}}", + "displayName": "dfs.namenode.shared.edits.dir.{{newNameservice}}", "description": "The URI which identifies the group of JNs where the NameNodes will write/read edits.", "isReconfigurable": false, - "recommendedValue": "qjournal://{{journalnodes}}/{{nameservice2}}", - "value": "qjournal://{{journalnodes}}/{{nameservice2}}", + "recommendedValue": "qjournal://{{journalnodes}}/{{newNameservice}}", + "value": "qjournal://{{journalnodes}}/{{newNameservice}}", "category": "HDFS", "filename": "hdfs-site", "serviceName": 'MISC' @@ -192,7 +194,8 @@ module.exports = "value": "{{namenode1}}:8021", "category": "HDFS", "filename": "hdfs-site", - "serviceName": 'MISC' + "serviceName": 'MISC', + "firstRun": true }, { "name": "dfs.namenode.servicerpc-address.{{nameservice1}}.nn2", @@ -203,49 +206,30 @@ module.exports = "value": "{{namenode2}}:8021", "category": "HDFS", "filename": "hdfs-site", - "serviceName": 'MISC' + "serviceName": 'MISC', + "firstRun": true }, { - "name": "dfs.namenode.servicerpc-address.{{nameservice2}}.nn3", - "displayName": "dfs.namenode.servicerpc-address.{{nameservice2}}.nn3", + "name": "dfs.namenode.servicerpc-address.{{newNameservice}}.{{newNameNode1Index}}", + "displayName": "dfs.namenode.servicerpc-address.{{newNameservice}}.{{newNameNode1Index}}", "description": "RPC address for HDFS Services communication.", "isReconfigurable": false, - "recommendedValue": "{{namenode3}}:8021", - "value": "{{namenode3}}:8021", + "recommendedValue": "{{newNameNode1}}:8021", + "value": "{{newNameNode1}}:8021", "category": "HDFS", "filename": "hdfs-site", "serviceName": 'MISC' }, { - "name": "dfs.namenode.servicerpc-address.{{nameservice2}}.nn4", - "displayName": "dfs.namenode.servicerpc-address.{{nameservice2}}.nn4", + "name": "dfs.namenode.servicerpc-address.{{newNameservice}}.{{newNameNode2Index}}", + "displayName": "dfs.namenode.servicerpc-address.{{newNameservice}}.{{newNameNode2Index}}", "description": "RPC address for HDFS Services communication.", "isReconfigurable": false, - "recommendedValue": "{{namenode4}}:8021", - "value": "{{namenode4}}:8021", + "recommendedValue": "{{newNameNode2}}:8021", + "value": "{{newNameNode2}}:8021", "category": "HDFS", "filename": "hdfs-site", "serviceName": 'MISC' - }, - { - "name": "ranger.tagsync.atlas.hdfs.instance.{{clustername}}.nameservice.{{nameservice1}}.ranger.service", - "displayName": "ranger.tagsync.atlas.hdfs.instance.{{clustername}}.nameservice.{{nameservice1}}.ranger.service", - "isReconfigurable": false, - "recommendedValue": "{{ranger_service_name_ns1}}", - "value": "{{ranger_service_name_ns1}}", - "category": "RANGER", - "filename": "ranger-tagsync-site", - "serviceName": 'MISC' - }, - { - "name": "ranger.tagsync.atlas.hdfs.instance.{{clustername}}.nameservice.{{nameservice2}}.ranger.service", - "displayName": "ranger.tagsync.atlas.hdfs.instance.{{clustername}}.nameservice.{{nameservice2}}.ranger.service", - "isReconfigurable": false, - "recommendedValue": "{{ranger_service_name_ns2}}", - "value": "{{ranger_service_name_ns2}}", - "category": "RANGER", - "filename": "ranger-tagsync-site", - "serviceName": 'MISC' } ] } -- To stop receiving notification emails like this one, please contact akovale...@apache.org.