You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tez.apache.org by sr...@apache.org on 2017/04/20 09:57:49 UTC

tez git commit: TEZ-3631. Tez UI: TEZ_DAG_EXTRA_INFO compatibility changes - Makes All DAGs page faster (sree)

Repository: tez
Updated Branches:
  refs/heads/master cadf31b5e -> 59f56a540


TEZ-3631. Tez UI: TEZ_DAG_EXTRA_INFO compatibility changes - Makes All DAGs page faster (sree)


Project: http://git-wip-us.apache.org/repos/asf/tez/repo
Commit: http://git-wip-us.apache.org/repos/asf/tez/commit/59f56a54
Tree: http://git-wip-us.apache.org/repos/asf/tez/tree/59f56a54
Diff: http://git-wip-us.apache.org/repos/asf/tez/diff/59f56a54

Branch: refs/heads/master
Commit: 59f56a5403dc8a34daa5f31aae50a407899fe910
Parents: cadf31b
Author: Sreenath Somarajapuram <sr...@apache.org>
Authored: Thu Apr 20 15:27:19 2017 +0530
Committer: Sreenath Somarajapuram <sr...@apache.org>
Committed: Thu Apr 20 15:27:19 2017 +0530

----------------------------------------------------------------------
 tez-ui/src/main/webapp/app/adapters/dag-info.js |  22 ++++
 .../app/components/home-table-controls.js       |  40 +++++++
 .../main/webapp/app/controllers/home/index.js   |   6 +-
 tez-ui/src/main/webapp/app/entities/entity.js   |  10 +-
 tez-ui/src/main/webapp/app/models/dag-info.js   |  28 +++++
 tez-ui/src/main/webapp/app/models/dag.js        |  30 +++--
 .../src/main/webapp/app/routes/dag/counters.js  |   3 +
 .../src/main/webapp/app/routes/dag/graphical.js |   3 +
 tez-ui/src/main/webapp/app/routes/dag/index.js  |   3 +
 .../src/main/webapp/app/routes/dag/swimlane.js  |   3 +
 tez-ui/src/main/webapp/app/routes/home/index.js |  18 +++
 .../src/main/webapp/app/serializers/dag-info.js |  60 ++++++++++
 tez-ui/src/main/webapp/app/serializers/dag.js   |  47 +-------
 tez-ui/src/main/webapp/app/styles/app.less      |   1 +
 .../webapp/app/styles/home-table-controls.less  |  22 ++++
 .../webapp/app/styles/queries-page-search.less  |   1 +
 tez-ui/src/main/webapp/app/styles/shared.less   |   6 +
 .../components/home-table-controls.hbs          |  24 ++++
 .../main/webapp/app/templates/home/index.hbs    |   1 +
 .../main/webapp/app/utils/download-dag-zip.js   |   9 ++
 .../src/main/webapp/config/default-app-conf.js  |   3 +-
 tez-ui/src/main/webapp/package.json             |   1 +
 .../components/home-table-controls-test.js      |  80 +++++++++++++
 .../webapp/tests/unit/adapters/dag-info-test.js |  30 +++++
 .../tests/unit/controllers/home/index-test.js   |   2 +-
 .../webapp/tests/unit/models/dag-info-test.js   |  35 ++++++
 .../main/webapp/tests/unit/models/dag-test.js   |  44 +++++++
 .../webapp/tests/unit/routes/home/index-test.js |  24 ++++
 .../tests/unit/serializers/dag-info-test.js     | 114 +++++++++++++++++++
 .../webapp/tests/unit/serializers/dag-test.js   |  26 ++---
 .../tests/unit/serializers/timeline-test.js     |   2 +
 31 files changed, 630 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/adapters/dag-info.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/adapters/dag-info.js b/tez-ui/src/main/webapp/app/adapters/dag-info.js
