package com.neverwinterdp.vm.environment.yarn;
import java.io.IOException;
import org.apache.hadoop.yarn.api.records.Container;
import org.apache.hadoop.yarn.exceptions.YarnException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.mycila.jmx.annotation.JmxBean;
import com.neverwinterdp.registry.RegistryException;
import com.neverwinterdp.vm.VMConfig;
import com.neverwinterdp.vm.VMDescriptor;
import com.neverwinterdp.vm.environment.yarn.YarnManager.ContainerRequest;
import com.neverwinterdp.vm.service.VMService;
import com.neverwinterdp.vm.service.VMServicePlugin;
@Singleton
@JmxBean("role=vm-manager, type=VMServicePlugin, name=YarnVMServicePlugin")
public class YarnVMServicePlugin implements VMServicePlugin {
private Logger logger = LoggerFactory.getLogger(YarnVMServicePlugin.class);
@Inject
private YarnManager yarnManager;
@Override
synchronized public void allocateVM(VMService vmService, final VMConfig vmConfig) throws RegistryException, Exception {
logger.info("Start allocate(VMService vmService, VMDescriptor vmDescriptor)");
final ContainerRequest containerReq =
yarnManager.createContainerRequest(0, vmConfig.getRequestCpuCores(), vmConfig.getRequestMemory());
YarnManager.ContainerRequestCallback callback = new YarnManager.ContainerRequestCallback() {
@Override
public void onAllocate(YarnManager manager, ContainerRequest containerRequest, Container container) {
logger.info("Start onAllocate(Container container)");
vmConfig.
setSelfRegistration(false).
addHadoopProperty(manager.getYarnConfig());
try {
yarnManager.startContainer(container, vmConfig);
} catch (YarnException | IOException e) {
logger.error("Cannot start the container", e);
}
logger.info("Finish onAllocate(Container container)");
}
public String toString() {
StringBuilder b = new StringBuilder();
b.append("Command: " + vmConfig.buildCommand());
return b.toString();
}
};
yarnManager.asyncAdd(containerReq, callback);
logger.info("Finish allocate(VMService vmService, VMDescriptor vmDescriptor)");
}
@Override
synchronized public void killVM(VMService vmService, VMDescriptor vmDescriptor) throws Exception {
logger.info("Start onKill(VMService vmService, VMDescriptor vmDescriptor)");
logger.info("Finish onKill(VMService vmService, VMDescriptor vmDescriptor)");
}
@Override
public void shutdown() {
yarnManager.onDestroy();
}
}