blob: 76e3e275fc9f7a89c833e448ebd10066819e6852 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.yarn.server.resourcemanager.placement;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.AutoCreatedLeafQueue;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CSQueue;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerQueueManager;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.LeafQueue;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.ManagedParentQueue;
import java.io.IOException;
import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration.DOT;
/**
* Utility class for Capacity Scheduler queue PlacementRules.
*/
public final class QueuePlacementRuleUtils {
public static final String CURRENT_USER_MAPPING = "%user";
public static final String PRIMARY_GROUP_MAPPING = "%primary_group";
public static final String SECONDARY_GROUP_MAPPING = "%secondary_group";
private QueuePlacementRuleUtils() {
}
public static void validateQueueMappingUnderParentQueue(
CSQueue parentQueue, String parentQueueName,
String leafQueuePath) throws IOException {
if (parentQueue == null) {
throw new IOException(
"mapping contains invalid or non-leaf queue [" + leafQueuePath
+ "] and invalid parent queue [" + parentQueueName + "]");
} else if (!(parentQueue instanceof ManagedParentQueue)) {
throw new IOException("mapping contains leaf queue [" + leafQueuePath
+ "] and invalid parent queue which "
+ "does not have auto creation of leaf queues enabled ["
+ parentQueueName + "]");
} else if (!parentQueue.getQueueShortName().equals(parentQueueName)
&& !parentQueue.getQueuePath().equals(parentQueueName)) {
throw new IOException(
"mapping contains invalid or non-leaf queue [" + leafQueuePath
+ "] and invalid parent queue "
+ "which does not match existing leaf queue's parent : ["
+ parentQueueName + "] does not match [ " + parentQueue
.getQueueShortName() + "]");
}
}
public static QueueMapping validateAndGetAutoCreatedQueueMapping(
CapacitySchedulerQueueManager queueManager, QueueMapping mapping)
throws IOException {
if (mapping.hasParentQueue()) {
//if parent queue is specified,
// then it should exist and be an instance of ManagedParentQueue
validateQueueMappingUnderParentQueue(queueManager.getQueue(
mapping.getParentQueue()), mapping.getParentQueue(),
mapping.getFullPath());
return mapping;
}
return null;
}
public static QueueMapping validateAndGetQueueMapping(
CapacitySchedulerQueueManager queueManager, CSQueue queue,
QueueMapping mapping) throws IOException {
if (!(queue instanceof LeafQueue)) {
throw new IOException(
"mapping contains invalid or non-leaf queue : " +
mapping.getFullPath());
}
if (queue instanceof AutoCreatedLeafQueue && queue
.getParent() instanceof ManagedParentQueue) {
QueueMapping newMapping = validateAndGetAutoCreatedQueueMapping(
queueManager, mapping);
if (newMapping == null) {
throw new IOException(
"mapping contains invalid or non-leaf queue " +
mapping.getFullPath());
}
return newMapping;
}
return mapping;
}
public static boolean isStaticQueueMapping(QueueMapping mapping) {
return !mapping.getQueue().contains(CURRENT_USER_MAPPING) && !mapping
.getQueue().contains(PRIMARY_GROUP_MAPPING)
&& !mapping.getQueue().contains(SECONDARY_GROUP_MAPPING);
}
public static ApplicationPlacementContext getPlacementContext(
QueueMapping mapping, CapacitySchedulerQueueManager queueManager)
throws IOException {
return getPlacementContext(mapping, mapping.getQueue(), queueManager);
}
public static ApplicationPlacementContext getPlacementContext(
QueueMapping mapping, String leafQueueName,
CapacitySchedulerQueueManager queueManager) throws IOException {
//leafQueue name no longer identifies a queue uniquely checking ambiguity
if (!mapping.hasParentQueue() && queueManager.isAmbiguous(leafQueueName)) {
throw new IOException("mapping contains ambiguous leaf queue reference " +
leafQueueName);
}
if (!org.apache.commons.lang3.StringUtils.isEmpty(mapping.getParentQueue())) {
return new ApplicationPlacementContext(leafQueueName,
mapping.getParentQueue());
} else{
return new ApplicationPlacementContext(leafQueueName);
}
}
}