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:34:56 UTC

[19/45] tez git commit: TEZ-3040. Tez UI 2: Create Vertex details page & sub tables (sree)

TEZ-3040. Tez UI 2: Create Vertex details page & sub tables (sree)


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

Branch: refs/heads/TEZ-2980
Commit: 68dc2f5de7eba7fbfe5c4403befdf8bfb2418b00
Parents: a1c3622
Author: Sreenath Somarajapuram <sr...@apache.org>
Authored: Tue Jan 19 00:23:31 2016 +0530
Committer: Sreenath Somarajapuram <sr...@apache.org>
Committed: Thu Feb 25 03:32:15 2016 +0530

----------------------------------------------------------------------
 TEZ-2980-CHANGES.txt                            |   1 +
 tez-ui2/src/main/webapp/app/controllers/dag.js  |   4 +-
 .../main/webapp/app/controllers/dag/attempts.js |  12 +-
 .../main/webapp/app/controllers/dag/tasks.js    |  10 +-
 .../main/webapp/app/controllers/dag/vertices.js |  12 ++
 .../src/main/webapp/app/controllers/vertex.js   |  49 +++++++
 .../webapp/app/controllers/vertex/attempts.js   |  77 +++++++++++
 .../main/webapp/app/controllers/vertex/index.js |  22 ++++
 .../main/webapp/app/controllers/vertex/tasks.js |  65 ++++++++++
 tez-ui2/src/main/webapp/app/models/vertex.js    |  20 ++-
 tez-ui2/src/main/webapp/app/router.js           |   4 +
 .../src/main/webapp/app/routes/dag/attempts.js  |   2 +-
 tez-ui2/src/main/webapp/app/routes/vertex.js    |  31 +++++
 .../main/webapp/app/routes/vertex/attempts.js   |  35 +++++
 .../src/main/webapp/app/routes/vertex/index.js  |  33 +++++
 .../src/main/webapp/app/routes/vertex/tasks.js  |  35 +++++
 .../src/main/webapp/app/serializers/vertex.js   |  11 +-
 .../src/main/webapp/app/styles/page-layout.less |   5 +-
 .../src/main/webapp/app/templates/dag/index.hbs |  97 +++++++-------
 .../src/main/webapp/app/templates/vertex.hbs    |  20 +++
 .../webapp/app/templates/vertex/attempts.hbs    |  33 +++++
 .../main/webapp/app/templates/vertex/index.hbs  | 130 +++++++++++++++++++
 .../main/webapp/app/templates/vertex/tasks.hbs  |  33 +++++
 .../tests/unit/controllers/vertex-test.js       |  36 +++++
 .../unit/controllers/vertex/attempts-test.js    |  36 +++++
 .../tests/unit/controllers/vertex/index-test.js |  34 +++++
 .../tests/unit/controllers/vertex/tasks-test.js |  36 +++++
 .../webapp/tests/unit/routes/vertex-test.js     |  32 +++++
 .../tests/unit/routes/vertex/attempts-test.js   |  45 +++++++
 .../tests/unit/routes/vertex/index-test.js      |  45 +++++++
 .../tests/unit/routes/vertex/tasks-test.js      |  45 +++++++
 31 files changed, 987 insertions(+), 63 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/TEZ-2980-CHANGES.txt
----------------------------------------------------------------------
diff --git a/TEZ-2980-CHANGES.txt b/TEZ-2980-CHANGES.txt
index 372369a..3389c46 100644
--- a/TEZ-2980-CHANGES.txt
+++ b/TEZ-2980-CHANGES.txt
@@ -15,3 +15,4 @@ ALL CHANGES:
   TEZ-2986. Tez UI 2: Implement All DAGs page
   TEZ-3038. Tez UI 2: Create DAG details page
   TEZ-3039. Tez UI 2: Create all sub-pages for DAG
