azkaban-uncached
Changes
src/web/js/azkaban.project.view.js 34(+32 -2)
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");
src/web/js/azkaban.project.view.js 34(+32 -2)
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;