azkaban-uncached

Move scheduling info back to flow summary view. Plumb schedule

12/17/2013 10:36:37 PM

Details

diff --git a/src/java/azkaban/scheduler/ScheduleManager.java b/src/java/azkaban/scheduler/ScheduleManager.java
index 81c5c29..f0325af 100644
--- a/src/java/azkaban/scheduler/ScheduleManager.java
+++ b/src/java/azkaban/scheduler/ScheduleManager.java
@@ -104,7 +104,6 @@ public class ScheduleManager implements TriggerAgent {
 	
 	// only do this when using external runner
 	public synchronized void updateLocal() throws ScheduleManagerException {
-
 		List<Schedule> updates = loader.loadUpdatedSchedules();
 		for(Schedule s : updates) {
 			if(s.getStatus().equals(TriggerStatus.EXPIRED.toString())) {
@@ -157,15 +156,15 @@ public class ScheduleManager implements TriggerAgent {
 	 * @param id
 	 * @return
 	 * @throws ScheduleManagerException 
-	*/
+	 */
 //	public Set<Schedule> getSchedules(int projectId, String flowId) throws ScheduleManagerException {
 //		updateLocal();
 //		return scheduleIdentityPairMap.get(new Pair<Integer,String>(projectId, flowId));
 //	}
 	public Schedule getSchedule(int projectId, String flowId) throws ScheduleManagerException {
-	updateLocal();
-	return scheduleIdentityPairMap.get(new Pair<Integer,String>(projectId, flowId));
-}
+		updateLocal();
+		return scheduleIdentityPairMap.get(new Pair<Integer,String>(projectId, flowId));
+	}
 
 	/**
 	 * Returns the scheduled flow for the scheduleId
diff --git a/src/java/azkaban/webapp/servlet/ScheduleServlet.java b/src/java/azkaban/webapp/servlet/ScheduleServlet.java
index b31b4ca..9a4ea4e 100644
--- a/src/java/azkaban/webapp/servlet/ScheduleServlet.java
+++ b/src/java/azkaban/webapp/servlet/ScheduleServlet.java
@@ -114,8 +114,8 @@ public class ScheduleServlet extends LoginAbstractAzkabanServlet {
 		else if (ajaxName.equals("scheduleFlow")) {
 			ajaxScheduleFlow(req, ret, session.getUser());
 		}
-    else if (action.equals("fetchSchedules")) {
-      ajaxFetchSchedules(req, ret, session.getUser());
+    else if (ajaxName.equals("fetchSchedule")) {
+      ajaxFetchSchedule(req, ret, session.getUser());
     }
 
 		if (ret != null) {
@@ -232,15 +232,24 @@ public class ScheduleServlet extends LoginAbstractAzkabanServlet {
 		return Minutes.minutes(min+hour*60).toPeriod();
 	}
   
-  private void ajaxFetchSchedules(HttpServletRequest req, 
+  private void ajaxFetchSchedule(HttpServletRequest req, 
       HashMap<String, Object> ret, User user) throws ServletException {
 		
+		int projectId = getIntParam(req, "projectId");
 	  String flowId = getParam(req, "flowId");	
 		try {
-      List<Schedule> flowSchedules = scheduleManager.getSchedules(flowId);
-      List<Object> schecules = new ArrayList<Object>();
-      
-      ret.put("schedules", schedules);
+      Schedule schedule = scheduleManager.getSchedule(
+					projectId, flowId);
+    
+			if (schedule != null) {
+				Map<String, String> jsonObj = new HashMap<String, String>();
+				jsonObj.put("scheduleId", Integer.toString(schedule.getScheduleId()));
+				jsonObj.put("submitUser", schedule.getSubmitUser());
+				jsonObj.put("firstSchedTime", Long.toString(schedule.getFirstSchedTime()));
+				jsonObj.put("nextExecTime", Long.toString(schedule.getNextExecTime()));
+				jsonObj.put("period", schedule.getPeriod().toString());
+				ret.put("schedule", jsonObj);
+			}
 		}
     catch (ScheduleManagerException e) {
       ret.put("error", e);
diff --git a/src/java/azkaban/webapp/servlet/velocity/flowpage.vm b/src/java/azkaban/webapp/servlet/velocity/flowpage.vm
index c20fd66..376d30c 100644
--- a/src/java/azkaban/webapp/servlet/velocity/flowpage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/flowpage.vm
@@ -26,7 +26,6 @@
 		
     <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/flowscheduling.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>
@@ -111,7 +110,6 @@
 			<ul class="nav nav-tabs" id="headertabs">
 				<li id="graphViewLink"><a href="#graph">Graph</a></li>
 				<li id="executionsViewLink"><a href="#executions">Executions</a></li>
-				<li id="schedulingViewLink"><a href="#scheduling">Scheduling</a></li>
 				<li id="summaryViewLink"><a href="#summary">Summary</a></li>
 			</ul>
 					
@@ -150,11 +148,6 @@
 				</div>
 			</div>
 
-  ## Scheduling view.
-
-      <div class="row" id="schedulingView">
-      </div>
-		
 	## Summary view.
 
 			<div class="row" id="summaryView">
diff --git a/src/tl/flowsummary.tl b/src/tl/flowsummary.tl
index d738b0e..b117f8a 100644
--- a/src/tl/flowsummary.tl
+++ b/src/tl/flowsummary.tl
@@ -15,10 +15,59 @@
               </tr>
             </tbody>
           </table>
+					
+					<div class="panel panel-default">
+						<div class="panel-heading">
+							Scheduling
+							{?schedule}
+							<div class="pull-right">
+								<button type="button" id="removeSchedBtn" class="btn btn-xs btn-danger" onclick="removeSched({schedule.scheduleId})" >Remove Schedule</button>
+							</div>
+							{/schedule}
+						</div>
+						{?schedule}
+						<table class="table table-striped table-condensed table-bordered table-hover">
+							<tbody>
+								<tr>
+									<td class="flow-summary-key">Schedule ID</td>
+									<td class="flow-summary-value">{schedule.scheduleId}</td>
+									<td class="flow-summary-key">Submitted By</td>
+									<td class="flow-summary-value">{schedule.submitUser}</td>
+								</tr>
+								<tr>
+									<td class="flow-summary-key">First Scheduled to Run</td>
+									<td class="flow-summary-value">{schedule.firstSchedTime}</td>
+									<td class="flow-summary-key">Repeats Every</td>
+									<td class="flow-summary-value">{schedule.period}</td>
+								</tr>
+								<tr>
+									<td class="flow-summary-key">Next Execution Time</td>
+									<td class="flow-summary-value">{schedule.nextExecTime}</td>
+									<td class="flow-summary-key">SLA</td>
+									<td class="flow-summary-value">
+									{?schedule.slaOptions}
+										true 
+									{:else} 
+										false 
+									{/schedule.slaOptions}
+										<button type="button" id="addSlaBtn" class="btn btn-xs btn-primary" onclick="slaView.initFromSched({schedule.scheduleId}, '{flowName}')" >Set SLA</button>
+									</td>
+								</tr>
+							</tbody>
+						</table>
+						{:else}
+						<div class="panel-body">
+							<div class="alert alert-info">
+								<h4>No Schedule</h4>
+								<p>This flow has not been scheduled.</p>
+							</div>
+						</div>
+						{/schedule}
+					</div>
 
           <div class="panel panel-default">
             <div class="panel-heading">Last Run Stats</div>
-            {^lastRun}
+            {?lastRun}
             <table class="table table-striped table-bordered table-condensed table-hover">
               <tbody>
 								<tr>
@@ -57,3 +106,5 @@
             {/lastRun}
           </div>
         </div><!-- /.col-lg-12 -->
+
+
diff --git a/src/web/js/azkaban.flow.view.js b/src/web/js/azkaban.flow.view.js
index 9bb3d12..897f09b 100644
--- a/src/web/js/azkaban.flow.view.js
+++ b/src/web/js/azkaban.flow.view.js
@@ -46,7 +46,6 @@ azkaban.FlowTabView = Backbone.View.extend({
 	events: {
 		"click #graphViewLink": "handleGraphLinkClick",
 		"click #executionsViewLink": "handleExecutionLinkClick",
-		"click #schedulingViewLink": "handleSchedulingLinkClick",
 		"click #summaryViewLink": "handleSummaryLinkClick"
 	},
 	
@@ -67,49 +66,31 @@ azkaban.FlowTabView = Backbone.View.extend({
 	handleGraphLinkClick: function(){
 		$("#executionsViewLink").removeClass("active");
 		$("#graphViewLink").addClass("active");
-		$('#schedulingViewLink').removeClass('active');
 		$('#summaryViewLink').removeClass('active');
 		
 		$("#executionsView").hide();
 		$("#graphView").show();
-		$('#schedulingView').hide();
 		$('#summaryView').hide();
 	},
 	
 	handleExecutionLinkClick: function() {
 		$("#graphViewLink").removeClass("active");
 		$("#executionsViewLink").addClass("active");
-		$('#schedulingViewLink').removeClass('active');
 		$('#summaryViewLink').removeClass('active');
 		
 		$("#graphView").hide();
 		$("#executionsView").show();
-		$('#schedulingView').hide();
 		$('#summaryView').hide();
 		executionModel.trigger("change:view");
 	},
 
-	handleSchedulingLinkClick: function() {
-		$('#graphViewLink').removeClass('active');
-		$('#executionsViewLink').removeClass('active');
-		$('#schedulingViewLink').addClass('active');
-		$('#summaryViewLink').removeClass('active');
-
-		$('#graphView').hide();
-		$('#executionsView').hide();
-		$('#schedulingView').show();
-		$('#summaryView').hide();
-	},
-	
   handleSummaryLinkClick: function() {
 		$('#graphViewLink').removeClass('active');
 		$('#executionsViewLink').removeClass('active');
-		$('#schedulingViewLink').removeClass('active');
 		$('#summaryViewLink').addClass('active');
 
 		$('#graphView').hide();
 		$('#executionsView').hide();
-		$('#schedulingView').hide();
 		$('#summaryView').show();
 	},
 });
@@ -311,47 +292,6 @@ azkaban.ExecutionsView = Backbone.View.extend({
 	}
 });
 
-var schedulingView;
-azkaban.SchedulingView = Backbone.View.extend({
-	events: {
-	},
-	
-	initialize: function(settings) {
-		console.log("schedulingView initialize");
-		this.model.bind('change:view', this.handleChangeView, this);
-		this.model.bind('render', this.render, this);
-    var schedules = [
-      {
-        scheduleId: "0",
-        submitUser: "azkaban",
-        firstSchedTime: "1",
-        nextExecTime: "2",
-        period: "3",
-      }
-    ];
-
-    this.model.set({
-      'schedules': schedules
-    });
-    this.model.trigger('render');
-	},
-
-  handleChangeView: function(evt) {
-    console.log("schedulingView handleChangeView");
-  },
-
-	render: function(evt) {
-		console.log("schedulingView render");
-    var data = {
-      schedules: this.model.get('schedules')
-    };
-		dust.render("flowscheduling", data, function(err, out) {
-      console.log(err);
-			$('#schedulingView').html(out);
-		});
-	},
-});
-
 var summaryView;
 azkaban.SummaryView = Backbone.View.extend({
 	events: {
@@ -363,17 +303,53 @@ azkaban.SummaryView = Backbone.View.extend({
 			projectName: projectName,
 			flowId: flowId
 		};
-    var lastRun = {};
+    /*var schedule = {
+			scheduleId: "0",
+			submitUser: "azkaban",
+			firstSchedTime: "1",
+			nextExecTime: "2",
+			period: "3",
+		};
+    var lastRun = {
+			maxMapSlots: 3,
+			maxReduceSlots: 9999,
+			totalMapSlots: 3,
+			totalReduceSlots: 9999,
+			numJobs: 3,
+			longestTaskTime: 1111
+		};*/
+		var lastRun = null;
 
 		this.model.bind('change:view', this.handleChangeView, this);
 		this.model.bind('render', this.render, this);
-		this.model.set({
-			'general': general,
-			'lastRun': lastRun
-		});
+		
+		this.model.set({'general': general});
+		this.fetchSchedule();
+		this.fetchLastRun();
 		this.model.trigger('render');
 	},
 
+	fetchSchedule: function() {
+		var requestURL = contextURL + "/schedule"
+		var requestData = {
+			'ajax': 'fetchSchedule',
+			'projectId': projectId,
+			'flowId': flowId
+		};
+		var model = this.model;
+		var successHandler = function(data) {
+			if (data.schedule != null) {
+				model.set({'schedule': data.schedule});
+				model.trigger('render');
+			}
+		};
+		$.get(requestURL, requestData, successHandler, 'json');
+	},
+
+	fetchLastRun: function() {
+
+	},
+
 	handleChangeView: function(evt) {
 		console.log("summaryView handleChangeView");
 	},
@@ -381,7 +357,9 @@ azkaban.SummaryView = Backbone.View.extend({
 	render: function(evt) {
 		console.log("summaryView render");
 		var data = {
+			flowName: flowId,
 			general: this.model.get('general'),
+			schedule: this.model.get('schedule'),
 			lastRun: this.model.get('lastRun')
 		};
 		dust.render("flowsummary", data, function(err, out) {
@@ -442,9 +420,6 @@ azkaban.GraphModel = Backbone.Model.extend({});
 var executionModel;
 azkaban.ExecutionModel = Backbone.Model.extend({});
 
-var schedulingModel;
-azkaban.SchedulingModel = Backbone.Model.extend({});
-
 var summaryModel;
 azkaban.SummaryModel = Backbone.Model.extend({});
 
@@ -459,12 +434,6 @@ $(function() {
 		model: executionModel
 	});
 	
-  schedulingModel = new azkaban.SchedulingModel();
-	schedulingView = new azkaban.SchedulingView({
-		el: $('#schedulingView'),
-		model: schedulingModel
-	});
-
   summaryModel = new azkaban.SummaryModel();
 	summaryView = new azkaban.SummaryView({
 		el: $('#summaryView'),