YARN-9868. Validate %primary_group queue in CS queue manager. Contributed by Manikandan R
This commit is contained in:
parent
2576c31644
commit
b7ef8a333f
@ -179,11 +179,15 @@ private ApplicationPlacementContext getPlacementForUser(String user)
|
|||||||
if (mapping.getParentQueue() != null
|
if (mapping.getParentQueue() != null
|
||||||
&& mapping.getParentQueue().equals(PRIMARY_GROUP_MAPPING)
|
&& mapping.getParentQueue().equals(PRIMARY_GROUP_MAPPING)
|
||||||
&& mapping.getQueue().equals(CURRENT_USER_MAPPING)) {
|
&& mapping.getQueue().equals(CURRENT_USER_MAPPING)) {
|
||||||
QueueMapping queueMapping =
|
if (this.queueManager
|
||||||
new QueueMapping(mapping.getType(), mapping.getSource(),
|
.getQueue(groups.getGroups(user).get(0)) != null) {
|
||||||
user, groups.getGroups(user).get(0));
|
QueueMapping queueMapping = new QueueMapping(mapping.getType(),
|
||||||
|
mapping.getSource(), user, groups.getGroups(user).get(0));
|
||||||
validateQueueMapping(queueMapping);
|
validateQueueMapping(queueMapping);
|
||||||
return getPlacementContext(queueMapping, user);
|
return getPlacementContext(queueMapping, user);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
} else if (mapping.getParentQueue() != null
|
} else if (mapping.getParentQueue() != null
|
||||||
&& mapping.getParentQueue().equals(SECONDARY_GROUP_MAPPING)
|
&& mapping.getParentQueue().equals(SECONDARY_GROUP_MAPPING)
|
||||||
&& mapping.getQueue().equals(CURRENT_USER_MAPPING)) {
|
&& mapping.getQueue().equals(CURRENT_USER_MAPPING)) {
|
||||||
@ -203,7 +207,13 @@ private ApplicationPlacementContext getPlacementForUser(String user)
|
|||||||
} else if (mapping.queue.equals(CURRENT_USER_MAPPING)) {
|
} else if (mapping.queue.equals(CURRENT_USER_MAPPING)) {
|
||||||
return getPlacementContext(mapping, user);
|
return getPlacementContext(mapping, user);
|
||||||
} else if (mapping.queue.equals(PRIMARY_GROUP_MAPPING)) {
|
} else if (mapping.queue.equals(PRIMARY_GROUP_MAPPING)) {
|
||||||
return getPlacementContext(mapping, groups.getGroups(user).get(0));
|
if (this.queueManager
|
||||||
|
.getQueue(groups.getGroups(user).get(0)) != null) {
|
||||||
|
return getPlacementContext(mapping,
|
||||||
|
groups.getGroups(user).get(0));
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
} else if (mapping.queue.equals(SECONDARY_GROUP_MAPPING)) {
|
} else if (mapping.queue.equals(SECONDARY_GROUP_MAPPING)) {
|
||||||
String secondaryGroup = getSecondaryGroup(user);
|
String secondaryGroup = getSecondaryGroup(user);
|
||||||
if (secondaryGroup != null) {
|
if (secondaryGroup != null) {
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
package org.apache.hadoop.yarn.server.resourcemanager.placement;
|
package org.apache.hadoop.yarn.server.resourcemanager.placement;
|
||||||
|
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
@ -26,6 +27,7 @@
|
|||||||
import org.apache.hadoop.fs.CommonConfigurationKeys;
|
import org.apache.hadoop.fs.CommonConfigurationKeys;
|
||||||
import org.apache.hadoop.security.GroupMappingServiceProvider;
|
import org.apache.hadoop.security.GroupMappingServiceProvider;
|
||||||
import org.apache.hadoop.security.Groups;
|
import org.apache.hadoop.security.Groups;
|
||||||
|
import org.apache.hadoop.security.NullGroupsMapping;
|
||||||
import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
|
import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
|
||||||
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
||||||
import org.apache.hadoop.yarn.exceptions.YarnException;
|
import org.apache.hadoop.yarn.exceptions.YarnException;
|
||||||
@ -90,6 +92,7 @@ private void verifyQueueMapping(QueueMapping queueMapping, String inputUser,
|
|||||||
when(queueManager.getQueue("agroup")).thenReturn(agroup);
|
when(queueManager.getQueue("agroup")).thenReturn(agroup);
|
||||||
when(queueManager.getQueue("bsubgroup2")).thenReturn(bsubgroup2);
|
when(queueManager.getQueue("bsubgroup2")).thenReturn(bsubgroup2);
|
||||||
when(queueManager.getQueue("asubgroup2")).thenReturn(asubgroup2);
|
when(queueManager.getQueue("asubgroup2")).thenReturn(asubgroup2);
|
||||||
|
|
||||||
rule.setQueueManager(queueManager);
|
rule.setQueueManager(queueManager);
|
||||||
ApplicationSubmissionContext asc = Records.newRecord(
|
ApplicationSubmissionContext asc = Records.newRecord(
|
||||||
ApplicationSubmissionContext.class);
|
ApplicationSubmissionContext.class);
|
||||||
@ -118,6 +121,20 @@ public void testSecondaryGroupMapping() throws YarnException {
|
|||||||
"default");
|
"default");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNullGroupMapping() throws YarnException {
|
||||||
|
conf.setClass(CommonConfigurationKeys.HADOOP_SECURITY_GROUP_MAPPING,
|
||||||
|
NullGroupsMapping.class, GroupMappingServiceProvider.class);
|
||||||
|
try {
|
||||||
|
verifyQueueMapping(
|
||||||
|
new QueueMapping(MappingType.USER, "%user", "%secondary_group"), "a",
|
||||||
|
"default");
|
||||||
|
fail("No Groups for user 'a'");
|
||||||
|
} catch (YarnException e) {
|
||||||
|
// Exception is expected as there are no groups for given user
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMapping() throws YarnException {
|
public void testMapping() throws YarnException {
|
||||||
|
|
||||||
@ -131,6 +148,10 @@ public void testMapping() throws YarnException {
|
|||||||
verifyQueueMapping(
|
verifyQueueMapping(
|
||||||
new QueueMapping(MappingType.USER, "%user", "%primary_group"), "a",
|
new QueueMapping(MappingType.USER, "%user", "%primary_group"), "a",
|
||||||
"agroup");
|
"agroup");
|
||||||
|
// Queue "bgroup" is not configured, hence "default" should be used
|
||||||
|
verifyQueueMapping(
|
||||||
|
new QueueMapping(MappingType.USER, "%user", "%primary_group"), "b",
|
||||||
|
"default");
|
||||||
verifyQueueMapping(
|
verifyQueueMapping(
|
||||||
new QueueMapping(MappingType.USER, "%user", "%user", "%primary_group"),
|
new QueueMapping(MappingType.USER, "%user", "%user", "%primary_group"),
|
||||||
"a", YarnConfiguration.DEFAULT_QUEUE_NAME, "a", false, "agroup");
|
"a", YarnConfiguration.DEFAULT_QUEUE_NAME, "a", false, "agroup");
|
||||||
|
@ -339,8 +339,8 @@ public static CapacitySchedulerConfiguration setupQueueConfiguration(
|
|||||||
// Define top-level queues
|
// Define top-level queues
|
||||||
// Set childQueue for root
|
// Set childQueue for root
|
||||||
conf.setQueues(ROOT,
|
conf.setQueues(ROOT,
|
||||||
new String[] {"a", "b", "c", "d", "esubgroup1", "asubgroup2",
|
new String[] {"a", "b", "c", "d", "esubgroup1", "esubgroup2", "fgroup",
|
||||||
"fgroup"});
|
"a1group", "ggroup", "g"});
|
||||||
|
|
||||||
conf.setCapacity(A, A_CAPACITY);
|
conf.setCapacity(A, A_CAPACITY);
|
||||||
conf.setCapacity(B, B_CAPACITY);
|
conf.setCapacity(B, B_CAPACITY);
|
||||||
|
@ -242,8 +242,8 @@ public void testNestedUserQueueWithPrimaryGroupAsDynamicParentQueue()
|
|||||||
testNestedUserQueueWithDynamicParentQueue(queueMappingsForUG, true, "f");
|
testNestedUserQueueWithDynamicParentQueue(queueMappingsForUG, true, "f");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
testNestedUserQueueWithDynamicParentQueue(queueMappingsForUG, true, "h");
|
testNestedUserQueueWithDynamicParentQueue(queueMappingsForUG, true, "g");
|
||||||
fail("Leaf Queue 'h' doesn't exists");
|
fail("Queue 'g' exists, but type is not Leaf Queue");
|
||||||
} catch (YarnException e) {
|
} catch (YarnException e) {
|
||||||
// Exception is expected as there is no such leaf queue
|
// Exception is expected as there is no such leaf queue
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user