azkaban-uncached

Details

diff --git a/src/java/azkaban/webapp/servlet/velocity/executingflowpage.vm b/src/java/azkaban/webapp/servlet/velocity/executingflowpage.vm
index f8c4281..a0fe230 100644
--- a/src/java/azkaban/webapp/servlet/velocity/executingflowpage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/executingflowpage.vm
@@ -22,7 +22,13 @@
 #parse("azkaban/webapp/servlet/velocity/javascript.vm")
 
 		<script type="text/javascript" src="${context}/js/moment.min.js"></script>
-		<script type="text/javascript" src="${context}/js/bootstrap-datetimepicker.min.js"></script>
+    <script type="text/javascript" src="${context}/js/bootstrap-datetimepicker.min.js"></script>
+    
+    <script type="text/javascript" src="${context}/js/dust-full-2.2.3.min.js"></script>
+    <script type="text/javascript" src="${context}/js/flowsummary.js"></script>
+		<script type="text/javascript" src="${context}/js/flowsummary-no-data.js"></script>
+		<script type="text/javascript" src="${context}/js/flowsummary-last-run.js"></script>
+
 		<script type="text/javascript" src="${context}/js/azkaban.common.utils.js"></script>
 		<script type="text/javascript" src="${context}/js/azkaban.date.utils.js"></script>
 		<script type="text/javascript" src="${context}/js/azkaban.context.menu.js"></script>
@@ -30,6 +36,7 @@
 		<script type="text/javascript" src="${context}/js/azkaban.job.status.utils.js"></script>
 		<script type="text/javascript" src="${context}/js/azkaban.layout.js"></script>
 		<script type="text/javascript" src="${context}/js/azkaban.exflow.view.js"></script>
+		<script type="text/javascript" src="${context}/js/azkaban.flow.stats.view.js"></script>
 		<script type="text/javascript" src="${context}/js/azkaban.flow.job.view.js"></script>
 		<script type="text/javascript" src="${context}/js/azkaban.svg.graph.view.js"></script>
 		<script type="text/javascript" src="${context}/js/svgNavigate.js"></script>
@@ -104,7 +111,7 @@
 				<li id="graphViewLink"><a href="#graph">Graph</a></li>
 				<li id="jobslistViewLink"><a href="#jobslist">Job List</a></li>
 				<li id="flowLogViewLink"><a href="#log">Flow Log</a></li>
-				<li id="statsLink"><a href="#stats">Stats</a></li>
+				<li id="statsViewLink"><a href="#stats">Stats</a></li>
 				<li class="nav-button pull-right"><button type="button" id="pausebtn" class="btn btn-primary">Pause</button></li>
 				<li class="nav-button pull-right"><button type="button" id="resumebtn" class="btn btn-primary">Resume</button></li>
 				<li class="nav-button pull-right"><button type="button" id="cancelbtn" class="btn btn-danger">Cancel</button></li>
@@ -166,7 +173,13 @@
   ## Stats view.
 
     <div class="container-full" id="statsView">
-			<div class="row" id="stats-view-content">
+      <div class="row" id="stats-view-content">
+        <div class="col-lg-12" id="flow-stats-container">
+          <div class="alert alert-default">
+            <h4>No stats available</h4>
+            <p>Stats for this flow execution are not available.</p>
+          </div>
+        </div>
 			</div><!-- /.row -->
     </div><!-- /.container-fill -->
 	
