You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ja...@apache.org on 2015/04/16 22:15:49 UTC

[1/2] ambari git commit: AMBARI-10547. Integrate displaying defined Number widget type from the API on service summary page. (jaimin)

Repository: ambari
Updated Branches:
  refs/heads/trunk c7e310d62 -> 6dae33e54


http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/app/mixins/common/widget_mixin.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/widget_mixin.js b/ambari-web/app/mixins/common/widget_mixin.js
index 48fbf8f..7667bf4 100644
--- a/ambari-web/app/mixins/common/widget_mixin.js
+++ b/ambari-web/app/mixins/common/widget_mixin.js
@@ -24,13 +24,13 @@ App.WidgetMixin = Ember.Mixin.create({
    * @type {RegExp}
    * @const
    */
-  EXPRESSION_REGEX: /\$\{([\w\.\+\-\*\/\(\)\:\=\[\]]*)\}/g,
+  EXPRESSION_REGEX: /\$\{([\w\s\.\,\+\-\*\/\(\)\:\=\[\]]*)\}/g,
 
   /**
    * @type {RegExp}
    * @const
    */
-  MATH_EXPRESSION_REGEX: /^[\d\+\-\*\/\(\)\.]+$/,
+  MATH_EXPRESSION_REGEX: /^[\d\s\+\-\*\/\(\)\.]+$/,
 
   /**
    * @type {RegExp}
@@ -59,36 +59,15 @@ App.WidgetMixin = Ember.Mixin.create({
     this.loadMetrics();
   },
 
-  /**
-   * draw widget
-   */
-  drawWidget: function () {
-    if (this.get('isLoaded')) {
-      this.calculateValues();
-      this.set('value', this.get('content.values')[0] && this.get('content.values')[0].computedValue);
-    }
-  },
-
-  /**
-   * callback on metrics loaded
-   */
-  onMetricsLoaded: function () {
-    var self = this;
-    this.set('isLoaded', true);
-    this.drawWidget();
-    setTimeout(function() {
-      self.loadMetrics();
-    }, App.contentUpdateInterval);
-  },
 
   /**
    * load metrics
    */
   loadMetrics: function () {
     var requestData = this.getRequestData(this.get('content.metrics')),
-        request,
-        requestCounter = 0,
-        self = this;
+      request,
+      requestCounter = 0,
+      self = this;
 
     for (var i in requestData) {
       request = requestData[i];
@@ -108,23 +87,106 @@ App.WidgetMixin = Ember.Mixin.create({
   },
 
   /**
-   * extract expressions
-   * Example:
-   *  input: "${a/b} equal ${b+a}"
-   *  expressions: ['a/b', 'b+a']
-   *
-   * @param {object} input
-   * @returns {Array}
+   * get data formatted for request
+   * @param {Array} metrics
    */
-  extractExpressions: function (input) {
-    var pattern = this.get('EXPRESSION_REGEX'),
-      expressions = [],
-      match;
+  getRequestData: function (metrics) {
+    var requestsData = {};
 
-    while (match = pattern.exec(input.value)) {
-      expressions.push(match[1]);
+    metrics.forEach(function (metric, index) {
+      var key;
+      if (metric.host_component_criteria) {
+        key = metric.service_name + '_' + metric.component_name + '_' + metric.host_component_criteria;
+      } else {
+        key = metric.service_name + '_' + metric.component_name;
+      }
+      var requestMetric = $.extend({}, metric);
+
+      if (requestsData[key]) {
+        requestsData[key]["metric_paths"].push(requestMetric["metric_path"]);
+      } else {
+        requestMetric["metric_paths"] = [requestMetric["metric_path"]];
+        delete requestMetric["metric_path"];
+        requestsData[key] = requestMetric;
+      }
+    }, this);
+    return requestsData;
+  },
+
+  /**
+   * make GET call to server in order to fetch service-component metrics
+   * @param {object} request
+   * @returns {$.ajax}
+   */
+  getServiceComponentMetrics: function (request) {
+    return App.ajax.send({
+      name: 'widgets.serviceComponent.metrics.get',
+      sender: this,
+      data: {
+        serviceName: request.service_name,
+        componentName: request.component_name,
+        metricPaths: request.metric_paths.join(',')
+      },
+      success: 'getMetricsSuccessCallback'
+    });
+  },
+
+  /**
+   * make GET call to server in order to fetch host-component metrics
+   * @param {object} request
+   * @returns {$.ajax}
+   */
+  getHostComponentMetrics: function (request) {
+    return App.ajax.send({
+      name: 'widgets.hostComponent.metrics.get',
+      sender: this,
+      data: {
+        serviceName: request.service_name,
+        componentName: request.component_name,
+        metricPaths: request.metric_paths.join(','),
+        hostComponentCriteria: 'host_components/HostRoles/' + request.host_component_criteria
+      },
+      success: 'getMetricsSuccessCallback'
+    });
+  },
+
+  /**
+   * callback on getting aggregated metrics and host component metrics
+   * @param data
+   */
+  getMetricsSuccessCallback: function (data) {
+    var metrics = [];
+
+    this.get('content.metrics').forEach(function (_metric) {
+      if (!Em.isNone(Em.get(data, _metric.metric_path.replace(/\//g, '.')))) {
+        _metric.data = Em.get(data, _metric.metric_path.replace(/\//g, '.'));
+        this.get('metrics').pushObject(_metric);
+      }
+    }, this);
+  },
+
+
+  /**
+   * callback on metrics loaded
+   */
+  onMetricsLoaded: function () {
+    var self = this;
+    this.set('isLoaded', true);
+    this.drawWidget();
+    setTimeout(function() {
+      self.loadMetrics();
+    }, App.contentUpdateInterval);
+  },
+
+
+  /**
+   * draw widget
+   */
+  drawWidget: function () {
+    if (this.get('isLoaded')) {
+      this.calculateValues();
+      this.set('value', this.get('content.values')[0] && this.get('content.values')[0].computedValue);
     }
-    return expressions;
   },
 
   /**
@@ -142,6 +204,28 @@ App.WidgetMixin = Ember.Mixin.create({
     }, this);
   },
 
+
+  /**
+   * extract expressions
+   * Example:
+   *  input: "${a/b} equal ${b+a}"
+   *  expressions: ['a/b', 'b+a']
+   *
+   * @param {object} input
+   * @returns {Array}
+   */
+  extractExpressions: function (input) {
+    var pattern = this.get('EXPRESSION_REGEX'),
+      expressions = [],
+      match;
+
+    while (match = pattern.exec(input.value)) {
+      expressions.push(match[1]);
+    }
+    return expressions;
+  },
+
+
   /**
    * compute expression
    * @param expressions
@@ -176,80 +260,6 @@ App.WidgetMixin = Ember.Mixin.create({
     return result;
   },
 
-  /**
-   * get data formatted for request
-   * @param {Array} metrics
-   */
-  getRequestData: function (metrics) {
-    var requestsData = {};
-
-    metrics.forEach(function (metric) {
-      var key = metric.service_name + '_' + metric.component_name + '_' + metric.host_component_criteria;
-      var requestMetric = $.extend({}, metric);
-
-      if (requestsData[key]) {
-        requestsData[key]["widget_ids"].push(requestMetric["widget_id"]);
-      } else {
-        requestMetric["widget_ids"] = [requestMetric["widget_id"]];
-        delete requestMetric["widget_id"];
-        requestsData[key] = requestMetric;
-      }
-    }, this);
-    return requestsData;
-  },
-
-  /**
-   * make GET call to server in order to fetch service-component metrics
-   * @param {object} request
-   * @returns {$.ajax}
-   */
-  getServiceComponentMetrics: function (request) {
-    return App.ajax.send({
-      name: 'widgets.serviceComponent.metrics.get',
-      sender: this,
-      data: {
-        serviceName: request.service_name,
-        componentName: request.component_name,
-        widgetIds: request.widget_ids.join(',')
-      },
-      success: 'getServiceComponentMetricsSuccessCallback'
-    });
-  },
-
-  getServiceComponentMetricsSuccessCallback: function (data, opt, params) {
-    var metrics = [];
-
-    this.get('content.metrics').forEach(function (_metric) {
-      if (!Em.isNone(Em.get(data, _metric.widget_id.replace(/\//g, '.')))) {
-        _metric.data = Em.get(data, _metric.widget_id.replace(/\//g, '.'));
-        this.get('metrics').pushObject(_metric);
-      }
-    }, this);
-  },
-
-  /**
-   * make GET call to server in order to fetch host-component metrics
-   * @param {object} request
-   * @returns {$.ajax}
-   */
-  getHostComponentMetrics: function (request) {
-    return App.ajax.send({
-      name: 'widgets.hostComponent.metrics.get',
-      sender: this,
-      data: {
-        serviceName: request.service_name,
-        componentName: request.component_name,
-        widgetIds: request.widget_ids.join(','),
-        hostComponentCriteria: 'host_components/HostRoles/' + request.host_component_criteria
-      },
-      success: 'getHostComponentMetricsSuccessCallback'
-    });
-  },
-
-  getHostComponentMetricsSuccessCallback: function () {
-    //TODO push data to metrics after response structure approved
-  },
-
   /*
    * make call when clicking on "remove icon" on widget
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/app/models/widget.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/widget.js b/ambari-web/app/models/widget.js
index 6147bf5..99c86d0 100644
--- a/ambari-web/app/models/widget.js
+++ b/ambari-web/app/models/widget.js
@@ -32,17 +32,17 @@ App.Widget = DS.Model.extend({
    */
   widgetType: DS.attr('string'),
   displayName: DS.attr('string'),
+  description: DS.attr('string'),
   serviceName: DS.attr('string'),
-  componentName: DS.attr('string'),
   timeCreated: DS.attr('number'),
   sectionName: DS.attr('string'),
   author: DS.attr('string'),
+  scope: DS.attr('string'),
   properties: DS.attr('object'),
   expression: DS.attr('array'),
   metrics: DS.attr('array'),
   values: DS.attr('array'),
-  isVisible: DS.attr('boolean'),
-
+  isVisible: DS.attr('boolean', {defaultValue: true}),
   /**
    * @type {number}
    * @default 0
@@ -69,6 +69,8 @@ App.Widget = DS.Model.extend({
   }.property('widgetType')
 });
 
+App.Widget.FIXTURES = [];
+
 App.WidgetType = DS.Model.extend({
   name: DS.attr('string'),
   displayName: DS.attr('string'),
@@ -77,8 +79,6 @@ App.WidgetType = DS.Model.extend({
 });
 
 
-App.Widget.FIXTURES = [];
-
 App.WidgetType.FIXTURES = [
   {
     id: 1,

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/app/models/widget_layout.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/widget_layout.js b/ambari-web/app/models/widget_layout.js
index 2c29670..7427375 100644
--- a/ambari-web/app/models/widget_layout.js
+++ b/ambari-web/app/models/widget_layout.js
@@ -20,8 +20,9 @@ var App = require('app');
 
 App.WidgetLayout = DS.Model.extend({
   layoutName: DS.attr('string'),
+  displayName: DS.attr('string'),
   sectionName: DS.attr('string'),
-  widgetLayoutInfo: DS.attr('string'),
+  widgets: DS.hasMany('App.Widget'),
   scope: DS.attr('string'),
   user: DS.attr('string')
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/app/templates/main/service/info/summary.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/service/info/summary.hbs b/ambari-web/app/templates/main/service/info/summary.hbs
index 81e1e6d..2c2668c 100644
--- a/ambari-web/app/templates/main/service/info/summary.hbs
+++ b/ambari-web/app/templates/main/service/info/summary.hbs
@@ -90,7 +90,7 @@
                 {{/each}}
               </ul>
             </div>
-            {{#if App.supports.customizedWidgets}}
+            {{#if isServiceWithEnhancedWidgets}}
               <div class="btn-group pull-right actions">
                 <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
                   {{t common.actions}} &nbsp;<span class="caret"></span>
@@ -122,7 +122,7 @@
             {{/if}}
           </div>
           <div>
-            {{#if App.supports.customizedWidgets}}
+            {{#if isServiceWithEnhancedWidgets}}
               <div id="widget_layout" class="row-fluid">
                 {{#each widget in controller.widgets}}
                   <div class="widget span2p4" {{bindAttr id="widget.id"}}>

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js
index e7d28bc..f82263d 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -2421,6 +2421,11 @@ var urls = {
     mock: '/data/widget_layouts/HBASE/stack_layout.json'
   },
 
+  'widget.layout.get': {
+    real: '/clusters/{clusterName}/widget_layouts?WidgetLayoutInfo/layout_name={layoutName}',
+    mock: '/data/widget_layouts/{serviceName}/default_dashboard.json'
+  },
+
   'widgets.layout.userDefined.get': {
     real: '/users/{loginName}/widget_layouts?section_name={sectionName}',
     mock: '/data/widget_layouts/HBASE/empty_user_layout.json'
@@ -2453,12 +2458,12 @@ var urls = {
   },
 
   'widgets.serviceComponent.metrics.get': {
-    real: '/clusters/{clusterName}/services/{serviceName}/components/{componentName}?fields={widgetIds}',
+    real: '/clusters/{clusterName}/services/{serviceName}/components/{componentName}?fields={metricPaths}',
     mock: '/data/metrics/{serviceName}/Append_num_ops_&_Delete_num_ops.json'
   },
 
   'widgets.hostComponent.metrics.get': {
-    real: '/clusters/{clusterName}/services/{serviceName}/components/{componentName}?{hostComponentCriteria}&fields={widgetIds}',
+    real: '/clusters/{clusterName}/services/{serviceName}/components/{componentName}?{hostComponentCriteria}&fields={metricPaths}',
     mock: '/data/metrics/{serviceName}/Append_num_ops.json'
   },
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/app/views/common/widget/graph_widget_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/widget/graph_widget_view.js b/ambari-web/app/views/common/widget/graph_widget_view.js
index e886b9b..8baa8cc 100644
--- a/ambari-web/app/views/common/widget/graph_widget_view.js
+++ b/ambari-web/app/views/common/widget/graph_widget_view.js
@@ -56,19 +56,20 @@ App.GraphWidgetView = Em.View.extend(App.WidgetMixin, {
   calculateValues: function () {
     var metrics = this.get('metrics');
     var seriesData = [];
-
-    this.get('content.values').forEach(function (value) {
-      var expression =  this.extractExpressions(value)[0];
-      var computedExpressions;
-
-      if (expression) {
-        computedExpressions = this.computeExpression(expression, metrics);
-        seriesData.push({
-          name: value.name,
-          data: computedExpressions[value.value.match(this.get('EXPRESSION_REGEX'))[0]]
-        });
-      }
-    }, this);
+     if (this.get('content.values')) {
+       this.get('content.values').forEach(function (value) {
+         var expression = this.extractExpressions(value)[0];
+         var computedExpressions;
+
+         if (expression) {
+           computedExpressions = this.computeExpression(expression, metrics);
+           seriesData.push({
+             name: value.name,
+             data: computedExpressions[value.value.match(this.get('EXPRESSION_REGEX'))[0]]
+           });
+         }
+       }, this);
+     }
     return seriesData;
   },
 
@@ -124,9 +125,9 @@ App.GraphWidgetView = Em.View.extend(App.WidgetMixin, {
       data: {
         serviceName: request.service_name,
         componentName: request.component_name,
-        widgetIds: this.addTimeProperties(request.widget_ids).join(',')
+        metricPaths: this.addTimeProperties(request.metric_paths).join(',')
       },
-      success: 'getServiceComponentMetricsSuccessCallback'
+      success: 'getMetricsSuccessCallback'
     });
   },
 
@@ -142,10 +143,10 @@ App.GraphWidgetView = Em.View.extend(App.WidgetMixin, {
       data: {
         serviceName: request.service_name,
         componentName: request.component_name,
-        widgetIds: this.addTimeProperties(request.widget_ids).join(','),
+        metricPaths: this.addTimeProperties(request.metric_paths).join(','),
         hostComponentCriteria: 'host_components/HostRoles/' + request.host_component_criteria
       },
-      success: 'getHostComponentMetricsSuccessCallback'
+      success: 'getMetricsSuccessCallback'
     });
   },
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/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 af3e359..d88cf8a 100644
--- a/ambari-web/app/views/main/service/info/summary.js
+++ b/ambari-web/app/views/main/service/info/summary.js
@@ -380,7 +380,33 @@ App.MainServiceInfoSummaryView = Em.View.extend(App.UserPref, {
    * list of static actions of widget
    * @type {Array}
    */
-  staticWidgetActions: [
+  staticGeneralWidgetActions: [
+    Em.Object.create({
+      label: Em.I18n.t('dashboard.widgets.actions.browse'),
+      class: 'icon-th',
+      action: 'goToWidgetsBrowser',
+      isAction: true
+    })
+  ],
+
+  /**
+   *list of static actions of widget accessible to Admin/Operator privelege
+   * @type {Array}
+   */
+
+  staticAdminPrivelegeWidgetActions: [
+    Em.Object.create({
+      label: Em.I18n.t('dashboard.widgets.create'),
+      class: 'icon-plus',
+      action: 'createWidget',
+      isAction: true
+    })
+  ],
+
+  /**
+   * List of static actions related to widget layout
+   */
+  staticWidgetLayoutActions: [
     Em.Object.create({
       label: Em.I18n.t('dashboard.widgets.layout.save'),
       class: 'icon-download-alt',
@@ -392,18 +418,6 @@ App.MainServiceInfoSummaryView = Em.View.extend(App.UserPref, {
       class: 'icon-file',
       isAction: true,
       layouts: App.WidgetLayout.find()
-    }),
-    Em.Object.create({
-      label: Em.I18n.t('dashboard.widgets.create'),
-      class: 'icon-plus',
-      action: 'createWidget',
-      isAction: true
-    }),
-    Em.Object.create({
-      label: Em.I18n.t('dashboard.widgets.actions.browse'),
-      class: 'icon-th',
-      action: 'goToWidgetsBrowser',
-      isAction: true
     })
   ],
 
@@ -412,7 +426,13 @@ App.MainServiceInfoSummaryView = Em.View.extend(App.UserPref, {
    */
   widgetActions: function() {
     var options = [];
-    options.pushObjects(this.get('staticWidgetActions'));
+    if (App.isAccessible('MANAGER')) {
+      if (App.supports.customizedWidgetLayout) {
+        options.pushObjects(this.get('staticWidgetLayoutActions'));
+      }
+      options.pushObjects(this.get('staticAdminPrivelegeWidgetActions'));
+    }
+    options.pushObjects(this.get('staticGeneralWidgetActions'));
     return options;
   }.property(''),
 
@@ -531,10 +551,8 @@ App.MainServiceInfoSummaryView = Em.View.extend(App.UserPref, {
     var isMetricsSupported = svcName != 'STORM' || App.get('isStormMetricsSupported');
 
     if (App.get('supports.customizedWidgets')) {
-      var serviceName = this.get('controller.content.serviceName');
-      var stackService = App.StackService.find().findProperty('serviceName', serviceName);
-      if (stackService.get('isServiceWithWidgets')) {
-        this.get('controller').loadWidgets();
+        this.get('controller').loadActiveWidgetLayout();
+      if (App.supports.customizedWidgetLayout) {
         this.get('controller').loadWidgetLayouts();
       }
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/test/controllers/main/service/info/summary_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/info/summary_test.js b/ambari-web/test/controllers/main/service/info/summary_test.js
index 8ce848c..fa626ef 100644
--- a/ambari-web/test/controllers/main/service/info/summary_test.js
+++ b/ambari-web/test/controllers/main/service/info/summary_test.js
@@ -227,77 +227,39 @@ describe('App.MainServiceInfoSummaryController', function () {
 
   });
 
-  describe("#loadWidgets()", function () {
+  describe("#loadActiveWidgetLayout() for Enhanced Dashboard", function () {
     before(function () {
-      controller = App.MainServiceInfoSummaryController.create();
       sinon.stub(App.ajax, 'send');
     });
     after(function () {
       App.ajax.send.restore();
     });
     it("make GET call", function () {
-      controller.loadWidgets();
-      expect(App.ajax.send.getCall(0).args[0].name).to.equal('widgets.layout.userDefined.get');
+      var controller = App.MainServiceInfoSummaryController.create({
+        isServiceWithEnhancedWidgets: true,
+        content: Em.Object.create({serviceName: 'HDFS'})
+      });
+      controller.loadActiveWidgetLayout();
+      expect(App.ajax.send.getCall(0).args[0].name).to.equal('widget.layout.get');
     });
   });
 
-  describe("#loadWidgetsSuccessCallback()", function () {
+  describe("#loadActiveWidgetLayoutSuccessCallback()", function () {
     beforeEach(function () {
-      controller = App.MainServiceInfoSummaryController.create();
-      sinon.stub(App.widgetMapper, 'map');
-      sinon.stub(controller, 'loadStackWidgetsLayout');
+      sinon.stub( App.widgetLayoutMapper, 'map');
     });
     afterEach(function () {
-      App.widgetMapper.map.restore();
-      controller.loadStackWidgetsLayout.restore();
-    });
-    it("empty data", function () {
-      controller.loadWidgetsSuccessCallback({items: []});
-      expect(controller.loadStackWidgetsLayout.calledOnce).to.be.true;
+      App.widgetLayoutMapper.map.restore();
     });
-    it("filled data", function () {
-      controller.loadWidgetsSuccessCallback({items: ['1']});
-      expect(App.widgetMapper.map.calledWith('1')).to.be.true;
+    it("isWidgetLayoutsLoaded should be set to true", function () {
+      var controller = App.MainServiceInfoSummaryController.create({
+        isServiceWithEnhancedWidgets: true,
+        content: Em.Object.create({serviceName: 'HDFS'})
+      });
+      controller.loadActiveWidgetLayoutSuccessCallback({items:[true]});
+      expect(controller.get('isWidgetsLoaded')).to.be.true;
     });
-  });
 
-  describe("#loadStackWidgetsLayout()", function () {
-    before(function () {
-      controller = App.MainServiceInfoSummaryController.create();
-      sinon.stub(App.ajax, 'send');
-    });
-    after(function () {
-      App.ajax.send.restore();
-    });
-    it("make GET call", function () {
-      controller.loadStackWidgetsLayout();
-      expect(App.ajax.send.getCall(0).args[0].name).to.equal('widgets.layout.stackDefined.get');
-    });
   });
 
-  describe("#loadStackWidgetsLayoutSuccessCallback()", function () {
-    before(function () {
-      controller = App.MainServiceInfoSummaryController.create();
-      sinon.stub(App.widgetMapper, 'map');
-    });
-    after(function () {
-      App.widgetMapper.map.restore();
-    });
-    it("make GET call", function () {
-      var data = {
-        artifact_data: {
-          layouts: [
-            {
-              section_name: 'S1_SUMMARY'
-            }
-          ]
-        }
-      };
-      controller.set('content', Em.Object.create({serviceName: 'S1'}));
-      controller.loadStackWidgetsLayoutSuccessCallback(data);
-      expect(App.widgetMapper.map.calledWith({
-        section_name: 'S1_SUMMARY'
-      })).to.be.true;
-    });
-  });
 });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/test/mappers/stack_service_mapper_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mappers/stack_service_mapper_test.js b/ambari-web/test/mappers/stack_service_mapper_test.js
index 1b6ccfa..0d13925 100644
--- a/ambari-web/test/mappers/stack_service_mapper_test.js
+++ b/ambari-web/test/mappers/stack_service_mapper_test.js
@@ -178,8 +178,8 @@ describe('App.stackServiceMapper', function () {
         stackName: "HDP",
         isInstalled: false,
         isInstallable: true,
+        isServiceWithWidgets: false,
         serviceCheckSupported: true,
-        isServiceWithWidgets: true,
         requiredServices: ["ZOOKEEPER"]
       },
       componentResult = {

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/test/mixins/common/widget_mixin_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mixins/common/widget_mixin_test.js b/ambari-web/test/mixins/common/widget_mixin_test.js
index edb5359..9ef82a4 100644
--- a/ambari-web/test/mixins/common/widget_mixin_test.js
+++ b/ambari-web/test/mixins/common/widget_mixin_test.js
@@ -95,26 +95,26 @@ describe('App.WidgetMixin', function() {
       var data = [
         {
           "name": "regionserver.Server.percentFilesLocal",
-          "widget_id": "metrics/hbase/regionserver/percentFilesLocal",
+          "metric_path": "metrics/hbase/regionserver/percentFilesLocal",
           "service_name": "HBASE",
           "component_name": "HBASE_REGIONSERVER"
         },
         {
           "name": "regionserver.Server.percentFilesLocal2",
-          "widget_id": "w2",
+          "metric_path": "w2",
           "service_name": "HBASE",
           "component_name": "HBASE_REGIONSERVER"
         },
         {
           "name": "regionserver.Server.percentFilesLocal",
-          "widget_id": "metrics/hbase/regionserver/percentFilesLocal",
+          "metric_path": "metrics/hbase/regionserver/percentFilesLocal",
           "service_name": "HBASE",
           "component_name": "HBASE_REGIONSERVER",
           "host_component_criteria": 'c1'
         },
         {
           "name": "regionserver.Server.percentFilesLocal",
-          "widget_id": "metrics/hbase/regionserver/percentFilesLocal",
+          "metric_path": "metrics/hbase/regionserver/percentFilesLocal",
           "service_name": "HDFS",
           "component_name": "DATANODE",
           "host_component_criteria": 'c1'
@@ -122,11 +122,11 @@ describe('App.WidgetMixin', function() {
       ];
 
       expect(mixinObject.getRequestData(data)).to.eql({
-        "HBASE_HBASE_REGIONSERVER_undefined": {
+        "HBASE_HBASE_REGIONSERVER": {
           "name": "regionserver.Server.percentFilesLocal",
           "service_name": "HBASE",
           "component_name": "HBASE_REGIONSERVER",
-          "widget_ids": [
+          "metric_paths": [
             "metrics/hbase/regionserver/percentFilesLocal",
             "w2"
           ]
@@ -136,7 +136,7 @@ describe('App.WidgetMixin', function() {
           "service_name": "HBASE",
           "component_name": "HBASE_REGIONSERVER",
           "host_component_criteria": "c1",
-          "widget_ids": [
+          "metric_paths": [
             "metrics/hbase/regionserver/percentFilesLocal"
           ]
         },
@@ -145,7 +145,7 @@ describe('App.WidgetMixin', function() {
           "service_name": "HDFS",
           "component_name": "DATANODE",
           "host_component_criteria": "c1",
-          "widget_ids": [
+          "metric_paths": [
             "metrics/hbase/regionserver/percentFilesLocal"
           ]
         }
@@ -165,7 +165,7 @@ describe('App.WidgetMixin', function() {
       var request = {
         service_name: 'S1',
         component_name: 'C1',
-        widget_ids: ['w1', 'w2']
+        metric_paths: ['w1', 'w2']
       };
       mixinObject.getServiceComponentMetrics(request);
       expect(App.ajax.send.getCall(0).args[0]).to.eql({
@@ -174,14 +174,14 @@ describe('App.WidgetMixin', function() {
         data: {
           serviceName: 'S1',
           componentName: 'C1',
-          widgetIds: 'w1,w2'
+          metricPaths: 'w1,w2'
         },
-        success: 'getServiceComponentMetricsSuccessCallback'
+        success: 'getMetricsSuccessCallback'
       })
     });
   });
 
-  describe("#getServiceComponentMetricsSuccessCallback()", function () {
+  describe("#getMetricsSuccessCallback()", function () {
     var mixinObject = mixinClass.create();
     it("", function () {
       var data = {
@@ -197,11 +197,11 @@ describe('App.WidgetMixin', function() {
       };
       mixinObject.set('content.metrics', [
         {
-          widget_id: 'metrics/hbase/ipc/IPC/numOpenConnections'
+          metric_path: 'metrics/hbase/ipc/IPC/numOpenConnections'
         }
       ]);
-      mixinObject.getServiceComponentMetricsSuccessCallback(data);
-      expect(mixinObject.get('metrics').findProperty('widget_id', 'metrics/hbase/ipc/IPC/numOpenConnections').data).to.equal(11.5);
+      mixinObject.getMetricsSuccessCallback(data);
+      expect(mixinObject.get('metrics').findProperty('metric_path', 'metrics/hbase/ipc/IPC/numOpenConnections').data).to.equal(11.5);
     });
   });
 
@@ -217,7 +217,7 @@ describe('App.WidgetMixin', function() {
       var request = {
         service_name: 'S1',
         component_name: 'C1',
-        widget_ids: ['w1', 'w2'],
+        metric_paths: ['w1', 'w2'],
         host_component_criteria: 'c1'
       };
       mixinObject.getHostComponentMetrics(request);
@@ -227,10 +227,10 @@ describe('App.WidgetMixin', function() {
         data: {
           serviceName: 'S1',
           componentName: 'C1',
-          widgetIds: 'w1,w2',
+          metricPaths: 'w1,w2',
           hostComponentCriteria: 'host_components/HostRoles/c1'
         },
-        success: 'getHostComponentMetricsSuccessCallback'
+        success: 'getMetricsSuccessCallback'
       })
     });
   });


[2/2] ambari git commit: AMBARI-10547. Integrate displaying defined Number widget type from the API on service summary page. (jaimin)

Posted by ja...@apache.org.
AMBARI-10547. Integrate displaying defined Number widget type from the API on service summary page. (jaimin)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6dae33e5
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6dae33e5
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6dae33e5

Branch: refs/heads/trunk
Commit: 6dae33e54caeb42cf3bda5f8b8c88e1917f5b73d
Parents: c7e310d
Author: Jaimin Jetly <ja...@hortonworks.com>
Authored: Thu Apr 16 13:14:56 2015 -0700
Committer: Jaimin Jetly <ja...@hortonworks.com>
Committed: Thu Apr 16 13:14:56 2015 -0700

----------------------------------------------------------------------
 .../HBASE/0.96.0.2.0/metrics.json               |  14 +-
 .../HBASE/0.96.0.2.0/widgets.json               |  12 +-
 .../HBASE/1.1.0.2.3/metrics.json                |  27 +-
 .../HBASE/1.1.0.2.3/widgets.json                | 598 +++++++++++++------
 .../stacks/HDP/2.3/services/HBASE/widgets.json  | 434 ++++++++++++++
 .../widget_layouts/HBASE/default_dashboard.json | 278 +++++----
 ambari-web/app/config.js                        |   1 +
 .../controllers/main/service/info/summary.js    | 116 ++--
 ambari-web/app/mappers/stack_service_mapper.js  |   2 +-
 ambari-web/app/mappers/widget_layout_mapper.js  |  54 +-
 ambari-web/app/mappers/widget_mapper.js         |   4 +-
 ambari-web/app/mixins/common/widget_mixin.js    | 238 ++++----
 ambari-web/app/models/widget.js                 |  10 +-
 ambari-web/app/models/widget_layout.js          |   3 +-
 .../app/templates/main/service/info/summary.hbs |   4 +-
 ambari-web/app/utils/ajax/ajax.js               |   9 +-
 .../views/common/widget/graph_widget_view.js    |  35 +-
 .../app/views/main/service/info/summary.js      |  54 +-
 .../main/service/info/summary_test.js           |  72 +--
 .../test/mappers/stack_service_mapper_test.js   |   2 +-
 .../test/mixins/common/widget_mixin_test.js     |  36 +-
 21 files changed, 1378 insertions(+), 625 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/metrics.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/metrics.json b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/metrics.json
index 627667b..84efc2f 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/metrics.json
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/metrics.json
@@ -797,32 +797,32 @@
             },
             "metrics/hbase/regionserver/Server/Get_95th_percentile": {
               "metric": "regionserver.Server.Get_95th_percentile",
-              "pointInTime": false,
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/hbase/regionserver/Server/ScanNext_95th_percentile": {
               "metric": "regionserver.Server.ScanNext_95th_percentile",
-              "pointInTime": false,
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/hbase/regionserver/Server/Mutate_95th_percentile": {
               "metric": "regionserver.Server.Mutate_95th_percentile",
-              "pointInTime": false,
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/hbase/regionserver/Server/Increment_95th_percentile": {
               "metric": "regionserver.Server.Increment_95th_percentile",
-              "pointInTime": false,
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/hbase/regionserver/Server/Append_95th_percentile": {
               "metric": "regionserver.Server.Append_95th_percentile",
-              "pointInTime": false,
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/hbase/regionserver/Server/Delete_95th_percentile": {
               "metric": "regionserver.Server.Delete_95th_percentile",
-              "pointInTime": false,
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/hbase/regionserver/Server/percentFilesLocal": {
@@ -1837,7 +1837,7 @@
             },
             "metrics/hbase/regionserver/percentFilesLocal": {
               "metric": "regionserver.Server.percentFilesLocal",
-              "pointInTime": false,
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/hbase/regionserver/fsWriteLatency_avg_time": {

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/widgets.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/widgets.json b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/widgets.json
index ece1b03..c0e9821 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/widgets.json
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/widgets.json
@@ -14,7 +14,7 @@
           "metrics": [
             {
               "name": "regionserver.Server.Get_num_ops",
-              "metric_path": "metrics/jvm/gcCount",
+              "metric_path": "metrics/hbase/regionserver/Server/Get_num_ops",
               "service_name": "HBASE",
               "component_name": "HBASE_REGIONSERVER"
             },
@@ -52,7 +52,7 @@
           "values": [
             {
               "name": "Read Requests",
-              "value": "${regionserver.Server.Get_num_ops + regionserver.Server.ScanNext_num_ops}"
+              "value": "${regionserver.Server.Get_num_ops}"
             },
             {
               "name": "Write Requests",
@@ -77,18 +77,12 @@
               "metric_path": "metrics/hbase/regionserver/Server/Get_95th_percentile",
               "service_name": "HBASE",
               "component_name": "HBASE_REGIONSERVER"
-            },
-            {
-              "name": "regionserver.Server.ScanNext_95th_percentile",
-              "metric_path": "metrics/hbase/regionserver/Server/ScanNext_95th_percentile",
-              "service_name": "HBASE",
-              "component_name": "HBASE_REGIONSERVER"
             }
           ],
           "values": [
             {
               "name": "95% Read Latency",
-              "value": "${regionserver.Server.Get_95th_percentile + regionserver.Server.ScanNext_95th_percentile}"
+              "value": "${regionserver.Server.Get_95th_percentile}"
             }
           ],
           "properties": {

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-server/src/main/resources/common-services/HBASE/1.1.0.2.3/metrics.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/1.1.0.2.3/metrics.json b/ambari-server/src/main/resources/common-services/HBASE/1.1.0.2.3/metrics.json
index 7bbf7be..84efc2f 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/1.1.0.2.3/metrics.json
+++ b/ambari-server/src/main/resources/common-services/HBASE/1.1.0.2.3/metrics.json
@@ -770,6 +770,11 @@
               "pointInTime": false,
               "temporal": true
             },
+            "metrics/hbase/regionserver/Server/ScanNext_num_ops": {
+              "metric": "regionserver.Server.ScanNext_num_ops",
+              "pointInTime": false,
+              "temporal": true
+            },
             "metrics/hbase/regionserver/Server/Append_num_ops": {
               "metric": "regionserver.Server.Append_num_ops",
               "pointInTime": false,
@@ -785,29 +790,39 @@
               "pointInTime": false,
               "temporal": true
             },
+            "metrics/hbase/regionserver/Server/Increment_num_ops": {
+              "metric": "regionserver.Server.Increment_num_ops",
+              "pointInTime": false,
+              "temporal": true
+            },
             "metrics/hbase/regionserver/Server/Get_95th_percentile": {
               "metric": "regionserver.Server.Get_95th_percentile",
-              "pointInTime": false,
+              "pointInTime": true,
+              "temporal": true
+            },
+            "metrics/hbase/regionserver/Server/ScanNext_95th_percentile": {
+              "metric": "regionserver.Server.ScanNext_95th_percentile",
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/hbase/regionserver/Server/Mutate_95th_percentile": {
               "metric": "regionserver.Server.Mutate_95th_percentile",
-              "pointInTime": false,
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/hbase/regionserver/Server/Increment_95th_percentile": {
               "metric": "regionserver.Server.Increment_95th_percentile",
-              "pointInTime": false,
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/hbase/regionserver/Server/Append_95th_percentile": {
               "metric": "regionserver.Server.Append_95th_percentile",
-              "pointInTime": false,
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/hbase/regionserver/Server/Delete_95th_percentile": {
               "metric": "regionserver.Server.Delete_95th_percentile",
-              "pointInTime": false,
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/hbase/regionserver/Server/percentFilesLocal": {
@@ -1822,7 +1837,7 @@
             },
             "metrics/hbase/regionserver/percentFilesLocal": {
               "metric": "regionserver.Server.percentFilesLocal",
-              "pointInTime": false,
+              "pointInTime": true,
               "temporal": true
             },
             "metrics/hbase/regionserver/fsWriteLatency_avg_time": {

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-server/src/main/resources/common-services/HBASE/1.1.0.2.3/widgets.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/1.1.0.2.3/widgets.json b/ambari-server/src/main/resources/common-services/HBASE/1.1.0.2.3/widgets.json
index a64a2c8..bdb4338 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/1.1.0.2.3/widgets.json
+++ b/ambari-server/src/main/resources/common-services/HBASE/1.1.0.2.3/widgets.json
@@ -1,192 +1,434 @@
 {
   "layouts": [
-  {
-    "layout_name": "default_hbase_layout",
-    "section_name": "HBASE_SUMMARY",
-    "widgetLayoutInfo": [
-      {
-        "widget_name": "RS_READS_WRITES",
-        "display_name": "RegionServer Reads and Writes",
-        "description": "This widget shows all the read requests and write requests on all regions for a RegionServer",
-        "widget_type": "GRAPH",
-        "is_visible": true,
-        "metrics": [
-          {
-            "name": "regionserver.Server.Get_num_ops",
-            "ambari_id": "metrics/hbase/regionserver/Server/Get_num_ops",
-            "category": "",
-            "service_name": "HBASE",
-            "component_name": "HBASE_REGIONSERVER",
-            "host_component_criteria": "isActive=true"
-          },
-          {
-            "name": "regionserver.Server.Scan_num_ops",
-            "ambari_id": "metrics/hbase/regionserver/Server/Scan_num_ops",
-            "category": "",
-            "service_name": "HBASE",
-            "component_name": "HBASE_REGIONSERVER"
-          },
-          {
-            "name": "regionserver.Server.Append_num_ops",
-            "ambari_id": "metrics/hbase/regionserver/Server/Append_num_ops",
-            "category": "",
-            "service_name": "HBASE",
-            "component_name": "HBASE_REGIONSERVER"
-          },
-          {
-            "name": "regionserver.Server.Delete_num_ops",
-            "ambari_id": "metrics/hbase/regionserver/Server/Delete_num_ops",
-            "category": "",
-            "service_name": "HBASE",
-            "component_name": "HBASE_REGIONSERVER"
-          },
-          {
-            "name": "regionserver.Server.Increment_num_ops",
-            "ambari_id": "metrics/hbase/regionserver/Server/Increment_num_ops",
-            "category": "",
-            "service_name": "HBASE",
-            "component_name": "HBASE_REGIONSERVER"
-          },
-          {
-            "name": "regionserver.Server.Mutate_num_ops",
-            "ambari_id": "metrics/hbase/regionserver/Server/Mutate_num_ops",
-            "category": "",
-            "service_name": "HBASE",
-            "component_name": "HBASE_REGIONSERVER"
+    {
+      "layout_name": "default_hbase_dashboard",
+      "display_name": "Standard HBase Dashboard",
+      "section_name": "HBASE_SUMMARY",
+      "widgetLayoutInfo": [
+        {
+          "widget_name": "RS_READS_WRITES",
+          "display_name": "RegionServer Reads and Writes",
+          "description": "This widget shows all the read requests and write requests on all regions for a RegionServer",
+          "widget_type": "GRAPH",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "regionserver.Server.Get_num_ops",
+              "metric_path": "metrics/hbase/regionserver/Server/Get_num_ops",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.ScanNext_num_ops",
+              "metric_path": "metrics/hbase/regionserver/Server/ScanNext_num_ops",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Append_num_ops",
+              "metric_path": "metrics/hbase/regionserver/Server/Append_num_ops",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Delete_num_ops",
+              "metric_path": "metrics/hbase/regionserver/Server/Delete_num_ops",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Increment_num_ops",
+              "metric_path": "metrics/hbase/regionserver/Server/Increment_num_ops",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Mutate_num_ops",
+              "metric_path": "metrics/hbase/regionserver/Server/Mutate_num_ops",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "Read Requests",
+              "value": "${regionserver.Server.Get_num_ops + regionserver.Server.ScanNext_num_ops}"
+            },
+            {
+              "name": "Write Requests",
+              "value": "${regionserver.Server.Append_num_ops + regionserver.Server.Delete_num_ops + regionserver.Server.Increment_num_ops + regionserver.Server.Mutate_num_ops}"
+            }
+          ],
+          "properties": {
+            "display_unit": "Requests",
+            "graph_type": "LINE",
+            "time_range": "86400000"
           }
-        ],
-        "values": [
-          {
-            "name": "Read Requests",
-            "value": "`${regionserver.Server.Get_num_ops + regionserver.Server.Scan_num_ops}`"
-          },
-          {
-            "name": "Write Requests",
-            "value": "`${metrics.hbase.regionserver.Server.Append_num_ops + metrics.hbase.regionserver.Server.Delete_num_ops + metrics.hbase.regionserver.Server.Increment_num_ops + metrics.hbase.regionserver.Server.Mutate_num_ops}`"
+        },
+        {
+          "widget_name": "READ_LATENCY_95",
+          "display_name": "95% Read Latency",
+          "description": "This widget shows 95th percentile of the read latency.",
+          "widget_type": "NUMBER",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "regionserver.Server.Get_95th_percentile",
+              "metric_path": "metrics/hbase/regionserver/Server/Get_95th_percentile",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.ScanNext_95th_percentile",
+              "metric_path": "metrics/hbase/regionserver/Server/ScanNext_95th_percentile",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "95% Read Latency",
+              "value": "${regionserver.Server.Get_95th_percentile + regionserver.Server.ScanNext_95th_percentile}"
+            }
+          ],
+          "properties": {
+            "display_unit": "%"
           }
-        ],
-        "properties": {
-          "display_unit": "Requests",
-          "graph_type": "LINE",
-          "time_ranger": "1 week"
-        }
-      },
-      {
-        "widget_name": "OPEN_CONNECTIONS",
-        "display_name": "Open Connections",
-        "description": "This widget shows number of current open connections",
-        "widget_type": "GRAPH",
-        "is_visible": true,
-        "metrics": [
-          {
-            "name": "ipc.IPC.numOpenConnections",
-            "ambari_id": "metrics/hbase/ipc/IPC/numOpenConnections",
-            "category": "",
-            "service_name": "HBASE",
-            "component_name": "HBASE_REGIONSERVER"
+        },
+        {
+          "widget_name": "WRITE_LATENCY_95",
+          "display_name": "95% Write Latency",
+          "description": "This widget shows 95th percentile of the write latency.",
+          "widget_type": "NUMBER",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "regionserver.Server.Mutate_95th_percentile",
+              "metric_path": "metrics/hbase/regionserver/Server/Mutate_95th_percentile",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Increment_95th_percentile",
+              "metric_path": "metrics/hbase/regionserver/Server/Increment_95th_percentile",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Append_95th_percentile",
+              "metric_path": "metrics/hbase/regionserver/Server/Append_95th_percentile",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Delete_95th_percentile",
+              "metric_path": "metrics/hbase/regionserver/Server/Delete_95th_percentile",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "95% Write Latency",
+              "value": "${regionserver.Server.Mutate_95th_percentile + regionserver.Server.Increment_95th_percentile + regionserver.Server.Append_95th_percentile + regionserver.Server.Delete_95th_percentile}"
+            }
+          ],
+          "properties": {
+            "display_unit": "%"
           }
-        ],
-        "values": [
-          {
-            "name": "Open Connections",
-            "value": "`${ipc.IPC.numOpenConnections}`"
+        },
+        {
+          "widget_name": "OPEN_CONNECTIONS",
+          "display_name": "Open Connections",
+          "description": "This widget shows number of current open connections",
+          "widget_type": "GRAPH",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "ipc.IPC.numOpenConnections",
+              "metric_path": "metrics/hbase/ipc/IPC/numOpenConnections",
+              "category": "",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "Open Connections",
+              "value": "${ipc.IPC.numOpenConnections}"
+            }
+          ],
+          "properties": {
+            "display_unit": "Connections",
+            "graph_type": "LINE",
+            "time_range": "86400000"
           }
-        ],
-        "properties": {
-          "display_unit": "Connections",
-          "graph_type": "STACK",
-          "time_ranger": "1 hour"
-        }
-      },
-      {
-        "widget_name": "ACTIVE_HANDLER",
-        "display_name": "Active Handlers vs Calls in General Queue",
-        "widget_type": "GRAPH",
-        "is_visible": true,
-        "metrics": [
-          {
-            "name": "ipc.IPC.numOpenConnections",
-            "ambari_id": "metrics/hbase/ipc/IPC/numOpenConnections",
-            "category": "",
-            "service_name": "HBASE",
-            "component_name": "HBASE_REGIONSERVER"
-          },
-          {
-            "name": "ipc.IPC.numCallsInGeneralQueue",
-            "ambari_id": "metrics/hbase/ipc/IPC/numOpenConnections",
-            "category": "",
-            "service_name": "HBASE",
-            "component_name": "HBASE_REGIONSERVER"
+        },
+        {
+          "widget_name": "ACTIVE_HANDLER",
+          "display_name": "Active Handlers vs Calls in General Queue",
+          "widget_type": "GRAPH",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "ipc.IPC.numOpenConnections",
+              "metric_path": "metrics/hbase/ipc/IPC/numOpenConnections",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "ipc.IPC.numCallsInGeneralQueue",
+              "metric_path": "metrics/hbase/ipc/IPC/numOpenConnections",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "Active Handlers",
+              "value": "${ipc.IPC.numActiveHandler}"
+            },
+            {
+              "name": "Calls in General Queue",
+              "value": "${ipc.IPC.numCallsInGeneralQueue}"
+            }
+          ],
+          "properties": {
+            "graph_type": "LINE",
+            "time_range": "86400000"
           }
-        ],
-        "values": [
-          {
-            "name": "Active Handlers",
-            "value": "`${ipc.IPC.numActiveHandler}`"
-          },
-          {
-            "name": "Calls in General Queue",
-            "value": "`${ipc.IPC.numCallsInGeneralQueue}`"
+        },
+        {
+          "widget_name": "FILES_LOCAL",
+          "display_name": "Files Local",
+          "description": "This widget shows percentage of files local.",
+          "widget_type": "NUMBER",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "regionserver.Server.percentFilesLocal",
+              "metric_path": "metrics/hbase/regionserver/percentFilesLocal",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "Files Local",
+              "value": "${regionserver.Server.percentFilesLocal}"
+            }
+          ],
+          "properties": {
+            "display_unit": "%"
           }
-        ],
-        "properties": {
-          "graph_type": "LINE",
-          "time_ranger": "1 hour"
-        }
-      },
-      {
-        "widget_name": "FILES_LOCAL",
-        "display_name": "Files Local",
-        "description": "This widget shows percentage of files local.",
-        "widget_type": "NUMBER",
-        "is_visible": true,
-        "metrics": [
-          {
-            "name": "regionserver.Server.percentFilesLocal",
-            "ambari_id": "metrics/hbase/regionserver/percentFilesLocal",
-            "category": "",
-            "service_name": "HBASE",
-            "component_name": "HBASE_REGIONSERVER"
+        },
+        {
+          "widget_name": "UPDATES_BLOCKED_TIME",
+          "display_name": "Updates Blocked Time",
+          "description": "Number of milliseconds updates have been blocked so the memstore can be flushed",
+          "widget_type": "GRAPH",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "regionserver.Server.updatesBlockedTime",
+              "metric_path": "metrics/hbase/regionserver/Server/updatesBlockedTime",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "Updates Blocked Time",
+              "value": "${regionserver.Server.updatesBlockedTime}"
+            }
+          ],
+          "properties": {
+            "display_unit": "ms",
+            "graph_type": "LINE",
+            "time_range": "86400000"
           }
-        ],
-        "values": [
-          {
-            "name": "Files Local",
-            "value": "`${regionserver.Server.percentFilesLocal}`"
+        },
+        {
+          "widget_name": "RS_HOST_METRICS",
+          "display_name": "ReqionServer System Metrics",
+          "description": "ReqionServer widget for Host CPU, Network and Disk Utilization",
+          "widget_type": "GRAPH",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "cpu_idle",
+              "metric_path": "metrics/cpu/cpu_idle",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "disk_free",
+              "metric_path": "metrics/disk/disk_free",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "pkts_in",
+              "metric_path": "metrics/network/pkts_in",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "pkts_out",
+              "metric_path": "metrics/network/pkts_out",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "CPU Idle",
+              "value": "${cpu_idle}"
+            },
+            {
+              "name": "Disk Free",
+              "value": "${disk_free}"
+            },
+            {
+              "name": "Network Packets In/Out",
+              "value": "${pkts_in + pkts_out}"
+            }
+          ],
+          "properties": {
+            "graph_type": "LINE",
+            "time_range": "86400000"
           }
-        ],
-        "properties": {
-          "display_unit": "%"
         }
-      },
-      {
-        "widget_name": "UPDATED_BLOCKED_TIME",
-        "display_name": "Updated Blocked Time",
-        "description": "",
-        "widget_type": "GRAPH",
-        "is_visible": true,
-        "metrics": [
-          {
-            "name": "regionserver.Server.updatesBlockedTime",
-            "ambari_id": "metrics/hbase/regionserver/Server/updatesBlockedTime",
-            "category": "",
-            "service_name": "HBASE",
-            "component_name": "HBASE_REGIONSERVER"
+      ]
+    },
+    {
+      "layout_name": "default_hbase_heatmap",
+      "display_name": "HBase Heatmaps",
+      "section_name": "HBASE_HEATMAPS",
+      "widgetLayoutInfo": [
+        {
+          "widget_name": "HBASE_COMPACTION_QUEUE_SIZE",
+          "display_name": "HBase Compaction Queue Size",
+          "description": "",
+          "widget_type": "HEATMAP",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "Hadoop:service=HBase,name=RegionServer,sub=Server.compactionQueueLength",
+              "metric_path": "metrics/hbase/regionserver/compactionQueueSize",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "HBase Compaction Queue Size",
+              "value": "${Hadoop:service=HBase,name=RegionServer,sub=Server.compactionQueueLength} "
+            }
+          ],
+          "properties": {
+            "display_unit": "",
+            "max_limit": "10"
+          }
+        },
+        {
+          "widget_name": "HBASE_MEMSTORE_SIZES",
+          "display_name": "HBase Memstore Sizes",
+          "description": "",
+          "widget_type": "HEATMAP",
+          "is_visible": false,
+          "metrics": [
+            {
+              "name": "Hadoop:service=HBase,name=RegionServer,sub=Server.memStoreSize",
+              "metric_path": "metrics/hbase/regionserver/memstoreSize",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "HBase Memstore Sizes",
+              "value": "${Hadoop:service=HBase,name=RegionServer,sub=Server.memStoreSize}"
+            }
+          ],
+          "properties": {
+            "display_unit": "B",
+            "max_limit": "104857600"
+          }
+        },
+        {
+          "widget_name": "HBASE_READ_REQUEST",
+          "display_name": "HBase Read Request Count",
+          "description": "",
+          "widget_type": "HEATMAP",
+          "is_visible": false,
+          "metrics": [
+            {
+              "name": "Hadoop:service=HBase,name=RegionServer,sub=Server.readRequestCount",
+              "metric_path": "metrics/hbase/regionserver/readRequestsCount",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "HBase Read Request Count",
+              "value": "${Hadoop:service=HBase,name=RegionServer,sub=Server.readRequestCount}"
+            }
+          ],
+          "properties": {
+            "max_limit": "200"
+          }
+        },
+        {
+          "widget_name": "HBASE_WRITE_REQUEST",
+          "display_name": "HBase Write Request Count",
+          "description": "",
+          "widget_type": "HEATMAP",
+          "is_visible": false,
+          "metrics": [
+            {
+              "name": "Hadoop:service=HBase,name=RegionServer,sub=Server.writeRequestCount",
+              "metric_path": "metrics/hbase/regionserver/writeRequestsCount",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "HBase Write Request Count",
+              "value": "${Hadoop:service=HBase,name=RegionServer,sub=Server.writeRequestCount}"
+            }
+          ],
+          "properties": {
+            "max_limit": "200"
           }
-        ],
-        "values": [
-          {
-            "name": "Updated Blocked Time",
-            "value": "`${regionserver.Server.updatesBlockedTime}`"
+        },
+        {
+          "widget_name": "HBASE_REGIONS",
+          "display_name": "HBase Regions",
+          "description": "",
+          "widget_type": "HEATMAP",
+          "is_visible": false,
+          "metrics": [
+            {
+              "name": "Hadoop:service=HBase,name=RegionServer,sub=Server.regionCount",
+              "metric_path": "metrics/hbase/regionserver/regions",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "HBase Regions",
+              "value": "${Hadoop:service=HBase,name=RegionServer,sub=Server.regionCount}"
+            }
+          ],
+          "properties": {
+            "max_limit": "10"
           }
-        ],
-        "properties": {
-          "display_unit": "seconds",
-          "graph_type": "LINE",
-          "time_ranger": "1 day"
         }
-      }
-    ]
-  }
-]
-}
+      ]
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-server/src/main/resources/stacks/HDP/2.3/services/HBASE/widgets.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.3/services/HBASE/widgets.json b/ambari-server/src/main/resources/stacks/HDP/2.3/services/HBASE/widgets.json
new file mode 100644
index 0000000..bdb4338
--- /dev/null
+++ b/ambari-server/src/main/resources/stacks/HDP/2.3/services/HBASE/widgets.json
@@ -0,0 +1,434 @@
+{
+  "layouts": [
+    {
+      "layout_name": "default_hbase_dashboard",
+      "display_name": "Standard HBase Dashboard",
+      "section_name": "HBASE_SUMMARY",
+      "widgetLayoutInfo": [
+        {
+          "widget_name": "RS_READS_WRITES",
+          "display_name": "RegionServer Reads and Writes",
+          "description": "This widget shows all the read requests and write requests on all regions for a RegionServer",
+          "widget_type": "GRAPH",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "regionserver.Server.Get_num_ops",
+              "metric_path": "metrics/hbase/regionserver/Server/Get_num_ops",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.ScanNext_num_ops",
+              "metric_path": "metrics/hbase/regionserver/Server/ScanNext_num_ops",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Append_num_ops",
+              "metric_path": "metrics/hbase/regionserver/Server/Append_num_ops",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Delete_num_ops",
+              "metric_path": "metrics/hbase/regionserver/Server/Delete_num_ops",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Increment_num_ops",
+              "metric_path": "metrics/hbase/regionserver/Server/Increment_num_ops",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Mutate_num_ops",
+              "metric_path": "metrics/hbase/regionserver/Server/Mutate_num_ops",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "Read Requests",
+              "value": "${regionserver.Server.Get_num_ops + regionserver.Server.ScanNext_num_ops}"
+            },
+            {
+              "name": "Write Requests",
+              "value": "${regionserver.Server.Append_num_ops + regionserver.Server.Delete_num_ops + regionserver.Server.Increment_num_ops + regionserver.Server.Mutate_num_ops}"
+            }
+          ],
+          "properties": {
+            "display_unit": "Requests",
+            "graph_type": "LINE",
+            "time_range": "86400000"
+          }
+        },
+        {
+          "widget_name": "READ_LATENCY_95",
+          "display_name": "95% Read Latency",
+          "description": "This widget shows 95th percentile of the read latency.",
+          "widget_type": "NUMBER",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "regionserver.Server.Get_95th_percentile",
+              "metric_path": "metrics/hbase/regionserver/Server/Get_95th_percentile",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.ScanNext_95th_percentile",
+              "metric_path": "metrics/hbase/regionserver/Server/ScanNext_95th_percentile",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "95% Read Latency",
+              "value": "${regionserver.Server.Get_95th_percentile + regionserver.Server.ScanNext_95th_percentile}"
+            }
+          ],
+          "properties": {
+            "display_unit": "%"
+          }
+        },
+        {
+          "widget_name": "WRITE_LATENCY_95",
+          "display_name": "95% Write Latency",
+          "description": "This widget shows 95th percentile of the write latency.",
+          "widget_type": "NUMBER",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "regionserver.Server.Mutate_95th_percentile",
+              "metric_path": "metrics/hbase/regionserver/Server/Mutate_95th_percentile",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Increment_95th_percentile",
+              "metric_path": "metrics/hbase/regionserver/Server/Increment_95th_percentile",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Append_95th_percentile",
+              "metric_path": "metrics/hbase/regionserver/Server/Append_95th_percentile",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "regionserver.Server.Delete_95th_percentile",
+              "metric_path": "metrics/hbase/regionserver/Server/Delete_95th_percentile",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "95% Write Latency",
+              "value": "${regionserver.Server.Mutate_95th_percentile + regionserver.Server.Increment_95th_percentile + regionserver.Server.Append_95th_percentile + regionserver.Server.Delete_95th_percentile}"
+            }
+          ],
+          "properties": {
+            "display_unit": "%"
+          }
+        },
+        {
+          "widget_name": "OPEN_CONNECTIONS",
+          "display_name": "Open Connections",
+          "description": "This widget shows number of current open connections",
+          "widget_type": "GRAPH",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "ipc.IPC.numOpenConnections",
+              "metric_path": "metrics/hbase/ipc/IPC/numOpenConnections",
+              "category": "",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "Open Connections",
+              "value": "${ipc.IPC.numOpenConnections}"
+            }
+          ],
+          "properties": {
+            "display_unit": "Connections",
+            "graph_type": "LINE",
+            "time_range": "86400000"
+          }
+        },
+        {
+          "widget_name": "ACTIVE_HANDLER",
+          "display_name": "Active Handlers vs Calls in General Queue",
+          "widget_type": "GRAPH",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "ipc.IPC.numOpenConnections",
+              "metric_path": "metrics/hbase/ipc/IPC/numOpenConnections",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "ipc.IPC.numCallsInGeneralQueue",
+              "metric_path": "metrics/hbase/ipc/IPC/numOpenConnections",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "Active Handlers",
+              "value": "${ipc.IPC.numActiveHandler}"
+            },
+            {
+              "name": "Calls in General Queue",
+              "value": "${ipc.IPC.numCallsInGeneralQueue}"
+            }
+          ],
+          "properties": {
+            "graph_type": "LINE",
+            "time_range": "86400000"
+          }
+        },
+        {
+          "widget_name": "FILES_LOCAL",
+          "display_name": "Files Local",
+          "description": "This widget shows percentage of files local.",
+          "widget_type": "NUMBER",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "regionserver.Server.percentFilesLocal",
+              "metric_path": "metrics/hbase/regionserver/percentFilesLocal",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "Files Local",
+              "value": "${regionserver.Server.percentFilesLocal}"
+            }
+          ],
+          "properties": {
+            "display_unit": "%"
+          }
+        },
+        {
+          "widget_name": "UPDATES_BLOCKED_TIME",
+          "display_name": "Updates Blocked Time",
+          "description": "Number of milliseconds updates have been blocked so the memstore can be flushed",
+          "widget_type": "GRAPH",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "regionserver.Server.updatesBlockedTime",
+              "metric_path": "metrics/hbase/regionserver/Server/updatesBlockedTime",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "Updates Blocked Time",
+              "value": "${regionserver.Server.updatesBlockedTime}"
+            }
+          ],
+          "properties": {
+            "display_unit": "ms",
+            "graph_type": "LINE",
+            "time_range": "86400000"
+          }
+        },
+        {
+          "widget_name": "RS_HOST_METRICS",
+          "display_name": "ReqionServer System Metrics",
+          "description": "ReqionServer widget for Host CPU, Network and Disk Utilization",
+          "widget_type": "GRAPH",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "cpu_idle",
+              "metric_path": "metrics/cpu/cpu_idle",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "disk_free",
+              "metric_path": "metrics/disk/disk_free",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "pkts_in",
+              "metric_path": "metrics/network/pkts_in",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            },
+            {
+              "name": "pkts_out",
+              "metric_path": "metrics/network/pkts_out",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "CPU Idle",
+              "value": "${cpu_idle}"
+            },
+            {
+              "name": "Disk Free",
+              "value": "${disk_free}"
+            },
+            {
+              "name": "Network Packets In/Out",
+              "value": "${pkts_in + pkts_out}"
+            }
+          ],
+          "properties": {
+            "graph_type": "LINE",
+            "time_range": "86400000"
+          }
+        }
+      ]
+    },
+    {
+      "layout_name": "default_hbase_heatmap",
+      "display_name": "HBase Heatmaps",
+      "section_name": "HBASE_HEATMAPS",
+      "widgetLayoutInfo": [
+        {
+          "widget_name": "HBASE_COMPACTION_QUEUE_SIZE",
+          "display_name": "HBase Compaction Queue Size",
+          "description": "",
+          "widget_type": "HEATMAP",
+          "is_visible": true,
+          "metrics": [
+            {
+              "name": "Hadoop:service=HBase,name=RegionServer,sub=Server.compactionQueueLength",
+              "metric_path": "metrics/hbase/regionserver/compactionQueueSize",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "HBase Compaction Queue Size",
+              "value": "${Hadoop:service=HBase,name=RegionServer,sub=Server.compactionQueueLength} "
+            }
+          ],
+          "properties": {
+            "display_unit": "",
+            "max_limit": "10"
+          }
+        },
+        {
+          "widget_name": "HBASE_MEMSTORE_SIZES",
+          "display_name": "HBase Memstore Sizes",
+          "description": "",
+          "widget_type": "HEATMAP",
+          "is_visible": false,
+          "metrics": [
+            {
+              "name": "Hadoop:service=HBase,name=RegionServer,sub=Server.memStoreSize",
+              "metric_path": "metrics/hbase/regionserver/memstoreSize",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "HBase Memstore Sizes",
+              "value": "${Hadoop:service=HBase,name=RegionServer,sub=Server.memStoreSize}"
+            }
+          ],
+          "properties": {
+            "display_unit": "B",
+            "max_limit": "104857600"
+          }
+        },
+        {
+          "widget_name": "HBASE_READ_REQUEST",
+          "display_name": "HBase Read Request Count",
+          "description": "",
+          "widget_type": "HEATMAP",
+          "is_visible": false,
+          "metrics": [
+            {
+              "name": "Hadoop:service=HBase,name=RegionServer,sub=Server.readRequestCount",
+              "metric_path": "metrics/hbase/regionserver/readRequestsCount",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "HBase Read Request Count",
+              "value": "${Hadoop:service=HBase,name=RegionServer,sub=Server.readRequestCount}"
+            }
+          ],
+          "properties": {
+            "max_limit": "200"
+          }
+        },
+        {
+          "widget_name": "HBASE_WRITE_REQUEST",
+          "display_name": "HBase Write Request Count",
+          "description": "",
+          "widget_type": "HEATMAP",
+          "is_visible": false,
+          "metrics": [
+            {
+              "name": "Hadoop:service=HBase,name=RegionServer,sub=Server.writeRequestCount",
+              "metric_path": "metrics/hbase/regionserver/writeRequestsCount",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "HBase Write Request Count",
+              "value": "${Hadoop:service=HBase,name=RegionServer,sub=Server.writeRequestCount}"
+            }
+          ],
+          "properties": {
+            "max_limit": "200"
+          }
+        },
+        {
+          "widget_name": "HBASE_REGIONS",
+          "display_name": "HBase Regions",
+          "description": "",
+          "widget_type": "HEATMAP",
+          "is_visible": false,
+          "metrics": [
+            {
+              "name": "Hadoop:service=HBase,name=RegionServer,sub=Server.regionCount",
+              "metric_path": "metrics/hbase/regionserver/regions",
+              "service_name": "HBASE",
+              "component_name": "HBASE_REGIONSERVER"
+            }
+          ],
+          "values": [
+            {
+              "name": "HBase Regions",
+              "value": "${Hadoop:service=HBase,name=RegionServer,sub=Server.regionCount}"
+            }
+          ],
+          "properties": {
+            "max_limit": "10"
+          }
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/app/assets/data/widget_layouts/HBASE/default_dashboard.json
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/data/widget_layouts/HBASE/default_dashboard.json b/ambari-web/app/assets/data/widget_layouts/HBASE/default_dashboard.json
index 0636541..0ff181a 100644
--- a/ambari-web/app/assets/data/widget_layouts/HBASE/default_dashboard.json
+++ b/ambari-web/app/assets/data/widget_layouts/HBASE/default_dashboard.json
@@ -1,132 +1,154 @@
 {
-  "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widget_layouts/6",
-  "widgets": [
+  "items": [
     {
-      "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/29",
-      "id": 29,
-      "metrics": "[{\"name\":\"regionserver.Server.Get_num_ops\",\"metric_path\":\"metrics/jvm/gcCount\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.ScanNext_num_ops\",\"metric_path\":\"metrics/hbase/regionserver/Server/ScanNext_num_ops\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Append_num_ops\",\"metric_path\":\"metrics/hbase/regionserver/Server/Append_num_ops\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Delete_num_ops\",\"metric_path\":\"metrics/hbase/regionserver/Server/Delete_num_ops\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Increment_num_ops\",\"metric_path\":\"metrics/hbase/regionserver/Server/Increment_num_ops\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Mutate_num_ops\",\"metric_pa
 th\":\"metrics/hbase/regionserver/Server/Mutate_num_ops\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
-      "author": "ambari",
-      "description": "This widget shows all the read requests and write requests on all regions for a RegionServer",
-      "scope": "CLUSTER",
-      "properties": "{\"display_unit\":\"Requests\",\"graph_type\":\"LINE\",\"time_range\":\"86400000\"}",
-      "widget_name": "RS_READS_WRITES",
-      "widget_type": "GRAPH",
-      "time_created": 1428990958952,
-      "display_name": "RegionServer Reads and Writes",
-      "values": "[{\"name\":\"Read Requests\",\"value\":\"${regionserver.Server.Get_num_ops + regionserver.Server.ScanNext_num_ops}\"},{\"name\":\"Write Requests\",\"value\":\"${regionserver.Server.Append_num_ops + regionserver.Server.Delete_num_ops + regionserver.Server.Increment_num_ops + regionserver.Server.Mutate_num_ops}\"}]",
-      "cluster_name": "c1"
-    },
-    {
-      "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/30",
-      "id": 30,
-      "metrics": "[{\"name\":\"regionserver.Server.Get_95th_percentile\",\"metric_path\":\"metrics/hbase/regionserver/Server/Get_95th_percentile\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.ScanNext_95th_percentile\",\"metric_path\":\"metrics/hbase/regionserver/Server/ScanNext_95th_percentile\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
-      "author": "ambari",
-      "description": "This widget shows 95th percentile of the read latency.",
-      "scope": "CLUSTER",
-      "properties": "{\"display_unit\":\"%\"}",
-      "widget_name": "READ_LATENCY_95",
-      "widget_type": "NUMBER",
-      "time_created": 1428990958952,
-      "display_name": "95% Read Latency",
-      "values": "[{\"name\":\"95% Read Latency\",\"value\":\"${regionserver.Server.Get_95th_percentile + regionserver.Server.ScanNext_95th_percentile}\"}]",
-      "cluster_name": "c1"
-    },
-    {
-      "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/31",
-      "id": 31,
-      "metrics": "[{\"name\":\"regionserver.Server.Mutate_95th_percentile\",\"metric_path\":\"metrics/hbase/regionserver/Server/Mutate_95th_percentile\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Increment_95th_percentile\",\"metric_path\":\"metrics/hbase/regionserver/Server/Increment_95th_percentile\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Append_95th_percentile\",\"metric_path\":\"metrics/hbase/regionserver/Server/Append_95th_percentile\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Delete_95th_percentile\",\"metric_path\":\"metrics/hbase/regionserver/Server/Delete_95th_percentile\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
-      "author": "ambari",
-      "description": "This widget shows 95th percentile of the write latency.",
-      "scope": "CLUSTER",
-      "properties": "{\"display_unit\":\"%\"}",
-      "widget_name": "WRITE_LATENCY_95",
-      "widget_type": "NUMBER",
-      "time_created": 1428990958952,
-      "display_name": "95% Write Latency",
-      "values": "[{\"name\":\"95% Write Latency\",\"value\":\"${regionserver.Server.Mutate_95th_percentile + regionserver.Server.Increment_95th_percentile + regionserver.Server.Append_95th_percentile + regionserver.Server.Delete_95th_percentile}\"}]",
-      "cluster_name": "c1"
-    },
-    {
-      "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/32",
-      "id": 32,
-      "metrics": "[{\"name\":\"ipc.IPC.numOpenConnections\",\"metric_path\":\"metrics/hbase/ipc/IPC/numOpenConnections\",\"category\":\"\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
-      "author": "ambari",
-      "description": "This widget shows number of current open connections",
-      "scope": "CLUSTER",
-      "properties": "{\"display_unit\":\"Connections\",\"graph_type\":\"LINE\",\"time_range\":\"86400000\"}",
-      "widget_name": "OPEN_CONNECTIONS",
-      "widget_type": "GRAPH",
-      "time_created": 1428990958952,
-      "display_name": "Open Connections",
-      "values": "[{\"name\":\"Open Connections\",\"value\":\"${ipc.IPC.numOpenConnections}\"}]",
-      "cluster_name": "c1"
-    },
-    {
-      "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/33",
-      "id": 33,
-      "metrics": "[{\"name\":\"ipc.IPC.numOpenConnections\",\"metric_path\":\"metrics/hbase/ipc/IPC/numOpenConnections\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"ipc.IPC.numCallsInGeneralQueue\",\"metric_path\":\"metrics/hbase/ipc/IPC/numOpenConnections\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
-      "author": "ambari",
-      "description": null,
-      "scope": "CLUSTER",
-      "properties": "{\"graph_type\":\"LINE\",\"time_range\":\"86400000\"}",
-      "widget_name": "ACTIVE_HANDLER",
-      "widget_type": "GRAPH",
-      "time_created": 1428990958952,
-      "display_name": "Active Handlers vs Calls in General Queue",
-      "values": "[{\"name\":\"Active Handlers\",\"value\":\"${ipc.IPC.numActiveHandler}\"},{\"name\":\"Calls in General Queue\",\"value\":\"${ipc.IPC.numCallsInGeneralQueue}\"}]",
-      "cluster_name": "c1"
-    },
-    {
-      "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/34",
-      "id": 34,
-      "metrics": "[{\"name\":\"regionserver.Server.percentFilesLocal\",\"metric_path\":\"metrics/hbase/regionserver/percentFilesLocal\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
-      "author": "ambari",
-      "description": "This widget shows percentage of files local.",
-      "scope": "CLUSTER",
-      "properties": "{\"display_unit\":\"%\"}",
-      "widget_name": "FILES_LOCAL",
-      "widget_type": "NUMBER",
-      "time_created": 1428990958952,
-      "display_name": "Files Local",
-      "values": "[{\"name\":\"Files Local\",\"value\":\"${regionserver.Server.percentFilesLocal}\"}]",
-      "cluster_name": "c1"
-    },
-    {
-      "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/35",
-      "id": 35,
-      "metrics": "[{\"name\":\"regionserver.Server.updatesBlockedTime\",\"metric_path\":\"metrics/hbase/regionserver/Server/updatesBlockedTime\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
-      "author": "ambari",
-      "description": "Updated Blocked Time",
-      "scope": "CLUSTER",
-      "properties": "{\"display_unit\":\"seconds\",\"graph_type\":\"LINE\",\"time_range\":\"86400000\"}",
-      "widget_name": "UPDATED_BLOCKED_TIME",
-      "widget_type": "GRAPH",
-      "time_created": 1428990958952,
-      "display_name": "Updated Blocked Time",
-      "values": "[{\"name\":\"Updated Blocked Time\",\"value\":\"${regionserver.Server.updatesBlockedTime}\"}]",
-      "cluster_name": "c1"
-    },
-    {
-      "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/36",
-      "id": 36,
-      "metrics": "[{\"name\":\"cpu_idle\",\"metric_path\":\"metrics/cpu/cpu_idle\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"disk_free\",\"metric_path\":\"metrics/disk/disk_free\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"pkts_in\",\"metric_path\":\"metrics/network/pkts_in\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"pkts_out\",\"metric_path\":\"metrics/network/pkts_out\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
-      "author": "ambari",
-      "description": "ReqionServer widget for Host CPU, Network and Disk Utilization",
-      "scope": "CLUSTER",
-      "properties": "{\"graph_type\":\"LINE\",\"time_range\":\"86400000\"}",
-      "widget_name": "RS_HOST_METRICS",
-      "widget_type": "GRAPH",
-      "time_created": 1428990958952,
-      "display_name": "ReqionServer System Metrics",
-      "values": "[{\"name\":\"CPU Idle\",\"value\":\"${cpu_idle}\"},{\"name\":\"Disk Free\",\"value\":\"${disk_free}\"},{\"name\":\"Network Packets In/Out\",\"value\":\"${pkts_in + pkts_out}\"}]",
-      "cluster_name": "c1"
+      "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widget_layouts/6",
+      "WidgetLayoutInfo": {
+        "cluster_name": "c1",
+        "display_name": "Standard HBase Dashboard",
+        "id": 6,
+        "layout_name": "default_hbase_dashboard",
+        "scope": "CLUSTER",
+        "section_name": "HBASE_SUMMARY",
+        "user_name": "ambari",
+        "widgets": [
+          {
+            "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/29",
+            "WidgetInfo": {
+              "id": 29,
+              "metrics": "[{\"name\":\"regionserver.Server.Get_num_ops\",\"metric_path\":\"metrics/jvm/gcCount\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.ScanNext_num_ops\",\"metric_path\":\"metrics/hbase/regionserver/Server/ScanNext_num_ops\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Append_num_ops\",\"metric_path\":\"metrics/hbase/regionserver/Server/Append_num_ops\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Delete_num_ops\",\"metric_path\":\"metrics/hbase/regionserver/Server/Delete_num_ops\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Increment_num_ops\",\"metric_path\":\"metrics/hbase/regionserver/Server/Increment_num_ops\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Mutate_num_ops\",\"m
 etric_path\":\"metrics/hbase/regionserver/Server/Mutate_num_ops\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
+              "author": "ambari",
+              "description": "This widget shows all the read requests and write requests on all regions for a RegionServer",
+              "scope": "CLUSTER",
+              "properties": "{\"display_unit\":\"Requests\",\"graph_type\":\"LINE\",\"time_range\":\"86400000\"}",
+              "widget_name": "RS_READS_WRITES",
+              "widget_type": "GRAPH",
+              "time_created": 1428990958952,
+              "display_name": "RegionServer Reads and Writes",
+              "values": "[{\"name\":\"Read Requests\",\"value\":\"${regionserver.Server.Get_num_ops+regionserver.Server.ScanNext_num_ops}\"},{\"name\":\"Write Requests\",\"value\":\"${regionserver.Server.Append_num_ops+regionserver.Server.Delete_num_ops+regionserver.Server.Increment_num_ops+regionserver.Server.Mutate_num_ops}\"}]",
+              "cluster_name": "c1"
+            }
+          },
+          {
+            "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/30",
+            "WidgetInfo": {
+              "id": 30,
+              "metrics": "[{\"name\":\"regionserver.Server.Get_95th_percentile\",\"metric_path\":\"metrics/hbase/regionserver/Server/Get_95th_percentile\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.ScanNext_95th_percentile\",\"metric_path\":\"metrics/hbase/regionserver/Server/ScanNext_95th_percentile\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
+              "author": "ambari",
+              "description": "This widget shows 95th percentile of the read latency.",
+              "scope": "CLUSTER",
+              "properties": "{\"display_unit\":\"%\"}",
+              "widget_name": "READ_LATENCY_95",
+              "widget_type": "NUMBER",
+              "time_created": 1428990958952,
+              "display_name": "95% Read Latency",
+              "values": "[{\"name\":\"95% Read Latency\",\"value\":\"${regionserver.Server.Get_95th_percentile+regionserver.Server.ScanNext_95th_percentile}\"}]",
+              "cluster_name": "c1"
+            }
+          },
+          {
+            "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/31",
+            "WidgetInfo": {
+              "id": 31,
+              "metrics": "[{\"name\":\"regionserver.Server.Mutate_95th_percentile\",\"metric_path\":\"metrics/hbase/regionserver/Server/Mutate_95th_percentile\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Increment_95th_percentile\",\"metric_path\":\"metrics/hbase/regionserver/Server/Increment_95th_percentile\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Append_95th_percentile\",\"metric_path\":\"metrics/hbase/regionserver/Server/Append_95th_percentile\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"regionserver.Server.Delete_95th_percentile\",\"metric_path\":\"metrics/hbase/regionserver/Server/Delete_95th_percentile\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
+              "author": "ambari",
+              "description": "This widget shows 95th percentile of the write latency.",
+              "scope": "CLUSTER",
+              "properties": "{\"display_unit\":\"%\"}",
+              "widget_name": "WRITE_LATENCY_95",
+              "widget_type": "NUMBER",
+              "time_created": 1428990958952,
+              "display_name": "95% Write Latency",
+              "values": "[{\"name\":\"95% Write Latency\",\"value\":\"${regionserver.Server.Mutate_95th_percentile+regionserver.Server.Increment_95th_percentile+regionserver.Server.Append_95th_percentile+regionserver.Server.Delete_95th_percentile}\"}]",
+              "cluster_name": "c1"
+            }
+          },
+          {
+            "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/32",
+            "WidgetInfo": {
+              "id": 32,
+              "metrics": "[{\"name\":\"ipc.IPC.numOpenConnections\",\"metric_path\":\"metrics/hbase/ipc/IPC/numOpenConnections\",\"category\":\"\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
+              "author": "ambari",
+              "description": "This widget shows number of current open connections",
+              "scope": "CLUSTER",
+              "properties": "{\"display_unit\":\"Connections\",\"graph_type\":\"LINE\",\"time_range\":\"86400000\"}",
+              "widget_name": "OPEN_CONNECTIONS",
+              "widget_type": "GRAPH",
+              "time_created": 1428990958952,
+              "display_name": "Open Connections",
+              "values": "[{\"name\":\"Open Connections\",\"value\":\"${ipc.IPC.numOpenConnections}\"}]",
+              "cluster_name": "c1"
+            }
+          },
+          {
+            "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/33",
+            "WidgetInfo": {
+              "id": 33,
+              "metrics": "[{\"name\":\"ipc.IPC.numOpenConnections\",\"metric_path\":\"metrics/hbase/ipc/IPC/numOpenConnections\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"ipc.IPC.numCallsInGeneralQueue\",\"metric_path\":\"metrics/hbase/ipc/IPC/numOpenConnections\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
+              "author": "ambari",
+              "description": null,
+              "scope": "CLUSTER",
+              "properties": "{\"graph_type\":\"LINE\",\"time_range\":\"86400000\"}",
+              "widget_name": "ACTIVE_HANDLER",
+              "widget_type": "GRAPH",
+              "time_created": 1428990958952,
+              "display_name": "Active Handlers vs Calls in General Queue",
+              "values": "[{\"name\":\"Active Handlers\",\"value\":\"${ipc.IPC.numActiveHandler}\"},{\"name\":\"Calls in General Queue\",\"value\":\"${ipc.IPC.numCallsInGeneralQueue}\"}]",
+              "cluster_name": "c1"
+            }
+          },
+          {
+            "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/34",
+            "WidgetInfo": {
+              "id": 34,
+              "metrics": "[{\"name\":\"regionserver.Server.percentFilesLocal\",\"metric_path\":\"metrics/hbase/regionserver/percentFilesLocal\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
+              "author": "ambari",
+              "description": "This widget shows percentage of files local.",
+              "scope": "CLUSTER",
+              "properties": "{\"display_unit\":\"%\"}",
+              "widget_name": "FILES_LOCAL",
+              "widget_type": "NUMBER",
+              "time_created": 1428990958952,
+              "display_name": "Files Local",
+              "values": "[{\"name\":\"Files Local\",\"value\":\"${regionserver.Server.percentFilesLocal}\"}]",
+              "cluster_name": "c1"
+            }
+          },
+          {
+            "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/35",
+            "WidgetInfo": {
+              "id": 35,
+              "metrics": "[{\"name\":\"regionserver.Server.updatesBlockedTime\",\"metric_path\":\"metrics/hbase/regionserver/Server/updatesBlockedTime\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
+              "author": "ambari",
+              "description": "Updates Blocked Time",
+              "scope": "CLUSTER",
+              "properties": "{\"display_unit\":\"seconds\",\"graph_type\":\"LINE\",\"time_range\":\"86400000\"}",
+              "widget_name": "UPDATED_BLOCKED_TIME",
+              "widget_type": "GRAPH",
+              "time_created": 1428990958952,
+              "display_name": "Updates Blocked Time",
+              "values": "[{\"name\":\"Updated Blocked Time\",\"value\":\"${regionserver.Server.updatesBlockedTime}\"}]",
+              "cluster_name": "c1"
+            }
+          },
+          {
+            "href": "http://c6401.ambari.apache.org:8080/api/v1/clusters/c1/widgets/36",
+            "WidgetInfo": {
+              "id": 36,
+              "metrics": "[{\"name\":\"cpu_idle\",\"metric_path\":\"metrics/cpu/cpu_idle\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"disk_free\",\"metric_path\":\"metrics/disk/disk_free\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"pkts_in\",\"metric_path\":\"metrics/network/pkts_in\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"},{\"name\":\"pkts_out\",\"metric_path\":\"metrics/network/pkts_out\",\"service_name\":\"HBASE\",\"component_name\":\"HBASE_REGIONSERVER\"}]",
+              "author": "ambari",
+              "description": "ReqionServer widget for Host CPU, Network and Disk Utilization",
+              "scope": "CLUSTER",
+              "properties": "{\"graph_type\":\"LINE\",\"time_range\":\"86400000\"}",
+              "widget_name": "RS_HOST_METRICS",
+              "widget_type": "GRAPH",
+              "time_created": 1428990958952,
+              "display_name": "ReqionServer System Metrics",
+              "values": "[{\"name\":\"CPU Idle\",\"value\":\"${cpu_idle}\"},{\"name\":\"Disk Free\",\"value\":\"${disk_free}\"},{\"name\":\"Network Packets In/Out\",\"value\":\"${pkts_in + pkts_out}\"}]",
+              "cluster_name": "c1"
+            }
+          }
+        ]
+      }
     }
-  ],
-  "cluster_name": "c1",
-  "display_name": "Standard HBase Dashboard",
-  "id": 6,
-  "layout_name": "default_hbase_dashboard",
-  "scope": "CLUSTER",
-  "section_name": "HBASE_SUMMARY",
-  "user_name": "ambari"
+  ]
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/app/config.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/config.js b/ambari-web/app/config.js
index 140e7c3..27471fb 100644
--- a/ambari-web/app/config.js
+++ b/ambari-web/app/config.js
@@ -73,6 +73,7 @@ App.supports = {
   installGanglia: false,
   opsDuringRollingUpgrade: false,
   customizedWidgets: false,
+  customizedWidgetLayout: false,
   enhancedConfigs: false
 };
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/app/controllers/main/service/info/summary.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/info/summary.js b/ambari-web/app/controllers/main/service/info/summary.js
index 5a37bc3..ad27c2d 100644
--- a/ambari-web/app/controllers/main/service/info/summary.js
+++ b/ambari-web/app/controllers/main/service/info/summary.js
@@ -43,11 +43,28 @@ App.MainServiceInfoSummaryController = Em.Controller.extend({
   /**
    * UI section name
    */
-  sectionName: function() {
+  sectionName: function () {
     return this.get('content.serviceName') + "_SUMMARY";
   }.property('content.serviceName'),
 
   /**
+   * UI default layout name
+   */
+  defaultLayoutName: function () {
+    return "default_" + this.get('content.serviceName').toLowerCase() + "_dashboard";
+  }.property('content.serviceName'),
+
+  /**
+   * Does Service has widget descriptor defined in the stack
+   * @type {boolean}
+   */
+  isServiceWithEnhancedWidgets: function () {
+    var serviceName = this.get('content.serviceName');
+    var stackService = App.StackService.find().findProperty('serviceName', serviceName);
+    return stackService.get('isServiceWithWidgets') && App.supports.customizedWidgets;
+  }.property('content.serviceName'),
+
+  /**
    * Ranger plugins data
    * @type {array}
    */
@@ -252,7 +269,7 @@ App.MainServiceInfoSummaryController = Em.Controller.extend({
     return App.ModalPopup.show({
       header: Em.I18n.t('services.service.summary.alerts.popup.header').format(service.get('displayName')),
       autoHeight: false,
-      classNames: [ 'forty-percent-width-modal' ],
+      classNames: ['forty-percent-width-modal'],
       bodyClass: Em.View.extend({
         templateName: require('templates/main/service/info/service_alert_popup'),
         classNames: ['service-alerts'],
@@ -317,16 +334,28 @@ App.MainServiceInfoSummaryController = Em.Controller.extend({
   isMineWidgetsLoaded: false,
 
   /**
+   *  @Type {App.WidgetLayout}
+   */
+  activeWidgetLayout: {},
+
+
+  /**
    * @type {Em.A}
    */
-  widgets: function() {
-    return App.Widget.find().filterProperty('sectionName', this.get('content.serviceName') + '_SUMMARY');
+  widgets: function () {
+    if (this.get('isWidgetsLoaded')) {
+      if (this.get('activeWidgetLayout.widgets')) {
+        return this.get('activeWidgetLayout.widgets').toArray();
+      } else {
+        return  [];
+      }
+    }
   }.property('isWidgetsLoaded'),
 
   /**
    * @type {Em.A}
    */
-  widgetLayouts: function() {
+  widgetLayouts: function () {
     return App.WidgetLayout.find();
   }.property('isWidgetLayoutsLoaded'),
 
@@ -334,7 +363,7 @@ App.MainServiceInfoSummaryController = Em.Controller.extend({
    * load widget layouts across all users in CLUSTER scope
    * @returns {$.ajax}
    */
-  loadWidgetLayouts: function() {
+  loadWidgetLayouts: function () {
     this.set('isWidgetLayoutsLoaded', false);
     return App.ajax.send({
       name: 'widgets.layouts.get',
@@ -346,7 +375,7 @@ App.MainServiceInfoSummaryController = Em.Controller.extend({
     });
   },
 
-  loadWidgetLayoutsSuccessCallback: function(data) {
+  loadWidgetLayoutsSuccessCallback: function (data) {
     App.widgetLayoutMapper.map(data);
     this.set('isWidgetLayoutsLoaded', true);
   },
@@ -355,29 +384,35 @@ App.MainServiceInfoSummaryController = Em.Controller.extend({
    * load widgets defined by user
    * @returns {$.ajax}
    */
-  loadWidgets: function () {
+  loadActiveWidgetLayout: function () {
+    this.set('activeWidgetLayout', {});
     this.set('isWidgetsLoaded', false);
-    return App.ajax.send({
-      name: 'widgets.layout.userDefined.get',
-      sender: this,
-      data: {
-        loginName: App.router.get('loginName'),
-        sectionName: this.get('sectionName')
-      },
-      success: 'loadWidgetsSuccessCallback'
-    });
+    if (this.get('isServiceWithEnhancedWidgets')) {
+      return App.ajax.send({
+        name: 'widget.layout.get',
+        sender: this,
+        data: {
+          layoutName: this.get('defaultLayoutName'),
+          serviceName: this.get('content.serviceName')
+        },
+        success: 'loadActiveWidgetLayoutSuccessCallback'
+      });
+    } else {
+      this.set('isWidgetsLoaded', true);
+    }
   },
 
+
   /**
    * success callback of <code>loadWidgets()</code>
    * @param {object|null} data
    */
-  loadWidgetsSuccessCallback: function (data) {
+  loadActiveWidgetLayoutSuccessCallback: function (data) {
+    console.log("*******: " + data.items[0] );
     if (data.items[0]) {
-      App.widgetMapper.map(data.items[0], this.get('content.serviceName'));
+      App.widgetLayoutMapper.map(data.items[0]);
+      this.set('activeWidgetLayout', App.WidgetLayout.find().findProperty('layoutName', this.get('defaultLayoutName')));
       this.set('isWidgetsLoaded', true);
-    } else {
-      this.loadStackWidgetsLayout();
     }
   },
 
@@ -474,37 +509,12 @@ App.MainServiceInfoSummaryController = Em.Controller.extend({
   },
 
   /**
-   * load widgets defined by stack
-   * @returns {$.ajax}
-   */
-  loadStackWidgetsLayout: function () {
-    return App.ajax.send({
-      name: 'widgets.layout.stackDefined.get',
-      sender: this,
-      data: {
-        stackVersionURL: App.get('stackVersionURL'),
-        serviceName: this.get('content.serviceName')
-      },
-      success: 'loadStackWidgetsLayoutSuccessCallback'
-    });
-  },
-
-  /**
-   * success callback of <code>loadStackWidgetsLayout()</code>
-   * @param {object|null} data
-   */
-  loadStackWidgetsLayoutSuccessCallback: function (data) {
-    App.widgetMapper.map(data.artifact_data.layouts.findProperty('section_name', this.get('sectionName')), this.get('content.serviceName'));
-    this.set('isWidgetsLoaded', true);
-  },
-
-  /**
    * add widgets, on click handler for "Add"
    */
   addWidget: function (event) {
     var widget = event.context;
     var widgetName = widget.widgetName;
-    widget.set('added',!widget.added);
+    widget.set('added', !widget.added);
     // add current widget to current layout
 
   },
@@ -515,7 +525,7 @@ App.MainServiceInfoSummaryController = Em.Controller.extend({
   hideWidget: function (event) {
     var widget = event.context;
     var widgetName = widget.widgetName;
-    widget.set('added',!widget.added);
+    widget.set('added', !widget.added);
     // hide current widget from current layout
 
   },
@@ -659,10 +669,10 @@ App.MainServiceInfoSummaryController = Em.Controller.extend({
          * displaying content filtered by service name and status.
          */
         filteredContent: function () {
-          var activeService = this.get('activeService')? this.get('activeService'): this.get('controller.content.serviceName');
+          var activeService = this.get('activeService') ? this.get('activeService') : this.get('controller.content.serviceName');
           var result = [];
-          this.get('content').forEach(function(widget) {
-            if (widget.get('serviceName').indexOf(activeService) >= 0){
+          this.get('content').forEach(function (widget) {
+            if (widget.get('serviceName').indexOf(activeService) >= 0) {
               result.pushObject(widget);
             }
           });
@@ -689,7 +699,7 @@ App.MainServiceInfoSummaryController = Em.Controller.extend({
           isActive: function () {
             return this.get('item') == this.get('parentView.activeTab');
           }.property('item', 'parentView.activeTab'),
-          elementId: Ember.computed(function(){
+          elementId: Ember.computed(function () {
             var label = Em.get(this, 'templateData.keywords.category.label');
             return label ? 'widget-browser-view-tab-' + label.toLowerCase().replace(/\s/g, '-') : "";
           }),
@@ -717,7 +727,7 @@ App.MainServiceInfoSummaryController = Em.Controller.extend({
               value: service.get('serviceName'),
               label: service.get('displayName'),
               isActive: function () {
-                var activeService = view.get('activeService')? view.get('activeService'): view.get('controller.content.serviceName');
+                var activeService = view.get('activeService') ? view.get('activeService') : view.get('controller.content.serviceName');
                 return this.get('value') == activeService;
               }.property('value', 'view.activeService')
             })

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/app/mappers/stack_service_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/stack_service_mapper.js b/ambari-web/app/mappers/stack_service_mapper.js
index 612c62e..1af4bdf 100644
--- a/ambari-web/app/mappers/stack_service_mapper.js
+++ b/ambari-web/app/mappers/stack_service_mapper.js
@@ -103,7 +103,7 @@ App.stackServiceMapper = App.QuickDataMapper.create({
       }, this);
       stackService.stack_id = stackService.stack_name + '-' + stackService.stack_version;
       stackService.service_components = serviceComponents;
-      stackService.is_service_with_widgets = item.artifacts.someProperty('Artifacts.artifact_name', 'widget_descriptor');
+      stackService.is_service_with_widgets = item.artifacts.someProperty('Artifacts.artifact_name', 'widgets_descriptor');
       // @todo: replace with server response value after API implementation
       if (nonInstallableServices.contains(stackService.service_name)) {
         stackService.is_installable = false;

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/app/mappers/widget_layout_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/widget_layout_mapper.js b/ambari-web/app/mappers/widget_layout_mapper.js
index d46099d..7535f04 100644
--- a/ambari-web/app/mappers/widget_layout_mapper.js
+++ b/ambari-web/app/mappers/widget_layout_mapper.js
@@ -18,12 +18,52 @@
 
 
 App.widgetLayoutMapper = App.QuickDataMapper.create({
-  model: App.WidgetLayout,
-  config: {
-    id: 'widget_layouts.layout_name',
-    layout_name: 'widget_layouts.layout_name',
-    section_name: 'widget_layouts.section_name',
-    scope: 'widget_layouts.scope',
-    user: 'Users.user_name'
+  widgetLayoutModel: App.WidgetLayout,
+  widgetModel:  App.Widget,
+  widgetLayoutConfig: {
+    id: 'id',
+    layout_name: 'layout_name',
+    section_name: 'section_name',
+    scope: 'scope',
+    user: 'user_name',
+    display_name: 'display_name',
+    widgets_key: 'widgets',
+    widgets_type: 'array',
+    widgets: {
+      item: 'id'
+    }
+  },
+  widgetConfig: {
+    id: 'id',
+    widget_name: 'widget_name',
+    default_order: 'default_order',
+    widget_type: 'widget_type',
+    display_name: 'display_name',
+    time_created: 'time_created',
+    author: 'author',
+    properties: 'properties',
+    metrics: 'metrics',
+    values: 'values',
+    description: 'description',
+    scope: 'scope'
+  },
+
+
+  map: function(json) {
+    var modelWidget = this.widgetModel;
+    var modelWidgetLayout = this.widgetLayoutModel;
+
+    var resultWidget = [];
+    json.WidgetLayoutInfo.widgets.forEach(function(item, index) {
+      item = item.WidgetInfo;
+      item.metrics = JSON.parse(item.metrics);
+      item.values = JSON.parse(item.values);
+      resultWidget.push(this.parseIt(item, this.widgetConfig));
+      json.WidgetLayoutInfo.widgets[index] = item;
+    },this);
+
+    var resultWidgetLayout = this.parseIt(json.WidgetLayoutInfo, this.widgetLayoutConfig);
+    App.store.loadMany(modelWidget, resultWidget);
+    App.store.load(modelWidgetLayout, resultWidgetLayout);
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/6dae33e5/ambari-web/app/mappers/widget_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/widget_mapper.js b/ambari-web/app/mappers/widget_mapper.js
index c9b1aef..0498635 100644
--- a/ambari-web/app/mappers/widget_mapper.js
+++ b/ambari-web/app/mappers/widget_mapper.js
@@ -26,7 +26,6 @@ App.widgetMapper = App.QuickDataMapper.create({
     widget_type: 'widget_type',
     display_name: 'display_name',
     service_name: 'service_name',
-    component_name: 'component_name',
     section_name: 'section_name',
     time_created: 'time_created',
     author: 'author',
@@ -34,7 +33,7 @@ App.widgetMapper = App.QuickDataMapper.create({
     metrics: 'metrics',
     values: 'values',
     description: 'description',
-    is_visible: 'is_visible'
+    scope: 'scope'
   },
   map: function (json, serviceName) {
     //TODO add service name to user layout API response
@@ -47,7 +46,6 @@ App.widgetMapper = App.QuickDataMapper.create({
       json.widgetLayoutInfo.forEach(function (item, index) {
         item.service_name = serviceName;
         item.section_name = sectionName;
-        item.id = item.widget_name + "_" + (item.id || "0");     // user created widgets will have id as their primary id. stack created widgets will not have id and will have their widget_name as unique id
         item.default_order = (index + 1);
         result.push(this.parseIt(item, this.config));
       }, this);