Updated Branches: refs/heads/trunk fbf7afc1b -> 7a26b7ef8
AMBARI-3185. HDFS links widget should accommodate NameNode HA. (xiwang) Project: http://git-wip-us.apache.org/repos/asf/incubator-ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ambari/commit/7a26b7ef Tree: http://git-wip-us.apache.org/repos/asf/incubator-ambari/tree/7a26b7ef Diff: http://git-wip-us.apache.org/repos/asf/incubator-ambari/diff/7a26b7ef Branch: refs/heads/trunk Commit: 7a26b7ef894294851a8babf1c539a70df952bdc4 Parents: fbf7afc Author: Yusaku Sako <[email protected]> Authored: Thu Sep 12 12:53:08 2013 -0700 Committer: Yusaku Sako <[email protected]> Committed: Thu Sep 12 12:53:08 2013 -0700 ---------------------------------------------------------------------- ambari-web/app/mappers/service_mapper.js | 48 ++++++++++++++- ambari-web/app/messages.js | 3 + ambari-web/app/models/service/hdfs.js | 3 + ambari-web/app/styles/application.less | 5 ++ .../main/dashboard/widgets/hdfs_links.hbs | 64 +++++++++++++++----- .../views/main/dashboard/widgets/hdfs_links.js | 19 +++++- 6 files changed, 123 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/7a26b7ef/ambari-web/app/mappers/service_mapper.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mappers/service_mapper.js b/ambari-web/app/mappers/service_mapper.js index 118faaa..5733995 100644 --- a/ambari-web/app/mappers/service_mapper.js +++ b/ambari-web/app/mappers/service_mapper.js @@ -61,6 +61,9 @@ App.servicesMapper = App.QuickDataMapper.create({ version: 'nameNodeComponent.ServiceComponentInfo.Version', name_node_id: 'nameNodeComponent.host_components[0].HostRoles.host_name', sname_node_id: 'snameNodeComponent.host_components[0].HostRoles.host_name', + active_name_node_id: 'active_name_node_id', + standby_name_node_id: 'standby_name_node_id', + standby_name_node2_id: 'standby_name_node2_id', data_nodes: 'data_nodes', journal_nodes: 'journal_nodes', name_node_start_time: 'nameNodeComponent.ServiceComponentInfo.StartTime', @@ -333,13 +336,54 @@ App.servicesMapper = App.QuickDataMapper.create({ var hdfsConfig = this.hdfsConfig; item.components.forEach(function (component) { if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "NAMENODE") { - // make active nameNode as host_components[0]. + if ( component.host_components.length == 2) { //enabled HA + var haState1; var haState2; if (component.host_components[1].metrics && component.host_components[1].metrics.dfs) { haState2 = component.host_components[1].metrics.dfs.FSNamesystem.HAState; } - if (haState2 == "active") { // change places + if (component.host_components[0].metrics.dfs) { + haState1 = component.host_components[0].metrics.dfs.FSNamesystem.HAState; + } + var active_name_node = []; + var standby_name_nodes = []; + switch (haState1) { + case "active": + active_name_node.push(component.host_components[0].HostRoles.host_name); + break; + case "standby": + standby_name_nodes.push(component.host_components[0].HostRoles.host_name); + break; + } + switch (haState2) { + case "active": + active_name_node.push(component.host_components[1].HostRoles.host_name); + break; + case "standby": + standby_name_nodes.push(component.host_components[1].HostRoles.host_name); + break; + } + item.active_name_node_id = null; + item.standby_name_node_id = null; + item.standby_name_node2_id = null; + switch (active_name_node.length) { + case 1: + item.active_name_node_id = active_name_node[0]; + break; + } + switch (standby_name_nodes.length) { + case 1: + item.standby_name_node_id = standby_name_nodes[0]; + break; + case 2: + item.standby_name_node_id = standby_name_nodes[0]; + item.standby_name_node2_id = standby_name_nodes[1]; + break; + } + + // make sure: active nameNode always at host_components[0]. + if (haState2 == "active") { // change places for all model bind with host_component[0] var tmp = component.host_components[1]; component.host_components[1] = component.host_components[0]; component.host_components[0] = tmp; http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/7a26b7ef/ambari-web/app/messages.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js index 89b3a1e..e264d9a 100644 --- a/ambari-web/app/messages.js +++ b/ambari-web/app/messages.js @@ -1276,6 +1276,9 @@ Em.I18n.translations = { 'dashboard.widgets.NameNodeUptime': 'NameNode Uptime', 'dashboard.widgets.JobTrackerUptime': 'JobTracker Uptime', 'dashboard.widgets.HDFSLinks': 'HDFS Links', + 'dashboard.widgets.HDFSLinks.activeNameNode': 'Active NameNode', + 'dashboard.widgets.HDFSLinks.standbyNameNode': 'Standby NameNode', + 'dashboard.widgets.HDFSLinks.standbyNameNodes': '2 Standby NameNodes', 'dashboard.widgets.MapReduceLinks': 'MapReduce Links', 'dashboard.widgets.HBaseLinks': 'HBase Links', 'dashboard.widgets.HBaseAverageLoad': 'HBase Ave Load', http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/7a26b7ef/ambari-web/app/models/service/hdfs.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models/service/hdfs.js b/ambari-web/app/models/service/hdfs.js index 78e8e87..d04dc94 100644 --- a/ambari-web/app/models/service/hdfs.js +++ b/ambari-web/app/models/service/hdfs.js @@ -21,6 +21,9 @@ App.HDFSService = App.Service.extend({ version: DS.attr('string'), nameNode: DS.belongsTo('App.Host'), snameNode: DS.belongsTo('App.Host'), + activeNameNode: DS.belongsTo('App.Host'), + standbyNameNode: DS.belongsTo('App.Host'), + standbyNameNode2: DS.belongsTo('App.Host'), dataNodes: DS.hasMany('App.Host'), journalNodes: DS.hasMany('App.Host'), nameNodeStartTime: DS.attr('number'), http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/7a26b7ef/ambari-web/app/styles/application.less ---------------------------------------------------------------------- diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less index 7a739ce..5e86f59 100644 --- a/ambari-web/app/styles/application.less +++ b/ambari-web/app/styles/application.less @@ -2235,6 +2235,11 @@ table.graphs { font-size: 35px; padding-top: 40px; //svg position: relative; + .disabled-hdfs-link { + pointer-events: none; + color: grey; + cursor: default; + } .screensaver{ // graph onload wait width: 90%; height: 105px; http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/7a26b7ef/ambari-web/app/templates/main/dashboard/widgets/hdfs_links.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/dashboard/widgets/hdfs_links.hbs b/ambari-web/app/templates/main/dashboard/widgets/hdfs_links.hbs index edaa684..5539a53 100644 --- a/ambari-web/app/templates/main/dashboard/widgets/hdfs_links.hbs +++ b/ambari-web/app/templates/main/dashboard/widgets/hdfs_links.hbs @@ -24,22 +24,56 @@ <div class="caption span10"> {{view.title}}</div> <div class="widget-content" > - <table> - <!--NameNode--> - <tr> - <td><a href="#" {{action showDetails view.model.nameNode}}>{{t dashboard.services.hdfs.nanmenode}}</a></td> - </tr> - <!--SecondaryNameNode--> - <tr> - <td><a href="#" {{action showDetails view.model.snameNode}}>{{t dashboard.services.hdfs.snanmenode}}</a></td> - </tr> - <!--Data Nodes--> - <tr> - <td> + {{#if view.isHAEnabled }} + <table> + <!--Active NameNode--> + <tr> + {{#if view.isActiveNNValid}} + <td><a href="#" {{action showDetails view.model.activeNameNode}}>{{t dashboard.widgets.HDFSLinks.activeNameNode}}</a></td> + {{else}} + <td><a class="disabled-hdfs-link">{{t dashboard.widgets.HDFSLinks.activeNameNode}}</a></td> + {{/if}} + </tr> + <!--Standby NameNodes--> + <tr> + {{#if view.isStandbyNNValid}} + {{#if view.isTwoStandbyNN}} + <!--Two Standby NameNodes--> + <td><a href="#" {{action filterHosts view.twoStandbyComponent}}>{{t dashboard.widgets.HDFSLinks.standbyNameNodes}}</a></td> + {{else}} + <!--One Standby NameNode--> + <td><a href="#" {{action showDetails view.model.standbyNameNode}}>{{t dashboard.widgets.HDFSLinks.standbyNameNode}}</a></td> + {{/if}} + {{else}} + <td><a class="disabled-hdfs-link">{{t dashboard.widgets.HDFSLinks.standbyNameNode}}</a></td> + {{/if}} + </tr> + <!--Data Nodes--> + <tr> + <td> <a href="#" {{action filterHosts view.component}}>{{view.model.dataNodes.length}} {{t dashboard.services.hdfs.datanodes}}</a> - </td> - </tr> - </table> + </td> + </tr> + </table> + {{else}} + <table> + <!--NameNode--> + <tr> + <td><a href="#" {{action showDetails view.model.nameNode}}>{{t dashboard.services.hdfs.nanmenode}}</a></td> + </tr> + <!--SecondaryNameNode--> + <tr> + <td><a href="#" {{action showDetails view.model.snameNode}}>{{t dashboard.services.hdfs.snanmenode}}</a></td> + </tr> + <!--Data Nodes--> + <tr> + <td> + <a href="#" {{action filterHosts view.component}}>{{view.model.dataNodes.length}} {{t dashboard.services.hdfs.datanodes}}</a> + </td> + </tr> + </table> + {{/if}} + </div> <div class="link-button"> http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/7a26b7ef/ambari-web/app/views/main/dashboard/widgets/hdfs_links.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/dashboard/widgets/hdfs_links.js b/ambari-web/app/views/main/dashboard/widgets/hdfs_links.js index ede0003..ac46731 100644 --- a/ambari-web/app/views/main/dashboard/widgets/hdfs_links.js +++ b/ambari-web/app/views/main/dashboard/widgets/hdfs_links.js @@ -35,6 +35,21 @@ App.HDFSLinksView = App.LinkDashboardWidgetView.extend({ didInsertElement: function() { this._super(); this.calc(); - } - + }, + + isHAEnabled: function() { + return !this.get('model.snameNode'); + }.property('model.snameNode'), + isActiveNNValid: function () { + return this.get('model.activeNameNode') != null; + }.property('model.activeNameNode'), + isStandbyNNValid: function () { + return this.get('model.standbyNameNode') != null; + }.property('model.standbyNameNode'), + isTwoStandbyNN: function () { + return (this.get('model.standbyNameNode') != null && this.get('model.standbyNameNode2') != null); + }.property('model.standbyNameNode', 'model.standbyNameNode2'), + twoStandbyComponent: function () { + return App.HostComponent.find().findProperty('componentName', 'NAMENODE'); + }.property() }); \ No newline at end of file
