azkaban-aplcache

Permissions viewer.

7/19/2012 10:50:49 PM

Details

diff --git a/src/java/azkaban/project/Project.java b/src/java/azkaban/project/Project.java
index e17720a..9daa603 100644
--- a/src/java/azkaban/project/Project.java
+++ b/src/java/azkaban/project/Project.java
@@ -9,6 +9,7 @@ import azkaban.flow.Flow;
 import azkaban.user.Permission;
 import azkaban.user.Permission.Type;
 import azkaban.user.User;
+import azkaban.utils.Pair;
 
 public class Project {
 	private final String name;
@@ -75,6 +76,16 @@ public class Project {
 		return users;
 	}
 
+	public List<Pair<String, Permission>> getUserPermissions() {
+		ArrayList<Pair<String, Permission>> permissions = new ArrayList<Pair<String, Permission>>();
+		
+		for (Map.Entry<String, Permission> entry : userToPermission.entrySet()) {
+			permissions.add(new Pair<String, Permission>(entry.getKey(), entry.getValue()));
+		}
+		
+		return permissions;
+	}
+	
 	public void setDescription(String description) {
 		this.description = description;
 	}
diff --git a/src/java/azkaban/webapp/servlet/LoginAbstractAzkabanServlet.java b/src/java/azkaban/webapp/servlet/LoginAbstractAzkabanServlet.java
index d386301..5458d33 100644
--- a/src/java/azkaban/webapp/servlet/LoginAbstractAzkabanServlet.java
+++ b/src/java/azkaban/webapp/servlet/LoginAbstractAzkabanServlet.java
@@ -48,9 +48,6 @@ public abstract class LoginAbstractAzkabanServlet extends
 			if (action.equals("login")) {
 				handleLoginAction(req, resp);
 			}
-			String requestURI = req.getRequestURI();
-			String query = req.getQueryString();
-			String context = req.getContextPath();
 			
 			String referer = req.getHeader("Referer");
 			resp.sendRedirect(referer);			
diff --git a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
index 3287115..8523b16 100644
--- a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -74,6 +74,9 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 			if (hasParam(req, "json")) {
 				handleJSONAction(req, resp, session);
 			}
+			else if (hasParam(req, "permissions")) {
+				handlePermissionPage(req, resp, session);
+			}
 			else if (hasParam(req, "job")) {
 				handleJobPage(req, resp, session);
 			}
@@ -110,7 +113,7 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 			}
 		}
 	}
-
+	
 	private void handleJSONAction(HttpServletRequest req, HttpServletResponse resp, Session session) throws ServletException, IOException {
 		String projectName = getParam(req, "project");
 		User user = session.getUser();
@@ -270,6 +273,32 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 		ret.put("nodes", nodeList);
 	}
 	
+	private void handlePermissionPage(HttpServletRequest req, HttpServletResponse resp, Session session) throws ServletException {
+		Page page = newPage(req, resp, session, "azkaban/webapp/servlet/velocity/permissionspage.vm");
+		String projectName = getParam(req, "project");
+		User user = session.getUser();
+		
+		Project project = null;
+		try {
+			project = manager.getProject(projectName, user);
+			if (project == null) {
+				page.add("errorMsg", "Project " + projectName + " not found.");
+			}
+			else {
+				page.add("project", project);
+				
+				page.add("admins", Utils.flattenToString(project.getUsersWithPermission(Type.ADMIN), ","));
+				page.add("userpermission", project.getUserPermission(user));
+				page.add("permissions", project.getUserPermissions());
+			}
+		}
+		catch(AccessControlException e) {
+			page.add("errorMsg", e.getMessage());
+		}
+		
+		page.render();
+	}
+	
 	private void handleJobPage(HttpServletRequest req, HttpServletResponse resp, Session session) throws ServletException {
 		Page page = newPage(req, resp, session, "azkaban/webapp/servlet/velocity/jobpage.vm");
 		String projectName = getParam(req, "project");
@@ -399,7 +428,7 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
 				}
 				page.add("project", project);
 				page.add("admins", Utils.flattenToString(project.getUsersWithPermission(Type.ADMIN), ","));
