ambari-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ababiic...@apache.org
Subject [1/2] AMBARI-5402 Remove classic dashboard view from Ambari. (ababiichuk)
Date Wed, 09 Apr 2014 11:07:47 GMT
Repository: ambari
Updated Branches:
  refs/heads/trunk 29e61ae9c -> eb6ed77ce


http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/dashboard/service/hbase.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/service/hbase.js b/ambari-web/app/views/main/dashboard/service/hbase.js
deleted file mode 100644
index e2e8462..0000000
--- a/ambari-web/app/views/main/dashboard/service/hbase.js
+++ /dev/null
@@ -1,145 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-var App = require('app');
-var date = require('utils/date');
-var numberUtils = require('utils/number_utils');
-
-App.MainDashboardServiceHbaseView = App.MainDashboardServiceView.extend({
-  templateName: require('templates/main/dashboard/service/hbase'),
-  serviceName: 'hbase',
-  /**
-   * All master components
-   */
-  masters: function () {
-    return this.get('service.hostComponents').filterProperty('isMaster', true);
-  }.property('service.hostComponents.length'),
-  /**
-   * Passive master components
-   */
-  passiveMasters: function () {
-    if(App.supports.multipleHBaseMasters){
-      return this.get('masters').filterProperty('haStatus', 'false');
-    }
-    return [];
-  }.property('masters'),
-
-
-  liveRegionServers: function () {
-    return this.get('service.regionServers').filterProperty("workStatus", "STARTED");
-  }.property('service.regionServers.@each.workStatus'),
-
-  regionServesText: function () {
-    if (this.get('service.regionServers.length') == 0) {
-      return '';
-    } else if (this.get('service.regionServers.length') > 1) {
-      return Em.I18n.t('services.service.summary.viewHosts');
-    } else {
-      return Em.I18n.t('services.service.summary.viewHost');
-    }
-  }.property("service"),
-
-  regionServersLiveTextView: App.ComponentLiveTextView.extend({
-    liveComponents: function() {
-      return this.get('service.regionServers').filterProperty("workStatus","STARTED").get('length');
-    }.property('service.regionServers.@each.workStatus'),
-    totalComponents: function() {
-      return this.get("service.regionServers.length");
-    }.property("service.regionServers.length")
-  }),
-
-  /**
-   * One(!) active master component
-   */
-  activeMaster: function () {
-    if(App.supports.multipleHBaseMasters){
-      return this.get('masters').findProperty('haStatus', 'true');
-    } else {
-      return this.get('masters')[0];
-    }
-  }.property('masters'),
-
-  activeMasterTitle: function(){
-    if(App.supports.multipleHBaseMasters){
-      return this.t('service.hbase.activeMaster');
-    } else {
-      return this.get('activeMaster.host.publicHostName');
-    }
-  }.property('activeMaster'),
-
-  masterServerHeapSummary: function () {
-    var heapUsed = this.get('service').get('heapMemoryUsed');
-    var heapMax = this.get('service').get('heapMemoryMax');
-    var percent = heapMax > 0 ? 100 * heapUsed / heapMax : 0;
-    var heapString = numberUtils.bytesToSize(heapUsed, 1, "parseFloat");
-    var heapMaxString = numberUtils.bytesToSize(heapMax, 1, "parseFloat");
-    return this.t('dashboard.services.hbase.masterServerHeap.summary').format(heapString, heapMaxString, percent.toFixed(1));
-  }.property('service.heapMemoryUsed', 'service.heapMemoryMax'),
-
-  summaryHeader: function () {
-    var avgLoad = this.get('service.averageLoad');
-    if (isNaN(avgLoad)) {
-      avgLoad = this.t("services.service.summary.unknown");
-    }
-    return this.t("dashboard.services.hbase.summary").format(this.get('service.regionServers.length'), avgLoad);
-  }.property('service.regionServers', 'service.averageLoad'),
-
-  hbaseMasterWebUrl: function () {
-    if (this.get('activeMaster.host') && this.get('activeMaster.host').get('publicHostName')) {
-      return "http://" + (App.singleNodeInstall ? App.singleNodeAlias : this.get('activeMaster.host').get('publicHostName')) + ":60010";
-    }
-  }.property('activeMaster'),
-
-  averageLoad: function () {
-    var avgLoad = this.get('service.averageLoad');
-    if (isNaN(avgLoad)) {
-      avgLoad = this.t('services.service.summary.notAvailable');
-    }
-    return this.t('dashboard.services.hbase.averageLoadPerServer').format(avgLoad);
-  }.property("service.averageLoad"),
-
-  masterStartedTime: function () {
-    var uptime = this.get('service').get('masterStartTime');
-    if (uptime && uptime > 0) {
-      var diff = App.dateTime() - uptime;
-      if (diff < 0) {
-        diff = 0;
-      }
-      var formatted = date.timingFormat(diff);
-      return this.t('dashboard.services.uptime').format(formatted);
-    }
-    return this.t('services.service.summary.notRunning');
-  }.property("service.masterStartTime"),
-
-  masterActivatedTime: function () {
-    var uptime = this.get('service').get('masterActiveTime');
-    if (uptime && uptime > 0) {
-      var diff = App.dateTime() - uptime;
-      if (diff < 0) {
-        diff = 0;
-      }
-      var formatted = date.timingFormat(diff);
-      return this.t('dashboard.services.uptime').format(formatted);
-    }
-    return this.t('services.service.summary.notRunning');
-  }.property("service.masterActiveTime"),
-
-  regionServerComponent: function () {
-    return this.get('service.regionServers').objectAt(0);
-  }.property()
-
-});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/dashboard/service/hdfs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/service/hdfs.js b/ambari-web/app/views/main/dashboard/service/hdfs.js
deleted file mode 100644
index 86a346a..0000000
--- a/ambari-web/app/views/main/dashboard/service/hdfs.js
+++ /dev/null
@@ -1,205 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-var App = require('app');
-var date = require('utils/date');
-var numberUtils = require('utils/number_utils');
-
-App.MainDashboardServiceHdfsView = App.MainDashboardServiceView.extend({
-  templateName: require('templates/main/dashboard/service/hdfs'),
-  serviceName: 'HDFS',
-  Chart: App.ChartPieView.extend({
-    service: null,
-    color: '#0066B3',
-    stroke: '#0066B3',
-    palette: new Rickshaw.Color.Palette({
-      scheme: [ 'rgba(0,102,179,0)', 'rgba(0,102,179,1)'].reverse()
-    }),
-    data: function () {
-      var total = this.get('service.capacityTotal') + 0;
-      var remaining = (this.get('service.capacityRemaining') + 0);
-      var used = total - remaining;
-      return [ used, remaining ];
-    }.property('service.capacityUsed', 'service.capacityTotal')
-  }),
-
-  dashboardMasterComponentView: Em.View.extend({
-    didInsertElement: function() {
-      App.tooltip($('[rel=healthTooltip]'));
-    },
-    templateName: require('templates/main/service/info/summary/master_components'),
-    mastersComp : function() {
-      return this.get('parentView.service.hostComponents').filter(function(comp){
-        return comp.get('isMaster') && comp.get('componentName') !== 'JOURNALNODE';
-      });
-    }.property('parentView.service.hostComponents')
-  }),
-
-  dataNodesLive: function () {
-    return this.get('service.dataNodes').filterProperty("workStatus", "STARTED");
-  }.property('service.dataNodes.@each.workStatus'),
-  dataNodesDead: function () {
-    return this.get('service.dataNodes').filterProperty("workStatus", "INSTALLED");
-  }.property('service.dataNodes.@each.workStatus'),
-
-  showJournalNodes: function () {
-    return this.get('service.journalNodes.length') > 0;
-  }.property('service.journalNodes.length'),
-
-  dataNodesLiveTextView: App.ComponentLiveTextView.extend({
-    liveComponents: function () {
-      return this.get('service.dataNodes').filterProperty("workStatus", "STARTED").get("length");
-    }.property("service.dataNodes.@each.workStatus"),
-    totalComponents: function() {
-      return this.get("service.dataNodes.length");
-    }.property("service.dataNodes.length")
-  }),
-
-  journalNodesLiveTextView: App.ComponentLiveTextView.extend({
-    liveComponents: function () {
-      return this.get('service.journalNodes').filterProperty("workStatus", "STARTED").get("length");
-    }.property("service.journalNodes.@each.workStatus"),
-    totalComponents: function () {
-      return this.get('service.journalNodes.length');
-    }.property("service.journalNodes.length")
-  }),
-
-  dfsTotalBlocks: function(){
-    return this.formatUnavailable(this.get('service.dfsTotalBlocks'));
-  }.property('service.dfsTotalBlocks'),
-  dfsTotalFiles: function(){
-    return this.formatUnavailable(this.get('service.dfsTotalFiles'));
-  }.property('service.dfsTotalFiles'),
-  dfsCorruptBlocks: function(){
-    return this.formatUnavailable(this.get('service.dfsCorruptBlocks'));
-  }.property('service.dfsCorruptBlocks'),
-  dfsMissingBlocks: function(){
-    return this.formatUnavailable(this.get('service.dfsMissingBlocks'));
-  }.property('service.dfsMissingBlocks'),
-  dfsUnderReplicatedBlocks: function(){
-    return this.formatUnavailable(this.get('service.dfsUnderReplicatedBlocks'));
-  }.property('service.dfsUnderReplicatedBlocks'),
-
-  blockErrorsMessage: function() {
-    return Em.I18n.t('dashboard.services.hdfs.blockErrors').format(this.get('dfsCorruptBlocks'), this.get('dfsMissingBlocks'), this.get('dfsUnderReplicatedBlocks'));
-  }.property('dfsCorruptBlocks','dfsMissingBlocks','dfsUnderReplicatedBlocks'),
-
-  nodeUptime: function () {
-    var uptime = this.get('service').get('nameNodeStartTime');
-    if (uptime && uptime > 0){
-      var diff = App.dateTime() - uptime;
-      if (diff < 0) {
-        diff = 0;
-      }
-      var formatted = date.timingFormat(diff);
-      return this.t('dashboard.services.uptime').format(formatted);
-    }
-    return this.t('services.service.summary.notRunning');
-  }.property("service.nameNodeStartTime"),
-
-  nodeWebUrl: function () {
-    return "http://" + (App.singleNodeInstall ? App.singleNodeAlias :  this.get('service').get('nameNode').get('publicHostName')) + ":50070";
-  }.property('service.nameNode'),
-
-  nodeHeap: function () {
-    var memUsed = this.get('service').get('jvmMemoryHeapUsed');
-    var memMax = this.get('service').get('jvmMemoryHeapMax');
-    var percent = memMax > 0 ? ((100 * memUsed) / memMax) : 0;
-    return this.t('dashboard.services.hdfs.nodes.heapUsed').format(
-      numberUtils.bytesToSize(memUsed, 1, 'parseFloat'),
-      numberUtils.bytesToSize(memMax, 1, 'parseFloat'),
-      percent.toFixed(1));
-  }.property('service.jvmMemoryHeapUsed', 'service.jvmMemoryHeapMax'),
-
-  summaryHeader: function () {
-    var text = this.t("dashboard.services.hdfs.summary");
-    var service = this.get('service');
-    var liveCount = service.get('dataNodes').filterProperty("workStatus", "STARTED").length;
-    var totalCount = service.get('dataNodes').get('length');
-    var total = service.get('capacityTotal') + 0;
-    var remaining = service.get('capacityRemaining') + 0;
-    var used = total - remaining;
-    var percent = total > 0 ? ((used * 100) / total).toFixed(1) : 0;
-    if (percent == "NaN" || percent < 0) {
-      percent = Em.I18n.t('services.service.summary.notAvailable') + " ";
-    }
-    return text.format(liveCount, totalCount, percent);
-  }.property('service.dataNodes.@each.workStatus', 'service.capacityUsed', 'service.capacityTotal'),
-
-  dfsUsedDisk: function () {
-    var text = this.t("dashboard.services.hdfs.capacityUsed");
-    var total = this.get('service.capacityTotal');
-    var dfsUsed = this.get('service.capacityUsed');
-    var percent = total > 0 ? ((dfsUsed * 100) / total).toFixed(2) : 0;
-    if (percent == "NaN" || percent < 0) {
-      percent = Em.I18n.t('services.service.summary.notAvailable') + " ";
-    }
-    return text.format(numberUtils.bytesToSize(dfsUsed, 1, 'parseFloat'), numberUtils.bytesToSize(total, 1, 'parseFloat'), percent);
-  }.property('service.capacityUsed', 'service.capacityTotal'),
-  nonDfsUsedDisk: function () {
-    var text = this.t("dashboard.services.hdfs.capacityUsed");
-    var total = this.get('service.capacityTotal');
-    var remaining = this.get('service.capacityRemaining');
-    var dfsUsed = this.get('service.capacityUsed');
-    var nonDfsUsed = total !== null && remaining !== null && dfsUsed !== null ? total - remaining - dfsUsed : null;
-    var percent = total > 0 ? ((nonDfsUsed * 100) / total).toFixed(2) : 0;
-    if (percent == "NaN" || percent < 0) {
-      percent = Em.I18n.t('services.service.summary.notAvailable') + " ";
-    }
-    return text.format(numberUtils.bytesToSize(nonDfsUsed, 1, 'parseFloat'), numberUtils.bytesToSize(total, 1, 'parseFloat'), percent);
-  }.property('service.capacityUsed', 'service.capacityRemaining', 'service.capacityTotal'),
-  remainingDisk: function () {
-    var text = this.t("dashboard.services.hdfs.capacityUsed");
-    var total = this.get('service.capacityTotal');
-    var remaining = this.get('service.capacityRemaining');
-    var percent = total > 0 ? ((remaining * 100) / total).toFixed(2) : 0;
-    if (percent == "NaN" || percent < 0) {
-      percent = Em.I18n.t('services.service.summary.notAvailable') + " ";
-    }
-    return text.format(numberUtils.bytesToSize(remaining, 1, 'parseFloat'), numberUtils.bytesToSize(total, 1, 'parseFloat'), percent);
-  }.property('service.capacityRemaining', 'service.capacityTotal'),
-
-  dataNodeComponent: function () {
-    return this.get('service.dataNodes').objectAt(0);
-  }.property(),
-
-  journalNodeComponent: function () {
-    return this.get('service.journalNodes').objectAt(0);
-  }.property(),
-
-  safeModeStatus: function () {
-    var safeMode = this.get('service.safeModeStatus');
-    if (safeMode == null) {
-      return Em.I18n.t("services.service.summary.notAvailable");
-    } else if (safeMode.length == 0) {
-      return Em.I18n.t("services.service.summary.safeModeStatus.notInSafeMode");
-    } else {
-      return Em.I18n.t("services.service.summary.safeModeStatus.inSafeMode");
-    }
-  }.property('service.safeModeStatus'),
-  upgradeStatus: function () {
-    var upgradeStatus = this.get('service.upgradeStatus');
-    var healthStatus = this.get('service.healthStatus');
-    if (upgradeStatus) {
-      return Em.I18n.t('services.service.summary.pendingUpgradeStatus.notPending');
-    } else if (healthStatus == 'green') {
-      return Em.I18n.t('services.service.summary.pendingUpgradeStatus.pending');
-    } else {
-      return Em.I18n.t("services.service.summary.notAvailable");
-    }
-  }.property('service.upgradeStatus', 'service.healthStatus')
-});

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/dashboard/service/hive.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/service/hive.js b/ambari-web/app/views/main/dashboard/service/hive.js
deleted file mode 100644
index 7dbd323..0000000
--- a/ambari-web/app/views/main/dashboard/service/hive.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.MainDashboardServiceHiveView = App.MainDashboardServiceView.extend({
-  templateName: require('templates/main/dashboard/service/hive'),
-  serviceName: 'hive',
-
-  titleMasters: function(){
-    var masters = this.get('masters');
-    return [masters.findProperty('componentName', 'HIVE_SERVER'), masters.findProperty('componentName', 'HIVE_METASTORE')];
-  }.property('service')
-});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/dashboard/service/mapreduce.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/service/mapreduce.js b/ambari-web/app/views/main/dashboard/service/mapreduce.js
deleted file mode 100644
index dd2f1b4..0000000
--- a/ambari-web/app/views/main/dashboard/service/mapreduce.js
+++ /dev/null
@@ -1,140 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-var App = require('app');
-var date = require('utils/date');
-var numberUtils = require('utils/number_utils');
-
-App.MainDashboardServiceMapreduceView = App.MainDashboardServiceView.extend({
-  templateName: require('templates/main/dashboard/service/mapreduce'),
-  serviceName: 'MAPREDUCE',
-  jobTrackerWebUrl: function () {
-    return "http://" + (App.singleNodeInstall ? App.singleNodeAlias : this.get('service').get('jobTracker').get('publicHostName')) + ":50030";
-  }.property('service.jobTracker'),
-
-  Chart: App.ChartLinearView.extend({
-    data: function () {
-      return this.get('_parentView.data.chart');
-    }.property('_parentView.data.chart')
-  }),
-
-  jobTrackerUptime: function () {
-    var uptime = this.get('service').get('jobTrackerStartTime');
-    if (uptime && uptime > 0){
-      var diff = App.dateTime() - uptime;
-      if (diff < 0) {
-        diff = 0;
-      }
-      var formatted = date.timingFormat(diff);
-      return this.t('dashboard.services.uptime').format(formatted);
-
-    }
-    return this.t('services.service.summary.notRunning');
-  }.property("service.jobTrackerStartTime"),
-
-  summaryHeader: function () {
-    var svc = this.get('service');
-    var liveCount = svc.get('aliveTrackers').get('length');
-    var allCount = svc.get('taskTrackers').get('length');
-    var runningCount = svc.get('jobsRunning');
-    if (runningCount === null) {
-      runningCount = 'n/a';
-    }
-    var template = this.t('dashboard.services.mapreduce.summary');
-    return template.format(liveCount, allCount, runningCount);
-  }.property('service.aliveTrackers', 'service.taskTrackers', 'service.jobsRunning'),
-
-  trackersText: function () {
-    if (this.get('service').get('taskTrackers.length') == 0) {
-      return '';
-    } else if (this.get('service').get('taskTrackers.length') > 1){
-      return Em.I18n.t('services.service.summary.viewHosts');
-    }else{
-      return Em.I18n.t('services.service.summary.viewHost');
-    }
-  }.property("service.taskTrackers.length"),
-
-  trackersSummary: function () {
-    var svc = this.get('service');
-    var liveCount = svc.get('taskTrackers').filterProperty("workStatus", "STARTED").length;
-    var totalCount = svc.get('taskTrackers').get('length');
-    var template = this.t('dashboard.services.mapreduce.trackersSummary');
-    return template.format(liveCount, totalCount);
-  }.property('service.aliveTrackers.length', 'service.taskTrackers.@each.workStatus'),
-
-  trackersLiveTextView: App.ComponentLiveTextView.extend({
-    liveComponents: function () {
-      return this.get('service.taskTrackers').filterProperty("workStatus", "STARTED").get("length");
-    }.property("service.taskTrackers.@each.workStatus"),
-    totalComponents: function() {
-      return this.get("service.taskTrackers.length");
-    }.property('service.taskTrackers.length')
-  }),
-
-  trackersHeapSummary: function () {
-    var heapUsed = this.get('service').get('jobTrackerHeapUsed');
-    var heapMax = this.get('service').get('jobTrackerHeapMax');
-    var percent = heapMax > 0 ? 100 * heapUsed / heapMax : 0;
-    return this.t('dashboard.services.mapreduce.jobTrackerHeapSummary').format(numberUtils.bytesToSize(heapUsed, 1, "parseFloat"), numberUtils.bytesToSize(heapMax, 1, "parseFloat"), percent.toFixed(1));
-  }.property('service.jobTrackerHeapUsed', 'service.jobTrackerHeapMax'),
-
-  jobsSummary: function () {
-    var svc = this.get('service');
-    var template = this.t('dashboard.services.mapreduce.jobsSummary');
-    return template.format(this.formatUnavailable(svc.get('jobsSubmitted')), this.formatUnavailable(svc.get('jobsCompleted')));
-  }.property('service.jobsSubmitted', 'service.jobsCompleted'),
-
-  mapSlotsSummary: function () {
-    var svc = this.get('service');
-    var template = this.t('dashboard.services.mapreduce.mapSlotsSummary');
-    return template.format(this.formatUnavailable(svc.get('mapSlotsOccupied')), this.formatUnavailable(svc.get('mapSlotsReserved')));
-  }.property('service.mapSlotsOccupied', 'service.mapSlotsReserved'),
-
-  reduceSlotsSummary: function () {
-    var svc = this.get('service');
-    var template = this.t('dashboard.services.mapreduce.reduceSlotsSummary');
-    return template.format(this.formatUnavailable(svc.get('reduceSlotsOccupied')), this.formatUnavailable(svc.get('reduceSlotsReserved')));
-  }.property('service.reduceSlotsOccupied', 'service.reduceSlotsReserved'),
-
-  mapTasksSummary: function () {
-    var svc = this.get('service');
-    var template = this.t('dashboard.services.mapreduce.tasksSummary');
-    return template.format(this.formatUnavailable(svc.get('mapsRunning')), this.formatUnavailable(svc.get('mapsWaiting')));
-  }.property('service.mapsRunning', 'service.mapsWaiting'),
-
-  reduceTasksSummary: function () {
-    var svc = this.get('service');
-    var template = this.t('dashboard.services.mapreduce.tasksSummary');
-    return template.format(this.formatUnavailable(svc.get('reducesRunning')), this.formatUnavailable(svc.get('reducesWaiting')));
-  }.property('service.reducesRunning', 'service.reducesWaiting'),
-
-  slotsCapacitySummary: function () {
-    var mapSlots = this.get('service').get('mapSlots');
-    var reduceSlots = this.get('service').get('reduceSlots');
-    var liveNodeCount = this.get('service').get('aliveTrackers').get('length');
-    if(liveNodeCount != 0){
-      var avg = (mapSlots + reduceSlots) / liveNodeCount;
-    }else{
-      avg = Em.I18n.t('services.service.summary.notAvailable') + " ";
-    }
-    return this.t('dashboard.services.mapreduce.slotCapacitySummary').format(mapSlots, reduceSlots, avg);
-  }.property('service.mapSlots', 'service.reduceSlots', 'service.aliveTrackers'),
-
-  taskTrackerComponent: function () {
-    return this.get('service.taskTrackers').objectAt(0);
-  }.property()
-});

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/dashboard/service/mapreduce2.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/service/mapreduce2.js b/ambari-web/app/views/main/dashboard/service/mapreduce2.js
deleted file mode 100644
index 1b35765..0000000
--- a/ambari-web/app/views/main/dashboard/service/mapreduce2.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-var App = require('app');
-
-App.MainDashboardServiceMapreduce2View = App.MainDashboardServiceView.extend({
-    templateName: require('templates/main/dashboard/service/mapreduce2'),
-    serviceName: 'MAPREDUCE2',
-
-    titleInfo: function(){
-      var hs = this.get('service.hostComponents').findProperty('componentName', 'HISTORYSERVER');
-      if (!hs) {
-        return this.t('services.mapreduce2.history.unknown');
-      } else if (hs.get('workStatus') === App.HostComponentStatus.started) {
-        return this.t('services.mapreduce2.history.running');
-      } else {
-        return this.t('services.mapreduce2.history.stopped');
-      }
-    }.property('service')
-  });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/dashboard/service/oozie.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/service/oozie.js b/ambari-web/app/views/main/dashboard/service/oozie.js
deleted file mode 100644
index 06b87d7..0000000
--- a/ambari-web/app/views/main/dashboard/service/oozie.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.MainDashboardServiceOozieView = App.MainDashboardServiceView.extend({
-  serviceName: 'oozie',
-  templateName: require('templates/main/dashboard/service/oozie'),
-
-  webUi: function () {
-    var hostName = App.singleNodeInstall ? App.singleNodeAlias : this.get('service.hostComponents').findProperty('componentName', 'OOZIE_SERVER').get('host.publicHostName');
-    return "http://{0}:11000/oozie".format(hostName);
-  }.property('service')
-});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/dashboard/service/storm.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/service/storm.js b/ambari-web/app/views/main/dashboard/service/storm.js
deleted file mode 100644
index f01f3f1..0000000
--- a/ambari-web/app/views/main/dashboard/service/storm.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-var date = require('utils/date');
-
-App.MainDashboardServiceStormView = App.MainDashboardServiceView.extend({
-  templateName: require('templates/main/dashboard/service/storm'),
-  serviceName: 'storm',
-
-  superVisorComponents: function() {
-    return this.get('service.hostComponents').filterProperty('componentName', 'SUPERVISOR');
-  }.property('service.hostComponents.@each'),
-
-  superVisorsLiveTextView: App.ComponentLiveTextView.extend({
-    liveComponents: function () {
-      return this.get('parentView.superVisorComponents').filterProperty('workStatus','STARTED').length;
-    }.property('parentView.superVisorComponents.@each.workStatus'),
-    totalComponents: function() {
-      return this.get('parentView.superVisorComponents').length;
-    }.property('parentView.superVisorComponents.length')
-  }),
-
-  freeSlotsPercentage: function() {
-    return Math.round(this.get('service.freeSlots')/this.get('service.totalSlots')*100);
-  }.property('service.freeSlots', 'service.totalSlots'),
-
-  nimbusUptimeFormatted: function() {
-    if (this.get('service.nimbusUptime') > 0) {
-      return date.timingFormat(this.get('service.nimbusUptime')*1000);
-    }
-    return Em.I18n.t('services.service.summary.notRunning');
-  }.property('service.nimbusUptime')
-});

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/dashboard/service/yarn.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/service/yarn.js b/ambari-web/app/views/main/dashboard/service/yarn.js
deleted file mode 100644
index 3b25f46..0000000
--- a/ambari-web/app/views/main/dashboard/service/yarn.js
+++ /dev/null
@@ -1,145 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-var App = require('app');
-var date = require('utils/date');
-var numberUtils = require('utils/number_utils');
-
-App.MainDashboardServiceYARNView = App.MainDashboardServiceView.extend({
-  templateName: require('templates/main/dashboard/service/yarn'),
-  serviceName: 'YARN',
-
-  nodeHeap: function () {
-    var memUsed = this.get('service').get('jvmMemoryHeapUsed');
-    var memMax = this.get('service').get('jvmMemoryHeapMax');
-    var percent = memMax > 0 ? ((100 * memUsed) / memMax) : 0;
-    return this.t('dashboard.services.hdfs.nodes.heapUsed').format(
-      numberUtils.bytesToSize(memUsed, 1, 'parseFloat'),
-      numberUtils.bytesToSize(memMax, 1, 'parseFloat'),
-      percent.toFixed(1));
-  }.property('service.jvmMemoryHeapUsed', 'service.jvmMemoryHeapMax'),
-
-  summaryHeader: function () {
-    var text = this.t("dashboard.services.yarn.summary");
-    var svc = this.get('service');
-    var totalCount = svc.get('nodeManagerNodes').get('length');
-    return text.format(totalCount, totalCount);
-  }.property('service.nodeManagerNodes'),
-  
-  nodeManagerComponent: function () {
-    return this.get('service.nodeManagerNodes').objectAt(0);
-  }.property(),
-  
-  yarnClientComponent: function () {
-    return this.get('service.hostComponents').findProperty('componentName', 'YARN_CLIENT');
-  }.property(),
-
-  hasManyYarnClients: function () {
-    return (this.get('service.yarnClientNodes.length') > 1);
-  }.property('service.yarnClientNodes.length'),
-
-  nodeUptime: function () {
-    var uptime = this.get('service').get('resourceManagerStartTime');
-    if (uptime && uptime > 0){
-      var diff = App.dateTime() - uptime;
-      if (diff < 0) {
-        diff = 0;
-      }
-      var formatted = date.timingFormat(diff);
-      return this.t('dashboard.services.uptime').format(formatted);
-    }
-    return this.t('services.service.summary.notRunning');
-  }.property("service.resourceManagerStartTime"),
-
-  nodeManagerText: function () {
-    if(!this.get("nodeManagerComponent") || this.get("nodeManagerComponent.length") == 0){
-      return '';
-    } else if(this.get("nodeManagerComponent.length") > 1){
-      return Em.I18n.t('services.service.summary.viewHosts');
-    } else {
-      return Em.I18n.t('services.service.summary.viewHost');
-    }
-  }.property("nodeManagerComponent"),
-
-  nodeManagersLiveTextView: App.ComponentLiveTextView.extend({
-    liveComponents: function () {
-      return this.get('service.nodeManagerNodes').filterProperty("workStatus", "STARTED").get("length");
-    }.property("service.nodeManagerNodes.@each.workStatus"),
-    totalComponents: function () {
-      return this.get('service.nodeManagerNodes.length');
-    }.property("service.nodeManagerNodes.length")
-  }),
-
-  nodeManagersStatus: function () {
-    var nmActive = this.get('service.nodeManagersCountActive');
-    var nmLost = this.get('service.nodeManagersCountLost');
-    var nmUnhealthy = this.get('service.nodeManagersCountUnhealthy');
-    var nmRebooted = this.get('service.nodeManagersCountRebooted');
-    var nmDecom = this.get('service.nodeManagersCountDecommissioned');
-    return this.t('dashboard.services.yarn.nodeManagers.status.msg').format(
-      this.formatUnavailable(nmActive),
-      this.formatUnavailable(nmLost),
-      this.formatUnavailable(nmUnhealthy),
-      this.formatUnavailable(nmRebooted),
-      this.formatUnavailable(nmDecom)
-    );
-  }.property('service.nodeManagersCountActive', 'service.nodeManagersCountLost', 
-      'service.nodeManagersCountUnhealthy', 'service.nodeManagersCountRebooted', 'service.nodeManagersCountDecommissioned'),
-
-  containers: function () {
-    var allocated = this.get('service.containersAllocated');
-    var pending = this.get('service.containersPending');
-    var reserved = this.get('service.containersReserved');
-    return this.t('dashboard.services.yarn.containers.msg').format(
-      this.formatUnavailable(allocated),
-      this.formatUnavailable(pending),
-      this.formatUnavailable(reserved)
-    );
-  }.property('service.containersAllocated', 'service.containersPending', 'service.containersReserved'),
-
-  apps: function () {
-    var appsSubmitted = this.get('service.appsSubmitted');
-    var appsRunning = this.get('service.appsRunning');
-    var appsPending = this.get('service.appsPending');
-    var appsCompleted = this.get('service.appsCompleted');
-    var appsKilled = this.get('service.appsKilled');
-    var appsFailed = this.get('service.appsFailed');
-    return this.t('dashboard.services.yarn.apps.msg').format(
-      this.formatUnavailable(appsSubmitted),
-      this.formatUnavailable(appsRunning),
-      this.formatUnavailable(appsPending),
-      this.formatUnavailable(appsCompleted),
-      this.formatUnavailable(appsKilled),
-      this.formatUnavailable(appsFailed));
-  }.property('service.appsSubmitted', 'service.appsRunning', 'service.appsPending', 'service.appsCompleted', 'service.appsKilled', 'service.appsFailed'),
-
-  memory: function () {
-    return Em.I18n.t('dashboard.services.yarn.memory.msg').format(
-        numberUtils.bytesToSize(this.get('service.allocatedMemory'), 1, 'parseFloat', 1024 * 1024), 
-        numberUtils.bytesToSize(this.get('service.reservedMemory'), 1, 'parseFloat', 1024 * 1024), 
-        numberUtils.bytesToSize(this.get('service.availableMemory'), 1, 'parseFloat', 1024 * 1024));
-  }.property('service.allocatedMemory', 'service.reservedMemory', 'service.availableMemory'),
-
-  queues: function() {
-    return Em.I18n.t('dashboard.services.yarn.queues.msg').format(this.formatUnavailable(this.get('service.queuesCount')));
-  }.property('service.queuesCount'),
-  
-  didInsertElement: function(){
-    App.tooltip($("[rel='queue-tooltip']"), {html: true, placement: "right"});
-  }
-
-});

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/dashboard/service/zookeeper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/service/zookeeper.js b/ambari-web/app/views/main/dashboard/service/zookeeper.js
deleted file mode 100644
index dcdfb91..0000000
--- a/ambari-web/app/views/main/dashboard/service/zookeeper.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.MainDashboardServiceZookeperView = App.MainDashboardServiceView.extend({
-  templateName: require('templates/main/dashboard/service/zookeeper'),
-  serviceName: 'zookeeper',
-
-  titleInfo: function(){
-    var components = this.get('service.hostComponents').filterProperty('componentName', 'ZOOKEEPER_SERVER');
-    var running = 0;
-    components.forEach(function(item){
-      if(item.get('workStatus') === App.HostComponentStatus.started){
-        running += 1;
-      }
-    });
-
-    return {
-      pre: this.t('services.zookeeper.prefix').format(running),
-      title: this.t('services.zookeeper.title').format(components.length),
-      component: components.objectAt(0)
-    };
-  }.property('service')
-});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/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
new file mode 100644
index 0000000..58b0e1a
--- /dev/null
+++ b/ambari-web/app/views/main/service/service.js
@@ -0,0 +1,176 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var App = require('app');
+var uiEffects = require('utils/ui_effects');
+
+require('models/alert');
+
+App.MainDashboardServiceHealthView = Em.View.extend({
+  classNameBindings: ["healthStatus", "healthStatusClass"],
+  //template: Em.Handlebars.compile(""),
+  blink: false,
+  tagName: 'span',
+  attributeBindings:['rel', 'title','data-original-title'],
+  rel: 'HealthTooltip',
+  'data-original-title': '',
+
+  updateToolTip: function () {
+    this.set('data-original-title', this.get('service.toolTipContent'));
+  }.observes('service.toolTipContent'),
+
+  startBlink: function () {
+    this.set('blink', true);
+  },
+
+  doBlink: function () {
+    var self = this;
+    if (this.get('blink') && (this.get("state") == "inDOM")) {
+      uiEffects.pulsate(self.$(), 1000, function(){
+        self.doBlink();
+      });
+    }
+  }.observes('blink'),
+
+  stopBlink: function () {
+    this.set('blink', false);
+  },
+
+  healthStatus: function () {
+    if (this.get('service.isClientsOnly')) {
+      return 'icon-laptop';
+    }
+    if (this.get('service.passiveState') != 'OFF') {
+      return 'icon-medkit';
+    }
+    var status = this.get('service.healthStatus');
+    switch (status) {
+      case 'green':
+        status = App.Service.Health.live;
+        this.stopBlink();
+        break;
+      case 'green-blinking':
+        status = App.Service.Health.live;
+        this.startBlink();
+        break;
+      case 'red-blinking':
+        status = App.Service.Health.dead;
+        this.startBlink();
+        break;
+      case 'yellow':
+        status = App.Service.Health.unknown;
+        break;
+      default:
+        status = App.Service.Health.dead;
+        this.stopBlink();
+        break;
+    }
+
+    return 'health-status-' + status;
+  }.property('service.healthStatus','service.passiveState','service.isClientsOnly'),
+
+  healthStatusClass: function () {
+    switch (this.get('healthStatus')) {
+      case 'health-status-LIVE':
+        return App.healthIconClassGreen;
+        break;
+      case 'health-status-DEAD-RED':
+        return App.healthIconClassRed;
+        break;
+      case 'health-status-DEAD-YELLOW':
+        return App.healthIconClassYellow;
+        break;
+      case 'health-status-DEAD-ORANGE':
+        return App.healthIconClassOrange;
+        break;
+      default:
+        return "";
+        break;
+    }
+  }.property('healthStatus'),
+
+  didInsertElement: function () {
+    this.updateToolTip();
+    App.tooltip($("[rel='HealthTooltip']"));
+    this.doBlink(); // check for blink availability
+  }
+});
+
+App.ComponentLiveTextView =  Em.View.extend({
+  classNameBindings: ['color:service-summary-component-red-dead:service-summary-component-green-live'],
+  service: function() { return this.get("parentView").get("service")}.property("parentView.service"),
+  liveComponents: function() {
+  }.property(),
+  totalComponents: function() {
+  }.property(),
+  color: function() {
+    return this.get("liveComponents") == 0;
+  }.property("liveComponents")
+});
+
+App.MainDashboardServiceView = Em.View.extend({
+  classNames: ['service', 'clearfix'],
+
+  data: function () {
+    return this.get('controller.data.' + this.get('serviceName'));
+  }.property('controller.data'),
+
+  dashboardMasterComponentView : Em.View.extend({
+    didInsertElement: function() {
+      App.tooltip($('[rel=healthTooltip]'));
+    },
+    templateName: require('templates/main/service/info/summary/master_components'),
+    mastersComp : function(){
+     return this.get('parentView.service.hostComponents').filterProperty('isMaster', true);
+    }.property("service")
+  }),
+
+  formatUnavailable: function(value){
+    return (value || value == 0) ? value : this.t('services.service.summary.notAvailable');
+  },
+
+  criticalAlertsCount: function () {
+    return this.get('service.criticalAlertsCount');
+  }.property('service.criticalAlertsCount'),
+
+  isCollapsed: false,
+
+  toggleInfoView: function () {
+    this.$('.service-body').toggle('blind', 200);
+    this.set('isCollapsed', !this.isCollapsed);
+  },
+
+  masters: function(){
+    return this.get('service.hostComponents').filterProperty('isMaster', true);
+  }.property('service'),
+
+  clients: function(){
+    var clients = this.get('service.hostComponents').filterProperty('isClient', true);
+    var len = clients.length;
+    var template = 'dashboard.services.{0}.client'.format(this.get('serviceName').toLowerCase());
+    if(len > 1){
+      template += 's';
+    }
+
+    return {
+      title: this.t(template).format(len),
+      component: clients.objectAt(0)
+    };
+  }.property('service')
+
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/service/services/flume.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/services/flume.js b/ambari-web/app/views/main/service/services/flume.js
new file mode 100644
index 0000000..ee62aed
--- /dev/null
+++ b/ambari-web/app/views/main/service/services/flume.js
@@ -0,0 +1,36 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+var App = require('app');
+var date = require('utils/date');
+
+App.MainDashboardServiceFlumeView = App.MainDashboardServiceView.extend({
+  templateName: require('templates/main/service/services/flume'),
+  serviceName: 'flume',
+  
+  summaryHeader: function () {
+    var count = this.get('service.nodes.length');
+    if(count==1)
+      return this.t("dashboard.services.flume.summary.single").format(count);
+    return this.t("dashboard.services.flume.summary.multiple").format(count);
+  }.property('service.nodes'),
+
+  flumeServerComponent: function () {
+    return App.HostComponent.find().findProperty('componentName', 'FLUME_SERVER');
+  }.property()
+
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/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
new file mode 100644
index 0000000..2d189d8
--- /dev/null
+++ b/ambari-web/app/views/main/service/services/hbase.js
@@ -0,0 +1,145 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+var App = require('app');
+var date = require('utils/date');
+var numberUtils = require('utils/number_utils');
+
+App.MainDashboardServiceHbaseView = App.MainDashboardServiceView.extend({
+  templateName: require('templates/main/service/services/hbase'),
+  serviceName: 'hbase',
+  /**
+   * All master components
+   */
+  masters: function () {
+    return this.get('service.hostComponents').filterProperty('isMaster', true);
+  }.property('service.hostComponents.length'),
+  /**
+   * Passive master components
+   */
+  passiveMasters: function () {
+    if(App.supports.multipleHBaseMasters){
+      return this.get('masters').filterProperty('haStatus', 'false');
+    }
+    return [];
+  }.property('masters'),
+
+
+  liveRegionServers: function () {
+    return this.get('service.regionServers').filterProperty("workStatus", "STARTED");
+  }.property('service.regionServers.@each.workStatus'),
+
+  regionServesText: function () {
+    if (this.get('service.regionServers.length') == 0) {
+      return '';
+    } else if (this.get('service.regionServers.length') > 1) {
+      return Em.I18n.t('services.service.summary.viewHosts');
+    } else {
+      return Em.I18n.t('services.service.summary.viewHost');
+    }
+  }.property("service"),
+
+  regionServersLiveTextView: App.ComponentLiveTextView.extend({
+    liveComponents: function() {
+      return this.get('service.regionServers').filterProperty("workStatus","STARTED").get('length');
+    }.property('service.regionServers.@each.workStatus'),
+    totalComponents: function() {
+      return this.get("service.regionServers.length");
+    }.property("service.regionServers.length")
+  }),
+
+  /**
+   * One(!) active master component
+   */
+  activeMaster: function () {
+    if(App.supports.multipleHBaseMasters){
+      return this.get('masters').findProperty('haStatus', 'true');
+    } else {
+      return this.get('masters')[0];
+    }
+  }.property('masters'),
+
+  activeMasterTitle: function(){
+    if(App.supports.multipleHBaseMasters){
+      return this.t('service.hbase.activeMaster');
+    } else {
+      return this.get('activeMaster.host.publicHostName');
+    }
+  }.property('activeMaster'),
+
+  masterServerHeapSummary: function () {
+    var heapUsed = this.get('service').get('heapMemoryUsed');
+    var heapMax = this.get('service').get('heapMemoryMax');
+    var percent = heapMax > 0 ? 100 * heapUsed / heapMax : 0;
+    var heapString = numberUtils.bytesToSize(heapUsed, 1, "parseFloat");
+    var heapMaxString = numberUtils.bytesToSize(heapMax, 1, "parseFloat");
+    return this.t('dashboard.services.hbase.masterServerHeap.summary').format(heapString, heapMaxString, percent.toFixed(1));
+  }.property('service.heapMemoryUsed', 'service.heapMemoryMax'),
+
+  summaryHeader: function () {
+    var avgLoad = this.get('service.averageLoad');
+    if (isNaN(avgLoad)) {
+      avgLoad = this.t("services.service.summary.unknown");
+    }
+    return this.t("dashboard.services.hbase.summary").format(this.get('service.regionServers.length'), avgLoad);
+  }.property('service.regionServers', 'service.averageLoad'),
+
+  hbaseMasterWebUrl: function () {
+    if (this.get('activeMaster.host') && this.get('activeMaster.host').get('publicHostName')) {
+      return "http://" + (App.singleNodeInstall ? App.singleNodeAlias : this.get('activeMaster.host').get('publicHostName')) + ":60010";
+    }
+  }.property('activeMaster'),
+
+  averageLoad: function () {
+    var avgLoad = this.get('service.averageLoad');
+    if (isNaN(avgLoad)) {
+      avgLoad = this.t('services.service.summary.notAvailable');
+    }
+    return this.t('dashboard.services.hbase.averageLoadPerServer').format(avgLoad);
+  }.property("service.averageLoad"),
+
+  masterStartedTime: function () {
+    var uptime = this.get('service').get('masterStartTime');
+    if (uptime && uptime > 0) {
+      var diff = App.dateTime() - uptime;
+      if (diff < 0) {
+        diff = 0;
+      }
+      var formatted = date.timingFormat(diff);
+      return this.t('dashboard.services.uptime').format(formatted);
+    }
+    return this.t('services.service.summary.notRunning');
+  }.property("service.masterStartTime"),
+
+  masterActivatedTime: function () {
+    var uptime = this.get('service').get('masterActiveTime');
+    if (uptime && uptime > 0) {
+      var diff = App.dateTime() - uptime;
+      if (diff < 0) {
+        diff = 0;
+      }
+      var formatted = date.timingFormat(diff);
+      return this.t('dashboard.services.uptime').format(formatted);
+    }
+    return this.t('services.service.summary.notRunning');
+  }.property("service.masterActiveTime"),
+
+  regionServerComponent: function () {
+    return this.get('service.regionServers').objectAt(0);
+  }.property()
+
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/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
new file mode 100644
index 0000000..614d6d3
--- /dev/null
+++ b/ambari-web/app/views/main/service/services/hdfs.js
@@ -0,0 +1,205 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+var App = require('app');
+var date = require('utils/date');
+var numberUtils = require('utils/number_utils');
+
+App.MainDashboardServiceHdfsView = App.MainDashboardServiceView.extend({
+  templateName: require('templates/main/service/services/hdfs'),
+  serviceName: 'HDFS',
+  Chart: App.ChartPieView.extend({
+    service: null,
+    color: '#0066B3',
+    stroke: '#0066B3',
+    palette: new Rickshaw.Color.Palette({
+      scheme: [ 'rgba(0,102,179,0)', 'rgba(0,102,179,1)'].reverse()
+    }),
+    data: function () {
+      var total = this.get('service.capacityTotal') + 0;
+      var remaining = (this.get('service.capacityRemaining') + 0);
+      var used = total - remaining;
+      return [ used, remaining ];
+    }.property('service.capacityUsed', 'service.capacityTotal')
+  }),
+
+  dashboardMasterComponentView: Em.View.extend({
+    didInsertElement: function() {
+      App.tooltip($('[rel=healthTooltip]'));
+    },
+    templateName: require('templates/main/service/info/summary/master_components'),
+    mastersComp : function() {
+      return this.get('parentView.service.hostComponents').filter(function(comp){
+        return comp.get('isMaster') && comp.get('componentName') !== 'JOURNALNODE';
+      });
+    }.property('parentView.service.hostComponents')
+  }),
+
+  dataNodesLive: function () {
+    return this.get('service.dataNodes').filterProperty("workStatus", "STARTED");
+  }.property('service.dataNodes.@each.workStatus'),
+  dataNodesDead: function () {
+    return this.get('service.dataNodes').filterProperty("workStatus", "INSTALLED");
+  }.property('service.dataNodes.@each.workStatus'),
+
+  showJournalNodes: function () {
+    return this.get('service.journalNodes.length') > 0;
+  }.property('service.journalNodes.length'),
+
+  dataNodesLiveTextView: App.ComponentLiveTextView.extend({
+    liveComponents: function () {
+      return this.get('service.dataNodes').filterProperty("workStatus", "STARTED").get("length");
+    }.property("service.dataNodes.@each.workStatus"),
+    totalComponents: function() {
+      return this.get("service.dataNodes.length");
+    }.property("service.dataNodes.length")
+  }),
+
+  journalNodesLiveTextView: App.ComponentLiveTextView.extend({
+    liveComponents: function () {
+      return this.get('service.journalNodes').filterProperty("workStatus", "STARTED").get("length");
+    }.property("service.journalNodes.@each.workStatus"),
+    totalComponents: function () {
+      return this.get('service.journalNodes.length');
+    }.property("service.journalNodes.length")
+  }),
+
+  dfsTotalBlocks: function(){
+    return this.formatUnavailable(this.get('service.dfsTotalBlocks'));
+  }.property('service.dfsTotalBlocks'),
+  dfsTotalFiles: function(){
+    return this.formatUnavailable(this.get('service.dfsTotalFiles'));
+  }.property('service.dfsTotalFiles'),
+  dfsCorruptBlocks: function(){
+    return this.formatUnavailable(this.get('service.dfsCorruptBlocks'));
+  }.property('service.dfsCorruptBlocks'),
+  dfsMissingBlocks: function(){
+    return this.formatUnavailable(this.get('service.dfsMissingBlocks'));
+  }.property('service.dfsMissingBlocks'),
+  dfsUnderReplicatedBlocks: function(){
+    return this.formatUnavailable(this.get('service.dfsUnderReplicatedBlocks'));
+  }.property('service.dfsUnderReplicatedBlocks'),
+
+  blockErrorsMessage: function() {
+    return Em.I18n.t('dashboard.services.hdfs.blockErrors').format(this.get('dfsCorruptBlocks'), this.get('dfsMissingBlocks'), this.get('dfsUnderReplicatedBlocks'));
+  }.property('dfsCorruptBlocks','dfsMissingBlocks','dfsUnderReplicatedBlocks'),
+
+  nodeUptime: function () {
+    var uptime = this.get('service').get('nameNodeStartTime');
+    if (uptime && uptime > 0){
+      var diff = App.dateTime() - uptime;
+      if (diff < 0) {
+        diff = 0;
+      }
+      var formatted = date.timingFormat(diff);
+      return this.t('dashboard.services.uptime').format(formatted);
+    }
+    return this.t('services.service.summary.notRunning');
+  }.property("service.nameNodeStartTime"),
+
+  nodeWebUrl: function () {
+    return "http://" + (App.singleNodeInstall ? App.singleNodeAlias :  this.get('service').get('nameNode').get('publicHostName')) + ":50070";
+  }.property('service.nameNode'),
+
+  nodeHeap: function () {
+    var memUsed = this.get('service').get('jvmMemoryHeapUsed');
+    var memMax = this.get('service').get('jvmMemoryHeapMax');
+    var percent = memMax > 0 ? ((100 * memUsed) / memMax) : 0;
+    return this.t('dashboard.services.hdfs.nodes.heapUsed').format(
+      numberUtils.bytesToSize(memUsed, 1, 'parseFloat'),
+      numberUtils.bytesToSize(memMax, 1, 'parseFloat'),
+      percent.toFixed(1));
+  }.property('service.jvmMemoryHeapUsed', 'service.jvmMemoryHeapMax'),
+
+  summaryHeader: function () {
+    var text = this.t("dashboard.services.hdfs.summary");
+    var service = this.get('service');
+    var liveCount = service.get('dataNodes').filterProperty("workStatus", "STARTED").length;
+    var totalCount = service.get('dataNodes').get('length');
+    var total = service.get('capacityTotal') + 0;
+    var remaining = service.get('capacityRemaining') + 0;
+    var used = total - remaining;
+    var percent = total > 0 ? ((used * 100) / total).toFixed(1) : 0;
+    if (percent == "NaN" || percent < 0) {
+      percent = Em.I18n.t('services.service.summary.notAvailable') + " ";
+    }
+    return text.format(liveCount, totalCount, percent);
+  }.property('service.dataNodes.@each.workStatus', 'service.capacityUsed', 'service.capacityTotal'),
+
+  dfsUsedDisk: function () {
+    var text = this.t("dashboard.services.hdfs.capacityUsed");
+    var total = this.get('service.capacityTotal');
+    var dfsUsed = this.get('service.capacityUsed');
+    var percent = total > 0 ? ((dfsUsed * 100) / total).toFixed(2) : 0;
+    if (percent == "NaN" || percent < 0) {
+      percent = Em.I18n.t('services.service.summary.notAvailable') + " ";
+    }
+    return text.format(numberUtils.bytesToSize(dfsUsed, 1, 'parseFloat'), numberUtils.bytesToSize(total, 1, 'parseFloat'), percent);
+  }.property('service.capacityUsed', 'service.capacityTotal'),
+  nonDfsUsedDisk: function () {
+    var text = this.t("dashboard.services.hdfs.capacityUsed");
+    var total = this.get('service.capacityTotal');
+    var remaining = this.get('service.capacityRemaining');
+    var dfsUsed = this.get('service.capacityUsed');
+    var nonDfsUsed = total !== null && remaining !== null && dfsUsed !== null ? total - remaining - dfsUsed : null;
+    var percent = total > 0 ? ((nonDfsUsed * 100) / total).toFixed(2) : 0;
+    if (percent == "NaN" || percent < 0) {
+      percent = Em.I18n.t('services.service.summary.notAvailable') + " ";
+    }
+    return text.format(numberUtils.bytesToSize(nonDfsUsed, 1, 'parseFloat'), numberUtils.bytesToSize(total, 1, 'parseFloat'), percent);
+  }.property('service.capacityUsed', 'service.capacityRemaining', 'service.capacityTotal'),
+  remainingDisk: function () {
+    var text = this.t("dashboard.services.hdfs.capacityUsed");
+    var total = this.get('service.capacityTotal');
+    var remaining = this.get('service.capacityRemaining');
+    var percent = total > 0 ? ((remaining * 100) / total).toFixed(2) : 0;
+    if (percent == "NaN" || percent < 0) {
+      percent = Em.I18n.t('services.service.summary.notAvailable') + " ";
+    }
+    return text.format(numberUtils.bytesToSize(remaining, 1, 'parseFloat'), numberUtils.bytesToSize(total, 1, 'parseFloat'), percent);
+  }.property('service.capacityRemaining', 'service.capacityTotal'),
+
+  dataNodeComponent: function () {
+    return this.get('service.dataNodes').objectAt(0);
+  }.property(),
+
+  journalNodeComponent: function () {
+    return this.get('service.journalNodes').objectAt(0);
+  }.property(),
+
+  safeModeStatus: function () {
+    var safeMode = this.get('service.safeModeStatus');
+    if (safeMode == null) {
+      return Em.I18n.t("services.service.summary.notAvailable");
+    } else if (safeMode.length == 0) {
+      return Em.I18n.t("services.service.summary.safeModeStatus.notInSafeMode");
+    } else {
+      return Em.I18n.t("services.service.summary.safeModeStatus.inSafeMode");
+    }
+  }.property('service.safeModeStatus'),
+  upgradeStatus: function () {
+    var upgradeStatus = this.get('service.upgradeStatus');
+    var healthStatus = this.get('service.healthStatus');
+    if (upgradeStatus) {
+      return Em.I18n.t('services.service.summary.pendingUpgradeStatus.notPending');
+    } else if (healthStatus == 'green') {
+      return Em.I18n.t('services.service.summary.pendingUpgradeStatus.pending');
+    } else {
+      return Em.I18n.t("services.service.summary.notAvailable");
+    }
+  }.property('service.upgradeStatus', 'service.healthStatus')
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/service/services/hive.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/services/hive.js b/ambari-web/app/views/main/service/services/hive.js
new file mode 100644
index 0000000..2b05e89
--- /dev/null
+++ b/ambari-web/app/views/main/service/services/hive.js
@@ -0,0 +1,29 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var App = require('app');
+
+App.MainDashboardServiceHiveView = App.MainDashboardServiceView.extend({
+  templateName: require('templates/main/service/services/hive'),
+  serviceName: 'hive',
+
+  titleMasters: function(){
+    var masters = this.get('masters');
+    return [masters.findProperty('componentName', 'HIVE_SERVER'), masters.findProperty('componentName', 'HIVE_METASTORE')];
+  }.property('service')
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/service/services/mapreduce.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/services/mapreduce.js b/ambari-web/app/views/main/service/services/mapreduce.js
new file mode 100644
index 0000000..6a26e49
--- /dev/null
+++ b/ambari-web/app/views/main/service/services/mapreduce.js
@@ -0,0 +1,140 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+var App = require('app');
+var date = require('utils/date');
+var numberUtils = require('utils/number_utils');
+
+App.MainDashboardServiceMapreduceView = App.MainDashboardServiceView.extend({
+  templateName: require('templates/main/service/services/mapreduce'),
+  serviceName: 'MAPREDUCE',
+  jobTrackerWebUrl: function () {
+    return "http://" + (App.singleNodeInstall ? App.singleNodeAlias : this.get('service').get('jobTracker').get('publicHostName')) + ":50030";
+  }.property('service.jobTracker'),
+
+  Chart: App.ChartLinearView.extend({
+    data: function () {
+      return this.get('_parentView.data.chart');
+    }.property('_parentView.data.chart')
+  }),
+
+  jobTrackerUptime: function () {
+    var uptime = this.get('service').get('jobTrackerStartTime');
+    if (uptime && uptime > 0){
+      var diff = App.dateTime() - uptime;
+      if (diff < 0) {
+        diff = 0;
+      }
+      var formatted = date.timingFormat(diff);
+      return this.t('dashboard.services.uptime').format(formatted);
+
+    }
+    return this.t('services.service.summary.notRunning');
+  }.property("service.jobTrackerStartTime"),
+
+  summaryHeader: function () {
+    var svc = this.get('service');
+    var liveCount = svc.get('aliveTrackers').get('length');
+    var allCount = svc.get('taskTrackers').get('length');
+    var runningCount = svc.get('jobsRunning');
+    if (runningCount === null) {
+      runningCount = 'n/a';
+    }
+    var template = this.t('dashboard.services.mapreduce.summary');
+    return template.format(liveCount, allCount, runningCount);
+  }.property('service.aliveTrackers', 'service.taskTrackers', 'service.jobsRunning'),
+
+  trackersText: function () {
+    if (this.get('service').get('taskTrackers.length') == 0) {
+      return '';
+    } else if (this.get('service').get('taskTrackers.length') > 1){
+      return Em.I18n.t('services.service.summary.viewHosts');
+    }else{
+      return Em.I18n.t('services.service.summary.viewHost');
+    }
+  }.property("service.taskTrackers.length"),
+
+  trackersSummary: function () {
+    var svc = this.get('service');
+    var liveCount = svc.get('taskTrackers').filterProperty("workStatus", "STARTED").length;
+    var totalCount = svc.get('taskTrackers').get('length');
+    var template = this.t('dashboard.services.mapreduce.trackersSummary');
+    return template.format(liveCount, totalCount);
+  }.property('service.aliveTrackers.length', 'service.taskTrackers.@each.workStatus'),
+
+  trackersLiveTextView: App.ComponentLiveTextView.extend({
+    liveComponents: function () {
+      return this.get('service.taskTrackers').filterProperty("workStatus", "STARTED").get("length");
+    }.property("service.taskTrackers.@each.workStatus"),
+    totalComponents: function() {
+      return this.get("service.taskTrackers.length");
+    }.property('service.taskTrackers.length')
+  }),
+
+  trackersHeapSummary: function () {
+    var heapUsed = this.get('service').get('jobTrackerHeapUsed');
+    var heapMax = this.get('service').get('jobTrackerHeapMax');
+    var percent = heapMax > 0 ? 100 * heapUsed / heapMax : 0;
+    return this.t('dashboard.services.mapreduce.jobTrackerHeapSummary').format(numberUtils.bytesToSize(heapUsed, 1, "parseFloat"), numberUtils.bytesToSize(heapMax, 1, "parseFloat"), percent.toFixed(1));
+  }.property('service.jobTrackerHeapUsed', 'service.jobTrackerHeapMax'),
+
+  jobsSummary: function () {
+    var svc = this.get('service');
+    var template = this.t('dashboard.services.mapreduce.jobsSummary');
+    return template.format(this.formatUnavailable(svc.get('jobsSubmitted')), this.formatUnavailable(svc.get('jobsCompleted')));
+  }.property('service.jobsSubmitted', 'service.jobsCompleted'),
+
+  mapSlotsSummary: function () {
+    var svc = this.get('service');
+    var template = this.t('dashboard.services.mapreduce.mapSlotsSummary');
+    return template.format(this.formatUnavailable(svc.get('mapSlotsOccupied')), this.formatUnavailable(svc.get('mapSlotsReserved')));
+  }.property('service.mapSlotsOccupied', 'service.mapSlotsReserved'),
+
+  reduceSlotsSummary: function () {
+    var svc = this.get('service');
+    var template = this.t('dashboard.services.mapreduce.reduceSlotsSummary');
+    return template.format(this.formatUnavailable(svc.get('reduceSlotsOccupied')), this.formatUnavailable(svc.get('reduceSlotsReserved')));
+  }.property('service.reduceSlotsOccupied', 'service.reduceSlotsReserved'),
+
+  mapTasksSummary: function () {
+    var svc = this.get('service');
+    var template = this.t('dashboard.services.mapreduce.tasksSummary');
+    return template.format(this.formatUnavailable(svc.get('mapsRunning')), this.formatUnavailable(svc.get('mapsWaiting')));
+  }.property('service.mapsRunning', 'service.mapsWaiting'),
+
+  reduceTasksSummary: function () {
+    var svc = this.get('service');
+    var template = this.t('dashboard.services.mapreduce.tasksSummary');
+    return template.format(this.formatUnavailable(svc.get('reducesRunning')), this.formatUnavailable(svc.get('reducesWaiting')));
+  }.property('service.reducesRunning', 'service.reducesWaiting'),
+
+  slotsCapacitySummary: function () {
+    var mapSlots = this.get('service').get('mapSlots');
+    var reduceSlots = this.get('service').get('reduceSlots');
+    var liveNodeCount = this.get('service').get('aliveTrackers').get('length');
+    if(liveNodeCount != 0){
+      var avg = (mapSlots + reduceSlots) / liveNodeCount;
+    }else{
+      avg = Em.I18n.t('services.service.summary.notAvailable') + " ";
+    }
+    return this.t('dashboard.services.mapreduce.slotCapacitySummary').format(mapSlots, reduceSlots, avg);
+  }.property('service.mapSlots', 'service.reduceSlots', 'service.aliveTrackers'),
+
+  taskTrackerComponent: function () {
+    return this.get('service.taskTrackers').objectAt(0);
+  }.property()
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/service/services/mapreduce2.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/services/mapreduce2.js b/ambari-web/app/views/main/service/services/mapreduce2.js
new file mode 100644
index 0000000..077e7cf
--- /dev/null
+++ b/ambari-web/app/views/main/service/services/mapreduce2.js
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+var App = require('app');
+
+App.MainDashboardServiceMapreduce2View = App.MainDashboardServiceView.extend({
+    templateName: require('templates/main/service/services/mapreduce2'),
+    serviceName: 'MAPREDUCE2',
+
+    titleInfo: function(){
+      var hs = this.get('service.hostComponents').findProperty('componentName', 'HISTORYSERVER');
+      if (!hs) {
+        return this.t('services.mapreduce2.history.unknown');
+      } else if (hs.get('workStatus') === App.HostComponentStatus.started) {
+        return this.t('services.mapreduce2.history.running');
+      } else {
+        return this.t('services.mapreduce2.history.stopped');
+      }
+    }.property('service')
+  });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/service/services/oozie.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/services/oozie.js b/ambari-web/app/views/main/service/services/oozie.js
new file mode 100644
index 0000000..f7a645d
--- /dev/null
+++ b/ambari-web/app/views/main/service/services/oozie.js
@@ -0,0 +1,29 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var App = require('app');
+
+App.MainDashboardServiceOozieView = App.MainDashboardServiceView.extend({
+  serviceName: 'oozie',
+  templateName: require('templates/main/service/services/oozie'),
+
+  webUi: function () {
+    var hostName = App.singleNodeInstall ? App.singleNodeAlias : this.get('service.hostComponents').findProperty('componentName', 'OOZIE_SERVER').get('host.publicHostName');
+    return "http://{0}:11000/oozie".format(hostName);
+  }.property('service')
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/service/services/storm.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/services/storm.js b/ambari-web/app/views/main/service/services/storm.js
new file mode 100644
index 0000000..906813d
--- /dev/null
+++ b/ambari-web/app/views/main/service/services/storm.js
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var App = require('app');
+var date = require('utils/date');
+
+App.MainDashboardServiceStormView = App.MainDashboardServiceView.extend({
+  templateName: require('templates/main/service/services/storm'),
+  serviceName: 'storm',
+
+  superVisorComponents: function() {
+    return this.get('service.hostComponents').filterProperty('componentName', 'SUPERVISOR');
+  }.property('service.hostComponents.@each'),
+
+  superVisorsLiveTextView: App.ComponentLiveTextView.extend({
+    liveComponents: function () {
+      return this.get('parentView.superVisorComponents').filterProperty('workStatus','STARTED').length;
+    }.property('parentView.superVisorComponents.@each.workStatus'),
+    totalComponents: function() {
+      return this.get('parentView.superVisorComponents').length;
+    }.property('parentView.superVisorComponents.length')
+  }),
+
+  freeSlotsPercentage: function() {
+    return Math.round(this.get('service.freeSlots')/this.get('service.totalSlots')*100);
+  }.property('service.freeSlots', 'service.totalSlots'),
+
+  nimbusUptimeFormatted: function() {
+    if (this.get('service.nimbusUptime') > 0) {
+      return date.timingFormat(this.get('service.nimbusUptime')*1000);
+    }
+    return Em.I18n.t('services.service.summary.notRunning');
+  }.property('service.nimbusUptime')
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/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
new file mode 100644
index 0000000..b2dd7bc
--- /dev/null
+++ b/ambari-web/app/views/main/service/services/yarn.js
@@ -0,0 +1,145 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+var App = require('app');
+var date = require('utils/date');
+var numberUtils = require('utils/number_utils');
+
+App.MainDashboardServiceYARNView = App.MainDashboardServiceView.extend({
+  templateName: require('templates/main/service/services/yarn'),
+  serviceName: 'YARN',
+
+  nodeHeap: function () {
+    var memUsed = this.get('service').get('jvmMemoryHeapUsed');
+    var memMax = this.get('service').get('jvmMemoryHeapMax');
+    var percent = memMax > 0 ? ((100 * memUsed) / memMax) : 0;
+    return this.t('dashboard.services.hdfs.nodes.heapUsed').format(
+      numberUtils.bytesToSize(memUsed, 1, 'parseFloat'),
+      numberUtils.bytesToSize(memMax, 1, 'parseFloat'),
+      percent.toFixed(1));
+  }.property('service.jvmMemoryHeapUsed', 'service.jvmMemoryHeapMax'),
+
+  summaryHeader: function () {
+    var text = this.t("dashboard.services.yarn.summary");
+    var svc = this.get('service');
+    var totalCount = svc.get('nodeManagerNodes').get('length');
+    return text.format(totalCount, totalCount);
+  }.property('service.nodeManagerNodes'),
+  
+  nodeManagerComponent: function () {
+    return this.get('service.nodeManagerNodes').objectAt(0);
+  }.property(),
+  
+  yarnClientComponent: function () {
+    return this.get('service.hostComponents').findProperty('componentName', 'YARN_CLIENT');
+  }.property(),
+
+  hasManyYarnClients: function () {
+    return (this.get('service.yarnClientNodes.length') > 1);
+  }.property('service.yarnClientNodes.length'),
+
+  nodeUptime: function () {
+    var uptime = this.get('service').get('resourceManagerStartTime');
+    if (uptime && uptime > 0){
+      var diff = App.dateTime() - uptime;
+      if (diff < 0) {
+        diff = 0;
+      }
+      var formatted = date.timingFormat(diff);
+      return this.t('dashboard.services.uptime').format(formatted);
+    }
+    return this.t('services.service.summary.notRunning');
+  }.property("service.resourceManagerStartTime"),
+
+  nodeManagerText: function () {
+    if(!this.get("nodeManagerComponent") || this.get("nodeManagerComponent.length") == 0){
+      return '';
+    } else if(this.get("nodeManagerComponent.length") > 1){
+      return Em.I18n.t('services.service.summary.viewHosts');
+    } else {
+      return Em.I18n.t('services.service.summary.viewHost');
+    }
+  }.property("nodeManagerComponent"),
+
+  nodeManagersLiveTextView: App.ComponentLiveTextView.extend({
+    liveComponents: function () {
+      return this.get('service.nodeManagerNodes').filterProperty("workStatus", "STARTED").get("length");
+    }.property("service.nodeManagerNodes.@each.workStatus"),
+    totalComponents: function () {
+      return this.get('service.nodeManagerNodes.length');
+    }.property("service.nodeManagerNodes.length")
+  }),
+
+  nodeManagersStatus: function () {
+    var nmActive = this.get('service.nodeManagersCountActive');
+    var nmLost = this.get('service.nodeManagersCountLost');
+    var nmUnhealthy = this.get('service.nodeManagersCountUnhealthy');
+    var nmRebooted = this.get('service.nodeManagersCountRebooted');
+    var nmDecom = this.get('service.nodeManagersCountDecommissioned');
+    return this.t('dashboard.services.yarn.nodeManagers.status.msg').format(
+      this.formatUnavailable(nmActive),
+      this.formatUnavailable(nmLost),
+      this.formatUnavailable(nmUnhealthy),
+      this.formatUnavailable(nmRebooted),
+      this.formatUnavailable(nmDecom)
+    );
+  }.property('service.nodeManagersCountActive', 'service.nodeManagersCountLost', 
+      'service.nodeManagersCountUnhealthy', 'service.nodeManagersCountRebooted', 'service.nodeManagersCountDecommissioned'),
+
+  containers: function () {
+    var allocated = this.get('service.containersAllocated');
+    var pending = this.get('service.containersPending');
+    var reserved = this.get('service.containersReserved');
+    return this.t('dashboard.services.yarn.containers.msg').format(
+      this.formatUnavailable(allocated),
+      this.formatUnavailable(pending),
+      this.formatUnavailable(reserved)
+    );
+  }.property('service.containersAllocated', 'service.containersPending', 'service.containersReserved'),
+
+  apps: function () {
+    var appsSubmitted = this.get('service.appsSubmitted');
+    var appsRunning = this.get('service.appsRunning');
+    var appsPending = this.get('service.appsPending');
+    var appsCompleted = this.get('service.appsCompleted');
+    var appsKilled = this.get('service.appsKilled');
+    var appsFailed = this.get('service.appsFailed');
+    return this.t('dashboard.services.yarn.apps.msg').format(
+      this.formatUnavailable(appsSubmitted),
+      this.formatUnavailable(appsRunning),
+      this.formatUnavailable(appsPending),
+      this.formatUnavailable(appsCompleted),
+      this.formatUnavailable(appsKilled),
+      this.formatUnavailable(appsFailed));
+  }.property('service.appsSubmitted', 'service.appsRunning', 'service.appsPending', 'service.appsCompleted', 'service.appsKilled', 'service.appsFailed'),
+
+  memory: function () {
+    return Em.I18n.t('dashboard.services.yarn.memory.msg').format(
+        numberUtils.bytesToSize(this.get('service.allocatedMemory'), 1, 'parseFloat', 1024 * 1024), 
+        numberUtils.bytesToSize(this.get('service.reservedMemory'), 1, 'parseFloat', 1024 * 1024), 
+        numberUtils.bytesToSize(this.get('service.availableMemory'), 1, 'parseFloat', 1024 * 1024));
+  }.property('service.allocatedMemory', 'service.reservedMemory', 'service.availableMemory'),
+
+  queues: function() {
+    return Em.I18n.t('dashboard.services.yarn.queues.msg').format(this.formatUnavailable(this.get('service.queuesCount')));
+  }.property('service.queuesCount'),
+  
+  didInsertElement: function(){
+    App.tooltip($("[rel='queue-tooltip']"), {html: true, placement: "right"});
+  }
+
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/eb6ed77c/ambari-web/app/views/main/service/services/zookeeper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/services/zookeeper.js b/ambari-web/app/views/main/service/services/zookeeper.js
new file mode 100644
index 0000000..ee8259c
--- /dev/null
+++ b/ambari-web/app/views/main/service/services/zookeeper.js
@@ -0,0 +1,40 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var App = require('app');
+
+App.MainDashboardServiceZookeperView = App.MainDashboardServiceView.extend({
+  templateName: require('templates/main/service/services/zookeeper'),
+  serviceName: 'zookeeper',
+
+  titleInfo: function(){
+    var components = this.get('service.hostComponents').filterProperty('componentName', 'ZOOKEEPER_SERVER');
+    var running = 0;
+    components.forEach(function(item){
+      if(item.get('workStatus') === App.HostComponentStatus.started){
+        running += 1;
+      }
+    });
+
+    return {
+      pre: this.t('services.zookeeper.prefix').format(running),
+      title: this.t('services.zookeeper.title').format(components.length),
+      component: components.objectAt(0)
+    };
+  }.property('service')
+});
\ No newline at end of file


Mime
View raw message