azkaban-developers

improvement: added property display page bug fix: the jobpage

9/30/2012 4:56:28 PM

Details

diff --git a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
index 3f9caf5..d2b0df5 100644
--- a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -34,6 +34,7 @@ import azkaban.executor.ExecutableFlow;
 import azkaban.executor.ExecutorManager;
 import azkaban.flow.Edge;
 import azkaban.flow.Flow;
+import azkaban.flow.FlowProps;
 import azkaban.flow.Node;
 import azkaban.project.Project;
 import azkaban.project.ProjectManager;
@@ -94,6 +95,9 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 			else if (hasParam(req, "staging")) {
 				handleFlowStagingPage(req, resp, session);
 			}
+			else if (hasParam(req, "prop")) {
+				handlePropertyPage(req, resp, session);
+			}
 			else if (hasParam(req, "job")) {
 				handleJobPage(req, resp, session);
 			}
@@ -645,10 +649,10 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 						String nodeSource = node.getPropsSource();
 						if(nodeSource != null) {
 							source.add(nodeSource);
-							Props parent = flow.getFlowProps(nodeSource).getProps();
-							while(parent.getParent() != null) {
-								source.add(parent.getParent().getSource());
-								parent = parent.getParent(); 
+							FlowProps parent = flow.getFlowProps(nodeSource);
+							while(parent.getInheritedSource() != null) {
+								source.add(parent.getInheritedSource());
+								parent = flow.getFlowProps(parent.getInheritedSource()); 
 							}
 						}
 						if(!source.isEmpty()) {
@@ -677,6 +681,91 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 		page.render();
 	}
 	
+	private void handlePropertyPage(HttpServletRequest req, HttpServletResponse resp, Session session) throws ServletException {
+		Page page = newPage(req, resp, session, "azkaban/webapp/servlet/velocity/propertypage.vm");
+		String projectName = getParam(req, "project");
+		String flowName = getParam(req, "flow");
+		String jobName = getParam(req, "job");
+		String propSource = getParam(req, "prop");
+		
+		User user = session.getUser();
+		Project project = null;
+		Flow flow = null;
+		try {
+			project = projectManager.getProject(projectName);
+			
+			if (project == null) {
+				page.add("errorMsg", "Project " + projectName + " not found.");
+			}
+			else {
+				if (!project.hasPermission(user, Type.READ)) {
+					throw new AccessControlException( "No permission to view project " + projectName + ".");
+				}
+				
+				page.add("project", project);
+				
+				flow = project.getFlow(flowName);
+				if (flow == null) {
+					page.add("errorMsg", "Flow " + flowName + " not found.");
+				}
+				else {
+					page.add("flowid", flow.getId());
+					
+					Node node = flow.getNode(jobName);
+					
+					if (node == null) {
+						page.add("errorMsg", "Job " + jobName + " not found.");
+					}
+					else {
+						Props prop = projectManager.getProperties(project, propSource);
+						
+						page.add("property", propSource);
+						
+						page.add("jobid", node.getId());
+						
+						// Resolve property dependencies
+						ArrayList<String> inheritProps = new ArrayList<String>(); 
+						FlowProps parent = flow.getFlowProps(propSource);
+						while(parent.getInheritedSource() != null) {
+							inheritProps.add(parent.getInheritedSource());
+							parent = flow.getFlowProps(parent.getInheritedSource()); 
+						}
+						if(!inheritProps.isEmpty()) {
+							page.add("inheritedproperties", inheritProps);
+						}
+						
+						ArrayList<String> dependingProps = new ArrayList<String>(); 
+						FlowProps child = flow.getFlowProps(flow.getNode(jobName).getPropsSource());
+						while(!child.getSource().equals(propSource)) {
+							dependingProps.add(child.getSource());
+							child = flow.getFlowProps(child.getInheritedSource()); 
+						}
+						if(!dependingProps.isEmpty()) {
+							page.add("dependingproperties", dependingProps);
+						}
+						
+
+						ArrayList<Pair<String,String>> parameters = new ArrayList<Pair<String, String>>();
+						// Parameter
+						for (String key : prop.getKeySet()) {
+							String value = prop.get(key);
+							parameters.add(new Pair<String,String>(key, value));
+						}
+						
+						page.add("parameters", parameters);
+					}
+				}
+			}
+		}
+		catch (AccessControlException e) {
+			page.add("errorMsg", e.getMessage());
+		} catch (ProjectManagerException e) {
+			page.add("errorMsg", e.getMessage());
+		}
+		
+		page.render();
+	}
+	
 	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");
diff --git a/src/java/azkaban/webapp/servlet/velocity/propertypage.vm b/src/java/azkaban/webapp/servlet/velocity/propertypage.vm
new file mode 100644
index 0000000..70f1f75
--- /dev/null
+++ b/src/java/azkaban/webapp/servlet/velocity/propertypage.vm
@@ -0,0 +1,92 @@
+<!DOCTYPE html> 
+<html>
+	<head>
+#parse( "azkaban/webapp/servlet/velocity/style.vm" )
+		<script type="text/javascript" src="${context}/js/jquery/jquery.js"></script>    
+		<script type="text/javascript" src="${context}/js/jqueryui/jquery-ui.custom.min.js"></script>   
+		<script type="text/javascript" src="${context}/js/namespace.js"></script>
+		<script type="text/javascript" src="${context}/js/underscore-1.2.1-min.js"></script>
+		<script type="text/javascript" src="${context}/js/backbone-0.5.3-min.js"></script>
+		<script type="text/javascript" src="${context}/js/jquery.simplemodal.js"></script>
+		<script type="text/javascript" src="${context}/js/azkaban.nav.js"></script>
+		<script type="text/javascript">
+			var contextURL = "${context}";
+			var currentTime = ${currentTime};
+			var timezone = "${timezone}";
+			var errorMessage = "${error_message}";
+			var successMessage = "${success_message}";
+			
+			var projectId = "$project.name";
+		</script>
+	</head>
+	<body>
+#set($current_page="all")
+#parse( "azkaban/webapp/servlet/velocity/nav.vm" )
+		<div class="messaging"><p id="messageClose">X</p><p id="message"></p></div>  
+
+#if($errorMsg)
+			<div class="box-error-message">$errorMsg</div>
+#else
+	<div class="content">
+	#if($error_message != "null")
+			<div class="box-error-message">$error_message</div>
+	#elseif($success_message != "null")
+			<div class="box-success-message">$success_message</div>
+	#end
+			<div id="all-jobs-content">
+				<div class="section-hd">
+					<h2><a href="${context}/manager?project=${project.name}&flow=${flowid}&job=${jobid}&prop=${property}">Property <span>$property</span></a></h2>
+					<div class="section-sub-hd">
+						<h4><a href="${context}/manager?project=${project.name}">Project <span>$project.name</span></a></h4>
+						<h4 class="separator">&gt;</h4>
+						<h4><a href="${context}/manager?project=${project.name}&flow=${flowid}">Flow <span>$flowid</span></a></h4>
+						<h4 class="separator">&gt;</h4>
+						<h4><a href="${context}/manager?project=${project.name}&flow=${flowid}&job=${jobid}">Job <span>$jobid</span></a></h4>
+					</div>
+				</div>
+			</div>
+			
+			<div id="property-summary">
+				<table class="summary-table">
+					<tr><td class="first">Inherited From:</td><td>
+#if ($inheritedproperties) 
+#foreach($inheritedproperty in $inheritedproperties)
+					<a href="${context}/manager?project=${project.name}&flow=${flowid}&job=${jobid}&prop=$inheritedproperty">$inheritedproperty</a>
+#end
+#else
+	<span>No Inherited Properties</span>
+#end
+					</td></tr>
+					<tr><td class="first">Source Of:</td><td>
+#if ($dependingproperties) 
+#foreach($dependingproperty in $dependingproperties)
+						<span class="nowrap"><a href="${context}/manager?project=${project.name}&flow=${flowid}&job=${jobid}&prop=$dependingproperty">$dependingproperty</a></span>
+#end
+#else
+						<span>No Dependencies</span>
+#end
+					</td></tr>
+
+				</table>
+			</div>
+			
+			<table id="all-jobs" class="all-jobs job-table parameters">
+				<thead>
+					<tr>
+						<th class="tb-pname">Parameter Name</th>
+						<th class="tb-pvalue">Value</th>
+					</tr>
+				</thead>
+				<tbody>
+#foreach($parameter in $parameters)
+					<tr>
+						<td class="first">$parameter.first</td><td>$parameter.second</td>
+					</tr>
+#end
+				</tbody>
+			</table>
+	</div>
+
+#end
+	</body>
+</html>
\ No newline at end of file