You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by at...@apache.org on 2013/12/09 19:01:15 UTC
git commit: AMBARI-4021 UI should use service status computed on
server. (atkach)
Updated Branches:
refs/heads/trunk d3c1a6457 -> 3b44151aa
AMBARI-4021 UI should use service status computed on server. (atkach)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/3b44151a
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/3b44151a
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/3b44151a
Branch: refs/heads/trunk
Commit: 3b44151aa76392b5d9e8540d0c30662fb708a815
Parents: d3c1a64
Author: atkach <at...@hortonworks.com>
Authored: Mon Dec 9 20:01:00 2013 +0200
Committer: atkach <at...@hortonworks.com>
Committed: Mon Dec 9 20:01:15 2013 +0200
----------------------------------------------------------------------
.../app/controllers/global/update_controller.js | 2 +-
ambari-web/app/mappers/service_mapper.js | 21 +-
.../app/mappers/service_metrics_mapper.js | 245 ++++---------------
ambari-web/app/models/host_component.js | 47 ++--
ambari-web/app/models/service.js | 25 +-
5 files changed, 110 insertions(+), 230 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/3b44151a/ambari-web/app/controllers/global/update_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/global/update_controller.js b/ambari-web/app/controllers/global/update_controller.js
index 5bb518e..0c73f03 100644
--- a/ambari-web/app/controllers/global/update_controller.js
+++ b/ambari-web/app/controllers/global/update_controller.js
@@ -184,7 +184,7 @@ App.UpdateController = Em.Controller.extend({
},
updateServices: function (callback) {
var testUrl = '/data/services/HDP2/services.json';
- var componentConfigUrl = this.getUrl(testUrl, '/services');
+ var componentConfigUrl = this.getUrl(testUrl, '/services?fields=ServiceInfo/state&minimal_response=true');
App.HttpClient.get(componentConfigUrl, App.serviceMapper, {
complete: callback
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/3b44151a/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 b4bde3b..a226eca 100644
--- a/ambari-web/app/mappers/service_mapper.js
+++ b/ambari-web/app/mappers/service_mapper.js
@@ -21,19 +21,20 @@ App.serviceMapper = App.QuickDataMapper.create({
map: function (json) {
console.time("App.serviceMapper execution time");
- var servicesData = App.cache['services'];
+ var servicesData = [];
json.items.forEach(function (service) {
- if (!servicesData.someProperty('ServiceInfo.service_name', service.ServiceInfo.service_name)) {
- servicesData.push({
- ServiceInfo: {
- service_name: service.ServiceInfo.service_name
- },
- host_components: [],
- components: []
- });
- }
+ servicesData.push({
+ ServiceInfo: {
+ service_name: service.ServiceInfo.service_name,
+ state: service.ServiceInfo.state
+ },
+ host_components: [],
+ components: []
+ });
});
+ App.cache['services'] = servicesData;
+
console.timeEnd("App.serviceMapper execution time");
}
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/3b44151a/ambari-web/app/mappers/service_metrics_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/service_metrics_mapper.js b/ambari-web/app/mappers/service_metrics_mapper.js
index ff190df..d475f9d 100644
--- a/ambari-web/app/mappers/service_metrics_mapper.js
+++ b/ambari-web/app/mappers/service_metrics_mapper.js
@@ -29,7 +29,8 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
work_status: 'ServiceInfo.state',
$rand: Math.random(),
$alerts: [ 1, 2, 3 ],
- host_components: 'host_components'
+ host_components: 'host_components',
+ tool_tip_content: 'tool_tip_content'
},
hdfsConfig: {
version: 'nameNodeComponent.host_components[0].metrics.dfs.namenode.Version',
@@ -134,6 +135,7 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
component_name: 'HostRoles.component_name',
host_id: 'HostRoles.host_name',
stale_configs: 'HostRoles.stale_configs',
+ display_name_advanced: 'display_name_advanced',
$service_id: 'none' /* will be set outside of parse function */
},
@@ -168,6 +170,7 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
}, this);
}, this);
+ this.computeAdditionalRelations(hostComponents, services);
//load master components to model
App.store.loadMany(this.get('model3'), hostComponents);
@@ -233,7 +236,7 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
App.store.loadMany(this.get('model'), result);
} else {
result.forEach(function (serviceJson) {
- var fields = ['work_status', 'rand', 'alerts', 'quick_links', 'host_components'];
+ var fields = ['work_status', 'rand', 'alerts', 'quick_links', 'host_components', 'tool_tip_content'];
var service = this.get('model').find(serviceJson.id);
var modifiedData = this.getDiscrepancies(serviceJson, previousResponse.findProperty('id', serviceJson.id), fields);
if (modifiedData.isLoadNeeded) {
@@ -247,19 +250,56 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
}
previousResponse = result;
-
- var servicesMap = {};
- //calculate service statuses according to their host-components
- App.HostComponent.find().filterProperty('isMaster').forEach(function (item) {
- if (item) {
- this.countServiceComponents(item, servicesMap, servicesMap[item.get('service.id')]);
- }
- }, this);
- this.updateServicesStatus(App.Service.find(), servicesMap);
}
console.timeEnd('App.serviceMetricsMapper execution time');
},
/**
+ * compute display name of host-components
+ * compute tooltip content of services by host-components
+ * @param hostComponents
+ * @param services
+ */
+ computeAdditionalRelations: function (hostComponents, services) {
+ var isSecondaryNamenode = hostComponents.findProperty('component_name', 'SECONDARY_NAMENODE');
+ services.setEach('tool_tip_content', '');
+ hostComponents.forEach(function (hostComponent) {
+ var service = services.findProperty('ServiceInfo.service_name', hostComponent.service_id);
+ if (hostComponent) {
+ // set advanced nameNode display name for HA, active or standby NameNode
+ // this is useful on three places: hdfs health status hover tooltip, hdfs service summary and NN component on host detail page
+ if (hostComponent.component_name === 'NAMENODE' && !isSecondaryNamenode) {
+ var hdfs = this.hdfsMapper(service);
+ var hostName = hostComponent.host_id;
+ var activeNNText = Em.I18n.t('services.service.summary.nameNode.active');
+ var standbyNNText = Em.I18n.t('services.service.summary.nameNode.standby');
+ if (hdfs) {
+ if (hostName == hdfs.active_name_node_id) {
+ hostComponent.display_name_advanced = activeNNText;
+ } else if (hostName == hdfs.standby_name_node_id || hostName == hdfs.standby_name_node2_id) {
+ hostComponent.display_name_advanced = standbyNNText;
+ } else {
+ hostComponent.display_name_advanced = null;
+ }
+ }
+ } else if (hostComponent.component_name === 'HBASE_MASTER') {
+ if (hostComponent.work_status === 'STARTED') {
+ hostComponent.ha_status == 'true' ?
+ hostComponent.display_name_advanced = this.t('dashboard.services.hbase.masterServer.active') :
+ hostComponent.display_name_advanced = this.t('dashboard.services.hbase.masterServer.standby');
+ } else {
+ hostComponent.display_name_advanced = null;
+ }
+ }
+
+ if (hostComponent.display_name_advanced) {
+ service.tool_tip_content += hostComponent.display_name_advanced + " " + App.HostComponentStatus.getTextStatus(hostComponent.work_status) + "<br/>";
+ } else {
+ service.tool_tip_content += App.format.role(hostComponent.component_name) + " " + App.HostComponentStatus.getTextStatus(hostComponent.work_status) + "<br/>";
+ }
+ }
+ }, this)
+ },
+ /**
* check mutable fields whether they have been changed and if positive
* return host object only with properties, that contains new value
* @param current
@@ -284,189 +324,6 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
}
return current;
},
-
- /**
- * fill serviceMap with aggregated data of hostComponents for each service
- * @param hostComponent
- * @param servicesMap
- * @param service
- */
- countServiceComponents: function (hostComponent, servicesMap, service) {
- if (!service) {
- service = {
- everyStarted: true,
- everyStartedOrMaintenance: true,
- masterComponents: [],
- isStarted: false,
- isUnknown: false,
- isStarting: false,
- isStopped: false,
- isHbaseActive: false,
- serviceName: hostComponent.get('service.id'),
- isRunning: true,
- hdfsHealthStatus: '',
- toolTipContent: ''
- };
- servicesMap[hostComponent.get('service.id')] = service;
- }
- if (hostComponent.get('isMaster')) {
- if (service.everyStartedOrMaintenance) {
- service.everyStartedOrMaintenance = (((hostComponent.get('componentName') === 'NAMENODE' && !App.HostComponent.find().someProperty('componentName', 'SECONDARY_NAMENODE')) || hostComponent.get('componentName') === 'JOURNALNODE') && App.HDFSService.find().filterProperty('activeNameNode.hostName').length > 0)
- ? true : service.everyStartedOrMaintenance = ([App.HostComponentStatus.started, App.HostComponentStatus.maintenance].contains(hostComponent.get('workStatus')));
- } else {
- service.everyStartedOrMaintenance = false;
- }
- service.everyStarted = (service.everyStarted)
- ? (hostComponent.get('workStatus') === App.HostComponentStatus.started)
- : false;
- service.isStarted = (!service.isStarted)
- ? (hostComponent.get('workStatus') === App.HostComponentStatus.started)
- : true;
- service.isUnknown = (!service.isUnknown)
- ? (hostComponent.get('workStatus') === App.HostComponentStatus.unknown)
- : true;
- service.isStarting = (!service.isStarting)
- ? (hostComponent.get('workStatus') === App.HostComponentStatus.starting)
- : true;
- service.isStopped = (!service.isStopped)
- ? (hostComponent.get('workStatus') === App.HostComponentStatus.stopped)
- : true;
- service.isHbaseActive = (!service.isHbaseActive)
- ? (hostComponent.get('haStatus') === 'true')
- : true;
-
- service.masterComponents.push(hostComponent);
-
- // set advanced nameNode display name for HA, active or standby NameNode
- // this is useful on three places: hdfs health status hover tooltip, hdfs service summary and NN component on host detail page
- if (hostComponent.get('componentName') === 'NAMENODE' && !App.HostComponent.find().someProperty('componentName', 'SECONDARY_NAMENODE')) {
- var hostName = hostComponent.get('host.hostName');
- var services = App.Service.find();
- var hdfs;
- services.forEach(function (item) {
- if (item.get("serviceName") == "HDFS") {
- hdfs = App.HDFSService.find(item.get('id'));
- }
- }, this);
- var activeNNText = Em.I18n.t('services.service.summary.nameNode.active');
- var standbyNNText = Em.I18n.t('services.service.summary.nameNode.standby');
- if (hdfs) {
- if (hdfs.get('activeNameNode') && hdfs.get('activeNameNode').get('hostName')) {
- var activeHostname = hdfs.get('activeNameNode').get('hostName');
- }
- if (hdfs.get('standbyNameNode') && hdfs.get('standbyNameNode').get('hostName')) {
- var standbyHostname1 = hdfs.get('standbyNameNode').get('hostName');
- }
- if (hdfs.get('standbyNameNode2') && hdfs.get('standbyNameNode2').get('hostName')) {
- var standbyHostname2 = hdfs.get('standbyNameNode2').get('hostName');
- }
- if (hostName == activeHostname) {
- hostComponent.set('displayNameAdvanced', activeNNText);
- } else if (hostName == standbyHostname1 || hostName == standbyHostname2) {
- hostComponent.set('displayNameAdvanced', standbyNNText);
- } else {
- hostComponent.set('displayNameAdvanced', null);
- }
- }
- } else if (hostComponent.get('componentName') === 'HBASE_MASTER') {
- if (hostComponent.get('workStatus') === 'STARTED') {
- hostComponent.get('haStatus') == 'true' ? hostComponent.set('displayNameAdvanced', this.t('dashboard.services.hbase.masterServer.active')) : hostComponent.set('displayNameAdvanced', this.t('dashboard.services.hbase.masterServer.standby'));
- } else {
- hostComponent.set('displayNameAdvanced', null);
- }
- }
-
- if (hostComponent.get("displayNameAdvanced")) {
- service.toolTipContent += hostComponent.get("displayNameAdvanced") + " " + hostComponent.get("componentTextStatus") + "<br/>";
- } else {
- service.toolTipContent += hostComponent.get("displayName") + " " + hostComponent.get("componentTextStatus") + "<br/>";
- }
-
- }
-
- if (hostComponent.get('workStatus') !== App.HostComponentStatus.stopped &&
- hostComponent.get('workStatus') !== App.HostComponentStatus.install_failed &&
- hostComponent.get('workStatus') !== App.HostComponentStatus.unknown &&
- hostComponent.get('workStatus') !== App.HostComponentStatus.maintenance) {
- service.isRunning = false;
- }
- },
-
- /**
- * compute service status and properties by servicesMap of hostComponents
- * @param services
- * @param servicesMap
- */
- updateServicesStatus: function(services, servicesMap){
- services.forEach(function(_service){
- var service = servicesMap[_service.get('id')];
- if (service) {
- var serviceName = _service.get('serviceName');
- var serviceSpecificObj = null;
- switch (serviceName) {
- case "HDFS":
- serviceSpecificObj = App.HDFSService.find(_service.get('id'));
- break;
- case "YARN":
- serviceSpecificObj = App.YARNService.find(_service.get('id'));
- break;
- case "MAPREDUCE":
- serviceSpecificObj = App.MapReduceService.find(_service.get('id'));
- break;
- case "HBASE":
- serviceSpecificObj = App.HBaseService.find(_service.get('id'));
- break;
- }
- //computation of service health status
- var isGreen = serviceName === 'HBASE' && App.supports.multipleHBaseMasters ? service.isStarted : service.everyStartedOrMaintenance;
- if (isGreen) {
- _service.set('healthStatus', 'green');
- if (serviceSpecificObj != null) {
- serviceSpecificObj.set('healthStatus', 'green');
- }
- } else if (service.isUnknown) {
- _service.set('healthStatus', 'yellow');
- if (serviceSpecificObj != null) {
- serviceSpecificObj.set('healthStatus', 'yellow');
- }
- } else if (service.isStarting) {
- _service.set('healthStatus', 'green-blinking');
- if (serviceSpecificObj != null) {
- serviceSpecificObj.set('healthStatus', 'green-blinking');
- }
- } else if (service.isStopped) {
- _service.set('healthStatus', 'red');
- if (serviceSpecificObj != null) {
- serviceSpecificObj.set('healthStatus', 'red');
- }
- } else {
- _service.set('healthStatus', 'red-blinking');
- if (serviceSpecificObj != null) {
- serviceSpecificObj.set('healthStatus', 'red-blinking');
- }
- }
-
- if (serviceName === 'HBASE' && App.supports.multipleHBaseMasters) {
- if (!service.isHbaseActive) {
- _service.set('healthStatus', 'red');
- if (serviceSpecificObj != null) {
- serviceSpecificObj.set('healthStatus', 'red');
- }
- }
- }
-
- _service.set('isStarted', service.everyStarted);
- _service.set('isStopped', service.isRunning);
- _service.set('toolTipContent', service.toolTipContent);
- if (serviceSpecificObj != null) {
- serviceSpecificObj.set('isStarted', service.everyStarted);
- serviceSpecificObj.set('isStopped', service.isRunning);
- serviceSpecificObj.set('toolTipContent', service.toolTipContent);
- }
- }
- }, this);
- },
-
/**
* Map quick links to services:OOZIE,GANGLIA,NAGIOS,HUE
* @param finalJson
http://git-wip-us.apache.org/repos/asf/ambari/blob/3b44151a/ambari-web/app/models/host_component.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/host_component.js b/ambari-web/app/models/host_component.js
index 0121d53..f94446b 100644
--- a/ambari-web/app/models/host_component.js
+++ b/ambari-web/app/models/host_component.js
@@ -22,6 +22,7 @@ App.HostComponent = DS.Model.extend({
workStatus: DS.attr('string'),
componentName: DS.attr('string'),
haStatus: DS.attr('string'),
+ displayNameAdvanced: DS.attr('string'),
staleConfigs: DS.attr('boolean'),
host: DS.belongsTo('App.Host'),
service: DS.belongsTo('App.Service'),
@@ -120,27 +121,7 @@ App.HostComponent = DS.Model.extend({
* User friendly host component status
*/
componentTextStatus: function () {
- var value = this.get("workStatus");
-
- switch(value){
- case "INSTALLING":
- return 'Installing...';
- case "INSTALL_FAILED":
- return 'Install Failed';
- case "INSTALLED":
- return 'Stopped';
- case "STARTED":
- return 'Started';
- case "STARTING":
- return 'Starting...';
- case "STOPPING":
- return 'Stopping...';
- case "UNKNOWN":
- return 'Heartbeat lost...';
- case "UPGRADE_FAILED":
- return 'Upgrade Failed';
- }
- return 'Unknown';
+ return App.HostComponentStatus.getTextStatus(this.get("workStatus"));
}.property('workStatus','isDecommissioning')
});
@@ -178,7 +159,29 @@ App.HostComponentStatus = {
case this.unknown:
return 'unknown';
}
- return 'none';
+ return 'Unknown';
+ },
+
+ getTextStatus: function (value) {
+ switch (value) {
+ case this.installing:
+ return 'Installing...';
+ case this.install_failed:
+ return 'Install Failed';
+ case this.stopped:
+ return 'Stopped';
+ case this.started:
+ return 'Started';
+ case this.starting:
+ return 'Starting...';
+ case this.stopping:
+ return 'Stopping...';
+ case this.unknown:
+ return 'Heartbeat lost...';
+ case this.upgrade_failed:
+ return 'Upgrade Failed';
+ }
+ return 'Unknown';
}
};
http://git-wip-us.apache.org/repos/asf/ambari/blob/3b44151a/ambari-web/app/models/service.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/service.js b/ambari-web/app/models/service.js
index 7afd28f..09a3256 100644
--- a/ambari-web/app/models/service.js
+++ b/ambari-web/app/models/service.js
@@ -26,6 +26,7 @@ App.Service = DS.Model.extend({
workStatus: DS.attr('string'),
rand: DS.attr('string'),
+ toolTipContent: DS.attr('string'),
alerts: DS.hasMany('App.Alert'),
quickLinks: DS.hasMany('App.QuickLinks'),
hostComponents: DS.hasMany('App.HostComponent'),
@@ -37,9 +38,27 @@ App.Service = DS.Model.extend({
// a property that it depends on changes. For example, App.statusMapper's map function would invoke
// the computed property too many times and freezes the UI without this hack.
// See http://stackoverflow.com/questions/12467345/ember-js-collapsing-deferring-expensive-observers-or-computed-properties
- healthStatus: '',
- isStopped: false,
- isStarted: false,
+ healthStatus: function(){
+ switch(this.get('workStatus')){
+ case 'STARTED':
+ return 'green';
+ case 'STARTING':
+ return 'green-blinking';
+ case 'INSTALLED':
+ return 'red';
+ case 'STOPPING':
+ return 'red-blinking';
+ case 'UNKNOWN':
+ default:
+ return 'yellow';
+ }
+ }.property('workStatus'),
+ isStopped: function () {
+ return this.get('workStatus') === 'INSTALLED';
+ }.property('workStatus'),
+ isStarted: function () {
+ return this.get('workStatus') === 'STARTED';
+ }.property('workStatus'),
isConfigurable: function () {
var configurableServices = [