azkaban-uncached

Adding viewer links.

2/28/2013 7:33:43 PM

Details

diff --git a/src/java/azkaban/execapp/FlowRunnerManager.java b/src/java/azkaban/execapp/FlowRunnerManager.java
index 6871e08..26bddd0 100644
--- a/src/java/azkaban/execapp/FlowRunnerManager.java
+++ b/src/java/azkaban/execapp/FlowRunnerManager.java
@@ -324,7 +324,7 @@ public class FlowRunnerManager implements EventListener {
 		// Setup flow runner
 		FlowWatcher watcher = null;
 		if (flow.getPipelineExecutionId() != null) {
-			int pipelineExecId = flow.getPipelineExecutionId();
+			Integer pipelineExecId = flow.getPipelineExecutionId();
 			FlowRunner runner = runningFlows.get(pipelineExecId);
 			
 			if (runner != null) {
diff --git a/src/java/azkaban/webapp/servlet/ExecutorServlet.java b/src/java/azkaban/webapp/servlet/ExecutorServlet.java
index c16f6b9..b3eaba0 100644
--- a/src/java/azkaban/webapp/servlet/ExecutorServlet.java
+++ b/src/java/azkaban/webapp/servlet/ExecutorServlet.java
@@ -29,6 +29,8 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.commons.lang.StringUtils;
+
 import azkaban.executor.ExecutableFlow;
 import azkaban.executor.ExecutableNode;
 import azkaban.executor.ExecutableFlow.FailureAction;
@@ -285,7 +287,7 @@ public class ExecutorServlet extends LoginAbstractAzkabanServlet {
 			
 			ret.put("project", projectName);
 			if (ajaxName.equals("executeFlow")) {
-				ajaxExecuteFlow(req, resp, ret, session.getUser());
+				ajaxAttemptExecuteFlow(req, resp, ret, session.getUser());
 			}
 		}
 		if (ret != null) {
@@ -613,6 +615,32 @@ public class ExecutorServlet extends LoginAbstractAzkabanServlet {
 		ret.put("submitUser", exFlow.getSubmitUser());
 	}
 	
+	private void ajaxAttemptExecuteFlow(HttpServletRequest req, HttpServletResponse resp, HashMap<String, Object> ret, User user) throws ServletException {
+		String projectName = getParam(req, "project");
+		String flowId = getParam(req, "flow");
+		
+		Project project = getProjectAjaxByPermission(ret, projectName, user, Type.EXECUTE);
+		if (project == null) {
+			ret.put("error", "Project '" + projectName + "' doesn't exist.");
+			return;
+		}
+		
+		ret.put("flow",  flowId);
+		Flow flow = project.getFlow(flowId);
+		if (flow == null) {
+			ret.put("error", "Flow '" + flowId + "' cannot be found in project " + project);
+			return;
+		}
+		
+		List<Integer> executingFlows = executorManager.getRunningFlows(project.getId(), flowId);
+		if (executingFlows.isEmpty() || hasParam(req, "executingJobOption")) {
+			ajaxExecuteFlow(req, resp, ret, user);
+		}
+		else {
+			ret.put("error", "Flow is already running with execid=" + StringUtils.join(executingFlows, ","));
+		}
+	}
+	
 	private void ajaxExecuteFlow(HttpServletRequest req, HttpServletResponse resp, HashMap<String, Object> ret, User user) throws ServletException {
 		String projectName = getParam(req, "project");
 		String flowId = getParam(req, "flow");
diff --git a/src/web/js/azkaban.project.view.js b/src/web/js/azkaban.project.view.js
index 853d074..5dd066b 100644
--- a/src/web/js/azkaban.project.view.js
+++ b/src/web/js/azkaban.project.view.js
@@ -81,7 +81,9 @@ azkaban.FlowTableView= Backbone.View.extend({
     "hover .innerTable .tb-job-name": "jobRunOptions",
     "click .runJob": "runJob",
     "click .runWithDep": "runWithDep",
-    "click .executeFlow": "executeFlow"
+    "click .executeFlow": "executeFlow",
+    "click .viewFlow": "viewFlow",
+    "click .viewJob": "viewJob"
   },
   initialize : function(settings) {
   	_.bindAll(this, 'createJobListTable');
@@ -179,6 +181,13 @@ azkaban.FlowTableView= Backbone.View.extend({
   		$(divMenu).attr("id", menuName);
   		$(divMenu).addClass("job-hover-menu");
   		
+  		var divViewFlow = document.createElement("div");
+  		$(divViewFlow).addClass("btn2");
+  		$(divViewFlow).addClass("viewFlow");
+  		$(divViewFlow).text("View Flow");
+  		divViewFlow.flowId = flowId;
+  		$(divMenu).append(divViewFlow);
+  		
   		var divRunJob = document.createElement("div");
   		$(divRunJob).addClass("btn1");
   		$(divRunJob).addClass("executeFlow");
@@ -206,7 +215,15 @@ azkaban.FlowTableView= Backbone.View.extend({
   		var divMenu = document.createElement("div");
   		$(divMenu).attr("id", menuName);
   		$(divMenu).addClass("job-hover-menu");
-
+  		
+  		var divViewFlow = document.createElement("div");
+  		$(divViewFlow).addClass("btn2");
+  		$(divViewFlow).addClass("viewJob");
+  		$(divViewFlow).text("View Job");
+  		divViewFlow.flowId = flowId;
+  		divViewFlow.jobId = jobName;
+  		$(divMenu).append(divViewFlow);
+  		
   		var divRunJob = document.createElement("div");
   		$(divRunJob).addClass("btn1");
   		$(divRunJob).addClass("runJob");
@@ -254,6 +271,19 @@ azkaban.FlowTableView= Backbone.View.extend({
 	 	}
   	}
   },
+  viewFlow: function(evt) {
+  	console.log("View Flow");
+  	var flowId = evt.currentTarget.flowId;
+
+  	location.href = contextURL + "/manager?project=" + projectId + "&flow=" + flowId;
+  },
+  viewJob: function(evt) {
+  	console.log("View Job");
+  	var flowId = evt.currentTarget.flowId;
+  	var jobId = evt.currentTarget.jobId;
+  	
+  	location.href = contextURL + "/manager?project=" + projectId + "&flow=" + flowId + "&job=" + jobId;
+  },
   runJob: function(evt) {
   	console.log("Run Job");
   	var jobId = evt.currentTarget.jobName;