+  TEZ-3040. Tez UI 2: Create Vertex details page & sub tables

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/controllers/dag.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/controllers/dag.js b/tez-ui2/src/main/webapp/app/controllers/dag.js
index f54d8cf..732a0df 100644
--- a/tez-ui2/src/main/webapp/app/controllers/dag.js
+++ b/tez-ui2/src/main/webapp/app/controllers/dag.js
@@ -25,7 +25,7 @@ export default AbstractController.extend({
     var name = this.get("model.name");
 
     return [{
-      text: `DAG [${name}]`,
+      text: `DAG [ ${name} ]`,
       routeName: "dag.index",
       model: this.get("model.entityID")
     }];
@@ -41,7 +41,7 @@ export default AbstractController.extend({
     text: "All Tasks",
     routeName: "dag.tasks"
   }, {
-    text: "All Attempts",
+    text: "All Task Attempts",
     routeName: "dag.attempts"
   }]
 });

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/controllers/dag/attempts.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/controllers/dag/attempts.js b/tez-ui2/src/main/webapp/app/controllers/dag/attempts.js
index 1ffc00c..c2e3950 100644
--- a/tez-ui2/src/main/webapp/app/controllers/dag/attempts.js
+++ b/tez-ui2/src/main/webapp/app/controllers/dag/attempts.js
@@ -21,7 +21,7 @@ import ColumnDefinition from 'em-table/utils/column-definition';
 
 export default TablePageController.extend({
   breadcrumbs: [{
-    text: "All Attempts",
+    text: "All Task Attempts",
     routeName: "dag.attempts",
   }],
 
@@ -36,7 +36,15 @@ export default TablePageController.extend({
   },{
     id: 'vertexName',
     headerTitle: 'Vertex Index',
-    contentPath: 'vertexName'
+    contentPath: 'vertexName',
+    cellComponentName: 'em-table-linked-cell',
+    getCellContent: function (row) {
+      return {
+        routeName: "vertex",
+        model: row.get("vertexID"),
+        text: row.get("vertexName")
+      };
+    }
   },{
     id: 'status',
     headerTitle: 'Status',

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/controllers/dag/tasks.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/controllers/dag/tasks.js b/tez-ui2/src/main/webapp/app/controllers/dag/tasks.js
index 7c91deb..4721b81 100644
--- a/tez-ui2/src/main/webapp/app/controllers/dag/tasks.js
+++ b/tez-ui2/src/main/webapp/app/controllers/dag/tasks.js
@@ -32,7 +32,15 @@ export default TablePageController.extend({
   },{
     id: 'vertexName',
     headerTitle: 'Vertex Name',
-    contentPath: 'vertexName'
+    contentPath: 'vertexName',
+    cellComponentName: 'em-table-linked-cell',
+    getCellContent: function (row) {
+      return {
+        routeName: "vertex",
+        model: row.get("vertexID"),
+        text: row.get("vertexName")
+      };
+    }
   },{
     id: 'status',
     headerTitle: 'Status',

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/controllers/dag/vertices.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/controllers/dag/vertices.js b/tez-ui2/src/main/webapp/app/controllers/dag/vertices.js
index 7bdc229..b20a558 100644
--- a/tez-ui2/src/main/webapp/app/controllers/dag/vertices.js
+++ b/tez-ui2/src/main/webapp/app/controllers/dag/vertices.js
@@ -29,6 +29,14 @@ export default TablePageController.extend({
     id: 'name',
     headerTitle: 'Vertex Name',
     contentPath: 'name',
+    cellComponentName: 'em-table-linked-cell',
+    getCellContent: function (row) {
+      return {
+        routeName: "vertex",
+        model: row.get("entityID"),
+        text: row.get("name")
+      };
+    }
   },{
     id: 'entityID',
     headerTitle: 'Vertex Id',
@@ -73,6 +81,10 @@ export default TablePageController.extend({
      type: 'date'
     }
   },{
+    id: 'totalTasks',
+    headerTitle: 'Tasks',
+    contentPath: 'totalTasks',
+  },{
     id: 'processorClassName',
     headerTitle: 'Processor Class',
     contentPath: 'processorClassName',

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/controllers/vertex.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/controllers/vertex.js b/tez-ui2/src/main/webapp/app/controllers/vertex.js
new file mode 100644
index 0000000..946eaa5
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/controllers/vertex.js
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+import AbstractController from './abstract';
+
+export default AbstractController.extend({
+  breadcrumbs: Ember.computed("model.dag", function () {
+    var dagName = this.get("model.dag.name"),
+        vertexName = this.get("model.name");
+
+    return [{
+      text: `DAG [ ${dagName} ]`,
+      routeName: "dag.index",
+      model: this.get("model.dagID")
+    },{
+      text: `Vertex [ ${vertexName} ]`,
+      routeName: "vertex.index",
+      model: this.get("model.vertexID")
+    }];
+  }),
+
+  tabs: [{
+    text: "Vertex Details",
+    routeName: "vertex.index"
+  }, {
+    text: "Tasks",
+    routeName: "vertex.tasks"
+  }, {
+    text: "Task Attempts",
+    routeName: "vertex.attempts"
+  }]
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/controllers/vertex/attempts.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/controllers/vertex/attempts.js b/tez-ui2/src/main/webapp/app/controllers/vertex/attempts.js
new file mode 100644
index 0000000..61a6a63
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/controllers/vertex/attempts.js
@@ -0,0 +1,77 @@
+/**
+ * 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 TablePageController from '../table-page';
+import ColumnDefinition from 'em-table/utils/column-definition';
+
+export default TablePageController.extend({
+  breadcrumbs: [{
+    text: "Task Attempts",
+    routeName: "vertex.attempts",
+  }],
+
+  columns: ColumnDefinition.make([{
+    id: 'index',
+    headerTitle: 'Attempt No',
+    contentPath: 'index'
+  },{
+    id: 'taskIndex',
+    headerTitle: 'Task Index',
+    contentPath: 'taskIndex'
+  },{
+    id: 'status',
+    headerTitle: 'Status',
+    contentPath: 'status',
+    cellComponentName: 'em-table-status-cell'
+  },{
+    id: 'progress',
+    headerTitle: 'Progress',
+    contentPath: 'progress',
+    cellComponentName: 'em-table-progress-cell',
+    observePath: true
+  },{
+    id: 'startTime',
+    headerTitle: 'Start Time',
+    contentPath: 'startTime',
+    cellDefinition: {
+      type: 'date'
+    }
+  },{
+    id: 'endTime',
+    headerTitle: 'End Time',
+    contentPath: 'endTime',
+    cellDefinition: {
+      type: 'date'
+    }
+  },{
+    id: 'duration',
+    headerTitle: 'Duration',
+    contentPath: 'duration',
+    cellDefinition: {
+      type: 'duration'
+    }
+  },{
+    id: 'containerID',
+    headerTitle: 'Container',
+    contentPath: 'containerID'
+  },{
+    id: 'nodeID',
+    headerTitle: 'Node',
+    contentPath: 'nodeID'
+  }])
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/controllers/vertex/index.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/controllers/vertex/index.js b/tez-ui2/src/main/webapp/app/controllers/vertex/index.js
new file mode 100644
index 0000000..9745328
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/controllers/vertex/index.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 PageController from '../page';
+
+export default PageController.extend({
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/controllers/vertex/tasks.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/controllers/vertex/tasks.js b/tez-ui2/src/main/webapp/app/controllers/vertex/tasks.js
new file mode 100644
index 0000000..ce67150
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/controllers/vertex/tasks.js
@@ -0,0 +1,65 @@
+/**
+ * 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 TablePageController from '../table-page';
+import ColumnDefinition from 'em-table/utils/column-definition';
+
+export default TablePageController.extend({
+  breadcrumbs: [{
+    text: "Tasks",
+    routeName: "vertex.tasks",
+  }],
+
+  columns: ColumnDefinition.make([{
+    id: 'index',
+    headerTitle: 'Task Index',
+    contentPath: 'index'
+  },{
+    id: 'status',
+    headerTitle: 'Status',
+    contentPath: 'status',
+    cellComponentName: 'em-table-status-cell'
+  },{
+    id: 'progress',
+    headerTitle: 'Progress',
+    contentPath: 'progress',
+    cellComponentName: 'em-table-progress-cell',
+    observePath: true
+  },{
+    id: 'startTime',
+    headerTitle: 'Start Time',
+    contentPath: 'startTime',
+    cellDefinition: {
+      type: 'date'
+    }
+  },{
+    id: 'endTime',
+    headerTitle: 'End Time',
+    contentPath: 'endTime',
+    cellDefinition: {
+      type: 'date'
+    }
+  },{
+    id: 'duration',
+    headerTitle: 'Duration',
+    contentPath: 'duration',
+    cellDefinition: {
+      type: 'duration'
+    }
+  }])
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/models/vertex.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/models/vertex.js b/tez-ui2/src/main/webapp/app/models/vertex.js
index dcdb0f2..4192771 100644
--- a/tez-ui2/src/main/webapp/app/models/vertex.js
+++ b/tez-ui2/src/main/webapp/app/models/vertex.js
@@ -38,13 +38,22 @@ import TimelineModel from './timeline';
 */
 
 export default TimelineModel.extend({
+  needs: {
+    dag: {
+      type: "dag",
+      idKey: "dagID",
+      silent: true
+    }
+  },
+
   name: DS.attr('string'),
 
   firstTaskStartTime: DS.attr('number'),
+  lastTaskFinishTime: DS.attr('number'),
 
-  numTasks: DS.attr('number'),
+  totalTasks: DS.attr('number'),
   failedTasks: DS.attr('number'),
-  sucessfulTasks: DS.attr('number'),
+  successfulTasks: DS.attr('number'),
   killedTasks: DS.attr('number'),
 
   runningTasks: Ember.computed("status", function () {
@@ -57,5 +66,12 @@ export default TimelineModel.extend({
   failedTaskAttempts: DS.attr('number'),
   killedTaskAttempts: DS.attr('number'),
 
+  minDuration: DS.attr('number'),
+  maxDuration: DS.attr('number'),
+  avgDuration: DS.attr('number'),
+
   processorClassName: DS.attr('string'),
+
+  dagID: DS.attr('string'),
+  dag: DS.attr('object'), // Auto-loaded by need
 });

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/router.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/router.js b/tez-ui2/src/main/webapp/app/router.js
index d94a837..e80c817 100644
--- a/tez-ui2/src/main/webapp/app/router.js
+++ b/tez-ui2/src/main/webapp/app/router.js
@@ -31,6 +31,10 @@ Router.map(function() {
     this.route('attempts');
   });
   this.route('app', {path: '/app/:app_id'});
+  this.route('vertex', {path: '/vertex/:vertex_id'}, function() {
+    this.route('tasks');
+    this.route('attempts');
+  });
 });
 
 export default Router;

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/routes/dag/attempts.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/routes/dag/attempts.js b/tez-ui2/src/main/webapp/app/routes/dag/attempts.js
index 3a05867..f438b95 100644
--- a/tez-ui2/src/main/webapp/app/routes/dag/attempts.js
+++ b/tez-ui2/src/main/webapp/app/routes/dag/attempts.js
@@ -20,7 +20,7 @@ import Ember from 'ember';
 import AbstractRoute from '../abstract';
 
 export default AbstractRoute.extend({
-  title: "All Attempts",
+  title: "All Task Attempts",
 
   setupController: function (controller, model) {
     this._super(controller, model);

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/routes/vertex.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/routes/vertex.js b/tez-ui2/src/main/webapp/app/routes/vertex.js
new file mode 100644
index 0000000..2a38001
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/routes/vertex.js
@@ -0,0 +1,31 @@
+/**
+ * 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 AbstractRoute from './abstract';
+
+export default AbstractRoute.extend({
+  title: "Vertex",
+
+  loaderQueryParams: {
+    id: "vertex_id"
+  },
+
+  model: function (params) {
+    return this.get("loader").queryRecord('vertex', this.queryFromParams(params).id);
+  }
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/routes/vertex/attempts.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/routes/vertex/attempts.js b/tez-ui2/src/main/webapp/app/routes/vertex/attempts.js
new file mode 100644
index 0000000..cead8a2
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/routes/vertex/attempts.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 Ember from 'ember';
+import AbstractRoute from '../abstract';
+
+export default AbstractRoute.extend({
+  title: "Task Attempts",
+
+  setupController: function (controller, model) {
+    this._super(controller, model);
+    Ember.run.later(this, "startCrumbBubble");
+  },
+
+  load: function (/*value, query*/) {
+    return this.get("loader").query('attempt', {
+      vertexID: this.modelFor("vertex").id
+    });
+  }
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/routes/vertex/index.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/routes/vertex/index.js b/tez-ui2/src/main/webapp/app/routes/vertex/index.js
new file mode 100644
index 0000000..d05e5f6
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/routes/vertex/index.js
@@ -0,0 +1,33 @@
+/**
+ * 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 AbstractRoute from '../abstract';
+
+export default AbstractRoute.extend({
+  title: "DAG Details",
+
+  setupController: function (controller, model) {
+    this._super(controller, model);
+    Ember.run.later(this, "startCrumbBubble");
+  },
+
+  load: function (/*value, query*/) {
+    return this.get("loader").queryRecord('vertex', this.modelFor("vertex").id);
+  },
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/routes/vertex/tasks.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/routes/vertex/tasks.js b/tez-ui2/src/main/webapp/app/routes/vertex/tasks.js
new file mode 100644
index 0000000..e959fef
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/routes/vertex/tasks.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 Ember from 'ember';
+import AbstractRoute from '../abstract';
+
+export default AbstractRoute.extend({
+  title: "All Tasks",
+
+  setupController: function (controller, model) {
+    this._super(controller, model);
+    Ember.run.later(this, "startCrumbBubble");
+  },
+
+  load: function (/*value, query*/) {
+    return this.get("loader").query('task', {
+      vertexID: this.modelFor("vertex").id
+    });
+  }
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/serializers/vertex.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/serializers/vertex.js b/tez-ui2/src/main/webapp/app/serializers/vertex.js
index 88ee5d3..7c36074 100644
--- a/tez-ui2/src/main/webapp/app/serializers/vertex.js
+++ b/tez-ui2/src/main/webapp/app/serializers/vertex.js
@@ -30,15 +30,22 @@ export default TimelineSerializer.extend({
     name: 'otherinfo.vertexName',
 
     firstTaskStartTime: 'otherinfo.stats.firstTaskStartTime',
+    lastTaskFinishTime: 'otherinfo.stats.lastTaskFinishTime',
 
-    numTasks: 'otherinfo.numTasks',
+    totalTasks: 'otherinfo.numTasks',
     failedTasks: 'otherinfo.numFailedTasks',
-    sucessfulTasks: 'otherinfo.numSucceededTasks',
+    successfulTasks: 'otherinfo.numSucceededTasks',
     killedTasks: 'otherinfo.numKilledTasks',
 
     failedTaskAttempts: 'otherinfo.numFailedTaskAttempts',
     killedTaskAttempts: 'otherinfo.numKilledTaskAttempts',
 
+    minDuration:  'otherinfo.stats.minTaskDuration',
+    maxDuration:  'otherinfo.stats.maxTaskDuration',
+    avgDuration:  'otherinfo.stats.avgTaskDuration',
+
     processorClassName: getProcessorClass,
+
+    dagID: 'primaryfilters.TEZ_DAG_ID.0',
   }
 });

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/styles/page-layout.less
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/styles/page-layout.less b/tez-ui2/src/main/webapp/app/styles/page-layout.less
index c3530ff..5a49abc 100644
--- a/tez-ui2/src/main/webapp/app/styles/page-layout.less
+++ b/tez-ui2/src/main/webapp/app/styles/page-layout.less
@@ -124,7 +124,10 @@ body, html {
     color: @logo-orange;
   }
 
-  .footer, .footer-frame {
+  .footer-frame {
+    height: 60px;
+  }
+  .footer {
     height: 40px;
   }
 

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/templates/dag/index.hbs
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/templates/dag/index.hbs b/tez-ui2/src/main/webapp/app/templates/dag/index.hbs
index 2811a35..1bd3c21 100644
--- a/tez-ui2/src/main/webapp/app/templates/dag/index.hbs
+++ b/tez-ui2/src/main/webapp/app/templates/dag/index.hbs
@@ -24,58 +24,51 @@
       </tr>
     </thead>
     <tbody>
-    <tr>
-      <td colspan="2">
-        {{bs-button icon="fa fa-download" title="Download data" defaultText="Download data" type="info" clicked="downloadDagJson"}}
-      </td>
-    </tr>
-    <tr>
-      <td>Application ID</td>
-      <td>
-        {{#link-to 'app' model.appID class='ember-table-content'}}
-          {{model.appID}}
-        {{/link-to}}
-      </td>
-    </tr>
-    <tr>
-      <td>ID</td>
-      <td>{{model.entityID}}</td>
-    </tr>
-    <tr>
-      <td>Submitter</td>
-      <td>{{model.user}}</td>
-    </tr>
-    <tr>
-      <td>Status</td>
-      <td>
-        {{em-table-status-cell content=model.status}}
-        {{#if progressStr}} {{bs-badge content=progressStr}}{{/if}}
-        {{#if hasFailedTasks}}
-          [ <a href='{{unbound failedTasksLink}}'>Failed Tasks</a> ]
-        {{/if}}
-        {{#if hasFailedTaskAttempts}}
-          [ <a href='{{unbound failedTaskAttemptsLink}}'>Failed TaskAttempts</a> ]
-        {{/if}}
-      </td>
-    </tr>
-    <tr>
-      <td>Start Time</td>
-      <td>{{txt model.startTime type="date"}}</td>
-    </tr>
-    <tr>
-      <td>End Time</td>
-      <td>{{txt model.endTime type="date"}}</td>
-    </tr>
-    <tr>
-      <td>Duration</td>
-      <td>{{txt model.duration type="duration"}}</td>
-    </tr>
-    <tr>
-      <td>Logs</td>
-      <td>
-        {{em-table-linked-cell content=model.containerLogs}}
-      </td>
-    </tr>
+      <tr>
+        <td colspan="2">
+          {{bs-button icon="fa fa-download" title="Download data" defaultText="Download data" type="info" clicked="downloadDagJson"}}
+        </td>
+      </tr>
+      <tr>
+        <td>Application ID</td>
+        <td>
+          {{#link-to 'app' model.appID class='ember-table-content'}}
+            {{model.appID}}
+          {{/link-to}}
+        </td>
+      </tr>
+      <tr>
+        <td>ID</td>
+        <td>{{model.entityID}}</td>
+      </tr>
+      <tr>
+        <td>Submitter</td>
+        <td>{{model.user}}</td>
+      </tr>
+      <tr>
+        <td>Status</td>
+        <td>
+          {{em-table-status-cell content=model.status}}
+        </td>
+      </tr>
+      <tr>
+        <td>Start Time</td>
+        <td>{{txt model.startTime type="date"}}</td>
+      </tr>
+      <tr>
+        <td>End Time</td>
+        <td>{{txt model.endTime type="date"}}</td>
+      </tr>
+      <tr>
+        <td>Duration</td>
+        <td>{{txt model.duration type="duration"}}</td>
+      </tr>
+      <tr>
+        <td>Logs</td>
+        <td>
+          {{em-table-linked-cell content=model.containerLogs}}
+        </td>
+      </tr>
     </tbody>
   </table>
 {{else}}

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/templates/vertex.hbs
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/templates/vertex.hbs b/tez-ui2/src/main/webapp/app/templates/vertex.hbs
new file mode 100644
index 0000000..308b905
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/templates/vertex.hbs
@@ -0,0 +1,20 @@
+{{!
+ * 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.
+}}
+
+{{tab-n-refresh tabs=tabs}}
+{{outlet}}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/templates/vertex/attempts.hbs
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/templates/vertex/attempts.hbs b/tez-ui2/src/main/webapp/app/templates/vertex/attempts.hbs
new file mode 100644
index 0000000..cdb28aa
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/templates/vertex/attempts.hbs
@@ -0,0 +1,33 @@
+{{!
+ * 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.
+}}
+
+{{#if loaded}}
+  {{em-table
+  columns=columns
+  rows=model
+
+  definition=definition
+
+  searchAction="searchChanged"
+  sortAction="sortChanged"
+  rowAction="rowsChanged"
+  pageAction="pageChanged"
+  }}
+{{else}}
+  {{partial "partials/loading-anim"}}
+{{/if}}

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/templates/vertex/index.hbs
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/templates/vertex/index.hbs b/tez-ui2/src/main/webapp/app/templates/vertex/index.hbs
new file mode 100644
index 0000000..8183842
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/templates/vertex/index.hbs
@@ -0,0 +1,130 @@
+{{!
+ * 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.
+}}
+
+{{#if loaded}}
+  <table class='detail-list'>
+    <thead>
+      <tr>
+        <th colspan=2>Description</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>Vertex ID</td>
+        <td>{{model.entityID}}</td>
+      </tr>
+      <tr>
+        <td>Vertex Name</td>
+        <td>{{model.name}}</td>
+      </tr>
+      <tr>
+        <td>Processor Class</td>
+        <td>{{model.processorClassName}}</td>
+      </tr>
+    </tbody>
+  </table>
+
+  <br/>
+
+  <table class='detail-list'>
+    <thead>
+      <tr>
+        <th colspan=2>Details</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>Status</td>
+        <td>{{em-table-status-cell content=model.status}}</td>
+      </tr>
+      <tr>
+        <td>Start Time</td>
+        <td>{{txt model.startTime type="date"}}</td>
+      </tr>
+      <tr>
+        <td>End Time</td>
+        <td>{{txt model.endTime type="date"}}</td>
+      </tr>
+      <tr>
+        <td>Duration</td>
+        <td>{{txt model.duration type="duration"}}</td>
+      </tr>
+      <tr>
+        <td>First Task Start Time</td>
+        <td>
+          {{txt model.firstTaskStartTime type="date"}}
+        </td>
+      </tr>
+      <tr>
+        <td>Last Task Finish Time</td>
+        <td>
+          {{txt model.lastTaskFinishTime type="date"}}
+        </td>
+      </tr>
+    </tbody>
+  </table>
+
+  <br/>
+
+  <table class='detail-list'>
+    <thead>
+      <tr>
+        <th colspan=2>Tasks of this Vertex</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>Total Tasks</td>
+        <td>{{txt model.totalTasks type="number"}}</td>
+      </tr>
+      <tr>
+        <td>Successful Tasks</td>
+        <td>{{txt model.successfulTasks type="number"}}</td>
+      </tr>
+      <tr>
+        <td>Failed Tasks</td>
+        <td>{{txt model.failedTasks type="number"}}</td>
+      </tr>
+      <tr>
+        <td>Killed Tasks</td>
+        <td>{{txt model.killedTasks type="number"}}</td>
+      </tr>
+      <tr>
+        <td>Average Duration</td>
+        <td>
+          {{txt model.avgDuration type="duration"}}
+        </td>
+      </tr>
+      <tr>
+        <td>Minimum Duration</td>
+        <td>
+          {{txt model.minDuration type="duration"}}
+        </td>
+      </tr>
+      <tr>
+        <td>Maximum Duration</td>
+        <td>
+          {{txt model.maxDuration type="duration"}}
+        </td>
+      </tr>
+    </tbody>
+  </table>
+
+{{else}}
+  {{partial "partials/loading-anim"}}
+{{/if}}

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/app/templates/vertex/tasks.hbs
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/templates/vertex/tasks.hbs b/tez-ui2/src/main/webapp/app/templates/vertex/tasks.hbs
new file mode 100644
index 0000000..cdb28aa
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/templates/vertex/tasks.hbs
@@ -0,0 +1,33 @@
+{{!
+ * 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.
+}}
+
+{{#if loaded}}
+  {{em-table
+  columns=columns
+  rows=model
+
+  definition=definition
+
+  searchAction="searchChanged"
+  sortAction="sortChanged"
+  rowAction="rowsChanged"
+  pageAction="pageChanged"
+  }}
+{{else}}
+  {{partial "partials/loading-anim"}}
+{{/if}}

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

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

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

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

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/tests/unit/routes/vertex-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/routes/vertex-test.js b/tez-ui2/src/main/webapp/tests/unit/routes/vertex-test.js
new file mode 100644
index 0000000..79cef72
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/unit/routes/vertex-test.js
@@ -0,0 +1,32 @@
+/**
+ * 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('route:vertex', 'Unit | Route | vertex', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+test('Basic creation test', function(assert) {
+  let route = this.subject();
+
+  assert.ok(route);
+  assert.ok(route.loaderQueryParams);
+  assert.ok(route.model);
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/tests/unit/routes/vertex/attempts-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/routes/vertex/attempts-test.js b/tez-ui2/src/main/webapp/tests/unit/routes/vertex/attempts-test.js
new file mode 100644
index 0000000..9ba3cf0
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/unit/routes/vertex/attempts-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 { moduleFor, test } from 'ember-qunit';
+
+moduleFor('route:vertex/attempts', 'Unit | Route | vertex/attempts', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+test('Basic creation test', function(assert) {
+  let route = this.subject();
+
+  assert.ok(route);
+  assert.ok(route.title);
+  assert.ok(route.setupController);
+  assert.ok(route.load);
+});
+
+test('setupController test', function(assert) {
+  assert.expect(1);
+
+  let route = this.subject({
+    startCrumbBubble: function () {
+      assert.ok(true);
+    }
+  });
+
+  route.setupController({}, {});
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/tests/unit/routes/vertex/index-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/routes/vertex/index-test.js b/tez-ui2/src/main/webapp/tests/unit/routes/vertex/index-test.js
new file mode 100644
index 0000000..cc7e9de
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/unit/routes/vertex/index-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 { moduleFor, test } from 'ember-qunit';
+
+moduleFor('route:vertex/index', 'Unit | Route | vertex/index', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+test('Basic creation test', function(assert) {
+  let route = this.subject();
+
+  assert.ok(route);
+  assert.ok(route.title);
+  assert.ok(route.setupController);
+  assert.ok(route.load);
+});
+
+test('setupController test', function(assert) {
+  assert.expect(1);
+
+  let route = this.subject({
+    startCrumbBubble: function () {
+      assert.ok(true);
+    }
+  });
+
+  route.setupController({}, {});
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/68dc2f5d/tez-ui2/src/main/webapp/tests/unit/routes/vertex/tasks-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/routes/vertex/tasks-test.js b/tez-ui2/src/main/webapp/tests/unit/routes/vertex/tasks-test.js
new file mode 100644
index 0000000..e70434f
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/unit/routes/vertex/tasks-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 { moduleFor, test } from 'ember-qunit';
+
+moduleFor('route:vertex/tasks', 'Unit | Route | vertex/tasks', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+test('Basic creation test', function(assert) {
+  let route = this.subject();
+
+  assert.ok(route);
+  assert.ok(route.title);
+  assert.ok(route.setupController);
+  assert.ok(route.load);
+});
+
+test('setupController test', function(assert) {
+  assert.expect(1);
+
+  let route = this.subject({
+    startCrumbBubble: function () {
+      assert.ok(true);
+    }
+  });
+
+  route.setupController({}, {});
+});