new file mode 100644
index 0000000..b47e05f
--- /dev/null
+++ b/tez-ui/src/main/webapp/app/adapters/dag-info.js
@@ -0,0 +1,22 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import TimelineAdapter from './timeline';
+
+export default TimelineAdapter.extend({
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/components/home-table-controls.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/components/home-table-controls.js b/tez-ui/src/main/webapp/app/components/home-table-controls.js
new file mode 100644
index 0000000..70c3863
--- /dev/null
+++ b/tez-ui/src/main/webapp/app/components/home-table-controls.js
@@ -0,0 +1,40 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+  classNames: ['home-table-controls'],
+
+  countersLoaded: Ember.computed("dataProcessor.processedRows.@each.counterGroupsHash", function () {
+    var processedRows = this.get("dataProcessor.processedRows"),
+        countersLoaded = true;
+    if(processedRows) {
+      countersLoaded = processedRows.some(function (row) {
+        return Object.keys(row.get("counterGroupsHash")).length !== 0;
+      });
+    }
+    return countersLoaded;
+  }),
+
+  actions: {
+    loadCounters: function () {
+      this.get('targetObject.targetObject').send('loadCounters');
+    }
+  }
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/controllers/home/index.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/controllers/home/index.js b/tez-ui/src/main/webapp/app/controllers/home/index.js
index 74050e3..5d8b290 100644
--- a/tez-ui/src/main/webapp/app/controllers/home/index.js
+++ b/tez-ui/src/main/webapp/app/controllers/home/index.js
@@ -52,7 +52,7 @@ export default TableController.extend({
   loadingMore: false,
 
   headerComponentNames: ['dags-page-search', 'table-controls', 'pagination-ui'],
-  footerComponentNames: ['pagination-ui'],
+  footerComponentNames: ['home-table-controls', 'pagination-ui'],
 
   _definition: TableDefinition.create(),
   // Using computed, as observer won't fire if the property is not used
@@ -89,7 +89,9 @@ export default TableController.extend({
       pageNum: this.get("pageNum"),
 
       moreAvailable: this.get("moreAvailable"),
-      loadingMore: this.get("loadingMore")
+      loadingMore: this.get("loadingMore"),
+
+      minRowsForFooter: 0
     });
 
     return definition;

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/entities/entity.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/entities/entity.js b/tez-ui/src/main/webapp/app/entities/entity.js
index c8f602b..22960b9 100644
--- a/tez-ui/src/main/webapp/app/entities/entity.js
+++ b/tez-ui/src/main/webapp/app/entities/entity.js
@@ -185,13 +185,21 @@ var Entity = Ember.Object.extend(NameMixin, {
 
     if(needs) {
       MoreObject.forEach(needs, function (name, needOptions) {
+        var loadNeed;
+
         needOptions = that.normalizeNeed(name, needOptions, parentModel, queryParams, urlParams);
 
         if(MoreObject.isFunction(needOptions.loadType)) {
           needOptions.loadType = needOptions.loadType.call(needOptions, parentModel);
         }
 
-        if(needOptions.loadType !== "demand") {
+        loadNeed = needOptions.loadType !== "demand";
+
+        if(options && options.demandNeeds) {
+          loadNeed = options.demandNeeds.indexOf(name) !== -1;
+        }
+
+        if(loadNeed) {
           let needLoader = that._loadNeed(loader, parentModel, needOptions, options);
 
           if(needOptions.loadType !== "lazy") {

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/models/dag-info.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/models/dag-info.js b/tez-ui/src/main/webapp/app/models/dag-info.js
new file mode 100644
index 0000000..38387b0
--- /dev/null
+++ b/tez-ui/src/main/webapp/app/models/dag-info.js
@@ -0,0 +1,28 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+
+import AMTimelineModel from './am-timeline';
+
+export default AMTimelineModel.extend({
+
+  dagPlan: DS.attr('object'),
+  callerData: DS.attr('object'),
+
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/models/dag.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/models/dag.js b/tez-ui/src/main/webapp/app/models/dag.js
index 2ab4af3..4ddec74 100644
--- a/tez-ui/src/main/webapp/app/models/dag.js
+++ b/tez-ui/src/main/webapp/app/models/dag.js
@@ -19,9 +19,9 @@
 import Ember from 'ember';
 import DS from 'ember-data';
 
-import AMTimelineModel from './am-timeline';
+import DAGInfoModel from './dag-info';
 
-export default AMTimelineModel.extend({
+export default DAGInfoModel.extend({
   needs: {
     am: {
       type: "dagAm",
@@ -49,6 +49,12 @@ export default AMTimelineModel.extend({
         }
       },
       silent: true
+    },
+    info: {
+      type: "dagInfo",
+      idKey: "entityID",
+      loadType: "demand",
+      silent: true
     }
   },
 
@@ -57,9 +63,9 @@ export default AMTimelineModel.extend({
   submitter: DS.attr("string"),
 
   // Serialize when required
-  vertices: DS.attr('object'),
-  edges: DS.attr('object'),
-  vertexGroups: DS.attr('object'),
+  vertices: Ember.computed.or("dagPlan.vertices", "info.dagPlan.vertices"),
+  edges: Ember.computed.or("dagPlan.edges", "info.dagPlan.edges"),
+  vertexGroups: Ember.computed.or("dagPlan.vertexGroups", "info.dagPlan.vertexGroups"),
 
   domain: DS.attr("string"),
   containerLogs: DS.attr("object"),
@@ -72,9 +78,17 @@ export default AMTimelineModel.extend({
   vertexNameIdMap: DS.attr("object"),
 
   callerID: DS.attr("string"),
-  callerContext: DS.attr("string"),
-  callerDescription: DS.attr("string"),
-  callerType: DS.attr("string"),
+  callerContext: Ember.computed.or("callerData.callerContext", "info.callerData.callerContext"),
+  callerDescription: Ember.computed.or("callerData.callerDescription", "info.callerData.callerDescription"),
+  callerType: Ember.computed.or("callerData.callerType", "info.callerData.callerType"),
 
   amWsVersion: DS.attr("string"),
+
+  info: DS.attr("object"),
+
+  counterGroupsHash: Ember.computed("am.counterGroupsHash", "_counterGroups", "info.counterGroupsHash", function () {
+    var amCounters = this.get("am.counterGroupsHash"),
+        atsCounters = this.get("info.counterGroupsHash") || this._super();
+    return amCounters ? Ember.$.extend({}, atsCounters, amCounters) : atsCounters;
+  })
 });

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/routes/dag/counters.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/routes/dag/counters.js b/tez-ui/src/main/webapp/app/routes/dag/counters.js
index be60c1d..a0a31b7 100644
--- a/tez-ui/src/main/webapp/app/routes/dag/counters.js
+++ b/tez-ui/src/main/webapp/app/routes/dag/counters.js
@@ -30,6 +30,9 @@ export default SingleAmPollsterRoute.extend({
   },
 
   load: function (value, query, options) {
+    options = Ember.$.extend({
+      demandNeeds: ["info"]
+    }, options);
     return this.get("loader").queryRecord('dag', this.modelFor("dag").get("id"), options);
   },
 

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/routes/dag/graphical.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/routes/dag/graphical.js b/tez-ui/src/main/webapp/app/routes/dag/graphical.js
index 69d2de4..81117d0 100644
--- a/tez-ui/src/main/webapp/app/routes/dag/graphical.js
+++ b/tez-ui/src/main/webapp/app/routes/dag/graphical.js
@@ -30,6 +30,9 @@ export default MultiAmPollsterRoute.extend({
   },
 
   load: function (value, query, options) {
+    options = Ember.$.extend({
+      demandNeeds: ["info", "dag"]
+    }, options);
     return this.get("loader").query('vertex', {
       dagID: this.modelFor("dag").get("id")
     }, options);

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/routes/dag/index.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/routes/dag/index.js b/tez-ui/src/main/webapp/app/routes/dag/index.js
index 0bf01b2..46c8b05 100644
--- a/tez-ui/src/main/webapp/app/routes/dag/index.js
+++ b/tez-ui/src/main/webapp/app/routes/dag/index.js
@@ -32,6 +32,9 @@ export default SingleAmPollsterRoute.extend({
   },
 
   load: function (value, query, options) {
+    options = Ember.$.extend({
+      demandNeeds: ["info"]
+    }, options);
     return this.get("loader").queryRecord('dag', this.modelFor("dag").get("id"), options);
   },
 

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/routes/dag/swimlane.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/routes/dag/swimlane.js b/tez-ui/src/main/webapp/app/routes/dag/swimlane.js
index c79b00c..780184c 100644
--- a/tez-ui/src/main/webapp/app/routes/dag/swimlane.js
+++ b/tez-ui/src/main/webapp/app/routes/dag/swimlane.js
@@ -30,6 +30,9 @@ export default MultiAmPollsterRoute.extend({
   },
 
   load: function (value, query, options) {
+    options = Ember.$.extend({
+      demandNeeds: ["info", "dag"]
+    }, options);
     return this.get("loader").query('vertex', {
       dagID: this.modelFor("dag").get("id")
     }, options);

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/routes/home/index.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/routes/home/index.js b/tez-ui/src/main/webapp/app/routes/home/index.js
index 0cdcc7c..da6da79 100644
--- a/tez-ui/src/main/webapp/app/routes/home/index.js
+++ b/tez-ui/src/main/webapp/app/routes/home/index.js
@@ -52,6 +52,8 @@ export default ServerSideOpsRoute.extend({
   entityType: "dag",
   loaderNamespace: "dags",
 
+  visibleRecords: [],
+
   setupController: function (controller, model) {
     this._super(controller, model);
     Ember.run.later(this, "startCrumbBubble");
@@ -104,5 +106,21 @@ export default ServerSideOpsRoute.extend({
       loader.unloadAll("ahs-app");
       this._super();
     },
+
+    loadCounters: function () {
+      var visibleRecords = this.get("visibleRecords").slice(),
+          loader = this.get("loader");
+
+      function loadInfoOfNextDAG() {
+        if(visibleRecords.length) {
+          loader.loadNeed(visibleRecords.shift(), "info").finally(loadInfoOfNextDAG);
+        }
+      }
+
+      loadInfoOfNextDAG();
+    },
+    tableRowsChanged: function (records) {
+      this.set("visibleRecords", records);
+    }
   }
 });

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/serializers/dag-info.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/serializers/dag-info.js b/tez-ui/src/main/webapp/app/serializers/dag-info.js
new file mode 100644
index 0000000..bba1d1b
--- /dev/null
+++ b/tez-ui/src/main/webapp/app/serializers/dag-info.js
@@ -0,0 +1,60 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+import TimelineSerializer from './timeline';
+
+export default TimelineSerializer.extend({
+  maps: {
+    dagPlan: 'otherinfo.dagPlan',
+    callerData: 'callerData',
+  },
+
+  normalizeResourceHash: function (resourceHash) {
+    var data = resourceHash.data,
+        callerData = {},
+        dagInfo = Ember.get(data, "otherinfo.dagPlan.dagInfo"), // New style, from TEZ-2851
+        dagContext = Ember.get(data, "otherinfo.dagPlan.dagContext"); // Old style
+
+    if(dagContext) {
+      callerData.callerContext = Ember.String.classify((Ember.get(dagContext, "context")||"").toLowerCase());
+      callerData.callerDescription = Ember.get(dagContext, "description");
+      callerData.callerType = Ember.get(dagContext, "callerType") || Ember.get(data, "otherinfo.callerType");
+    }
+    else if(dagInfo) {
+      let infoObj = {};
+      try{
+        infoObj = JSON.parse(dagInfo);
+      }catch(e){
+        infoObj = dagInfo;
+      }
+
+      callerData.callerContext = Ember.get(infoObj, "context") || Ember.get(data, "otherinfo.callerContext");
+      callerData.callerDescription = Ember.get(infoObj, "description") || Ember.get(dagInfo, "blob") || dagInfo;
+    }
+
+    data.callerData = callerData;
+
+    return resourceHash;
+  },
+
+  extractAttributes: function (modelClass, resourceHash) {
+    return this._super(modelClass, this.normalizeResourceHash(resourceHash));
+  },
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/serializers/dag.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/serializers/dag.js b/tez-ui/src/main/webapp/app/serializers/dag.js
index 04dbdd2..9b3edfc 100644
--- a/tez-ui/src/main/webapp/app/serializers/dag.js
+++ b/tez-ui/src/main/webapp/app/serializers/dag.js
@@ -19,7 +19,7 @@
 
 import Ember from 'ember';
 
-import TimelineSerializer from './timeline';
+import DAGInfoSerializer from './dag-info';
 
 var MoreObject = more.Object;
 
@@ -102,12 +102,14 @@ function getIdNameMap(source) {
   return idNameMap;
 }
 
-export default TimelineSerializer.extend({
+export default DAGInfoSerializer.extend({
   maps: {
     name: 'primaryfilters.dagName.0',
 
     submitter: 'primaryfilters.user.0',
 
+    callerID: 'primaryfilters.callerId.0',
+
     atsStatus: getStatus,
     // progress
 
@@ -115,10 +117,6 @@ export default TimelineSerializer.extend({
     endTime: getEndTime,
     // duration
 
-    vertices: 'otherinfo.dagPlan.vertices',
-    edges: 'otherinfo.dagPlan.edges',
-    vertexGroups: 'otherinfo.dagPlan.vertexGroups',
-
     // appID
     domain: 'domain',
 
@@ -129,41 +127,6 @@ export default TimelineSerializer.extend({
     vertexIdNameMap: getIdNameMap,
     vertexNameIdMap: 'otherinfo.vertexNameIdMapping',
 
-    callerID: 'primaryfilters.callerId.0',
-    callerContext: 'callerContext',
-    callerDescription: 'callerDescription',
-    callerType: 'callerType',
-
     amWsVersion: 'otherinfo.amWebServiceVersion',
-  },
-
-  normalizeResourceHash: function (resourceHash) {
-    var data = resourceHash.data,
-        dagInfo = Ember.get(resourceHash, "data.otherinfo.dagPlan.dagInfo"), // New style, from TEZ-2851
-        dagContext = Ember.get(resourceHash, "data.otherinfo.dagPlan.dagContext"); // Old style
-
-    if(dagContext) {
-      data.callerContext = Ember.String.classify((Ember.get(dagContext, "context")||"").toLowerCase());
-      data.callerDescription = Ember.get(dagContext, "description");
-      data.callerType = Ember.get(dagContext, "callerType");
-    }
-    else if(dagInfo) {
-      let infoObj = {};
-      try{
-        infoObj = JSON.parse(dagInfo);
-      }catch(e){
-        infoObj = dagInfo;
-      }
-
-      data.callerContext = Ember.get(infoObj, "context");
-      data.callerDescription = Ember.get(infoObj, "description") || Ember.get(dagInfo, "blob") || dagInfo;
-    }
-
-    return resourceHash;
-  },
-
-  extractAttributes: function (modelClass, resourceHash) {
-    return this._super(modelClass, this.normalizeResourceHash(resourceHash));
-  },
-
+  }
 });

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/styles/app.less
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/styles/app.less b/tez-ui/src/main/webapp/app/styles/app.less
index 2ad6449..7c66229 100644
--- a/tez-ui/src/main/webapp/app/styles/app.less
+++ b/tez-ui/src/main/webapp/app/styles/app.less
@@ -43,6 +43,7 @@
 @import "em-swimlane-vertex-name";
 @import "em-table-status-cell";
 @import "query-timeline";
+@import "home-table-controls";
 
 // Modals
 @import "column-selector";

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/styles/home-table-controls.less
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/styles/home-table-controls.less b/tez-ui/src/main/webapp/app/styles/home-table-controls.less
new file mode 100644
index 0000000..76d2a4d
--- /dev/null
+++ b/tez-ui/src/main/webapp/app/styles/home-table-controls.less
@@ -0,0 +1,22 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.home-table-controls {
+  display: inline-block;
+  margin-top: 10px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/styles/queries-page-search.less
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/styles/queries-page-search.less b/tez-ui/src/main/webapp/app/styles/queries-page-search.less
index a4a38ab..c279d7f 100644
--- a/tez-ui/src/main/webapp/app/styles/queries-page-search.less
+++ b/tez-ui/src/main/webapp/app/styles/queries-page-search.less
@@ -49,6 +49,7 @@
 
     label {
       margin-bottom: 2px;
+      .no-wrap;
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/styles/shared.less
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/styles/shared.less b/tez-ui/src/main/webapp/app/styles/shared.less
index 0fa7309..24da150 100644
--- a/tez-ui/src/main/webapp/app/styles/shared.less
+++ b/tez-ui/src/main/webapp/app/styles/shared.less
@@ -54,4 +54,10 @@ b {
   .em-progress-container {
     padding-top: 1px;
   }
+
+  .table-footer {
+    .pagination-ui {
+      margin-top: 10px;
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/templates/components/home-table-controls.hbs
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/templates/components/home-table-controls.hbs b/tez-ui/src/main/webapp/app/templates/components/home-table-controls.hbs
new file mode 100644
index 0000000..459ff22
--- /dev/null
+++ b/tez-ui/src/main/webapp/app/templates/components/home-table-controls.hbs
@@ -0,0 +1,24 @@
+{{!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+}}
+
+<button type="button"
+        class="btn btn-success {{if countersLoaded 'no-visible'}}"
+        {{action "loadCounters"}}
+        title="Load counter values for all the above rows. Please note that loading counters is a costly operation.">
+  Load Counters
+</button>

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/templates/home/index.hbs
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/templates/home/index.hbs b/tez-ui/src/main/webapp/app/templates/home/index.hbs
index e6f3aa0..ee68386 100644
--- a/tez-ui/src/main/webapp/app/templates/home/index.hbs
+++ b/tez-ui/src/main/webapp/app/templates/home/index.hbs
@@ -35,6 +35,7 @@
     search="search"
     loadPage="loadPage"
     reload="reload"
+    rowsChanged="tableRowsChanged"
   }}
   {{#if queue}}
     <div class="alert alert-info">

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/app/utils/download-dag-zip.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/utils/download-dag-zip.js b/tez-ui/src/main/webapp/app/utils/download-dag-zip.js
index 8f10bde..0af83ae 100644
--- a/tez-ui/src/main/webapp/app/utils/download-dag-zip.js
+++ b/tez-ui/src/main/webapp/app/utils/download-dag-zip.js
@@ -306,6 +306,15 @@ export default function downloadDagZip(dag, options) {
           retryCount: 3,
         },
         {
+          url: getUrl('TEZ_DAG_EXTRA_INFO', dagID),
+          context: { name: 'dag-extra-info', type: 'TEZ_DAG_EXTRA_INFO' },
+          onFetch: onFetch,
+          onRetry: onRetry,
+          onItemFetched: processSingleItem,
+          onItemFail: processFailure,
+          retryCount: 3,
+        },
+        {
           url: getUrl('TEZ_DAG_ID', dagID),
           context: { name: 'dag', type: 'TEZ_DAG_ID' },
           onFetch: onFetch,

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/config/default-app-conf.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/config/default-app-conf.js b/tez-ui/src/main/webapp/config/default-app-conf.js
index 1e38024..71c4ca7 100644
--- a/tez-ui/src/main/webapp/config/default-app-conf.js
+++ b/tez-ui/src/main/webapp/config/default-app-conf.js
@@ -46,7 +46,8 @@ module.exports = { // Tez App configurations
       task: 'TEZ_TASK_ID',
       attempt: 'TEZ_TASK_ATTEMPT_ID',
 
-      "hive-query": 'HIVE_QUERY_ID',
+      'dag-info': 'TEZ_DAG_EXTRA_INFO',
+      'hive-query': 'HIVE_QUERY_ID',
 
       app: 'TEZ_APPLICATION'
     },

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/package.json
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/package.json b/tez-ui/src/main/webapp/package.json
index 7c9e348..f4e30ff 100644
--- a/tez-ui/src/main/webapp/package.json
+++ b/tez-ui/src/main/webapp/package.json
@@ -12,6 +12,7 @@
     "build": "TMPDIR=tmp node ./node_modules/ember-cli/bin/ember build",
     "start": "TMPDIR=tmp node ./node_modules/ember-cli/bin/ember server",
     "test": "TMPDIR=tmp node ./node_modules/ember-cli/bin/ember test",
+    "test-serve": "TMPDIR=tmp node ./node_modules/ember-cli/bin/ember test --serve",
 
     "build:mvn": "TMPDIR=tmp node/node ./node_modules/ember-cli/bin/ember build -prod",
     "test:mvn": "TMPDIR=tmp node/node ./node_modules/ember-cli/bin/ember test"

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/tests/integration/components/home-table-controls-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/home-table-controls-test.js b/tez-ui/src/main/webapp/tests/integration/components/home-table-controls-test.js
new file mode 100644
index 0000000..ccce2db
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/integration/components/home-table-controls-test.js
@@ -0,0 +1,80 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+import Ember from 'ember';
+
+moduleForComponent('home-table-controls', 'Integration | Component | home table controls', {
+  integration: true
+});
+
+test('Basic creation test', function(assert) {
+  this.render(hbs`{{home-table-controls}}`);
+
+  assert.equal(this.$().text().trim(), 'Load Counters');
+  assert.equal(this.$().find("button").attr("class").split(" ").indexOf("no-visible"), 2);
+
+  // Template block usage:" + EOL +
+  this.render(hbs`
+    {{#home-table-controls}}
+      template block text
+    {{/home-table-controls}}
+  `);
+
+  assert.equal(this.$().text().trim(), 'Load Counters');
+});
+
+test('countersLoaded test', function(assert) {
+  this.set("dataProcessor", {
+    processedRows: [Ember.Object.create({
+      counterGroupsHash: {
+        counter: {}
+      }
+    }), Ember.Object.create({
+      counterGroupsHash: {
+        counter: {}
+      }
+    })]
+  });
+  this.render(hbs`{{home-table-controls dataProcessor=dataProcessor}}`);
+  assert.equal(this.$().find("button").attr("class").split(" ").indexOf("no-visible"), 2);
+
+  this.set("dataProcessor", {
+    processedRows: [Ember.Object.create({
+      counterGroupsHash: {}
+    }), Ember.Object.create({
+      counterGroupsHash: {
+        counter: {}
+      }
+    })]
+  });
+  this.render(hbs`{{home-table-controls dataProcessor=dataProcessor}}`);
+  assert.equal(this.$().find("button").attr("class").split(" ").indexOf("no-visible"), 2);
+
+  this.set("dataProcessor", {
+    processedRows: [Ember.Object.create({
+      counterGroupsHash: {}
+    }), Ember.Object.create({
+      counterGroupsHash: {}
+    })]
+  });
+  this.render(hbs`{{home-table-controls dataProcessor=dataProcessor}}`);
+  assert.equal(this.$().find("button").attr("class").split(" ").indexOf("no-visible"), -1);
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/tests/unit/adapters/dag-info-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/unit/adapters/dag-info-test.js b/tez-ui/src/main/webapp/tests/unit/adapters/dag-info-test.js
new file mode 100644
index 0000000..44eebcf
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/unit/adapters/dag-info-test.js
@@ -0,0 +1,30 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { moduleFor, test } from 'ember-qunit';
+
+moduleFor('adapter:dag-info', 'Unit | Adapter | dag info', {
+  // Specify the other units that are required for this test.
+  // needs: ['serializer:foo']
+});
+
+test('Basic creation test', function(assert) {
+  let adapter = this.subject();
+
+  assert.ok(adapter);
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/tests/unit/controllers/home/index-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/unit/controllers/home/index-test.js b/tez-ui/src/main/webapp/tests/unit/controllers/home/index-test.js
index a9e5ac1..0e3977a 100644
--- a/tez-ui/src/main/webapp/tests/unit/controllers/home/index-test.js
+++ b/tez-ui/src/main/webapp/tests/unit/controllers/home/index-test.js
@@ -47,7 +47,7 @@ test('Basic creation test', function(assert) {
   assert.ok(controller.queryParams);
   assert.ok(controller.headerComponentNames);
   assert.equal(controller.headerComponentNames.length, 3);
-  assert.equal(controller.footerComponentNames.length, 1);
+  assert.equal(controller.footerComponentNames.length, 2);
 
   assert.ok(controller._definition);
   assert.ok(controller.definition);

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/tests/unit/models/dag-info-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/unit/models/dag-info-test.js b/tez-ui/src/main/webapp/tests/unit/models/dag-info-test.js
new file mode 100644
index 0000000..f2ceca3
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/unit/models/dag-info-test.js
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { moduleForModel, test } from 'ember-qunit';
+
+moduleForModel('dag-info', 'Unit | Model | dag info', {
+  // Specify the other units that are required for this test.
+  needs: []
+});
+
+test('Basic creation test', function(assert) {
+  let model = this.subject();
+  // let store = this.store();
+  assert.ok(!!model);
+
+  assert.ok(model.dagPlan);
+  assert.ok(model.callerData);
+});
+
+

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/tests/unit/models/dag-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/unit/models/dag-test.js b/tez-ui/src/main/webapp/tests/unit/models/dag-test.js
index 06e0ec1..468c87f 100644
--- a/tez-ui/src/main/webapp/tests/unit/models/dag-test.js
+++ b/tez-ui/src/main/webapp/tests/unit/models/dag-test.js
@@ -35,6 +35,7 @@ test('Basic creation test', function(assert) {
 
     assert.ok(!!model);
     assert.ok(!!model.needs.am);
+    assert.ok(!!model.needs.info);
     assert.equal(model.get("queue"), testQueue);
   });
 
@@ -56,6 +57,10 @@ test('Basic creation test', function(assert) {
   assert.ok(model.callerDescription);
   assert.ok(model.callerType);
 
+  assert.ok(model.dagPlan);
+  assert.ok(model.callerData);
+  assert.ok(model.info);
+
   assert.ok(model.amWsVersion);
 });
 
@@ -95,3 +100,42 @@ test('queue test', function(assert) {
     assert.equal(model.get("queue"), queueName);
   });
 });
+
+test('vertices, edges & vertexGroups test', function(assert) {
+  let testVertices = {},
+      testEdges = {},
+      testVertexGroups = {},
+      model = this.subject({
+        dagPlan: {
+          vertices: testVertices,
+          edges: testEdges,
+          vertexGroups: testVertexGroups
+        }
+      });
+
+  assert.equal(model.get("vertices"), testVertices);
+  assert.equal(model.get("edges"), testEdges);
+  assert.equal(model.get("vertexGroups"), testVertexGroups);
+
+  Ember.run(function () {
+    testVertices = {};
+    testEdges = {};
+    testVertexGroups = {};
+
+    model.set("info", {
+      dagPlan: {
+        vertices: testVertices,
+        edges: testEdges,
+        vertexGroups: testVertexGroups
+      }
+    });
+    assert.notEqual(model.get("vertices"), testVertices);
+    assert.notEqual(model.get("edges"), testEdges);
+    assert.notEqual(model.get("vertexGroups"), testVertexGroups);
+
+    model.set("dagPlan", null);
+    assert.equal(model.get("vertices"), testVertices);
+    assert.equal(model.get("edges"), testEdges);
+    assert.equal(model.get("vertexGroups"), testVertexGroups);
+  });
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/tests/unit/routes/home/index-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/unit/routes/home/index-test.js b/tez-ui/src/main/webapp/tests/unit/routes/home/index-test.js
index d35a325..afe83cb 100644
--- a/tez-ui/src/main/webapp/tests/unit/routes/home/index-test.js
+++ b/tez-ui/src/main/webapp/tests/unit/routes/home/index-test.js
@@ -40,6 +40,8 @@ test('Basic creation test', function(assert) {
   assert.ok(route.filterRecords);
 
   assert.ok(route.actions.willTransition);
+  assert.ok(route.actions.loadCounters);
+  assert.ok(route.actions.tableRowsChanged);
 });
 
 test('refresh test', function(assert) {
@@ -162,3 +164,25 @@ test('actions.willTransition test', function(assert) {
   assert.expect(2);
   route.send("willTransition");
 });
+
+test('actions.loadCounters test', function(assert) {
+  let route = this.subject({
+        controller: Ember.Object.create()
+      }),
+      visibleRecords = [{}, {}, {}],
+      index = 0;
+
+  route.loader = {
+    loadNeed: function (record, name) {
+      assert.equal(record, visibleRecords[index++]);
+      assert.equal(name, "info");
+      return Ember.RSVP.resolve(record);
+    }
+  };
+  assert.expect(3 * 2);
+
+  route.send("loadCounters");
+
+  route.set("visibleRecords", visibleRecords);
+  route.send("loadCounters");
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/tests/unit/serializers/dag-info-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/unit/serializers/dag-info-test.js b/tez-ui/src/main/webapp/tests/unit/serializers/dag-info-test.js
new file mode 100644
index 0000000..b5c46f0
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/unit/serializers/dag-info-test.js
@@ -0,0 +1,114 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { moduleFor, test } from 'ember-qunit';
+
+moduleFor('serializer:dag-info', 'Unit | Serializer | dag info', {
+  // Specify the other units that are required for this test.
+  // needs: ['serializer:dag-info']
+});
+
+test('Basic creation test', function(assert) {
+  let serializer = this.subject();
+
+  assert.ok(serializer);
+
+  assert.ok(serializer.normalizeResourceHash);
+
+  assert.ok(serializer.maps.dagPlan);
+  assert.ok(serializer.maps.callerData);
+
+  assert.equal(Object.keys(serializer.get("maps")).length, 2 + 7); //2 own & 7 inherited
+});
+
+test('normalizeResourceHash test', function(assert) {
+  let serializer = this.subject(),
+
+      callerInfo = {
+        callerId: "id_1",
+        callerType: "HIVE_QUERY_ID",
+        context: "Hive",
+        description: "hive query"
+      },
+
+      data;
+
+  // dagContext test
+  data = serializer.normalizeResourceHash({
+    data: {
+      otherinfo: {
+        dagPlan: {
+          dagContext: callerInfo
+        }
+      }
+    }
+  }).data;
+
+  assert.equal(data.callerData.callerContext, callerInfo.context);
+  assert.equal(data.callerData.callerDescription, callerInfo.description);
+  assert.equal(data.callerData.callerType, callerInfo.callerType);
+
+  // dagInfo test
+  data = serializer.normalizeResourceHash({
+    data: {
+      otherinfo: {
+        dagPlan: {
+          dagInfo: `{"context": "${callerInfo.context}", "description": "${callerInfo.description}"}`
+        }
+      }
+    }
+  }).data;
+
+  assert.equal(data.callerData.callerContext, callerInfo.context);
+  assert.equal(data.callerData.callerDescription, callerInfo.description);
+  assert.notOk(data.callerData.callerType);
+
+  // dagInfo.blob test
+  data = serializer.normalizeResourceHash({
+    data: {
+      otherinfo: {
+        dagPlan: {
+          dagInfo: {
+            context: callerInfo.context,
+            blob: callerInfo.description
+          }
+        }
+      }
+    }
+  }).data;
+
+  assert.equal(data.callerData.callerContext, callerInfo.context);
+  assert.equal(data.callerData.callerDescription, callerInfo.description);
+  assert.notOk(data.callerData.callerType);
+
+  // dagContext have presidence over dagInfo
+  data = serializer.normalizeResourceHash({
+    data: {
+      otherinfo: {
+        dagPlan: {
+          dagContext: callerInfo,
+          dagInfo: `{"context": "RandomContext", "description": "RandomDesc"}`
+        }
+      }
+    }
+  }).data;
+
+  assert.equal(data.callerData.callerContext, callerInfo.context);
+  assert.equal(data.callerData.callerDescription, callerInfo.description);
+  assert.equal(data.callerData.callerType, callerInfo.callerType);
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/tests/unit/serializers/dag-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/unit/serializers/dag-test.js b/tez-ui/src/main/webapp/tests/unit/serializers/dag-test.js
index e782869..f57d1af 100644
--- a/tez-ui/src/main/webapp/tests/unit/serializers/dag-test.js
+++ b/tez-ui/src/main/webapp/tests/unit/serializers/dag-test.js
@@ -36,7 +36,7 @@ test('Basic creation test', function(assert) {
   assert.ok(serializer.maps.containerLogs);
   assert.ok(serializer.maps.vertexIdNameMap);
 
-  assert.equal(Object.keys(serializer.get("maps")).length, 18 + 5); //18 own & 7 inherited
+  assert.equal(Object.keys(serializer.get("maps")).length, 12 + 7); //12 own & 9 inherited (2 overwritten)
 });
 
 test('atsStatus test', function(assert) {
@@ -158,9 +158,9 @@ test('normalizeResourceHash test', function(assert) {
     }
   }).data;
 
-  assert.equal(data.callerContext, callerInfo.context);
-  assert.equal(data.callerDescription, callerInfo.description);
-  assert.equal(data.callerType, callerInfo.callerType);
+  assert.equal(data.callerData.callerContext, callerInfo.context);
+  assert.equal(data.callerData.callerDescription, callerInfo.description);
+  assert.equal(data.callerData.callerType, callerInfo.callerType);
 
   // dagInfo test
   data = serializer.normalizeResourceHash({
@@ -173,9 +173,9 @@ test('normalizeResourceHash test', function(assert) {
     }
   }).data;
 
-  assert.equal(data.callerContext, callerInfo.context);
-  assert.equal(data.callerDescription, callerInfo.description);
-  assert.notOk(data.callerType);
+  assert.equal(data.callerData.callerContext, callerInfo.context);
+  assert.equal(data.callerData.callerDescription, callerInfo.description);
+  assert.notOk(data.callerData.callerType);
 
   // dagInfo.blob test
   data = serializer.normalizeResourceHash({
@@ -191,9 +191,9 @@ test('normalizeResourceHash test', function(assert) {
     }
   }).data;
 
-  assert.equal(data.callerContext, callerInfo.context);
-  assert.equal(data.callerDescription, callerInfo.description);
-  assert.notOk(data.callerType);
+  assert.equal(data.callerData.callerContext, callerInfo.context);
+  assert.equal(data.callerData.callerDescription, callerInfo.description);
+  assert.notOk(data.callerData.callerType);
 
   // dagContext have presidence over dagInfo
   data = serializer.normalizeResourceHash({
@@ -207,7 +207,7 @@ test('normalizeResourceHash test', function(assert) {
     }
   }).data;
 
-  assert.equal(data.callerContext, callerInfo.context);
-  assert.equal(data.callerDescription, callerInfo.description);
-  assert.equal(data.callerType, callerInfo.callerType);
+  assert.equal(data.callerData.callerContext, callerInfo.context);
+  assert.equal(data.callerData.callerDescription, callerInfo.description);
+  assert.equal(data.callerData.callerType, callerInfo.callerType);
 });

http://git-wip-us.apache.org/repos/asf/tez/blob/59f56a54/tez-ui/src/main/webapp/tests/unit/serializers/timeline-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/unit/serializers/timeline-test.js b/tez-ui/src/main/webapp/tests/unit/serializers/timeline-test.js
index 3c267ad..8f39df7 100644
--- a/tez-ui/src/main/webapp/tests/unit/serializers/timeline-test.js
+++ b/tez-ui/src/main/webapp/tests/unit/serializers/timeline-test.js
@@ -29,6 +29,8 @@ test('Basic creation test', function(assert) {
   assert.ok(serializer);
   assert.ok(serializer.extractArrayPayload);
   assert.ok(serializer.maps);
+
+  assert.equal(Object.keys(serializer.get("maps")).length, 7);
 });
 
 test('extractArrayPayload test', function(assert) {