Author: acmurthy Date: Sun Mar 4 17:16:19 2012 New Revision: 1296836 URL: http://svn.apache.org/viewvc?rev=1296836&view=rev Log: Merge -c 1296835 from trunk to branch-0.23 to fix MAPREDUCE-3929. Fixed output of 'bin/mapred queue -showacl' command to clarify ACLs for users.
Modified: hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/CHANGES.txt hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestParentQueue.java Modified: hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/CHANGES.txt?rev=1296836&r1=1296835&r2=1296836&view=diff ============================================================================== --- hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/CHANGES.txt (original) +++ hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/CHANGES.txt Sun Mar 4 17:16:19 2012 @@ -167,6 +167,9 @@ Release 0.23.2 - UNRELEASED MAPREDUCE-3792. Fix "bin/mapred job -list" to display all jobs instead of only the jobs owned by the user. (Jason Lowe via vinodkv) + MAPREDUCE-3929. Fixed output of 'bin/mapred queue -showacl' command to + clarify ACLs for users. (John George via acmurthy) + Release 0.23.1 - 2012-02-17 NEW FEATURES Modified: hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java?rev=1296836&r1=1296835&r2=1296836&view=diff ============================================================================== --- hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java (original) +++ hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java Sun Mar 4 17:16:19 2012 @@ -317,15 +317,12 @@ public class ParentQueue implements CSQu QueueUserACLInfo userAclInfo = recordFactory.newRecordInstance(QueueUserACLInfo.class); List<QueueACL> operations = new ArrayList<QueueACL>(); - for (Map.Entry<QueueACL, AccessControlList> e : acls.entrySet()) { - QueueACL operation = e.getKey(); - AccessControlList acl = e.getValue(); - - if (acl.isUserAllowed(user)) { + for (QueueACL operation : QueueACL.values()) { + if (hasAccess(operation, user)) { operations.add(operation); - } + } } - + userAclInfo.setQueueName(getQueueName()); userAclInfo.setUserAcls(operations); return userAclInfo; @@ -343,6 +340,7 @@ public class ParentQueue implements CSQu for (CSQueue child : childQueues) { userAcls.addAll(child.getQueueUserAclInfo(user)); } + return userAcls; } Modified: hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestParentQueue.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestParentQueue.java?rev=1296836&r1=1296835&r2=1296836&view=diff ============================================================================== --- hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestParentQueue.java (original) +++ hadoop/common/branches/branch-0.23/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestParentQueue.java Sun Mar 4 17:16:19 2012 @@ -24,6 +24,8 @@ import static org.mockito.Mockito.*; import java.util.HashMap; import java.util.Map; +import java.util.List; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.yarn.api.records.Resource; @@ -32,6 +34,9 @@ import org.apache.hadoop.yarn.server.res import org.apache.hadoop.yarn.server.resourcemanager.scheduler.NodeType; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApp; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode; +import org.apache.hadoop.security.UserGroupInformation; +import org.apache.hadoop.yarn.api.records.QueueACL; +import org.apache.hadoop.yarn.api.records.QueueUserACLInfo; import org.junit.After; import org.junit.Before; @@ -255,6 +260,11 @@ public class TestParentQueue { } private static final String C = "c"; + private static final String C1 = "c1"; + private static final String C11 = "c11"; + private static final String C111 = "c111"; + private static final String C1111 = "c1111"; + private static final String D = "d"; private static final String A1 = "a1"; private static final String A2 = "a2"; @@ -265,7 +275,7 @@ public class TestParentQueue { private void setupMultiLevelQueues(CapacitySchedulerConfiguration conf) { // Define top-level queues - conf.setQueues(CapacitySchedulerConfiguration.ROOT, new String[] {A, B, C, D}); + csConf.setQueues(CapacitySchedulerConfiguration.ROOT, new String[] {A, B, C, D}); conf.setCapacity(CapacitySchedulerConfiguration.ROOT, 100); final String Q_A = CapacitySchedulerConfiguration.ROOT + "." + A; @@ -289,9 +299,24 @@ public class TestParentQueue { conf.setCapacity(Q_B + "." + B1, 10); conf.setCapacity(Q_B + "." + B2, 20); conf.setCapacity(Q_B + "." + B3, 70); - } + conf.setQueues(Q_C, new String[] {C1}); + final String Q_C1= Q_C + "." + C1; + conf.setCapacity(Q_C1, 100); + conf.setQueues(Q_C1, new String[] {C11}); + + final String Q_C11= Q_C1 + "." + C11; + conf.setCapacity(Q_C11, 100); + conf.setQueues(Q_C11, new String[] {C111}); + + final String Q_C111= Q_C11 + "." + C111; + conf.setCapacity(Q_C111, 100); + //Leaf Queue + conf.setQueues(Q_C111, new String[] {C1111}); + final String Q_C1111= Q_C111 + "." + C1111; + conf.setCapacity(Q_C1111, 100); + } @Test public void testMultiLevelQueues() throws Exception { @@ -470,6 +495,79 @@ public class TestParentQueue { } + + public boolean hasQueueACL(List<QueueUserACLInfo> aclInfos, QueueACL acl, String qName) { + for (QueueUserACLInfo aclInfo : aclInfos) { + if (aclInfo.getQueueName().equals(qName)) { + if (aclInfo.getUserAcls().contains(acl)) { + return true; + } + } + } + return false; + } + + @Test + public void testQueueAcl() throws Exception { + + setupMultiLevelQueues(csConf); + csConf.setAcl(CapacitySchedulerConfiguration.ROOT, QueueACL.SUBMIT_APPLICATIONS, " "); + csConf.setAcl(CapacitySchedulerConfiguration.ROOT, QueueACL.ADMINISTER_QUEUE, " "); + + final String Q_C = CapacitySchedulerConfiguration.ROOT + "." + C; + csConf.setAcl(Q_C, QueueACL.ADMINISTER_QUEUE, "*"); + final String Q_C11= Q_C + "." + C1 + "." + C11; + csConf.setAcl(Q_C11, QueueACL.SUBMIT_APPLICATIONS, "*"); + + Map<String, CSQueue> queues = new HashMap<String, CSQueue>(); + CSQueue root = + CapacityScheduler.parseQueue(csContext, csConf, null, + CapacitySchedulerConfiguration.ROOT, queues, queues, + CapacityScheduler.queueComparator, + CapacityScheduler.applicationComparator, + TestUtils.spyHook); + + UserGroupInformation user = UserGroupInformation.getCurrentUser(); + // Setup queue configs + ParentQueue c = (ParentQueue)queues.get(C); + ParentQueue c1 = (ParentQueue)queues.get(C1); + ParentQueue c11 = (ParentQueue)queues.get(C11); + ParentQueue c111 = (ParentQueue)queues.get(C111); + + assertFalse(root.hasAccess(QueueACL.ADMINISTER_QUEUE, user)); + List<QueueUserACLInfo> aclInfos = root.getQueueUserAclInfo(user); + assertFalse(hasQueueACL(aclInfos, QueueACL.ADMINISTER_QUEUE, "root")); + + assertFalse(root.hasAccess(QueueACL.SUBMIT_APPLICATIONS, user)); + assertFalse(hasQueueACL(aclInfos, QueueACL.SUBMIT_APPLICATIONS, "root")); + + // c has no SA, but QA + assertTrue(c.hasAccess(QueueACL.ADMINISTER_QUEUE, user)); + assertTrue(hasQueueACL(aclInfos, QueueACL.ADMINISTER_QUEUE, "c")); + assertFalse(c.hasAccess(QueueACL.SUBMIT_APPLICATIONS, user)); + assertFalse(hasQueueACL(aclInfos, QueueACL.SUBMIT_APPLICATIONS, "c")); + + //Queue c1 has QA, no SA (gotten perm from parent) + assertTrue(c1.hasAccess(QueueACL.ADMINISTER_QUEUE, user)); + assertTrue(hasQueueACL(aclInfos, QueueACL.ADMINISTER_QUEUE, "c1")); + assertFalse(c1.hasAccess(QueueACL.SUBMIT_APPLICATIONS, user)); + assertFalse(hasQueueACL(aclInfos, QueueACL.SUBMIT_APPLICATIONS, "c1")); + + //Queue c11 has permissions from parent queue and SA + assertTrue(c11.hasAccess(QueueACL.ADMINISTER_QUEUE, user)); + assertTrue(hasQueueACL(aclInfos, QueueACL.ADMINISTER_QUEUE, "c11")); + assertTrue(c11.hasAccess(QueueACL.SUBMIT_APPLICATIONS, user)); + assertTrue(hasQueueACL(aclInfos, QueueACL.SUBMIT_APPLICATIONS, "c11")); + + //Queue c111 has SA and AQ, both from parent + assertTrue(c111.hasAccess(QueueACL.ADMINISTER_QUEUE, user)); + assertTrue(hasQueueACL(aclInfos, QueueACL.ADMINISTER_QUEUE, "c111")); + assertTrue(c111.hasAccess(QueueACL.SUBMIT_APPLICATIONS, user)); + assertTrue(hasQueueACL(aclInfos, QueueACL.SUBMIT_APPLICATIONS, "c111")); + + reset(c); + } + @After public void tearDown() throws Exception { }