azkaban-aplcache

Details

diff --git a/src/java/azkaban/webapp/servlet/ScheduleServlet.java b/src/java/azkaban/webapp/servlet/ScheduleServlet.java
index cb4f200..855c0df 100644
--- a/src/java/azkaban/webapp/servlet/ScheduleServlet.java
+++ b/src/java/azkaban/webapp/servlet/ScheduleServlet.java
@@ -45,91 +45,18 @@ public class ScheduleServlet extends LoginAbstractAzkabanServlet {
 		projectManager = this.getApplication().getProjectManager();
 		scheduleManager = this.getApplication().getScheduleManager();
 	}
-
-//	public class PageSelection {
-//		private int page;
-//		private int size;
-//		private boolean disabled;
-//		private boolean selected;
-//		
-//		public PageSelection(int page, int size, boolean disabled, boolean selected) {
-//			this.page = page;
-//			this.size = size;
-//			this.disabled = disabled;
-//			this.setSelected(selected);
-//		}
-//		
-//		public int getPage() {
-//			return page;
-//		}
-//		
-//		public int getSize() {
-//			return size;
-//		}
-//		
-//		public boolean getDisabled() {
-//			return disabled;
-//		}
-//
-//		public boolean isSelected() {
-//			return selected;
-//		}
-//
-//		public void setSelected(boolean selected) {
-//			this.selected = selected;
-//		}
-//	}
 	
 	@Override
 	protected void handleGet(HttpServletRequest req, HttpServletResponse resp,
 			Session session) throws ServletException, IOException {
 		Page page = newPage(req, resp, session, "azkaban/webapp/servlet/velocity/scheduledflowpage.vm");
-//		int pageNum = getIntParam(req, "page", 1);
-//		int pageSize = getIntParam(req, "size", 16);
-		
-//		if (pageNum < 0) {
-//			pageNum = 1;
-//		}
 		
 		List<ScheduledFlow> schedules = scheduleManager.getSchedule();
 		page.add("schedules", schedules);
-//		page.add("size", pageSize);
-//		page.add("page", pageNum);
-		
-//		if (pageNum == 1) {
-//			page.add("previous", new PageSelection(1, pageSize, true, false));
-//		}
-//		page.add("next", new PageSelection(pageNum + 1, pageSize, false, false));
-		// Now for the 5 other values.
-//		int pageStartValue = 1;
-//		if (pageNum > 3) {
-//			pageStartValue = pageNum - 2;
-//		}
-//		
-//		page.add("page1", new PageSelection(pageStartValue, pageSize, false, pageStartValue == pageNum));
-//		pageStartValue++;
-//		page.add("page2", new PageSelection(pageStartValue, pageSize, false, pageStartValue == pageNum));
-//		pageStartValue++;
-//		page.add("page3", new PageSelection(pageStartValue, pageSize, false, pageStartValue == pageNum));
-//		pageStartValue++;
-//		page.add("page4", new PageSelection(pageStartValue, pageSize, false, pageStartValue == pageNum));
-//		pageStartValue++;
-//		page.add("page5", new PageSelection(pageStartValue, pageSize, false, pageStartValue == pageNum));
-//		pageStartValue++;
-//		
+
 		page.render();
 	}
 	
-//	@Override
-//	protected void handleGet(HttpServletRequest req, HttpServletResponse resp, Session session) throws ServletException, IOException {
-//		if (hasParam(req, "ajax")) {
-//			handleAJAXAction(req, resp, session);
-//		}
-////		else if (hasParam(req, "execid")) {
-////			handleExecutionFlowPage(req, resp, session);
-////		}
-//	}
-
 	@Override
 	protected void handlePost(HttpServletRequest req, HttpServletResponse resp, Session session) throws ServletException, IOException {
 		HashMap<String, Object> ret = new HashMap<String, Object>();
@@ -138,6 +65,9 @@ public class ScheduleServlet extends LoginAbstractAzkabanServlet {
 			if (action.equals("scheduleFlow")) {
 				ajaxScheduleFlow(req, ret, session.getUser());
 			}
+			else if(action.equals("removeSched")){
+				ajaxRemoveSched(req, ret, session.getUser());
+			}
 		}
 		this.writeJSON(resp, ret);
 	}
