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/01/18 22:43:53 UTC

tez git commit: TEZ-3045. Tez UI 2: Create application details page with DAGs tab (sree)

Repository: tez
Updated Branches:
  refs/heads/TEZ-2980 f3841e434 -> 1e53b4f15


TEZ-3045. Tez UI 2: Create application details page with DAGs tab (sree)


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

Branch: refs/heads/TEZ-2980
Commit: 1e53b4f15b112d5e6292ae3f6347bd28aca6d396
Parents: f3841e4
Author: Sreenath Somarajapuram <sr...@apache.org>
Authored: Tue Jan 19 03:12:39 2016 +0530
Committer: Sreenath Somarajapuram <sr...@apache.org>
Committed: Tue Jan 19 03:12:39 2016 +0530

----------------------------------------------------------------------
 TEZ-2980-CHANGES.txt                            |   1 +
 tez-ui2/src/main/webapp/app/adapters/app.js     |  22 ++++
 tez-ui2/src/main/webapp/app/controllers/app.js  |  41 ++++++
 .../src/main/webapp/app/controllers/app/dags.js |  98 +++++++++++++++
 .../main/webapp/app/controllers/app/index.js    |  22 ++++
 tez-ui2/src/main/webapp/app/controllers/dags.js |  10 +-
 tez-ui2/src/main/webapp/app/models/ahs-app.js   |  14 ++-
 tez-ui2/src/main/webapp/app/models/app.js       |  52 ++++++++
 tez-ui2/src/main/webapp/app/router.js           |   4 +-
 tez-ui2/src/main/webapp/app/routes/app.js       |  13 +-
 tez-ui2/src/main/webapp/app/routes/app/dags.js  |  35 ++++++
 tez-ui2/src/main/webapp/app/routes/app/index.js |  33 +++++
 .../src/main/webapp/app/serializers/ahs-app.js  |   6 +-
 tez-ui2/src/main/webapp/app/serializers/app.js  |  30 +++++
 .../main/webapp/app/styles/details-page.less    |   4 +
 tez-ui2/src/main/webapp/app/templates/app.hbs   |   3 +-
 .../src/main/webapp/app/templates/app/dags.hbs  |  33 +++++
 .../src/main/webapp/app/templates/app/index.hbs | 126 +++++++++++++++++++
 .../src/main/webapp/app/templates/dag/index.hbs |   4 +-
 .../src/main/webapp/config/default-app-conf.js  |   2 +-
 .../main/webapp/tests/unit/adapters/app-test.js |  30 +++++
 .../webapp/tests/unit/controllers/app-test.js   |  36 ++++++
 .../tests/unit/controllers/app/dags-test.js     |  36 ++++++
 .../tests/unit/controllers/app/index-test.js    |  34 +++++
 .../main/webapp/tests/unit/models/app-test.js   |  40 ++++++
 .../webapp/tests/unit/routes/app/dags-test.js   |  45 +++++++
 .../webapp/tests/unit/routes/app/index-test.js  |  45 +++++++
 .../webapp/tests/unit/serializers/app-test.js   |  31 +++++
 28 files changed, 833 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/TEZ-2980-CHANGES.txt
----------------------------------------------------------------------
diff --git a/TEZ-2980-CHANGES.txt b/TEZ-2980-CHANGES.txt
index 354816e..366396f 100644
--- a/TEZ-2980-CHANGES.txt
+++ b/TEZ-2980-CHANGES.txt
@@ -17,3 +17,4 @@ ALL CHANGES:
   TEZ-3039. Tez UI 2: Create all sub-pages for DAG
   TEZ-3040. Tez UI 2: Create Vertex details page & sub tables
   TEZ-3041. Tez UI 2: Create Task & Attempt details page with sub tables
