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 2016/02/24 23:35:10 UTC

[33/45] tez git commit: TEZ-3064. Tez UI 2: Add All DAGs filters (sree)

TEZ-3064. Tez UI 2: Add All DAGs filters (sree)


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

Branch: refs/heads/TEZ-2980
Commit: 7040bbda2c456cedb700d9d13c73589664ae327a
Parents: 5e4d542
Author: Sreenath Somarajapuram <sr...@apache.org>
Authored: Thu Jan 21 19:20:43 2016 +0530
Committer: Sreenath Somarajapuram <sr...@apache.org>
Committed: Thu Feb 25 03:32:52 2016 +0530

----------------------------------------------------------------------
 TEZ-2980-CHANGES.txt                            |  1 +
 .../src/main/webapp/app/adapters/timeline.js    |  7 +-
 .../webapp/app/components/dags-page-search.js   | 44 ++++++++++
 .../webapp/app/components/dags-pagination-ui.js | 92 ++++++++++++++++++++
 .../main/webapp/app/components/tab-n-refresh.js |  4 +-
 .../src/main/webapp/app/controllers/app/dags.js |  4 +-
 tez-ui2/src/main/webapp/app/controllers/dags.js | 39 ++++++++-
 tez-ui2/src/main/webapp/app/models/dag.js       |  2 +-
 tez-ui2/src/main/webapp/app/models/timeline.js  |  2 +-
 tez-ui2/src/main/webapp/app/routes/dags.js      | 62 +++++++++++--
 tez-ui2/src/main/webapp/app/serializers/dag.js  |  2 +-
 tez-ui2/src/main/webapp/app/styles/app.less     |  1 +
 .../webapp/app/styles/dags-page-search.less     | 50 +++++++++++
 .../main/webapp/app/styles/tab-n-refresh.less   |  2 +
 .../templates/components/dags-page-search.hbs   | 74 ++++++++++++++++
 .../templates/components/dags-pagination-ui.hbs | 27 ++++++
 .../app/templates/components/tab-n-refresh.hbs  |  8 +-
 tez-ui2/src/main/webapp/app/templates/dags.hbs  |  6 +-
 .../components/dags-page-search-test.js         | 45 ++++++++++
 .../components/dags-pagination-ui-test.js       | 47 ++++++++++
 .../webapp/tests/unit/controllers/dags-test.js  |  7 +-
 .../main/webapp/tests/unit/routes/dags-test.js  | 24 +++++
 22 files changed, 531 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/TEZ-2980-CHANGES.txt
----------------------------------------------------------------------
diff --git a/TEZ-2980-CHANGES.txt b/TEZ-2980-CHANGES.txt
index 6a2b343..e34c0fd 100644
--- a/TEZ-2980-CHANGES.txt
+++ b/TEZ-2980-CHANGES.txt
@@ -23,3 +23,4 @@ ALL CHANGES:
   TEZ-3043. Tez UI 2: Create configurations page
   TEZ-3049. Tez UI 2: Add column selector
   TEZ-3050. Tez UI 2: Add counter columns
