Repository: oozie Updated Branches: refs/heads/master 8aca098c2 -> d135b88ce
http://git-wip-us.apache.org/repos/asf/oozie/blob/d135b88c/core/src/main/resources/oozie-default.xml ---------------------------------------------------------------------- diff --git a/core/src/main/resources/oozie-default.xml b/core/src/main/resources/oozie-default.xml index 0d174b5..2389b99 100644 --- a/core/src/main/resources/oozie-default.xml +++ b/core/src/main/resources/oozie-default.xml @@ -1607,17 +1607,18 @@ will be the requeue interval for the actions which are waiting for a long time w <property> <name>oozie.service.SchemaService.wf.schemas</name> <value> + oozie-common-1.0.xsd, oozie-workflow-0.1.xsd,oozie-workflow-0.2.xsd,oozie-workflow-0.2.5.xsd,oozie-workflow-0.3.xsd,oozie-workflow-0.4.xsd, - oozie-workflow-0.4.5.xsd,oozie-workflow-0.5.xsd, - shell-action-0.1.xsd,shell-action-0.2.xsd,shell-action-0.3.xsd, + oozie-workflow-0.4.5.xsd,oozie-workflow-0.5.xsd,oozie-workflow-1.0.xsd, + shell-action-0.1.xsd,shell-action-0.2.xsd,shell-action-0.3.xsd,shell-action-1.0.xsd, email-action-0.1.xsd,email-action-0.2.xsd, - hive-action-0.2.xsd,hive-action-0.3.xsd,hive-action-0.4.xsd,hive-action-0.5.xsd,hive-action-0.6.xsd, - sqoop-action-0.2.xsd,sqoop-action-0.3.xsd,sqoop-action-0.4.xsd, + hive-action-0.2.xsd,hive-action-0.3.xsd,hive-action-0.4.xsd,hive-action-0.5.xsd,hive-action-0.6.xsd,hive-action-1.0.xsd, + sqoop-action-0.2.xsd,sqoop-action-0.3.xsd,sqoop-action-0.4.xsd,sqoop-action-1.0.xsd, ssh-action-0.1.xsd,ssh-action-0.2.xsd, distcp-action-0.1.xsd,distcp-action-0.2.xsd, oozie-sla-0.1.xsd,oozie-sla-0.2.xsd, - hive2-action-0.1.xsd, hive2-action-0.2.xsd, - spark-action-0.1.xsd,spark-action-0.2.xsd + hive2-action-0.1.xsd,hive2-action-0.2.xsd,hive2-action-1.0.xsd, + spark-action-0.1.xsd,spark-action-0.2.xsd,spark-action-1.0.xsd </value> <description> List of schemas for workflows (separated by commas). @@ -3074,5 +3075,35 @@ will be the requeue interval for the actions which are waiting for a long time w Most users should not have to change this. </description> </property> + <property> + <name>oozie.launcher.default.vcores</name> + <value>1</value> + <description> + The default number of vcores that are allocated for the Launcher AMs + </description> + </property> + + <property> + <name>oozie.launcher.default.memory.mb</name> + <value>2048</value> + <description> + The default amount of memory in MBs that is allocated for the Launcher AMs + </description> + </property> + <property> + <name>oozie.launcher.default.priority</name> + <value>0</value> + <description> + The default YARN priority of the Launcher AM + </description> + </property> + + <property> + <name>oozie.launcher.default.queue</name> + <value>default</value> + <description> + The default YARN queue where the Launcher AM is placed + </description> + </property> </configuration> http://git-wip-us.apache.org/repos/asf/oozie/blob/d135b88c/core/src/test/java/org/apache/oozie/action/hadoop/ActionExecutorTestCase.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/oozie/action/hadoop/ActionExecutorTestCase.java b/core/src/test/java/org/apache/oozie/action/hadoop/ActionExecutorTestCase.java index d74160a..dd90536 100644 --- a/core/src/test/java/org/apache/oozie/action/hadoop/ActionExecutorTestCase.java +++ b/core/src/test/java/org/apache/oozie/action/hadoop/ActionExecutorTestCase.java @@ -35,9 +35,7 @@ import org.apache.oozie.service.Services; import org.apache.oozie.service.UUIDService; import org.apache.oozie.service.WorkflowAppService; import org.apache.oozie.service.WorkflowStoreService; -import org.apache.oozie.test.XFsTestCase; import org.apache.oozie.test.XHCatTestCase; -import org.apache.oozie.test.XTestCase; import org.apache.oozie.util.ELEvaluator; import org.apache.oozie.util.IOUtils; import org.apache.oozie.util.XConfiguration; @@ -244,7 +242,7 @@ public abstract class ActionExecutorTestCase extends XHCatTestCase { protected WorkflowJobBean createBaseWorkflow(XConfiguration protoConf, String actionName) throws Exception { Path appUri = new Path(getAppPath(), "workflow.xml"); - String content = "<workflow-app xmlns='uri:oozie:workflow:0.1' xmlns:sla='uri:oozie:sla:0.1' name='no-op-wf'>"; + String content = "<workflow-app xmlns='uri:oozie:workflow:1.0' xmlns:sla='uri:oozie:sla:0.1' name='no-op-wf'>"; content += "<start to='end' />"; content += "<end name='end' /></workflow-app>"; writeToFile(content, getAppPath(), "workflow.xml"); @@ -300,6 +298,41 @@ public abstract class ActionExecutorTestCase extends XHCatTestCase { return workflow; } + protected WorkflowJobBean createBaseWorkflowWithLauncherConfig(XConfiguration protoConf, String actionName) throws Exception { + Path appUri = new Path(getAppPath(), "workflow.xml"); + + String content = "<workflow-app xmlns='uri:oozie:workflow:1.0' xmlns:sla='uri:oozie:sla:0.1' name='no-op-wf'>"; + content += "<global>" + + "<launcher>" + + " <vcores>2</vcores>" + + " <memory.mb>1024</memory.mb>" + + " <queue>default</queue>" + + " <priority>1</priority>" + + " <java-opts>-verbose:class</java-opts>" + + "</launcher>" + + "</global>"; + + content += "<start to='end' />"; + content += "<end name='end' /></workflow-app>"; + writeToFile(content, getAppPath(), "workflow.xml"); + + WorkflowApp app = new LiteWorkflowApp("testApp", "<workflow-app/>", + new StartNodeDef(LiteWorkflowStoreService.LiteControlNodeHandler.class, + "end")) + .addNode(new EndNodeDef("end", LiteWorkflowStoreService.LiteControlNodeHandler.class)); + XConfiguration wfConf = new XConfiguration(); + wfConf.set(OozieClient.USER_NAME, getTestUser()); + wfConf.set(OozieClient.APP_PATH, appUri.toString()); + + WorkflowJobBean workflow = createWorkflow(app, wfConf, protoConf); + + WorkflowActionBean action = new WorkflowActionBean(); + action.setName(actionName); + action.setId(Services.get().get(UUIDService.class).generateChildId(workflow.getId(), actionName)); + workflow.getActions().add(action); + return workflow; + } + private WorkflowJobBean createWorkflow(WorkflowApp app, Configuration conf, XConfiguration protoConf) throws Exception { WorkflowLib workflowLib = Services.get().get(WorkflowStoreService.class).getWorkflowLibWithNoDB(); http://git-wip-us.apache.org/repos/asf/oozie/blob/d135b88c/core/src/test/java/org/apache/oozie/action/hadoop/LauncherMainTester.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/oozie/action/hadoop/LauncherMainTester.java b/core/src/test/java/org/apache/oozie/action/hadoop/LauncherMainTester.java index 6cee7a8..43c71b0 100644 --- a/core/src/test/java/org/apache/oozie/action/hadoop/LauncherMainTester.java +++ b/core/src/test/java/org/apache/oozie/action/hadoop/LauncherMainTester.java @@ -31,6 +31,15 @@ public class LauncherMainTester { System.out.println("Hello World!"); } + String testJavaOpts = System.getProperty("testJavaOpts"); + if (testJavaOpts != null && Boolean.parseBoolean(testJavaOpts)) { + throw new RuntimeException("Failing on purpose"); + } + String env = System.getenv("LAUNCHER_ENVIRON"); + if (env != null && env.equals("foo1")) { + throw new RuntimeException("Failing on purpose"); + } + if (args.length == 1) { if (args[0].equals("throwable")) { throw new Throwable("throwing throwable"); http://git-wip-us.apache.org/repos/asf/oozie/blob/d135b88c/core/src/test/java/org/apache/oozie/action/hadoop/TestJavaActionExecutor.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/oozie/action/hadoop/TestJavaActionExecutor.java b/core/src/test/java/org/apache/oozie/action/hadoop/TestJavaActionExecutor.java index d1d78fd..02e60c0 100644 --- a/core/src/test/java/org/apache/oozie/action/hadoop/TestJavaActionExecutor.java +++ b/core/src/test/java/org/apache/oozie/action/hadoop/TestJavaActionExecutor.java @@ -29,14 +29,7 @@ import java.io.Writer; import java.net.URI; import java.security.PrivilegedExceptionAction; import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.Map; -import java.util.Properties; -import java.util.Set; +import java.util.*; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.examples.SleepJob; @@ -51,6 +44,7 @@ import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.token.Token; import org.apache.hadoop.security.token.TokenIdentifier; import org.apache.hadoop.yarn.api.records.ApplicationId; +import org.apache.hadoop.yarn.api.records.ApplicationReport; import org.apache.hadoop.yarn.api.records.FinalApplicationStatus; import org.apache.hadoop.yarn.api.records.YarnApplicationState; import org.apache.hadoop.yarn.client.api.YarnClient; @@ -86,7 +80,9 @@ import org.junit.Test; public class TestJavaActionExecutor extends ActionExecutorTestCase { - public static final String YARN_RESOURCEMANAGER_ADDRESS = "yarn.resourcemanager.address"; + private static final String YARN_RESOURCEMANAGER_ADDRESS = "yarn.resourcemanager.address"; + private static final String MAPRED_CHILD_JAVA_OPTS = "mapred.child.java.opts"; + private static final String MAPREDUCE_MAP_JAVA_OPTS = "mapreduce.map.java.opts"; @Override protected void beforeSetUp() throws Exception { @@ -273,8 +269,8 @@ public class TestJavaActionExecutor extends ActionExecutorTestCase { ae.setupLauncherConf(conf, actionXml, getFsTestCaseDir(), context); assertEquals("MAIN-CLASS", actionConf.get("oozie.action.java.main", "null")); assertEquals("org.apache.oozie.action.hadoop.JavaMain", ae.getLauncherMain(conf, actionXml)); - assertTrue(conf.get("mapred.child.java.opts").contains("JAVA-OPTS")); - assertTrue(conf.get("mapreduce.map.java.opts").contains("JAVA-OPTS")); + assertTrue(conf.get(MAPRED_CHILD_JAVA_OPTS).contains("JAVA-OPTS")); + assertTrue(conf.get(MAPREDUCE_MAP_JAVA_OPTS).contains("JAVA-OPTS")); assertEquals(Arrays.asList("A1", "A2"), Arrays.asList(LauncherAMUtils.getMainArguments(conf))); actionXml = XmlUtils.parseXml("<java>" + "<job-tracker>" + getJobTrackerUri() + "</job-tracker>" + @@ -1114,7 +1110,7 @@ public class TestJavaActionExecutor extends ActionExecutorTestCase { WorkflowApp app = new LiteWorkflowApp("testApp", wfxml, new StartNodeDef(LiteWorkflowStoreService.LiteControlNodeHandler.class, "start")). addNode(new EndNodeDef("end", LiteWorkflowStoreService.LiteControlNodeHandler.class)); - Configuration conf = Services.get().get(HadoopAccessorService.class). + Configuration conf = getHadoopAccessorService(). createConfiguration(new URI(getNameNodeUri()).getAuthority()); conf.set(OozieClient.APP_PATH, getNameNodeUri() + "/testPath"); conf.set(OozieClient.LOG_TOKEN, "testToken"); @@ -1226,8 +1222,8 @@ public class TestJavaActionExecutor extends ActionExecutorTestCase { Configuration conf = ae.createLauncherConf(getFileSystem(), context, action, actionXmlconf, actionConf); - assertEquals("-Xmx200m JAVA-OPT1 JAVA-OPT2", conf.get("mapred.child.java.opts")); - assertEquals("-Xmx200m JAVA-OPT1 JAVA-OPT2", conf.get("mapreduce.map.java.opts")); + assertEquals("-Xmx200m JAVA-OPT1 JAVA-OPT2", conf.get(MAPRED_CHILD_JAVA_OPTS)); + assertEquals("-Xmx200m JAVA-OPT1 JAVA-OPT2", conf.get(MAPREDUCE_MAP_JAVA_OPTS)); actionXml = "<java>" + "<job-tracker>" + getJobTrackerUri() + "</job-tracker>" + "<name-node>" + getNameNodeUri() + "</name-node>" @@ -1251,8 +1247,8 @@ public class TestJavaActionExecutor extends ActionExecutorTestCase { conf = ae.createLauncherConf(getFileSystem(), context, action, actionXmlconf, actionConf); - assertEquals("-Xmx200m JAVA-OPT1 JAVA-OPT2", conf.get("mapred.child.java.opts")); - assertEquals("-Xmx200m JAVA-OPT1 JAVA-OPT2", conf.get("mapreduce.map.java.opts")); + assertEquals("-Xmx200m JAVA-OPT1 JAVA-OPT2", conf.get(MAPRED_CHILD_JAVA_OPTS)); + assertEquals("-Xmx200m JAVA-OPT1 JAVA-OPT2", conf.get(MAPREDUCE_MAP_JAVA_OPTS)); actionXml = "<java>" + "<job-tracker>" + getJobTrackerUri() + "</job-tracker>" + "<name-node>" + getNameNodeUri() + "</name-node>" @@ -1278,8 +1274,8 @@ public class TestJavaActionExecutor extends ActionExecutorTestCase { conf = ae.createLauncherConf(getFileSystem(), context, action, actionXmlconf, actionConf); - assertEquals("JAVA-OPT3 JAVA-OPT1 JAVA-OPT2", conf.get("mapred.child.java.opts")); - assertEquals("JAVA-OPT3 JAVA-OPT1 JAVA-OPT2", conf.get("mapreduce.map.java.opts")); + assertEquals("JAVA-OPT3 JAVA-OPT1 JAVA-OPT2", conf.get(MAPRED_CHILD_JAVA_OPTS)); + assertEquals("JAVA-OPT3 JAVA-OPT1 JAVA-OPT2", conf.get(MAPREDUCE_MAP_JAVA_OPTS)); actionXml = "<java>" + "<job-tracker>" + getJobTrackerUri() + "</job-tracker>" + "<name-node>" + getNameNodeUri() + "</name-node>" @@ -1305,8 +1301,8 @@ public class TestJavaActionExecutor extends ActionExecutorTestCase { conf = ae.createLauncherConf(getFileSystem(), context, action, actionXmlconf, actionConf); - assertEquals("-Xmx200m JAVA-OPT3 JAVA-OPT1 JAVA-OPT2", conf.get("mapred.child.java.opts")); - assertEquals("-Xmx200m JAVA-OPT3 JAVA-OPT1 JAVA-OPT2", conf.get("mapreduce.map.java.opts")); + assertEquals("-Xmx200m JAVA-OPT3 JAVA-OPT1 JAVA-OPT2", conf.get(MAPRED_CHILD_JAVA_OPTS)); + assertEquals("-Xmx200m JAVA-OPT3 JAVA-OPT1 JAVA-OPT2", conf.get(MAPREDUCE_MAP_JAVA_OPTS)); actionXml = "<java>" + "<job-tracker>" + getJobTrackerUri() + "</job-tracker>" + "<name-node>" + getNameNodeUri() + "</name-node>" @@ -1333,8 +1329,8 @@ public class TestJavaActionExecutor extends ActionExecutorTestCase { conf = ae.createLauncherConf(getFileSystem(), context, action, actionXmlconf, actionConf); - assertEquals("JAVA-OPT3 JAVA-OPT4 JAVA-OPT1 JAVA-OPT2", conf.get("mapred.child.java.opts")); - assertEquals("JAVA-OPT3 JAVA-OPT4 JAVA-OPT1 JAVA-OPT2", conf.get("mapreduce.map.java.opts")); + assertEquals("JAVA-OPT3 JAVA-OPT4 JAVA-OPT1 JAVA-OPT2", conf.get(MAPRED_CHILD_JAVA_OPTS)); + assertEquals("JAVA-OPT3 JAVA-OPT4 JAVA-OPT1 JAVA-OPT2", conf.get(MAPREDUCE_MAP_JAVA_OPTS)); } public void testActionLibsPath() throws Exception { @@ -2262,6 +2258,176 @@ public class TestJavaActionExecutor extends ActionExecutorTestCase { assertEquals("/user/map%20dev/test-case/shell/script/shell%201.sh", actPath); } + public void testSubmitOKWithVcoresAndMemory() throws Exception { + String actionXml = "<java>" + + "<job-tracker>" + getJobTrackerUri() + "</job-tracker>" + + "<name-node>" + getNameNodeUri() + "</name-node>" + + "<configuration>" + + " <property><name>oozie.launcher.vcores</name><value>1</value></property>" + + " <property><name>oozie.launcher.memory.mb</name><value>1024</value></property>" + + "</configuration>" + + "<main-class>" + LauncherMainTester.class.getName() + "</main-class>" + + "</java>"; + Context context = createContext(actionXml, null); + submitAction(context); + waitUntilYarnAppDoneAndAssertSuccess(context.getAction().getExternalId()); + ActionExecutor ae = new JavaActionExecutor(); + ae.check(context, context.getAction()); + assertEquals("SUCCEEDED", context.getAction().getExternalStatus()); + assertNull(context.getAction().getData()); + + ae.end(context, context.getAction()); + assertEquals(WorkflowAction.Status.OK, context.getAction().getStatus()); + } + + public void testSubmitOKWithLauncherJavaOpts() throws Exception { + String actionXml = "<java>" + + "<job-tracker>" + getJobTrackerUri() + "</job-tracker>" + + "<name-node>" + getNameNodeUri() + "</name-node>" + + "<configuration>" + + " <property><name>oozie.launcher.javaopts</name><value>-DtestJavaOpts=true</value></property>" + + "</configuration>" + + "<main-class>" + LauncherMainTester.class.getName() + "</main-class>" + + "</java>"; + Context context = createContext(actionXml, null); + submitAction(context); + waitUntilYarnAppDoneAndAssertSuccess(context.getAction().getExternalId()); + ActionExecutor ae = new JavaActionExecutor(); + ae.check(context, context.getAction()); + assertEquals("FAILED/KILLED", context.getAction().getExternalStatus()); + assertNull(context.getAction().getData()); + + ae.end(context, context.getAction()); + assertEquals(WorkflowAction.Status.ERROR, context.getAction().getStatus()); + } + + public void testSubmitFailsWithNegativeVcores() throws Exception { + String actionXml = "<java>" + + "<job-tracker>" + getJobTrackerUri() + "</job-tracker>" + + "<name-node>" + getNameNodeUri() + "</name-node>" + + "<configuration>" + + " <property><name>oozie.launcher.vcores</name><value>-1</value></property>" + + "</configuration>" + + "<main-class>" + LauncherMainTester.class.getName() + "</main-class>" + + "</java>"; + Context context = createContext(actionXml, null); + + boolean exception = false; + try { + submitAction(context); + } catch (ActionExecutorException e) { + exception = true; + assertEquals("Illegal exception was thrown", IllegalArgumentException.class, e.getCause().getClass()); + } + + assertTrue("Exception was not caught", exception); + } + + public void testSubmitFailsWithNegativeMemory() throws Exception { + String actionXml = "<java>" + + "<job-tracker>" + getJobTrackerUri() + "</job-tracker>" + + "<name-node>" + getNameNodeUri() + "</name-node>" + + "<configuration>" + + " <property><name>oozie.launcher.memory.mb</name><value>-1</value></property>" + + "</configuration>" + + "<main-class>" + LauncherMainTester.class.getName() + "</main-class>" + + "</java>"; + Context context = createContext(actionXml, null); + + boolean exception = false; + try { + submitAction(context); + } catch (ActionExecutorException e) { + exception = true; + assertEquals("Illegal exception was thrown", IllegalArgumentException.class, e.getCause().getClass()); + } + + assertTrue("Exception was not caught", exception); + } + + public void testSubmitOKWithLauncherEnvVars() throws Exception { + String actionXml = "<java>" + + "<job-tracker>" + getJobTrackerUri() + "</job-tracker>" + + "<name-node>" + getNameNodeUri() + "</name-node>" + + "<configuration>" + + " <property><name>oozie.launcher.env</name><value>A=foo1" + File.pathSeparator + "B=foo2</value></property>" + + "</configuration>" + + "<main-class>" + LauncherMainTester.class.getName() + "</main-class>" + + "</java>"; + Context context = createContext(actionXml, null); + submitAction(context); + waitUntilYarnAppDoneAndAssertSuccess(context.getAction().getExternalId()); + ActionExecutor ae = new JavaActionExecutor(); + ae.check(context, context.getAction()); + assertEquals("SUCCEEDED", context.getAction().getExternalStatus()); + assertNull(context.getAction().getData()); + + ae.end(context, context.getAction()); + assertEquals(WorkflowAction.Status.OK, context.getAction().getStatus()); + } + + public void testEnvVarsPropagatedFromLauncherConfig() throws Exception { + String actionXml = "<java>" + + "<job-tracker>" + getJobTrackerUri() + "</job-tracker>" + + "<name-node>" + getNameNodeUri() + "</name-node>" + + "<configuration>" + + " <property><name>oozie.launcher.env</name><value>LAUNCHER_ENVIRON=foo1" + File.pathSeparator + "B=foo2</value></property>" + + "</configuration>" + + "<main-class>" + LauncherMainTester.class.getName() + "</main-class>" + + "</java>"; + Context context = createContext(actionXml, null); + submitAction(context); + waitUntilYarnAppDoneAndAssertSuccess(context.getAction().getExternalId()); + ActionExecutor ae = new JavaActionExecutor(); + ae.check(context, context.getAction()); + assertEquals("FAILED/KILLED", context.getAction().getExternalStatus()); + assertNull(context.getAction().getData()); + + ae.end(context, context.getAction()); + assertEquals(WorkflowAction.Status.ERROR, context.getAction().getStatus()); + } + + public void testSubmitFailsWithInvalidLauncherEnvVars() throws Exception { + String actionXml = "<java>" + + "<job-tracker>" + getJobTrackerUri() + "</job-tracker>" + + "<name-node>" + getNameNodeUri() + "</name-node>" + + "<configuration>" + + " <property><name>oozie.launcher.env</name><value>Afoo1" + File.pathSeparator + "B=foo2</value></property>" + + "</configuration>" + + "<main-class>" + LauncherMainTester.class.getName() + "</main-class>" + + "</java>"; + Context context = createContext(actionXml, null); + try { + submitAction(context); + fail(); + } + catch (ActionExecutorException e) { + assertTrue(e.getMessage().contains("Invalid launcher setting for environment variables")); + } + } + + public void testSubmitWithLauncherQueue() throws Exception { + String actionXml = "<java>" + + "<job-tracker>" + getJobTrackerUri() + "</job-tracker>" + + "<name-node>" + getNameNodeUri() + "</name-node>" + + "<configuration>" + + " <property><name>oozie.launcher.queue</name><value>test</value></property>" + + "</configuration>" + + "<main-class>" + LauncherMainTester.class.getName() + "</main-class>" + + "</java>"; + Context context = createContext(actionXml, null); + submitAction(context); + final ApplicationId appId = ConverterUtils.toApplicationId(context.getAction().getExternalId()); + Configuration conf = getHadoopAccessorService().createConfiguration(getJobTrackerUri()); + String queue = getHadoopAccessorService().createYarnClient(getTestUser(), conf).getApplicationReport(appId).getQueue(); + assertEquals("test", queue); + } + + private HadoopAccessorService getHadoopAccessorService() { + return Services.get().get(HadoopAccessorService.class); + } + + public void testChildKill() throws Exception { final JobConf clusterConf = createJobConf(); FileSystem fileSystem = FileSystem.get(clusterConf); @@ -2319,7 +2485,7 @@ public class TestJavaActionExecutor extends ActionExecutorTestCase { // kill the action - based on the job tag, the SleepJob is expected to be killed too ae.kill(context, context.getAction()); - HadoopAccessorService hadoopAccessorService = Services.get().get(HadoopAccessorService.class); + HadoopAccessorService hadoopAccessorService = getHadoopAccessorService(); Configuration config = hadoopAccessorService.createConfiguration(getJobTrackerUri()); YarnClient yarnClient = hadoopAccessorService.createYarnClient(getTestUser(), config); http://git-wip-us.apache.org/repos/asf/oozie/blob/d135b88c/core/src/test/java/org/apache/oozie/service/TestSchemaService.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/oozie/service/TestSchemaService.java b/core/src/test/java/org/apache/oozie/service/TestSchemaService.java index 88a10db..940868a 100644 --- a/core/src/test/java/org/apache/oozie/service/TestSchemaService.java +++ b/core/src/test/java/org/apache/oozie/service/TestSchemaService.java @@ -18,11 +18,8 @@ package org.apache.oozie.service; -import org.apache.oozie.service.Services; import org.apache.oozie.service.SchemaService.SchemaName; import org.apache.oozie.test.XTestCase; -import org.apache.oozie.util.XmlUtils; -import org.jdom.Element; import javax.xml.validation.Validator; import javax.xml.transform.stream.StreamSource; @@ -32,26 +29,32 @@ import java.io.StringReader; public class TestSchemaService extends XTestCase { private static final String APP1 = "<workflow-app xmlns='uri:oozie:workflow:0.1' name='app'>" + - "<start to='end'/>" + - "<end name='end'/>" + + " <start to='end'/>" + + " <end name='end'/>" + "</workflow-app>"; private static final String APP_V2 = "<workflow-app xmlns='uri:oozie:workflow:0.2' name='app'>" + "<start to='end'/>" + "<end name='end'/>" + "</workflow-app>"; - private static final String APP_V25 = "<workflow-app xmlns='uri:oozie:workflow:0.2.5' name='app'>" + "<credentials></credentials>"+"<start to='end'/>" - + "<end name='end'/>" + "</workflow-app>"; + private static final String APP_V25 = "<?xml version=\"1.0\"?>\n" + + "<workflow-app xmlns=\"uri:oozie:workflow:0.2.5\" name=\"app\">\n" + + " <credentials/>\n" + + " <start to=\"end\"/>\n" + + " <end name=\"end\"/>\n" + + "</workflow-app>"; - private static final String WF_SLA_APP = "<workflow-app xmlns='uri:oozie:workflow:0.2' name='app' xmlns:sla='uri:oozie:sla:0.1'>" - + "<start to='end'/>" - + "<end name='end'/>" - + "<sla:info> <sla:app-name>5</sla:app-name> <sla:nominal-time>2009-03-06T010:00Z</sla:nominal-time> " - + "<sla:should-start>5</sla:should-start> <sla:should-end>50</sla:should-end> " + private static final String WF_SLA_APP = "<workflow-app xmlns='uri:oozie:workflow:0.2' name='app'" + + " xmlns:sla='uri:oozie:sla:0.1'>" + + " <start to='end'/>" + + " <end name='end'/>" + + " <sla:info><sla:app-name>5</sla:app-name> <sla:nominal-time>2009-03-06T010:00Z</sla:nominal-time> " + + " <sla:should-start>5</sla:should-start> <sla:should-end>50</sla:should-end> " + "<sla:alert-contact>[email protected]</sla:alert-contact> <sla:dev-contact>[email protected]</sla:dev-contact>" + " <sla:qa-contact>[email protected]</sla:qa-contact> <sla:se-contact>[email protected]</sla:se-contact>" + "</sla:info>" + "</workflow-app>"; - private static final String WF_SLA_APP_NW = "<workflow-app xmlns='uri:oozie:workflow:0.1' name='app' xmlns:sla='uri:oozie:sla:0.1'>" + private static final String WF_SLA_APP_NW = "<workflow-app xmlns='uri:oozie:workflow:0.1' name='app'" + + " xmlns:sla='uri:oozie:sla:0.1'>" + "<start to='end'/>" + "<end name='end'/>" + "<sla:info> <sla:app-name>5</sla:app-name> <sla:nominal-time>2009-03-06T010:00Z</sla:nominal-time> " @@ -60,14 +63,6 @@ public class TestSchemaService extends XTestCase { + " <sla:qa-contact>[email protected]</sla:qa-contact> <sla:se-contact>[email protected]</sla:se-contact>" + "</sla:info>" + "</workflow-app>"; - private static final String COORD_APP1 = "<coordinator-app name=\"NAME\" frequency=\"${coord:days(1)}\" start=\"${start}\" end=\"${end}\" timezone=\"${timezone}\" xmlns=\"uri:oozie:coordinator:0.2\">" - + "<controls> <timeout>${timeout}</timeout> <concurrency>${concurrency_level}</concurrency> <execution>${execution_order}</execution> </controls>" - + "<datasets> <include>${include_ds_files}</include> <!-- Synchronous datasets --> <dataset name=\"local_a\" frequency=\"${coord:days(7)}\" initial-instance=\"${start}\" timezone=\"${timezone}\"> " - + "<uri-template>${baseFsURI}/${YEAR}/${DAY}</uri-template> </dataset> </datasets> " - + "<input-events> <data-in name=\"A\" dataset=\"a\"> <instance>${coord:latest(0)}</instance> </data-in> <data-in name=\"B\" dataset=\"b\"> <start-instance>${coord:current(-2)}</start-instance> <end-instance>${coord:current(0)}</end-instance> </data-in> </input-events> <output-events> " - + "<data-out name=\"LOCAL_A\" dataset=\"local_a\"> <instance>${coord:current(0)}</instance> </data-out> </output-events> <action> <workflow> <app-path>${app_path}</app-path> <configuration> <property> <name>inputA</name> <value>${coord:dataIn('A')}</value> </property> <property> <name>inputB</name> <value>${coord:dataIn('B')}</value> </property> <property> <name>inputB</name> <value>${coord:dataOut('LOCAL_A')}</value> </property> <property> <name>TESTING</name> <value>${start}</value> </property> </configuration> </workflow> </action> </coordinator-app>"; - - private static final String APP2 = "<workflow-app xmlns='uri:oozie:workflow:0.1' name='app'>" + "<start to='a'/>" + "<action name='a'>" + @@ -101,10 +96,230 @@ public class TestSchemaService extends XTestCase { "<end name='end'/>" + "</workflow-app>"; + private static final String WF_GLOBAL_LAUNCHER_CONF = "<workflow-app xmlns=\"uri:oozie:workflow:1.0\" name=\"test-wf\">\n" + + " <global>\n" + + " <launcher>\n" + + " <memory.mb>1024</memory.mb>\n" + + " <vcores>2</vcores>\n" + + " <java-opts>dummyJavaOpts</java-opts>\n" + + " <env>dummyEnv</env>\n" + + " <queue>dummyQueue</queue>\n" + + " <sharelib>a,b,c</sharelib>\n" + + " </launcher>\n" + + " </global>\n" + + " <start to=\"a\"/>\n" + + " <action name=\"a\">\n" + + " <fs>\n" + + " <mkdir path='/tmp'/>\n" + + " </fs>\n" + + " <ok to=\"e\"/>\n" + + " <error to=\"k\"/>\n" + + " </action>\n" + + " <kill name=\"k\">\n" + + " <message>kill</message>\n" + + " </kill>\n" + + " <end name=\"e\"/>\n" + + "</workflow-app>\n"; + + private static final String HIVE_ACTION_LAUNCHER_CONF = + "<workflow-app xmlns=\"uri:oozie:workflow:1.0\" name=\"hive-wf\">\n" + + " <start to=\"hive-node\"/>\n" + + " <action name=\"hive-node\">\n" + + " <hive xmlns=\"uri:oozie:hive-action:1.0\">\n" + + " <job-tracker>${jobTracker}</job-tracker>\n" + + " <name-node>${nameNode}</name-node>\n" + + " <prepare>\n" + + " <delete path=\"${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/hive\"/>\n" + + " <mkdir path=\"${nameNode}/user/${wf:user()}/${examplesRoot}/output-data\"/>\n" + + " </prepare>\n" + + " <launcher>\n" + + " <memory.mb>1024</memory.mb>\n" + + " <vcores>2</vcores>\n" + + " <java-opts>dummyJavaOpts</java-opts>\n" + + " <env>dummyEnv</env>\n" + + " <queue>dummyQueue</queue>\n" + + " <sharelib>a,b,c</sharelib>\n" + + " </launcher>\n" + + " <configuration>\n" + + " <property>\n" + + " <name>mapred.job.queue.name</name>\n" + + " <value>${queueName}</value>\n" + + " </property>\n" + + " </configuration>\n" + + " <script>script.q</script>\n" + + " <param>INPUT=/user/${wf:user()}/${examplesRoot}/input-data/table</param>\n" + + " <param>OUTPUT=/user/${wf:user()}/${examplesRoot}/output-data/hive</param>\n" + + " </hive>\n" + + " <ok to=\"end\"/>\n" + + " <error to=\"fail\"/>\n" + + " </action>\n" + + " <kill name=\"fail\">\n" + + " <message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>\n" + + " </kill>\n" + + " <end name=\"end\"/>\n" + + "</workflow-app>\n"; + + private static final String HIVE2_ACTION_LAUNCHER_CONF = + "<workflow-app xmlns=\"uri:oozie:workflow:1.0\" name=\"hive2-wf\">\n" + + " <start to=\"hive2-node\"/>\n" + + " <action name=\"hive2-node\">\n" + + " <hive2 xmlns=\"uri:oozie:hive2-action:1.0\">\n" + + " <job-tracker>${jobTracker}</job-tracker>\n" + + " <name-node>${nameNode}</name-node>\n" + + " <prepare>\n" + + " <delete path=\"${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/hive2\"/>\n" + + " <mkdir path=\"${nameNode}/user/${wf:user()}/${examplesRoot}/output-data\"/>\n" + + " </prepare>\n" + + " <launcher>\n" + + " <memory.mb>1024</memory.mb>\n" + + " <vcores>2</vcores>\n" + + " <java-opts>dummyJavaOpts</java-opts>\n" + + " <env>dummyEnv</env>\n" + + " <queue>dummyQueue</queue>\n" + + " <sharelib>a,b,c</sharelib>\n" + + " </launcher>\n" + + " <configuration>\n" + + " <property>\n" + + " <name>mapred.job.queue.name</name>\n" + + " <value>${queueName}</value>\n" + + " </property>\n" + + " </configuration>\n" + + " <jdbc-url>${jdbcURL}</jdbc-url>\n" + + " <script>script.q</script>\n" + + " <param>INPUT=/user/${wf:user()}/${examplesRoot}/input-data/table</param>\n" + + " <param>OUTPUT=/user/${wf:user()}/${examplesRoot}/output-data/hive2</param>\n" + + " </hive2>\n" + + " <ok to=\"end\"/>\n" + + " <error to=\"fail\"/>\n" + + " </action>\n" + + " <kill name=\"fail\">\n" + + " <message>Hive2 (Beeline) action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>\n" + + " </kill>\n" + + " <end name=\"end\"/>\n" + + "</workflow-app>\n"; + + private static final String SHELL_ACTION_LAUNCHER_CONF = "<workflow-app xmlns=\"uri:oozie:workflow:1.0\" " + + " name=\"shell-wf\">\n" + + " <start to=\"shell-node\"/>\n" + + " <action name=\"shell-node\">\n" + + " <shell xmlns=\"uri:oozie:shell-action:1.0\">\n" + + " <job-tracker>${jobTracker}</job-tracker>\n" + + " <name-node>${nameNode}</name-node>\n" + + " <launcher>\n" + + " <memory.mb>1024</memory.mb>\n" + + " </launcher>\n" + + " <configuration>\n" + + " <property>\n" + + " <name>mapred.job.queue.name</name>\n" + + " <value>${queueName}</value>\n" + + " </property>\n" + + " </configuration>\n" + + " <exec>echo</exec>\n" + + " <argument>my_output=Hello Oozie</argument>\n" + + " <capture-output/>\n" + + " </shell>\n" + + " <ok to=\"check-output\"/>\n" + + " <error to=\"fail\"/>\n" + + " </action>\n" + + " <decision name=\"check-output\">\n" + + " <switch>\n" + + " <case to=\"end\">\n" + + " ${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}\n" + + " </case>\n" + + " <default to=\"fail-output\"/>\n" + + " </switch>\n" + + " </decision>\n" + + " <kill name=\"fail\">\n" + + " <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>\n" + + " </kill>\n" + + " <kill name=\"fail-output\">\n" + + " <message>Incorrect output</message>\n" + + " </kill>\n" + + " <end name=\"end\"/>\n" + + "</workflow-app>"; + + private static final String SQQP_ACTION_LAUNCHER_CONF = "<workflow-app xmlns=\"uri:oozie:workflow:1.0\" name=\"sqoop-wf\">\n" + + " <start to=\"sqoop-node\"/>\n" + + " <action name=\"sqoop-node\">\n" + + " <sqoop xmlns=\"uri:oozie:sqoop-action:1.0\">\n" + + " <job-tracker>${jobTracker}</job-tracker>\n" + + " <name-node>${nameNode}</name-node>\n" + + " <prepare>\n" + + " <delete path=\"${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/sqoop\"/>\n" + + " <mkdir path=\"${nameNode}/user/${wf:user()}/${examplesRoot}/output-data\"/>\n" + + " </prepare>\n" + + " <launcher>\n" + + " <memory.mb>1024</memory.mb>\n" + + " </launcher>\n" + + " <configuration>\n" + + " <property>\n" + + " <name>mapred.job.queue.name</name>\n" + + " <value>${queueName}</value>\n" + + " </property>\n" + + " </configuration>\n" + + " <command>import --connect jdbc:hsqldb:file:db.hsqldb --table TT --target-dir " + + "/user/${wf:user()}/${examplesRoot}/output-data/sqoop -m 1</command>\n" + + " <file>db.hsqldb.properties#db.hsqldb.properties</file>\n" + + " <file>db.hsqldb.script#db.hsqldb.script</file>\n" + + " </sqoop>\n" + + " <ok to=\"end\"/>\n" + + " <error to=\"fail\"/>\n" + + " </action>\n" + + " <kill name=\"fail\">\n" + + " <message>Sqoop failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>\n" + + " </kill>\n" + + " <end name=\"end\"/>\n" + + "</workflow-app>"; + + private static final String SPARK_ACTION_LAUNCHER_CONF = "<workflow-app xmlns='uri:oozie:workflow:1.0' " + + "name='SparkFileCopy'>\n" + + " <start to='spark-node' />\n" + + " <action name='spark-node'>\n" + + " <spark xmlns=\"uri:oozie:spark-action:1.0\">\n" + + " <job-tracker>${jobTracker}</job-tracker>\n" + + " <name-node>${nameNode}</name-node>\n" + + " <prepare>\n" + + " <delete path=\"${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/spark\"/>\n" + + " </prepare>\n" + + " <launcher>\n" + + " <memory.mb>1024</memory.mb>\n" + + " <vcores>2</vcores>\n" + + " <java-opts>dummyJavaOpts</java-opts>\n" + + " <env>dummyEnv</env>\n" + + " <queue>dummyQueue</queue>\n" + + " <sharelib>a,b,c</sharelib>\n" + + " </launcher>\n" + + " <master>${master}</master>\n" + + " <name>Spark-FileCopy</name>\n" + + " <class>org.apache.oozie.example.SparkFileCopy</class>\n" + + " <jar>${nameNode}/user/${wf:user()}/${examplesRoot}/apps/spark/lib/oozie-examples.jar</jar>\n" + + " <arg>${nameNode}/user/${wf:user()}/${examplesRoot}/input-data/text/data.txt</arg>\n" + + " <arg>${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/spark</arg>\n" + + " </spark>\n" + + " <ok to=\"end\" />\n" + + " <error to=\"fail\" />\n" + + " </action>\n" + + " <kill name=\"fail\">\n" + + " <message>Workflow failed, error\n" + + " message[${wf:errorMessage(wf:lastErrorNode())}]\n" + + " </message>\n" + + " </kill>\n" + + " <end name='end' />\n" + + "</workflow-app>\n"; + + private SchemaService wss; + private Validator workflowValidator; + private Validator coordinatorValidator; + private Validator bundleValidator; + @Override protected void setUp() throws Exception { super.setUp(); new Services().init(); + wss = Services.get().get(SchemaService.class); + workflowValidator = wss.getSchema(SchemaName.WORKFLOW).newValidator(); + coordinatorValidator = wss.getSchema(SchemaName.COORDINATOR).newValidator(); + bundleValidator = wss.getSchema(SchemaName.BUNDLE).newValidator(); } @Override @@ -118,27 +333,19 @@ public class TestSchemaService extends XTestCase { } public void testWfSchema() throws Exception { - SchemaService wss = Services.get().get(SchemaService.class); - Validator validator = wss.getSchema(SchemaName.WORKFLOW).newValidator(); - validator.validate(new StreamSource(new StringReader(APP1))); + workflowValidator.validate(new StreamSource(new StringReader(APP1))); } public void testWfMultipleJavaOpts() throws Exception { - SchemaService wss = Services.get().get(SchemaService.class); - Validator validator = wss.getSchema(SchemaName.WORKFLOW).newValidator(); - validator.validate(new StreamSource(new StringReader(WF_4_MULTIPLE_JAVA_OPTS))); + workflowValidator.validate(new StreamSource(new StringReader(WF_4_MULTIPLE_JAVA_OPTS))); } public void testWfSchemaV2() throws Exception { - SchemaService wss = Services.get().get(SchemaService.class); - Validator validator = wss.getSchema(SchemaName.WORKFLOW).newValidator(); - validator.validate(new StreamSource(new StringReader(APP_V2))); + workflowValidator.validate(new StreamSource(new StringReader(APP_V2))); } public void testWfSchemaV25() throws Exception { - SchemaService wss = Services.get().get(SchemaService.class); - Validator validator = wss.getSchema(SchemaName.WORKFLOW).newValidator(); - validator.validate(new StreamSource(new StringReader(APP_V25))); + workflowValidator.validate(new StreamSource(new StringReader(APP_V25))); } public void testExtSchema() throws Exception { @@ -151,16 +358,12 @@ public class TestSchemaService extends XTestCase { } public void testWfSLASchema() throws Exception { - SchemaService wss = Services.get().get(SchemaService.class); - Validator validator = wss.getSchema(SchemaName.WORKFLOW).newValidator(); - validator.validate(new StreamSource(new StringReader(WF_SLA_APP))); + workflowValidator.validate(new StreamSource(new StringReader(WF_SLA_APP))); } public void testWfSLASchemaNW() throws Exception { - SchemaService wss = Services.get().get(SchemaService.class); - Validator validator = wss.getSchema(SchemaName.WORKFLOW).newValidator(); try { - validator.validate(new StreamSource(new StringReader(WF_SLA_APP_NW))); + workflowValidator.validate(new StreamSource(new StringReader(WF_SLA_APP_NW))); fail("Schema service check does not work"); } catch (Exception ex) { @@ -169,59 +372,199 @@ public class TestSchemaService extends XTestCase { } public void testCoordSchema() throws Exception { - SchemaService wss = Services.get().get(SchemaService.class); - Validator validator = wss.getSchema(SchemaName.COORDINATOR).newValidator(); - String COORD_APP1 = "<coordinator-app name='NAME' frequency='${coord:days(1)}' start='2009-02-01T01:00Z' end='2009-02-03T23:59Z' timezone='UTC' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='uri:oozie:coordinator:0.1' xmlns:sla='uri:oozie:sla:0.1'> " - + "<controls> <timeout>10</timeout> <concurrency>2</concurrency> <execution>LIFO</execution> </controls> <datasets> <dataset name='a' frequency='${coord:days(7)}' initial-instance='2009-02-01T01:00Z' timezone='UTC'> <uri-template>file:///tmp/coord/workflows/${YEAR}/${DAY}</uri-template> </dataset> <dataset name='local_a' frequency='${coord:days(7)}' initial-instance='2009-02-01T01:00Z' timezone='UTC'> <uri-template>file:///tmp/coord/workflows/${YEAR}/${DAY}</uri-template> </dataset> </datasets> <input-events> <data-in name='A' dataset='a'> <instance>${coord:latest(0)}</instance> </data-in> </input-events> <output-events> <data-out name='LOCAL_A' dataset='local_a'> <instance>${coord:current(-1)}</instance> </data-out> </output-events> <action> <workflow> <app-path>hdfs:///tmp/workflows/</app-path> <configuration> <property> <name>inputA</name> <value>${coord:dataIn('A')}</value> </property> <property> <name>inputB</name> <value>${coord:dataOut('LOCAL_A')}</value> </p roperty></configuration> </workflow> " - + "</action> </coordinator-app>"; - - Element e = XmlUtils.parseXml(COORD_APP1); - //System.out.println("XML :"+ XmlUtils.prettyPrint(e)); - validator.validate(new StreamSource(new StringReader(COORD_APP1))); + String COORD_APP1 = "<?xml version=\"1.0\"?>\n" + + "<coordinator-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"uri:oozie:coordinator:0.1\"" + + " xmlns:sla=\"uri:oozie:sla:0.1\" name=\"NAME\" frequency=\"${coord:days(1)}\" start=\"2009-02-01T01:00Z\"" + + " end=\"2009-02-03T23:59Z\" timezone=\"UTC\">\n" + + " <controls>\n" + + " <timeout>10</timeout>\n" + + " <concurrency>2</concurrency>\n" + + " <execution>LIFO</execution>\n" + + " </controls>\n" + + " <datasets>\n" + + " <dataset name=\"a\" frequency=\"${coord:days(7)}\" initial-instance=\"2009-02-01T01:00Z\"" + + " timezone=\"UTC\">\n" + + " <uri-template>file:///tmp/coord/workflows/${YEAR}/${DAY}</uri-template>\n" + + " </dataset>\n" + + " <dataset name=\"local_a\" frequency=\"${coord:days(7)}\" initial-instance=\"2009-02-01T01:00Z\"" + + " timezone=\"UTC\">\n" + + " <uri-template>file:///tmp/coord/workflows/${YEAR}/${DAY}</uri-template>\n" + + " </dataset>\n" + + " </datasets>\n" + + " <input-events>\n" + + " <data-in name=\"A\" dataset=\"a\">\n" + + " <instance>${coord:latest(0)}</instance>\n" + + " </data-in>\n" + + " </input-events>\n" + + " <output-events>\n" + + " <data-out name=\"LOCAL_A\" dataset=\"local_a\">\n" + + " <instance>${coord:current(-1)}</instance>\n" + + " </data-out>\n" + + " </output-events>\n" + + " <action>\n" + + " <workflow>\n" + + " <app-path>hdfs:///tmp/workflows/</app-path>\n" + + " <configuration>\n" + + " <property>\n" + + " <name>inputA</name>\n" + + " <value>${coord:dataIn('A')}</value>\n" + + " </property>\n" + + " <property>\n" + + " <name>inputB</name>\n" + + " <value>${coord:dataOut('LOCAL_A')}</value>\n" + + " </property>\n" + + " </configuration>\n" + + " </workflow>\n" + + " </action>\n" + + "</coordinator-app>"; + + coordinatorValidator.validate(new StreamSource(new StringReader(COORD_APP1))); } public void testCoordSchema2() throws Exception { - SchemaService wss = Services.get().get(SchemaService.class); - Validator validator = wss.getSchema(SchemaName.COORDINATOR).newValidator(); - String COORD_APP1 = "<coordinator-app name='NAME' frequency='${coord:days(1)}' start='2009-02-01T01:00Z' end='2009-02-03T23:59Z' timezone='UTC' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='uri:oozie:coordinator:0.2' xmlns:sla='uri:oozie:sla:0.1'> " - + "<controls> <timeout>10</timeout> <concurrency>2</concurrency> <execution>LIFO</execution> <throttle>3</throttle></controls> <datasets> <dataset name='a' frequency='${coord:days(7)}' initial-instance='2009-02-01T01:00Z' timezone='UTC'> <uri-template>file:///tmp/coord/workflows/${YEAR}/${DAY}</uri-template> </dataset> <dataset name='local_a' frequency='${coord:days(7)}' initial-instance='2009-02-01T01:00Z' timezone='UTC'> <uri-template>file:///tmp/coord/workflows/${YEAR}/${DAY}</uri-template> </dataset> </datasets> <input-events> <data-in name='A' dataset='a'> <instance>${coord:latest(0)}</instance> </data-in> </input-events> <output-events> <data-out name='LOCAL_A' dataset='local_a'> <instance>${coord:current(-1)}</instance> </data-out> </output-events> <action> <workflow> <app-path>hdfs:///tmp/workflows/</app-path> <configuration> <property> <name>inputA</name> <value>${coord:dataIn('A')}</value> </property> <property> <name>inputB</name> <value>${coord:dataOut( 'LOCAL_A')}</value> </property></configuration> </workflow> " - + "</action> </coordinator-app>"; - - Element e = XmlUtils.parseXml(COORD_APP1); - //System.out.println("XML :"+ XmlUtils.prettyPrint(e)); - validator.validate(new StreamSource(new StringReader(COORD_APP1))); + String COORD_APP1 = "<coordinator-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + + " xmlns=\"uri:oozie:coordinator:0.2\" xmlns:sla=\"uri:oozie:sla:0.1\" name=\"NAME\"" + + " frequency=\"${coord:days(1)}\" start=\"2009-02-01T01:00Z\" end=\"2009-02-03T23:59Z\" timezone=\"UTC\">\n" + + " <controls>\n" + + " <timeout>10</timeout>\n" + + " <concurrency>2</concurrency>\n" + + " <execution>LIFO</execution>\n" + + " <throttle>3</throttle>\n" + + " </controls>\n" + + " <datasets>\n" + + " <dataset name=\"a\" frequency=\"${coord:days(7)}\" initial-instance=\"2009-02-01T01:00Z\"" + + " timezone=\"UTC\">\n" + + " <uri-template>file:///tmp/coord/workflows/${YEAR}/${DAY}</uri-template>\n" + + " </dataset>\n" + + " <dataset name=\"local_a\" frequency=\"${coord:days(7)}\" initial-instance=\"2009-02-01T01:00Z\"" + + " timezone=\"UTC\">\n" + + " <uri-template>file:///tmp/coord/workflows/${YEAR}/${DAY}</uri-template>\n" + + " </dataset>\n" + + " </datasets>\n" + + " <input-events>\n" + + " <data-in name=\"A\" dataset=\"a\">\n" + + " <instance>${coord:latest(0)}</instance>\n" + + " </data-in>\n" + + " </input-events>\n" + + " <output-events>\n" + + " <data-out name=\"LOCAL_A\" dataset=\"local_a\">\n" + + " <instance>${coord:current(-1)}</instance>\n" + + " </data-out>\n" + + " </output-events>\n" + + " <action>\n" + + " <workflow>\n" + + " <app-path>hdfs:///tmp/workflows/</app-path>\n" + + " <configuration>\n" + + " <property>\n" + + " <name>inputA</name>\n" + + " <value>${coord:dataIn('A')}</value>\n" + + " </property>\n" + + " <property>\n" + + " <name>inputB</name>\n" + + " <value>${coord:dataOut('LOCAL_A')}</value>\n" + + " </property>\n" + + " </configuration>\n" + + " </workflow>\n" + + " </action>\n" + + "</coordinator-app>"; + + coordinatorValidator.validate(new StreamSource(new StringReader(COORD_APP1))); } public void testCoordSLASchema() throws Exception { - SchemaService wss = Services.get().get(SchemaService.class); - Validator validator = wss.getSchema(SchemaName.COORDINATOR) - .newValidator(); - String COORD_APP1 = "<coordinator-app name='NAME' frequency='${coord:days(1)}' start='2009-02-01T01:00Z' end='2009-02-03T23:59Z' timezone='UTC' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='uri:oozie:coordinator:0.2' xmlns:sla='uri:oozie:sla:0.1'> " - + "<controls> <timeout>10</timeout> <concurrency>2</concurrency> <execution>LIFO</execution> </controls> <datasets> <dataset name='a' frequency='${coord:days(7)}' initial-instance='2009-02-01T01:00Z' timezone='UTC'> <uri-template>file:///tmp/coord/workflows/${YEAR}/${DAY}</uri-template> </dataset> <dataset name='local_a' frequency='${coord:days(7)}' initial-instance='2009-02-01T01:00Z' timezone='UTC'> <uri-template>file:///tmp/coord/workflows/${YEAR}/${DAY}</uri-template> </dataset> </datasets> <input-events> <data-in name='A' dataset='a'> <instance>${coord:latest(0)}</instance> </data-in> </input-events> <output-events> <data-out name='LOCAL_A' dataset='local_a'> <instance>${coord:current(-1)}</instance> </data-out> </output-events> <action> <workflow> <app-path>hdfs:///tmp/workflows/</app-path> <configuration> <property> <name>inputA</name> <value>${coord:dataIn('A')}</value> </property> <property> <name>inputB</name> <value>${coord:dataOut('LOCAL_A')}</value> </p roperty></configuration> </workflow> " - + "<sla:info> <sla:app-name>5</sla:app-name> <sla:nominal-time>2009-03-06T010:00Z</sla:nominal-time> " - + "<sla:should-start>5</sla:should-start> <sla:should-end>50</sla:should-end> " - + "<sla:alert-contact>[email protected]</sla:alert-contact> <sla:dev-contact>[email protected]</sla:dev-contact>" - + " <sla:qa-contact>[email protected]</sla:qa-contact> <sla:se-contact>[email protected]</sla:se-contact>" - + "</sla:info>" + "</action> </coordinator-app>"; - - Element e = XmlUtils.parseXml(COORD_APP1); - // System.out.println("XML :"+ XmlUtils.prettyPrint(e)); - validator.validate(new StreamSource(new StringReader(COORD_APP1))); + String COORD_APP1 = "<?xml version=\"1.0\"?>\n" + + "<coordinator-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"uri:oozie:coordinator:0.2\"" + + " xmlns:sla=\"uri:oozie:sla:0.1\" name=\"NAME\" frequency=\"${coord:days(1)}\" start=\"2009-02-01T01:00Z\"" + + " end=\"2009-02-03T23:59Z\" timezone=\"UTC\">\n" + + " <controls>\n" + + " <timeout>10</timeout>\n" + + " <concurrency>2</concurrency>\n" + + " <execution>LIFO</execution>\n" + + " </controls>\n" + + " <datasets>\n" + + " <dataset name=\"a\" frequency=\"${coord:days(7)}\" initial-instance=\"2009-02-01T01:00Z\"" + + " timezone=\"UTC\">\n" + + " <uri-template>file:///tmp/coord/workflows/${YEAR}/${DAY}</uri-template>\n" + + " </dataset>\n" + + " <dataset name=\"local_a\" frequency=\"${coord:days(7)}\" initial-instance=\"2009-02-01T01:00Z\"" + + " timezone=\"UTC\">\n" + + " <uri-template>file:///tmp/coord/workflows/${YEAR}/${DAY}</uri-template>\n" + + " </dataset>\n" + + " </datasets>\n" + + " <input-events>\n" + + " <data-in name=\"A\" dataset=\"a\">\n" + + " <instance>${coord:latest(0)}</instance>\n" + + " </data-in>\n" + + " </input-events>\n" + + " <output-events>\n" + + " <data-out name=\"LOCAL_A\" dataset=\"local_a\">\n" + + " <instance>${coord:current(-1)}</instance>\n" + + " </data-out>\n" + + " </output-events>\n" + + " <action>\n" + + " <workflow>\n" + + " <app-path>hdfs:///tmp/workflows/</app-path>\n" + + " <configuration>\n" + + " <property>\n" + + " <name>inputA</name>\n" + + " <value>${coord:dataIn('A')}</value>\n" + + " </property>\n" + + " <property>\n" + + " <name>inputB</name>\n" + + " <value>${coord:dataOut('LOCAL_A')}</value>\n" + + " </property>\n" + + " </configuration>\n" + + " </workflow>\n" + + " <sla:info>\n" + + " <sla:app-name>5</sla:app-name>\n" + + " <sla:nominal-time>2009-03-06T010:00Z</sla:nominal-time>\n" + + " <sla:should-start>5</sla:should-start>\n" + + " <sla:should-end>50</sla:should-end>\n" + + " <sla:alert-contact>[email protected]</sla:alert-contact>\n" + + " <sla:dev-contact>[email protected]</sla:dev-contact>\n" + + " <sla:qa-contact>[email protected]</sla:qa-contact>\n" + + " <sla:se-contact>[email protected]</sla:se-contact>\n" + + " </sla:info>\n" + + " </action>\n" + + "</coordinator-app>"; + + coordinatorValidator.validate(new StreamSource(new StringReader(COORD_APP1))); } public void testBundleSchema() throws Exception { - SchemaService wss = Services.get().get(SchemaService.class); - Validator validator = wss.getSchema(SchemaName.BUNDLE).newValidator(); - String BUNDLE_APP = "<bundle-app name='NAME' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='uri:oozie:bundle:0.1'> " + String BUNDLE_APP = "<bundle-app name='NAME' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " + + " xmlns='uri:oozie:bundle:0.1'> " + "<controls> <kick-off-time>2009-02-02T00:00Z</kick-off-time> </controls> " + "<coordinator name='c12'> " + "<app-path>hdfs://localhost:9001/tmp/bundle-apps/coordinator1.xml</app-path>" + "<configuration> " + "<property> <name>START_TIME</name> <value>2009-02-01T00:00Z</value> </property> </configuration> " + "</coordinator></bundle-app>"; - Element e = XmlUtils.parseXml(BUNDLE_APP); - // System.out.println("XML :"+ XmlUtils.prettyPrint(e)); - validator.validate(new StreamSource(new StringReader(BUNDLE_APP))); + + bundleValidator.validate(new StreamSource(new StringReader(BUNDLE_APP))); } + public void testWfLauncherConfig() throws Exception { + workflowValidator.validate(new StreamSource(new StringReader(WF_GLOBAL_LAUNCHER_CONF))); + } + + public void testHiveActionLauncherConfig() throws Exception { + workflowValidator.validate(new StreamSource(new StringReader(HIVE_ACTION_LAUNCHER_CONF))); + } + + public void testHive2ActionLauncherConfig() throws Exception { + workflowValidator.validate(new StreamSource(new StringReader(HIVE2_ACTION_LAUNCHER_CONF))); + } + + public void testShellActionLauncherConfig() throws Exception { + workflowValidator.validate(new StreamSource(new StringReader(SHELL_ACTION_LAUNCHER_CONF))); + } + + public void testSqoopActionLauncherConfig() throws Exception { + workflowValidator.validate(new StreamSource(new StringReader(SQQP_ACTION_LAUNCHER_CONF))); + } + + public void testSparkActionLauncherConfig() throws Exception { + workflowValidator.validate(new StreamSource(new StringReader(SPARK_ACTION_LAUNCHER_CONF))); + } } http://git-wip-us.apache.org/repos/asf/oozie/blob/d135b88c/core/src/test/java/org/apache/oozie/util/TestMetricsInstrumentation.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/oozie/util/TestMetricsInstrumentation.java b/core/src/test/java/org/apache/oozie/util/TestMetricsInstrumentation.java index a882c82..ab97443 100644 --- a/core/src/test/java/org/apache/oozie/util/TestMetricsInstrumentation.java +++ b/core/src/test/java/org/apache/oozie/util/TestMetricsInstrumentation.java @@ -228,11 +228,11 @@ public class TestMetricsInstrumentation extends XTestCase { //Setting the id of the VM unique, so we can find it. String uniqueId = UUID.randomUUID().toString(); - System.setProperty("process.unique.id", uniqueId); + System.setProperty("processSettings.unique.id", uniqueId); //Finding our own VM by the id. for(VirtualMachineDescriptor d : VirtualMachine.list()) { - String remoteUniqueId = VirtualMachine.attach(d).getSystemProperties().getProperty("process.unique.id"); + String remoteUniqueId = VirtualMachine.attach(d).getSystemProperties().getProperty("processSettings.unique.id"); if(remoteUniqueId != null && remoteUniqueId.equals(uniqueId)) { descriptor = d; http://git-wip-us.apache.org/repos/asf/oozie/blob/d135b88c/core/src/test/java/org/apache/oozie/workflow/lite/TestLiteWorkflowAppParser.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/oozie/workflow/lite/TestLiteWorkflowAppParser.java b/core/src/test/java/org/apache/oozie/workflow/lite/TestLiteWorkflowAppParser.java index 2133240..a361078 100644 --- a/core/src/test/java/org/apache/oozie/workflow/lite/TestLiteWorkflowAppParser.java +++ b/core/src/test/java/org/apache/oozie/workflow/lite/TestLiteWorkflowAppParser.java @@ -25,15 +25,20 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.apache.hadoop.conf.Configuration; import org.apache.oozie.ErrorCode; +import org.apache.oozie.action.hadoop.LauncherAM; import org.apache.oozie.service.ConfigurationService; import org.apache.oozie.service.LiteWorkflowStoreService; import org.apache.oozie.service.SchemaService; import org.apache.oozie.service.Services; import org.apache.oozie.test.XTestCase; import org.apache.oozie.util.IOUtils; +import org.apache.oozie.util.XConfiguration; +import org.apache.oozie.util.XmlUtils; import org.apache.oozie.workflow.WorkflowException; import org.apache.oozie.workflow.lite.TestLiteWorkflowLib.TestActionNodeHandler; import org.apache.oozie.workflow.lite.TestLiteWorkflowLib.TestDecisionNodeHandler; +import org.jdom.Element; +import org.jdom.Namespace; public class TestLiteWorkflowAppParser extends XTestCase { public static String dummyConf = "<java></java>"; @@ -652,6 +657,42 @@ public class TestLiteWorkflowAppParser extends XTestCase { } } + public void testParserGlobalLauncherAM() throws Exception { + LiteWorkflowAppParser parser = new LiteWorkflowAppParser(null, + LiteWorkflowStoreService.LiteControlNodeHandler.class, + LiteWorkflowStoreService.LiteDecisionHandler.class, + LiteWorkflowStoreService.LiteActionHandler.class); + + LiteWorkflowApp workflowApp = parser.validateAndParse(IOUtils.getResourceAsReader("wf-schema-global-launcherconf.xml", -1), new Configuration()); + + XConfiguration xconf = extractConfig(workflowApp, "action1"); + + assertEquals("Vcores", 2, xconf.getInt(LauncherAM.OOZIE_LAUNCHER_VCORES_PROPERTY, Integer.MIN_VALUE)); + assertEquals("Memory", 1024, xconf.getInt(LauncherAM.OOZIE_LAUNCHER_MEMORY_MB_PROPERTY, Integer.MIN_VALUE)); + assertEquals("Env", "dummyEnv", xconf.get(LauncherAM.OOZIE_LAUNCHER_ENV_PROPERTY)); + assertEquals("Queue", "dummyQueue", xconf.get(LauncherAM.OOZIE_LAUNCHER_QUEUE_PROPERTY)); + assertEquals("Java opts", "dummyJavaOpts", xconf.get(LauncherAM.OOZIE_LAUNCHER_JAVAOPTS_PROPERTY)); + assertEquals("Sharelib", "a,b,c", xconf.get(LauncherAM.OOZIE_LAUNCHER_SHARELIB_PROPERTY)); + } + + public void testParserGlobalLauncherAMOverridden() throws Exception { + LiteWorkflowAppParser parser = new LiteWorkflowAppParser(null, + LiteWorkflowStoreService.LiteControlNodeHandler.class, + LiteWorkflowStoreService.LiteDecisionHandler.class, + LiteWorkflowStoreService.LiteActionHandler.class); + + LiteWorkflowApp workflowApp = parser.validateAndParse(IOUtils.getResourceAsReader("wf-schema-global-launcherconf-override.xml", -1), new Configuration()); + + XConfiguration xconf = extractConfig(workflowApp, "a"); + + assertEquals("Vcores", 1, xconf.getInt(LauncherAM.OOZIE_LAUNCHER_VCORES_PROPERTY, Integer.MIN_VALUE)); + assertEquals("Memory", 2048, xconf.getInt(LauncherAM.OOZIE_LAUNCHER_MEMORY_MB_PROPERTY, Integer.MIN_VALUE)); + assertEquals("Java opts", "dummyJavaOpts", xconf.get(LauncherAM.OOZIE_LAUNCHER_JAVAOPTS_PROPERTY)); + assertNull("Queue", xconf.get(LauncherAM.OOZIE_LAUNCHER_QUEUE_PROPERTY)); + assertNull("Env", xconf.get(LauncherAM.OOZIE_LAUNCHER_ENV_PROPERTY)); + assertNull("Sharelib", xconf.get(LauncherAM.OOZIE_LAUNCHER_SHARELIB_PROPERTY)); + } + /* * 1->ok->2 * 2->ok->end @@ -1604,4 +1645,14 @@ public class TestLiteWorkflowAppParser extends XTestCase { assertEquals(app.getNode("retry").getUserRetryInterval(), "10"); } + private XConfiguration extractConfig(LiteWorkflowApp app, String actionNode) throws Exception { + String confXML = app.getNode(actionNode).getConf(); + Element confElement = XmlUtils.parseXml(confXML); + Namespace ns = confElement.getNamespace(); + String configSection = XmlUtils.prettyPrint(confElement.getChild("configuration", ns)).toString(); + XConfiguration xconf = new XConfiguration(new StringReader(configSection)); + + return xconf; + } + } http://git-wip-us.apache.org/repos/asf/oozie/blob/d135b88c/core/src/test/resources/wf-schema-global-launcherconf-override.xml ---------------------------------------------------------------------- diff --git a/core/src/test/resources/wf-schema-global-launcherconf-override.xml b/core/src/test/resources/wf-schema-global-launcherconf-override.xml new file mode 100644 index 0000000..405130c --- /dev/null +++ b/core/src/test/resources/wf-schema-global-launcherconf-override.xml @@ -0,0 +1,56 @@ +<!-- + 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. +--> +<workflow-app xmlns="uri:oozie:workflow:1.0" name="test-wf"> + <global> + <launcher> + <vcores>2</vcores> + <memory.mb>1024</memory.mb> + <java-opts>dummyJavaOpts</java-opts> + </launcher> + </global> + + <start to="a"/> + + <action name="a"> + <hive xmlns="uri:oozie:hive-action:1.0"> + <job-tracker>foo</job-tracker> + <name-node>bar</name-node> + <launcher> + <vcores>1</vcores> + <memory.mb>2048</memory.mb> + </launcher> + <configuration> + <property> + <name>c</name> + <value>C</value> + </property> + </configuration> + <script>script.q</script> + <param>INPUT=/tmp/table</param> + <param>OUTPUT=/tmp/hive</param> + </hive> + <ok to="e"/> + <error to="k"/> + </action> + + <kill name="k"> + <message>kill</message> + </kill> + + <end name="e"/> +</workflow-app> http://git-wip-us.apache.org/repos/asf/oozie/blob/d135b88c/core/src/test/resources/wf-schema-global-launcherconf.xml ---------------------------------------------------------------------- diff --git a/core/src/test/resources/wf-schema-global-launcherconf.xml b/core/src/test/resources/wf-schema-global-launcherconf.xml new file mode 100644 index 0000000..9cd4f6c --- /dev/null +++ b/core/src/test/resources/wf-schema-global-launcherconf.xml @@ -0,0 +1,45 @@ +<!-- + 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. +--> +<workflow-app xmlns="uri:oozie:workflow:1.0" name="test-wf"> + <global> + <launcher> + <memory.mb>1024</memory.mb> + <vcores>2</vcores> + <java-opts>dummyJavaOpts</java-opts> + <env>dummyEnv</env> + <queue>dummyQueue</queue> + <sharelib>a,b,c</sharelib> + </launcher> + </global> + + <start to="action1"/> + + <action name="action1"> + <fs> + <mkdir path='/tmp'/> + </fs> + <ok to="end"/> + <error to="kill"/> + </action> + + <kill name="kill"> + <message>kill</message> + </kill> + + <end name="end"/> +</workflow-app> http://git-wip-us.apache.org/repos/asf/oozie/blob/d135b88c/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index db18f30..efccc34 100644 --- a/pom.xml +++ b/pom.xml @@ -107,7 +107,7 @@ <jline.version>0.9.94</jline.version> <openjpa.version>2.4.2</openjpa.version> - <xerces.version>2.10.0</xerces.version> + <xerces.version>2.11.0</xerces.version> <curator.version>2.5.0</curator.version> <jackson.version>1.9.13</jackson.version> <log4j.version>1.2.17</log4j.version> http://git-wip-us.apache.org/repos/asf/oozie/blob/d135b88c/release-log.txt ---------------------------------------------------------------------- diff --git a/release-log.txt b/release-log.txt index 1fb1a1d..82621ca 100644 --- a/release-log.txt +++ b/release-log.txt @@ -1,5 +1,6 @@ -- Oozie 5.0.0 release (trunk - unreleased) +OOZIE-2687 Create XML schema for launcher configurations (asasvari) OOZIE-3041 TestWorkflowActionRetryInfoXCommand fails in oozie core module (andras.piros via gezapeti) OOZIE-2916 Set a job name for the MR Action's child job (asasvari) OOZIE-2858 HiveMain, ShellMain and SparkMain should not overwrite properties and config files locally (gezapeti) http://git-wip-us.apache.org/repos/asf/oozie/blob/d135b88c/sharelib/oozie/src/main/java/org/apache/oozie/action/hadoop/LauncherAM.java ---------------------------------------------------------------------- diff --git a/sharelib/oozie/src/main/java/org/apache/oozie/action/hadoop/LauncherAM.java b/sharelib/oozie/src/main/java/org/apache/oozie/action/hadoop/LauncherAM.java index 6a98d6e..3e6ffc9 100644 --- a/sharelib/oozie/src/main/java/org/apache/oozie/action/hadoop/LauncherAM.java +++ b/sharelib/oozie/src/main/java/org/apache/oozie/action/hadoop/LauncherAM.java @@ -49,6 +49,14 @@ public class LauncherAM { public static final String OOZIE_ACTION_CONF_XML = "oozie.action.conf.xml"; public static final String OOZIE_LAUNCHER_JOB_ID = "oozie.launcher.job.id"; + public static final String OOZIE_LAUNCHER_VCORES_PROPERTY = "oozie.launcher.vcores"; + public static final String OOZIE_LAUNCHER_MEMORY_MB_PROPERTY = "oozie.launcher.memory.mb"; + public static final String OOZIE_LAUNCHER_PRIORITY_PROPERTY = "oozie.launcher.priority"; + public static final String OOZIE_LAUNCHER_QUEUE_PROPERTY = "oozie.launcher.queue"; + public static final String OOZIE_LAUNCHER_JAVAOPTS_PROPERTY = "oozie.launcher.javaopts"; + public static final String OOZIE_LAUNCHER_ENV_PROPERTY = "oozie.launcher.env"; + public static final String OOZIE_LAUNCHER_SHARELIB_PROPERTY = "oozie.launcher.sharelib"; + public static final String JAVA_CLASS_PATH = "java.class.path"; public static final String OOZIE_ACTION_ID = "oozie.action.id"; public static final String OOZIE_JOB_ID = "oozie.job.id"; http://git-wip-us.apache.org/repos/asf/oozie/blob/d135b88c/sharelib/pig/src/test/java/org/apache/oozie/action/hadoop/UDFTester.java ---------------------------------------------------------------------- diff --git a/sharelib/pig/src/test/java/org/apache/oozie/action/hadoop/UDFTester.java b/sharelib/pig/src/test/java/org/apache/oozie/action/hadoop/UDFTester.java index ff999ff..c0e2ec3 100644 --- a/sharelib/pig/src/test/java/org/apache/oozie/action/hadoop/UDFTester.java +++ b/sharelib/pig/src/test/java/org/apache/oozie/action/hadoop/UDFTester.java @@ -39,7 +39,7 @@ public class UDFTester extends EvalFunc<String> { return query.toLowerCase().trim(); } catch (Exception e) { - System.err.println("ToLower: failed to process input; error - " + e.getMessage()); + System.err.println("ToLower: failed to processSettings input; error - " + e.getMessage()); return null; } }
