/*
* Copyright 2013 the original author or authors.
*
* Licensed 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.springframework.yarn.config.annotation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.data.hadoop.config.common.annotation.AnnotationBuilder;
import org.springframework.data.hadoop.config.common.annotation.ObjectPostProcessor;
import org.springframework.yarn.config.annotation.EnableYarn.Enable;
import org.springframework.yarn.config.annotation.builders.SpringYarnConfigBuilder;
import org.springframework.yarn.config.annotation.builders.YarnAppmasterBuilder;
import org.springframework.yarn.config.annotation.builders.YarnAppmasterConfigurer;
import org.springframework.yarn.config.annotation.builders.YarnClientBuilder;
import org.springframework.yarn.config.annotation.builders.YarnClientConfigurer;
import org.springframework.yarn.config.annotation.builders.YarnConfigBuilder;
import org.springframework.yarn.config.annotation.builders.YarnConfigConfigurer;
import org.springframework.yarn.config.annotation.builders.YarnContainerBuilder;
import org.springframework.yarn.config.annotation.builders.YarnContainerConfigurer;
import org.springframework.yarn.config.annotation.builders.YarnEnvironmentBuilder;
import org.springframework.yarn.config.annotation.builders.YarnEnvironmentConfigurer;
import org.springframework.yarn.config.annotation.builders.YarnResourceLocalizerBuilder;
import org.springframework.yarn.config.annotation.builders.YarnResourceLocalizerConfigurer;
/**
* Provides a convenient base class for creating a {@link SpringYarnConfigurer}
* instance. The implementation allows customization by overriding methods.
*
* @author Janne Valkealahti
* @see EnableYarn
*
*/
public class SpringYarnConfigurerAdapter implements SpringYarnConfigurer {
private final static Log log = LogFactory.getLog(SpringYarnConfigurerAdapter.class);
private YarnConfigBuilder yarnConfigBuilder;
private YarnResourceLocalizerBuilder yarnResourceLocalizerBuilder;
private YarnEnvironmentBuilder yarnEnvironmentBuilder;
private YarnClientBuilder yarnClientBuilder;
private YarnAppmasterBuilder yarnAppmasterBuilder;
private YarnContainerBuilder yarnContainerBuilder;
private ObjectPostProcessor<Object> objectPostProcessor = new ObjectPostProcessor<Object>() {
@Override
public <T> T postProcess(T object) {
throw new IllegalStateException(ObjectPostProcessor.class.getName()
+ " is a required bean. Ensure you have used @EnableYarn and @Configuration");
}
};
@Autowired(required=false)
public void setObjectPostProcessor(ObjectPostProcessor<Object> objectPostProcessor) {
this.objectPostProcessor = objectPostProcessor;
}
@Override
public final void init(SpringYarnConfigBuilder builder) throws Exception {
builder.setSharedObject(YarnConfigBuilder.class, getConfigBuilder());
builder.setSharedObject(YarnResourceLocalizerBuilder.class, getLocalizerBuilder());
builder.setSharedObject(YarnEnvironmentBuilder.class, getEnvironmentBuilder());
EnableYarn annotation = AnnotationUtils.findAnnotation(getClass(), EnableYarn.class);
Enable enable = annotation.enable();
if (log.isDebugEnabled()) {
log.debug("Enabling builder for " + enable);
}
if (enable == Enable.CLIENT) {
builder.setSharedObject(YarnClientBuilder.class, getClientBuilder());
} else if (enable == Enable.APPMASTER) {
builder.setSharedObject(YarnAppmasterBuilder.class, getAppmasterBuilder());
} else if (enable == Enable.CONTAINER) {
builder.setSharedObject(YarnContainerBuilder.class, getContainerBuilder());
}
}
@Override
public void configure(SpringYarnConfigBuilder builder) throws Exception {
}
@Override
public void configure(YarnConfigConfigurer config) throws Exception {
}
@Override
public void configure(YarnResourceLocalizerConfigurer localizer) throws Exception {
}
@Override
public void configure(YarnEnvironmentConfigurer environment) throws Exception {
}
@Override
public void configure(YarnClientConfigurer client) throws Exception {
}
@Override
public void configure(YarnAppmasterConfigurer master) throws Exception {
}
@Override
public void configure(YarnContainerConfigurer container) throws Exception {
}
/**
* Gets the Yarn config builder.
*
* @return the Yarn config builder
* @throws Exception if error occurred
*/
protected final YarnConfigBuilder getConfigBuilder() throws Exception {
if (yarnConfigBuilder != null) {
return yarnConfigBuilder;
}
yarnConfigBuilder = new YarnConfigBuilder(objectPostProcessor);
configure(yarnConfigBuilder);
return yarnConfigBuilder;
}
protected final YarnResourceLocalizerBuilder getLocalizerBuilder() throws Exception {
if (yarnResourceLocalizerBuilder != null) {
return yarnResourceLocalizerBuilder;
}
yarnResourceLocalizerBuilder = new YarnResourceLocalizerBuilder();
configure(yarnResourceLocalizerBuilder);
return yarnResourceLocalizerBuilder;
}
protected final YarnEnvironmentBuilder getEnvironmentBuilder() throws Exception {
if (yarnEnvironmentBuilder != null) {
return yarnEnvironmentBuilder;
}
yarnEnvironmentBuilder = new YarnEnvironmentBuilder();
configure(yarnEnvironmentBuilder);
return yarnEnvironmentBuilder;
}
protected final YarnClientBuilder getClientBuilder() throws Exception {
if (yarnClientBuilder != null) {
return yarnClientBuilder;
}
yarnClientBuilder = new YarnClientBuilder();
configure(yarnClientBuilder);
return yarnClientBuilder;
}
protected final YarnAppmasterBuilder getAppmasterBuilder() throws Exception {
if (yarnAppmasterBuilder != null) {
return yarnAppmasterBuilder;
}
yarnAppmasterBuilder = new YarnAppmasterBuilder(objectPostProcessor);
configure(yarnAppmasterBuilder);
return yarnAppmasterBuilder;
}
protected final YarnContainerBuilder getContainerBuilder() throws Exception {
if (yarnContainerBuilder != null) {
return yarnContainerBuilder;
}
yarnContainerBuilder = new YarnContainerBuilder();
configure(yarnContainerBuilder);
return yarnContainerBuilder;
}
@Override
public boolean isAssignable(AnnotationBuilder<SpringYarnConfigs> builder) {
return true;
}
}