Repository: oozie
Updated Branches:
  refs/heads/master 0b4d3521a -> 5045f89cf


OOZIE-1725 add coord EL functions to be used in SLA tag (ryota)


Project: http://git-wip-us.apache.org/repos/asf/oozie/repo
Commit: http://git-wip-us.apache.org/repos/asf/oozie/commit/5045f89c
Tree: http://git-wip-us.apache.org/repos/asf/oozie/tree/5045f89c
Diff: http://git-wip-us.apache.org/repos/asf/oozie/diff/5045f89c

Branch: refs/heads/master
Commit: 5045f89cf1042721b9f7fd8b070390b8e0afef7e
Parents: 0b4d352
Author: egashira <[email protected]>
Authored: Tue Apr 1 18:14:59 2014 -0700
Committer: egashira <[email protected]>
Committed: Tue Apr 1 18:14:59 2014 -0700

----------------------------------------------------------------------
 .../oozie/command/coord/CoordCommandUtils.java  | 14 +++----
 .../command/coord/CoordSubmitXCommand.java      |  2 +-
 .../apache/oozie/coord/CoordELEvaluator.java    | 43 ++++++++++++++++++--
 core/src/main/resources/oozie-default.xml       | 24 ++++++++++-
 .../TestCoordActionMaterializeCommand.java      | 40 +++++++++++++-----
 .../command/coord/TestCoordSubmitXCommand.java  | 15 ++++++-
 .../oozie/coord/TestCoordELFunctions.java       | 16 ++++++++
 .../apache/oozie/coord/TestHCatELFunctions.java | 33 +++++++++++++++
 release-log.txt                                 |  1 +
 9 files changed, 161 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/oozie/blob/5045f89c/core/src/main/java/org/apache/oozie/command/coord/CoordCommandUtils.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/oozie/command/coord/CoordCommandUtils.java 
b/core/src/main/java/org/apache/oozie/command/coord/CoordCommandUtils.java
index b00eb7b..8d7b732 100644
--- a/core/src/main/java/org/apache/oozie/command/coord/CoordCommandUtils.java
+++ b/core/src/main/java/org/apache/oozie/command/coord/CoordCommandUtils.java
@@ -413,20 +413,21 @@ public class CoordCommandUtils {
     }
 
     /**
-     * @param eSla
-     * @param nominalTime
+     * @param eAction
+     * @param coordAction
      * @param conf
      * @return boolean to determine whether the SLA element is present or not
      * @throws CoordinatorJobException
      */
