azkaban-aplcache

Details

diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ExecutorServlet.java b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ExecutorServlet.java
index 61a8325..eeb6f9f 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ExecutorServlet.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ExecutorServlet.java
@@ -867,6 +867,7 @@ public class ExecutorServlet extends LoginAbstractAzkabanServlet {
     nodeObj.put("endTime", node.getEndTime());
     nodeObj.put("updateTime", node.getUpdateTime());
     nodeObj.put("type", node.getType());
+    nodeObj.put("condition", node.getCondition());
     nodeObj.put("nestedId", node.getNestedId());
 
     nodeObj.put("attempt", node.getAttempt());
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
index b384c66..4a89efa 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -801,6 +801,7 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
       final HashMap<String, Object> nodeObj = new HashMap<>();
       nodeObj.put("id", node.getId());
       nodeObj.put("type", node.getType());
+      nodeObj.put("condition", node.getCondition());
       if (node.getEmbeddedFlowId() != null) {
         nodeObj.put("flowId", node.getEmbeddedFlowId());
         fillFlowInfo(project, node.getEmbeddedFlowId(), nodeObj);
@@ -1677,7 +1678,7 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
     final String projectName = (String) multipart.get("project");
     final Project project = this.projectManager.getProject(projectName);
     if(project == null || !project.isActive()) {
-      String failureCause = project == null ? "doesn't exist." : "was already removed.";
+      final String failureCause = project == null ? "doesn't exist." : "was already removed.";
       registerError(ret, "Installation Failed. Project '" + projectName + " "
           + failureCause, resp, 410);
       return;
diff --git a/azkaban-web-server/src/main/less/azkaban-graph.less b/azkaban-web-server/src/main/less/azkaban-graph.less
index 16af17a..a03b611 100644
--- a/azkaban-web-server/src/main/less/azkaban-graph.less
+++ b/azkaban-web-server/src/main/less/azkaban-graph.less
@@ -60,7 +60,7 @@
 
 .RUNNING > g > rect {
   fill: #39b3d7;
-  stroke: #39b3d7;
+  stroke: #3997bd;
 }
 
 .RUNNING > g > text {
@@ -69,7 +69,7 @@
 
 .SUCCEEDED > g > rect {
   fill: #5cb85c;
-  stroke: #4cae4c;
+  stroke: #60a060;
 }
 
 .SUCCEEDED > g > text {
@@ -78,7 +78,7 @@
 
 .FAILED > g > rect {
   fill: #d2322d;
-  stroke: #d2322d;
+  stroke: #b43128;
 }
 
 .FAILED > g > text {
@@ -87,7 +87,7 @@
 
 .KILLED > g > rect {
   fill: #d2322d;
-  stroke: #d2322d;
+  stroke: #b43128;
 }
 
 .KILLED > g > text {
@@ -96,7 +96,7 @@
 
 .KILLING > g > rect {
   fill: #FF9999;
-  stroke: #FF9999;
+  stroke: #d78484;
 }
 
 .KILLING > g > text {
@@ -105,7 +105,7 @@
 
 .CANCELLED > g > rect {
   fill: #FF9999;
-  stroke: #FF9999;
+  stroke: #d78484;
 }
 
 .CANCELLED > g > text {
@@ -114,7 +114,7 @@
 
 .FAILED_SUCCEEDED > g > rect {
   fill: #FF9999;
-  stroke: #FF9999;
+  stroke: #d78484;
 }
 
 .FAILED_SUCCEEDED > g > text {
@@ -123,7 +123,7 @@
 
 .FAILED_FINISHING > g > rect {
   fill: #ed9c28;
-  stroke: #ed9c28;
+  stroke: #d78484;
 }
 
 .FAILED_FINISHING > g > text {
@@ -159,7 +159,7 @@
 
 .QUEUED > g > rect {
   fill: #39b3d7;
-  stroke: #39b3d7;
+  stroke: #3997bd;
 }
 
 .QUEUED > g > text {
diff --git a/azkaban-web-server/src/web/js/azkaban/view/svg-graph.js b/azkaban-web-server/src/web/js/azkaban/view/svg-graph.js
index a90f9e5..12d7c50 100644
--- a/azkaban-web-server/src/web/js/azkaban/view/svg-graph.js
+++ b/azkaban-web-server/src/web/js/azkaban/view/svg-graph.js
@@ -351,7 +351,9 @@ azkaban.SvgGraphView = Backbone.View.extend({
     if (node.type == 'flow') {
       this.drawFlowNode(self, node, g);
     }
-    else {
+    else if (node.condition != null) {
+      this.drawConditionNode(self, node, g);
+    } else {
       this.drawBoxNode(self, node, g);
     }
   },
@@ -551,6 +553,40 @@ azkaban.SvgGraphView = Backbone.View.extend({
     nodeG.data = node;
   },
 
+  drawConditionNode: function (self, node, g) {
+    var svg = this.svg;
+    var horizontalMargin = 8;
+    var verticalMargin = 2;
+
+    var nodeG = svg.group(g, "", {class: "node jobnode"});
+
+    var innerG = svg.group(nodeG, "", {class: "nodebox"});
+    var borderRect = svg.rect(innerG, 0, 0, 10, 10, 3, 3, {class: "border"});
+    var conditionRect = svg.rect(innerG, 0, 0, 10, 10, 0, 0, {class: "border"});
+    var jobNameText = svg.text(innerG, horizontalMargin, 16, node.label);
+    var conditionText = svg.text(innerG, horizontalMargin, 12, "condition",
+        {"font-size": 12});
+    nodeG.innerG = innerG;
+    innerG.borderRect = borderRect;
+
+    var labelBBox = jobNameText.getBBox();
+    var conditionlabelBBox = conditionText.getBBox();
+    var totalWidth = labelBBox.width + 2 * horizontalMargin;
+    var totalHeight = 2 * labelBBox.height + 2 * verticalMargin;
+    svg.change(borderRect, {width: totalWidth, height: totalHeight});
+    svg.change(conditionRect, {width: totalWidth, height: labelBBox.height});
+    svg.change(conditionText, {x: (totalWidth - conditionlabelBBox.width) / 2});
+    svg.change(jobNameText, {y: (totalHeight + labelBBox.height) / 2 + 6});
+    svg.change(innerG,
+        {transform: translateStr(-totalWidth / 2, -totalHeight / 2)});
+
+    node.width = totalWidth;
+    node.height = totalHeight;
+
+    node.gNode = nodeG;
+    nodeG.data = node;
+  },
+
   drawFlowNode: function (self, node, g) {
     var svg = this.svg;