@@ -154,6 +84,32 @@ public class ScheduleServlet extends LoginAbstractAzkabanServlet {
 //	}
 //	
 	
+	private void ajaxRemoveSched(HttpServletRequest req, Map<String, Object> ret, User user) throws ServletException{
+		String scheduleId = getParam(req, "scheduleId");
+		ScheduledFlow schedFlow = scheduleManager.getSchedule(scheduleId);
+		String projectId = schedFlow.getProjectId();
+		Project project = projectManager.getProject(projectId);
+		
+		if (project == null) {
+			ret.put("message", "Project " + projectId + " does not exist");
+			ret.put("status", "error");
+			return;
+		}
+		
+		if (!project.hasPermission(user, Type.SCHEDULE)) {
+			ret.put("status", "error");
+			ret.put("message", "Permission denied. Cannot remove schedule " + scheduleId);
+			return;
+		}
+		
+		scheduleManager.removeScheduledFlow(scheduleId);
+		
+		ret.put("status", "success");
+		ret.put("message", scheduleId + " removed.");
+		return;
+		
+	}
+	
 	private void ajaxScheduleFlow(HttpServletRequest req, Map<String, Object> ret, User user) throws ServletException {
 		String projectId = getParam(req, "projectId");
 		String flowId = getParam(req, "flowId");
diff --git a/src/java/azkaban/webapp/servlet/velocity/scheduledflowpage.vm b/src/java/azkaban/webapp/servlet/velocity/scheduledflowpage.vm
new file mode 100644
index 0000000..d7b57eb
--- /dev/null
+++ b/src/java/azkaban/webapp/servlet/velocity/scheduledflowpage.vm
@@ -0,0 +1,97 @@
+<!DOCTYPE html> 
+<html>
+	<head>
+#parse( "azkaban/webapp/servlet/velocity/style.vm" )
+		<script type="text/javascript" src="${context}/js/jquery/jquery.js"></script>    
+		<script type="text/javascript" src="${context}/js/namespace.js"></script>
+		<script type="text/javascript" src="${context}/js/underscore-1.2.1-min.js"></script>
+		<script type="text/javascript" src="${context}/js/backbone-0.5.3-min.js"></script>
+		<script type="text/javascript" src="${context}/js/jquery.simplemodal.js"></script>
+		<script type="text/javascript" src="${context}/js/azkaban.nav.js"></script>
+		<script type="text/javascript" src="${context}/js/azkaban.main.view.js"></script>
+		<script type="text/javascript" src="${context}/js/azkaban.scheduled.view.js"></script>
+		<script type="text/javascript">
+			var contextURL = "${context}";
+			var currentTime = ${currentTime};
+			var timezone = "${timezone}";
+			var errorMessage = ${error_message};
+			var successMessage = ${success_message};
+	
+		</script>
+	</head>
+	<body>
+		#set($current_page="scheduledFlows")
+#parse( "azkaban/webapp/servlet/velocity/nav.vm" )
+		<div class="messaging"><p id="messageClose">X</p><p id="message"></p></div>  
+
+		<div class="content">
+			<div id="all-scheduledFlows-content">
+				<div class="section-hd">
+					<h2>Scheduled Flows</h2>
+					<form method="get">
+						<input type="hidden" name="action" value="search">
+						<input type="submit" value="Search" class="search-btn">
+						<input id="searchtextbox" type="text" placeholder="by job name or wildcard" value="" class="search-input" name="job">
+					</form>
+				</div>
+			</div>
+			
+			<div class="scheduledFlows">
+				<table id="scheduledFlowsTbl">
+					<thead>
+						<tr>
+							<!--th class="execid">Execution Id</th-->
+							<th>Flow</th>
+							<th>Project</th>
+							<th>User</th>
+							<th class="date">First Scheduled to Run</th>
+							<th class="date">Next Execution Time</th>
+							<th class="date">Repeats Every</th>
+							<!--th class="elapse">Elapsed</th-->
+							<th class="status">Status</th>
+							<th class="action">Action</th>
+						</tr>
+					</thead>
+					<tbody>
+						#if($schedules)
+#foreach($sched in $schedules)
+						<tr class="row" >
+
+							<td class="tb-name">
+								<a href="${context}/manager?project=${sched.projectId}&flow=${sched.flowId}">${sched.flowId}</a>
+							</td>
+							<td>
+								<a href="${context}/manager?project=${sched.projectId}">${sched.projectId}</a>
+							</td>
+							<td>${sched.user}</td>
+							<td>$utils.formatDateTime(${sched.firstSchedTime})</td>
+							<td>$utils.formatDateTime(${sched.nextExecTime})</td>
+							<td>$utils.formatPeriod(${sched.period})</td>
+							<td><div class="status 'READY'">READY</div></td>
+							<td><button id="removeSchedBtn" onclick="removeSched('${sched.scheduleId}')" >Remove Schedule</button></td>
+						</tr>
+#end
+#else
+						<tr><td class="last">No Scheduled Flow Found</td></tr>
+#end
+					</tbody>
+				</table>
+				
+				<!--div id="pageSelection" class="nonjavascript">
+					<ul>
+		
+						<li id="previous" class="first"><a href="${context}/history?page=${previous.page}&size=${previous.size}"><span class="arrow">&larr;</span>Previous</a></li>
+				
+						<li id="page1" #if($page1.selected) class="selected" #end><a href="${context}/history?page=${page1.page}&size=${page1.size}">${page1.page}</a></li>
+						<li id="page2" #if($page2.selected) class="selected" #end><a href="${context}/history?page=${page2.page}&size=${page2.size}">${page2.page}</a></li>
+						<li id="page3" #if($page3.selected) class="selected" #end><a href="${context}/history?page=${page3.page}&size=${page3.size}">${page3.page}</a></li>
+						<li id="page4" #if($page4.selected) class="selected" #end><a href="${context}/history?page=${page4.page}&size=${page4.size}">${page4.page}</a></li>
+						<li id="page5" #if($page5.selected) class="selected" #end><a href="${context}/history?page=${page5.page}&size=${page5.size}">${page5.page}</a></li>
+
+						<li id="next"><a href="${context}/history?page=${next.page}&size=${next.size}">Next<span class="arrow">&rarr;</span></a></li>
+					</ul>
+				</div-->
+			</div>
+		</div>
+	</body>
+</html>
diff --git a/src/web/js/azkaban.scheduled.view.js b/src/web/js/azkaban.scheduled.view.js
new file mode 100644
index 0000000..258f1e5
--- /dev/null
+++ b/src/web/js/azkaban.scheduled.view.js
@@ -0,0 +1,20 @@
+$.namespace('azkaban');
+
+function removeSched(schedId) {
+    var scheduleURL = contextURL + "/schedule"
+    var redirectURL = contextURL + "/schedule"
+    $.post(
+         scheduleURL,
+         {"action":"removeSched", "scheduleId":schedId},
+         function(data) {
+             if (data.error) {
+                 alert(data.error)
+             }
+	     else {
+ 		 alert("Schedule "+schedId+" removed!")
+		 window.location=redirectURL
+             }
+         },
+         "json"
+   )
+}