+  TEZ-3045. Tez UI 2: Create application details page with DAGs tab

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/app/adapters/app.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/adapters/app.js b/tez-ui2/src/main/webapp/app/adapters/app.js
new file mode 100644
index 0000000..b47e05f
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/adapters/app.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/1e53b4f1/tez-ui2/src/main/webapp/app/controllers/app.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/controllers/app.js b/tez-ui2/src/main/webapp/app/controllers/app.js
new file mode 100644
index 0000000..95159c5
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/controllers/app.js
@@ -0,0 +1,41 @@
+/**
+ * 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.appID", "model.app.name", function () {
+    var name = this.get("model.app.name") || this.get("model.appID");
+
+    return [{
+      text: `Application [ ${name} ]`,
+      routeName: "app.index",
+      model: this.get("model.entityID")
+    }];
+  }),
+
+  tabs: [{
+    text: "Application Details",
+    routeName: "app.index"
+  }, {
+    text: "DAGs",
+    routeName: "app.dags"
+  }]
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/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
new file mode 100644
index 0000000..bcb4db8
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/controllers/app/dags.js
@@ -0,0 +1,98 @@
+/**
+ * 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: "DAGs",
+    routeName: "app.dags",
+  }],
+
+  columns: ColumnDefinition.make([{
+    id: 'name',
+    headerTitle: 'Dag Name',
+    contentPath: 'name',
+    cellComponentName: 'em-table-linked-cell',
+    getCellContent: function (row) {
+      return {
+        routeName: "dag",
+        model: row.get("entityID"),
+        text: row.get("name")
+      };
+    }
+  },{
+    id: 'entityID',
+    headerTitle: 'Id',
+    contentPath: 'entityID'
+  },{
+    id: 'user',
+    headerTitle: 'Submitter',
+    contentPath: 'user'
+  },{
+    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: 'queue',
+    headerTitle: 'Queue',
+    contentPath: 'queue'
+  },{
+    id: 'contextID',
+    headerTitle: 'Context ID',
+    contentPath: 'contextID'
+  },{
+    id: 'logs',
+    headerTitle: 'Logs',
+    contentPath: 'containerLogs',
+    cellComponentName: "em-table-linked-cell",
+    cellDefinition: {
+      target: "_blank"
+    }
+  }]),
+
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/app/controllers/app/index.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/controllers/app/index.js b/tez-ui2/src/main/webapp/app/controllers/app/index.js
new file mode 100644
index 0000000..9745328
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/controllers/app/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/1e53b4f1/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 8d7e73e..fced7d8 100644
--- a/tez-ui2/src/main/webapp/app/controllers/dags.js
+++ b/tez-ui2/src/main/webapp/app/controllers/dags.js
@@ -78,7 +78,15 @@ export default TablePageController.extend({
   },{
     id: 'appID',
     headerTitle: 'Application Id',
-    contentPath: 'appID'
+    contentPath: 'appID',
+    cellComponentName: 'em-table-linked-cell',
+    getCellContent: function (row) {
+      return {
+        routeName: "app",
+        model: row.get("appID"),
+        text: row.get("appID")
+      };
+    }
   },{
     id: 'queue',
     headerTitle: 'Queue',

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/app/models/ahs-app.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/models/ahs-app.js b/tez-ui2/src/main/webapp/app/models/ahs-app.js
index 8f4a153..ce087eb31 100644
--- a/tez-ui2/src/main/webapp/app/models/ahs-app.js
+++ b/tez-ui2/src/main/webapp/app/models/ahs-app.js
@@ -16,10 +16,14 @@
  * limitations under the License.
  */
 
