You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by su...@apache.org on 2017/05/21 13:06:25 UTC

[1/3] hadoop git commit: YARN-5705. Show timeline data from ATS v2 in new web UI. Contributed by Akhil PB.

Repository: hadoop
Updated Branches:
  refs/heads/trunk c80d3bc48 -> 46d9c4ca7


http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow/runs.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow/runs.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow/runs.hbs
new file mode 100644
index 0000000..96d9e63
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow/runs.hbs
@@ -0,0 +1,131 @@
+{{!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+--}}
+
+<div class="yarn-flow-runs">
+
+  {{#if (or (or elapsedTimeVizData.length cpuVCoresVizData.length) memoryVizData.length)}}
+  <div class="dropdown pull-right">
+    <button class="btn btn-sm btn-primary dropdown-toggle" type="button" data-toggle="dropdown">
+      Add Metrics Widget <span class="caret"></span>
+    </button>
+    <ul class="dropdown-menu">
+      {{#if elapsedTimeVizData.length}}
+        <li>
+          <a href="#" {{action "addVizWidget" "runDuration"}}>
+            <div class="item-icon">
+              {{#if vizWidgets.runDuration}}
+                <i class="glyphicon glyphicon-ok text-success"></i>
+              {{/if}}
+            </div>
+            <div class="item-text">Flow Run Vs Run Duration</div>
+          </a>
+        </li>
+      {{/if}}
+      {{#if cpuVCoresVizData.length}}
+        <li>
+          <a href="#" {{action "addVizWidget" "cpuVcores"}}>
+            <div class="item-icon">
+              {{#if vizWidgets.cpuVcores}}
+                <i class="glyphicon glyphicon-ok text-success"></i>
+              {{/if}}
+            </div>
+            <div class="item-text">Flow Run Vs Cpu Vcores</div>
+          </a>
+        </li>
+      {{/if}}
+      {{#if memoryVizData.length}}
+        <li>
+          <a href="#" {{action "addVizWidget" "memoryUsed"}}>
+            <div class="item-icon">
+              {{#if vizWidgets.memoryUsed}}
+                <i class="glyphicon glyphicon-ok text-success"></i>
+              {{/if}}
+            </div>
+            <div class="item-text">Flow Run Vs Memory Used</div>
+          </a>
+        </li>
+      {{/if}}
+    </ul>
+  </div>
+  {{/if}}
+
+  <h3>Flow Runs</h3>
+  {{em-table columns=columns rows=model.flowRuns definition=tableDefinition}}
+
+  <div class="col-md-12">
+    {{#if (and elapsedTimeVizData.length vizWidgets.runDuration)}}
+      <div class="row">
+        <div class="panel panel-default">
+          <div class="panel-body">
+            <div class="glyphicon glyphicon-remove pull-right" {{action "removeVizWidget" "runDuration"}}></div>
+            <h4 class="text-center">Flow Run Vs Run Duration</h4>
+            {{simple-bar-chart
+              class="chart-panel"
+              data=elapsedTimeVizData
+              xAxisTickFormatter=flowrunIdFormatter
+              yAxisTickFormatter=elapsedTimeFormatter
+              xAxisText="Flow Run"
+              yAxisText="Run Duration"
+              onBarChartClickCallback=onBarChartClick
+            }}
+          </div>
+        </div>
+      </div>
+    {{/if}}
+
+    {{#if (and cpuVCoresVizData.length vizWidgets.cpuVcores)}}
+      <div class="row">
+        <div class="panel panel-default">
+          <div class="panel-body">
+            <div class="glyphicon glyphicon-remove pull-right" {{action "removeVizWidget" "cpuVcores"}}></div>
+            <h4 class="text-center">Flow Run Vs CPU VCores</h4>
+            {{simple-bar-chart
+              class="chart-panel"
+              data=cpuVCoresVizData
+              xAxisTickFormatter=flowrunIdFormatter
+              xAxisText="Flow Run"
+              yAxisText="CPU VCores"
+              onBarChartClickCallback=onBarChartClick
+            }}
+          </div>
+        </div>
+      </div>
+    {{/if}}
+
+    {{#if (and memoryVizData.length vizWidgets.memoryUsed)}}
+      <div class="row">
+        <div class="panel panel-default">
+          <div class="panel-body">
+            <div class="glyphicon glyphicon-remove pull-right" {{action "removeVizWidget" "memoryUsed"}}></div>
+            <h4 class="text-center">Flow Run Vs Memory Used</h4>
+            {{simple-bar-chart
+              class="chart-panel"
+              data=memoryVizData
+              xAxisTickFormatter=flowrunIdFormatter
+              yAxisTickFormatter=memoryFormatter
+              xAxisText="Flow Run"
+              yAxisText="Memory Used"
+              onBarChartClickCallback=onBarChartClick
+            }}
+          </div>
+        </div>
+      </div>
+    {{/if}}
+  </div>
+
+</div>

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun-metric.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun-metric.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun-metric.hbs
new file mode 100644
index 0000000..832b47a
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun-metric.hbs
@@ -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.
+--}}
+
+<div class="container">
+  <div class="row">
+    <h4>Sunburst chart for Metric "{{metric_id}}"</h4>
+    <h4>(Flowrun: {{flowrun.id}})</h4>
+    <div id="main">
+     <div id="sequence"></div>
+      <div id="chart">
+        <div id="explanation" style="visibility: hidden;">
+          <span id="percentage"></span>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+{{sunburst-chart arr=arr}}
+{{outlet}}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun.hbs
new file mode 100644
index 0000000..eb0b4bd
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun.hbs
@@ -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.
+--}}
+
+<div class="col-md-12 container-fluid">
+  <div class="row">
+    {{breadcrumb-bar breadcrumbs=breadcrumbs}}
+  </div>
+  <div class="row">
+    <div class="col-md-2">
+      <div class="panel panel-default">
+        <div class="panel-heading">
+          <div class="panel-title">
+            Flow Run Information
+          </div>
+        </div>
+        <div class="panel-body">
+          <ul class="nav nav-pills nav-stacked" id="stacked-menu">
+            <ul class="nav nav-pills nav-stacked collapse in">
+              {{#link-to 'yarn-flowrun.info' tagName="li"}}
+                {{#link-to 'yarn-flowrun.info' model.flowrun_uid}}Information{{/link-to}}
+              {{/link-to}}
+              {{#link-to 'yarn-flowrun.metrics' tagName="li"}}
+                {{#link-to 'yarn-flowrun.metrics' model.flowrun_uid}}Metrics{{/link-to}}
+              {{/link-to}}
+            </ul>
+          </ul>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-10">
+      {{outlet}}
+    </div>
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun/info.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun/info.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun/info.hbs
new file mode 100644
index 0000000..f7e726c
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun/info.hbs
@@ -0,0 +1,128 @@
+{{!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+--}}
+
+<div class="yarn-flow-runinfo">
+  <h3>Flow Run Info</h3>
+  <div class="panel panel-default">
+    <div class="panel-body">
+      <table class="table table-striped table-bordered">
+        <tbody>
+          <tr>
+            <td>Flow Name</td>
+            <td>{{model.flowrun.flowName}}</td>
+          </tr>
+          <tr>
+            <td>Run ID</td>
+            <td>{{model.flowrun.shownid}}</td>
+          </tr>
+          <tr>
+            <td>Launched By</td>
+            <td>{{model.flowrun.user}}</td>
+          </tr>
+          <tr>
+            <td>Run Sequence ID</td>
+            <td>{{model.flowrun.runid}}</td>
+          </tr>
+          <tr>
+            <td>Start Time</td>
+            <td>{{model.flowrun.createTime}}</td>
+          </tr>
+          <tr>
+            <td>End Time</td>
+            <td>{{model.flowrun.endTime}}</td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </div>
+
+  {{#if (or cpuVCoresVizData.length memoryVizData.length)}}
+  <div class="dropdown pull-right">
+    <button class="btn btn-sm btn-primary dropdown-toggle" type="button" data-toggle="dropdown">
+      Add Metrics Widget <span class="caret"></span>
+    </button>
+    <ul class="dropdown-menu">
+      {{#if cpuVCoresVizData.length}}
+        <li>
+          <a href="#" {{action "addVizWidget" "cpuVcores"}}>
+            <div class="item-icon">
+              {{#if vizWidgets.cpuVcores}}
+                <i class="glyphicon glyphicon-ok text-success"></i>
+              {{/if}}
+            </div>
+            <div class="item-text">Application Vs Cpu Vcores</div>
+          </a>
+        </li>
+      {{/if}}
+      {{#if memoryVizData.length}}
+        <li>
+          <a href="#" {{action "addVizWidget" "memoryUsed"}}>
+            <div class="item-icon">
+              {{#if vizWidgets.memoryUsed}}
+                <i class="glyphicon glyphicon-ok text-success"></i>
+              {{/if}}
+            </div>
+            <div class="item-text">Application Vs Memory Used</div>
+          </a>
+        </li>
+      {{/if}}
+    </ul>
+  </div>
+  {{/if}}
+
+  <!-- Flowrun aggregated data -->
+  <h3>Applications</h3>
+  {{em-table columns=columns rows=model.apps}}
+
+  {{#if (and cpuVCoresVizData.length vizWidgets.cpuVcores)}}
+    <div class="panel panel-default">
+      <div class="panel-body">
+        <div class="glyphicon glyphicon-remove pull-right" {{action "removeVizWidget" "cpuVcores"}}>
+        </div>
+        <h4 class="text-center">Application Vs CPU VCores</h4>
+        {{simple-bar-chart
+          class="chart-panel"
+          data=cpuVCoresVizData
+          xAxisTickFormatter=appIdFormatter
+          xAxisText="Application"
+          yAxisText="CPU VCores"
+          onBarChartClickCallback=onBarChartClick
+        }}
+      </div>
+    </div>
+  {{/if}}
+
+  {{#if (and memoryVizData.length vizWidgets.memoryUsed)}}
+    <div class="panel panel-default">
+      <div class="panel-body">
+        <div class="glyphicon glyphicon-remove pull-right" {{action "removeVizWidget" "memoryUsed"}}>
+        </div>
+        <h4 class="text-center">Application Vs Memory Used</h4>
+        {{simple-bar-chart
+          class="chart-panel"
+          data=memoryVizData
+          xAxisTickFormatter=appIdFormatter
+          yAxisTickFormatter=memoryFormatter
+          xAxisText="Application"
+          yAxisText="Memory Used"
+          onBarChartClickCallback=onBarChartClick
+        }}
+      </div>
+    </div>
+  {{/if}}
+</div>

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun/metrics.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun/metrics.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun/metrics.hbs
new file mode 100644
index 0000000..1863237
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flowrun/metrics.hbs
@@ -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.
+--}}
+
+<h3>Flow Run <small>{{model.flowrun_uid}}</small></h3>
+<hr>
+
+<h3>GENERAL Metrics</h3>
+{{em-table columns=columns rows=generalConfigRows}}
+
+{{#if mapMetrics}}
+  <hr>
+  <h3>MAP Metrics</h3>
+  {{em-table columns=columns rows=mapConfigRows}}
+{{/if}}
+
+{{#if reduceMetrics}}
+  <h3>REDUCER Metrics</h3>
+  {{em-table columns=columns rows=reduceConfigRows}}
+{{/if}}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-services.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-services.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-services.hbs
index 649834a..9637a93 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-services.hbs
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-services.hbs
@@ -25,7 +25,7 @@
     <div class="col-md-2 container-fluid">
       <div class="panel panel-default">
         <div class="panel-heading">
-          <h4>Services</h4>
+          Services
         </div>
         <div class="panel-body">
           <ul class="nav nav-pills nav-stacked" id="stacked-menu">

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js
index 4f24651..7c9a1f8 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js
@@ -22,7 +22,7 @@ export default {
   containerIdToAttemptId: function(containerId) {
     if (containerId) {
       var arr = containerId.split('_');
-      var attemptId = ["appattempt", arr[1], 
+      var attemptId = ["appattempt", arr[1],
         arr[2], this.padding(arr[3], 6)];
       return attemptId.join('_');
     }
@@ -30,7 +30,7 @@ export default {
   attemptIdToAppId: function(attemptId) {
     if (attemptId) {
       var arr = attemptId.split('_');
-      var appId = ["application", arr[1], 
+      var appId = ["application", arr[1],
         arr[2]].join('_');
       return appId;
     }
@@ -85,6 +85,10 @@ export default {
     var dateTimeString = moment(parseInt(timeStamp)).format("YYYY/MM/DD HH:mm:ss");
     return dateTimeString;
   },
+  timeStampToDateOnly: function(timeStamp) {
+    var dateTimeString = moment(parseInt(timeStamp)).format("YYYY/MM/DD");
+    return dateTimeString;
+  },
   dateToTimeStamp: function(date) {
     if (date) {
       var ts = moment(date, "YYYY/MM/DD HH:mm:ss").valueOf();
@@ -126,7 +130,7 @@ export default {
     }
     return value.toFixed(1) + " " + unit;
   },
-  msToElapsedTimeUnit: function(millisecs) {
+  msToElapsedTimeUnit: function(millisecs, short) {
     var seconds = Math.floor(millisecs / 1000);
     var days = Math.floor(seconds / (3600 * 24));
     var hours = Math.floor(seconds / 3600) - (days * 24);
@@ -148,6 +152,18 @@ export default {
     }
     pluralize = secs > 1? " Secs" : " Sec";
     timeStrArr.push(secs + pluralize);
+    if (short) {
+      return timeStrArr[0] + (timeStrArr[1]? " : " + timeStrArr[1] : "");
+    }
     return timeStrArr.join(" : ");
+  },
+  memoryBytesToMB: function(mem) {
+    var unit = "MB";
+    var value = mem / (1024 * 1024);
+    if (value / 1024 >= 0.9) {
+      value = value / 1024;
+      unit = "GB";
+    }
+    return value.toFixed(1) + " " + unit;
   }
 };

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/error-utils.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/error-utils.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/error-utils.js
new file mode 100644
index 0000000..463f61f
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/error-utils.js
@@ -0,0 +1,58 @@
+/**
+ * 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.
+ */
+
+export default {
+  getErrorTypeByErrorCode: function(code) {
+    var errorType = '';
+    if (code) {
+      switch (code) {
+        case "500":
+          errorType = "Internal Server Error";
+          break;
+        case "502":
+          errorType = "Bad Gateway";
+          break;
+        case "503":
+          errorType = "Service Unavailable";
+          break;
+        case "400":
+          errorType = "Bad Request";
+          break;
+        case "403":
+          errorType = "Forbidden";
+          break;
+        case "404":
+          errorType = "Not Found";
+          break;
+        default:
+          errorType = "";
+          break;
+      }
+    }
+    return errorType;
+  },
+  stripErrorCodeAndMessageFromError: function(err) {
+    var obj = {};
+    if (err && err.errors && err.errors[0]) {
+      obj.errorCode = err.errors[0].status || "";
+      obj.title = err.errors[0].title || "";
+      obj.errorType = this.getErrorTypeByErrorCode(err.errors[0].status);
+    }
+    return obj;
+  }
+};

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/config/default-config.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/config/default-config.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/config/default-config.js
index 70d4ebc..8ab7ce1 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/config/default-config.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/config/default-config.js
@@ -27,6 +27,7 @@ module.exports = { // Yarn UI App configurations
       timeline: 'ws/v1/applicationhistory',
       cluster: 'ws/v1/cluster',
       metrics: 'ws/v1/cluster/metrics',
-      node: '{nodeAddress}/ws/v1/node'
+      node: '{nodeAddress}/ws/v1/node',
+      timelineV2: 'ws/v2/timeline'
     },
 };

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/package.json
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/package.json b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/package.json
index 105dad3..2964d33 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/package.json
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/package.json
@@ -46,6 +46,7 @@
     "ember-data": "2.1.0",
     "ember-disable-proxy-controllers": "1.0.1",
     "ember-export-application-global": "1.0.5",
+    "ember-lodash": "0.0.10",
     "ember-resolver": "2.0.3",
     "ember-spin-spinner": "0.2.3",
     "ember-truth-helpers": "1.2.0",

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/integration/components/simple-bar-chart-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/integration/components/simple-bar-chart-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/integration/components/simple-bar-chart-test.js
new file mode 100644
index 0000000..7298e65
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/integration/components/simple-bar-chart-test.js
@@ -0,0 +1,43 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('simple-bar-chart', 'Integration | Component | simple bar chart', {
+  integration: true
+});
+
+test('it renders', function(assert) {
+
+  // Set any properties with this.set('myProperty', 'value');
+  // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL +
+
+  this.render(hbs`{{simple-bar-chart}}`);
+
+  assert.equal(this.$().text().trim(), '');
+
+  // Template block usage:" + EOL +
+  this.render(hbs`
+    {{#simple-bar-chart}}
+      template block text
+    {{/simple-bar-chart}}
+  `);
+
+  assert.equal(this.$().text().trim(), 'template block text');
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-app-timeline-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-app-timeline-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-app-timeline-test.js
new file mode 100644
index 0000000..e53d289
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-app-timeline-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:yarn-app-timeline', 'Unit | Adapter | yarn app timeline', {
+  // Specify the other units that are required for this test.
+  // needs: ['serializer:foo']
+});
+
+// Replace this with your real tests.
+test('it exists', function(assert) {
+  let adapter = this.subject();
+  assert.ok(adapter);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-timeline-appattempt-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-timeline-appattempt-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-timeline-appattempt-test.js
new file mode 100644
index 0000000..013713f
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-timeline-appattempt-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:yarn-timeline-appattempt', 'Unit | Adapter | yarn timeline appattempt', {
+  // Specify the other units that are required for this test.
+  // needs: ['serializer:foo']
+});
+
+// Replace this with your real tests.
+test('it exists', function(assert) {
+  let adapter = this.subject();
+  assert.ok(adapter);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-timeline-container-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-timeline-container-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-timeline-container-test.js
new file mode 100644
index 0000000..9167268
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/adapters/yarn-timeline-container-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:yarn-timeline-container', 'Unit | Adapter | yarn timeline container', {
+  // Specify the other units that are required for this test.
+  // needs: ['serializer:foo']
+});
+
+// Replace this with your real tests.
+test('it exists', function(assert) {
+  let adapter = this.subject();
+  assert.ok(adapter);
+});

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

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/controllers/yarn-flow/runs-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/controllers/yarn-flow/runs-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/controllers/yarn-flow/runs-test.js
new file mode 100644
index 0000000..aa80a0f
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/controllers/yarn-flow/runs-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('controller:yarn-flow/runs', 'Unit | Controller | yarn flow/runs', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+// Replace this with your real tests.
+test('it exists', function(assert) {
+  let controller = this.subject();
+  assert.ok(controller);
+});

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

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/controllers/yarn-flowrun/metrics-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/controllers/yarn-flowrun/metrics-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/controllers/yarn-flowrun/metrics-test.js
new file mode 100644
index 0000000..9f1650b
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/controllers/yarn-flowrun/metrics-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('controller:yarn-flowrun/metrics', 'Unit | Controller | yarn flowrun/metrics', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+// Replace this with your real tests.
+test('it exists', function(assert) {
+  let controller = this.subject();
+  assert.ok(controller);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/mixins/app-attempt-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/mixins/app-attempt-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/mixins/app-attempt-test.js
new file mode 100644
index 0000000..af7b3dc
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/mixins/app-attempt-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 Ember from 'ember';
+import AppAttemptMixin from '../../../mixins/app-attempt';
+import { module, test } from 'qunit';
+
+module('Unit | Mixin | app attempt');
+
+// Replace this with your real tests.
+test('it works', function(assert) {
+  let AppAttemptObject = Ember.Object.extend(AppAttemptMixin);
+  let subject = AppAttemptObject.create();
+  assert.ok(subject);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/mixins/charts-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/mixins/charts-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/mixins/charts-test.js
deleted file mode 100644
index 1f5ab99..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/mixins/charts-test.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * 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 ChartsMixin from '../../../mixins/charts';
-import { module, test } from 'qunit';
-
-module('Unit | Mixin | charts');
-
-// Replace this with your real tests.
-test('it works', function(assert) {
-  var ChartsObject = Ember.Object.extend(ChartsMixin);
-  var subject = ChartsObject.create();
-  assert.ok(subject);
-});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/models/yarn-app-timeline-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/models/yarn-app-timeline-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/models/yarn-app-timeline-test.js
new file mode 100644
index 0000000..e2d7e2a
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/models/yarn-app-timeline-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 { moduleForModel, test } from 'ember-qunit';
+
+moduleForModel('yarn-app-timeline', 'Unit | Model | yarn app timeline', {
+  // Specify the other units that are required for this test.
+  needs: []
+});
+
+test('it exists', function(assert) {
+  let model = this.subject();
+  // let store = this.store();
+  assert.ok(!!model);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/models/yarn-timeline-appattempt-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/models/yarn-timeline-appattempt-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/models/yarn-timeline-appattempt-test.js
new file mode 100644
index 0000000..854030d
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/models/yarn-timeline-appattempt-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 { moduleForModel, test } from 'ember-qunit';
+
+moduleForModel('yarn-timeline-appattempt', 'Unit | Model | yarn timeline appattempt', {
+  // Specify the other units that are required for this test.
+  needs: []
+});
+
+test('it exists', function(assert) {
+  let model = this.subject();
+  // let store = this.store();
+  assert.ok(!!model);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/models/yarn-timeline-container-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/models/yarn-timeline-container-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/models/yarn-timeline-container-test.js
new file mode 100644
index 0000000..bc9da86
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/models/yarn-timeline-container-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 { moduleForModel, test } from 'ember-qunit';
+
+moduleForModel('yarn-timeline-container', 'Unit | Model | yarn timeline container', {
+  // Specify the other units that are required for this test.
+  needs: []
+});
+
+test('it exists', function(assert) {
+  let model = this.subject();
+  // let store = this.store();
+  assert.ok(!!model);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/timeline-error-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/timeline-error-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/timeline-error-test.js
new file mode 100644
index 0000000..840b64b
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/timeline-error-test.js
@@ -0,0 +1,29 @@
+/**
+ * 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:timeline-error', 'Unit | Route | timeline error', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+test('it exists', function(assert) {
+  let route = this.subject();
+  assert.ok(route);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flow/info-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flow/info-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flow/info-test.js
new file mode 100644
index 0000000..4b5bd383
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flow/info-test.js
@@ -0,0 +1,29 @@
+/**
+ * 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:yarn-flow/info', 'Unit | Route | yarn flow/info', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+test('it exists', function(assert) {
+  let route = this.subject();
+  assert.ok(route);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flow/runs-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flow/runs-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flow/runs-test.js
new file mode 100644
index 0000000..f890b76
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flow/runs-test.js
@@ -0,0 +1,29 @@
+/**
+ * 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:yarn-flow/runs', 'Unit | Route | yarn flow/runs', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+test('it exists', function(assert) {
+  let route = this.subject();
+  assert.ok(route);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flowrun/info-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flowrun/info-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flowrun/info-test.js
new file mode 100644
index 0000000..5c24276
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flowrun/info-test.js
@@ -0,0 +1,29 @@
+/**
+ * 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:yarn-flowrun/info', 'Unit | Route | yarn flowrun/info', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+test('it exists', function(assert) {
+  let route = this.subject();
+  assert.ok(route);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flowrun/metrics-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flowrun/metrics-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flowrun/metrics-test.js
new file mode 100644
index 0000000..ad30840
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/routes/yarn-flowrun/metrics-test.js
@@ -0,0 +1,29 @@
+/**
+ * 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:yarn-flowrun/metrics', 'Unit | Route | yarn flowrun/metrics', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+test('it exists', function(assert) {
+  let route = this.subject();
+  assert.ok(route);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/serializers/yarn-app-timeline-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/serializers/yarn-app-timeline-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/serializers/yarn-app-timeline-test.js
new file mode 100644
index 0000000..11a21db
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/serializers/yarn-app-timeline-test.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 { moduleForModel, test } from 'ember-qunit';
+
+moduleForModel('yarn-app-timeline', 'Unit | Serializer | yarn app timeline', {
+  // Specify the other units that are required for this test.
+  needs: ['serializer:yarn-app-timeline']
+});
+
+// Replace this with your real tests.
+test('it serializes records', function(assert) {
+  let record = this.subject();
+
+  let serializedRecord = record.serialize();
+
+  assert.ok(serializedRecord);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/serializers/yarn-timeline-appattempt-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/serializers/yarn-timeline-appattempt-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/serializers/yarn-timeline-appattempt-test.js
new file mode 100644
index 0000000..4e9146c
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/serializers/yarn-timeline-appattempt-test.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 { moduleForModel, test } from 'ember-qunit';
+
+moduleForModel('yarn-timeline-appattempt', 'Unit | Serializer | yarn timeline appattempt', {
+  // Specify the other units that are required for this test.
+  needs: ['serializer:yarn-timeline-appattempt']
+});
+
+// Replace this with your real tests.
+test('it serializes records', function(assert) {
+  let record = this.subject();
+
+  let serializedRecord = record.serialize();
+
+  assert.ok(serializedRecord);
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/serializers/yarn-timeline-container-test.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/serializers/yarn-timeline-container-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/serializers/yarn-timeline-container-test.js
new file mode 100644
index 0000000..e55fea0
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/unit/serializers/yarn-timeline-container-test.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 { moduleForModel, test } from 'ember-qunit';
+
+moduleForModel('yarn-timeline-container', 'Unit | Serializer | yarn timeline container', {
+  // Specify the other units that are required for this test.
+  needs: ['serializer:yarn-timeline-container']
+});
+
+// Replace this with your real tests.
+test('it serializes records', function(assert) {
+  let record = this.subject();
+
+  let serializedRecord = record.serialize();
+
+  assert.ok(serializedRecord);
+});


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org


[2/3] hadoop git commit: YARN-5705. Show timeline data from ATS v2 in new web UI. Contributed by Akhil PB.

Posted by su...@apache.org.
http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-flowrun-brief.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-flowrun-brief.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-flowrun-brief.js
new file mode 100644
index 0000000..8d9fca3
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-flowrun-brief.js
@@ -0,0 +1,70 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+import Converter from 'yarn-ui/utils/converter';
+
+export default DS.Model.extend({
+  flowName: DS.attr('string'),
+  runid: DS.attr('string'),
+  shownid: DS.attr('string'),
+  type: DS.attr('string'),
+  createTime: DS.attr('string'),
+  createTimeRaw: DS.attr(),
+  endTime: DS.attr('string'),
+  endTimeRaw: DS.attr(),
+  user: DS.attr('string'),
+  uid: DS.attr('string'),
+  cpuVCores: DS.attr('number'),
+  memoryUsed: DS.attr('number'),
+
+  runDurationTs: function() {
+    var duration = this.get('endTimeRaw') - this.get('createTimeRaw');
+    if (duration <= 0) {
+      duration = Date.now() - this.get('createTimeRaw');
+    }
+    return duration;
+  }.property('createTimeRaw', 'endTimeRaw'),
+
+  getElapsedTimeVizDataForBarChart: function() {
+    return {
+      label: this.get('runid'),
+      value: this.get('runDurationTs'),
+      tooltip: this.get("shownid") + "<br>" + Converter.msToElapsedTimeUnit(this.get('runDurationTs')),
+      flowrunUid: this.get('uid')
+    };
+  },
+
+  getCpuVCoresVizDataForBarChart: function() {
+    return {
+      label: this.get('runid'),
+      value: this.get('cpuVCores'),
+      tooltip: this.get("shownid") + "<br>" + 'CPU VCores: ' + this.get('cpuVCores'),
+      flowrunUid: this.get('uid')
+    };
+  },
+
+  getMemoryVizDataForBarChart: function() {
+    return {
+      label: this.get('runid'),
+      value: this.get('memoryUsed'),
+      tooltip: this.get("shownid") + "<br>" + 'Memory Used: ' + Converter.memoryBytesToMB(this.get('memoryUsed')),
+      flowrunUid: this.get('uid')
+    };
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-flowrun.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-flowrun.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-flowrun.js
new file mode 100644
index 0000000..5e3a050
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-flowrun.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 DS from 'ember-data';
+
+// For now, similar to yarn-flowrun-brief, but may add more in future.
+
+export default DS.Model.extend({
+  flowName: DS.attr('string'),
+  runid: DS.attr('string'),
+  shownid: DS.attr('string'),
+  type: DS.attr('string'),
+  createTime: DS.attr('string'),
+  endTime: DS.attr('string'),
+  user: DS.attr('string'),
+  metrics: DS.attr('array')
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-timeline-appattempt.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-timeline-appattempt.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-timeline-appattempt.js
new file mode 100644
index 0000000..dd95765
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-timeline-appattempt.js
@@ -0,0 +1,143 @@
+/**
+ * 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 Converter from 'yarn-ui/utils/converter';
+
+export default DS.Model.extend({
+  startTime: DS.attr('string'),
+  startedTime: DS.attr('string'),
+  finishedTime: DS.attr('string'),
+  containerId: DS.attr('string'),
+  amContainerId: DS.attr('string'),
+  nodeHttpAddress: DS.attr('string'),
+  nodeId: DS.attr('string'),
+  hosts: DS.attr('string'),
+  logsLink: DS.attr('string'),
+  state: DS.attr('string'),
+  appAttemptId: DS.attr('string'),
+
+  appId: Ember.computed("id",function () {
+    var id = this.get("id");
+    id = id.split("_");
+
+    id[0] = "application";
+    id.pop();
+
+    return id.join("_");
+  }),
+
+  attemptStartedTime: function() {
+    var startTime = this.get("startTime");
+    // If startTime variable is not present, get from startedTime
+    if (startTime === undefined ||
+      startTime === "Invalid date") {
+      startTime = this.get("startedTime");
+    }
+
+    return startTime;
+  }.property("startedTime"),
+
+  startTs: function() {
+    return Converter.dateToTimeStamp(this.get('attemptStartedTime'));
+  }.property("startTime"),
+
+  finishedTs: function() {
+    var ts = Converter.dateToTimeStamp(this.get("finishedTime"));
+    return ts;
+  }.property("finishedTime"),
+
+  validatedFinishedTs: function() {
+    if (this.get("finishedTs") < this.get("startTs")) {
+      return "";
+    }
+    return this.get("finishedTime");
+  }.property("finishedTime"),
+
+  shortAppAttemptId: function() {
+    if (!this.get("containerId")) {
+      return this.get("id");
+    }
+    return "attempt_" +
+           parseInt(Converter.containerIdToAttemptId(this.get("containerId")).split("_")[3]);
+  }.property("containerId"),
+
+  appMasterContainerId: function() {
+    var id = this.get("containerId");
+    // If containerId variable is not present, get from amContainerId
+    if (id === undefined) {
+      id = this.get("amContainerId");
+    }
+    return id;
+  }.property("amContainerId"),
+
+  IsAmNodeUrl: function() {
+    var url = this.get("nodeHttpAddress");
+      // If nodeHttpAddress variable is not present, hardcode it.
+    if (url === undefined) {
+      url = "Not Available";
+    }
+    return url !== "Not Available";
+  }.property("nodeHttpAddress"),
+
+  amNodeId : function() {
+    var id = this.get("nodeId");
+    // If nodeId variable is not present, get from host
+    if (id === undefined) {
+      id = this.get("hosts");
+    }
+    return id;
+  }.property("nodeId"),
+
+  IsLinkAvailable: function() {
+    var url = this.get("logsLink");
+    // If logsLink variable is not present, hardcode its.
+    if (url === undefined) {
+      url = "Not Available";
+    }
+    return url !== "Not Available";
+  }.property("logsLink"),
+
+  elapsedTime: function() {
+    var elapsedMs = this.get("finishedTs") - this.get("startTs");
+    if (elapsedMs <= 0) {
+      elapsedMs = Date.now() - this.get("startTs");
+    }
+    return Converter.msToElapsedTimeUnit(elapsedMs);
+  }.property(),
+
+  tooltipLabel: function() {
+    return "<p>Id:" + this.get("id") +
+           "</p><p>ElapsedTime:" +
+           String(this.get("elapsedTime")) + "</p>";
+  }.property(),
+
+  link: function() {
+    return "/yarn-app-attempt/" + this.get("id");
+  }.property(),
+
+  linkname: function() {
+    return "yarn-app-attempt";
+  }.property(),
+
+  attemptState: function() {
+    return this.get("state");
+  }.property(),
+
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-timeline-container.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-timeline-container.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-timeline-container.js
new file mode 100644
index 0000000..7f39345
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-timeline-container.js
@@ -0,0 +1,63 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+import Converter from 'yarn-ui/utils/converter';
+
+export default DS.Model.extend({
+  allocatedMB: DS.attr('number'),
+  allocatedVCores: DS.attr('number'),
+  assignedNodeId: DS.attr('string'),
+  priority: DS.attr('number'),
+  startedTime: DS.attr('number'),
+  finishedTime: DS.attr('number'),
+  logUrl: DS.attr('string'),
+  containerExitStatus: DS.attr('number'),
+  containerState: DS.attr('string'),
+  nodeHttpAddress: DS.attr('string'),
+
+  startTs: function() {
+    return Converter.dateToTimeStamp(this.get("startedTime"));
+  }.property("startedTime"),
+
+  finishedTs: function() {
+    var ts = Converter.dateToTimeStamp(this.get("finishedTime"));
+    return ts;
+  }.property("finishedTime"),
+
+  validatedFinishedTs: function() {
+    if (this.get("finishedTs") < this.get("startTs")) {
+      return "";
+    }
+    return this.get("finishedTime");
+  }.property("finishedTime"),
+
+  elapsedTime: function() {
+    var elapsedMs = this.get("finishedTs") - this.get("startTs");
+    if (elapsedMs <= 0) {
+      elapsedMs = Date.now() - this.get("startTs");
+    }
+    return Converter.msToElapsedTimeUnit(elapsedMs);
+  }.property(),
+
+  tooltipLabel: function() {
+    return "<p>Id:" + this.get("id") +
+           "</p><p>ElapsedTime:" +
+           String(this.get("elapsedTime")) + "</p>";
+  }.property(),
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/router.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/router.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/router.js
index a45861e..00d6d3e 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/router.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/router.js
@@ -56,6 +56,18 @@ Router.map(function() {
   this.route('notfound', { path: '*:' });
   this.route('yarn-app-attempts', { path: '/yarn-app-attempts/:app_id' });
   this.route('yarn-queues', { path: '/yarn-queues/:queue_name' });
+
+  this.route('yarn-flow-activity');
+  this.route('yarn-flow', { path: '/yarn-flow/:flow_uid'}, function() {
+    this.route('info');
+    this.route('runs');
+  });
+  this.route('yarn-flowrun', { path: '/yarn-flowrun/:flowrun_uid'}, function() {
+    this.route('info');
+    this.route('metrics');
+  });
+  this.route('yarn-flowrun-metric', { path: '/yarn-flowrun-metric/:flowrun_uid/:metric_id'});
+  this.route('timeline-error', {path: 'timeline-error/:error_id'});
 });
 
 export default Router;

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/timeline-error.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/timeline-error.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/timeline-error.js
new file mode 100644
index 0000000..c2e5fc5
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/timeline-error.js
@@ -0,0 +1,29 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Route.extend({
+  afterModel(model/*, transition*/) {
+    model.error_id = "error";
+    model.isValidErrorCode = false;
+    if (model.errorCode && model.errorCode !== "0") {
+      model.isValidErrorCode = true;
+    }
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempt.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempt.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempt.js
index d449adf..b561bf6 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempt.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempt.js
@@ -17,34 +17,28 @@
  */
 
 import Ember from 'ember';
-
 import AbstractRoute from './abstract';
+import AppAttemptMixin from 'yarn-ui/mixins/app-attempt';
 
-export default AbstractRoute.extend({
+export default AbstractRoute.extend(AppAttemptMixin, {
   model(param) {
     return Ember.RSVP.hash({
-      attempt: this.store.findRecord('yarn-app-attempt', param.app_attempt_id, {reload: true}),
-
-      rmContainers: this.store.query('yarn-container',
-        {
-          app_attempt_id: param.app_attempt_id,
-          is_rm: true
-        }),
-
-      tsContainers: this.store.query('yarn-container',
-        {
-          app_attempt_id: param.app_attempt_id,
-          is_rm: false
-        }).catch (function() {
-         // Promise rejected, fulfill with some default value to
-         // use as the route's model and continue on with the transition
-          return [];
-        })
+      attempt: this.fetchAttemptInfoFromRMorATS(param.app_attempt_id, this.store),
+      rmContainers: this.store.query('yarn-container', {
+        app_attempt_id: param.app_attempt_id
+      }),
+      tsContainers: this.store.query('yarn-timeline-container', {
+        app_attempt_id: param.app_attempt_id
+      }).catch(function() {
+        return [];
+      })
     });
   },
 
   unloadAll() {
     this.store.unloadAll('yarn-app-attempt');
+    this.store.unloadAll('yarn-timeline-appattempt');
     this.store.unloadAll('yarn-container');
+    this.store.unloadAll('yarn-timeline-container');
   }
 });

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempts.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempts.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempts.js
index 78ff1c9..233bfc8 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempts.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempts.js
@@ -16,19 +16,20 @@
  * limitations under the License.
  */
 
+import Ember from 'ember';
 import AbstractRoute from './abstract';
+import AppAttemptMixin from 'yarn-ui/mixins/app-attempt';
 
-export default AbstractRoute.extend({
+export default AbstractRoute.extend(AppAttemptMixin, {
   model(param) {
-    return this.store.query('yarn-app-attempt', { appId: param.app_id}).then(function (attempts) {
-      return {
-        appId: param.app_id,
-        attempts: attempts
-      };
+    return Ember.RSVP.hash({
+      appId: param.app_id,
+      attempts: this.fetchAttemptListFromRMorATS(param.app_id, this.store)
     });
   },
 
   unloadAll() {
     this.store.unloadAll('yarn-app-attempt');
+    this.store.unloadAll('yarn-timeline-appattempt');
   }
 });

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app.js
index 86d845c..98b0cc8 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app.js
@@ -17,29 +17,26 @@
  */
 
 import Ember from 'ember';
-
 import AbstractRoute from './abstract';
+import AppAttemptMixin from 'yarn-ui/mixins/app-attempt';
 
-export default AbstractRoute.extend({
+export default AbstractRoute.extend(AppAttemptMixin, {
   model(param) {
     return Ember.RSVP.hash({
-      app: this.store.find('yarn-app', param.app_id),
+      app: this.fetchAppInfoFromRMorATS(param.app_id, this.store),
 
       rmContainers: this.store.find('yarn-app', param.app_id).then(function() {
         return this.store.query('yarn-app-attempt', {appId: param.app_id}).then(function (attempts) {
           if (attempts && attempts.get('firstObject')) {
             var appAttemptId = attempts.get('firstObject').get('appAttemptId');
-            var rmContainers = this.store.query('yarn-container',
-              {
-                app_attempt_id: appAttemptId,
-                is_rm: true
-              });
-            return rmContainers;
+            return this.store.query('yarn-container', {
+              app_attempt_id: appAttemptId
+            });
           }
         }.bind(this));
       }.bind(this)),
 
-      nodes: this.store.findAll('yarn-rm-node'),
+      nodes: this.store.findAll('yarn-rm-node', {reload: true}),
     });
   },
 
@@ -48,5 +45,6 @@ export default AbstractRoute.extend({
     this.store.unloadAll('yarn-app-attempt');
     this.store.unloadAll('yarn-container');
     this.store.unloadAll('yarn-rm-node');
+    this.store.unloadAll('yarn-app-timeline');
   }
 });

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flow-activity.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flow-activity.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flow-activity.js
new file mode 100644
index 0000000..4c1d02e
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flow-activity.js
@@ -0,0 +1,37 @@
+/**
+ * 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';
+import ErrorUtils from 'yarn-ui/utils/error-utils';
+
+export default AbstractRoute.extend({
+  model() {
+    return this.store.findAll('yarn-flow-activity', {reload: true});
+  },
+
+  unloadAll() {
+    this.store.unloadAll('yarn-flow-activity');
+  },
+
+  actions: {
+    error(err/*, transition*/) {
+      var errObj = ErrorUtils.stripErrorCodeAndMessageFromError(err);
+      this.transitionTo('timeline-error', errObj);
+    }
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flow.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flow.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flow.js
new file mode 100644
index 0000000..1da9064
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flow.js
@@ -0,0 +1,53 @@
+/**
+ * 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';
+import ErrorUtils from 'yarn-ui/utils/error-utils';
+
+export default AbstractRoute.extend({
+  model(params) {
+    return Ember.RSVP.hash({
+      flowRuns: this.store.query('yarn-flowrun-brief', {flowuid: params.flow_uid}),
+      flowUid: params.flow_uid,
+      lastFlowExecutionInfo: this.getLastFlowExecutionInfo(params.flow_uid)
+    });
+  },
+
+  getLastFlowExecutionInfo(flowUid) {
+    var yarnfaCtrl = this.controllerFor('yarn-flow-activity');
+    var recentFlow = yarnfaCtrl.getLastFlowExecutionInfoByFlowUid(flowUid);
+    if (recentFlow) {
+      return recentFlow;
+    } else {
+      return null;
+    }
+  },
+
+  unloadAll() {
+    this.store.unloadAll('yarn-flowrun-brief');
+  },
+
+  actions: {
+    error(err/*, transition*/) {
+      var errObj = ErrorUtils.stripErrorCodeAndMessageFromError(err);
+      this.transitionTo('timeline-error', errObj);
+    }
+  }
+});

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

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flow/runs.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flow/runs.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flow/runs.js
new file mode 100644
index 0000000..8719170
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flow/runs.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 Ember from 'ember';
+
+export default Ember.Route.extend({
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flowrun-metric.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flowrun-metric.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flowrun-metric.js
new file mode 100644
index 0000000..3c54259
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flowrun-metric.js
@@ -0,0 +1,107 @@
+/**
+ * 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 ErrorUtils from 'yarn-ui/utils/error-utils';
+
+export default Ember.Route.extend({
+  model: function(params) {
+    var _this = this;
+   var appsArr = [];
+   var flowrun = _this.store.queryRecord('yarn-flowrun', {flowrun_uid: params.flowrun_uid,
+        metricstoretrieve: params.metric_id}).then(function(value) {
+      var apps = _this.store.query('yarn-app-flowrun', {flowrunUid: params.flowrun_uid,
+          metricstoretrieve: params.metric_id}).then(function(value) {
+        for (var i = 0; i < value.content.length; i++) {
+          var tasks = undefined;
+          // No need to fetch task or container info for Job counters.
+          if (params.metric_id.indexOf("JobCounter") === -1) {
+            var entityType = "MAPREDUCE_TASK";
+            // CPU and MEMORY are container metrics.
+            if (params.metric_id === "CPU" || params.metric_id === "MEMORY") {
+              entityType = "YARN_CONTAINER";
+            }
+            tasks = _this.fetchTasksForEntity(value.content[i]._data.uid, params.metric_id, entityType);
+          }
+          appsArr.push(Ember.RSVP.hash({id: value.content[i].id, tasks: tasks , metrics: value.content[i]._data.metrics}));
+        }
+        return Ember.RSVP.all(appsArr);
+      });
+      return Ember.RSVP.hash({run: value, id: value.id, metrics: value._internalModel._data.metrics, apps: apps});
+    });
+    return Ember.RSVP.all([Ember.RSVP.hash({flowrun:flowrun, metricId: params.metric_id})]);
+  },
+
+  fetchTasksForEntity: function(appUid, metricId, entityType) {
+    return this.store.query('yarn-entity', {
+      app_uid: appUid,
+      metricstoretrieve: metricId,
+      entity_type: entityType,
+      metricslimit: 100
+    }).then(function(value) {
+      var tasksArr = [];
+      for (var j = 0; j < value.content.length; j++) {
+        tasksArr.push(Ember.RSVP.hash({id: value.content[j].id, metrics: value.content[j]._data.metrics}));
+      }
+      return Ember.RSVP.all(tasksArr);
+    });
+  },
+
+  getMetricValue: function(metrics) {
+    var metricValue = 0;
+    if (metrics.length > 0) {
+      for (var j in metrics[0].values) {
+        metricValue = metrics[0].values[j];
+        break;
+      }
+    }
+    return metricValue.toString();
+  },
+
+  setupController: function(controller, model) {
+    var metricsArr = [];
+    var flowRunId = model[0].flowrun.id;
+    metricsArr.push([model[0].flowrun.id, this.getMetricValue(model[0].flowrun.metrics)]);
+    for (var i = 0; i < model[0].flowrun.apps.length; i++) {
+      var appId = flowRunId + '-' + model[0].flowrun.apps[i].id;
+      metricsArr.push([appId, this.getMetricValue(model[0].flowrun.apps[i].metrics)]);
+      if (model[0].flowrun.apps[i].tasks) {
+        for (var j = 0; j < model[0].flowrun.apps[i].tasks.length; j++) {
+          var taskId = appId + '-' + model[0].flowrun.apps[i].tasks[j].id;
+          metricsArr.push([taskId, this.getMetricValue(model[0].flowrun.apps[i].tasks[j].metrics)]);
+        }
+      }
+    }
+    controller.set('flowrun', model[0].flowrun);
+    controller.set('metric_id', model[0].metricId);
+    controller.set('arr', metricsArr);
+  },
+
+  unloadAll: function() {
+    this.store.unloadAll('yarn-flowrun');
+    this.store.unloadAll('yarn-app-flowrun');
+    this.store.unloadAll('yarn-entity');
+  },
+
+  actions: {
+    error(err/*, transition*/) {
+      var errObj = ErrorUtils.stripErrorCodeAndMessageFromError(err);
+      this.transitionTo('timeline-error', errObj);
+    }
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flowrun.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flowrun.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flowrun.js
new file mode 100644
index 0000000..3163a67
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flowrun.js
@@ -0,0 +1,58 @@
+/**
+ * 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';
+import ErrorUtils from 'yarn-ui/utils/error-utils';
+
+export default AbstractRoute.extend({
+  model: function(params) {
+    return Ember.RSVP.hash({
+      flowrun: this.store.findRecord('yarn-flowrun', params.flowrun_uid),
+      apps: this.store.query('yarn-app-flowrun', {flowrunUid: params.flowrun_uid}),
+      flowrun_uid: params.flowrun_uid,
+      parentFlowUid: this.getParentFlowUid()
+    });
+  },
+
+  getParentFlowUid: function() {
+    var parentFlowModel = this.modelFor('yarn-flow');
+    if (parentFlowModel) {
+      return parentFlowModel.flowUid;
+    } else {
+      return '';
+    }
+  },
+
+  unloadAll: function() {
+    this.store.unloadAll('yarn-flowrun');
+    this.store.unloadAll('yarn-app-flowrun');
+  },
+
+  actions: {
+    reload: function() {
+      this.modelFor('apps').reload();
+    },
+
+    error(err/*, transition*/) {
+      var errObj = ErrorUtils.stripErrorCodeAndMessageFromError(err);
+      this.transitionTo('timeline-error', errObj);
+    }
+  }
+});

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

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flowrun/metrics.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flowrun/metrics.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flowrun/metrics.js
new file mode 100644
index 0000000..8719170
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-flowrun/metrics.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 Ember from 'ember';
+
+export default Ember.Route.extend({
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app-flowrun.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app-flowrun.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app-flowrun.js
new file mode 100644
index 0000000..289c1cd
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app-flowrun.js
@@ -0,0 +1,64 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+
+export default DS.JSONAPISerializer.extend({
+
+    normalizeSingleResponse(store, primaryModelClass, payload, id,
+      requestType) {
+      var events = payload.events,
+          appFinishedEvent = events.findBy('id', 'YARN_APPLICATION_FINISHED'),
+          finishedTs = appFinishedEvent? appFinishedEvent.timestamp : Date.now(),
+          appState = (appFinishedEvent && appFinishedEvent.info)? appFinishedEvent.info.YARN_APPLICATION_STATE : "N/A",
+          metrics = payload.metrics,
+          cpuMetric = metrics.findBy('id', 'CPU'),
+          memoryMetric = metrics.findBy('id', 'MEMORY'),
+          cpu = cpuMetric? cpuMetric.values[Object.keys(cpuMetric.values)[0]] : -1,
+          memory = memoryMetric? memoryMetric.values[Object.keys(memoryMetric.values)[0]] : -1;
+
+      var fixedPayload = {
+        id: id,
+        type: primaryModelClass.modelName,
+        attributes: {
+          appId: payload.id,
+          type: payload.info.YARN_APPLICATION_TYPE,
+          uid: payload.info.UID,
+          metrics: metrics,
+          startedTs: payload.createdtime,
+          finishedTs: finishedTs,
+          state: payload.info.YARN_APPLICATION_STATE || appState,
+          cpuVCores: cpu,
+          memoryUsed: memory
+        }
+      };
+
+      return this._super(store, primaryModelClass, fixedPayload, id, requestType);
+    },
+
+    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {
+      var normalizedArrayResponse = {};
+
+      normalizedArrayResponse.data = payload.map(singleApp => {
+        return this.normalizeSingleResponse(store, primaryModelClass,
+          singleApp, singleApp.id, requestType);
+      });
+
+      return normalizedArrayResponse;
+    }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app-timeline.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app-timeline.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app-timeline.js
new file mode 100644
index 0000000..680fe8c
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app-timeline.js
@@ -0,0 +1,76 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+import Converter from 'yarn-ui/utils/converter';
+
+export default DS.JSONAPISerializer.extend({
+  internalNormalizeSingleResponse(store, primaryModelClass, payload, id) {
+
+    var events = payload.events,
+        appFinishedEvent = events.findBy('id', 'YARN_APPLICATION_FINISHED'),
+        startedTime = payload.createdtime,
+        finishedTime = appFinishedEvent? appFinishedEvent.timestamp : Date.now(),
+        elapsedTime = finishedTime - startedTime,
+        diagnostics = payload.info.YARN_APPLICATION_DIAGNOSTICS_INFO,
+        priority = payload.info.YARN_APPLICATION_PRIORITY;
+
+    var fixedPayload = {
+      id: id,
+      type: primaryModelClass.modelName,
+      attributes: {
+        appName: payload.info.YARN_APPLICATION_NAME,
+        user: payload.info.YARN_APPLICATION_USER,
+        queue: "N/A",
+        state: payload.info.YARN_APPLICATION_STATE,
+        startTime: Converter.timeStampToDate(startedTime),
+        elapsedTime: elapsedTime,
+        finishedTime: Converter.timeStampToDate(finishedTime),
+        finalStatus: payload.info.YARN_APPLICATION_FINAL_STATUS,
+        progress: 100,
+        applicationType: payload.info.YARN_APPLICATION_TYPE,
+        diagnostics: (diagnostics && diagnostics !== 'null')? diagnostics : '',
+        amContainerLogs: '',
+        amHostHttpAddress: '',
+        logAggregationStatus: '',
+        unmanagedApplication: payload.info.YARN_APPLICATION_UNMANAGED_APPLICATION || 'N/A',
+        amNodeLabelExpression: payload.configs.YARN_AM_NODE_LABEL_EXPRESSION,
+        priority: (priority !== undefined)? priority : 'N/A',
+        allocatedMB: 0,
+        allocatedVCores: 0,
+        runningContainers: 0,
+        memorySeconds: payload.info.YARN_APPLICATION_MEM_METRIC,
+        vcoreSeconds: payload.info.YARN_APPLICATION_CPU_METRIC,
+        preemptedResourceMB: 0,
+        preemptedResourceVCores: 0,
+        numNonAMContainerPreempted: 0,
+        numAMContainerPreempted: 0,
+        clusterUsagePercentage: 0,
+        queueUsagePercentage: 0,
+        currentAppAttemptId: payload.info.YARN_APPLICATION_LATEST_APP_ATTEMPT
+      }
+    };
+
+    return fixedPayload;
+  },
+
+  normalizeSingleResponse(store, primaryModelClass, payload, id/*, requestType*/) {
+    var p = this.internalNormalizeSingleResponse(store, primaryModelClass, payload, id);
+    return {data: p};
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app.js
index 172286f..1462f5a 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app.js
@@ -43,7 +43,6 @@ export default DS.JSONAPISerializer.extend({
           queue: payload.queue,
           state: payload.state,
           startTime: Converter.timeStampToDate(payload.startedTime),
-          //elapsedTime: Converter.msToElapsedTime(payload.elapsedTime),
           elapsedTime: payload.elapsedTime,
           finishedTime: Converter.timeStampToDate(payload.finishedTime),
           finalStatus: payload.finalStatus,
@@ -55,7 +54,7 @@ export default DS.JSONAPISerializer.extend({
           logAggregationStatus: payload.logAggregationStatus,
           unmanagedApplication: payload.unmanagedApplication || 'N/A',
           amNodeLabelExpression: payload.amNodeLabelExpression,
-          priority: payload.priority || 'N/A',
+          priority: (payload.priority !== undefined)? payload.priority : 'N/A',
           allocatedMB: payload.allocatedMB,
           allocatedVCores: payload.allocatedVCores,
           runningContainers: payload.runningContainers,

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-entity.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-entity.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-entity.js
new file mode 100644
index 0000000..9ed70cf
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-entity.js
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+
+export default DS.JSONAPISerializer.extend({
+
+    normalizeSingleResponse(store, primaryModelClass, payload, id,
+      requestType) {
+      var fixedPayload = {
+        id: id,
+        type: primaryModelClass.modelName, // yarn-entity
+        attributes: {
+          entityId: payload.id,
+          type: payload.type,
+          uid: payload.info.UID,
+          metrics: payload.metrics
+        }
+      };
+
+      return this._super(store, primaryModelClass, fixedPayload, id,
+        requestType);
+    },
+
+    normalizeArrayResponse(store, primaryModelClass, payload, id,
+      requestType) {
+      // return expected is { data: [ {}, {} ] }
+      var normalizedArrayResponse = {};
+
+      normalizedArrayResponse.data = payload.map(singleApp => {
+        return this.normalizeSingleResponse(store, primaryModelClass,
+          singleApp, singleApp.id, requestType);
+      }, this);
+      return normalizedArrayResponse;
+    }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-flow-activity.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-flow-activity.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-flow-activity.js
new file mode 100644
index 0000000..c26872b
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-flow-activity.js
@@ -0,0 +1,54 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+import Converter from 'yarn-ui/utils/converter';
+
+export default DS.JSONAPISerializer.extend({
+
+    normalizeSingleResponse(store, primaryModelClass, payload, id,
+      requestType) {
+      var fixedPayload = {
+        id: id,
+        type: primaryModelClass.modelName, // yarn-timeline-flow
+        attributes: {
+          cluster: payload.info.SYSTEM_INFO_CLUSTER,
+          flowName: payload.info.SYSTEM_INFO_FLOW_NAME,
+          lastExecDate: Converter.timeStampToDateOnly(payload.info.SYSTEM_INFO_DATE),
+          user: payload.info.SYSTEM_INFO_USER,
+          flowruns: payload.flowruns,
+          uid: payload.info.UID
+        }
+      };
+
+      return this._super(store, primaryModelClass, fixedPayload, id,
+        requestType);
+    },
+
+    normalizeArrayResponse(store, primaryModelClass, payload, id,
+      requestType) {
+      // return expected is { data: [ {}, {} ] }
+      var normalizedArrayResponse = {};
+
+      normalizedArrayResponse.data = payload.map(singleEntity => {
+        return this.normalizeSingleResponse(store, primaryModelClass,
+          singleEntity, singleEntity.id, requestType);
+      }, this);
+      return normalizedArrayResponse;
+    }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-flowrun-brief.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-flowrun-brief.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-flowrun-brief.js
new file mode 100644
index 0000000..67603bb
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-flowrun-brief.js
@@ -0,0 +1,64 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+import Converter from 'yarn-ui/utils/converter';
+
+export default DS.JSONAPISerializer.extend({
+
+    normalizeSingleResponse(store, primaryModelClass, payload, id,
+      requestType) {
+      var metrics = payload.metrics,
+          cpuMetric = metrics.findBy('id', 'CPU'),
+          cpu = cpuMetric? cpuMetric.values[Object.keys(cpuMetric.values)[0]] : -1,
+          memMetric = metrics.findBy('id', 'MEMORY'),
+          memory = memMetric? memMetric.values[Object.keys(memMetric.values)[0]] : -1;
+
+      var fixedPayload = {
+        id: id,
+        type: primaryModelClass.modelName, // yarn-flowrun-brief
+        attributes: {
+          flowName: payload.info.SYSTEM_INFO_FLOW_NAME,
+          runid: payload.info.SYSTEM_INFO_FLOW_RUN_ID,
+          shownid: payload.id,
+          type: payload.type,
+          createTime: Converter.timeStampToDate(payload.createdtime),
+          createTimeRaw: payload.createdtime,
+          endTime: Converter.timeStampToDate(payload.info.SYSTEM_INFO_FLOW_RUN_END_TIME),
+          endTimeRaw: payload.info.SYSTEM_INFO_FLOW_RUN_END_TIME || 0,
+          user: payload.info.SYSTEM_INFO_USER,
+          uid: payload.info.UID,
+          cpuVCores: cpu,
+          memoryUsed: memory
+        }
+      };
+
+      return this._super(store, primaryModelClass, fixedPayload, id, requestType);
+    },
+
+    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {
+      var normalizedArrayResponse = {data: []};
+
+      normalizedArrayResponse.data = payload.map(singleApp => {
+        return this.normalizeSingleResponse(store, primaryModelClass,
+          singleApp, singleApp.id, requestType);
+      });
+
+      return normalizedArrayResponse;
+    }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-flowrun.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-flowrun.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-flowrun.js
new file mode 100644
index 0000000..931d134
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-flowrun.js
@@ -0,0 +1,63 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+import Converter from 'yarn-ui/utils/converter';
+
+export default DS.JSONAPISerializer.extend({
+
+    internalNormalizeSingleResponse(store, primaryModelClass, payload, id) {
+      var recordId = id;
+      if (!recordId) {
+        recordId = payload.id;
+      }
+      var fixedPayload = {
+        id: recordId,
+        type: primaryModelClass.modelName,
+        attributes: {
+          flowName: payload.info.SYSTEM_INFO_FLOW_NAME,
+          runid: payload.info.SYSTEM_INFO_FLOW_RUN_ID,
+          shownid: payload.id,
+          type: payload.type,
+          createTime: Converter.timeStampToDate(payload.createdtime),
+          endTime: Converter.timeStampToDate(payload.info.SYSTEM_INFO_FLOW_RUN_END_TIME),
+          user: payload.info.SYSTEM_INFO_USER,
+          metrics: payload.metrics,
+        }
+      };
+
+      return fixedPayload;
+    },
+
+    normalizeSingleResponse(store, primaryModelClass, payload, id/*, requestType*/) {
+      var p = this.internalNormalizeSingleResponse(store,
+        primaryModelClass, payload, id);
+      return { data: p };
+    },
+
+    normalizeArrayResponse(store, primaryModelClass, payload/*, id, requestType*/) {
+      // return expected is { data: [ {}, {} ] }
+      var normalizedArrayResponse = {};
+
+      normalizedArrayResponse.data = payload.map(singleApp => {
+        return this.internalNormalizeSingleResponse(store, primaryModelClass,
+          singleApp, singleApp.id);
+      }, this);
+      return normalizedArrayResponse;
+    }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-queue.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-queue.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-queue.js
index 766c5c7..4fc1a29 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-queue.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-queue.js
@@ -116,30 +116,14 @@ export default DS.JSONAPISerializer.extend({
       };
     },
 
-    normalizeArrayResponse(store, primaryModelClass, payload, id,
-      requestType) {
+    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {
       var normalizedArrayResponse = {};
-      var result = this.handleQueue(store,
-        primaryModelClass,
+      var result = this.handleQueue(store, primaryModelClass,
         payload.scheduler.schedulerInfo, "root", requestType);
 
       normalizedArrayResponse.data = result.data;
       normalizedArrayResponse.included = result.includedData;
 
-      console.log(normalizedArrayResponse);
-
-      return normalizedArrayResponse;
-
-      /*
-      // return expected is { data: [ {}, {} ] }
-      var normalizedArrayResponse = {};
-
-      // payload has apps : { app: [ {},{},{} ]  }
-      // need some error handling for ex apps or app may not be defined.
-      normalizedArrayResponse.data = payload.apps.app.map(singleApp => { 
-        return this.normalizeSingleResponse(store, primaryModelClass, singleApp, singleApp.id, requestType);
-      }, this);
       return normalizedArrayResponse;
-      */
     }
-});
\ No newline at end of file
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-timeline-appattempt.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-timeline-appattempt.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-timeline-appattempt.js
new file mode 100644
index 0000000..0245b20
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-timeline-appattempt.js
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+import Ember from 'ember';
+import Converter from 'yarn-ui/utils/converter';
+
+export default DS.JSONAPISerializer.extend({
+    internalNormalizeSingleResponse(store, primaryModelClass, payload) {
+      var payloadEvents = payload.events,
+          createdEvent = payloadEvents.filterBy('id', 'YARN_APPLICATION_ATTEMPT_REGISTERED')[0],
+          startedTime = createdEvent? createdEvent.timestamp : Date.now(),
+          finishedEvent = payloadEvents.filterBy('id', 'YARN_APPLICATION_ATTEMPT_FINISHED')[0],
+          finishedTime = finishedEvent? finishedEvent.timestamp : Date.now();
+
+      var fixedPayload = {
+        id: payload.id,
+        type: primaryModelClass.modelName,
+        attributes: {
+          startTime: Converter.timeStampToDate(startedTime),
+          startedTime: Converter.timeStampToDate(startedTime),
+          finishedTime: Converter.timeStampToDate(finishedTime),
+          containerId: payload.info.YARN_APPLICATION_ATTEMPT_MASTER_CONTAINER,
+          amContainerId: payload.info.YARN_APPLICATION_ATTEMPT_MASTER_CONTAINER,
+          nodeHttpAddress: '',
+          nodeId: '',
+          hosts: payload.info.YARN_APPLICATION_ATTEMPT_HOST,
+          state: payload.info.YARN_APPLICATION_ATTEMPT_HOST,
+          logsLink: '',
+          appAttemptId: payload.id
+        }
+      };
+      return fixedPayload;
+    },
+
+    normalizeSingleResponse(store, primaryModelClass, payload/*, id, requestType*/) {
+      var normalized = this.internalNormalizeSingleResponse(store,
+        primaryModelClass, payload);
+      return {data: normalized};
+    },
+
+    normalizeArrayResponse(store, primaryModelClass, payload/*, id, requestType*/) {
+      var normalizedArrayResponse = {
+        data: []
+      };
+      if (payload && Ember.isArray(payload) && !Ember.isEmpty(payload)) {
+        normalizedArrayResponse.data = payload.map(singleAttempt => {
+          return this.internalNormalizeSingleResponse(store, primaryModelClass,
+            singleAttempt);
+        });
+      }
+      return normalizedArrayResponse;
+    }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-timeline-container.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-timeline-container.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-timeline-container.js
new file mode 100644
index 0000000..f2c60f6
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-timeline-container.js
@@ -0,0 +1,71 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+import Ember from 'ember';
+import Converter from 'yarn-ui/utils/converter';
+
+export default DS.JSONAPISerializer.extend({
+  internalNormalizeSingleResponse(store, primaryModelClass, payload) {
+    var payloadEvents = payload.events,
+        createdEvent = payloadEvents.filterBy('id', 'YARN_RM_CONTAINER_CREATED')[0],
+        startedTime = createdEvent? createdEvent.timestamp : Date.now(),
+        finishedEvent = payloadEvents.filterBy('id', 'YARN_RM_CONTAINER_FINISHED')[0],
+        finishedTime = finishedEvent? finishedEvent.timestamp : Date.now(),
+        containerExitStatus = finishedEvent? finishedEvent.info.YARN_CONTAINER_EXIT_STATUS : '',
+        containerState = finishedEvent? finishedEvent.info.YARN_CONTAINER_STATE : '';
+
+    var fixedPayload = {
+      id: payload.id,
+      type: primaryModelClass.modelName,
+      attributes: {
+        allocatedMB: payload.info.YARN_CONTAINER_ALLOCATED_MEMORY,
+        allocatedVCores: payload.info.YARN_CONTAINER_ALLOCATED_VCORE,
+        assignedNodeId: payload.info.YARN_CONTAINER_ALLOCATED_HOST,
+        priority: payload.info.YARN_CONTAINER_ALLOCATED_PRIORITY,
+        startedTime:  Converter.timeStampToDate(startedTime),
+        finishedTime: Converter.timeStampToDate(finishedTime),
+        nodeHttpAddress: payload.info.YARN_CONTAINER_ALLOCATED_HOST_HTTP_ADDRESS,
+        containerExitStatus: containerExitStatus,
+        containerState: containerState
+      }
+    };
+    return fixedPayload;
+  },
+
+  normalizeSingleResponse(store, primaryModelClass, payload/*, id, requestType*/) {
+    var normalized = this.internalNormalizeSingleResponse(store,
+        primaryModelClass, payload);
+    return {
+      data: normalized
+    };
+  },
+
+  normalizeArrayResponse(store, primaryModelClass, payload/*, id, requestType*/) {
+    var normalizedArrayResponse = {
+      data: []
+    };
+    if (payload && Ember.isArray(payload) && !Ember.isEmpty(payload)) {
+      normalizedArrayResponse.data = payload.map(singleContainer => {
+        return this.internalNormalizeSingleResponse(store, primaryModelClass,
+          singleContainer);
+      });
+    }
+    return normalizedArrayResponse;
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/styles/app.css
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/styles/app.css b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/styles/app.css
index e3dfcd9..8b8ea56 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/styles/app.css
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/styles/app.css
@@ -314,3 +314,86 @@ div.attempt-info-panel table > tbody > tr > td:last-of-type {
   overflow: hidden;
   text-overflow: ellipsis;
 }
+
+#main {
+  float: left;
+  width: 750px;
+}
+
+#sidebar {
+  float: right;
+  width: 100px;
+}
+
+#sequence {
+  width: 600px;
+  height: 70px;
+}
+
+#legend {
+  padding: 10px 0 0 3px;
+}
+
+#sequence text, #legend text {
+  font-weight: 600;
+  fill: #fff;
+}
+
+#chart {
+  position: relative;
+}
+
+#chart path {
+  stroke: #fff;
+}
+
+#explanation {
+  position: absolute;
+  top: 360px;
+  left: 385px;
+  width: 230px;
+  text-align: center;
+  color: #666;
+  z-index: -1;
+}
+
+.simple-bar-chart .axis text {
+  font: 10px sans-serif;
+}
+
+.simple-bar-chart .axis path, .simple-bar-chart .axis line {
+  fill: none;
+  stroke: #000;
+  stroke-width: 1px;
+}
+
+.simple-bar-chart rect {
+  fill: steelblue;
+}
+
+.simple-bar-chart rect:hover {
+  fill: brown;
+  cursor: pointer;
+}
+
+.yarn-flow-runs .chart-panel, .yarn-flow-runinfo .chart-panel {
+  overflow: auto;
+}
+
+.yarn-flow-runs .glyphicon-remove, .yarn-flow-runinfo .glyphicon-remove {
+  cursor: pointer;
+}
+
+.yarn-flow-runs .glyphicon-remove:hover, .yarn-flow-runinfo .glyphicon-remove:hover {
+  color: #c9302c;
+}
+
+.yarn-flow-runs .dropdown-menu .item-text, .yarn-flow-runinfo .dropdown-menu .item-text {
+  width: auto;
+  display: inline-block;
+}
+
+.yarn-flow-runs .dropdown-menu .item-icon, .yarn-flow-runinfo .dropdown-menu .item-icon {
+  width: 14px;
+  display: inline-block;
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/application.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/application.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/application.hbs
index a6d247b..c3154b4 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/application.hbs
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/application.hbs
@@ -56,6 +56,11 @@
               <span class="sr-only">(current)</span>
             {{/link-to}}
           {{/link-to}}
+          {{#link-to 'yarn-flow-activity' tagName="li"}}
+            {{#link-to 'yarn-flow-activity' class="navigation-link"}}Flow Activity
+              <span class="sr-only">(current)</span>
+            {{/link-to}}
+          {{/link-to}}
           {{#link-to 'yarn-nodes.table' tagName="li" current-when="yarn-nodes.table yarn-nodes.heatmap"}}
             {{#link-to 'yarn-nodes.table' class="navigation-link"}}Nodes
               <span class="sr-only">(current)</span>
@@ -73,7 +78,6 @@
   <br/>
   <br/>
   <br/>
-
 </div>
 
 <div class="footer">

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/timeline-error.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/timeline-error.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/timeline-error.hbs
new file mode 100644
index 0000000..e33c77c
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/timeline-error.hbs
@@ -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.
+--}}
+
+{{#if model.isValidErrorCode}}
+  <h3 class="text-center text-danger">{{model.errorCode}}: {{model.errorType}}</h3>
+{{/if}}
+<h2 class="text-center text-danger">Timeline server failed with an error</h2>

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempt.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempt.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempt.hbs
index 1dbae9a..7579bdc 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempt.hbs
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempt.hbs
@@ -17,27 +17,39 @@
 }}
 
 {{breadcrumb-bar breadcrumbs=breadcrumbs}}
-<br/><br/><br/>
-<div class="container-fluid">
-  <div class="row">
-    {{#if model.attempt}}
-      <div class="container-fluid">
+
+<div class="row container-fluid">
+  <div class="col-md-2">
+    <div class="panel panel-default">
+      <div class="panel-heading">
+        Application Attempt
+      </div>
+      <div class="panel-body">
+        <ul class="nav nav-pills nav-stacked" id="stacked-menu">
+          <ul class="nav nav-pills nav-stacked collapse in">
+            {{#link-to 'yarn-app-attempt' tagName="li"}}
+              {{#link-to 'yarn-app-attempt' model.attempt.id}}Attempt Info{{/link-to}}
+            {{/link-to}}
+          </ul>
+        </ul>
+      </div>
+    </div>
+  </div>
+  <div class="col-md-10">
+    <div class="row container-fluid">
+      {{#if model.attempt}}
         <div class="panel panel-default">
           <div class="panel-heading">
-            Application attempt Information
+            Attempt Information
           </div>
           {{app-attempt-table attempt=model.attempt}}
         </div>
-      </div>
-    {{/if}}
-  </div>
-
-  <!-- containers table -->
-  <div class="row">
-     {{#if (or model.rmContainers model.tsContainers)}}
-     {{timeline-view parent-id="containers-timeline-div" my-id="timeline-view" height="400" rmModel=model.rmContainers tsModel=model.tsContainers label="shortAppAttemptId" attemptModel=false}}
-     {{/if}}
+      {{/if}}
+    </div>
+    <div class="row">
+      {{#if (or model.rmContainers model.tsContainers)}}
+        {{timeline-view parent-id="containers-timeline-div" my-id="timeline-view" height="400" rmModel=model.rmContainers tsModel=model.tsContainers label="shortAppAttemptId" attemptModel=false}}
+      {{/if}}
+    </div>
   </div>
 </div>
-
-{{outlet}}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempts.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempts.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempts.hbs
index 0af1457..283d78a 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempts.hbs
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempts.hbs
@@ -24,7 +24,11 @@
     <div class="col-md-2 container-fluid">
       <div class="panel panel-default">
         <div class="panel-heading">
-          <h4>Application</h4>
+          {{#if service}}
+            Service
+          {{else}}
+            Application
+          {{/if}}
         </div>
         <div class="panel-body">
           <ul class="nav nav-pills nav-stacked" id="stacked-menu">
@@ -44,7 +48,6 @@
     </div>
 
     <div class="col-md-10 container-fluid">
-      <!-- timeline view of children -->
       <div class="row">
          {{timeline-view parent-id="attempt-timeline-div" my-id="timeline-view" height="100%" rmModel=model.attempts label="shortAppAttemptId" attemptModel=true serviceName=service}}
       </div>

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app.hbs
index 17ec11e..c1f5352 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app.hbs
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app.hbs
@@ -26,9 +26,9 @@
       <div class="panel panel-default">
         <div class="panel-heading">
           {{#if service}}
-            <h4>Service</h4>
+            Service
           {{else}}
-            <h4>Application</h4>
+            Application
           {{/if}}
         </div>
         <div class="panel-body">
@@ -175,8 +175,8 @@
               <thead>
               <tr>
                 <th>Master Container Log</th>
-                <td>Master Node</td>
-                <td>Master Node Label Expression</td>
+                <th>Master Node</th>
+                <th>Master Node Label Expression</th>
               </tr>
               </thead>
 
@@ -215,48 +215,7 @@
       {{/if}}
 
 
-      </div>
-
-    <!--
-      <div class="row">
-        <div class="col-md-12 container-fluid">
-          <div class="panel panel-default">
-              <div class="panel-heading">
-                Application Attempts
-              </div>
-              <table id="app-attempt-table" class="table table-striped table-bordered" cellspacing="0" width="100%" height="100%">
-                <thead>
-                  <tr>
-                        <th>Start Time</th>
-                        <th>Master ContainerId</th>
-                        <th>Node Http Address</th>
-                        <th>Node Id</th>
-                        <th>Logs Link</th>
-                      </tr>
-                </thead>
-                <tbody>
-                  {{#each model.attempts as |attempt|}}
-                    <tr>
-                      <td>{{attempt.startTime}}</td>
-                      <td>{{attempt.containerId}}</td>
-                      <td><a href={{attempt.nodeHttpAddress}}>{{attempt.nodeHttpAddress}}</a></td>
-                      <td>{{attempt.nodeId}}</td>
-                      <td><a href={{attempt.logsLink}}>link</a></td>
-                    </tr>
-                  {{/each}}
-                </tbody>
-            </table>
-            </div>
-        </div>
-      </div>
-    -->
-
-      <!-- timeline view of children -->
-    <!--
-      <div class="row">
-         {{timeline-view parent-id="attempt-timeline-div" my-id="timeline-view" height="100%" rmModel=model.attempts label="shortAppAttemptId" attemptModel=true}}
-      </div>
-    -->
+    </div>
   </div>
 </div>
 {{/if}}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-apps.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-apps.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-apps.hbs
index 7aade00..264e6b6 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-apps.hbs
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-apps.hbs
@@ -24,7 +24,7 @@
     <div class="col-md-2 container-fluid">
       <div class="panel panel-default">
         <div class="panel-heading">
-          <h4>Application</h4>
+          <h4>Applications</h4>
         </div>
         <div class="panel-body">
           <ul class="nav nav-pills nav-stacked" id="stacked-menu">
@@ -83,4 +83,4 @@
       </div>
     </div>
   </div>
-</div>
\ No newline at end of file
+</div>

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow-activity.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow-activity.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow-activity.hbs
new file mode 100644
index 0000000..c9b682c
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow-activity.hbs
@@ -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.
+--}}
+
+<div class="container-fluid col-md-12">
+  <div class="row">
+    {{breadcrumb-bar breadcrumbs=breadcrumbs}}
+  </div>
+  <div class="row">
+    <div class="col-md-2">
+      <div class="panel panel-default">
+        <div class="panel-heading">
+          Flow Activity
+        </div>
+        <div class="panel-body">
+          <ul class="nav nav-pills nav-stacked collapse in">
+            {{#link-to 'yarn-flow-activity' tagName="li"}}
+              {{#link-to 'yarn-flow-activity'}}Flow Activities{{/link-to}}
+            {{/link-to}}
+          </ul>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-10">
+      <h3>Recent Flow Activities</h3>
+      {{em-table columns=columns rows=rows definition=tableDefinition}}
+    </div>
+  </div>
+</div>
+
+{{outlet}}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow.hbs
new file mode 100644
index 0000000..2e98958
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow.hbs
@@ -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.
+--}}
+
+<div class="col-md-12 container-fluid">
+  <div class="row">
+    {{breadcrumb-bar breadcrumbs=breadcrumbs}}
+  </div>
+  <div class="row">
+    <div class="col-md-2">
+      <div class="panel panel-default">
+        <div class="panel-heading">
+          <div class="panel-title">
+            Flow Information
+          </div>
+        </div>
+        <div class="panel-body">
+          <ul class="nav nav-pills nav-stacked" id="stacked-menu">
+            <ul class="nav nav-pills nav-stacked collapse in">
+              {{#link-to 'yarn-flow.info' tagName="li"}}
+                {{#link-to 'yarn-flow.info' model.flowUid}}Flow Info{{/link-to}}
+              {{/link-to}}
+              {{#link-to 'yarn-flow.runs' tagName="li"}}
+                {{#link-to 'yarn-flow.runs' model.flowUid}}Flow Runs{{/link-to}}
+              {{/link-to}}
+            </ul>
+          </ul>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-10">
+      {{outlet}}
+    </div>
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow/info.hbs
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow/info.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow/info.hbs
new file mode 100644
index 0000000..b700464
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-flow/info.hbs
@@ -0,0 +1,53 @@
+{{!--
+  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.
+--}}
+
+<h3>Flow Information</h3>
+<div class="panel panel-default">
+  <div class="panel-body">
+    <table class="table table-striped table-bordered">
+      <tbody>
+        <tr>
+          <td>Flow Name</td>
+          <td>{{flowInfo.flowName}}</td>
+        </tr>
+        <tr>
+          <td>User</td>
+          <td>{{flowInfo.user}}</td>
+        </tr>
+        <tr>
+          <td>Flow ID</td>
+          <td>{{flowInfo.flowUid}}</td>
+        </tr>
+        <tr>
+          <td>First Run Started</td>
+          <td>{{flowInfo.firstRunStarted}}</td>
+        </tr>
+        <tr>
+          <td>Last Run Finished</td>
+          <td>{{flowInfo.lastRunFinished}}</td>
+        </tr>
+        {{#if flowInfo.lastExecutionDate}}
+          <tr>
+            <td>Last Execution Date</td>
+            <td>{{flowInfo.lastExecutionDate}}</td>
+          </tr>
+        {{/if}}
+      </tbody>
+    </table>
+  </div>
+</div>


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org


[3/3] hadoop git commit: YARN-5705. Show timeline data from ATS v2 in new web UI. Contributed by Akhil PB.

Posted by su...@apache.org.
YARN-5705. Show timeline data from ATS v2 in new web UI. Contributed by Akhil PB.


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/46d9c4ca
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/46d9c4ca
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/46d9c4ca

Branch: refs/heads/trunk
Commit: 46d9c4ca7aba04e96bea65d7b95cc84b50af6980
Parents: c80d3bc
Author: Sunil G <su...@apache.org>
Authored: Sun May 21 18:09:13 2017 +0530
Committer: Sunil G <su...@apache.org>
Committed: Sun May 21 18:09:13 2017 +0530

----------------------------------------------------------------------
 .../webapp/app/adapters/yarn-app-attempt.js     |   4 +-
 .../webapp/app/adapters/yarn-app-flowrun.js     |  33 +++
 .../webapp/app/adapters/yarn-app-timeline.js    |  35 +++
 .../main/webapp/app/adapters/yarn-container.js  |  18 +-
 .../src/main/webapp/app/adapters/yarn-entity.js |  35 +++
 .../webapp/app/adapters/yarn-flow-activity.js   |  30 +++
 .../webapp/app/adapters/yarn-flowrun-brief.js   |  32 +++
 .../main/webapp/app/adapters/yarn-flowrun.js    |  38 +++
 .../app/adapters/yarn-timeline-appattempt.js    |  41 +++
 .../app/adapters/yarn-timeline-container.js     |  40 +++
 .../main/webapp/app/components/nodes-heatmap.js |  18 +-
 .../webapp/app/components/simple-bar-chart.js   | 206 +++++++++++++++
 .../webapp/app/components/sunburst-chart.js     | 261 +++++++++++++++++++
 .../webapp/app/controllers/yarn-apps/apps.js    |   1 -
 .../app/controllers/yarn-apps/services.js       |   1 -
 .../app/controllers/yarn-flow-activity.js       | 125 +++++++++
 .../main/webapp/app/controllers/yarn-flow.js    |  36 +++
 .../webapp/app/controllers/yarn-flow/info.js    |  66 +++++
 .../webapp/app/controllers/yarn-flow/runs.js    | 178 +++++++++++++
 .../main/webapp/app/controllers/yarn-flowrun.js |  50 ++++
 .../webapp/app/controllers/yarn-flowrun/info.js | 157 +++++++++++
 .../app/controllers/yarn-flowrun/metrics.js     | 126 +++++++++
 .../webapp/app/controllers/yarn-services.js     |  12 +-
 .../src/main/webapp/app/mixins/app-attempt.js   |  66 +++++
 .../main/webapp/app/models/yarn-app-attempt.js  |  11 +-
 .../main/webapp/app/models/yarn-app-flowrun.js  |  52 ++++
 .../main/webapp/app/models/yarn-app-timeline.js | 105 ++++++++
 .../main/webapp/app/models/yarn-container.js    |   9 +-
 .../src/main/webapp/app/models/yarn-entity.js   |  26 ++
 .../webapp/app/models/yarn-flow-activity.js     |  28 ++
 .../webapp/app/models/yarn-flowrun-brief.js     |  70 +++++
 .../src/main/webapp/app/models/yarn-flowrun.js  |  32 +++
 .../app/models/yarn-timeline-appattempt.js      | 143 ++++++++++
 .../app/models/yarn-timeline-container.js       |  63 +++++
 .../src/main/webapp/app/router.js               |  12 +
 .../main/webapp/app/routes/timeline-error.js    |  29 +++
 .../main/webapp/app/routes/yarn-app-attempt.js  |  32 +--
 .../main/webapp/app/routes/yarn-app-attempts.js |  13 +-
 .../src/main/webapp/app/routes/yarn-app.js      |  18 +-
 .../webapp/app/routes/yarn-flow-activity.js     |  37 +++
 .../src/main/webapp/app/routes/yarn-flow.js     |  53 ++++
 .../main/webapp/app/routes/yarn-flow/info.js    |  22 ++
 .../main/webapp/app/routes/yarn-flow/runs.js    |  22 ++
 .../webapp/app/routes/yarn-flowrun-metric.js    | 107 ++++++++
 .../src/main/webapp/app/routes/yarn-flowrun.js  |  58 +++++
 .../main/webapp/app/routes/yarn-flowrun/info.js |  22 ++
 .../webapp/app/routes/yarn-flowrun/metrics.js   |  22 ++
 .../webapp/app/serializers/yarn-app-flowrun.js  |  64 +++++
 .../webapp/app/serializers/yarn-app-timeline.js |  76 ++++++
 .../src/main/webapp/app/serializers/yarn-app.js |   3 +-
 .../main/webapp/app/serializers/yarn-entity.js  |  51 ++++
 .../app/serializers/yarn-flow-activity.js       |  54 ++++
 .../app/serializers/yarn-flowrun-brief.js       |  64 +++++
 .../main/webapp/app/serializers/yarn-flowrun.js |  63 +++++
 .../main/webapp/app/serializers/yarn-queue.js   |  22 +-
 .../app/serializers/yarn-timeline-appattempt.js |  69 +++++
 .../app/serializers/yarn-timeline-container.js  |  71 +++++
 .../src/main/webapp/app/styles/app.css          |  83 ++++++
 .../main/webapp/app/templates/application.hbs   |   6 +-
 .../webapp/app/templates/timeline-error.hbs     |  22 ++
 .../webapp/app/templates/yarn-app-attempt.hbs   |  46 ++--
 .../webapp/app/templates/yarn-app-attempts.hbs  |   7 +-
 .../src/main/webapp/app/templates/yarn-app.hbs  |  51 +---
 .../src/main/webapp/app/templates/yarn-apps.hbs |   4 +-
 .../webapp/app/templates/yarn-flow-activity.hbs |  45 ++++
 .../src/main/webapp/app/templates/yarn-flow.hbs |  49 ++++
 .../webapp/app/templates/yarn-flow/info.hbs     |  53 ++++
 .../webapp/app/templates/yarn-flow/runs.hbs     | 131 ++++++++++
 .../app/templates/yarn-flowrun-metric.hbs       |  34 +++
 .../main/webapp/app/templates/yarn-flowrun.hbs  |  49 ++++
 .../webapp/app/templates/yarn-flowrun/info.hbs  | 128 +++++++++
 .../app/templates/yarn-flowrun/metrics.hbs      |  34 +++
 .../main/webapp/app/templates/yarn-services.hbs |   2 +-
 .../src/main/webapp/app/utils/converter.js      |  22 +-
 .../src/main/webapp/app/utils/error-utils.js    |  58 +++++
 .../src/main/webapp/config/default-config.js    |   3 +-
 .../hadoop-yarn-ui/src/main/webapp/package.json |   1 +
 .../components/simple-bar-chart-test.js         |  43 +++
 .../unit/adapters/yarn-app-timeline-test.js     |  30 +++
 .../adapters/yarn-timeline-appattempt-test.js   |  30 +++
 .../adapters/yarn-timeline-container-test.js    |  30 +++
 .../unit/controllers/yarn-flow/info-test.js     |  30 +++
 .../unit/controllers/yarn-flow/runs-test.js     |  30 +++
 .../unit/controllers/yarn-flowrun/info-test.js  |  30 +++
 .../controllers/yarn-flowrun/metrics-test.js    |  30 +++
 .../tests/unit/mixins/app-attempt-test.js       |  30 +++
 .../webapp/tests/unit/mixins/charts-test.js     |  30 ---
 .../tests/unit/models/yarn-app-timeline-test.js |  30 +++
 .../models/yarn-timeline-appattempt-test.js     |  30 +++
 .../unit/models/yarn-timeline-container-test.js |  30 +++
 .../tests/unit/routes/timeline-error-test.js    |  29 +++
 .../tests/unit/routes/yarn-flow/info-test.js    |  29 +++
 .../tests/unit/routes/yarn-flow/runs-test.js    |  29 +++
 .../tests/unit/routes/yarn-flowrun/info-test.js |  29 +++
 .../unit/routes/yarn-flowrun/metrics-test.js    |  29 +++
 .../unit/serializers/yarn-app-timeline-test.js  |  33 +++
 .../yarn-timeline-appattempt-test.js            |  33 +++
 .../serializers/yarn-timeline-container-test.js |  33 +++
 98 files changed, 4408 insertions(+), 199 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-attempt.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-attempt.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-attempt.js
index 2389f16..d5f3d0c 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-attempt.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-attempt.js
@@ -26,7 +26,9 @@ export default AbstractAdapter.extend({
 
   urlForQuery(query/*, modelName*/) {
     var url = this._buildURL();
-    return url + '/apps/' + query.appId + "/appattempts";
+    var appId = query.appId;
+    delete query.appId;
+    return url + '/apps/' + appId + "/appattempts";
   },
 
   urlForFindRecord(id/*, modelName, snapshot*/) {

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-flowrun.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-flowrun.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-flowrun.js
new file mode 100644
index 0000000..23ecd1b
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-flowrun.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 AbstractAdapter from './abstract';
+
+export default AbstractAdapter.extend({
+  address: "timelineWebAddress",
+  restNameSpace: "timelineV2",
+  serverName: "ATS",
+
+  urlForQuery(query/*, modelName*/){
+    var url = this._buildURL();
+    var flowrunUid = query['flowrunUid'];
+    delete query.flowrunUid;
+    url = url + '/run-uid/' + flowrunUid + '/apps?fields=ALL';
+    return url;
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-timeline.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-timeline.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-timeline.js
new file mode 100644
index 0000000..831649c
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app-timeline.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 AbstractAdapter from './abstract';
+
+export default AbstractAdapter.extend({
+  address: "timelineWebAddress",
+  restNameSpace: "timelineV2",
+  serverName: "ATS",
+
+  urlForFindRecord(id/*, modelName, snapshot*/) {
+    var url = this._buildURL();
+    url = url + '/apps/' + id + '?fields=ALL';
+    return url;
+  },
+
+  pathForType(/*modelName*/) {
+    return 'apps';
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-container.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-container.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-container.js
index 348a805..476c9be 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-container.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-container.js
@@ -25,31 +25,17 @@ export default DS.JSONAPIAdapter.extend({
   },
 
   host: function() {
-    return undefined;
+    return this.get(`hosts.rmWebAddress`);
   }.property(),
 
   namespace: function() {
-    return undefined;
+    return this.get(`env.app.namespaces.cluster`);
   }.property(),
 
   urlForQuery(query/*, modelName*/) {
-    var rmHosts = this.get(`hosts.rmWebAddress`);
-    var tsHosts = this.get(`hosts.timelineWebAddress`);
-    var rmNamespaces = this.get(`env.app.namespaces.cluster`);
-    var tsNamespaces = this.get(`env.app.namespaces.timeline`);
-
-    if (query.is_rm) {
-      this.set("host", rmHosts);
-      this.set("namespace", rmNamespaces);
-    } else {
-      this.set("host", tsHosts);
-      this.set("namespace", tsNamespaces);
-    }
-
     var url = this._buildURL();
     url = url + '/apps/' + Converter.attemptIdToAppId(query.app_attempt_id) +
           "/appattempts/" + query.app_attempt_id + "/containers";
-    console.log(url);
     return url;
   },
 

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-entity.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-entity.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-entity.js
new file mode 100644
index 0000000..3d7338f
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-entity.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 AbstractAdapter from './abstract';
+
+export default AbstractAdapter.extend({
+  address: "timelineWebAddress",
+  restNameSpace: "timelineV2",
+  serverName: "ATS",
+
+  urlForQuery(query/*, modelName*/){
+    var url = this._buildURL();
+    var appUid = query.app_uid;
+    var entityType = query.entity_type;
+    delete query.app_uid;
+    delete query.entity_type;
+    url = url + '/app-uid/' + appUid + '/entities/' + entityType + '?fields=INFO';
+    return url;
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-flow-activity.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-flow-activity.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-flow-activity.js
new file mode 100644
index 0000000..a8c436a
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-flow-activity.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 AbstractAdapter from './abstract';
+
+export default AbstractAdapter.extend({
+  address: "timelineWebAddress",
+  restNameSpace: "timelineV2",
+  serverName: "ATS",
+
+  pathForType(/*modelName*/) {
+    return 'flows'; // move to some common place, return path by modelname.
+  },
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-flowrun-brief.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-flowrun-brief.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-flowrun-brief.js
new file mode 100644
index 0000000..ea9c6cb
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-flowrun-brief.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 AbstractAdapter from './abstract';
+
+export default AbstractAdapter.extend({
+  address: "timelineWebAddress",
+  restNameSpace: "timelineV2",
+  serverName: "ATS",
+
+  urlForQuery(query/*, modelName*/){
+    var url = this._buildURL();
+    var flowuid = query['flowuid'];
+    delete query.flowuid;
+    return url + '/flow-uid/' + flowuid + '/runs?fields=ALL';
+  },
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-flowrun.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-flowrun.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-flowrun.js
new file mode 100644
index 0000000..9163c83
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-flowrun.js
@@ -0,0 +1,38 @@
+/**
+ * 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 AbstractAdapter from './abstract';
+
+export default AbstractAdapter.extend({
+  address: "timelineWebAddress",
+  restNameSpace: "timelineV2",
+  serverName: "ATS",
+
+  urlForQueryRecord(query/*, modelName*/){
+    var url = this._buildURL();
+    var flowrunuid = query.flowrun_uid;
+    delete query.flowrun_uid;
+    url = url + '/run-uid/' + flowrunuid;
+    return url;
+  },
+
+  pathForType(/*modelName*/) {
+    return 'run-uid'; // move to some common place, return path by modelname.
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-timeline-appattempt.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-timeline-appattempt.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-timeline-appattempt.js
new file mode 100644
index 0000000..2557a86
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-timeline-appattempt.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 AbstractAdapter from './abstract';
+import Converter from 'yarn-ui/utils/converter';
+
+export default AbstractAdapter.extend({
+  address: "timelineWebAddress",
+  restNameSpace: "timelineV2",
+  serverName: "ATS",
+
+  urlForQuery(query/*, modelName*/) {
+    var url = this._buildURL();
+    var appId = query.appId;
+    query.fields = 'ALL';
+    delete query.appId;
+    return url + '/apps/' + appId + "/entities/YARN_APPLICATION_ATTEMPT";
+  },
+
+  urlForFindRecord(id/*, modelName, snapshot*/) {
+    var url = this._buildURL();
+    return url + '/apps/' + Converter.attemptIdToAppId(id) +
+      "/entities/YARN_APPLICATION_ATTEMPT/" + id + "?fields=ALL";
+  }
+
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-timeline-container.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-timeline-container.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-timeline-container.js
new file mode 100644
index 0000000..f47335a
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-timeline-container.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 AbstractAdapter from './abstract';
+import Converter from 'yarn-ui/utils/converter';
+
+export default AbstractAdapter.extend({
+  address: "timelineWebAddress",
+  restNameSpace: "timelineV2",
+  serverName: "ATS",
+
+  urlForQuery(query/*, modelName*/){
+    var url = this._buildURL();
+    var app_attempt_id = query.app_attempt_id;
+    query.fields = 'ALL';
+    delete query.app_attempt_id;
+    url = url + '/apps/' + Converter.attemptIdToAppId(app_attempt_id) +
+        '/entities/YARN_CONTAINER';
+    return url;
+  },
+
+  pathForType(/*modelName*/) {
+    return '';
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/nodes-heatmap.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/nodes-heatmap.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/nodes-heatmap.js
index ef6e46e..3acc5de 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/nodes-heatmap.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/nodes-heatmap.js
@@ -52,7 +52,7 @@ export default BaseChartComponent.extend({
 
   bindSelectCategory: function(element, i) {
     element.on("click", function() {
-      if (this.selectedCategory == i) {
+      if (this.selectedCategory === i) {
         // Remove selection for second click
         this.selectedCategory = 0;
       } else {
@@ -76,7 +76,7 @@ export default BaseChartComponent.extend({
     }
 
     var usage = node.get("usedMemoryMB") /
-      (node.get("usedMemoryMB") + node.get("availMemoryMB"))
+      (node.get("usedMemoryMB") + node.get("availMemoryMB"));
     var lowerLimit = (this.selectedCategory - 1) * 0.2;
     var upperLimit = this.selectedCategory * 0.2;
     if (lowerLimit <= usage && usage <= upperLimit) {
@@ -116,6 +116,7 @@ export default BaseChartComponent.extend({
     var sampleXOffset = (layout.x2 - layout.x1) / 2 - 2.5 * this.SAMPLE_CELL_WIDTH -
       2 * this.CELL_MARGIN;
     var sampleYOffset = layout.margin * 2;
+    var text;
 
     for (i = 1; i <= 5; i++) {
       var ratio = i * 0.2 - 0.1;
@@ -128,7 +129,7 @@ export default BaseChartComponent.extend({
         .attr("height", this.SAMPLE_HEIGHT)
         .attr("class", "hyperlink");
       this.bindSelectCategory(rect, i);
-      var text = g.append("text")
+      text = g.append("text")
         .text("" + (ratio * 100).toFixed(1) + "% Used")
         .attr("y", sampleYOffset + this.SAMPLE_HEIGHT / 2 + 5)
         .attr("x", sampleXOffset + this.SAMPLE_CELL_WIDTH / 2)
@@ -137,8 +138,8 @@ export default BaseChartComponent.extend({
       sampleXOffset += this.CELL_MARGIN + this.SAMPLE_CELL_WIDTH;
     }
 
-    if (this.selectedCategory != 0) {
-      var text = g.append("text")
+    if (this.selectedCategory !== 0) {
+      text = g.append("text")
         .text("Clear")
         .attr("y", sampleYOffset + this.SAMPLE_HEIGHT / 2 + 5)
         .attr("x", sampleXOffset + 20)
@@ -149,7 +150,7 @@ export default BaseChartComponent.extend({
     var chartXOffset = -1;
 
     for (i = 0; i < racksArray.length; i++) {
-      var text = g.append("text")
+      text = g.append("text")
         .text(racksArray[i])
         .attr("y", yOffset + this.CELL_HEIGHT / 2 + 5)
         .attr("x", layout.margin)
@@ -163,7 +164,6 @@ export default BaseChartComponent.extend({
 
       for (var j = 0; j < data.length; j++) {
         var rack = data[j].get("rack");
-        var host = data[j].get("nodeHostName");
 
         if (rack === racksArray[i]) {
           this.addNode(g, xOffset, yOffset, colorFunc, data[j]);
@@ -217,11 +217,11 @@ export default BaseChartComponent.extend({
         href = `#/yarn-node/${node_id}/${node_addr}`;
     var a = g.append("a")
       .attr("href", href);
-    var text = a.append("text")
+    a.append("text")
       .text(data.get("nodeHostName"))
       .attr("y", yOffset + this.CELL_HEIGHT / 2 + 5)
       .attr("x", xOffset + this.CELL_WIDTH / 2)
-      .attr("class", this.isNodeSelected(data) ? "heatmap-cell" : "heatmap-cell-notselected")
+      .attr("class", this.isNodeSelected(data) ? "heatmap-cell" : "heatmap-cell-notselected");
     if (this.isNodeSelected(data)) {
       this.bindTP(a, rect);
     }

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/simple-bar-chart.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/simple-bar-chart.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/simple-bar-chart.js
new file mode 100644
index 0000000..8527e91
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/simple-bar-chart.js
@@ -0,0 +1,206 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+  data: [],
+  xAxisTickFormatter: null,
+  yAxisTickFormatter: null,
+  xAxisText: '',
+  yAxisText: '',
+  enableTooltip: true,
+  onBarChartClickCallback: Ember.K,
+  hideTootlipOnBarChartClick: true,
+
+  initChart() {
+    this.height = 400;
+    this.barWidth = 30;
+    this.width = Math.max(500, 40 * this.data.length);
+  },
+
+  drawChart() {
+    var margin = {top: 20, right: 20, bottom: 100, left: 100},
+        axisLabelPadding = 10,
+        width = this.width - margin.left - margin.right - axisLabelPadding,
+        height = this.height - margin.top - margin.bottom - axisLabelPadding,
+        xAxisText = this.xAxisText? this.xAxisText : '',
+        yAxisText = this.yAxisText? this.yAxisText : '',
+        data = this.data,
+        self = this;
+
+    var xScale = d3.scale.ordinal().rangeRoundBands([0, width], 0.1);
+    var yScale = d3.scale.linear().range([height, 0]);
+
+    var xAxis = d3.svg.axis()
+        .scale(xScale)
+        .orient("bottom")
+        .tickFormat(function(tick) {
+          if (self.isFunction(self.xAxisTickFormatter)) {
+            return self.xAxisTickFormatter(tick);
+          } else {
+            return tick;
+          }
+        });
+
+    var yAxis = d3.svg.axis()
+        .scale(yScale)
+        .orient("left")
+        .tickFormat(function(tick) {
+          if (self.isFunction(self.yAxisTickFormatter)) {
+            return self.yAxisTickFormatter(tick);
+          } else {
+            return tick;
+          }
+        });
+
+    var svg = d3.select(this.element)
+      .append("svg")
+        .attr("class", "simple-bar-chart")
+        .attr("width", width + margin.left + margin.right + axisLabelPadding)
+        .attr("height", height + margin.top + margin.bottom + axisLabelPadding)
+      .append("g")
+        .attr("transform", "translate("+(margin.left+axisLabelPadding)+","+(margin.top)+")");
+
+    xScale.domain(data.map(function(d) { return d.label; }));
+    yScale.domain([0, d3.max(data, function(d) { return d.value; })]);
+
+    var gx = svg.append("g")
+        .attr("class", "x axis")
+        .attr("transform", "translate(0," + height + ")")
+        .call(xAxis);
+
+    gx.selectAll("text")
+        .style("text-anchor", "end")
+        .attr("dx", "-.8em")
+        .attr("dy", "-.3em")
+        .attr("transform", "rotate(-60)");
+
+    gx.append("text")
+        .attr("transform", "translate("+(width/2)+","+(margin.bottom)+")")
+        .style("text-anchor", "middle")
+        .text(xAxisText);
+
+    var gy = svg.append("g")
+        .attr("class", "y axis")
+        .call(yAxis);
+
+    gy.append("text")
+        .attr("transform", "translate("+(-margin.left)+","+(height/2)+")rotate(-90)")
+        .style("text-anchor", "middle")
+        .text(yAxisText);
+
+    var barWidth = this.barWidth;
+    var minBarWidth = Math.min(barWidth, xScale.rangeBand());
+    var bars = svg.selectAll("bar")
+        .data(data)
+      .enter().append("rect")
+        .attr("x", function(d) {
+          var padding = 0;
+          var rangeBand = xScale.rangeBand();
+          if ((rangeBand - barWidth) > 0) {
+            padding = (rangeBand - barWidth) / 2;
+          }
+          return xScale(d.label) + padding;
+        })
+        .attr("width", minBarWidth)
+        .attr("y", function() {
+          return yScale(0);
+        })
+        .attr("height", function() {
+          return height - yScale(0);
+        })
+        .on('click', function(d) {
+          if (self.enableTooltip && self.hideTootlipOnBarChartClick) {
+            self.hideTootlip();
+          }
+          if (self.isFunction(self.onBarChartClickCallback)) {
+            self.onBarChartClickCallback(d);
+          }
+        });
+
+    bars.transition()
+        .duration(1000)
+        .delay(100)
+        .attr("y", function(d) {
+          return yScale(d.value);
+        })
+        .attr("height", function(d) {
+          return height - yScale(d.value);
+        });
+
+    if (this.enableTooltip) {
+      this.bindTooltip(bars);
+    }
+  },
+
+  bindTooltip(bars) {
+    var self = this;
+    var tooltip = this.tooltip;
+    if (tooltip) {
+      bars.on("mouseenter", function(d) {
+        tooltip.html(d.tooltip);
+        self.showTooltip();
+      }).on("mousemove", function() {
+        tooltip.style("left", (d3.event.pageX + 5) + "px")
+            .style("top", (d3.event.pageY - 25) + "px");
+      }).on("mouseout", function() {
+        self.hideTootlip();
+      });
+    }
+  },
+
+  initTooltip() {
+    this.tooltip = d3.select("body")
+        .append("div")
+        .attr("class", "tooltip simple-barchart-tooltip")
+        .style("opacity", 1);
+
+    this.hideTootlip();
+  },
+
+  hideTootlip() {
+    if (this.tooltip) {
+     this.tooltip.style("display", "none");
+    }
+  },
+
+  showTooltip() {
+    if (this.tooltip) {
+     this.tooltip.style("display", "block");
+    }
+  },
+
+  isFunction(func) {
+    return Ember.typeOf(func) === "function";
+  },
+
+  didInsertElement() {
+    this.initChart();
+    if (this.enableTooltip) {
+      this.initTooltip();
+    }
+    this.drawChart();
+  },
+
+  willDestroyElement() {
+    if (this.tooltip) {
+      this.tooltip.remove();
+    }
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/sunburst-chart.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/sunburst-chart.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/sunburst-chart.js
new file mode 100644
index 0000000..3a2302a
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/sunburst-chart.js
@@ -0,0 +1,261 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+
+  didInsertElement: function() {
+    var json = buildHierarchy(this.get("arr"));
+    createVisualization(json);
+  },
+
+});
+// Dimensions of sunburst.
+var  width = 1000;
+var  height = 750;
+var  radius = Math.min(width, height) / 2;
+// Breadcrumb dimensions: width, height, spacing, width of tip/tail.
+var  b = { w: 225, h: 30, s: 3, t: 10 };
+// Total size of all segments; we set this later, after loading the data.
+var totalSize = 0;
+var vis = null;
+var  partition = null;
+var  arc = null;
+var colors = d3.scale.category20c();
+
+function colorMap(d) {
+  return colors(d.name);
+}
+
+// Given a node in a partition layout, return an array of all of its ancestor
+// nodes, highest first, but excluding the root.
+function  getAncestors(node) {
+  var path = [];
+  var current = node;
+  while (current.parent) {
+    path.unshift(current);
+    current = current.parent;
+  }
+  return path;
+}
+
+// Main function to draw and set up the visualization, once we have the data.
+function createVisualization(json) {
+  partition = d3.layout.partition()
+      .size([2 * Math.PI, radius * radius])
+      .value(function(d) { return d.size; });
+  arc = d3.svg.arc()
+      .startAngle(function(d) { return d.x; })
+      .endAngle(function(d) { return d.x + d.dx; })
+      .innerRadius(function(d) { return Math.sqrt(d.y); })
+      .outerRadius(function(d) { return Math.sqrt(d.y + d.dy); });
+  // Basic setup of page elements.
+  initializeBreadcrumbTrail();
+  //drawLegend();
+  //d3.select("#togglelegend").on("click", toggleLegend);
+
+  // Bounding circle underneath the sunburst, to make it easier to detect
+  // when the mouse leaves the parent g.
+  vis = d3.select("#chart").append("svg:svg")
+      .attr("width", width)
+      .attr("height", height)
+      .append("svg:g")
+      .attr("id", "container")
+      .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
+  vis.append("svg:circle").attr("r", radius)
+      .style("opacity", 0);
+
+  // For efficiency, filter nodes to keep only those large enough to see.
+  var nodes = partition.nodes(json)
+    .filter(function(d) {
+      return (d.dx > 0.005); // 0.005 radians = 0.29 degrees
+    });
+
+  var path = vis.data([json]).selectAll("path")
+    .data(nodes)
+    .enter().append("svg:path")
+    .attr("display", function(d) { return d.depth ? null : "none"; })
+    .attr("d", arc)
+    .attr("fill-rule", "evenodd")
+    .attr("fill", colorMap)
+    .style("opacity", 1)
+    .on("mouseover", mouseover);
+  // Add the mouseleave handler to the bounding circle.
+  d3.select("#container").on("mouseleave", mouseleave);
+
+  // Get total size of the tree = value of root node from partition.
+  totalSize = path.node().__data__.value;
+}
+
+  // Take a 2-column CSV and transform it into a hierarchical structure suitable
+  // for a partition layout. The first column is a sequence of step names, from
+  // root to leaf, separated by hyphens. The second column is a count of how
+  // often that sequence occurred.
+function  buildHierarchy(csv) {
+  var root = {"name": "root", "children": []};
+  for (var i = 0; i < csv.length; i++) {
+    var sequence = csv[i][0];
+    var size = +csv[i][1];
+    if (isNaN(size)) { // e.g. if this is a header row
+      continue;
+    }
+    var parts = sequence.split("-");
+    var currentNode = root;
+    for (var j = 0; j < parts.length; j++) {
+      var children = currentNode["children"];
+      var nodeName = parts[j];
+      var childNode;
+      if (j + 1 < parts.length) {
+        // Not yet at the end of the sequence; move down the tree.
+        var foundChild = false;
+        for (var k = 0; k < children.length; k++) {
+          if (children[k]["name"] === nodeName) {
+            childNode = children[k];
+            foundChild = true;
+            break;
+          }
+        }
+        // If we don't already have a child node for this branch, create it.
+        if (!foundChild) {
+          childNode = {"name": nodeName, "children": []};
+          children.push(childNode);
+        }
+        currentNode = childNode;
+      } else {
+        // Reached the end of the sequence; create a leaf node.
+        childNode = {"name": nodeName, "size": size, "children": [], "sequence": sequence};
+        children.push(childNode);
+      }
+    }
+  }
+  return root;
+}
+
+// Fade all but the current sequence, and show it in the breadcrumb trail.
+function mouseover(d) {
+  //var percentage = (100 * d.value / totalSize).toPrecision(3);
+  //var percentageString = percentage + "%";
+  var percentageString = d.value;
+
+  d3.select("#percentage").html('<p align="center" style="font-size: 150%;"><b>' + percentageString +
+      '</b></p><br/><p align="center">(' + d.name + ')</p>');
+  d3.select("#explanation").style("visibility", "");
+
+  var sequenceArray = getAncestors(d);
+  updateBreadcrumbs(sequenceArray, percentageString);
+
+  // Fade all the segments.
+  d3.selectAll("path").style("opacity", 0.2);
+
+  // Then highlight only those that are an ancestor of the current segment.
+  vis.selectAll("path")
+    .filter(function(node) {
+        return (sequenceArray.indexOf(node) >= 0);
+    })
+    .style("opacity", 1);
+}
+
+// Restore everything to full opacity when moving off the visualization.
+function mouseleave() {
+  // Hide the breadcrumb trail
+  d3.select("#trail").style("visibility", "hidden");
+
+  // Deactivate all segments during transition.
+  d3.selectAll("path").on("mouseover", null);
+
+  // Transition each segment to full opacity and then reactivate it.
+  d3.selectAll("path")
+    .transition()
+    .duration(1000)
+    .style("opacity", 1)
+    .each("end", function() {
+      d3.select(this).on("mouseover", mouseover);
+    });
+
+  d3.select("#explanation")
+    .style("visibility", "hidden");
+}
+
+function initializeBreadcrumbTrail() {
+  // Add the svg area.
+  var trail = d3.select("#sequence").append("svg:svg")
+    .attr("width", width)
+    .attr("height", 50)
+    .attr("id", "trail");
+  // Add the label at the end, for the percentage.
+  trail.append("svg:text")
+    .attr("id", "endlabel")
+    .style("fill", "#000");
+}
+
+// Generate a string that describes the points of a breadcrumb polygon.
+function breadcrumbPoints(d, i) {
+  var points = [];
+  points.push("0,0");
+  points.push(b.w + ",0");
+  points.push(b.w + b.t + "," + (b.h / 2));
+  points.push(b.w + "," + b.h);
+  points.push("0," + b.h);
+  if (i > 0) { // Leftmost breadcrumb; don't include 6th vertex.
+    points.push(b.t + "," + (b.h / 2));
+  }
+  return points.join(" ");
+}
+
+// Update the breadcrumb trail to show the current sequence and percentage.
+function updateBreadcrumbs(nodeArray, percentageString) {
+  // Data join; key function combines name and depth (= position in sequence).
+  var g = d3.select("#trail")
+      .selectAll("g")
+      .data(nodeArray, function(d) { return d.name + d.depth; });
+
+  // Add breadcrumb and label for entering nodes.
+  var entering = g.enter().append("svg:g");
+
+  entering.append("svg:polygon")
+      .attr("points", breadcrumbPoints)
+      .attr("fill", colorMap);
+
+  entering.append("svg:text")
+      .attr("x", (b.w + b.t) / 2)
+      .attr("y", b.h / 2)
+      .attr("dy", "0.35em")
+      .attr("text-anchor", "middle")
+      .text(function(d) { return d.name; });
+
+  // Set position for entering and updating nodes.
+  g.attr("transform", function(d, i) {
+    return "translate(" + i * (b.w + b.s) + ", 0)";
+  });
+
+  // Remove exiting nodes.
+  g.exit().remove();
+
+  // Now move and update the percentage at the end.
+  d3.select("#trail").select("#endlabel")
+      .attr("x", (nodeArray.length + 0.5) * (b.w + b.s))
+      .attr("y", b.h / 2)
+      .attr("dy", "0.35em")
+      .attr("text-anchor", "middle")
+      .text(percentageString);
+
+  // Make the breadcrumb trail visible, if it's hidden.
+  d3.select("#trail")
+      .style("visibility", "");
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-apps/apps.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-apps/apps.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-apps/apps.js
index 44a7c1c..fffaf17 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-apps/apps.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-apps/apps.js
@@ -17,7 +17,6 @@
  */
 
 import Ember from 'ember';
-import ColumnDef from 'em-table/utils/column-definition';
 import TableDefinition from 'em-table/utils/table-definition';
 import AppTableController from '../app-table-columns';
 

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-apps/services.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-apps/services.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-apps/services.js
index 44a7c1c..fffaf17 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-apps/services.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-apps/services.js
@@ -17,7 +17,6 @@
  */
 
 import Ember from 'ember';
-import ColumnDef from 'em-table/utils/column-definition';
 import TableDefinition from 'em-table/utils/table-definition';
 import AppTableController from '../app-table-columns';
 

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow-activity.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow-activity.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow-activity.js
new file mode 100644
index 0000000..61e7823
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow-activity.js
@@ -0,0 +1,125 @@
+/**
+ * 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 TableDef from 'em-table/utils/table-definition';
+import ColumnDef from 'em-table/utils/column-definition';
+import lodash from 'lodash/lodash';
+
+function _createColumns() {
+  var columns = [];
+  columns.push({
+    id: 'flowName',
+    headerTitle: 'Flow Name',
+    contentPath: 'flowName',
+    observePath: true,
+  }, {
+    id: 'user',
+    headerTitle: 'User',
+    contentPath: 'user',
+    observePath: true
+  }, {
+    id: 'uid',
+    headerTitle: 'Flow ID',
+    contentPath: 'uid',
+    observePath: true,
+    cellComponentName: 'em-table-linked-cell',
+    minWidth: "300px",
+    getCellContent: function (row) {
+      return {
+        routeName: 'yarn-flow.info',
+        id: row.get('uid'),
+        displayText: row.get('uid')
+      };
+    }
+  }, {
+    id: 'lastExecDate',
+    headerTitle: 'Last Execution Date',
+    contentPath: 'lastExecDate',
+    observePath: true
+  });
+  return ColumnDef.make(columns);
+}
+
+function _getAggregatedFlowsData(flows) {
+  var aggregatedFlows = [];
+  flows = flows? flows.get('content') : [];
+
+  var aggregated = lodash.groupBy(flows, function(flow) {
+    return flow.getRecord().get('uid');
+  });
+
+  lodash.forIn(aggregated, function(flows) {
+    let flowsInAsc = lodash.sortBy(flows, function(flow) {
+      return flow.getRecord().get('lastExecDate');
+    });
+    let flowsInDesc = flowsInAsc.reverse();
+    aggregatedFlows.push(flowsInDesc[0].getRecord());
+  });
+
+  return aggregatedFlows;
+}
+
+function _createRows(flows) {
+  var data = [],
+      aggregatedFlows = null,
+      row = null;
+
+  aggregatedFlows = _getAggregatedFlowsData(flows);
+
+  aggregatedFlows.forEach(function(flow) {
+    row = Ember.Object.create({
+      user: flow.get('user'),
+      flowName: flow.get('flowName'),
+      uid: flow.get('uid'),
+      lastExecDate: flow.get('lastExecDate')
+    });
+    data.push(row);
+  });
+
+  return Ember.A(data);
+}
+
+export default Ember.Controller.extend({
+  breadcrumbs: [{
+    text: "Home",
+    routeName: 'application'
+  }, {
+    text: "Flow Activities",
+    routeName: 'yarn-flow-activity',
+  }],
+
+  columns: _createColumns(),
+
+  rows: Ember.computed('model', function() {
+    return _createRows(this.get('model'));
+  }),
+
+  tableDefinition: TableDef.create({
+    sortColumnId: 'lastExecDate',
+    sortOrder: 'desc'
+  }),
+
+  getLastFlowExecutionInfoByFlowUid: function(uid) {
+    var aggregatedFlows = _getAggregatedFlowsData(this.get('model'));
+    var recent = aggregatedFlows.find(function(flow) {
+      return flow.get('uid') === uid;
+    });
+    return recent;
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow.js
new file mode 100644
index 0000000..216ab11
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow.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';
+
+export default Ember.Controller.extend({
+  breadcrumbs: Ember.computed("model.flowUid", function() {
+    var flowUid = this.get('model.flowUid');
+    return [{
+      text: "Home",
+      routeName: 'application'
+    }, {
+      text: "Flow Activities",
+      routeName: 'yarn-flow-activity'
+    }, {
+      text: `Flow Info [${flowUid}]`,
+      routeName: 'yarn-flow.info',
+      model: flowUid
+    }];
+  })
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow/info.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow/info.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow/info.js
new file mode 100644
index 0000000..fc4dd23
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow/info.js
@@ -0,0 +1,66 @@
+/**
+ * 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 Converter from 'yarn-ui/utils/converter';
+
+export default Ember.Controller.extend({
+  flowUid: function() {
+    return this.get('model.flowUid');
+  }.property('model.flowUid'),
+
+  flowLastExecutionDate: function() {
+    if (this.get('model.lastFlowExecutionInfo')) {
+      return this.get('model.lastFlowExecutionInfo').get('lastExecDate');
+    } else {
+      return '';
+    }
+  }.property('model.lastFlowExecutionInfo'),
+
+  flowInfo: function() {
+    var info = {};
+    var firstRunObj = this.get('model.flowRuns').get('firstObject');
+    info.flowUid = this.get('flowUid');
+    info.flowName = firstRunObj.get('flowName');
+    info.user = firstRunObj.get('user');
+    info.lastExecutionDate = this.get('flowLastExecutionDate');
+    info.firstRunStarted = this.get('earliestStartTime');
+    info.lastRunFinished = this.get('latestFinishTime');
+    return info;
+  }.property('model.flowRuns', 'flowLastExecutionDate'),
+
+  earliestStartTime: function() {
+    var earliestStart = Number.MAX_VALUE;
+    this.get('model.flowRuns').forEach(function(flowrun) {
+      if (flowrun.get('createTimeRaw') < earliestStart) {
+        earliestStart = flowrun.get('createTimeRaw');
+      }
+    });
+    return Converter.timeStampToDate(earliestStart);
+  }.property('model.flowRuns'),
+
+  latestFinishTime: function() {
+    var latestFinish = 0;
+    this.get('model.flowRuns').forEach(function(flowrun) {
+      if (flowrun.get('endTimeRaw') > latestFinish) {
+        latestFinish = flowrun.get('endTimeRaw');
+      }
+    });
+    return Converter.timeStampToDate(latestFinish);
+  }.property('model.flowRuns')
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow/runs.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow/runs.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow/runs.js
new file mode 100644
index 0000000..def4c12
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flow/runs.js
@@ -0,0 +1,178 @@
+/**
+ * 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 TableDef from 'em-table/utils/table-definition';
+import ColumnDef from 'em-table/utils/column-definition';
+import Converter from 'yarn-ui/utils/converter';
+
+function createColumn() {
+  var columns = [];
+
+  // Generate columns
+  columns.push({
+    id: 'runid',
+    headerTitle: 'Run ID',
+    contentPath: 'runid',
+    cellComponentName: 'em-table-linked-cell',
+    minWidth: "300px",
+    getCellContent: function (row) {
+      return {
+        routeName: 'yarn-flowrun.info',
+        id: row.get('uid'),
+        displayText: row.get('shownid')
+      };
+    }
+  });
+
+  columns.push({
+    id: 'runDurationTs',
+    headerTitle: 'Run Duration',
+    contentPath: 'runDurationTs',
+    getCellContent: function(row) {
+      return Converter.msToElapsedTimeUnit(row.get('runDurationTs'));
+    }
+  });
+
+  columns.push({
+    id: 'cpuVCores',
+    headerTitle: 'CPU VCores',
+    contentPath: 'cpuVCores',
+    getCellContent: function(row) {
+      if (row.get('cpuVCores') > -1) {
+        return row.get('cpuVCores');
+      }
+      return 'N/A';
+    }
+  });
+
+  columns.push({
+    id: 'memoryUsed',
+    headerTitle: 'Memory Used',
+    contentPath: 'memoryUsed',
+    getCellContent: function(row) {
+      if (row.get('memoryUsed') > -1) {
+        return Converter.memoryBytesToMB(row.get('memoryUsed'));
+      }
+      return 'N/A';
+    }
+  });
+
+  columns.push({
+    id: 'createTime',
+    headerTitle: 'Creation Time',
+    contentPath: 'createTime'
+  });
+
+  columns.push({
+    id: 'endTime',
+    headerTitle: 'End Time',
+    contentPath: 'endTime'
+  });
+
+  return ColumnDef.make(columns);
+}
+
+export default Ember.Controller.extend({
+  vizWidgets: {
+    runDuration: true,
+    cpuVcores: false,
+    memoryUsed: false
+  },
+
+  actions: {
+    addVizWidget(widget) {
+      Ember.set(this.vizWidgets, widget, true);
+    },
+
+    removeVizWidget(widget) {
+      Ember.set(this.vizWidgets, widget, false);
+    }
+  },
+
+  columns: createColumn(),
+
+  tableDefinition: TableDef.create({
+    sortColumnId: 'createTime',
+    sortOrder: 'desc'
+  }),
+
+  elapsedTimeVizData: function() {
+    var data = [];
+    this.get('model.flowRuns').forEach(function(run) {
+      var vizData = run.getElapsedTimeVizDataForBarChart();
+      if (vizData.value > 0) {
+        data.push(vizData);
+      }
+    });
+    data = this.getSortedVizDataInDesc(data);
+    return this.getRefactoredVizData(data);
+  }.property('model.flowRuns'),
+
+  elapsedTimeFormatter: function(tick) {
+    return Converter.msToElapsedTimeUnit(tick, true);
+  },
+
+  cpuVCoresVizData: function() {
+    var data = [];
+    this.get('model.flowRuns').forEach(function(run) {
+      var vizData = run.getCpuVCoresVizDataForBarChart();
+      if (vizData.value > 0) {
+        data.push(vizData);
+      }
+    });
+    data = this.getSortedVizDataInDesc(data);
+    return this.getRefactoredVizData(data);
+  }.property('model.flowRuns'),
+
+  memoryVizData: function() {
+    var data = [];
+    this.get('model.flowRuns').forEach(function(run) {
+      var vizData = run.getMemoryVizDataForBarChart();
+      if (vizData.value > 0) {
+        data.push(vizData);
+      }
+    });
+    data = this.getSortedVizDataInDesc(data);
+    return this.getRefactoredVizData(data);
+  }.property('model.flowRuns'),
+
+  memoryFormatter: function(tick) {
+    return Converter.memoryBytesToMB(tick);
+  },
+
+  onBarChartClick: function() {
+    var self = this;
+    return function(data) {
+      self.transitionToRoute('yarn-flowrun.info', data.flowrunUid);
+    };
+  }.property(),
+
+  getSortedVizDataInDesc: function(data) {
+    return data.sort(function(d1, d2) {
+      return d2.value - d1.value;
+    });
+  },
+
+  getRefactoredVizData: function(data) {
+    data.forEach(function(viz, idx) {
+      viz.label = "Run " + (++idx);
+    }, this);
+    return data;
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flowrun.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flowrun.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flowrun.js
new file mode 100644
index 0000000..6af87ab
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flowrun.js
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+  breadcrumbs: Ember.computed('model.flowrun_uid', 'model.parentFlowUid', function() {
+    var flowRunId = this.get('model.flowrun_uid');
+    var parentFlowUid = this.get('model.parentFlowUid');
+    var crumbs = [{
+      text: "Home",
+      routeName: 'application'
+    }, {
+      text: "Flow Activities",
+      routeName: 'yarn-flow-activity'
+    }];
+    if (parentFlowUid) {
+      crumbs.push({
+        text: `Flow Info [${parentFlowUid}]`,
+        routeName: 'yarn-flow.info',
+        model: parentFlowUid
+      }, {
+        text: `Flow Runs [${parentFlowUid}]`,
+        routeName: 'yarn-flow.runs',
+        model: parentFlowUid
+      });
+    }
+    crumbs.push({
+      text: `Run Info [${flowRunId}]`,
+      routeName: 'yarn-flowrun.info',
+      model: flowRunId
+    });
+    return crumbs;
+  })
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flowrun/info.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flowrun/info.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flowrun/info.js
new file mode 100644
index 0000000..df2f87e
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flowrun/info.js
@@ -0,0 +1,157 @@
+/**
+ * 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 ColumnDef from 'em-table/utils/column-definition';
+import Converter from 'yarn-ui/utils/converter';
+
+function createColumn() {
+  var columns = [];
+
+  // Generate columns
+  columns.push({
+    id: 'appId',
+    headerTitle: 'Application ID',
+    contentPath: 'appId',
+    cellComponentName: 'em-table-linked-cell',
+    minWidth: "300px",
+    getCellContent: function (row) {
+      return {
+        routeName: 'yarn-app',
+        id: row.get('appId'),
+        displayText: row.get('appId')
+      };
+    }
+  });
+
+  columns.push({
+    id: 'appType',
+    headerTitle: 'Application Type',
+    contentPath: 'type'
+  });
+
+  columns.push({
+    id: 'state',
+    headerTitle: 'State',
+    contentPath: 'state',
+    cellComponentName: 'em-table-status-cell',
+  });
+
+  columns.push({
+    id: 'elapsedTs',
+    headerTitle: 'Elapsed Time',
+    contentPath: 'elapsedTs',
+    getCellContent: function(row) {
+      return Converter.msToElapsedTimeUnit(row.get('elapsedTs'));
+    }
+  });
+
+  columns.push({
+    id: 'cpuVCores',
+    headerTitle: 'CPU VCores',
+    contentPath: 'cpuVCores',
+    getCellContent: function(row) {
+      if (row.get('cpuVCores') > -1) {
+        return row.get('cpuVCores');
+      }
+      return 'N/A';
+    }
+  });
+
+  columns.push({
+    id: 'memoryUsed',
+    headerTitle: 'Memory Used',
+    contentPath: 'memoryUsed',
+    getCellContent: function(row) {
+      if (row.get('memoryUsed') > -1) {
+        return Converter.memoryBytesToMB(row.get('memoryUsed'));
+      }
+      return 'N/A';
+    }
+  });
+
+  return ColumnDef.make(columns);
+}
+
+export default Ember.Controller.extend({
+  vizWidgets: {
+    cpuVcores: true,
+    memoryUsed: false
+  },
+
+  actions: {
+    addVizWidget(widget) {
+      Ember.set(this.vizWidgets, widget, true);
+    },
+
+    removeVizWidget(widget) {
+      Ember.set(this.vizWidgets, widget, false);
+    }
+  },
+
+  columns: createColumn(),
+
+  cpuVCoresVizData: function() {
+    var data = [];
+    this.get('model.apps').forEach(function(app) {
+      var vizData = app.getCpuVCoresVizDataForBarChart();
+      if (vizData.value > 0) {
+        data.push(vizData);
+      }
+    });
+    data = this.getSortedVizDataInDesc(data);
+    return this.getRefactoredVizData(data);
+  }.property('model.apps'),
+
+  memoryVizData: function() {
+    var data = [];
+    this.get('model.apps').forEach(function(app) {
+      var vizData = app.getMemoryVizDataForBarChart();
+      if (vizData.value > 0) {
+        data.push(vizData);
+      }
+    });
+    data = this.getSortedVizDataInDesc(data);
+    return this.getRefactoredVizData(data);
+  }.property('model.apps'),
+
+  memoryFormatter: function(tick) {
+    return Converter.memoryBytesToMB(tick);
+  },
+
+  onBarChartClick: function() {
+    var self = this;
+    return function(data) {
+      self.transitionToRoute('yarn-app', data.appId);
+    };
+  }.property(),
+
+  getSortedVizDataInDesc: function(data) {
+    return data.sort(function(d1, d2) {
+      return d2.value - d1.value;
+    });
+  },
+
+  getRefactoredVizData: function(data) {
+    data.forEach(function(viz, idx) {
+      viz.appId = viz.label;
+      viz.label = "App " + (++idx);
+    }, this);
+    return data;
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flowrun/metrics.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flowrun/metrics.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flowrun/metrics.js
new file mode 100644
index 0000000..97b1e07
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-flowrun/metrics.js
@@ -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.
+ */
+
+import Ember from 'ember';
+import ColumnDef from 'em-table/utils/column-definition';
+
+function _createColumns() {
+  var columns = [];
+
+  columns.push({
+    id: 'name',
+    headerTitle: 'Name',
+    contentPath: 'name',
+    observePath: true,
+    cellComponentName: 'em-table-html-cell',
+    getCellContent: function(row) {
+      var plainName = row.name;
+      if (plainName.indexOf('MAP:') > -1 || plainName.indexOf('REDUCE:') > -1) {
+        plainName = plainName.substring(plainName.indexOf(':') + 1);
+      }
+      return `<span>${plainName}</span>`;
+    }
+  }, {
+    id: 'value',
+    headerTitle: 'Value',
+    contentPath: 'value',
+    observePath: true
+  });
+
+  return ColumnDef.make(columns);
+}
+
+export default Ember.Controller.extend({
+  mapMetrics: null,
+  reduceMetrics: null,
+  generalMetrics: null,
+
+  columns: Ember.computed(function() {
+    return _createColumns(this.get('model.flowrun_uid'));
+  }),
+
+  metricsObserver: Ember.observer('model.flowrun', function() {
+    var metrics = this.get('model.flowrun.metrics');
+    var mapConfigs = [],
+        reduceConfigs = [],
+        generalConfigs = [];
+
+    metrics.forEach(function(metric) {
+      let id = metric.id;
+      if (id.startsWith('MAP:')) {
+        mapConfigs.push(metric);
+      } else if (id.startsWith('REDUCE:')) {
+        reduceConfigs.push(metric);
+      } else {
+        generalConfigs.push(metric);
+      }
+    }, this);
+
+    this.set('mapMetrics', mapConfigs);
+    this.set('reduceMetrics', reduceConfigs);
+    this.set('generalMetrics', generalConfigs);
+  }),
+
+  mapConfigRows: Ember.computed('mapMetrics', function() {
+    var row = null,
+        data = [];
+
+    this.get('mapMetrics').forEach(function(map) {
+      let value = map.values[Object.keys(map.values)[0]];
+      row = Ember.Object.create({
+        name: map.id,
+        value: value
+      });
+      data.push(row);
+    }, this);
+
+    return Ember.A(data);
+  }),
+
+  reduceConfigRows: Ember.computed('reduceMetrics', function() {
+    var row = null,
+        data = [];
+
+    this.get('reduceMetrics').forEach(function(map) {
+      let value = map.values[Object.keys(map.values)[0]];
+      row = Ember.Object.create({
+        name: map.id,
+        value: value
+      });
+      data.push(row);
+    }, this);
+
+    return Ember.A(data);
+  }),
+
+  generalConfigRows: Ember.computed('generalMetrics', function() {
+    var row = null,
+        data = [];
+
+    this.get('generalMetrics').forEach(function(map) {
+      let value = map.values[Object.keys(map.values)[0]];
+      row = Ember.Object.create({
+        name: map.id,
+        value: value
+      });
+      data.push(row);
+    }, this);
+
+    return Ember.A(data);
+  })
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-services.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-services.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-services.js
index eeb6205..a2c80f7 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-services.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-services.js
@@ -18,9 +18,19 @@
 
 import Ember from 'ember';
 import AppTableController from './app-table-columns';
-
+import TableDefinition from 'em-table/utils/table-definition';
 
 export default AppTableController.extend({
+  queryParams: ['searchText', 'sortColumnId', 'sortOrder', 'pageNum', 'rowCount'],
+  tableDefinition: TableDefinition.create({
+    sortColumnId: 'stTime',
+    sortOrder: 'desc'
+  }),
+  searchText: Ember.computed.alias('tableDefinition.searchText'),
+  sortColumnId: Ember.computed.alias('tableDefinition.sortColumnId'),
+  sortOrder: Ember.computed.alias('tableDefinition.sortOrder'),
+  pageNum: Ember.computed.alias('tableDefinition.pageNum'),
+  rowCount: Ember.computed.alias('tableDefinition.rowCount'),
 
   breadcrumbs: [{
     text: "Home",

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/mixins/app-attempt.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/mixins/app-attempt.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/mixins/app-attempt.js
new file mode 100644
index 0000000..a90bf36
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/mixins/app-attempt.js
@@ -0,0 +1,66 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Mixin.create({
+  fetchAppInfoFromRMorATS(appId, store) {
+    return new Ember.RSVP.Promise(function(resolve, reject) {
+      store.find('yarn-app', appId).then(function(rmApp) {
+        resolve(rmApp);
+      }, function() {
+        store.find('yarn-app-timeline', appId).then(function(atsApp) {
+          resolve(atsApp);
+        }, function() {
+          console.error('Error:', 'Application not found in RM or ATS for appId: ' + appId);
+          reject(null);
+        });
+      });
+    });
+  },
+
+  fetchAttemptInfoFromRMorATS(attemptId, store) {
+    return new Ember.RSVP.Promise(function(resolve, reject) {
+      store.findRecord('yarn-app-attempt', attemptId, {reload: true}).then(function(rmAttempt) {
+        resolve(rmAttempt);
+      }, function() {
+        store.findRecord('yarn-timeline-appattempt', attemptId, {reload: true}).then(function(atsAttempt) {
+          resolve(atsAttempt);
+        }, function() {
+          console.error('Error:', 'Application attempt not found in RM or ATS for attemptId: ' + attemptId);
+          reject(null);
+        });
+      });
+    });
+  },
+
+  fetchAttemptListFromRMorATS(appId, store) {
+    return new Ember.RSVP.Promise(function(resolve, reject) {
+      store.query('yarn-app-attempt', {appId: appId}).then(function(rmAttempts) {
+        resolve(rmAttempts);
+      }, function() {
+        store.query('yarn-timeline-appattempt', {appId: appId}).then(function(atsAttempts) {
+          resolve(atsAttempts);
+        }, function() {
+          console.error('Error:', 'Application attempts not found in RM or ATS for appId: ' + appId);
+          reject(null);
+        });
+      });
+    });
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-attempt.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-attempt.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-attempt.js
index c83eb2e..dd95765 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-attempt.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-attempt.js
@@ -74,7 +74,7 @@ export default DS.Model.extend({
     if (!this.get("containerId")) {
       return this.get("id");
     }
-    return "attempt_" + 
+    return "attempt_" +
            parseInt(Converter.containerIdToAttemptId(this.get("containerId")).split("_")[3]);
   }.property("containerId"),
 
@@ -119,13 +119,12 @@ export default DS.Model.extend({
     if (elapsedMs <= 0) {
       elapsedMs = Date.now() - this.get("startTs");
     }
-
-    return Converter.msToElapsedTime(elapsedMs);
+    return Converter.msToElapsedTimeUnit(elapsedMs);
   }.property(),
 
   tooltipLabel: function() {
-    return "<p>Id:" + this.get("id") + 
-           "</p><p>ElapsedTime:" + 
+    return "<p>Id:" + this.get("id") +
+           "</p><p>ElapsedTime:" +
            String(this.get("elapsedTime")) + "</p>";
   }.property(),
 
@@ -141,4 +140,4 @@ export default DS.Model.extend({
     return this.get("state");
   }.property(),
 
-});
\ No newline at end of file
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-flowrun.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-flowrun.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-flowrun.js
new file mode 100644
index 0000000..a8a7471
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-flowrun.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 DS from 'ember-data';
+import Converter from 'yarn-ui/utils/converter';
+
+export default DS.Model.extend({
+  appId: DS.attr('string'),
+  type: DS.attr('string'),
+  uid: DS.attr('string'),
+  metrics: DS.attr('array'),
+  startedTs: DS.attr('number'),
+  finishedTs: DS.attr('number'),
+  state: DS.attr('string'),
+  cpuVCores: DS.attr('number'),
+  memoryUsed: DS.attr('number'),
+
+  elapsedTs: function() {
+    return this.get('finishedTs') - this.get('startedTs');
+  }.property('startedTs', 'finishedTs'),
+
+  getCpuVCoresVizDataForBarChart: function() {
+    return {
+      label: this.get('appId'),
+      value: this.get('cpuVCores'),
+      tooltip: this.get("appId") + "<br>" + 'CPU VCores: ' + this.get('cpuVCores')
+    };
+  },
+
+  getMemoryVizDataForBarChart: function() {
+    return {
+      label: this.get('appId'),
+      value: this.get('memoryUsed'),
+      tooltip: this.get("appId") + "<br>" + 'Memory Used: ' + Converter.memoryBytesToMB(this.get('memoryUsed'))
+    };
+  }
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-timeline.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-timeline.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-timeline.js
new file mode 100644
index 0000000..fa5223f
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-timeline.js
@@ -0,0 +1,105 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+import Converter from 'yarn-ui/utils/converter';
+
+export default DS.Model.extend({
+  appName: DS.attr('string'),
+  user: DS.attr('string'),
+  queue: DS.attr('string'),
+  state: DS.attr('string'),
+  startTime: DS.attr('string'),
+  elapsedTime: DS.attr('string'),
+  finalStatus: DS.attr('string'),
+  finishedTime: DS.attr('finishedTime'),
+  progress: DS.attr('number'),
+  diagnostics: DS.attr('string'),
+  amContainerLogs: DS.attr('string'),
+  amHostHttpAddress: DS.attr('string'),
+  logAggregationStatus: DS.attr('string'),
+  unmanagedApplication: DS.attr('string'),
+  amNodeLabelExpression: DS.attr('string'),
+  applicationTags: DS.attr('string'),
+  applicationType: DS.attr('string'),
+  priority: DS.attr('number'),
+  allocatedMB: DS.attr('number'),
+  allocatedVCores: DS.attr('number'),
+  runningContainers: DS.attr('number'),
+  memorySeconds: DS.attr('number'),
+  vcoreSeconds: DS.attr('number'),
+  preemptedResourceMB: DS.attr('number'),
+  preemptedResourceVCores: DS.attr('number'),
+  numNonAMContainerPreempted: DS.attr('number'),
+  numAMContainerPreempted: DS.attr('number'),
+  clusterUsagePercentage: DS.attr('number'),
+  queueUsagePercentage: DS.attr('number'),
+  currentAppAttemptId: DS.attr('string'),
+
+  isFailed: function() {
+    return this.get('finalStatus') === "FAILED";
+  }.property("finalStatus"),
+
+  validatedFinishedTs: function() {
+    if (this.get("finishedTime") < this.get("startTime")) {
+      return "";
+    }
+    return this.get("finishedTime");
+  }.property("finishedTime"),
+
+  formattedElapsedTime: function() {
+    return Converter.msToElapsedTimeUnit(this.get('elapsedTime'));
+  }.property('elapsedTime'),
+
+  allocatedResource: function() {
+    return Converter.resourceToString(this.get("allocatedMB"), this.get("allocatedVCores"));
+  }.property("allocatedMB", "allocatedVCores"),
+
+  preemptedResource: function() {
+    return Converter.resourceToString(this.get("preemptedResourceMB"), this.get("preemptedResourceVCores"));
+  }.property("preemptedResourceMB", "preemptedResourceVCores"),
+
+  aggregatedResourceUsage: function() {
+    return Converter.resourceToString(this.get("memorySeconds"), this.get("vcoreSeconds")) + " (× Secs)";
+  }.property("memorySeconds", "vcoreSeconds"),
+
+  progressStyle: function() {
+    return "width: " + this.get("progress") + "%";
+  }.property("progress"),
+
+  runningContainersNumber: function() {
+    if(this.get("runningContainers") < 0) {
+      return 0;
+    }
+    return this.get("runningContainers");
+  }.property("progress"),
+
+  finalStatusStyle: function() {
+    var style = "default";
+    var finalStatus = this.get("finalStatus");
+    if (finalStatus === "KILLED") {
+      style = "warning";
+    } else if (finalStatus === "FAILED") {
+      style = "danger";
+    } else {
+      style = "success";
+    }
+
+    return "label label-" + style;
+  }.property("finalStatus")
+});

http://git-wip-us.apache.org/repos/asf/hadoop/blob/46d9c4ca/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-container.js
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-container.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-container.js
index bd9cea7..7f39345 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-container.js
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-container.js
@@ -52,13 +52,12 @@ export default DS.Model.extend({
     if (elapsedMs <= 0) {
       elapsedMs = Date.now() - this.get("startTs");
     }
-
-    return Converter.msToElapsedTime(elapsedMs);
+    return Converter.msToElapsedTimeUnit(elapsedMs);
   }.property(),
 
   tooltipLabel: function() {
-    return "<p>Id:" + this.get("id") + 
-           "</p><p>ElapsedTime:" + 
+    return "<p>Id:" + this.get("id") +
+           "</p><p>ElapsedTime:" +
            String(this.get("elapsedTime")) + "</p>";
   }.property(),
-});
\ No newline at end of file
+});

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

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


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org