+  TEZ-3064. Tez UI 2: Add All DAGs filters

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/adapters/timeline.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/adapters/timeline.js b/tez-ui2/src/main/webapp/app/adapters/timeline.js
index 6e06c7b..93e83cb 100644
--- a/tez-ui2/src/main/webapp/app/adapters/timeline.js
+++ b/tez-ui2/src/main/webapp/app/adapters/timeline.js
@@ -31,7 +31,12 @@ export default AbstractAdapter.extend({
     taskID: 'TEZ_TASK_ID',
     attemptID: 'TEZ_TASK_ATTEMPT_ID',
     hiveQueryID: 'HIVE_QUERY_ID',
-    appID: 'applicationId'
+    appID: 'applicationId',
+
+    dagName: 'dagName',
+    user: "user",
+    status: "status",
+    contextID: "callerId"
   },
 
   stringifyFilters: function (filters) {

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/components/dags-page-search.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/components/dags-page-search.js b/tez-ui2/src/main/webapp/app/components/dags-page-search.js
new file mode 100644
index 0000000..c9c01e3
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/components/dags-page-search.js
@@ -0,0 +1,44 @@
+/**
+ * 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: ['dags-page-search'],
+
+  actions: {
+    dagNameChanged: function (value) {
+      this.get('targetObject.targetObject').send('searchChanged', 'dagName', value);
+    },
+    dagIDChanged: function (value) {
+      this.get('targetObject.targetObject').send('searchChanged', 'dagID', value);
+    },
+    submitterChanged: function (value) {
+      this.get('targetObject.targetObject').send('searchChanged', 'submitter', value);
+    },
+    statusChanged: function (value) {
+      this.get('targetObject.targetObject').send('searchChanged', 'status', value);
+    },
+    appIDChanged: function (value) {
+      this.get('targetObject.targetObject').send('searchChanged', 'appID', value);
+    },
+    contextIDChanged: function (value) {
+      this.get('targetObject.targetObject').send('searchChanged', 'contextID', value);
+    },
+  }
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/components/dags-pagination-ui.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/components/dags-pagination-ui.js b/tez-ui2/src/main/webapp/app/components/dags-pagination-ui.js
new file mode 100644
index 0000000..bedb6cb
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/components/dags-pagination-ui.js
@@ -0,0 +1,92 @@
+/**
+ * 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({
+  tableDefinition: null,
+  dataProcessor: null,
+
+  classNames: ['pagination-ui'],
+  isVisible: Ember.computed.alias('tableDefinition.enablePagination'),
+
+  atFirst: Ember.computed('tableDefinition.pageNum', function () {
+    return this.get('tableDefinition.pageNum') === 1;
+  }),
+
+  atLast: Ember.computed('tableDefinition.pageNum', 'dataProcessor.totalPages', function () {
+    return this.get('tableDefinition.pageNum') === this.get('dataProcessor.totalPages');
+  }),
+
+  rowCountOptions: Ember.computed('tableDefinition.rowCountOptions', 'tableDefinition.rowCount', function () {
+    var options = this.get('tableDefinition.rowCountOptions'),
+        rowCount = this.get('tableDefinition.rowCount');
+
+    return options.map(function (option) {
+      return {
+        value: option,
+        selected: option === rowCount
+      };
+    });
+  }),
+
+  _possiblePages: Ember.computed('tableDefinition.pageNum', 'dataProcessor.totalPages', function () {
+    var pageNum = this.get('tableDefinition.pageNum'),
+        totalPages = this.get('dataProcessor.totalPages'),
+        possiblePages = [],
+        startPage = 1,
+        endPage = totalPages,
+        delta = 0;
+
+    if(totalPages > 5) {
+      startPage = pageNum - 2;
+      endPage = pageNum + 2;
+
+      if(startPage < 1) {
+        delta = 1 - startPage;
+      }
+      else if(endPage > totalPages) {
+        delta = totalPages - endPage;
+      }
+
+      startPage += delta;
+      endPage += delta;
+    }
+
+    while(startPage <= endPage) {
+      possiblePages.push({
+        isCurrent: startPage === pageNum,
+        pageNum: startPage++
+      });
+    }
+
+    return possiblePages;
+  }),
+
+  actions: {
+    rowSelected: function (value) {
+      value = parseInt(value);
+      if(this.get('tableDefinition.rowCount') !== value) {
+        this.get('parentView').send('rowChanged', value);
+      }
+    },
+    changePage: function (value) {
+      this.get('parentView').send('pageChanged', value);
+    }
+  }
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/components/tab-n-refresh.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/components/tab-n-refresh.js b/tez-ui2/src/main/webapp/app/components/tab-n-refresh.js
index 3f05371..555418e 100644
--- a/tez-ui2/src/main/webapp/app/components/tab-n-refresh.js
+++ b/tez-ui2/src/main/webapp/app/components/tab-n-refresh.js
@@ -24,13 +24,15 @@ export default Ember.Component.extend({
     this.setApplication();
   },
 
+  autoRefreshEnabled: true,
+
   setApplication: function () {
     var application = this.get("targetObject.container").lookup('controller:application');
     this.set("application", application);
   },
 
   normalizedTabs: Ember.computed("tabs", "application.currentPath", function () {
-    var tabs = this.get("tabs"),
+    var tabs = this.get("tabs") || [],
         activeRouteName = this.get("application.currentPath");
 
     return tabs.map(function (tab) {

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/controllers/app/dags.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/controllers/app/dags.js b/tez-ui2/src/main/webapp/app/controllers/app/dags.js
index 04f8f43..547c4ee 100644
--- a/tez-ui2/src/main/webapp/app/controllers/app/dags.js
+++ b/tez-ui2/src/main/webapp/app/controllers/app/dags.js
@@ -42,9 +42,9 @@ export default TablePageController.extend({
     headerTitle: 'Id',
     contentPath: 'entityID'
   },{
-    id: 'user',
+    id: 'submitter',
     headerTitle: 'Submitter',
-    contentPath: 'user'
+    contentPath: 'submitter'
   },{
     id: 'status',
     headerTitle: 'Status',

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/controllers/dags.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/controllers/dags.js b/tez-ui2/src/main/webapp/app/controllers/dags.js
index 7d5f1d9..d35d8f7 100644
--- a/tez-ui2/src/main/webapp/app/controllers/dags.js
+++ b/tez-ui2/src/main/webapp/app/controllers/dags.js
@@ -16,13 +16,41 @@
  * limitations under the License.
  */
 
+import Ember from 'ember';
+
 import TablePageController from './table-page';
 import ColumnDefinition from 'em-table/utils/column-definition';
+import TableDefinition from 'em-table/utils/table-definition';
 
 export default TablePageController.extend({
 
+  queryParams: ["dagName", "dagID", "submitter", "status", "appID", "contextID", "pageNo"],
+  dagName: "",
+  dagID: "",
+  submitter: "",
+  status: "",
+  appID: "",
+  contextID: "",
+  pageNo: 1,
+
   breadcrumbs: [],
 
+  headerComponentNames: ['dags-page-search', 'table-controls', 'dags-pagination-ui'],
+
+  definition: Ember.computed("dagName", "dagID", "submitter", "status", "appID", "contextID", "pageNo", function () {
+    return TableDefinition.create({
+      dagName: this.get("dagName"),
+      dagID: this.get("dagID"),
+      submitter: this.get("submitter"),
+      status: this.get("status"),
+      appID: this.get("appID"),
+      contextID: this.get("contextID"),
+
+      pageNum: this.get("pageNo"),
+      rowCountOptions: [5, 10, 25, 50, 100, 250, 500]
+    });
+  }),
+
   columns: ColumnDefinition.make([{
     id: 'name',
     headerTitle: 'Dag Name',
@@ -40,9 +68,9 @@ export default TablePageController.extend({
     headerTitle: 'Id',
     contentPath: 'entityID'
   },{
-    id: 'user',
+    id: 'submitter',
     headerTitle: 'Submitter',
-    contentPath: 'user'
+    contentPath: 'submitter'
   },{
     id: 'status',
     headerTitle: 'Status',
@@ -107,5 +135,12 @@ export default TablePageController.extend({
 
   getCounterColumns: function () {
     return this._super().concat(this.get('env.app.tables.defaultColumns.dagCounters'));
+  },
+
+  actions: {
+    searchChanged: function (propertyName, value) {
+      this.set(propertyName, value);
+    },
   }
+
 });

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/models/dag.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/models/dag.js b/tez-ui2/src/main/webapp/app/models/dag.js
index 2efb65f..e0a4b55 100644
--- a/tez-ui2/src/main/webapp/app/models/dag.js
+++ b/tez-ui2/src/main/webapp/app/models/dag.js
@@ -40,7 +40,7 @@ import TimelineModel from './timeline';
 export default TimelineModel.extend({
   name: DS.attr("string"),
 
-  user: DS.attr("string"),
+  submitter: DS.attr("string"),
   contextID: DS.attr("string"),
 
   domain: DS.attr("string"),

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/models/timeline.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/models/timeline.js b/tez-ui2/src/main/webapp/app/models/timeline.js
index 6f9ddb7..cdd8d22 100644
--- a/tez-ui2/src/main/webapp/app/models/timeline.js
+++ b/tez-ui2/src/main/webapp/app/models/timeline.js
@@ -67,7 +67,7 @@ export default AbstractModel.extend({
   counterGroups: DS.attr('object'),
   counterHash: Ember.computed("counterGroups", function () {
     var counterHash = {},
-        counterGroups = this.get("counterGroups");
+        counterGroups = this.get("counterGroups") || [];
 
     counterGroups.forEach(function (group) {
       var counters = group.counters,

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/routes/dags.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/routes/dags.js b/tez-ui2/src/main/webapp/app/routes/dags.js
index ecd1b00..b9484be 100644
--- a/tez-ui2/src/main/webapp/app/routes/dags.js
+++ b/tez-ui2/src/main/webapp/app/routes/dags.js
@@ -20,17 +20,33 @@ import Ember from 'ember';
 
 import AbstractRoute from './abstract';
 
+const REFRESH = {refreshModel: true};
+
 export default AbstractRoute.extend({
   title: "All DAGs",
 
   queryParams: {
-    rowCount: {
-      refreshModel: true
-    }
+    dagName: REFRESH,
+    dagID: REFRESH,
+    submitter: REFRESH,
+    status: REFRESH,
+    appID: REFRESH,
+    contextID: REFRESH,
+    pageNo: REFRESH,
+
+    rowCount: REFRESH,
   },
 
   loaderQueryParams: {
-    rowCount: "rowCount"
+    dagName: "dagName",
+    dagID: "dagID",
+    user: "submitter",
+    status: "status",
+    appID: "appID",
+    contextID: "contextID",
+
+    pageNo: "pageNo",
+    limit: "rowCount",
   },
 
   setupController: function (controller, model) {
@@ -38,7 +54,43 @@ export default AbstractRoute.extend({
     Ember.run.later(this, "startCrumbBubble");
   },
 
+  // Client side filtering to ensure that records are relevant after status correction
+  filterRecords: function (records, query) {
+    query = {
+      name: query.dagName,
+      entityID: query.dagID,
+      submitter: query.submitter,
+      status: query.status,
+      appID: query.appID,
+      contextID: query.contextID
+    };
+
+    return records.filter(function (record) {
+      for(var propName in query) {
+        if(query[propName] && query[propName] !== record.get(propName)) {
+          return false;
+        }
+      }
+      return true;
+    });
+  },
+
   load: function (value, query) {
-    return this.get("loader").query('dag', query);
+    var loader,
+        that = this;
+
+    if(query.dagID) {
+      that.set("loadedRecords", []);
+      loader = this.get("loader").queryRecord('dag', query.dagID).then(function (record) {
+        return [record];
+      });
+    }
+    else {
+      loader = this.get("loader").query('dag', query);
+    }
+
+    return loader.then(function (records) {
+      return that.filterRecords(records, query);
+    });
   }
 });

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/serializers/dag.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/serializers/dag.js b/tez-ui2/src/main/webapp/app/serializers/dag.js
index 00113e4..9da7bb5 100644
--- a/tez-ui2/src/main/webapp/app/serializers/dag.js
+++ b/tez-ui2/src/main/webapp/app/serializers/dag.js
@@ -106,7 +106,7 @@ export default TimelineSerializer.extend({
   maps: {
     name: 'primaryfilters.dagName.0',
 
-    user: 'primaryfilters.user.0',
+    submitter: 'primaryfilters.user.0',
     contextID: 'primaryfilters.callerId.0',
 
     atsStatus: getStatus,

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/styles/app.less
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/styles/app.less b/tez-ui2/src/main/webapp/app/styles/app.less
index d697ba7..758d1ab 100644
--- a/tez-ui2/src/main/webapp/app/styles/app.less
+++ b/tez-ui2/src/main/webapp/app/styles/app.less
@@ -22,6 +22,7 @@
 @import "tooltip";
 
 @import "tab-n-refresh";
+@import "dags-page-search";
 
 @import "page-layout";
 @import "details-page";

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/styles/dags-page-search.less
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/styles/dags-page-search.less b/tez-ui2/src/main/webapp/app/styles/dags-page-search.less
new file mode 100644
index 0000000..2fa0216
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/styles/dags-page-search.less
@@ -0,0 +1,50 @@
+/**
+ * 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.
+ */
+
+@media screen and (min-width: 1500px) {
+  .dags-page-search{
+    float: left;
+    width: 1000px;
+
+    .form-group {
+      margin-bottom: 0px;
+    }
+  }
+
+  .all-dags-table {
+    .pagination-ui, .table-controls {
+      margin-top: 21px;
+    }
+  }
+}
+
+.dags-page-search {
+  text-align: justify;
+
+
+  .search-element {
+    display: inline-block;
+    width: 16.66%;
+
+    padding-left: 3px;
+  }
+
+  .dag-name {
+    padding-left: 0px;
+  }
+}

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/styles/tab-n-refresh.less
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/styles/tab-n-refresh.less b/tez-ui2/src/main/webapp/app/styles/tab-n-refresh.less
index 698f8f3..ab930f2 100644
--- a/tez-ui2/src/main/webapp/app/styles/tab-n-refresh.less
+++ b/tez-ui2/src/main/webapp/app/styles/tab-n-refresh.less
@@ -22,6 +22,8 @@
   margin-bottom: 10px;
   position: relative;
 
+  height: 42px;
+
   .refresh-ui {
     position: absolute;
     right: 0px;

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/templates/components/dags-page-search.hbs
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/templates/components/dags-page-search.hbs b/tez-ui2/src/main/webapp/app/templates/components/dags-page-search.hbs
new file mode 100644
index 0000000..0c118e4
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/templates/components/dags-page-search.hbs
@@ -0,0 +1,74 @@
+{{!
+ * 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.
+}}
+
+<div class="form-group">
+  <div class="search-element dag-name">
+    <label for="pwd">DAG Name:</label>
+    <input
+        type="text"
+        class="form-control input-sm"
+        placeholder="Search..."
+        value={{tableDefinition.dagName}}
+        onchange={{action "dagNameChanged" value="target.value"}}>
+  </div><div class="search-element">
+    <label for="pwd">ID:</label>
+    <input
+        type="text"
+        class="form-control input-sm"
+        placeholder="Search..."
+        value={{tableDefinition.dagID}}
+        onchange={{action "dagIDChanged" value="target.value"}}>
+  </div><div class="search-element">
+    <label for="pwd">Submitter:</label>
+    <input
+        type="text"
+        class="form-control input-sm"
+        placeholder="Search..."
+        value={{tableDefinition.submitter}}
+        onchange={{action "submitterChanged" value="target.value"}}>
+  </div><div class="search-element">
+    <label for="pwd">Status:</label>
+    <select
+        class="form-control input-sm"
+        value={{tableDefinition.status}}
+        onchange={{action "statusChanged" value="target.value"}}>
+      <option value="">All</option>
+      <option value="SUBMITTED">Submitted</option>
+      <option value="RUNNING">Running</option>
+      <option value="SUCCEEDED">Succeeded</option>
+      <option value="FAILED">Failed</option>
+      <option value="ERROR">Error</option>
+    </select>
+  </div><div class="search-element">
+    <label for="pwd">Application ID:</label>
+    <input
+        type="text"
+        class="form-control input-sm"
+        placeholder="Search..."
+        value={{tableDefinition.appID}}
+        onchange={{action "appIDChanged" value="target.value"}}>
+  </div><div class="search-element">
+    <label for="pwd">Context ID:</label>
+    <input
+        type="text"
+        class="form-control input-sm"
+        placeholder="Search..."
+        value={{tableDefinition.contextID}}
+        onchange={{action "contextIDChanged" value="target.value"}}>
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/templates/components/dags-pagination-ui.hbs
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/templates/components/dags-pagination-ui.hbs b/tez-ui2/src/main/webapp/app/templates/components/dags-pagination-ui.hbs
new file mode 100644
index 0000000..60b3bee
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/templates/components/dags-pagination-ui.hbs
@@ -0,0 +1,27 @@
+{{!
+ * 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.
+}}
+
+<div class='row-select'>
+  <select class="form-control" onchange={{action "rowSelected" value="target.value"}}>
+    {{#each rowCountOptions as |option|}}
+      <option value={{option.value}} selected={{option.selected}}>
+        {{option.value}} Rows
+      </option>
+    {{/each}}
+  </select>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/templates/components/tab-n-refresh.hbs
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/templates/components/tab-n-refresh.hbs b/tez-ui2/src/main/webapp/app/templates/components/tab-n-refresh.hbs
index 4075c54..6b9c822 100644
--- a/tez-ui2/src/main/webapp/app/templates/components/tab-n-refresh.hbs
+++ b/tez-ui2/src/main/webapp/app/templates/components/tab-n-refresh.hbs
@@ -26,9 +26,11 @@
   {{/each}}
   <span class="refresh-ui">
     <span class="text-elements">
-      {{input type="checkbox" name="autoEnabled" checked=autoEnabled}}
-      Auto Refresh
-      <br/>
+      <span class="auto-refresh {{unless autoRefreshEnabled 'no-visible'}}">
+        {{input type="checkbox" name="autoEnabled" checked=autoEnabled}}
+        Auto Refresh
+        <br/>
+      </span>
       {{#if displayTime}}
         Last refreshed at <b>{{displayTime}}</b>
       {{else}}

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/app/templates/dags.hbs
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/templates/dags.hbs b/tez-ui2/src/main/webapp/app/templates/dags.hbs
index 1fd0eef..3e64a7e 100644
--- a/tez-ui2/src/main/webapp/app/templates/dags.hbs
+++ b/tez-ui2/src/main/webapp/app/templates/dags.hbs
@@ -16,15 +16,19 @@
  * limitations under the License.
 }}
 
+{{tab-n-refresh tabs=tabs autoRefreshEnabled=false}}
+
 {{#if loaded}}
   {{em-table
     columns=visibleColumns
     rows=model
     rowCount=rowCount
 
+    classNames="all-dags-table"
+
     headerComponentNames=headerComponentNames
 
-    enableSearch=false
+    definition=definition
     enableSort=false
 
     searchAction="searchChanged"

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/tests/integration/components/dags-page-search-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/integration/components/dags-page-search-test.js b/tez-ui2/src/main/webapp/tests/integration/components/dags-page-search-test.js
new file mode 100644
index 0000000..def7413
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/integration/components/dags-page-search-test.js
@@ -0,0 +1,45 @@
+/**
+ * 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';
+
+moduleForComponent('dags-page-search', 'Integration | Component | dags page search', {
+  integration: true
+});
+
+test('Basic creation test', function(assert) {
+
+  // Set any properties with this.set('myProperty', 'value');
+  // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL +
+
+  this.render(hbs`{{dags-page-search}}`);
+
+  assert.equal(this.$("input").length, 5);
+  assert.equal(this.$("select").length, 1);
+
+  // Template block usage:" + EOL +
+  this.render(hbs`
+    {{#dags-page-search}}
+      template block text
+    {{/dags-page-search}}
+  `);
+
+  assert.equal(this.$("input").length, 5);
+  assert.equal(this.$("select").length, 1);
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/tests/integration/components/dags-pagination-ui-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/integration/components/dags-pagination-ui-test.js b/tez-ui2/src/main/webapp/tests/integration/components/dags-pagination-ui-test.js
new file mode 100644
index 0000000..b4c192a
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/integration/components/dags-pagination-ui-test.js
@@ -0,0 +1,47 @@
+/**
+ * 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';
+
+moduleForComponent('dags-pagination-ui', 'Integration | Component | dags pagination ui', {
+  integration: true
+});
+
+test('Basic creation test', function(assert) {
+
+  // Set any properties with this.set('myProperty', 'value');
+  // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL +
+
+  this.set("rowCountOptions", {
+    rowCountOptions: [1, 2]
+  });
+
+  this.render(hbs`{{dags-pagination-ui rowCountOptions=rowCountOptions}}`);
+
+  assert.equal(this.$('select').length, 1);
+
+  // Template block usage:" + EOL +
+  this.render(hbs`
+    {{#dags-pagination-ui rowCountOptions=rowCountOptions}}
+      template block text
+    {{/dags-pagination-ui}}
+  `);
+
+  assert.equal(this.$('select').length, 1);
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/tests/unit/controllers/dags-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/controllers/dags-test.js b/tez-ui2/src/main/webapp/tests/unit/controllers/dags-test.js
index 21dbc96..996dd39 100644
--- a/tez-ui2/src/main/webapp/tests/unit/controllers/dags-test.js
+++ b/tez-ui2/src/main/webapp/tests/unit/controllers/dags-test.js
@@ -26,7 +26,7 @@ moduleFor('controller:dags', 'Unit | Controller | dags', {
 });
 
 test('Basic creation test', function(assert) {
-  assert.expect(2 + 3);
+  assert.expect(2 + 3 + 4);
 
   let controller = this.subject({
     initVisibleColumns: Ember.K,
@@ -39,4 +39,9 @@ test('Basic creation test', function(assert) {
   assert.ok(controller);
   assert.ok(controller.columns);
   assert.ok(controller.getCounterColumns);
+
+  assert.ok(controller.queryParams);
+  assert.ok(controller.headerComponentNames);
+  assert.ok(controller.definition);
+  assert.ok(controller.actions.searchChanged);
 });

http://git-wip-us.apache.org/repos/asf/tez/blob/7040bbda/tez-ui2/src/main/webapp/tests/unit/routes/dags-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/routes/dags-test.js b/tez-ui2/src/main/webapp/tests/unit/routes/dags-test.js
index 8b99a7f..baadf16 100644
--- a/tez-ui2/src/main/webapp/tests/unit/routes/dags-test.js
+++ b/tez-ui2/src/main/webapp/tests/unit/routes/dags-test.js
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+import Ember from 'ember';
 import { moduleFor, test } from 'ember-qunit';
 
 moduleFor('route:dags', 'Unit | Route | dags', {
@@ -28,7 +29,30 @@ test('Basic creation test', function(assert) {
 
   assert.ok(route);
   assert.ok(route.title);
+
+  assert.ok(route.queryParams);
   assert.ok(route.loaderQueryParams);
   assert.ok(route.setupController);
   assert.ok(route.load);
+
+  assert.ok(route.filterRecords);
+});
+
+test('filterRecords test', function(assert) {
+  let route = this.subject(),
+      testRecords = [Ember.Object.create({
+        name: "test"
+      }), Ember.Object.create({
+
+      }),Ember.Object.create({
+        name: "notest"
+      })],
+      testQuery = {
+        dagName: "test"
+      };
+
+  let filteredRecords = route.filterRecords(testRecords, testQuery);
+
+  assert.equal(filteredRecords.length, 1);
+  assert.equal(filteredRecords[0].name, "test");
 });