azkaban-aplcache
Details
src/java/azkaban/project/Project.java 11(+11 -0)
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>
src/web/css/azkaban.css 17(+17 -0)
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 {