+import Ember from 'ember';
+
 import DS from 'ember-data';
 import AbstractModel from './abstract';
 
 export default AbstractModel.extend({
+  entityID: DS.attr('string'),
+
   attemptID: DS.attr('string'),
 
   name: DS.attr('string'),
@@ -30,10 +34,12 @@ export default AbstractModel.extend({
   status: DS.attr('string'),
   finalStatus: DS.attr('string'),
 
-  startedTime: DS.attr('number'),
-  elapsedTime: DS.attr('number'),
-  finishedTime: DS.attr('number'),
-  submittedTime: DS.attr('number'),
+  startTime: DS.attr('number'),
+  endTime: DS.attr('number'),
+  duration: Ember.computed("startTime", "endTime", function () {
+    var duration = this.get("endTime") - this.get("startTime");
+    return duration > 0 ? duration : null;
+  }),
 
   diagnostics: DS.attr('string'),
 });

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/app/models/app.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/models/app.js b/tez-ui2/src/main/webapp/app/models/app.js
new file mode 100644
index 0000000..42fa1c5
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/models/app.js
@@ -0,0 +1,52 @@
+/**
+ * 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 DS from 'ember-data';
+
+import TimelineModel from './timeline';
+/*
+  Inherited properties
+
+  entityID - String
+  appID - Computed from entityID
+
+  status - String
+  progress - Computed from status
+
+  startTime - Number
+  endTime - Number
+  duration - Computed from start & end times
+
+  counterGroups - Array
+  counterHash - Computed from counterGroups
+*/
+
+export default TimelineModel.extend({
+  appID: Ember.computed("entityID", function () {
+    return this.get("entityID").substr(4);
+  }),
+
+  domain: DS.attr("string"),
+
+  user: DS.attr("string"),
+
+  buildTime: DS.attr("string"),
+  tezRevision: DS.attr("string"),
+  tezVersion: DS.attr("string"),
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/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 e907cc7..d619e42 100644
--- a/tez-ui2/src/main/webapp/app/router.js
+++ b/tez-ui2/src/main/webapp/app/router.js
@@ -38,7 +38,9 @@ Router.map(function() {
     this.route('attempts');
   });
   this.route('attempt', {path: '/attempt/:attempt_id'}, function () {});
-  this.route('app', {path: '/app/:app_id'}, function () {});
+  this.route('app', {path: '/app/:app_id'}, function () {
+    this.route('dags');
+  });
 });
 
 export default Router;

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/app/routes/app.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/routes/app.js b/tez-ui2/src/main/webapp/app/routes/app.js
index 8719170..2bbf14a 100644
--- a/tez-ui2/src/main/webapp/app/routes/app.js
+++ b/tez-ui2/src/main/webapp/app/routes/app.js
@@ -16,7 +16,16 @@
  * limitations under the License.
  */
 
-import Ember from 'ember';
+import AbstractRoute from './abstract';
 
-export default Ember.Route.extend({
+export default AbstractRoute.extend({
+  title: "Application",
+
+  loaderQueryParams: {
+    id: "app_id"
+  },
+
+  model: function (params) {
+    return this.get("loader").queryRecord('app', "tez_" + this.queryFromParams(params).id);
+  }
 });

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/app/routes/app/dags.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/routes/app/dags.js b/tez-ui2/src/main/webapp/app/routes/app/dags.js
new file mode 100644
index 0000000..8c695b3
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/routes/app/dags.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: "DAGs",
+
+  setupController: function (controller, model) {
+    this._super(controller, model);
+    Ember.run.later(this, "startCrumbBubble");
+  },
+
+  load: function (/*value, query*/) {
+    return this.get("loader").query('dag', {
+      appID: (this.modelFor("app").id || "").substr(4)
+    });
+  }
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/app/routes/app/index.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/routes/app/index.js b/tez-ui2/src/main/webapp/app/routes/app/index.js
new file mode 100644
index 0000000..b6768fa
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/routes/app/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: "Application Details",
+
+  setupController: function (controller, model) {
+    this._super(controller, model);
+    Ember.run.later(this, "startCrumbBubble");
+  },
+
+  load: function (/*value, query*/) {
+    return this.get("loader").queryRecord('app', this.modelFor("app").id);
+  },
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/app/serializers/ahs-app.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/serializers/ahs-app.js b/tez-ui2/src/main/webapp/app/serializers/ahs-app.js
index 10825b2..0c35d54 100644
--- a/tez-ui2/src/main/webapp/app/serializers/ahs-app.js
+++ b/tez-ui2/src/main/webapp/app/serializers/ahs-app.js
@@ -41,10 +41,8 @@ export default LoaderSerializer.extend({
     status: 'appState',
     finalStatus: 'finalAppStatus',
 
-    startedTime: 'startedTime',
-    elapsedTime: 'elapsedTime',
-    finishedTime: 'finishedTime',
-    submittedTime: 'submittedTime',
+    startTime: 'startedTime',
+    endTime: 'finishedTime',
 
     diagnostics: 'otherinfo.diagnostics',
   }

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/app/serializers/app.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/serializers/app.js b/tez-ui2/src/main/webapp/app/serializers/app.js
new file mode 100644
index 0000000..86d8fa0
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/serializers/app.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 TimelineSerializer from './timeline';
+
+export default TimelineSerializer.extend({
+  maps: {
+    domain: 'domain',
+    user: 'otherinfo.user',
+
+    buildTime: 'otherinfo.tezVersion.buildTime',
+    tezRevision: 'otherinfo.tezVersion.revision',
+    tezVersion: 'otherinfo.tezVersion.version',
+  }
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/app/styles/details-page.less
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/styles/details-page.less b/tez-ui2/src/main/webapp/app/styles/details-page.less
index 8c85d1f..4f65018 100644
--- a/tez-ui2/src/main/webapp/app/styles/details-page.less
+++ b/tez-ui2/src/main/webapp/app/styles/details-page.less
@@ -17,6 +17,10 @@
  */
 
 .detail-list {
+  display: inline-block;
+
+  margin: 0 10px 10px 0;
+
   table-layout: fixed;
   white-space: nowrap;
 

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/app/templates/app.hbs
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/templates/app.hbs b/tez-ui2/src/main/webapp/app/templates/app.hbs
index c1a05b4..308b905 100644
--- a/tez-ui2/src/main/webapp/app/templates/app.hbs
+++ b/tez-ui2/src/main/webapp/app/templates/app.hbs
@@ -16,4 +16,5 @@
  * limitations under the License.
 }}
 
-{{outlet}}
+{{tab-n-refresh tabs=tabs}}
+{{outlet}}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/app/templates/app/dags.hbs
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/templates/app/dags.hbs b/tez-ui2/src/main/webapp/app/templates/app/dags.hbs
new file mode 100644
index 0000000..cdb28aa
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/templates/app/dags.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/1e53b4f1/tez-ui2/src/main/webapp/app/templates/app/index.hbs
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/app/templates/app/index.hbs b/tez-ui2/src/main/webapp/app/templates/app/index.hbs
new file mode 100644
index 0000000..916051b
--- /dev/null
+++ b/tez-ui2/src/main/webapp/app/templates/app/index.hbs
@@ -0,0 +1,126 @@
+{{!
+ * 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}}
+  {{#if model.app}}
+    <table class='detail-list'>
+      <thead>
+      <tr>
+        <th colspan=2>YARN App Details</th>
+      </tr>
+      </thead>
+      <tbody>
+      <tr>
+        <td>Status</td>
+        <td>{{em-table-status-cell content=model.app.status}}</td>
+      </tr>
+      <tr>
+        <td>Final Status</td>
+        <td>{{em-table-status-cell content=model.app.finalStatus}}</td>
+      </tr>
+      <tr>
+        <td>Start Time</td>
+        <td>{{txt model.app.startTime type="date"}}</td>
+      </tr>
+      <tr>
+        <td>End Time</td>
+        <td>{{txt model.app.endTime type="date"}}</td>
+      </tr>
+      <tr>
+        <td>Duration</td>
+        <td>{{txt model.app.duration type="duration"}}</td>
+      </tr>
+      </tbody>
+    </table>
+    <table class='detail-list'>
+      <thead>
+      <tr>
+        <th colspan=2>YARN App Description</th>
+      </tr>
+      </thead>
+      <tbody>
+      <tr>
+        <td>Application ID</td>
+        <td>{{model.app.entityID}}</td>
+      </tr>
+      <tr>
+        <td>Application Name</td>
+        <td>{{model.app.name}}</td>
+      </tr>
+      <tr>
+        <td>Queue</td>
+        <td>{{model.app.queue}}</td>
+      </tr>
+      <tr>
+        <td>Application Type</td>
+        <td>{{model.app.type}}</td>
+      </tr>
+      <tr>
+        <td>User</td>
+        <td>{{model.app.user}}</td>
+      </tr>
+      </tbody>
+    </table>
+    <br/>
+  {{/if}}
+  <table class='detail-list'>
+    <thead>
+      <tr>
+        <th colspan=2>Tez Details</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>Application ID</td>
+        <td>{{model.appID}}</td>
+      </tr>
+      <tr>
+        <td>Domain</td>
+        <td>{{model.domain}}</td>
+      </tr>
+      <tr>
+        <td>User</td>
+        <td>{{model.user}}</td>
+      </tr>
+    </tbody>
+  </table>
+
+  <table class='detail-list'>
+    <thead>
+      <tr>
+        <th colspan=2>Version Details</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr>
+        <td>Build Version</td>
+        <td>{{model.tezVersion}}</td>
+      </tr>
+      <tr>
+        <td>Build Revision</td>
+        <td>{{model.tezRevision}}</td>
+      </tr>
+      <tr>
+        <td>Build Time</td>
+        <td>{{model.buildTime}}</td>
+      </tr>
+    </tbody>
+  </table>
+{{else}}
+  {{partial "partials/loading-anim"}}
+{{/if}}

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/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 1bd3c21..fdb0a91 100644
--- a/tez-ui2/src/main/webapp/app/templates/dag/index.hbs
+++ b/tez-ui2/src/main/webapp/app/templates/dag/index.hbs
@@ -47,9 +47,7 @@
       </tr>
       <tr>
         <td>Status</td>
-        <td>
-          {{em-table-status-cell content=model.status}}
-        </td>
+        <td>{{em-table-status-cell content=model.status}}</td>
       </tr>
       <tr>
         <td>Start Time</td>

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/config/default-app-conf.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/config/default-app-conf.js b/tez-ui2/src/main/webapp/config/default-app-conf.js
index feea181..400290a 100644
--- a/tez-ui2/src/main/webapp/config/default-app-conf.js
+++ b/tez-ui2/src/main/webapp/config/default-app-conf.js
@@ -44,7 +44,7 @@ module.exports = { // Tez App configurations
 
       hiveQuery: 'HIVE_QUERY_ID',
 
-      tezApp: 'TEZ_APPLICATION'
+      app: 'TEZ_APPLICATION'
     }
   },
   hrefs: {

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/tests/unit/adapters/app-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/adapters/app-test.js b/tez-ui2/src/main/webapp/tests/unit/adapters/app-test.js
new file mode 100644
index 0000000..dd2db50
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/unit/adapters/app-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:app', 'Unit | Adapter | dag', {
+  // 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/1e53b4f1/tez-ui2/src/main/webapp/tests/unit/controllers/app-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/controllers/app-test.js b/tez-ui2/src/main/webapp/tests/unit/controllers/app-test.js
new file mode 100644
index 0000000..304321e
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/unit/controllers/app-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:dag', 'Unit | Controller | dag', {
+  // 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/1e53b4f1/tez-ui2/src/main/webapp/tests/unit/controllers/app/dags-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/controllers/app/dags-test.js b/tez-ui2/src/main/webapp/tests/unit/controllers/app/dags-test.js
new file mode 100644
index 0000000..10ba8a3
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/unit/controllers/app/dags-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:app/dags', '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/1e53b4f1/tez-ui2/src/main/webapp/tests/unit/controllers/app/index-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/controllers/app/index-test.js b/tez-ui2/src/main/webapp/tests/unit/controllers/app/index-test.js
new file mode 100644
index 0000000..c2004ba
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/unit/controllers/app/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:app/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/1e53b4f1/tez-ui2/src/main/webapp/tests/unit/models/app-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/models/app-test.js b/tez-ui2/src/main/webapp/tests/unit/models/app-test.js
new file mode 100644
index 0000000..e0fb7f0
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/unit/models/app-test.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 { moduleForModel, test } from 'ember-qunit';
+
+moduleForModel('app', 'Unit | Model | task', {
+  // Specify the other units that are required for this test.
+  needs: []
+});
+
+test('Basic creation test', function(assert) {
+  let model = this.subject();
+
+  assert.ok(model);
+  assert.ok(model.needs);
+  assert.ok(model.appID);
+});
+
+test('appID test', function(assert) {
+  let model = this.subject({
+        entityID: "tez_1_2_3",
+      });
+
+  assert.equal(model.get("appID"), "1_2_3");
+});

http://git-wip-us.apache.org/repos/asf/tez/blob/1e53b4f1/tez-ui2/src/main/webapp/tests/unit/routes/app/dags-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/routes/app/dags-test.js b/tez-ui2/src/main/webapp/tests/unit/routes/app/dags-test.js
new file mode 100644
index 0000000..05c1436
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/unit/routes/app/dags-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:app/dags', '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/1e53b4f1/tez-ui2/src/main/webapp/tests/unit/routes/app/index-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/routes/app/index-test.js b/tez-ui2/src/main/webapp/tests/unit/routes/app/index-test.js
new file mode 100644
index 0000000..83697f4
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/unit/routes/app/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:app/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/1e53b4f1/tez-ui2/src/main/webapp/tests/unit/serializers/app-test.js
----------------------------------------------------------------------
diff --git a/tez-ui2/src/main/webapp/tests/unit/serializers/app-test.js b/tez-ui2/src/main/webapp/tests/unit/serializers/app-test.js
new file mode 100644
index 0000000..fc79ae9
--- /dev/null
+++ b/tez-ui2/src/main/webapp/tests/unit/serializers/app-test.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 { moduleFor, test } from 'ember-qunit';
+
+moduleFor('serializer:task', 'Unit | Serializer | task', {
+  // Specify the other units that are required for this test.
+  // needs: ['serializer:task']
+});
+
+test('Basic creation test', function(assert) {
+  let serializer = this.subject();
+
+  assert.ok(serializer);
+  assert.ok(serializer.maps);
+});