/** * Copyright (c) 2010 Yahoo! Inc. All rights reserved. * 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. See accompanying LICENSE file. */ package org.apache.oozie.action.hadoop; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.filecache.DistributedCache; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.mapred.JobClient; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.RunningJob; import org.apache.oozie.test.XFsTestCase; import org.apache.oozie.util.IOUtils; import org.apache.oozie.util.XConfiguration; import org.apache.oozie.service.Services; import java.io.File; public class TestLauncher extends XFsTestCase { @Override protected void setUp() throws Exception { super.setUp(); new Services().init(); } @Override protected void tearDown() throws Exception { Services.get().destroy(); super.tearDown(); } private RunningJob _test(String... arg) throws Exception { Path actionDir = getFsTestCaseDir(); File jar = IOUtils.createJar(new File(getTestCaseDir()), "launcher.jar", LauncherMapper.class, LauncherSecurityManager.class, LauncherException.class, LauncherMainTester.class); FileSystem fs = getFileSystem(); Path launcherJar = new Path(actionDir, "launcher.jar"); fs.copyFromLocalFile(new Path(jar.toString()), launcherJar); JobConf jobConf = new JobConf(); jobConf.set("user.name", getTestUser()); jobConf.set("group.name", getTestGroup()); jobConf.setInt("mapred.map.tasks", 1); jobConf.setInt("mapred.map.max.attempts", 1); jobConf.setInt("mapred.reduce.max.attempts", 1); jobConf.set("mapred.job.tracker", getJobTrackerUri()); jobConf.set("fs.default.name", getNameNodeUri()); injectKerberosInfo(jobConf); LauncherMapper lm = new LauncherMapper(); lm.setupMainClass(jobConf, LauncherMainTester.class.getName()); lm.setupMainArguments(jobConf, arg); Configuration actionConf = new XConfiguration(); lm.setupLauncherInfo(jobConf, "1", "1@a", actionDir, "1@a-0", actionConf); assertEquals("1", actionConf.get("oozie.job.id")); assertEquals("1@a", actionConf.get("oozie.action.id")); DistributedCache.addFileToClassPath(new Path(launcherJar.toUri().getPath()), jobConf); JobClient jobClient = createJobClient(); final RunningJob runningJob = jobClient.submitJob(jobConf); System.out.println("Action Dir: " + actionDir); System.out.println("LauncherMapper ID: " + runningJob.getJobID().toString()); waitFor(180 * 1000, new Predicate() { public boolean evaluate() throws Exception { return runningJob.isComplete(); } }); return runningJob; } public void testEmpty() throws Exception { Path actionDir = getFsTestCaseDir(); FileSystem fs = getFileSystem(); RunningJob runningJob = _test(); Thread.sleep(2000); assertTrue(runningJob.isSuccessful()); assertTrue(LauncherMapper.isMainDone(runningJob)); assertTrue(LauncherMapper.isMainSuccessful(runningJob)); assertFalse(LauncherMapper.hasOutputData(runningJob)); assertFalse(LauncherMapper.hasIdSwap(runningJob)); assertTrue(LauncherMapper.isMainDone(runningJob)); assertFalse(fs.exists(LauncherMapper.getErrorPath(actionDir))); assertFalse(fs.exists(LauncherMapper.getIdSwapPath(actionDir))); assertFalse(fs.exists(LauncherMapper.getOutputDataPath(actionDir))); } public void testExit0() throws Exception { Path actionDir = getFsTestCaseDir(); FileSystem fs = getFileSystem(); RunningJob runningJob = _test("exit0"); Thread.sleep(2000); assertTrue(runningJob.isSuccessful()); assertTrue(LauncherMapper.isMainDone(runningJob)); assertTrue(LauncherMapper.isMainSuccessful(runningJob)); assertFalse(LauncherMapper.hasOutputData(runningJob)); assertFalse(LauncherMapper.hasIdSwap(runningJob)); assertTrue(LauncherMapper.isMainDone(runningJob)); assertFalse(fs.exists(LauncherMapper.getErrorPath(actionDir))); assertFalse(fs.exists(LauncherMapper.getIdSwapPath(actionDir))); assertFalse(fs.exists(LauncherMapper.getOutputDataPath(actionDir))); } public void testExit1() throws Exception { Path actionDir = getFsTestCaseDir(); FileSystem fs = getFileSystem(); RunningJob runningJob = _test("exit1"); Thread.sleep(2000); assertTrue(runningJob.isSuccessful()); assertTrue(LauncherMapper.isMainDone(runningJob)); assertFalse(LauncherMapper.isMainSuccessful(runningJob)); assertFalse(LauncherMapper.hasOutputData(runningJob)); assertFalse(LauncherMapper.hasIdSwap(runningJob)); assertTrue(LauncherMapper.isMainDone(runningJob)); assertTrue(fs.exists(LauncherMapper.getErrorPath(actionDir))); assertFalse(fs.exists(LauncherMapper.getIdSwapPath(actionDir))); assertFalse(fs.exists(LauncherMapper.getOutputDataPath(actionDir))); } public void testException() throws Exception { Path actionDir = getFsTestCaseDir(); FileSystem fs = getFileSystem(); RunningJob runningJob = _test("ex"); Thread.sleep(2000); assertTrue(runningJob.isSuccessful()); assertTrue(LauncherMapper.isMainDone(runningJob)); assertFalse(LauncherMapper.isMainSuccessful(runningJob)); assertFalse(LauncherMapper.hasOutputData(runningJob)); assertFalse(LauncherMapper.hasIdSwap(runningJob)); assertTrue(LauncherMapper.isMainDone(runningJob)); assertTrue(fs.exists(LauncherMapper.getErrorPath(actionDir))); assertFalse(fs.exists(LauncherMapper.getIdSwapPath(actionDir))); assertFalse(fs.exists(LauncherMapper.getOutputDataPath(actionDir))); } public void testOutput() throws Exception { Path actionDir = getFsTestCaseDir(); FileSystem fs = getFileSystem(); RunningJob runningJob = _test("out"); Thread.sleep(2000); assertTrue(runningJob.isSuccessful()); assertTrue(LauncherMapper.isMainDone(runningJob)); assertTrue(LauncherMapper.isMainSuccessful(runningJob)); assertTrue(LauncherMapper.hasOutputData(runningJob)); assertFalse(LauncherMapper.hasIdSwap(runningJob)); assertTrue(LauncherMapper.isMainDone(runningJob)); assertFalse(fs.exists(LauncherMapper.getErrorPath(actionDir))); assertFalse(fs.exists(LauncherMapper.getIdSwapPath(actionDir))); assertTrue(fs.exists(LauncherMapper.getOutputDataPath(actionDir))); } public void testNewId() throws Exception { Path actionDir = getFsTestCaseDir(); FileSystem fs = getFileSystem(); RunningJob runningJob = _test("id"); Thread.sleep(2000); assertTrue(runningJob.isSuccessful()); assertTrue(LauncherMapper.isMainDone(runningJob)); assertTrue(LauncherMapper.isMainSuccessful(runningJob)); assertFalse(LauncherMapper.hasOutputData(runningJob)); assertTrue(LauncherMapper.hasIdSwap(runningJob)); assertTrue(LauncherMapper.isMainDone(runningJob)); assertFalse(fs.exists(LauncherMapper.getErrorPath(actionDir))); assertTrue(fs.exists(LauncherMapper.getIdSwapPath(actionDir))); assertFalse(fs.exists(LauncherMapper.getOutputDataPath(actionDir))); } public void testSecurityManager() throws Exception { Path actionDir = getFsTestCaseDir(); FileSystem fs = getFileSystem(); RunningJob runningJob = _test("securityManager"); Thread.sleep(2000); assertTrue(runningJob.isSuccessful()); assertTrue(LauncherMapper.isMainDone(runningJob)); assertTrue(LauncherMapper.isMainSuccessful(runningJob)); assertFalse(LauncherMapper.hasOutputData(runningJob)); assertFalse(LauncherMapper.hasIdSwap(runningJob)); assertTrue(LauncherMapper.isMainDone(runningJob)); assertFalse(fs.exists(LauncherMapper.getErrorPath(actionDir))); assertFalse(fs.exists(LauncherMapper.getIdSwapPath(actionDir))); assertFalse(fs.exists(LauncherMapper.getOutputDataPath(actionDir))); } }