Repository: ambari Updated Branches: refs/heads/trunk 45a29900b -> 6305fb6ab
http://git-wip-us.apache.org/repos/asf/ambari/blob/6305fb6a/ambari-web/app/templates/main/service/services/yarn.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/main/service/services/yarn.hbs b/ambari-web/app/templates/main/service/services/yarn.hbs index 32aad5d..aa8ee48 100644 --- a/ambari-web/app/templates/main/service/services/yarn.hbs +++ b/ambari-web/app/templates/main/service/services/yarn.hbs @@ -17,95 +17,123 @@ }} <div class="row"> -{{! left column }} -<div class="col-md-6"> - {{view view.dashboardMasterComponentView}} + {{! Component Section }} + <div class="col-md-12 component-summary"> + <div class="col-md-2">{{t dashboard.services.hdfs.summary.components}}</div> + <div class="col-md-10"> + {{view view.dashboardMasterComponentView}} - {{! NodeManagers }} - {{#if view.isNodeManagerCreated}} - <div {{bindAttr class=":row :component view.nodeManagerComponent.componentName"}}> - <div class="col-md-6 summary-label"> - <a href="#" {{action filterHosts view.nodeManagerComponent}}>{{t dashboard.services.yarn.nodeManagers}}</a> + {{! NodeManagers }} + {{#if view.isNodeManagerCreated}} + <div {{bindAttr class=":row :component :col-md-3 view.nodeManagerComponent.componentName"}}> + <div class="summary-value main-info"> + {{#if App.router.clusterController.isServiceContentFullyLoaded}} + {{#view App.ComponentLiveTextView liveComponentsBinding="view.service.nodeManagersStarted" totalComponentsBinding="view.service.nodeManagersTotal" tagName="span"}} + {{view.liveComponents}}/{{view.totalComponents}} + {{/view}} + {{t common.started}} + {{else}} + {{t common.loading.eclipses}} + {{/if}} + </div> + <div class="summary-label"> + <a href="#" {{action filterHosts view.nodeManagerComponent}}>{{t dashboard.services.yarn.nodeManagers}}</a> + </div> + </div> + {{/if}} + {{! YARN Clients }} + <div {{bindAttr class=":row :component :col-md-3 view.yarnClientComponent.componentName"}}> + <div class="summary-value main-info"> + <span>{{view.service.installedClients}} {{t common.installed}} </span> + </div> + <div class="summary-label"> + <a {{action filterHosts view.yarnClientComponent}} href="javascript:void(null)"> + {{pluralize view.service.installedClients singular="t:dashboard.services.yarn.client" plural="t:dashboard.services.yarn.clients"}} + </a> + </div> </div> - <div class="col-md-6 summary-value"> - {{#if App.router.clusterController.isServiceContentFullyLoaded}} - {{#view App.ComponentLiveTextView liveComponentsBinding="view.service.nodeManagersStarted" totalComponentsBinding="view.service.nodeManagersTotal" tagName="span"}} - {{view.liveComponents}}/{{view.totalComponents}} - {{/view}} - {{t common.started}} - {{else}} - {{t common.loading.eclipses}} - {{/if}} + {{! ResourceManager Uptime }} + <div class="row col-md-3 resourcemanager-uptime"> + <div class="summary-value main-info">{{view.nodeUptime}}</div> + <div class="summary-label">{{t dashboard.services.yarn.resourceManager.uptime}}</div> + </div> + {{! NodeManagers status }} + <div class="row col-md-3 nodemanager-status"> + <div class="summary-value"> + <div class="main-info"> + <span {{translateAttr data-original-title="dashboard.services.yarn.nodeManagers.status.tooltip.active"}} + rel="tooltip"> + {{view._nmActive}} </span> / + <span {{translateAttr data-original-title="dashboard.services.yarn.nodeManagers.status.tooltip.lost"}} + rel="tooltip"> + {{view._nmLost}} </span> / + <span {{translateAttr data-original-title="dashboard.services.yarn.nodeManagers.status.tooltip.unhealthy"}} + rel="tooltip"> + {{view._nmUnhealthy}} </span> / + <span {{translateAttr data-original-title="dashboard.services.yarn.nodeManagers.status.tooltip.rebooted"}} + rel="tooltip"> + {{view._nmRebooted}} </span> / + <span {{translateAttr data-original-title="dashboard.services.yarn.nodeManagers.status.tooltip.decommissioned"}} + rel="tooltip"> + {{view._nmDecom}} </span> + </div> + <div class="info-desc"> + <span {{t dashboard.services.yarn.nodeManagers.status.active}} </span> / + <span {{t dashboard.services.yarn.nodeManagers.status.lost}} </span> / + <span {{t dashboard.services.yarn.nodeManagers.status.unhealthy}} </span> / + <span {{t dashboard.services.yarn.nodeManagers.status.rebooted}} </span> / + <span {{t dashboard.services.yarn.nodeManagers.status.decommissioned}} </span> + </div> + </div> + <div class="summary-label">{{t dashboard.services.yarn.nodeManagers.status}}</div> + </div> + {{! ResourceManager Heap }} + <div class="row col-md-3 resourcemanager-heap"> + <div class="summary-value main-info">{{view.nodeHeap}}</div> + <div class="summary-label">{{t dashboard.services.resourceManager.nodes.heap}}</div> </div> </div> - {{/if}} - {{! NodeManagers status }} - <div class="row nodemanager-status"> - <div class="col-md-6 summary-label">{{t dashboard.services.yarn.nodeManagers.status}}</div> - <div class="col-md-6 summary-value"> - <span {{translateAttr data-original-title="dashboard.services.yarn.nodeManagers.status.tooltip.active"}} rel="tooltip"> - {{view._nmActive}} {{t dashboard.services.yarn.nodeManagers.status.active}} </span> / - <span {{translateAttr data-original-title="dashboard.services.yarn.nodeManagers.status.tooltip.lost"}} rel="tooltip"> - {{view._nmLost}} {{t dashboard.services.yarn.nodeManagers.status.lost}} </span> / - <span {{translateAttr data-original-title="dashboard.services.yarn.nodeManagers.status.tooltip.unhealthy"}} rel="tooltip"> - {{view._nmUnhealthy}} {{t dashboard.services.yarn.nodeManagers.status.unhealthy}} </span> / - <span {{translateAttr data-original-title="dashboard.services.yarn.nodeManagers.status.tooltip.rebooted"}} rel="tooltip"> - {{view._nmRebooted}} {{t dashboard.services.yarn.nodeManagers.status.rebooted}} </span> / - <span {{translateAttr data-original-title="dashboard.services.yarn.nodeManagers.status.tooltip.decommissioned"}} rel="tooltip"> - {{view._nmDecom}} {{t dashboard.services.yarn.nodeManagers.status.decommissioned}} </span> - </div> - </div> - {{! YARN Clients }} - <div {{bindAttr class=":row :component view.yarnClientComponent.componentName"}}> - <div class="col-md-6 summary-label"> - <a {{action filterHosts view.yarnClientComponent}} href="javascript:void(null)"> - {{pluralize view.service.installedClients singular="t:dashboard.services.yarn.client" plural="t:dashboard.services.yarn.clients"}} - </a> - </div> - <div class="col-md-6 summary-value"> - <span class="green-live">{{view.service.installedClients}} </span> - {{pluralize view.service.installedClients singular="t:dashboard.services.yarn.client" plural="t:dashboard.services.yarn.clients"}} {{t common.installed}} - </div> - </div> - {{! ResourceManager Uptime }} - <div class="row resourcemanager-uptime"> - <div class="col-md-6 summary-label">{{t dashboard.services.yarn.resourceManager.uptime}}</div> - <div class="col-md-6 summary-value">{{view.nodeUptime}}</div> </div> -</div> -{{! left column end }} -{{! right column }} -<div class="col-md-6"> - {{! ResourceManager Heap }} - <div class="row resourcemanager-heap"> - <div class="col-md-6 summary-label">{{t dashboard.services.resourceManager.nodes.heap}}</div> - <div class="col-md-6 summary-value">{{view.nodeHeap}}</div> - </div> - {{! Containers }} - <div class="row yarn-containers"> - <div class="col-md-6 summary-label">{{t dashboard.services.yarn.containers}}</div> - <div class="col-md-6 summary-value">{{view.containers}}</div> - </div> - {{! Applications }} - <div class="row yarn-applications"> - <div class="col-md-6 summary-label">{{t dashboard.services.yarn.apps}}</div> - <div class="col-md-6 summary-value">{{view.apps}}</div> - </div> - {{! Memory }} - <div class="row yarn-memory"> - <div class="col-md-6 summary-label">{{t dashboard.services.yarn.memory}}</div> - <div class="col-md-6 summary-value">{{view.memory}}</div> - </div> - {{! Queues }} - <div class="row yarn-queues"> - <div class="col-md-6 summary-label">{{t dashboard.services.yarn.queues}}</div> - <div class="col-md-6 summary-value"> - <span rel="queue-tooltip" class="text-tooltip" {{bindAttr data-original-title="view.service.queueFormatted" }}> - {{view.queues}} - </span> + {{! Service Metrics Section }} + <div class="col-md-12 metrics-summary"> + <div class="col-md-2">{{t dashboard.services.hdfs.summary.service-metrics}}</div> + <div class="col-md-10"> + {{! Containers }} + <div class="row col-md-3 yarn-containers"> + <div class="summary-value"> + <div class="main-info">{{view.containers}}</div> + <div class="info-desc">{{t dashboard.services.yarn.containers.msgDesc}}</div> + </div> + <div class="summary-label">{{t dashboard.services.yarn.containers}}</div> + </div> + {{! Applications }} + <div class="row col-md-3 yarn-applications"> + <div class="summary-value"> + <div class="main-info">{{view.apps}}</div> + <div class="info-desc">{{t dashboard.services.yarn.apps.msgDesc}}</div> + </div> + <div class="summary-label">{{t dashboard.services.yarn.apps}}</div> + </div> + {{! Memory }} + <div class="row col-md-3 yarn-memory"> + <div class="summary-value"> + <div class="main-info">{{view.memory}}</div> + <div class="info-desc">{{t dashboard.services.yarn.memory.msgDesc}}</div> + </div> + <div class="summary-label">{{t dashboard.services.yarn.memory}}</div> + </div> + {{! Queues }} + <div class="row col-md-3 yarn-queues"> + <div class="summary-value main-info"> + <span rel="queue-tooltip" + class="text-tooltip" {{bindAttr data-original-title="view.service.queueFormatted" }}> + {{view.queues}} + </span> + </div> + <div class="summary-label">{{t dashboard.services.yarn.queues}}</div> + </div> </div> </div> -</div> -{{! right column end }} + {{! right column end }} </div> http://git-wip-us.apache.org/repos/asf/ambari/blob/6305fb6a/ambari-web/app/views/common/quick_view_link_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/common/quick_view_link_view.js b/ambari-web/app/views/common/quick_view_link_view.js index 47958f4..e39f230 100644 --- a/ambari-web/app/views/common/quick_view_link_view.js +++ b/ambari-web/app/views/common/quick_view_link_view.js @@ -39,6 +39,11 @@ App.QuickLinksView = Em.View.extend({ showQuickLinks: false, /** + * @type {boolean} + */ + showNoLinks: false, + + /** * @type {string} */ quickLinksErrorMessage: '', @@ -211,6 +216,9 @@ App.QuickLinksView = Em.View.extend({ this.set('requiredSiteNames', this.get('requiredSiteNames').pushObjects(sites).uniq()); this.setQuickLinks(); } + } else { + this.set('showNoLinks', true); + } }, @@ -260,7 +268,11 @@ App.QuickLinksView = Em.View.extend({ // no need to set quicklinks if // 1)current service does not have quick links configured // 2)No host component present for the configured quicklinks - this.set('showQuickLinks', hasQuickLinks && hasHosts); + if(hasQuickLinks && hasHosts) { + this.set('showQuickLinks', true); + } else { + this.set('showNoLinks', true); + } var isMultipleComponentsInLinks = componentNames.uniq().length > 1; http://git-wip-us.apache.org/repos/asf/ambari/blob/6305fb6a/ambari-web/app/views/common/widget/gauge_widget_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/common/widget/gauge_widget_view.js b/ambari-web/app/views/common/widget/gauge_widget_view.js index 42224fe..e359567 100644 --- a/ambari-web/app/views/common/widget/gauge_widget_view.js +++ b/ambari-web/app/views/common/widget/gauge_widget_view.js @@ -60,8 +60,8 @@ App.GaugeWidgetView = Em.View.extend(App.WidgetMixin, { }.property('value'), chartView: App.ChartPieView.extend({ - stroke: '#D6DDDF', //light grey - innerR: 25, + stroke: '#transparent', + innerR: 40, /** * since chart widget using percentage values factor equal 100 @@ -105,20 +105,18 @@ App.GaugeWidgetView = Em.View.extend(App.WidgetMixin, { var color_orange = App.healthStatusOrange; if ((isNaN(threshold1) && isNaN(threshold2)) || (isNaN(threshold1) && used <= threshold2) || (isNaN(threshold2) && used <= threshold1) || (!isNaN(threshold2) && (threshold1 > threshold2) && (used > threshold1)) || (!isNaN(threshold2) && (threshold1 < threshold2) && (used <= threshold1))) { this.set('palette', new Rickshaw.Color.Palette({ - scheme: ['#FFFFFF', color_green].reverse() + scheme: ['#DDDDDD', color_green].reverse() })); - return color_green; } else if ((!isNaN(threshold2) && used.isInRange(threshold1, threshold2)) || (isNaN(threshold2) && used > threshold1)) { this.set('palette', new Rickshaw.Color.Palette({ - scheme: ['#FFFFFF', color_orange].reverse() + scheme: ['#DDDDDD', color_orange].reverse() })); - return color_orange; } else { this.set('palette', new Rickshaw.Color.Palette({ - scheme: ['#FFFFFF', color_red].reverse() + scheme: ['#DDDDDD', color_red].reverse() })); - return color_red; } + return App.widgetContentColor; }.property('parentView.value', 'warningThreshold', 'errorThreshold'), // refresh text and color when data in model changed http://git-wip-us.apache.org/repos/asf/ambari/blob/6305fb6a/ambari-web/app/views/main/service/info/summary.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/service/info/summary.js b/ambari-web/app/views/main/service/info/summary.js index 75d4ed5..69e339a 100644 --- a/ambari-web/app/views/main/service/info/summary.js +++ b/ambari-web/app/views/main/service/info/summary.js @@ -229,6 +229,30 @@ App.MainServiceInfoSummaryView = Em.View.extend(App.Persist, App.TimeRangeMixin, service: null, + svc: function () { + var svc = this.get('controller.content'); + var svcName = svc.get('serviceName'); + if (svcName) { + switch (svcName.toLowerCase()) { + case 'hdfs': + svc = App.HDFSService.find().objectAt(0); + break; + case 'yarn': + svc = App.YARNService.find().objectAt(0); + break; + case 'hbase': + svc = App.HBaseService.find().objectAt(0); + break; + case 'flume': + svc = App.FlumeService.find().objectAt(0); + break; + default: + break; + } + } + return svc; + }.property('controller.content.serviceName').volatile(), + getServiceModel: function (serviceName) { var extended = App.Service.extendedModel[serviceName]; if (extended) { http://git-wip-us.apache.org/repos/asf/ambari/blob/6305fb6a/ambari-web/app/views/main/service/service.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/service/service.js b/ambari-web/app/views/main/service/service.js index f2c8492..41afca3 100644 --- a/ambari-web/app/views/main/service/service.js +++ b/ambari-web/app/views/main/service/service.js @@ -113,7 +113,6 @@ App.MainDashboardServiceHealthView = Em.View.extend({ }); App.ComponentLiveTextView = Em.View.extend({ - classNameBindings: ['color:service-summary-component-red-dead:service-summary-component-green-live'], liveComponents: null, totalComponents: null, color: function () { @@ -173,15 +172,21 @@ App.MainDashboardServiceView = Em.View.extend(App.MainDashboardServiceViewWrappe }); App.MainDashboardServiceView.reopenClass({ - formattedHeap: function (i18nKey, heapUsedKey, heapMaxKey) { + formattedHeapPercent: function (i18nKey, heapUsedKey, heapMaxKey) { return Em.computed(heapUsedKey, heapMaxKey, function () { var memUsed = Em.get(this, heapUsedKey); var memMax = Em.get(this, heapMaxKey); var percent = memMax > 0 ? 100 * memUsed / memMax : 0; + return Em.I18n.t(i18nKey).format(percent.toFixed(1)); + }); + }, + formattedHeap: function (i18nKey, heapUsedKey, heapMaxKey) { + return Em.computed(heapUsedKey, heapMaxKey, function () { + var memUsed = Em.get(this, heapUsedKey); + var memMax = Em.get(this, heapMaxKey); return Em.I18n.t(i18nKey).format( numberUtils.bytesToSize(memUsed, 1, 'parseFloat'), - numberUtils.bytesToSize(memMax, 1, 'parseFloat'), - percent.toFixed(1)); + numberUtils.bytesToSize(memMax, 1, 'parseFloat')); }); } }); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/6305fb6a/ambari-web/app/views/main/service/services/hbase.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/service/services/hbase.js b/ambari-web/app/views/main/service/services/hbase.js index ddcb18d..fd889a9 100644 --- a/ambari-web/app/views/main/service/services/hbase.js +++ b/ambari-web/app/views/main/service/services/hbase.js @@ -58,7 +58,7 @@ App.MainDashboardServiceHbaseView = App.MainDashboardServiceView.extend({ activeMasterTitle: Em.I18n.t('service.hbase.activeMaster'), masterServerHeapSummary: App.MainDashboardServiceView.formattedHeap('dashboard.services.hbase.masterServerHeap.summary', 'service.heapMemoryUsed', 'service.heapMemoryMax'), - + masterServerHeapSummaryPercent: App.MainDashboardServiceView.formattedHeapPercent('dashboard.services.hbase.masterServerHeap.percent', 'service.heapMemoryUsed', 'service.heapMemoryMax'), summaryHeader: function () { var avgLoad = this.get('service.averageLoad'); if (isNaN(avgLoad)) { http://git-wip-us.apache.org/repos/asf/ambari/blob/6305fb6a/ambari-web/app/views/main/service/services/hdfs.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/service/services/hdfs.js b/ambari-web/app/views/main/service/services/hdfs.js index becb75c..e0580f1 100644 --- a/ambari-web/app/views/main/service/services/hdfs.js +++ b/ambari-web/app/views/main/service/services/hdfs.js @@ -28,7 +28,20 @@ function diskPart(i18nKey, totalKey, usedKey) { if (percent == "NaN" || percent < 0) { percent = Em.I18n.t('services.service.summary.notAvailable') + " "; } - return text.format(numberUtils.bytesToSize(used, 1, 'parseFloat'), numberUtils.bytesToSize(total, 1, 'parseFloat'), percent); + return text.format(numberUtils.bytesToSize(used, 1, 'parseFloat'), numberUtils.bytesToSize(total, 1, 'parseFloat')); + }); +} + +function diskPartPercent(i18nKey, totalKey, usedKey) { + return Em.computed(totalKey, usedKey, function () { + var text = Em.I18n.t(i18nKey); + var total = this.get(totalKey); + var used = this.get(usedKey); + var percent = total > 0 ? ((used * 100) / total).toFixed(2) : 0; + if (percent == "NaN" || percent < 0) { + percent = Em.I18n.t('services.service.summary.notAvailable') + " "; + } + return text.format(percent); }); } @@ -113,9 +126,11 @@ App.MainDashboardServiceHdfsView = App.MainDashboardServiceView.extend({ return this.t('services.service.summary.notRunning'); }.property("service.nameNodeStartTime"), + nodeHeapPercent: App.MainDashboardServiceView.formattedHeapPercent('dashboard.services.hdfs.nodes.heapUsedPercent', 'service.jvmMemoryHeapUsed', 'service.jvmMemoryHeapMax'), nodeHeap: App.MainDashboardServiceView.formattedHeap('dashboard.services.hdfs.nodes.heapUsed', 'service.jvmMemoryHeapUsed', 'service.jvmMemoryHeapMax'), dfsUsedDisk: diskPart('dashboard.services.hdfs.capacityUsed', 'service.capacityTotal', 'service.capacityUsed'), + dfsUsedDiskPercent: diskPartPercent('dashboard.services.hdfs.capacityUsedPercent', 'service.capacityTotal', 'service.capacityUsed'), nonDfsUsed: function () { var total = this.get('service.capacityTotal'); @@ -125,8 +140,10 @@ App.MainDashboardServiceHdfsView = App.MainDashboardServiceView.extend({ }.property('service.capacityTotal', 'service.capacityRemaining', 'service.capacityUsed'), nonDfsUsedDisk: diskPart('dashboard.services.hdfs.capacityUsed', 'service.capacityTotal', 'nonDfsUsed'), + nonDfsUsedDiskPercent: diskPartPercent('dashboard.services.hdfs.capacityUsedPercent', 'service.capacityTotal', 'nonDfsUsed'), remainingDisk: diskPart('dashboard.services.hdfs.capacityUsed', 'service.capacityTotal', 'service.capacityRemaining'), + remainingDiskPercent: diskPartPercent('dashboard.services.hdfs.capacityUsedPercent', 'service.capacityTotal', 'service.capacityRemaining'), dataNodeComponent: Em.Object.create({ componentName: 'DATANODE' http://git-wip-us.apache.org/repos/asf/ambari/blob/6305fb6a/ambari-web/app/views/main/service/services/yarn.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/service/services/yarn.js b/ambari-web/app/views/main/service/services/yarn.js index 84ba520..3533585 100644 --- a/ambari-web/app/views/main/service/services/yarn.js +++ b/ambari-web/app/views/main/service/services/yarn.js @@ -24,7 +24,8 @@ App.MainDashboardServiceYARNView = App.MainDashboardServiceView.extend({ serviceName: 'YARN', nodeHeap: App.MainDashboardServiceView.formattedHeap('dashboard.services.yarn.nodes.heapUsed', 'service.jvmMemoryHeapUsed', 'service.jvmMemoryHeapMax'), - + nodeHeapPercent: App.MainDashboardServiceView.formattedHeapPercent('dashboard.services.yarn.nodes.heapUsedPercent', 'service.jvmMemoryHeapUsed', 'service.jvmMemoryHeapMax'), + nodeManagerComponent: Em.Object.create({ componentName: 'NODEMANAGER' }), http://git-wip-us.apache.org/repos/asf/ambari/blob/6305fb6a/ambari-web/test/views/common/widget/gauge_widget_view_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/views/common/widget/gauge_widget_view_test.js b/ambari-web/test/views/common/widget/gauge_widget_view_test.js index 1967289..2c8ef30 100644 --- a/ambari-web/test/views/common/widget/gauge_widget_view_test.js +++ b/ambari-web/test/views/common/widget/gauge_widget_view_test.js @@ -251,7 +251,7 @@ describe('App.GaugeWidgetView', function () { view.set('value', test.data.value); view.set('content.properties.warning_threshold', test.data.warningThreshold); view.set('content.properties.error_threshold', test.data.criticalThreshold); - expect(chartView.get('contentColor')).to.eql(test.result); + expect(chartView.get('palette').color(0)).to.eql(test.result); }); }); });