-    public static boolean materializeSLA(Element eSla, Date nominalTime, 
Configuration conf)
+    public static boolean materializeSLA(Element eAction, 
CoordinatorActionBean coordAction, Configuration conf)
             throws CoordinatorJobException {
+        Element eSla = eAction.getChild("action", 
eAction.getNamespace()).getChild("info", eAction.getNamespace("sla"));
         if (eSla == null) {
             // eAppXml.getNamespace("sla"));
             return false;
         }
         try {
-            ELEvaluator evalSla = 
CoordELEvaluator.createSLAEvaluator(nominalTime, conf);
+            ELEvaluator evalSla = CoordELEvaluator.createSLAEvaluator(eAction, 
coordAction, conf);
             List<Element> elemList = eSla.getChildren();
             for (Element elem : elemList) {
                 String updated;
@@ -500,10 +501,6 @@ public class CoordCommandUtils {
         eAction.setAttribute("action-nominal-time", 
DateUtils.formatDateOozieTZ(nominalTime));
         eAction.setAttribute("action-actual-time", 
DateUtils.formatDateOozieTZ(actualTime));
 
-        boolean isSla = CoordCommandUtils.materializeSLA(
-                eAction.getChild("action", 
eAction.getNamespace()).getChild("info", eAction.getNamespace("sla")),
-                nominalTime, conf);
-
         // Setting up action bean
         actionBean.setCreatedConf(XmlUtils.prettyPrint(conf).toString());
         actionBean.setRunConf(XmlUtils.prettyPrint(conf).toString());
@@ -524,6 +521,7 @@ public class CoordCommandUtils {
             }
         }
         actionBean.setNominalTime(nominalTime);
+        boolean isSla = CoordCommandUtils.materializeSLA(eAction, actionBean, 
conf);
         if (isSla == true) {
             actionBean.setSlaXml(XmlUtils.prettyPrint(
                     eAction.getChild("action", 
eAction.getNamespace()).getChild("info", eAction.getNamespace("sla")))

http://git-wip-us.apache.org/repos/asf/oozie/blob/5045f89c/core/src/main/java/org/apache/oozie/command/coord/CoordSubmitXCommand.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/oozie/command/coord/CoordSubmitXCommand.java 
b/core/src/main/java/org/apache/oozie/command/coord/CoordSubmitXCommand.java
index 9e6a3d5..d215180 100644
--- a/core/src/main/java/org/apache/oozie/command/coord/CoordSubmitXCommand.java
+++ b/core/src/main/java/org/apache/oozie/command/coord/CoordSubmitXCommand.java
@@ -635,7 +635,6 @@ public class CoordSubmitXCommand extends 
SubmitTransitionXCommand {
         evalFreq = CoordELEvaluator.createELEvaluatorForGroup(conf, 
"coord-job-submit-freq");
         evalNofuncs = CoordELEvaluator.createELEvaluatorForGroup(conf, 
"coord-job-submit-nofuncs");
         evalInst = CoordELEvaluator.createELEvaluatorForGroup(conf, 
"coord-job-submit-instances");
-        evalSla = CoordELEvaluator.createELEvaluatorForGroup(conf, 
"coord-sla-submit");
         evalAction = CoordELEvaluator.createELEvaluatorForGroup(conf, 
"coord-action-start");
         evalTimeout = CoordELEvaluator.createELEvaluatorForGroup(conf, 
"coord-job-wait-timeout");
     }
@@ -782,6 +781,7 @@ public class CoordSubmitXCommand extends 
SubmitTransitionXCommand {
                 resolveTagContents("value", tmpProp, evalData);
             }
         }
+        evalSla = CoordELEvaluator.createELEvaluatorForDataAndConf(conf, 
"coord-sla-submit", dataNameList);
         resolveSLA(eAppXml, coordJob);
         return eAppXml;
     }

http://git-wip-us.apache.org/repos/asf/oozie/blob/5045f89c/core/src/main/java/org/apache/oozie/coord/CoordELEvaluator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/coord/CoordELEvaluator.java 
b/core/src/main/java/org/apache/oozie/coord/CoordELEvaluator.java
index 0341aa1..87f298d 100644
--- a/core/src/main/java/org/apache/oozie/coord/CoordELEvaluator.java
+++ b/core/src/main/java/org/apache/oozie/coord/CoordELEvaluator.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.hadoop.conf.Configuration;
+import org.apache.oozie.CoordinatorActionBean;
 import org.apache.oozie.command.coord.CoordCommandUtils;
 import org.apache.oozie.service.ELService;
 import org.apache.oozie.service.Services;
@@ -113,18 +114,52 @@ public class CoordELEvaluator {
 
     /**
      * Create a SLA evaluator to be used during Materialization
-     *
-     * @param nominalTime
+     * @param eAction
+     * @param coordAction
      * @param conf
      * @return
      * @throws Exception
      */
-    public static ELEvaluator createSLAEvaluator(Date nominalTime, 
Configuration conf) throws Exception {
+    public static ELEvaluator createSLAEvaluator(Element eAction, 
CoordinatorActionBean coordAction, Configuration conf)
+            throws Exception {
         ELEvaluator eval = 
Services.get().get(ELService.class).createEvaluator("coord-sla-create");
         setConfigToEval(eval, conf);
         SyncCoordAction appInst = new SyncCoordAction();// TODO:
-        appInst.setNominalTime(nominalTime);
+        appInst.setNominalTime(coordAction.getNominalTime());
+        appInst.setActualTime(coordAction.getCreatedTime());
+        appInst.setActionId(coordAction.getId());
+        appInst.setName(eAction.getAttributeValue("name"));
         CoordELFunctions.configureEvaluator(eval, null, appInst);
+
+        Element events = eAction.getChild("output-events", 
eAction.getNamespace());
+        if (events != null) {
+            for (Object obj : events.getChildren("data-out", 
eAction.getNamespace())) {
+                Element data = (Element) obj;
+                if (data.getChild("uris", data.getNamespace()) != null) {
+                    String uris = data.getChild("uris", 
data.getNamespace()).getTextTrim();
+                    uris = 
uris.replaceAll(CoordELFunctions.INSTANCE_SEPARATOR, 
CoordELFunctions.DIR_SEPARATOR);
+                    eval.setVariable(".dataout." + 
data.getAttributeValue("name"), uris);
+                }
+                if (data.getChild(CoordCommandUtils.UNRESOLVED_INST_TAG, 
data.getNamespace()) != null) {
+                    eval.setVariable(".dataout." + 
data.getAttributeValue("name") + ".unresolved", "true");
+                }
+            }
+        }
+        return eval;
+    }
+
+    /**
+     * Create an Evaluator using conf and input/output-data (used for sla)
+     * @param conf
+     * @param group
+     * @param dataNameList
+     * @return
+     * @throws Exception
+     */
+    public static ELEvaluator createELEvaluatorForDataAndConf(Configuration 
conf, String group,
+            HashMap<String, String> dataNameList) throws Exception {
+        ELEvaluator eval = createELEvaluatorForDataEcho(conf, group, 
dataNameList);
+        setConfigToEval(eval, conf);
         return eval;
     }
 

http://git-wip-us.apache.org/repos/asf/oozie/blob/5045f89c/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 34362aa..0198230 100644
--- a/core/src/main/resources/oozie-default.xml
+++ b/core/src/main/resources/oozie-default.xml
@@ -915,9 +915,19 @@
     <property>
         <name>oozie.service.ELService.functions.coord-sla-submit</name>
         <value>
+            
coord:dataOut=org.apache.oozie.coord.CoordELFunctions#ph1_coord_dataOut_echo,
             
coord:nominalTime=org.apache.oozie.coord.CoordELFunctions#ph1_coord_nominalTime_echo_fixed,
+            
coord:actualTime=org.apache.oozie.coord.CoordELFunctions#ph1_coord_actualTime_echo_wrap,
+            
coord:dateOffset=org.apache.oozie.coord.CoordELFunctions#ph1_coord_dateOffset_echo,
+            
coord:formatTime=org.apache.oozie.coord.CoordELFunctions#ph1_coord_formatTime_echo,
+            
coord:actionId=org.apache.oozie.coord.CoordELFunctions#ph1_coord_actionId_echo,
+            
coord:name=org.apache.oozie.coord.CoordELFunctions#ph1_coord_name_echo,
             coord:conf=org.apache.oozie.coord.CoordELFunctions#coord_conf,
-            coord:user=org.apache.oozie.coord.CoordELFunctions#coord_user
+            coord:user=org.apache.oozie.coord.CoordELFunctions#coord_user,
+            
coord:databaseOut=org.apache.oozie.coord.HCatELFunctions#ph1_coord_databaseOut_echo,
+            
coord:tableOut=org.apache.oozie.coord.HCatELFunctions#ph1_coord_tableOut_echo,
+            
coord:dataOutPartitions=org.apache.oozie.coord.HCatELFunctions#ph1_coord_dataOutPartitions_echo,
+            
coord:dataOutPartitionValue=org.apache.oozie.coord.HCatELFunctions#ph1_coord_dataOutPartitionValue_echo
         </value>
         <description>
             EL functions declarations, separated by commas, format is 
[PREFIX:]NAME=CLASS#METHOD.
@@ -1072,9 +1082,19 @@
     <property>
         <name>oozie.service.ELService.functions.coord-sla-create</name>
         <value>
+            
coord:dataOut=org.apache.oozie.coord.CoordELFunctions#ph3_coord_dataOut,
             
coord:nominalTime=org.apache.oozie.coord.CoordELFunctions#ph2_coord_nominalTime,
+            
coord:actualTime=org.apache.oozie.coord.CoordELFunctions#ph2_coord_actualTime,
+            
coord:dateOffset=org.apache.oozie.coord.CoordELFunctions#ph2_coord_dateOffset,
+            
coord:formatTime=org.apache.oozie.coord.CoordELFunctions#ph2_coord_formatTime,
+            
coord:actionId=org.apache.oozie.coord.CoordELFunctions#ph2_coord_actionId,
+            coord:name=org.apache.oozie.coord.CoordELFunctions#ph2_coord_name,
             coord:conf=org.apache.oozie.coord.CoordELFunctions#coord_conf,
-            coord:user=org.apache.oozie.coord.CoordELFunctions#coord_user
+            coord:user=org.apache.oozie.coord.CoordELFunctions#coord_user,
+            
coord:databaseOut=org.apache.oozie.coord.HCatELFunctions#ph3_coord_databaseOut,
+            
coord:tableOut=org.apache.oozie.coord.HCatELFunctions#ph3_coord_tableOut,
+            
coord:dataOutPartitions=org.apache.oozie.coord.HCatELFunctions#ph3_coord_dataOutPartitions,
+            
coord:dataOutPartitionValue=org.apache.oozie.coord.HCatELFunctions#ph3_coord_dataOutPartitionValue
         </value>
         <description>
             EL functions declarations, separated by commas, format is 
[PREFIX:]NAME=CLASS#METHOD.

http://git-wip-us.apache.org/repos/asf/oozie/blob/5045f89c/core/src/test/java/org/apache/oozie/command/coord/TestCoordActionMaterializeCommand.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/oozie/command/coord/TestCoordActionMaterializeCommand.java
 
b/core/src/test/java/org/apache/oozie/command/coord/TestCoordActionMaterializeCommand.java
index c5a04d7..6278515 100644
--- 
a/core/src/test/java/org/apache/oozie/command/coord/TestCoordActionMaterializeCommand.java
+++ 
b/core/src/test/java/org/apache/oozie/command/coord/TestCoordActionMaterializeCommand.java
@@ -51,12 +51,23 @@ public class TestCoordActionMaterializeCommand extends 
XTestCase {
 
     public void testActionMater() throws Exception {
         String jobId = "0000000-" + new Date().getTime() + 
"-testActionMater-C";
-
-        Date startTime = DateUtils.parseDateOozieTZ("2009-03-06T010:00Z");
+        String startTimeStr = "2009-03-06T10:00Z";
+        Date startTime = DateUtils.parseDateOozieTZ(startTimeStr);
         Date endTime = DateUtils.parseDateOozieTZ("2009-03-11T10:00Z");
         addRecordToJobTable(jobId, startTime, endTime);
         new CoordActionMaterializeCommand(jobId, startTime, endTime).call();
         CoordinatorActionBean action = checkCoordAction(jobId + "@1");
+        assertEquals(action.getActionNumber(), 1);
+        assertEquals(action.getNominalTime(), startTime);
+        
assertTrue(action.getMissingDependencies().indexOf("file:///tmp/coord/workflows/2009/03/01")
 > -1);
+        String actionXml = action.getActionXml();
+        String slaNotifMsg = 
actionXml.substring(actionXml.indexOf("<sla:notification-msg>") + 22,
+                actionXml.indexOf("</sla:notification-msg>"));
+        String expectedSlaMsg = "Notifying User for 2009-03-06T10:00Z,"
+                + DateUtils.formatDateOozieTZ(action.getCreatedTime()) + 
",2009-03-06,2009-03-07T10:00Z,"
+                + action.getId() + ",NAME,testValue,testUser,"
+                + 
"file:///tmp/coord/workflows/2009/22myOutputDatabase,myOutputTable,'datestamp=20090306'";
+        assertEquals(expectedSlaMsg, slaNotifMsg);
     }
 
     public void testActionMaterWithPauseTime1() throws Exception {
@@ -107,7 +118,8 @@ public class TestCoordActionMaterializeCommand extends 
XTestCase {
         coordJob.setUser("testUser");
         coordJob.setGroup("testGroup");
         coordJob.setTimeZone("America/Los_Angeles");
-        String confStr = "<configuration></configuration>";
+        String confStr = 
"<configuration><property><name>testProperty</name><value>testValue</value></property>"
+                + 
"<property><name>user.name</name><value>testUser</value></property></configuration>";
         coordJob.setConf(confStr);
         String appXml = "<coordinator-app xmlns='uri:oozie:coordinator:0.1' 
xmlns:sla='uri:oozie:sla:0.1' name='NAME' frequency=\"1\" 
start='2009-03-06T010:00Z' end='2009-03-11T10:00Z' 
timezone='America/Los_Angeles' freq_timeunit='DAY' end_of_duration='NONE'>";
         appXml += "<controls>";
@@ -122,8 +134,6 @@ public class TestCoordActionMaterializeCommand extends 
XTestCase {
         appXml += "</dataset>";
         appXml += "<instance>${coord:current(0)}</instance>";
         appXml += "<instance>${coord:latest(-1)}</instance>";
-        //appXml += "<start-instance>${coord:current(-2)}</start-instance>";
-        //appXml += "<end-instance>${coord:current(0)}</end-instance>";
         appXml += "</data-in>";
         appXml += "</input-events>";
         appXml += "<output-events>";
@@ -133,6 +143,13 @@ public class TestCoordActionMaterializeCommand extends 
XTestCase {
         appXml += "</dataset>";
         appXml += "<instance>${coord:current(-1)}</instance>";
         appXml += "</data-out>";
+        appXml += "<data-out name='aggregated-logs' dataset='Stats'>";
+        appXml += "<dataset name='Stats' frequency='1' 
initial-instance='2009-01-01T01:00Z' ";
+        appXml += "timezone='UTC' freq_timeunit='DAY' end_of_duration='NONE'>";
+        appXml += 
"<uri-template>hcat://foo:11002/myOutputDatabase/myOutputTable/datestamp=${YEAR}${MONTH}${DAY}";
+        appXml += "</uri-template></dataset>";
+        appXml += "<instance>${coord:current(0)}</instance>";
+        appXml += "</data-out>";
         appXml += "</output-events>";
         appXml += "<action>";
         appXml += "<workflow>";
@@ -149,16 +166,19 @@ public class TestCoordActionMaterializeCommand extends 
XTestCase {
         appXml += "</configuration>";
         appXml += "</workflow>";
         appXml += " <sla:info>"
-                // + " <sla:client-id>axonite-blue</sla:client-id>"
                 + " <sla:app-name>test-app</sla:app-name>"
                 + " 
<sla:nominal-time>${coord:nominalTime()}</sla:nominal-time>"
                 + " <sla:should-start>5</sla:should-start>"
                 + " <sla:should-end>120</sla:should-end>"
-                + " <sla:notification-msg>Notifying User for 
${coord:nominalTime()} nominal time </sla:notification-msg>"
-                + " <sla:alert-contact>[email protected]</sla:alert-contact>"
+                + " <sla:notification-msg>Notifying User for 
${coord:nominalTime()},${coord:actualTime()},"
+                + 
"${coord:formatTime(coord:nominalTime(),'yyyy-MM-dd')},${coord:dateOffset(coord:nominalTime(),
 1, 'DAY')},"
+                + 
"${coord:actionId()},${coord:name()},${coord:conf('testProperty')},${coord:user()},${coord:dataOut('LOCAL_A')}"
+                + 
"${coord:databaseOut('aggregated-logs')},${coord:tableOut('aggregated-logs')},"
+                + "${coord:dataOutPartitions('aggregated-logs')}"
+                + "</sla:notification-msg>" + " 
<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>";
+                + " <sla:qa-contact>[email protected]</sla:qa-contact>"
+                + " <sla:se-contact>[email protected]</sla:se-contact>" + 
"</sla:info>";
         appXml += "</action>";
         appXml += "</coordinator-app>";
         /*try {

http://git-wip-us.apache.org/repos/asf/oozie/blob/5045f89c/core/src/test/java/org/apache/oozie/command/coord/TestCoordSubmitXCommand.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/oozie/command/coord/TestCoordSubmitXCommand.java
 
b/core/src/test/java/org/apache/oozie/command/coord/TestCoordSubmitXCommand.java
index 8dc0c44..019c12c 100644
--- 
a/core/src/test/java/org/apache/oozie/command/coord/TestCoordSubmitXCommand.java
+++ 
b/core/src/test/java/org/apache/oozie/command/coord/TestCoordSubmitXCommand.java
@@ -615,11 +615,17 @@ public class TestCoordSubmitXCommand extends 
XDataTestCase {
                 + "timezone=\"UTC\"> <uri-template>" + 
getTestCaseFileUri("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>" + 
getTestCaseFileUri("coord/workflows/${YEAR}/${DAY}") + "</uri-template>  
</dataset> "
+                + "<dataset name=\"Stats\" frequency=\"${coord:days(1)}\" 
initial-instance=\"2009-01-01T01:00Z\" "
+                + 
"timezone=\"UTC\"><uri-template>hcat://foo:11002/myOutputDatabase/myOutputTable/datestamp=${YEAR}${MONTH}${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> "
+                + "<instance>${coord:current(-1)}</instance> </data-out> "
+                + "<data-out name=\"aggregated-logs\" dataset=\"Stats\">"
+                + "<instance>${coord:current(0)}</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> "
@@ -628,7 +634,12 @@ public class TestCoordSubmitXCommand extends XDataTestCase 
{
                 + " 
<sla:nominal-time>${coord:nominalTime()}</sla:nominal-time>"
                 + " <sla:should-start>${5 * MINUTES}</sla:should-start>"
                 + " <sla:should-end>${ SLA_OFFSET * HOURS}</sla:should-end>"
-                + " <sla:notification-msg>Notifying User for 
${coord:nominalTime()} nominal time </sla:notification-msg>"
+                + " <sla:notification-msg>Notifying User for 
${coord:nominalTime()}, ${coord:actualTime()},"
+                + 
"${coord:formatTime(coord:nominalTime(),'yyyy-MM-dd')},${coord:dateOffset(coord:nominalTime(),
 1, 'DAY')}"
+                + "${coord:actionId()},${coord:name()}, 
${coord:conf('nameNode')},${coord:user()},${coord:dataOut('LOCAL_A')}"
+                + 
"${coord:databaseOut('aggregated-logs')},${coord:tableOut('aggregated-logs')},"
+                + "${coord:dataOutPartitions('aggregated-logs')}"
+                + "</sla:notification-msg>"
                 + " <sla:alert-contact>[email protected]</sla:alert-contact>"
                 + " <sla:dev-contact>[email protected]</sla:dev-contact>"
                 + " <sla:qa-contact>[email protected]</sla:qa-contact>"

http://git-wip-us.apache.org/repos/asf/oozie/blob/5045f89c/core/src/test/java/org/apache/oozie/coord/TestCoordELFunctions.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/oozie/coord/TestCoordELFunctions.java 
b/core/src/test/java/org/apache/oozie/coord/TestCoordELFunctions.java
index 34a428f..be35ce4 100644
--- a/core/src/test/java/org/apache/oozie/coord/TestCoordELFunctions.java
+++ b/core/src/test/java/org/apache/oozie/coord/TestCoordELFunctions.java
@@ -863,6 +863,9 @@ public class TestCoordELFunctions extends XTestCase {
         init("coord-job-submit-data");
         eval.setVariable("date", utcDate);
         assertEquals(expr3_eval, CoordELFunctions.evalAndWrap(eval, expr3));
+        init("coord-sla-submit");
+        eval.setVariable("date", utcDate);
+        assertEquals(expr3_eval, CoordELFunctions.evalAndWrap(eval, expr3));
     }
 
     public void testFuture() throws Exception {
@@ -899,6 +902,8 @@ public class TestCoordELFunctions extends XTestCase {
         init("coord-action-start");
         expr = "${coord:nominalTime()}";
         assertEquals("2009-09-09T23:59Z", CoordELFunctions.evalAndWrap(eval, 
expr));
+        init("coord-sla-create");
+        assertEquals("2009-09-09T23:59Z", CoordELFunctions.evalAndWrap(eval, 
expr));
     }
 
     public void testActualTime() throws Exception {
@@ -907,6 +912,11 @@ public class TestCoordELFunctions extends XTestCase {
         init("coord-action-start");
         expr = "${coord:actualTime()}";
         assertEquals("2009-09-10T23:59Z", CoordELFunctions.evalAndWrap(eval, 
expr));
+        init("coord-sla-submit");
+        assertEquals(expr, CoordELFunctions.evalAndWrap(eval, expr));
+        init("coord-sla-create");
+        assertEquals("2009-09-10T23:59Z", CoordELFunctions.evalAndWrap(eval, 
expr));
+
     }
 
     public void testDataIn() throws Exception {
@@ -927,12 +937,18 @@ public class TestCoordELFunctions extends XTestCase {
         String expr = "${coord:dataOut('ABC')}";
         
assertEquals("file:///tmp/coord/US/2009/1/30,file:///tmp/coord/US/2009/1/31",
                 CoordELFunctions.evalAndWrap(eval, expr));
+        init("coord-sla-create");
+        eval.setVariable(".dataout.ABC", 
"file:///tmp/coord/US/2009/1/30,file:///tmp/coord/US/2009/1/31");
+        
assertEquals("file:///tmp/coord/US/2009/1/30,file:///tmp/coord/US/2009/1/31",
+                CoordELFunctions.evalAndWrap(eval, expr));
     }
 
     public void testActionId() throws Exception {
         init("coord-action-start");
         String expr = "${coord:actionId()}";
         assertEquals("00000-oozie-C@1", CoordELFunctions.evalAndWrap(eval, 
expr));
+        init("coord-sla-create");
+        assertEquals("00000-oozie-C@1", CoordELFunctions.evalAndWrap(eval, 
expr));
     }
 
     public void testName() throws Exception {

http://git-wip-us.apache.org/repos/asf/oozie/blob/5045f89c/core/src/test/java/org/apache/oozie/coord/TestHCatELFunctions.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/oozie/coord/TestHCatELFunctions.java 
b/core/src/test/java/org/apache/oozie/coord/TestHCatELFunctions.java
index f46f1ec..a689cb1 100644
--- a/core/src/test/java/org/apache/oozie/coord/TestHCatELFunctions.java
+++ b/core/src/test/java/org/apache/oozie/coord/TestHCatELFunctions.java
@@ -148,6 +148,9 @@ public class TestHCatELFunctions extends XHCatTestCase {
         }
         catch (Exception ex) {
         }
+        init("coord-sla-submit");
+        eval.setVariable("oozie.dataname.ABCD", "data-out");
+        assertEquals("${coord:databaseOut('ABCD')}", 
CoordELFunctions.evalAndWrap(eval, expr));
     }
 
     /**
@@ -189,6 +192,11 @@ public class TestHCatELFunctions extends XHCatTestCase {
         }
         catch (Exception ex) {
         }
+
+        init("coord-sla-submit");
+        expr = "${coord:tableOut('ABC')}";
+        eval.setVariable("oozie.dataname.ABC", "data-out");
+        assertEquals("${coord:tableOut('ABC')}", 
CoordELFunctions.evalAndWrap(eval, expr));
     }
 
     /**
@@ -284,6 +292,9 @@ public class TestHCatELFunctions extends XHCatTestCase {
         }
         catch (Exception ex) {
         }
+        init("coord-sla-submit");
+        eval.setVariable("oozie.dataname.ABCD", "data-out");
+        assertEquals("${coord:dataOutPartitions('ABCD')}", 
CoordELFunctions.evalAndWrap(eval, expr));
     }
 
     /**
@@ -348,6 +359,12 @@ public class TestHCatELFunctions extends XHCatTestCase {
         eval.setVariable(".dataout.ABC.unresolved", Boolean.FALSE);
         expr = "${coord:tableOut('ABC')}";
         assertEquals("clicks", CoordELFunctions.evalAndWrap(eval, expr));
+
+        init("coord-sla-create", 
"hcat://hcat.server.com:5080/mydb/clicks/datastamp=12;region=us");
+        eval.setVariable(".dataout.ABC", 
"hcat://hcat.server.com:5080/mydb/clicks/datastamp=12;region=us");
+        eval.setVariable(".dataout.ABC.unresolved", Boolean.FALSE);
+        expr = "${coord:tableOut('ABC')}";
+        assertEquals("clicks", CoordELFunctions.evalAndWrap(eval, expr));
     }
 
     /**
@@ -402,6 +419,12 @@ public class TestHCatELFunctions extends XHCatTestCase {
         eval.setVariable(".dataout.ABC.unresolved", Boolean.FALSE);
         String res = CoordELFunctions.evalAndWrap(eval, expr);
         assertTrue(res.equals("'datastamp=20120230,region=us'") || 
res.equals("'region=us,datastamp=20120230'"));
+
+        init("coord-sla-create");
+        eval.setVariable(".dataout.ABC", 
"hcat://hcat.server.com:5080/mydb/clicks/datastamp=20130230;region=euro");
+        eval.setVariable(".dataout.ABC.unresolved", Boolean.FALSE);
+        res = CoordELFunctions.evalAndWrap(eval, expr);
+        assertTrue(res.equals("'datastamp=20130230,region=us'") || 
res.equals("'region=euro,datastamp=20130230'"));
     }
 
     /**
@@ -422,6 +445,16 @@ public class TestHCatELFunctions extends XHCatTestCase {
         expr = "${coord:dataOutPartitionValue('ABC','region')}";
         res = CoordELFunctions.evalAndWrap(eval, expr);
         assertTrue(res.equals("US"));
+
+        init("coord-sla-create");
+        eval.setVariable(".dataout.ABC", 
"hcat://hcat.server.com:5080/mydb/clicks/datastamp=20120230;region=US");
+        eval.setVariable(".dataout.ABC.unresolved", Boolean.FALSE);
+        expr = "${coord:dataOutPartitionValue('ABC','datastamp')}";
+        res = CoordELFunctions.evalAndWrap(eval, expr);
+        assertTrue(res.equals("20120230"));
+        expr = "${coord:dataOutPartitionValue('ABC','region')}";
+        res = CoordELFunctions.evalAndWrap(eval, expr);
+        assertTrue(res.equals("US"));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/oozie/blob/5045f89c/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index 1bfa9c2..9673bac 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -1,5 +1,6 @@
 -- Oozie 4.1.0 release (trunk - unreleased)
 
+OOZIE-1725 add coord EL functions to be used in SLA tag (ryota)
 OOZIE-1765 JMS Notifications for Workflows not always on the correct topic 
(rkanter)
 OOZIE-1732 Sharelib instrumentation fails if sharelib.system.libpath is not 
created (ryota)
 OOZIE-1692 modify log message when checking completion of child job in 
Map-Reduce action (ryota)

Reply via email to