blob: 474660e9f5d2ae0fdbc8ab62c9a261c6a5a27ca3 [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.thirdparty.com.google.common.annotations.VisibleForTesting;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FSQueue;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.QueueManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;
import java.io.IOException;
/**
* Abstract base for all {@link FairScheduler} Placement Rules.
*/
@InterfaceAudience.Private
@InterfaceStability.Unstable
public abstract class FSPlacementRule extends PlacementRule {
private static final Logger LOG =
LoggerFactory.getLogger(FSPlacementRule.class);
// Flag to show if the rule can create a queue
@VisibleForTesting
protected boolean createQueue = true;
private QueueManager queueManager;
private PlacementRule parentRule;
/**
* Get the {@link QueueManager} loaded from the scheduler when the rule is
* initialised. All rules are initialised before the can be called to place
* an application.
* @return The queue manager from the scheduler, this can never be
* <code>null</code> for an initialised rule.
*/
QueueManager getQueueManager() {
return queueManager;
}
/**
* Set a rule to generate the parent queue dynamically. The parent rule
* should only be called on rule creation when the policy is read from the
* configuration.
* @param parent A PlacementRule
*/
public void setParentRule(PlacementRule parent) {
this.parentRule = parent;
}
/**
* Get the rule that is set to generate the parent queue dynamically.
* @return The rule set or <code>null</code> if not set.
*/
@VisibleForTesting
public PlacementRule getParentRule() {
return parentRule;
}
/**
* Set the config based on the type of object passed in.
* @param initArg the config to be set
*/
@Override
public void setConfig(Object initArg) {
if (null == initArg) {
LOG.debug("Null object passed in: no config set");
return;
}
if (initArg instanceof Element) {
LOG.debug("Setting config from XML");
setConfig((Element) initArg);
} else if (initArg instanceof Boolean) {
LOG.debug("Setting config from Boolean");
setConfig((Boolean) initArg);
} else {
LOG.info("Unknown object type passed in as config for rule {}: {}",
getName(), initArg.getClass());
}
}
/**
* Set the rule config from the xml config.
* @param conf An xml element from the {@link FairScheduler#conf}
*/
protected void setConfig(Element conf) {
// Get the flag from the config (defaults to true if not set)
createQueue = getCreateFlag(conf);
}
/**
* Set the rule config just setting the create flag.
* @param create flag to allow queue creation for this rule
*/
protected void setConfig(Boolean create) {
createQueue = create;
}
/**
* Standard initialisation for {@link FairScheduler} rules, shared by all
* rules. Each rule that extends this abstract and overrides this method must
* call <code>super.initialize()</code> to run this basic initialisation.
* @param scheduler the scheduler using the rule
* @return <code>true</code> in all cases
* @throws IOException for any errors
*/
@Override
public boolean initialize(ResourceScheduler scheduler) throws IOException {
if (!(scheduler instanceof FairScheduler)) {
throw new IOException(getName() +
" rule can only be configured for the FairScheduler");
}
if (getParentRule() != null &&
getParentRule().getName().equals(getName())) {
throw new IOException("Parent rule may not be the same type as the " +
"child rule: " + getName());
}
FairScheduler fs = (FairScheduler) scheduler;
queueManager = fs.getQueueManager();
return true;
}
/**
* Check if the queue exists and is part of the configuration i.e. not
* a {@link FSQueue#isDynamic()} queue.
* @param queueName name of the queue to check
* @return <code>true</code> if the queue exists and is a "configured" queue
*/
boolean configuredQueue(String queueName) {
FSQueue queue = queueManager.getQueue(queueName);
return (queue != null && !queue.isDynamic());
}
/**
* Get the create flag as set during the config setup.
* @return The value of the {@link #createQueue} flag
*/
public boolean getCreateFlag() {
return createQueue;
}
/**
* Get the create flag from the xml configuration element.
* @param conf The FS configuration element for the queue
* @return <code>false</code> only if the flag is set in the configuration to
* a text that is not case ignored "true", <code>true</code> in all other
* cases
*/
boolean getCreateFlag(Element conf) {
if (conf != null) {
String create = conf.getAttribute("create");
return create.isEmpty() || Boolean.parseBoolean(create);
}
return true;
}
}