azkaban-aplcache
Changes
src/java/azkaban/flow/Edge.java 1(+1 -0)
src/java/azkaban/flow/Flow.java 12(+8 -4)
src/java/azkaban/flow/Node.java 4(+0 -4)
src/web/js/azkaban.project.view.js 29(+28 -1)
Details
src/java/azkaban/flow/Edge.java 1(+1 -0)
diff --git a/src/java/azkaban/flow/Edge.java b/src/java/azkaban/flow/Edge.java
index 2c69d82..3ac653b 100644
--- a/src/java/azkaban/flow/Edge.java
+++ b/src/java/azkaban/flow/Edge.java
@@ -73,6 +73,7 @@ public class Edge {
}
public static Edge fromObject(Object obj) {
+ @SuppressWarnings("unchecked")
HashMap<String, Object> edgeObj = (HashMap<String,Object>)obj;
String source = (String)edgeObj.get("source");
src/java/azkaban/flow/Flow.java 12(+8 -4)
diff --git a/src/java/azkaban/flow/Flow.java b/src/java/azkaban/flow/Flow.java
index f85b2d6..c0d2fba 100644
--- a/src/java/azkaban/flow/Flow.java
+++ b/src/java/azkaban/flow/Flow.java
@@ -8,10 +8,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import azkaban.project.ProjectManager;
-import azkaban.project.ResourceLoader;
-import azkaban.utils.Props;
-
public class Flow {
public enum State {
READY, RUNNING, RUNNING_WITH_FAILURE, FAILED, SUCCEEDED
@@ -82,6 +78,14 @@ public class Flow {
return endNodes;
}
+ public Set<Edge> getInEdges(String id) {
+ return inEdges.get(id);
+ }
+
+ public Set<Edge> getOutEdges(String id) {
+ return outEdges.get(id);
+ }
+
public void addAllNodes(Collection<Node> nodes) {
for (Node node: nodes) {
addNode(node);
src/java/azkaban/flow/Node.java 4(+0 -4)
diff --git a/src/java/azkaban/flow/Node.java b/src/java/azkaban/flow/Node.java
index 6819720..97320e4 100644
--- a/src/java/azkaban/flow/Node.java
+++ b/src/java/azkaban/flow/Node.java
@@ -4,10 +4,6 @@ import java.awt.geom.Point2D;
import java.util.HashMap;
import java.util.Map;
-import javax.net.ssl.SSLEngineResult.Status;
-
-import azkaban.utils.Props;
-
public class Node {
public enum State {
FAILED, SUCCEEDED, RUNNING, WAITING, IGNORED
diff --git a/src/java/azkaban/project/Project.java b/src/java/azkaban/project/Project.java
index ee4e9f9..316b11b 100644
--- a/src/java/azkaban/project/Project.java
+++ b/src/java/azkaban/project/Project.java
@@ -1,10 +1,7 @@
package azkaban.project;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
diff --git a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
index 890c0e3..1c964ff 100644
--- a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -7,6 +7,8 @@ import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import java.security.AccessControlException;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -26,7 +28,9 @@ import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
+import azkaban.flow.Edge;
import azkaban.flow.Flow;
+import azkaban.flow.Node;
import azkaban.project.Project;
import azkaban.project.ProjectManager;
import azkaban.project.ProjectManagerException;
@@ -40,6 +44,7 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
private static final long serialVersionUID = 1;
private static final Logger logger = Logger.getLogger(ProjectManagerServlet.class);
private static final int DEFAULT_UPLOAD_DISK_SPOOL_SIZE = 20 * 1024 * 1024;
+ private static final NodeLevelComparator NODE_LEVEL_COMPARATOR = new NodeLevelComparator();
private ProjectManager manager;
private MultipartParser multipartParser;
@@ -62,7 +67,10 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
@Override
protected void handleGet(HttpServletRequest req, HttpServletResponse resp, Session session) throws ServletException, IOException {
if ( hasParam(req, "project") ) {
- if (hasParam(req, "flow")) {
+ if (hasParam(req, "json")) {
+ handleJSONAction(req, resp, session);
+ }
+ else if (hasParam(req, "flow")) {
handleFlowPage(req, resp, session);
}
else {
@@ -96,6 +104,63 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
}
}
+ private void handleJSONAction(HttpServletRequest req, HttpServletResponse resp, Session session) throws ServletException, IOException {
+ String projectName = getParam(req, "project");
+ User user = session.getUser();
+
+ HashMap<String, Object> ret = new HashMap<String, Object>();
+ ret.put("project", projectName);
+
+ Project project = null;
+ try {
+ project = manager.getProject(projectName, user);
+ } catch (Exception e) {
+ ret.put("error", e.getMessage());
+ this.writeJSON(resp, ret);
+ return;
+ }
+
+ String jsonName = getParam(req, "json");
+ if (jsonName.equals("expandflow")) {
+ String flowId = getParam(req, "flow");
+ Flow flow = project.getFlow(flowId);
+
+ ArrayList<Node> flowNodes = new ArrayList<Node>(flow.getNodes());
+ Collections.sort(flowNodes, NODE_LEVEL_COMPARATOR);
+
+ ArrayList<Object> nodeList = new ArrayList<Object>();
+ for (Node node: flowNodes) {
+ HashMap<String, Object> nodeObj = new HashMap<String, Object>();
+ nodeObj.put("id", node.getId());
+
+ ArrayList<String> dependencies = new ArrayList<String>();
+ Collection<Edge> collection = flow.getInEdges(node.getId());
+ if (collection != null) {
+ for (Edge edge: collection) {
+ dependencies.add(edge.getSourceId());
+ }
+ }
+
+ ArrayList<String> dependents = new ArrayList<String>();
+ collection = flow.getOutEdges(node.getId());
+ if (collection != null) {
+ for (Edge edge: collection) {
+ dependents.add(edge.getTargetId());
+ }
+ }
+
+ nodeObj.put("dependencies", dependencies);
+ nodeObj.put("dependents", dependents);
+ nodeObj.put("level", node.getLevel());
+ nodeList.add(nodeObj);
+ }
+
+ ret.put("nodes", nodeList);
+ }
+
+ this.writeJSON(resp, ret);
+ }
+
private void handleFlowPage(HttpServletRequest req, HttpServletResponse resp, Session session) throws ServletException {
Page page = newPage(req, resp, session, "azkaban/webapp/servlet/velocity/flowpage.vm");
String projectName = getParam(req, "project");
@@ -238,4 +303,10 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
return unzipped;
}
+ private static class NodeLevelComparator implements Comparator<Node> {
+ @Override
+ public int compare(Node node1, Node node2) {
+ return node1.getLevel() - node2.getLevel();
+ }
+ }
}
diff --git a/src/java/azkaban/webapp/servlet/velocity/projectpage.vm b/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
index 2f945a2..3b2d236 100644
--- a/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
@@ -16,6 +16,8 @@
var timezone = "${timezone}";
var errorMessage = "${error_message}";
var successMessage = "${success_message}";
+
+ var projectId = "$project.name";
</script>
</head>
<body>
@@ -71,7 +73,7 @@
#foreach($flow in $flows)
<tr class="row">
<td class="tb-name">
- <div class="jobfolder expand" onclick="expandFlow(this)" id="${flow.id}">
+ <div class="jobfolder expand" id="${flow.id}">
<span class="state-icon"></span>
<a href="${context}/manager?flow=${flow.id}">${flow.id}</a>
</div>
src/web/js/azkaban.project.view.js 29(+28 -1)
diff --git a/src/web/js/azkaban.project.view.js b/src/web/js/azkaban.project.view.js
index 89c6bfd..24b008c 100644
--- a/src/web/js/azkaban.project.view.js
+++ b/src/web/js/azkaban.project.view.js
@@ -37,7 +37,33 @@ azkaban.UploadProjectView= Backbone.View.extend({
$("#errorMsg").hide();
},
handleCreateProject : function(evt) {
- $("#upload-form").submit();
+ $("#upload-form").submit();
+ },
+ render: function() {
+ }
+});
+
+var flowTableView;
+azkaban.FlowTableView= Backbone.View.extend({
+ events : {
+ "click .jobfolder": "expandFlowProject"
+ },
+ initialize : function(settings) {
+
+ },
+ expandFlowProject : function(evt) {
+ var targetId = evt.currentTarget.id;
+ var requestURL = contextURL + "/manager";
+
+ // projectId is available
+ $.get(
+ requestURL,
+ {"project": projectId, "json":"expandflow", "flow":targetId},
+ function(data) {
+ console.log("Success");
+ },
+ "json"
+ );
},
render: function() {
}
@@ -46,6 +72,7 @@ azkaban.UploadProjectView= Backbone.View.extend({
$(function() {
projectView = new azkaban.ProjectView({el:$( '#all-jobs-content'), successMsg: successMessage, errorMsg: errorMessage });
uploadView = new azkaban.UploadProjectView({el:$('#upload-project')});
+ flowTableView = new azkaban.FlowTableView({el:$('#flow-tabs')});
// Setting up the project tabs
});