tomicooler commented on a change in pull request #3857:
URL: https://github.com/apache/hadoop/pull/3857#discussion_r787544335
##########
File path:
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java
##########
@@ -395,25 +398,209 @@ public void
testQueueSubmitWithACLsEnabledWithQueueMappingForAutoCreatedQueue()
RMContext newMockRMContext = newMockRM.getRMContext();
newMockRMContext.setQueuePlacementManager(createMockPlacementManager(
- "user1|user2", "user1", "managedparent"));
+ "user1|user2", "user1", "root.managedparent"));
TestRMAppManager newAppMonitor = createAppManager(newMockRMContext, conf);
- newAppMonitor.submitApplication(asContext, "user1");
- RMApp app = newMockRMContext.getRMApps().get(appId);
- Assert.assertNotNull("app should not be null", app);
- Assert.assertEquals("the queue should be placed on 'managedparent.user1'
queue",
- "managedparent.user1",
- app.getQueue());
+ ApplicationSubmissionContext submission =
createAppSubmissionContext(MockApps.newAppID(1));
+ submission.setQueue("oldQueue");
+ verifyAppSubmission(submission,
+ newAppMonitor,
+ newMockRMContext,
+ "user1",
+ "root.managedparent.user1");
+
+ verifyAppSubmissionFailure(newAppMonitor,
+ createAppSubmissionContext(MockApps.newAppID(2)),
+ "user2");
+ }
+
+ @Test
+ public void testLegacyAutoCreatedQueuesWithACLTemplates()
+ throws IOException, YarnException {
+ YarnConfiguration conf = new YarnConfiguration(new Configuration(false));
+ conf.set(YarnConfiguration.YARN_ACL_ENABLE, "true");
+ conf.setClass(YarnConfiguration.RM_SCHEDULER, CapacityScheduler.class,
+ ResourceScheduler.class);
+ CapacitySchedulerConfiguration csConf = new CapacitySchedulerConfiguration(
+ conf, false);
+ csConf.set(PREFIX + "root.queues", "parent");
+ csConf.set(PREFIX + "root.acl_submit_applications", " ");
+ csConf.set(PREFIX + "root.acl_administer_queue", " ");
+
+ csConf.setCapacity("root.parent", 100.0f);
+ csConf.set(PREFIX + "root.parent.acl_administer_queue", "user1,user4");
+ csConf.set(PREFIX + "root.parent.acl_submit_applications", "user1,user4");
+ conf.set("yarn.scheduler.capacity.queue-mappings", "u:%user:parent.%user");
+
+ csConf.setAutoCreateChildQueueEnabled("root.parent", true);
+ csConf.setAutoCreatedLeafQueueConfigCapacity("root.parent", 50f);
+ csConf.setAutoCreatedLeafQueueConfigMaxCapacity("root.parent", 100f);
+
csConf.set(getQueuePrefix(csConf.getAutoCreatedQueueTemplateConfPrefix("root.parent"))
+
+ "acl_administer_queue", "user2,user4");
+
csConf.set(getQueuePrefix(csConf.getAutoCreatedQueueTemplateConfPrefix("root.parent"))
+
+ "acl_submit_applications", "user2,user4");
+
+ MockRM newMockRM = new MockRM(csConf);
+
+ RMContext newMockRMContext = newMockRM.getRMContext();
+ TestRMAppManager newAppMonitor = createAppManager(newMockRMContext, conf);
+
+ // user1 has permission on root.parent so a queue would be created
+ newMockRMContext.setQueuePlacementManager(createMockPlacementManager(
+ "user1", "user1", "root.parent"));
+ verifyAppSubmission(createAppSubmissionContext(MockApps.newAppID(1)),
+ newAppMonitor,
+ newMockRMContext,
+ "user1",
+ "root.parent.user1");
+
+ newMockRMContext.setQueuePlacementManager(createMockPlacementManager(
+ "user1|user2|user3|user4", "user2", "root.parent"));
+
+ // user2 doesn't have permission on root.parent so no queue will be created
+ verifyAppSubmissionFailure(newAppMonitor,
+ createAppSubmissionContext(MockApps.newAppID(2)),
+ "user2");
+
+ // user4 has permission on root.parent so a queue would be created
+ verifyAppSubmission(createAppSubmissionContext(MockApps.newAppID(3)),
+ newAppMonitor,
+ newMockRMContext,
+ "user4",
+ "root.parent.user2");
+
+ // create the root.parent.user2 manually, because
+ // TestAppManager.submitApplication doesn't lead to queue creation
+ CapacityScheduler cs =
+ ((CapacityScheduler) newMockRM.getResourceScheduler());
+ cs.getCapacitySchedulerQueueManager().createQueue(new
QueuePath("root.parent.user2"));
+ AutoCreatedLeafQueue autoCreatedLeafQueue = (AutoCreatedLeafQueue)
cs.getQueue("user2");
+ Assert.assertNotNull("Auto Creation of Queue failed",
autoCreatedLeafQueue);
+ ManagedParentQueue parentQueue = (ManagedParentQueue)
cs.getQueue("parent");
+ assertEquals(parentQueue, autoCreatedLeafQueue.getParent());
+ // reinitialize to load the ACLs for the queue
+ cs.reinitialize(csConf, newMockRMContext);
+
+ // since the root.parent.user2 queue already exists the app can be
submitted with user2
+ verifyAppSubmission(createAppSubmissionContext(MockApps.newAppID(4)),
+ newAppMonitor,
+ newMockRMContext,
+ "user2",
+ "root.parent.user2");
+
+ // user3 doesn't have permission for root.parent.user2 queue
+ verifyAppSubmissionFailure(newAppMonitor,
+ createAppSubmissionContext(MockApps.newAppID(5)),
+ "user3");
+
+ // user1 doesn't have permission for root.parent.user2 queue, but it has
for root.parent
+ verifyAppSubmission(createAppSubmissionContext(MockApps.newAppID(6)),
+ newAppMonitor,
+ newMockRMContext,
+ "user1",
+ "root.parent.user2");
+ }
+
+ @Test
+ public void testFlexibleAutoCreatedQueuesWithACLTemplates()
Review comment:
I modified the test case and it revealed some really strange behaviour.
root.parent: AQCv2 enabled
root.parent.user2: auto created parent queue
root.parent.user2.user3: auto created leaf queue
when the root.parent.user2 is not exist yet then the app submission fails
for user2 to root.parent.user2 (seems logical because at queue creation time
the template is not in effect), but the app submission succeeded for user3 to
root.parent.user2.user3 (??? the leaf template would approve but why is in
effect ???)
when the root.parent.user2.user3 already exists then the opposite happens,
user2 can submit to root.parent.user2 but user3 can't submit to
root.parent.user2.user3
Could you please try the unit test yourself? Should we document anything
about this, or should I try it manually too?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]