azkaban-memoizeit

Details

diff --git a/src/java/azkaban/webapp/servlet/velocity/flowpage.vm b/src/java/azkaban/webapp/servlet/velocity/flowpage.vm
index bd22907..1759fa2 100644
--- a/src/java/azkaban/webapp/servlet/velocity/flowpage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/flowpage.vm
@@ -26,6 +26,8 @@
 		
     <script type="text/javascript" src="${context}/js/dust-core-2.2.2.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.date.utils.js"></script>
 		<script type="text/javascript" src="${context}/js/azkaban.ajax.utils.js"></script>

src/tl/flowsummary.tl 56(+13 -43)

diff --git a/src/tl/flowsummary.tl b/src/tl/flowsummary.tl
index 10a0680..492f0ba 100644
--- a/src/tl/flowsummary.tl
+++ b/src/tl/flowsummary.tl
@@ -1,5 +1,5 @@
-        <div class="col-lg-12">
-          <table class="table table-bordered table-condensed table-striped">
+        <div class="col-xs-12">
+          <table class="table table-bordered table-condensed">
             <tbody>
               <tr>
                 <td class="property-key">Flow name</td>
@@ -26,7 +26,7 @@
 							{/schedule}
 						</div>
 						{?schedule}
-						<table class="table table-condensed table-bordered table-striped">
+						<table class="table table-condensed table-bordered">
 							<tbody>
 								<tr>
 									<td class="property-key">Schedule ID</td>
@@ -60,52 +60,22 @@
 						{:else}
 						<div class="panel-body">
 							<div class="alert alert-info">
-								<h4>No Schedule</h4>
+								<h4>None</h4>
 								<p>This flow has not been scheduled.</p>
 							</div>
 						</div>
 						{/schedule}
 					</div>
+        </div>
 
-          <div class="panel panel-default">
-            <div class="panel-heading">Last Run Stats</div>
-            {?lastRun}
-            <table class="table table-bordered table-condensed table-striped">
-              <tbody>
-								<tr>
-									<td class="property-key">Max Map Slots from Largest Job</td>
-									<td>{lastRun.maxMapSlots}</td>
-                </tr>
-                <tr>
-									<td class="property-key">Max Reduce Slots from Largest Job</td>
-									<td>{lastRun.maxReduceSlots}</td>
-								</tr>
-								<tr>
-									<td class="property-key">Total Map Slots from All Jobs</td>
-									<td>{lastRun.totalMapSlots}</td>
-                </tr>
-                <tr>
-									<td class="property-key">Total Reduce Slots from All Jobs</td>
-									<td>{lastRun.totalReduceSlots}</td>
-								</tr>
-								<tr>
-									<td class="property-key">Total Number of Jobs</td>
-									<td>{lastRun.numJobs}</td>
-                </tr>
-                <tr>
-									<td class="property-key">Longest Task Time</td>
-									<td>{lastRun.longestTaskTime}</td>
-								</tr>
-              </tbody>
-            </table>
-            {:else}
-            <div class="panel-body">
-              <div class="alert alert-info">
-                <h4>No last run stats available</h4>
-                <p>Last run stats requires at least one successful run of the flow.</p>
-              </div>
-            </div>
-            {/lastRun}
+        <div class="col-xs-12" id="last-run-container">
+          <div class="alert alert-info" id="analyze-last-run">
+            <h4>Analyze last run</h4>
+            <p>Analyze the last run for aggregate performance statistics.</p>
+            <p><strong>Note:</strong> this may take a few minutes, especially if your flow is large.</p>
+            <p>
+              <button type="button" id="analyze-btn" class="btn btn-primary">Analyze</button>
+            </p>
           </div>
         </div><!-- /.col-lg-12 -->
 
diff --git a/src/tl/flowsummary-last-run.tl b/src/tl/flowsummary-last-run.tl
new file mode 100644
index 0000000..fc3ba7f
--- /dev/null
+++ b/src/tl/flowsummary-last-run.tl
@@ -0,0 +1,4 @@
+					<div class="panel panel-default">
+						<div class="panel-heading">Last Run</div>
+            <div class="panel-body">Last run blerb</div>
+          </div>
diff --git a/src/tl/flowsummary-no-data.tl b/src/tl/flowsummary-no-data.tl
new file mode 100644
index 0000000..ec3f4f6
--- /dev/null
+++ b/src/tl/flowsummary-no-data.tl
@@ -0,0 +1,4 @@
+          <div class="alert alert-info">
+            <h4>No Last Run Data</h4>
+            <p>{message}</p>
+          </div>
diff --git a/src/web/js/azkaban.flow.view.js b/src/web/js/azkaban.flow.view.js
index 2e33ddb..462e903 100644
--- a/src/web/js/azkaban.flow.view.js
+++ b/src/web/js/azkaban.flow.view.js
@@ -295,6 +295,7 @@ azkaban.ExecutionsView = Backbone.View.extend({
 var summaryView;
 azkaban.SummaryView = Backbone.View.extend({
 	events: {
+    'click #analyze-btn': 'analyzeLastRun'
 	},
 	
 	initialize: function(settings) {
@@ -303,7 +304,6 @@ azkaban.SummaryView = Backbone.View.extend({
 		
 		this.fetchDetails();
     this.fetchSchedule();
-		this.fetchLastRun();
 		this.model.trigger('render');
 	},
 
@@ -316,10 +316,7 @@ azkaban.SummaryView = Backbone.View.extend({
     };
 		var model = this.model;
     var successHandler = function(data) {
-      console.log(data);
-      model.set({
-        'jobTypes': data.jobTypes
-      });
+      model.set({ 'jobTypes': data.jobTypes });
       model.trigger('render');
     };
     $.get(requestURL, requestData, successHandler, 'json');
@@ -340,10 +337,50 @@ azkaban.SummaryView = Backbone.View.extend({
 		$.get(requestURL, requestData, successHandler, 'json');
 	},
 
-	fetchLastRun: function() {
-
+	analyzeLastRun: function() {
+		var requestURL = contextURL + "/executor";
+    var requestData = {
+      'ajax': 'fetchLastRunStats',
+      'project': projectName,
+      'flow': flowId
+    };
+    var view = this;
+    var successHandler = function(data) {
+      data = {
+        success: false,
+        message: "No last run data available. This flow has not been run yet.",
+        warnings: {},
+        jobs: {}
+      };
+      view.renderLastRun(data);
+    };
+    $.get(requestURL, requestData, successHandler, 'json');
 	},
 
+  renderLastRun: function(data) {
+    var view = this;
+    if (data == null || data.success == null || data.message == null) {
+      var msg = { message: "Error retrieving last run data."};
+      dust.render("flowsummary-no-data", msg, function(err, out) {
+        view.displayLastRun(out);
+      });
+    }
+    else if (data.success == false) {
+      dust.render("flowsummary-no-data", data, function(err, out) {
+        view.displayLastRun(out);
+      });
+    }
+    else {
+      dust.render("flowsummary-last-run", data, function(err, out) {
+        view.displayLastRun(out);
+      });
+    }
+  },
+
+  displayLastRun: function(out) {
+    $('#last-run-container').html(out);
+  },
+
 	handleChangeView: function(evt) {
 	},
 
@@ -352,9 +389,7 @@ azkaban.SummaryView = Backbone.View.extend({
       projectName: projectName,
 			flowName: flowId,
       jobTypes: this.model.get('jobTypes'),
-			general: this.model.get('general'),
 			schedule: this.model.get('schedule'),
-			lastRun: this.model.get('lastRun')
 		};
 		dust.render("flowsummary", data, function(err, out) {
 			$('#summary-view-content').html(out);