blob: 5e9a1213a4405bfe8a6b13eb67f363f71c9a8952 [file] [log] [blame]
/**
* 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.
*/
package org.apache.oozie.coord;
import java.io.StringReader;
import java.util.Date;
import org.apache.hadoop.conf.Configuration;
import org.apache.oozie.service.Services;
import org.apache.oozie.test.XTestCase;
import org.apache.oozie.util.DateUtils;
import org.apache.oozie.util.ELEvaluator;
import org.apache.oozie.util.XConfiguration;
import org.apache.oozie.util.XmlUtils;
import org.jdom.Element;
public class TestCoordELEvaluator extends XTestCase {
@Override
public void setUp() throws Exception {
super.setUp();
new Services().init();
}
@Override
protected void tearDown() throws Exception {
if (Services.get() != null) {
Services.get().destroy();
}
super.tearDown();
}
public void testCreateFreqELValuator() throws Exception {
// System.out.println("CP :" + System.getProperty("java.class.path"));
// Configuration conf = new
// XConfiguration(IOUtils.getResourceAsReader("org/apache/oozie/coord/conf.xml",
// -1));
Configuration conf = new XConfiguration(new StringReader(
getConfString()));
ELEvaluator eval = CoordELEvaluator.createELEvaluatorForGroup(conf,
"coord-job-submit-freq");
String expr = "<coordinator-app name=\"mycoordinator-app\" start=\"${start}\" end=\"${end}\""
+ " frequency=\"${coord:hours(12)}\"><data-in name=\"A\" dataset=\"a\"></data-in>";
String reply = expr.replace("${start}", conf.get("start")).replace(
"${end}", conf.get("end")).replace("${coord:hours(12)}", "720");
assertEquals(reply, CoordELFunctions.evalAndWrap(eval, expr));
expr = "<coordinator-app name=\"mycoordinator-app\" start=\"${start}\" end=\"${end}\""
+ " frequency=\"${coord:days(7)}\"><data-in name=\"A\" dataset=\"a\"></data-in>";
reply = expr.replace("${start}", conf.get("start")).replace("${end}",
conf.get("end")).replace("${coord:days(7)}", "7");
assertEquals(reply, CoordELFunctions.evalAndWrap(eval, expr));
expr = "<coordinator-app name=\"mycoordinator-app\" start=\"${start}\" end=\"${end}\""
+ " frequency=\"${coord:months(1)}\"><data-in name=\"A\" dataset=\"a\"></data-in>";
reply = expr.replace("${start}", conf.get("start")).replace("${end}",
conf.get("end")).replace("${coord:months(1)}", "1");
// System.out.println("****testCreateELValuator :"+
// CoordELFunctions.evaluateFunction(eval, expr));
assertEquals(reply, CoordELFunctions.evalAndWrap(eval, expr));
expr = "frequency=${coord:days(2)}";
expr = "frequency=60";
CoordELFunctions.evalAndWrap(eval, expr);
expr = "frequency=${coord:daysInMonth(2)}";
try {
CoordELFunctions.evalAndWrap(eval, expr);
fail();
}
catch (Exception ex) {
}
expr = "frequency=${coord:hoursInDay(2)}";
try {
CoordELFunctions.evalAndWrap(eval, expr);
fail();
}
catch (Exception ex) {
}
expr = "frequency=${coord:tzOffset()}";
try {
CoordELFunctions.evalAndWrap(eval, expr);
fail();
}
catch (Exception ex) {
}
expr = "<frequency=120";
assertEquals(expr, CoordELFunctions.evalAndWrap(eval, expr));
}
public void testCreateURIELEvaluator() throws Exception {
ELEvaluator eval = CoordELEvaluator
.createURIELEvaluator("2009-08-09T23:59Z");
String expr = "hdfs://p1/p2/${YEAR}/${MONTH}/${DAY}/${HOUR}/${MINUTE}/";
// System.out.println("OUTPUT "+ eval.evaluate(expr, String.class));
assertEquals("hdfs://p1/p2/2009/08/09/23/59/", CoordELFunctions
.evalAndWrap(eval, expr));
expr = "hdfs://p1/p2/${YEAR}/${MONTH}/${DAY}/${MINUTE}/";
assertEquals("hdfs://p1/p2/2009/08/09/59/", CoordELFunctions
.evalAndWrap(eval, expr));
}
public void testCreateDataEvaluator() throws Exception {
String jobXml = "<coordinator-app name=\"mycoordinator-app\" start=\"2009-02-01T01:00GMT\""
+ " end=\"2009-02-03T23:59GMT\" timezone=\"UTC\"";
jobXml += " frequency=\"720\" freq_timeunit=\"MINUTE\"";
jobXml += " action-nominal-time='2009-09-01T00:00Z' action-actual-time='2010-10-01T00:00Z'>";
jobXml += "<input-events><data-in name=\"A\" dataset=\"a\">"
+ "<uris>file:///tmp/coord/US/2009/1/30|file:///tmp/coord/US/2009/1/31</uris>";
jobXml += "<dataset name=\"a\" frequency=\"1440\" initial-instance=\"2009-01-01T00:00Z\">";
jobXml += "<uri-template>file:///tmp/coord/US/${YEAR}/${MONTH}/${DAY}</uri-template></dataset></data-in></input-events>";
jobXml += "<action><workflow><url>http://foobar.com:8080/oozie</url>"
+ "<app-path>hdfs://foobarfoobar.com:9000/usr/tucu/mywf</app-path>";
jobXml += "<configuration><property><name>inputA</name><value>${coord:dataIn('A')}</value></property>";
jobXml += "<property><name>ACTIONID</name><value>${coord:actionId()}</value></property>";
jobXml += "<property><name>NAME</name><value>${coord:name()}</value></property>";
jobXml += "<property><name>NOMINALTIME</name><value>${coord:nominalTime()}</value></property>";
jobXml += "<property><name>ACTUALTIME</name><value>${coord:actualTime()}</value></property>";
jobXml += "</configuration></workflow></action></coordinator-app>";
String reply = "<action><workflow><url>http://foobar.com:8080/oozie</url>"
+ "<app-path>hdfs://foobarfoobar.com:9000/usr/tucu/mywf</app-path>";
reply += "<configuration><property><name>inputA</name>"
+ "<value>file:///tmp/coord/US/2009/1/30|file:///tmp/coord/US/2009/1/31</value></property>";
reply += "<property><name>ACTIONID</name><value>00000-oozie-C@1</value></property>";
reply += "<property><name>NAME</name><value>mycoordinator-app</value></property>";
reply += "<property><name>NOMINALTIME</name><value>2009-09-01T00:00Z</value></property>";
reply += "<property><name>ACTUALTIME</name><value>2010-10-01T00:00Z</value></property>";
reply += "</configuration></workflow></action>";
Element eJob = XmlUtils.parseXml(jobXml);
Configuration conf = new XConfiguration(new StringReader(getConfString()));
ELEvaluator eval = CoordELEvaluator.createDataEvaluator(eJob, conf, "00000-oozie-C@1");
Element action = eJob.getChild("action", eJob.getNamespace());
String str = XmlUtils.prettyPrint(action).toString();
assertEquals(XmlUtils.prettyPrint(XmlUtils.parseXml(reply)).toString(), CoordELFunctions.evalAndWrap(eval, str));
}
public void testCreateInstancesELEvaluator() throws Exception {
String dataEvntXML = "<data-in name=\"A\" dataset=\"a\">"
+ "<uris>file:///tmp/coord/US/2009/1/30|file:///tmp/coord/US/2009/1/31</uris>";
dataEvntXML += "<dataset name=\"a\" frequency=\"1440\" initial-instance=\"2009-01-01T00:00Z\""
+ " freq_timeunit=\"MINUTE\" timezone=\"UTC\" end_of_duration=\"NONE\">";
dataEvntXML += "<uri-template>file:///tmp/coord/US/${YEAR}/${MONTH}/${DAY}</uri-template></dataset></data-in>";
Element event = XmlUtils.parseXml(dataEvntXML);
SyncCoordAction appInst = new SyncCoordAction();
appInst.setNominalTime(DateUtils.parseDateOozieTZ("2009-09-08T01:00Z"));
appInst.setActualTime(DateUtils.parseDateOozieTZ("2010-10-01T00:00Z"));
appInst.setTimeUnit(TimeUnit.MINUTE);
// Configuration conf = new
// XConfiguration(IOUtils.getResourceAsReader("org/apache/oozie/coord/conf.xml",
// -1));
Configuration conf = new XConfiguration(new StringReader(
getConfString()));
ELEvaluator eval = CoordELEvaluator.createInstancesELEvaluator(event,
appInst, conf);
String expr = "${coord:current(0)}";
// System.out.println("OUTPUT :" + eval.evaluate(expr, String.class));
assertEquals("2009-09-08T00:00Z", eval.evaluate(expr, String.class));
}
public void testCreateLazyEvaluator() throws Exception {
// Configuration conf = new
// XConfiguration(IOUtils.getResourceAsReader("org/apache/oozie/coord/conf.xml",
// -1));
String testCaseDir = getTestCaseDir();
Configuration conf = new XConfiguration(new StringReader(getConfString()));
Date actualTime = DateUtils.parseDateOozieTZ("2009-09-01T01:00Z");
Date nominalTime = DateUtils.parseDateOozieTZ("2009-09-01T00:00Z");
String dataEvntXML = "<data-in name=\"A\" dataset=\"a\"><uris>" + getTestCaseFileUri("US/2009/1/30")
+ "|file:///tmp/coord/US/2009/1/31</uris>";
dataEvntXML += "<dataset name=\"a\" frequency=\"1440\" initial-instance=\"2009-01-01T00:00Z\""
+ " freq_timeunit=\"MINUTE\" timezone=\"UTC\" end_of_duration=\"NONE\">";
dataEvntXML += "<uri-template>" + getTestCaseFileUri("${YEAR}/${MONTH}/${DAY}") + "</uri-template></dataset></data-in>";
Element dEvent = XmlUtils.parseXml(dataEvntXML);
ELEvaluator eval = CoordELEvaluator.createLazyEvaluator(actualTime, nominalTime, dEvent, conf);
createTestCaseSubDir("2009/01/02/_SUCCESS".split("/"));
String expr = "${coord:latest(0)} ${coord:latest(-1)}";
// Dependent on the directory structure
// TODO: Create the directory
assertEquals("2009-01-02T00:00Z ${coord:latest(-1)}", eval.evaluate(expr, String.class));
// future
createTestCaseSubDir("2009/09/04/_SUCCESS".split("/"));
createTestCaseSubDir("2009/09/05/_SUCCESS".split("/"));
expr = "${coord:future(1, 30)}";
assertEquals("2009-09-05T00:00Z", eval.evaluate(expr, String.class));
// System.out.println("OUTPUT :" + eval.evaluate(expr, String.class));
}
public void testCleanup() throws Exception {
Services.get().destroy();
}
private String getConfString() {
StringBuilder conf = new StringBuilder();
conf.append("<configuration> <property><name>baseFsURI</name> <value>file:///tmp/coord/</value> </property>");
conf.append("<property><name>language</name> <value>en</value> </property>");
conf
.append("<property> <name>country</name> <value>US</value> </property> "
+ "<property> <name>market</name> <value>teens</value> </property> "
+ "<property> <name>app_path</name> <value>file:///tmp/coord/workflows</value> </property> "
+ "<property> <name>start</name> <value>2009-02-01T01:00Z</value> </property>"
+ "<property> <name>end</name> <value>2009-02-03T23:59Z</value> </property> "
+ "<property> <name>timezone</name> <value>UTC</value> </property> "
+ "<property> <name>user.name</name> <value>test_user</value> </property> "
+ "<property> <name>timeout</name> <value>180</value> </property> "
+ "<property> <name>concurrency_level</name> <value>1</value> </property> "
+ "<property> <name>execution_order</name> <value>LIFO</value> </property>"
+ "<property> <name>include_ds_files</name> <value>file:///homes/" + getTestUser()
+ "/workspace/oozie-main/core/src/main/java/org/apache/oozie/coord/datasets.xml</value>"
+ " </property></configuration>");
return conf.toString();
}
}