azkaban-aplcache
Changes
src/java/azkaban/webapp/servlet/ScheduleServlet.java 104(+30 -74)
src/web/js/azkaban.scheduled.view.js 20(+20 -0)
Details
src/java/azkaban/webapp/servlet/ScheduleServlet.java 104(+30 -74)
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">←</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">→</span></a></li>
+ </ul>
+ </div-->
+ </div>
+ </div>
+ </body>
+</html>
src/web/js/azkaban.scheduled.view.js 20(+20 -0)
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"
+ )
+}