azkaban-developers

Merge pull request #106 from davidzchen/stats-dir Default

1/15/2014 12:27:47 PM

Details

diff --git a/src/java/azkaban/execapp/AzkabanExecutorServer.java b/src/java/azkaban/execapp/AzkabanExecutorServer.java
index 41681c0..50be4f6 100644
--- a/src/java/azkaban/execapp/AzkabanExecutorServer.java
+++ b/src/java/azkaban/execapp/AzkabanExecutorServer.java
@@ -109,6 +109,12 @@ public class AzkabanExecutorServer {
 		runnerManager.setGlobalProps(executorGlobalProps);
 		
 		configureMBeanServer();
+
+    File statsDir = new File(props.getString("azkaban.stats.dir", "stats"));
+    if (!statsDir.exists()) {
+      statsDir.mkdir();
+    }
+    props.put("azkaban.stats.dir", statsDir.getCanonicalPath());
 		
 		try {
 			server.start();
diff --git a/src/java/azkaban/webapp/AzkabanWebServer.java b/src/java/azkaban/webapp/AzkabanWebServer.java
index c24ea11..52e8d7c 100644
--- a/src/java/azkaban/webapp/AzkabanWebServer.java
+++ b/src/java/azkaban/webapp/AzkabanWebServer.java
@@ -197,6 +197,12 @@ public class AzkabanWebServer extends AzkabanServer {
 		
 		tempDir = new File(props.getString("azkaban.temp.dir", "temp"));
 
+		File statsDir = new File(props.getString("azkaban.stats.dir", "stats"));
+		if (!statsDir.exists()) {
+			statsDir.mkdir();
+		}
+    props.put("azkaban.stats.dir", statsDir.getCanonicalPath());
+
 		// Setup time zone
 		if (props.containsKey(DEFAULT_TIMEZONE_ID)) {
 			String timezone = props.getString(DEFAULT_TIMEZONE_ID);
@@ -588,8 +594,8 @@ public class AzkabanWebServer extends AzkabanServer {
 	}
 
 	/**
-     * 
-     */
+		 * 
+		 */
 	public ExecutorManager getExecutorManager() {
 		return executorManager;
 	}
@@ -1098,10 +1104,11 @@ public class AzkabanWebServer extends AzkabanServer {
 				obj = constructor.newInstance(pluginProps);
 			} catch (Exception e) {
 				logger.error(e);
+				logger.error(e.getCause());
 			} 
 			
 			if (!(obj instanceof AbstractAzkabanServlet)) {
-				logger.error("The object is not an AbstractViewerServlet");
+				logger.error("The object is not an AbstractAzkabanServlet");
 				continue;
 			}
 			
diff --git a/src/java/azkaban/webapp/servlet/velocity/executingflowpage.vm b/src/java/azkaban/webapp/servlet/velocity/executingflowpage.vm
index 4e6f5cc..76919a1 100644
--- a/src/java/azkaban/webapp/servlet/velocity/executingflowpage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/executingflowpage.vm
@@ -42,7 +42,6 @@
 		</script>
 
 		<link rel="stylesheet" type="text/css" href="${context}/css/jquery-ui-1.10.1.custom.css" />
-		<link rel="stylesheet" type="text/css" href="${context}/css/azkaban-graph.css" /> 
 	</head>
 	<body>
 
diff --git a/src/java/azkaban/webapp/servlet/velocity/flowgraphview.vm b/src/java/azkaban/webapp/servlet/velocity/flowgraphview.vm
index 44d6654..4ef618d 100644
--- a/src/java/azkaban/webapp/servlet/velocity/flowgraphview.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/flowgraphview.vm
@@ -17,24 +17,20 @@
 
  	## Graph view.
 
-    <div class="container-full container-fill" id="graphView">
+		<div class="container-full container-fill" id="graphView">
 			<div class="row row-offcanvas row-offcanvas-left">
 				<div class="col-xs-6 col-sm-3 sidebar-offcanvas graph-sidebar">
-          <div class="panel panel-default" id="jobList">
-            <div class="panel-heading">
-              <input id="filter" type="text" placeholder="Job Filter" class="form-control">
-            </div>
-            <div id="joblist" class="list-group"></div>
-            <div class="panel-footer">
-            	<div id="autoPanZoom" class="checkbox">
-            		<label>
-						<input type="checkbox" id="autoPanZoomCheckbox" class="autoPanZoom" value="autoPanZoom" />Auto Pan Zoom
-              		</label>
-              	</div>
-              <button type="button" class="btn btn-sm btn-default" id="resetPanZoomBtn">Reset Pan Zoom</button>
-            </div>
-          </div><!-- /.panel -->
-        </div><!-- /.col-sidebar -->
+					<div class="panel panel-default" id="jobList">
+						<div class="panel-heading">
+							<input id="filter" type="text" placeholder="Job Filter" class="form-control">
+						</div>
+						<div id="joblist"></div>
+						<div class="panel-footer">
+							<button type="button" class="btn btn-sm btn-default" id="resetPanZoomBtn">Reset Pan Zoom</button>
+							<button type="button" class="btn btn-sm btn-default" id="autoPanZoomBtn" data-toggle="button">Auto Pan Zoom</button>
+						</div>
+					</div><!-- /.panel -->
+				</div><!-- /.col-sidebar -->
 				<div class="col-xs-12 col-sm-9 col-content">
 					<div id="svgDiv" class="well well-clear well-sm">
 						<svg id="flow-graph" xmlns="http://www.w3.org/2000/svg" version="1.1" shape-rendering="optimize-speed" text-rendering="optimize-speed">
@@ -42,4 +38,4 @@
 					</div>
 				</div>
 			</div>
-    </div>
+		</div>
diff --git a/src/java/azkaban/webapp/servlet/velocity/index.vm b/src/java/azkaban/webapp/servlet/velocity/index.vm
index 9cbe273..3e8eef8 100644
--- a/src/java/azkaban/webapp/servlet/velocity/index.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/index.vm
@@ -102,15 +102,9 @@
               </div>
               <div class="clearfix"></div>
               <div class="project-flows" id="${project.name}-child">
-                <table class="table">
-                  <thead>
-                    <tr>
-                      <th class="tb-name">Flows</th>
-                    </tr>
-                  </thead>
-                  <tbody id="${project.name}-tbody">
-                  </tbody>
-                </table>
+                <h5>Flows</h5>
+                <div class="list-group" id="${project.name}-tbody">
+                </div>
               </div>
             </li>
   #end
diff --git a/src/java/azkaban/webapp/servlet/velocity/projectpage.vm b/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
index 4f5fd38..631ec0e 100644
--- a/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
@@ -22,7 +22,6 @@
 #parse ("azkaban/webapp/servlet/velocity/javascript.vm")
 #parse ("azkaban/webapp/servlet/velocity/svgflowincludes.vm")
 		<link rel="stylesheet" type="text/css" href="${context}/css/bootstrap-datetimepicker.css" />
-		<link rel="stylesheet" type="text/css" href="${context}/css/azkaban-svg.css" />
 		<script type="text/javascript" src="${context}/js/moment.min.js"></script>
 		<script type="text/javascript" src="${context}/js/bootstrap-datetimepicker.min.js"></script>
 		<script type="text/javascript" src="${context}/js/azkaban/view/project.js"></script>

src/less/flow.less 171(+91 -80)

diff --git a/src/less/flow.less b/src/less/flow.less
index e08f0af..5b1a957 100644
--- a/src/less/flow.less
+++ b/src/less/flow.less
@@ -148,85 +148,96 @@ td {
 // TODO: Rename this as #job-list
 #joblist {
   height: 100%;
-  ul {
-	list-style-type: none;
-	padding-left: 0px;
-	
-	li {
-		&.active > a {
-			background-color: #D9EDFF;
-		}
-	
-		ul {
-			padding-left: 20px;
-		}
-	
-		&.subFilter > a > .expandarrow {
-			color : #3398cc;
-		}
-	
-		> a {
-			clear:both;
-			border-bottom-width: 0;
-		
-			&.nodedisabled,
-			&.DISABLED {
-			  opacity: 0.3;
-			}
-			
-			&.DISABLED .icon {
-			  background-position: 16px 0px;
-			}
-			
-			&.READY .icon {
-			  background-position: 16px 0px;
-			}
-			
-			&.QUEUED .icon {
-			  opacity: 0.5;
-			  background-position: 32px 0px;
-			}
-			
-			&.RUNNING .icon {
-			  background-position: 32px 0px;
-			}
-			
-			&.SUCCEEDED .icon {
-			  background-position: 48px 0px;
-			}
-			
-			&.FAILED .icon {
-			  background-position: 0px 0px;
-			}
-			
-			&.KILLED .icon {
-			  background-position: 0px 0px;
-			}
-			
-			&.FAILED_FINISHING .icon {
-			  background-position: 0px 0px;
-			}
-			
-			.icon {
-			  float: left;
-			  width: 16px;
-			  height: 16px;
-			  margin: 2px 4px 0px -5px;
-			  background-image: url("./images/dot-icon.png");
-			  background-position: 16px 0px;
-			}
-			
-			.expandarrow {
-				float: right;
-				width: 16px;
-				height: 16px;
-				font-size: 8pt;
-			}
-			
-			.filterHighlight {
-				background-color: #FFFF00;
-			}
-		}
-	}
+}
+ul.tree-list {
+  list-style-type: none;
+  padding-left: 0px;
+  margin: 0;
+}
+  
+li.tree-list-item {
+  &.active > a {
+    background-color: #D9EDFF;
+  }
+
+  ul.tree-list {
+    padding-left: 20px;
+  }
+
+  &.subFilter > a > .expandarrow {
+    color : #3398cc;
+  }
+
+  > a {
+    clear: both;
+    position: relative;
+    display: block;
+    border-bottom-width: 0;
+    padding: 10px 15px;
+
+    &:hover,
+    &:focus {
+      text-decoration: none;
+      background-color: #f5f5f5;
+      cursor: pointer;
+    }
+  
+    &.nodedisabled,
+    &.DISABLED {
+      opacity: 0.3;
+    }
+    
+    &.DISABLED .icon {
+      background-position: 16px 0px;
+    }
+    
+    &.READY .icon {
+      background-position: 16px 0px;
+    }
+    
+    &.QUEUED .icon {
+      opacity: 0.5;
+      background-position: 32px 0px;
+    }
+    
+    &.RUNNING .icon {
+      background-position: 32px 0px;
+    }
+    
+    &.SUCCEEDED .icon {
+      background-position: 48px 0px;
+    }
+    
+    &.FAILED .icon {
+      background-position: 0px 0px;
+    }
+    
+    &.KILLED .icon {
+      background-position: 0px 0px;
+    }
+    
+    &.FAILED_FINISHING .icon {
+      background-position: 0px 0px;
+    }
+    
+    .icon {
+      float: left;
+      width: 16px;
+      height: 16px;
+      margin: 2px 4px 0px -5px;
+      background-image: url("./images/dot-icon.png");
+      background-position: 16px 0px;
+    }
+    
+    .expandarrow {
+      float: right;
+      width: 16px;
+      height: 16px;
+      font-size: 8pt;
+    }
+    
+    .filterHighlight {
+      background-color: #FFFF00;
+    }
   }
 }
diff --git a/src/less/Makefile b/src/less/Makefile
index 48f04c6..a3f6fdd 100644
--- a/src/less/Makefile
+++ b/src/less/Makefile
@@ -1,7 +1,7 @@
 OBJ_DIR = obj
 OBJ = \
 	$(OBJ_DIR)/azkaban.css \
-	$(OBJ_DIR)/azkaban-svg.css
+	$(OBJ_DIR)/azkaban-graph.css
 
 all: $(OBJ)
 
diff --git a/src/less/project.less b/src/less/project.less
index d7e1fb9..7875358 100644
--- a/src/less/project.less
+++ b/src/less/project.less
@@ -40,16 +40,25 @@
       }
     }
   }
+}
 
-  .project-flows {
-    display: none;
-    background-color: #f9f9f9;
-    table {
-      background: transparent;
-      margin-bottom: 0;
-      border-top: 1px solid #dddddd;
-    }
-  }
+.project-flows {
+	display: none;
+	background-color: #f9f9f9;
+	padding: 10px 15px 10px 15px;
+
+	h5 {
+		margin-top: 5px;
+	}
+
+	.list-group {
+		margin-bottom: 10px;
+	}
+
+	.list-group-item {
+		background: transparent;
+		padding: 7px 12px 7px 12px;
+	}
 }
 
 // Flow panel heading.
diff --git a/src/package/execserver/conf/azkaban.properties b/src/package/execserver/conf/azkaban.properties
index 3f9beda..585e208 100644
--- a/src/package/execserver/conf/azkaban.properties
+++ b/src/package/execserver/conf/azkaban.properties
@@ -8,7 +8,7 @@ azkaban.jobtype.plugin.dir=plugins/jobtypes
 executor.global.properties=conf/global.properties
 azkaban.project.dir=projects
 
-azkaban.stats.dir=
+azkaban.stats.dir=stats
 
 database.type=mysql
 mysql.port=3306
diff --git a/src/package/soloserver/conf/azkaban.properties b/src/package/soloserver/conf/azkaban.properties
index d600ed9..9ca591e 100644
--- a/src/package/soloserver/conf/azkaban.properties
+++ b/src/package/soloserver/conf/azkaban.properties
@@ -21,7 +21,7 @@ h2.path=data/azkaban
 h2.create.tables=true
 
 # Stats
-azkaban.stats.dir=
+azkaban.stats.dir=stats
 
 # Velocity dev mode
 velocity.dev.mode=false
diff --git a/src/package/webserver/conf/azkaban.properties b/src/package/webserver/conf/azkaban.properties
index 3fe43a0..97e40ae 100644
--- a/src/package/webserver/conf/azkaban.properties
+++ b/src/package/webserver/conf/azkaban.properties
@@ -22,7 +22,7 @@ mysql.user=azkaban
 mysql.password=azkaban
 mysql.numconnections=100
 
-azkaban.stats.dir=
+azkaban.stats.dir=stats
 
 # Velocity dev mode
 velocity.dev.mode=false
diff --git a/src/web/js/azkaban/view/flow-job.js b/src/web/js/azkaban/view/flow-job.js
index c68e279..0e15365 100644
--- a/src/web/js/azkaban/view/flow-job.js
+++ b/src/web/js/azkaban/view/flow-job.js
@@ -19,11 +19,12 @@ azkaban.JobListView = Backbone.View.extend({
 		"keyup input": "filterJobs",
 		"click .job": "handleJobClick",
 		"click #resetPanZoomBtn": "handleResetPanZoom",
+		"click #autoPanZoomBtn": "handleAutoPanZoom",
 		"contextmenu li.listElement": "handleContextMenuClick",
-		"change .autoPanZoom" : "handleAutoPanZoom",
-		"click .expandarrow" : "handleToggleMenuExpand"
+		"click .expandarrow": "handleToggleMenuExpand"
 	},
-	initialize: function(settings) {
+	
+initialize: function(settings) {
 		this.model.bind('change:selected', this.handleSelectionChange, this);
 		this.model.bind('change:disabled', this.handleDisabledChange, this);
 		this.model.bind('change:graph', this.render, this);
@@ -33,8 +34,8 @@ azkaban.JobListView = Backbone.View.extend({
 		this.list = $(this.el).find("#joblist");
 		this.contextMenu = settings.contextMenuCallback;
 		this.listNodes = {};
-		
 	},
+	
 	filterJobs: function(self) {
 		var filter = this.filterInput.val();
 		// Clear all filters first
@@ -54,28 +55,31 @@ azkaban.JobListView = Backbone.View.extend({
 			node.listElement = li;
 
 			var index = nodeName.indexOf(filter);
-			if (index != -1) {
-				var spanlabel = $(li).find("> a > span");
-				
-				var endIndex = index + filter.length;
-				var newHTML = nodeName.substring(0, index) + "<span class=\"filterHighlight\">" + 
+			if (index == -1) {
+				continue;
+			}
+
+			var spanlabel = $(li).find("> a > span");
+			
+			var endIndex = index + filter.length;
+			var newHTML = nodeName.substring(0, index) + "<span class=\"filterHighlight\">" + 
 					nodeName.substring(index, endIndex) + "</span>" + 
 					nodeName.substring(endIndex, nodeName.length);
-				$(spanlabel).html(newHTML);
-				
-				// Apply classes to all the included embedded flows.
-				var pIndex = key.length;
-				while((pIndex = key.lastIndexOf(":", pIndex - 1)) > 0) {
-					var parentId = key.substr(0, pIndex);
-					var parentLi = this.listNodes[parentId];
-					$(parentLi).show();
-					$(parentLi).addClass("subFilter");
-				}
-				
-				$(li).show();
+			$(spanlabel).html(newHTML);
+			
+			// Apply classes to all the included embedded flows.
+			var pIndex = key.length;
+			while ((pIndex = key.lastIndexOf(":", pIndex - 1)) > 0) {
+				var parentId = key.substr(0, pIndex);
+				var parentLi = this.listNodes[parentId];
+				$(parentLi).show();
+				$(parentLi).addClass("subFilter");
 			}
+			
+			$(li).show();
 		}
 	},
+	
 	hideAll: function(self) {
 		for (var key in this.listNodes) {
 			var li = this.listNodes[key];
@@ -85,6 +89,7 @@ azkaban.JobListView = Backbone.View.extend({
 			$(li).hide();
 		}
 	},
+	
 	unfilterAll: function(self) {
 		for (var key in this.listNodes) {
 			var li = this.listNodes[key];
@@ -94,6 +99,7 @@ azkaban.JobListView = Backbone.View.extend({
 			$(li).show();
 		}
 	},
+	
 	handleStatusUpdate: function(evt) {
 		var data = this.model.get("data");
 		var lastUpdateTime = this.model.get("lastUpdateTime");
@@ -101,6 +107,7 @@ azkaban.JobListView = Backbone.View.extend({
 			this.changeStatuses(data, lastUpdateTime);
 		}
 	},
+	
 	changeStatuses: function(data, lastUpdateTime) {
 		for (var i = 0; i < data.nodes.length; ++i) {
 			var node = data.nodes[i];
@@ -117,17 +124,19 @@ azkaban.JobListView = Backbone.View.extend({
 			}
 		}
 	},
+	
 	render: function(self) {
 		var data = this.model.get("data");
 		var nodes = data.nodes;
 		
 		this.renderTree(this.list, data);
-//		
-//		this.assignInitialStatus(self);
+		
+		//this.assignInitialStatus(self);
 		this.handleDisabledChange(self);
 		this.changeStatuses(data, 0);
 	},
-	renderTree : function(el, data, prefix) {
+	
+	renderTree: function(el, data, prefix) {
 		var nodes = data.nodes;
 		if (nodes.length == 0) {
 			console.log("No results");
@@ -149,9 +158,11 @@ azkaban.JobListView = Backbone.View.extend({
 		});
 		
 		var ul = document.createElement('ul');
-		for(var i=0; i < nodeArray.length; ++i) {
+		$(ul).addClass("tree-list");
+		for (var i = 0; i < nodeArray.length; ++i) {
 			var li = document.createElement("li");
 			$(li).addClass("listElement");
+			$(li).addClass("tree-list-item");
 			
 			// This is used for the filter step.
 			var listNodeName = prefix + nodeArray[i].id;
@@ -164,7 +175,6 @@ azkaban.JobListView = Backbone.View.extend({
 			$(iconDiv).addClass('icon');
 			
 			$(a).append(iconDiv);
-			$(a).addClass('list-group-item').addClass('job');
 			
 			var span = document.createElement("span");
 			$(span).text(nodeArray[i].id);
@@ -188,6 +198,7 @@ azkaban.JobListView = Backbone.View.extend({
 		$(el).append(ul);
 		return ul;
 	},
+	
 	handleMenuExpand: function(li) {
 		var expandArrow = $(li).find("> a > .expandarrow");
 		var submenu = $(li).find("> ul");
@@ -196,6 +207,7 @@ azkaban.JobListView = Backbone.View.extend({
 		$(expandArrow).addClass("glyphicon-chevron-up");
 		$(submenu).slideDown();
 	},
+	
 	handleMenuCollapse: function(li) {
 		var expandArrow = $(li).find("> a > .expandarrow");
 		var submenu = $(li).find("> ul");
@@ -204,6 +216,7 @@ azkaban.JobListView = Backbone.View.extend({
 		$(expandArrow).addClass("glyphicon-chevron-down");
 		$(submenu).slideUp();
 	},
+	
 	handleToggleMenuExpand: function(evt) {
 		var expandarrow = evt.currentTarget;
 		var li = $(evt.currentTarget).closest("li.listElement");
@@ -218,12 +231,14 @@ azkaban.JobListView = Backbone.View.extend({
 		
 		evt.stopImmediatePropagation();
 	},
+	
 	handleContextMenuClick: function(evt) {
 		if (this.contextMenu) {
 			this.contextMenu(evt, this.model, evt.currentTarget.node);
 			return false;
 		}
 	},
+	
 	handleJobClick: function(evt) {
 		console.log("Job clicked");
 		var li = $(evt.currentTarget).closest("li.listElement");
@@ -245,9 +260,11 @@ azkaban.JobListView = Backbone.View.extend({
 			this.model.set({"selected": node});
 		}
 	},
+	
 	handleDisabledChange: function(evt) {
 		this.changeDisabled(this.model.get('data'));
 	},
+	
 	changeDisabled: function(data) {
 		for (var i =0; i < data.nodes; ++i) {
 			var node = data.nodes[i];
@@ -262,6 +279,7 @@ azkaban.JobListView = Backbone.View.extend({
 			}
 		}
 	},
+	
 	handleSelectionChange: function(evt) {
 		if (!this.model.hasChanged("selected")) {
 			return;
@@ -279,6 +297,7 @@ azkaban.JobListView = Backbone.View.extend({
 			this.propagateExpansion(current.listElement);
 		}
 	},
+	
 	propagateExpansion: function(li) {
 		var li = $(li).parent().closest("li.listElement")[0];
 		if (li) {
@@ -286,10 +305,24 @@ azkaban.JobListView = Backbone.View.extend({
 			this.handleMenuExpand(li);
 		}
 	},
+	
 	handleResetPanZoom: function(evt) {
 		this.model.trigger("resetPanZoom");
 	},
+	
 	handleAutoPanZoom: function(evt) {
-		this.model.set({"autoPanZoom": $(evt.currentTarget).is(':checked')});
+		var target = evt.currentTarget;
+		if ($(target).hasClass('btn-default')) {
+			$(target).removeClass('btn-default');
+			$(target).addClass('btn-info');
+		}
+		else if ($(target).hasClass('btn-info')) {
+			$(target).removeClass('btn-info');
+			$(target).addClass('btn-default');
+		}
+	 
+		// Using $().hasClass('active') does not use here because it appears that
+		// this is called before the Bootstrap toggle completes.
+		this.model.set({"autoPanZoom": $(target).hasClass('btn-info')});
 	}
 });
diff --git a/src/web/js/azkaban/view/main.js b/src/web/js/azkaban/view/main.js
index b6aac48..bf5e9a9 100644
--- a/src/web/js/azkaban/view/main.js
+++ b/src/web/js/azkaban/view/main.js
@@ -96,18 +96,12 @@ azkaban.ProjectTableView = Backbone.View.extend({
 		var requestURL = contextURL + "/manager?project=" + data.project + "&flow=";
 		for (var i = 0; i < flows.length; ++i) {
 			var id = flows[i].flowId;
-			var tr = document.createElement("tr");
-			var idtd = document.createElement("td");
-			$(idtd).addClass("tb-name");
-			
 			var ida = document.createElement("a");
 			ida.project = data.project;
 			$(ida).text(id);
 			$(ida).attr("href", requestURL + id);
-			
-			$(idtd).append(ida);
-			$(tr).append(idtd);
-			$(innerTable).append(tr);
+      $(ida).addClass('list-group-item');
+			$(innerTable).append(ida);
 		}
 	}
 });

unit/build.xml 69(+35 -34)

diff --git a/unit/build.xml b/unit/build.xml
index c9f3f20..f0fa718 100644
--- a/unit/build.xml
+++ b/unit/build.xml
@@ -7,9 +7,7 @@
 	<property name="dist.packages.dir" value="${base.dir}/dist/unit/packages" />
 	
 	<property name="java.src.dir" value="${base.dir}/unit/java" />
-	<property name="job.conf.dir" value="${base.dir}/unit/executions/exectest1" />
-	<property name="job.conf.dir2" value="${base.dir}/unit/executions/exectest2" />
-	<property name="animal.conf.dir" value="${base.dir}/unit/executions/animal" />
+	<property name="job.conf.dir" value="${base.dir}/unit/executions" />
 		
 	<property environment="env" />
 
@@ -24,7 +22,7 @@
 	<!-- set the build number based on environment variable, otherwise blank -->
 	<property environment="env" description="System environment variables (including those set by Hudson)" />
 
-	<target name="all" depends="clean, jars" description="Builds all jars" />
+	<target name="all" depends="clean, package" description="Builds and packages" />
 
 	<target name="clean" description="Delete generated files.">
 		<echo message="Deleting generated files in dist" />
@@ -54,59 +52,62 @@
 		</jar>
 	</target>
 	
-	<target name="package-testjob" depends="jars" description="Creates a test zip">
-		<delete dir="${dist.packages.dir}" />
-		<mkdir dir="${dist.packages.dir}" />
-		
+	<target name="package-exectest1" depends="jars" description="Creates a test zip">
 		<!-- Tarball it -->
-		<zip destfile="${dist.packages.dir}/testjob.zip">
+		<zip destfile="${dist.packages.dir}/exectest1.zip">
 			<zipfileset dir="${dist.jar.dir}" />
-			<zipfileset dir="${job.conf.dir}" />
+      <zipfileset dir="${job.conf.dir}/exectest1" />
 		</zip>
 	</target>
 
 	<target name="package-exectest2" depends="jars" description="Creates a test zip">
-		<delete dir="${dist.packages.dir}" />
-		<mkdir dir="${dist.packages.dir}" />
-		
 		<!-- Tarball it -->
 		<zip destfile="${dist.packages.dir}/exectest2.zip">
 			<zipfileset dir="${dist.jar.dir}" />
-			<zipfileset dir="${job.conf.dir2}" />
+      <zipfileset dir="${job.conf.dir}/exectest2" />
 		</zip>
 	</target>
 	
 	<target name="package-animal" depends="jars" description="Creates a test zip">
-		<delete dir="${dist.packages.dir}" />
-		<mkdir dir="${dist.packages.dir}" />
-		
 		<!-- Tarball it -->
-		<zip destfile="${dist.packages.dir}/animals.zip">
+		<zip destfile="${dist.packages.dir}/animal.zip">
 			<zipfileset dir="${dist.jar.dir}" />
-			<zipfileset dir="${animal.conf.dir}" />
+      <zipfileset dir="${job.conf.dir}/animal" />
 		</zip>
 	</target>
 	
 	<target name="package-embedded" depends="jars" description="Creates a test zip">
-		<delete dir="${dist.packages.dir}" />
-		<mkdir dir="${dist.packages.dir}" />
-		
 		<!-- Tarball it -->
 		<zip destfile="${dist.packages.dir}/embedded.zip">
 			<zipfileset dir="${dist.jar.dir}" />
-			<zipfileset dir="${base.dir}/unit/executions/embedded" />
+      <zipfileset dir="${job.conf.dir}/embedded" />
 		</zip>
 	</target>
 
-	<target name="package-embedded3" depends="jars" description="Creates a test zip">
-		<delete dir="${dist.packages.dir}" />
-		<mkdir dir="${dist.packages.dir}" />
-
-                <!-- Tarball it -->
-                <zip destfile="${dist.packages.dir}/embedded.zip">
-                	<zipfileset dir="${dist.jar.dir}" />
-                	<zipfileset dir="${base.dir}/unit/executions/embedded3" />
-                </zip>
-
-	</target>	
+	<target name="package-embedded2" depends="jars" description="Creates a test zip">
+		<!-- Tarball it -->
+		<zip destfile="${dist.packages.dir}/embedded2.zip">
+			<zipfileset dir="${dist.jar.dir}" />
+      <zipfileset dir="${job.conf.dir}/embedded2" />
+		</zip>
+  </target>	
+  
+  <target name="package-embedded3" depends="jars" description="Creates a test zip">
+		<!-- Tarball it -->
+		<zip destfile="${dist.packages.dir}/embedded3.zip">
+			<zipfileset dir="${dist.jar.dir}" />
+      <zipfileset dir="${job.conf.dir}/embedded3" />
+		</zip>
+  </target>	
+  
+  <target name="package-embeddedBad" depends="jars" description="Creates a test zip">
+		<!-- Tarball it -->
+		<zip destfile="${dist.packages.dir}/embeddedBad.zip">
+			<zipfileset dir="${dist.jar.dir}" />
+      <zipfileset dir="${job.conf.dir}/embeddedBad" />
+		</zip>
+  </target>	
+  
+  <target name="package" depends="package-exectest1, package-exectest2, package-animal, package-embedded, package-embedded2, package-embedded3, package-embeddedBad" description="Creates all packages">
+  </target>
 </project>