diff --git a/src/web/js/azkaban.exflow.view.js b/src/web/js/azkaban.exflow.view.js
index 4ac616b..6c1a76a 100644
--- a/src/web/js/azkaban.exflow.view.js
+++ b/src/web/js/azkaban.exflow.view.js
@@ -89,6 +89,7 @@ azkaban.FlowTabView = Backbone.View.extend({
 		"click #graphViewLink": "handleGraphLinkClick",
 		"click #jobslistViewLink": "handleJobslistLinkClick",
 		"click #flowLogViewLink": "handleLogLinkClick",
+		"click #statsViewLink": "handleStatsLinkClick",
 		"click #cancelbtn": "handleCancelClick",
 		"click #executebtn": "handleRestartClick",
 		"click #pausebtn": "handlePauseClick",
@@ -123,30 +124,49 @@ azkaban.FlowTabView = Backbone.View.extend({
 		$("#jobslistViewLink").removeClass("active");
 		$("#graphViewLink").addClass("active");
 		$("#flowLogViewLink").removeClass("active");
+		$("#statsViewLink").removeClass("active");
 		
 		$("#jobListView").hide();
 		$("#graphView").show();
 		$("#flowLogView").hide();
+		$("#statsView").hide();
 	},
 	
 	handleJobslistLinkClick: function() {
 		$("#graphViewLink").removeClass("active");
 		$("#jobslistViewLink").addClass("active");
 		$("#flowLogViewLink").removeClass("active");
+		$("#statsViewLink").removeClass("active");
 		
 		$("#graphView").hide();
 		$("#jobListView").show();
 		$("#flowLogView").hide();
+		$("#statsView").hide();
 	},
 	
 	handleLogLinkClick: function() {
 		$("#graphViewLink").removeClass("active");
 		$("#jobslistViewLink").removeClass("active");
 		$("#flowLogViewLink").addClass("active");
+		$("#statsViewLink").removeClass("active");
 		
 		$("#graphView").hide();
 		$("#jobListView").hide();
 		$("#flowLogView").show();
+		$("#statsView").hide();
+	},
+	
+  handleStatsLinkClick: function() {
+		$("#graphViewLink").removeClass("active");
+		$("#jobslistViewLink").removeClass("active");
+		$("#flowLogViewLink").removeClass("active");
+		$("#statsViewLink").addClass("active");
+		
+		$("#graphView").hide();
+		$("#jobListView").hide();
+		$("#flowLogView").hide();
+    statsView.show();
+		$("#statsView").show();
 	},
 	
 	handleFlowStatusChange: function() {
@@ -566,6 +586,40 @@ azkaban.FlowLogView = Backbone.View.extend({
 	}
 });
 
+var statsView;
+azkaban.StatsView = Backbone.View.extend({
+	events: {
+	},
+	
+  initialize: function(settings) {
+    this.model.bind('change:graph', this.statusUpdate, this);
+    this.model.bind('change:update', this.statusUpdate, this);
+		this.model.bind('render', this.render, this);
+    this.status = null;
+    this.rendered = false;
+  },
+
+  statusUpdate: function(evt) {
+    var data = this.model.get('data');
+    this.status = data.status;
+  },
+
+  show: function() {
+    this.model.trigger("render");
+  },
+
+  render: function(evt) {
+    if (this.rendered == true) {
+      return;
+    }
+    if (this.status != 'SUCCEEDED') {
+      return;
+    }
+    flowStatsView.show(execId);
+    this.rendered = true;
+  }
+});
+
 var graphModel;
 azkaban.GraphModel = Backbone.Model.extend({});
 
@@ -721,6 +775,9 @@ var attemptRightClick = function(event) {
 	return false;
 }
 
+var flowStatsView;
+var flowStatsModel;
+
 $(function() {
 	var selected;
 	
@@ -757,6 +814,17 @@ $(function() {
 		el: $('#flow-status'), 
 		model: graphModel
 	});
+  
+  flowStatsModel = new azkaban.FlowStatsModel();
+	flowStatsView = new azkaban.FlowStatsView({
+		el: $('#stats-view-content'),
+		model: flowStatsModel
+	});
+
+  statsView = new azkaban.StatsView({
+		el: $('#statsView'), 
+		model: graphModel
+	});
 	
 	executionListView = new azkaban.ExecutionListView({
 		el: $('#jobListView'), 
@@ -807,6 +875,9 @@ $(function() {
 			else if (hash == "#log") {
 				flowTabView.handleLogLinkClick();
 			}
+      else if (hash == "#stats") {
+        flowTabView.handleStatsLinkClick();
+      }
 		}
 		else {
 			flowTabView.handleGraphLinkClick();