/*
* 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 com.github.sakserv.minicluster.impl;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import org.apache.hadoop.conf.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.sakserv.minicluster.config.ConfigVars;
import com.github.sakserv.minicluster.yarn.simpleyarnapp.Client;
import com.github.sakserv.propertyparser.PropertyParser;
public class YarnLocalClusterIntegrationTest {
// Logger
private static final Logger LOG = LoggerFactory.getLogger(YarnLocalClusterIntegrationTest.class);
// Setup the property parser
private static PropertyParser propertyParser;
static {
try {
propertyParser = new PropertyParser(ConfigVars.DEFAULT_PROPS_FILE);
propertyParser.parsePropsFile();
} catch(IOException e) {
LOG.error("Unable to load property file: " + propertyParser.getProperty(ConfigVars.DEFAULT_PROPS_FILE));
}
}
private static YarnLocalCluster yarnLocalCluster;
@BeforeClass
public static void setUp() throws Exception {
yarnLocalCluster = new YarnLocalCluster.Builder()
.setNumNodeManagers(Integer.parseInt(propertyParser.getProperty(ConfigVars.YARN_NUM_NODE_MANAGERS_KEY)))
.setNumLocalDirs(Integer.parseInt(propertyParser.getProperty(ConfigVars.YARN_NUM_LOCAL_DIRS_KEY)))
.setNumLogDirs(Integer.parseInt(propertyParser.getProperty(ConfigVars.YARN_NUM_LOG_DIRS_KEY)))
.setResourceManagerAddress(propertyParser.getProperty(ConfigVars.YARN_RESOURCE_MANAGER_ADDRESS_KEY))
.setResourceManagerHostname(propertyParser.getProperty(ConfigVars.YARN_RESOURCE_MANAGER_HOSTNAME_KEY))
.setResourceManagerSchedulerAddress(propertyParser.getProperty(
ConfigVars.YARN_RESOURCE_MANAGER_SCHEDULER_ADDRESS_KEY))
.setResourceManagerResourceTrackerAddress(propertyParser.getProperty(
ConfigVars.YARN_RESOURCE_MANAGER_RESOURCE_TRACKER_ADDRESS_KEY))
.setResourceManagerWebappAddress(propertyParser.getProperty(
ConfigVars.YARN_RESOURCE_MANAGER_WEBAPP_ADDRESS_KEY))
.setUseInJvmContainerExecutor(Boolean.parseBoolean(propertyParser.getProperty(
ConfigVars.YARN_USE_IN_JVM_CONTAINER_EXECUTOR_KEY)))
.setConfig(new Configuration())
.build();
yarnLocalCluster.start();
}
@AfterClass
public static void tearDown() throws Exception {
yarnLocalCluster.stop();
}
@Test
public void testYarnLocalClusterIntegrationTest() {
String[] args = new String[7];
args[0] = "whoami";
args[1] = "1";
args[2] = getClass().getClassLoader().getResource("simple-yarn-app-1.1.0.jar").toString();
args[3] = yarnLocalCluster.getResourceManagerAddress();
args[4] = yarnLocalCluster.getResourceManagerHostname();
args[5] = yarnLocalCluster.getResourceManagerSchedulerAddress();
args[6] = yarnLocalCluster.getResourceManagerResourceTrackerAddress();
try {
Client.main(args);
} catch(Exception e) {
e.printStackTrace();
}
// simple yarn app running "whoami",
// validate the container contents matches the java user.name
assertEquals(System.getProperty("user.name"), getStdoutContents());
}
public String getStdoutContents() {
String contents = "";
try {
byte[] encoded = Files.readAllBytes(Paths.get(getStdoutPath()));
contents = new String(encoded, Charset.defaultCharset()).trim();
} catch (IOException e) {
e.printStackTrace();
}
return contents;
}
public String getStdoutPath() {
File dir = new File("./target/" + yarnLocalCluster.getTestName());
String[] nmDirs = dir.list();
for (String nmDir: nmDirs) {
if (nmDir.contains("logDir")) {
String[] appDirs = new File(dir.toString() + "/" + nmDir).list();
for (String appDir: appDirs) {
if (appDir.contains("0001")) {
String[] containerDirs = new File(dir.toString() + "/" + nmDir + "/" + appDir).list();
for (String containerDir: containerDirs) {
if(containerDir.contains("000002")) {
return dir.toString() + "/" + nmDir + "/" + appDir + "/" + containerDir + "/stdout";
}
}
}
}
}
}
return "";
}
}