diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppsModification.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppsModification.java index 12c5686..a0f5b28 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppsModification.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppsModification.java @@ -22,7 +22,10 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; +import java.io.File; +import java.io.FileWriter; import java.io.IOException; +import java.io.PrintWriter; import java.io.StringReader; import java.io.StringWriter; import java.net.URI; @@ -65,6 +68,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSchedulerConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.security.QueueACLsManager; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppState; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ApplicationSubmissionContextInfo; @@ -115,6 +120,11 @@ private boolean setAuthFilter = false; + private static final String TEST_DIR = new File(System.getProperty( + "test.build.data", "/tmp")).getAbsolutePath(); + private static final String ALLOC_FILE = new File(TEST_DIR, + "test-queues.xml").getAbsolutePath(); + public class GuiceServletConfig extends GuiceServletContextListener { @Override @@ -151,11 +161,14 @@ protected Properties getConfiguration(String configPrefix, } - private class TestServletModule extends ServletModule { + private abstract class TestServletModule extends ServletModule { public Configuration conf = new Configuration(); + public abstract void configureScheduler(); + @Override protected void configureServlets() { + configureScheduler(); bind(JAXBContextResolver.class); bind(RMWebServices.class); bind(GenericExceptionHandler.class); @@ -174,8 +187,63 @@ protected void configureServlets() { } } - private Injector getNoAuthInjector() { - return Guice.createInjector(new TestServletModule() { + private class CapTestServletModule extends TestServletModule { + @Override + public void configureScheduler() { + conf.set("yarn.resourcemanager.scheduler.class", + CapacityScheduler.class.getName()); + } + } + + private class FairTestServletModule extends TestServletModule { + @Override + public void configureScheduler() { + try { + PrintWriter out = new PrintWriter(new FileWriter(ALLOC_FILE)); + out.println(""); + out.println(""); + out.println(""); + out.println(" someuser "); + out.println(" "); + out.println(" someuser "); + out.println(" "); + out.println(""); + out.println(""); + out.close(); + } catch(IOException e) { + } + conf.set(FairSchedulerConfiguration.ALLOCATION_FILE, ALLOC_FILE); + conf.set("yarn.resourcemanager.scheduler.class", + FairScheduler.class.getName()); + } + } + + private Injector getNoAuthInjectorCap() { + return Guice.createInjector(new CapTestServletModule() { + @Override + protected void configureServlets() { + setAuthFilter = false; + super.configureServlets(); + } + }); + } + + private Injector getSimpleAuthInjectorCap() { + return Guice.createInjector(new CapTestServletModule() { + @Override + protected void configureServlets() { + setAuthFilter = true; + conf.setBoolean(YarnConfiguration.YARN_ACL_ENABLE, true); + // set the admin acls otherwise all users are considered admins + // and we can't test authorization + conf.setStrings(YarnConfiguration.YARN_ADMIN_ACL, "testuser1"); + super.configureServlets(); + } + }); + } + + private Injector getNoAuthInjectorFair() { + return Guice.createInjector(new FairTestServletModule() { @Override protected void configureServlets() { setAuthFilter = false; @@ -184,8 +252,8 @@ protected void configureServlets() { }); } - private Injector getSimpleAuthInjector() { - return Guice.createInjector(new TestServletModule() { + private Injector getSimpleAuthInjectorFair() { + return Guice.createInjector(new FairTestServletModule() { @Override protected void configureServlets() { setAuthFilter = true; @@ -200,7 +268,7 @@ protected void configureServlets() { @Parameters public static Collection guiceConfigs() { - return Arrays.asList(new Object[][] { { 0 }, { 1 } }); + return Arrays.asList(new Object[][] { { 0 }, { 1 }, { 2 }, { 3 } }); } @Before @@ -218,10 +286,20 @@ public TestRMWebServicesAppsModification(int run) { switch (run) { case 0: default: - injector = getNoAuthInjector(); + // No Auth Capacity Scheduler + injector = getNoAuthInjectorCap(); break; case 1: - injector = getSimpleAuthInjector(); + // Simple Auth Capacity Scheduler + injector = getSimpleAuthInjectorCap(); + break; + case 2: + // No Auth Fair Scheduler + injector = getNoAuthInjectorFair(); + break; + case 3: + // Simple Auth Fair Scheduler + injector = getSimpleAuthInjectorFair(); break; } } @@ -453,15 +531,20 @@ public void testSingleAppKillUnauthorized() throws Exception { boolean isCapacityScheduler = rm.getResourceScheduler() instanceof CapacityScheduler; - assumeTrue("Currently this test is only supported on CapacityScheduler", - isCapacityScheduler); - - // default root queue allows anyone to have admin acl - CapacitySchedulerConfiguration csconf = - new CapacitySchedulerConfiguration(); - csconf.setAcl("root", QueueACL.ADMINISTER_QUEUE, "someuser"); - csconf.setAcl("root.default", QueueACL.ADMINISTER_QUEUE, "someuser"); - rm.getResourceScheduler().reinitialize(csconf, rm.getRMContext()); + boolean isFairScheduler = + rm.getResourceScheduler() instanceof FairScheduler; + assumeTrue("This test is only supported on Capacity and Fair Scheduler", + isCapacityScheduler || isFairScheduler); + // FairScheduler use ALLOCATION_FILE to configure ACL + if (isCapacityScheduler) { + // default root queue allows anyone to have admin acl + CapacitySchedulerConfiguration csconf = + new CapacitySchedulerConfiguration(); + csconf.setAcl("root", QueueACL.ADMINISTER_QUEUE, "someuser"); + csconf.setAcl("root.default", QueueACL.ADMINISTER_QUEUE, "someuser"); + rm.getResourceScheduler().reinitialize(csconf, rm.getRMContext()); + } + rm.start(); MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048); @@ -739,6 +822,9 @@ public void testAppSubmit(String acceptMedia, String contentMedia) assertEquals(appName, app.getName()); assertEquals(webserviceUserName, app.getUser()); assertEquals(2, app.getMaxAppAttempts()); + if (app.getQueue().contains("root.")) { + queueName = "root." + queueName; + } assertEquals(queueName, app.getQueue()); assertEquals(appType, app.getApplicationType()); assertEquals(tags, app.getApplicationTags());