-				page.add("permissions", project.getUserPermission(user));
+				page.add("userpermission", project.getUserPermission(user));
 	
 				List<Flow> flows = project.getFlows();
 				if (!flows.isEmpty()) {
diff --git a/src/java/azkaban/webapp/servlet/velocity/permissionspage.vm b/src/java/azkaban/webapp/servlet/velocity/permissionspage.vm
new file mode 100644
index 0000000..c84ca08
--- /dev/null
+++ b/src/java/azkaban/webapp/servlet/velocity/permissionspage.vm
@@ -0,0 +1,107 @@
+<!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>  
+
+			<div class="content">
+#if($errorMsg)
+				<div class="box-error-message">$errorMsg</div>
+#else
+#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}&permissions">Permissions</a></h2>
+						<div class="section-sub-hd">
+							<h4><a href="${context}/manager?project=${project.name}">Project <span>$project.name</span></a></h4>
+						</div>
+					</div>
+				</div>
+
+				<div id="project-users">
+					<table class="user-table">
+						<tr><td class="first">Project Admins:</td><td>$admins</td></tr>
+						<tr><td class="first">Your Permissions:</td><td>$userpermission.toString()</td></tr>
+					</table>
+				</div>
+
+				<div id="project-summary">
+					<table class="summary-table">
+						<tr><td class="first">Name:</td><td>$project.name</td></tr>
+						<tr><td class="first">Created Date:</td><td>$utils.formatDate($project.lastModifiedTimestamp)</td></tr>
+						<tr><td class="first">Modified Date:</td><td>$utils.formatDate($project.createTimestamp)</td></tr>
+						<tr><td class="first">Last Modified by:</td><td>$project.lastModifiedUser</td></tr>
+						<tr><td class="first">Description:</td><td id="pdescription">$project.description</td>
+							#if($admin)
+								<td><div id="edit" class="btn5">Edit</div></td>
+							#end
+						</tr>
+					</table>
+				</div>
+
+		<table id="all-jobs" class="all-jobs permission-table">
+			<thead>
+				<tr>
+					<th class="tb-username">User</th>
+					<th class="tb-perm">Admin</th>
+					<th class="tb-read">Read</th>
+					<th class="tb-write">Write</th>
+					<th class="tb-execute">Execute</th>
+					<th class="tb-schedule">Schedule</th>
+				</tr>
+			</thead>
+			<tbody>
+#if($permissions)
+#foreach($perm in $permissions)
+	<tr>
+		<td class="tb-name">$perm.first</td>
+		#if ($perm.second.isPermissionNameSet('ADMIN'))
+			<td><input type="checkbox" name="admin" disabled="disabled" checked></input></td>
+			<td><input type="checkbox" name="read" disabled="disabled" checked></input></td>
+			<td><input type="checkbox" name="write" disabled="disabled" checked></input></td>
+			<td><input type="checkbox" name="execute" disabled="disabled" checked></input></td>
+			<td><input type="checkbox" name="scheduled" disabled="disabled" checked></input></td>
+		#else
+			<td><input type="checkbox" name="admin" disabled="disabled"> </input></td>
+			<td><input type="checkbox" name="read" disabled="disabled" #if ($perm.second.isPermissionNameSet('READ')) checked#end > </input></td>
+			<td><input type="checkbox" name="write" disabled="disabled" #if ($perm.second.isPermissionNameSet('WRITE')) checked#end > </input></td>
+			<td><input type="checkbox" name="execute" disabled="disabled" #if ($perm.second.isPermissionNameSet('EXECUTE')) checked#end > </input></td>
+			<td><input type="checkbox" name="scheduled" disabled="disabled" #if ($perm.second.isPermissionNameSet('SCHEDULE')) checked#end > </input></td>
+		#end
+	</tr>
+#end
+#else
+						<tr><td class="last">No Users Found.</td></tr>
+#end
+			</tbody>
+		</table>
+#end
+		</div>
+	
+	</body>
+</html>
\ No newline at end of file
diff --git a/src/java/azkaban/webapp/servlet/velocity/projectpage.vm b/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
index 67780ff..4c76af7 100644
--- a/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/projectpage.vm
@@ -40,14 +40,14 @@
 						<h2><a href="${context}/manager?project=${project.name}">Project <span>$project.name</span></a></h2>
 						
 						<a id="project-upload-btn" class="btn1 projectupload" href="#">Upload</a>
-						<a id="project-permission-btn" class="btn5 projectpermission" href="#">Permissions</a>
+						<a id="project-permission-btn" class="btn5 projectpermission" href="${context}/manager?project=${project.name}&permissions">Permissions</a>
 					</div><!-- end .section-hd -->
 				</div>
 
 				<div id="project-users">
 					<table class="user-table">
 						<tr><td class="first">Project Admins:</td><td>$admins</td></tr>
-						<tr><td class="first">User ${user_id} Permissions:</td><td>$permissions.toString()</td></tr>
+						<tr><td class="first">Your Permissions:</td><td>$userpermission.toString()</td></tr>
 					</table>
 				</div>
 
diff --git a/src/web/css/azkaban.css b/src/web/css/azkaban.css
index 5f83039..8a24b89 100644
--- a/src/web/css/azkaban.css
+++ b/src/web/css/azkaban.css
@@ -1128,6 +1128,23 @@ table.parameters tr td {
 	text-align: center;
 }
 
+.permission-table thead tr th.tb-username {
+	padding-left: 15px;
+	text-align:left;
+}
+
+.permission-table thead tr th {
+	text-align:center;
+}
+
+.permission-table tbody tr td.tb-name {
+	text-align:left;
+}
+
+.permission-table tbody tr td {
+	text-align:center;
+}
+
 /* old styles */
 
 .azkaban-charts .hitarea {