You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oozie.apache.org by rk...@apache.org on 2013/08/29 20:06:58 UTC
svn commit: r1518739 [4/4] - in /oozie/trunk: ./
client/src/main/java/org/apache/oozie/cli/
client/src/main/java/org/apache/oozie/client/
client/src/main/java/org/apache/oozie/client/rest/ core/
core/src/main/java/org/apache/oozie/ core/src/main/java/o...
Modified: oozie/trunk/core/src/test/java/org/apache/oozie/util/TestLogStreamer.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/test/java/org/apache/oozie/util/TestLogStreamer.java?rev=1518739&r1=1518738&r2=1518739&view=diff
==============================================================================
--- oozie/trunk/core/src/test/java/org/apache/oozie/util/TestLogStreamer.java (original)
+++ oozie/trunk/core/src/test/java/org/apache/oozie/util/TestLogStreamer.java Thu Aug 29 18:06:57 2013
@@ -53,9 +53,9 @@ public class TestLogStreamer extends XTe
// between the start and end times of the job
FileWriter fw1 = new FileWriter(getTestCaseDir() + "/oozie.log");
StringBuilder sb1 = new StringBuilder();
- sb1.append("2009-06-24 02:43:13,958 DEBUG _L1_:323 -" + logStatement + "End workflow state change");
- sb1.append("\n2009-06-24 02:43:13,961 INFO _L2_:317 -" + logStatement
- + "[org.apache.oozie.core.command.WorkflowRunnerCallable] " + "released lock");
+ sb1.append("2009-06-24 02:43:13,958 DEBUG _L1_:323 -" + logStatement + "End workflow state change\n");
+ sb1.append("2009-06-24 02:43:13,961 INFO _L2_:317 -" + logStatement
+ + "[org.apache.oozie.core.command.WorkflowRunnerCallable] " + "released lock\n");
fw1.write(sb1.toString());
fw1.close();
File f1 = new File(getTestCaseDir() + "/oozie.log");
@@ -65,11 +65,11 @@ public class TestLogStreamer extends XTe
// between the start and end times of the job
FileWriter fw2 = new FileWriter(getTestCaseDir() + "/oozie.log.1");
StringBuilder sb2 = new StringBuilder();
- sb2.append("\n2009-06-24 02:43:13,986 WARN _L3_:539 -" + logStatement + "Use GenericOptionsParser for parsing " + "the "
+ sb2.append("2009-06-24 02:43:13,986 WARN _L3_:539 -" + logStatement + "Use GenericOptionsParser for parsing " + "the "
+ "arguments. " + "\n" + "_L3A_Applications "
- + "should implement Tool for the same. \n_L3B_Multi line test");
- sb2.append("\n2009-06-24 02:43:14,431 INFO _L4_:661 -" + logStatement + "No job jar file set. User classes "
- + "may not be found. " + "See JobConf(Class) or JobConf#setJar(String).");
+ + "should implement Tool for the same. \n_L3B_Multi line test\n");
+ sb2.append("2009-06-24 02:43:14,431 INFO _L4_:661 -" + logStatement + "No job jar file set. User classes "
+ + "may not be found. " + "See JobConf(Class) or JobConf#setJar(String).\n");
fw2.write(sb2.toString());
fw2.close();
File f2 = new File(getTestCaseDir() + "/oozie.log.1");
@@ -79,11 +79,11 @@ public class TestLogStreamer extends XTe
// between the start and end times of the job
FileWriter fw3 = new FileWriter(getTestCaseDir() + "/oozie.log.2");
StringBuilder sb3 = new StringBuilder();
- sb3.append("\n2009-06-24 02:43:14,505 INFO _L5_:317 - USER[oozie] GROUP[oozie] TOKEN[-] APP[-] JOB[-] "
- + "ACTION[-] Released Lock");
- sb3.append("\n2009-06-24 02:43:19,344 DEBUG _L6_:323 - USER[oozie] GROUP[oozie] TOKEN[MYtoken] APP[-] JOB[-] "
- + "ACTION[-] Number of pending signals to check [0]");
- sb3.append("\n2009-06-24 02:43:29,151 DEBUG _L7_:323 -" + logStatement + "Number of pending actions [0] ");
+ sb3.append("2009-06-24 02:43:14,505 INFO _L5_:317 - USER[oozie] GROUP[oozie] TOKEN[-] APP[-] JOB[-] "
+ + "ACTION[-] Released Lock\n");
+ sb3.append("2009-06-24 02:43:19,344 DEBUG _L6_:323 - USER[oozie] GROUP[oozie] TOKEN[MYtoken] APP[-] JOB[-] "
+ + "ACTION[-] Number of pending signals to check [0]\n");
+ sb3.append("2009-06-24 02:43:29,151 DEBUG _L7_:323 -" + logStatement + "Number of pending actions [0] \n");
fw3.write(sb3.toString());
fw3.close();
File f3 = new File(getTestCaseDir() + "/oozie.log.2");
@@ -94,9 +94,9 @@ public class TestLogStreamer extends XTe
// "oozie.log"
FileWriter fwerr = new FileWriter(getTestCaseDir() + "/testerr.log");
StringBuilder sberr = new StringBuilder();
- sberr.append("2009-06-24 02:43:13,958 WARN _L1_:323 -" + logStatement + "End workflow state change");
- sberr.append("\n2009-06-24 02:43:13,961 INFO _L2_:317 -" + logStatement
- + "[org.apache.oozie.core.command.WorkflowRunnerCallable] " + "released lock");
+ sberr.append("2009-06-24 02:43:13,958 WARN _L1_:323 -" + logStatement + "End workflow state change\n");
+ sberr.append("2009-06-24 02:43:13,961 INFO _L2_:317 -" + logStatement
+ + "[org.apache.oozie.core.command.WorkflowRunnerCallable] " + "released lock\n");
fwerr.write(sberr.toString());
fwerr.close();
File ferr = new File(getTestCaseDir() + "/testerr.log");
@@ -109,9 +109,9 @@ public class TestLogStreamer extends XTe
String outFilename = "oozie.log-" + filenameDateFormatter.format(new Date(currTime - 6 * 3600000)) + ".gz";
File f = new File(getTestCaseDir() + "/" + outFilename);
StringBuilder sb = new StringBuilder();
- sb.append("\n2009-06-24 02:43:13,958 DEBUG _L8_:323 -" + logStatement + "End workflow state change");
- sb.append("\n2009-06-24 02:43:13,961 INFO _L9_:317 -" + logStatement + "[org.apache.oozie.core."
- + "command.WorkflowRunnerCallable] " + "released lock");
+ sb.append("2009-06-24 02:43:13,958 DEBUG _L8_:323 -" + logStatement + "End workflow state change\n");
+ sb.append("2009-06-24 02:43:13,961 INFO _L9_:317 -" + logStatement + "[org.apache.oozie.core."
+ + "command.WorkflowRunnerCallable] " + "released lock\n");
writeToGZFile(f,sb);
// oozie.log.gz GZip file would always be included in list of files for log retrieval
@@ -119,9 +119,9 @@ public class TestLogStreamer extends XTe
f = new File(getTestCaseDir() + "/" + outFilename);
// Generate and write log content to the GZip file
sb = new StringBuilder();
- sb.append("\n2009-06-24 02:43:13,958 DEBUG _L10_:323 -" + logStatement + "End workflow state change");
- sb.append("\n2009-06-24 02:43:13,961 INFO _L11_:317 -" + logStatement + "[org.apache.oozie.core."
- + "command.WorkflowRunnerCallable] " + "released lock");
+ sb.append("2009-06-24 02:43:13,958 DEBUG _L10_:323 -" + logStatement + "End workflow state change\n");
+ sb.append("2009-06-24 02:43:13,961 INFO _L11_:317 -" + logStatement + "[org.apache.oozie.core."
+ + "command.WorkflowRunnerCallable] " + "released lock\n");
writeToGZFile(f,sb);
// Test to check if an invalid GZip file(file name not in the expected format oozie.log-YYYY-MM-DD-HH.gz) is
@@ -130,16 +130,16 @@ public class TestLogStreamer extends XTe
f = new File(getTestCaseDir() + "/" + outFilename);
// Generate and write log content to the GZip file
sb = new StringBuilder();
- sb.append("\n2009-06-24 02:43:13,958 DEBUG _L12_:323 -" + logStatement + "End workflow state change");
- sb.append("\n2009-06-24 02:43:13,961 INFO _L13_:317 -" + logStatement + "[org.apache.oozie.core."
- + "command.WorkflowRunnerCallable] " + "released lock");
+ sb.append("2009-06-24 02:43:13,958 DEBUG _L12_:323 -" + logStatement + "End workflow state change\n");
+ sb.append("2009-06-24 02:43:13,961 INFO _L13_:317 -" + logStatement + "[org.apache.oozie.core."
+ + "command.WorkflowRunnerCallable] " + "released lock\n");
writeToGZFile(f,sb);
// Test for the log retrieval of the job that began 10 hours before and ended 5 hours before current time
// respectively
StringWriter sw = new StringWriter();
- XLogStreamer str = new XLogStreamer(xf, sw, getTestCaseDir(), "oozie.log", 1);
- str.streamLog(new Date(currTime - 10 * 3600000), new Date(currTime - 5 * 3600000));
+ XLogStreamer str = new XLogStreamer(xf, getTestCaseDir(), "oozie.log", 1);
+ str.streamLog(sw, new Date(currTime - 10 * 3600000), new Date(currTime - 5 * 3600000));
String[] out = sw.toString().split("\n");
// Check if the retrieved log content is of length seven lines after filtering based on time window, file name
// pattern and parameters like JobId, Username etc. and/or based on log level like INFO, DEBUG, etc.
@@ -156,8 +156,8 @@ public class TestLogStreamer extends XTe
// Test to check if the null values for startTime and endTime are translated to 0 and current time respectively
// and corresponding log content is retrieved properly
StringWriter sw1 = new StringWriter();
- XLogStreamer str1 = new XLogStreamer(xf, sw1, getTestCaseDir(), "oozie.log", 1);
- str1.streamLog(null, null);
+ XLogStreamer str1 = new XLogStreamer(xf, getTestCaseDir(), "oozie.log", 1);
+ str1.streamLog(sw1, null, null);
out = sw1.toString().split("\n");
// Check if the retrieved log content is of length eight lines after filtering based on time window, file name
// pattern and parameters like JobId, Username etc. and/or based on log level like INFO, DEBUG, etc.
@@ -220,11 +220,11 @@ public class TestLogStreamer extends XTe
// Test for the log retrieval of the job spanning multiple hours
StringWriter sw2 = new StringWriter();
- XLogStreamer str2 = new XLogStreamer(xf, sw2, getTestCaseDir(), "oozie.log", 1);
+ XLogStreamer str2 = new XLogStreamer(xf, getTestCaseDir(), "oozie.log", 1);
Calendar calendarEntry = Calendar.getInstance();
// Setting start-time to 2012-04-24-19 for log stream (month-1 passed as parameter since 0=January), and end time is current time
calendarEntry.set(2012, 3, 24, 19, 0);
- str2.streamLog(calendarEntry.getTime(), new Date(System.currentTimeMillis()));
+ str2.streamLog(sw2, calendarEntry.getTime(), new Date(System.currentTimeMillis()));
String[] out = sw2.toString().split("\n");
// Check if the retrieved log content is of length five lines after filtering based on time window, file name
@@ -272,8 +272,8 @@ public class TestLogStreamer extends XTe
f1.setLastModified(currTime);
StringWriter sw = new StringWriter();
- XLogStreamer str = new XLogStreamer(xf, sw, getTestCaseDir(), "oozie.log", 1);
- str.streamLog(new Date(currTime - 5000), new Date(currTime + 5000));
+ XLogStreamer str = new XLogStreamer(xf, getTestCaseDir(), "oozie.log", 1);
+ str.streamLog(sw, new Date(currTime - 5000), new Date(currTime + 5000));
String[] out = sw.toString().split("\n");
// Check if the retrieved log content is of length five lines after filtering; we expect the first five lines because the
// filtering shouldn't care whether or not there is a dash while the last five lines don't pass the normal filtering
@@ -286,7 +286,7 @@ public class TestLogStreamer extends XTe
assertEquals(true, out[4].contains("_L5_"));
}
- private void writeToGZFile(File f, StringBuilder sbr) throws IOException {
+ static void writeToGZFile(File f, StringBuilder sbr) throws IOException {
GZIPOutputStream gzout = new GZIPOutputStream(new FileOutputStream(f));
String strg = sbr.toString();
// Write log content to the GZip file
Added: oozie/trunk/core/src/test/java/org/apache/oozie/util/TestMultiFileReader.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/test/java/org/apache/oozie/util/TestMultiFileReader.java?rev=1518739&view=auto
==============================================================================
--- oozie/trunk/core/src/test/java/org/apache/oozie/util/TestMultiFileReader.java (added)
+++ oozie/trunk/core/src/test/java/org/apache/oozie/util/TestMultiFileReader.java Thu Aug 29 18:06:57 2013
@@ -0,0 +1,98 @@
+/**
+ * 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.util;
+
+
+import java.io.File;
+import java.io.FileWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import org.apache.oozie.test.XTestCase;
+
+public class TestMultiFileReader extends XTestCase {
+
+ public void testOneFile() throws Exception {
+ File dir = new File(getTestCaseDir());
+ File f1 = new File(dir, "file1.txt");
+ FileWriter fw = new FileWriter(f1);
+ String str1 = "This is the first line of the only file\nThis is the second line\n";
+ fw.write(str1);
+ fw.close();
+ ArrayList<File> files = new ArrayList<File>();
+ files.add(f1);
+
+ MultiFileReader reader = new MultiFileReader(files);
+ char[] buf = new char[str1.length()];
+ Arrays.fill(buf, '+');
+ int numRead = reader.read(buf, 0, 10);
+ assertEquals(10, numRead);
+ assertEquals(str1.substring(0, 10), new String(buf, 0, 10));
+ for (int i = 10; i < buf.length; i++) {
+ assertEquals('+', buf[i]);
+ }
+ numRead = reader.read(buf, 10, str1.length() - 10);
+ assertEquals(str1.length() - 10, numRead);
+ assertEquals(str1, new String(buf));
+ numRead = reader.read();
+ assertEquals(-1, numRead);
+ }
+
+ public void testMultipleFiles() throws Exception {
+ File dir = new File(getTestCaseDir());
+ File f1 = new File(dir, "file1.txt");
+ FileWriter fw = new FileWriter(f1);
+ String str1 = "This is the first line of the first file\nThis is the second line\n";
+ fw.write(str1);
+ fw.close();
+ File f2 = new File(dir, "file2.gz");
+ String str2 = "This is a gz file with just one line\n";
+ TestLogStreamer.writeToGZFile(f2, new StringBuilder(str2));
+ File f3 = new File(dir, "file3.txt");
+ fw = new FileWriter(f3);
+ String str3 = "And this is the last file\nwith\n3 lines\n";
+ fw.write(str3);
+ fw.close();
+ ArrayList<File> files = new ArrayList<File>();
+ files.add(f1);
+ files.add(f2);
+ files.add(f3);
+
+ MultiFileReader reader = new MultiFileReader(files);
+ char[] buf = new char[str1.length() + str2.length() + str3.length()];
+ Arrays.fill(buf, '+');
+ // Try reading longer than the first file; MultiFileReader doesn't read past it and will simply return less chars
+ // Reading again should get the next chars from the second file
+ int numRead = reader.read(buf, 0, str1.length() + 10);
+ assertEquals(str1.length(), numRead);
+ assertEquals(str1, new String(buf, 0, str1.length()));
+ for (int i = str1.length(); i < buf.length; i++) {
+ assertEquals('+', buf[i]);
+ }
+ numRead = reader.read(buf, str1.length(), str2.length());
+ assertEquals(str2.length(), numRead);
+ assertEquals(str1 + str2, new String(buf, 0, str1.length() + str2.length()));
+ for (int i = str1.length() + str2.length(); i < buf.length; i++) {
+ assertEquals('+', buf[i]);
+ }
+ numRead = reader.read(buf, str1.length() + str2.length(), str3.length());
+ assertEquals(str3.length(), numRead);
+ assertEquals(str1 + str2 + str3, new String(buf));
+ numRead = reader.read();
+ assertEquals(-1, numRead);
+ }
+}
Added: oozie/trunk/core/src/test/java/org/apache/oozie/util/TestSimplifiedTimestampedMessageParser.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/test/java/org/apache/oozie/util/TestSimplifiedTimestampedMessageParser.java?rev=1518739&view=auto
==============================================================================
--- oozie/trunk/core/src/test/java/org/apache/oozie/util/TestSimplifiedTimestampedMessageParser.java (added)
+++ oozie/trunk/core/src/test/java/org/apache/oozie/util/TestSimplifiedTimestampedMessageParser.java Thu Aug 29 18:06:57 2013
@@ -0,0 +1,95 @@
+/**
+ * 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.util;
+
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.StringWriter;
+import org.apache.oozie.test.XTestCase;
+
+public class TestSimplifiedTimestampedMessageParser extends XTestCase {
+
+ public void testProcessRemainingLog() throws IOException {
+ XLogStreamer.Filter.reset();
+ XLogStreamer.Filter.defineParameter("USER");
+ XLogStreamer.Filter.defineParameter("GROUP");
+ XLogStreamer.Filter.defineParameter("TOKEN");
+ XLogStreamer.Filter.defineParameter("APP");
+ XLogStreamer.Filter.defineParameter("JOB");
+ XLogStreamer.Filter.defineParameter("ACTION");
+ XLogStreamer.Filter xf = new XLogStreamer.Filter();
+ xf.setParameter("JOB", "14-200904160239--example-forkjoinwf");
+ xf.setLogLevel("DEBUG|WARN");
+
+ File file = TestTimestampedMessageParser.prepareFile1(getTestCaseDir());
+ StringWriter sw = new StringWriter();
+ new SimpleTimestampedMessageParser(new BufferedReader(new FileReader(file)), xf).processRemaining(sw);
+ String[] out = sw.toString().split("\n");
+ assertEquals(19, out.length);
+ assertTrue(out[0].contains("_L1_"));
+ assertTrue(out[1].contains("_L2_"));
+ assertTrue(out[2].contains("_L3_"));
+ assertTrue(out[3].contains("_L3A_"));
+ assertTrue(out[4].contains("_L3B_"));
+ assertTrue(out[5].contains("_L4_"));
+ assertTrue(out[6].contains("_L5_"));
+ assertTrue(out[7].contains("_L6_"));
+ assertTrue(out[8].contains("_L7_"));
+ assertTrue(out[9].contains("_L8_"));
+ assertTrue(out[10].contains("_L9_"));
+ assertTrue(out[11].contains("_L10_"));
+ assertTrue(out[12].contains("_L11_"));
+ assertTrue(out[13].contains("_L12_"));
+ assertTrue(out[14].contains("_L13_"));
+ assertTrue(out[15].contains("_L14_"));
+ assertTrue(out[16].contains("_L15_"));
+ assertTrue(out[17].contains("_L16_"));
+ assertTrue(out[18].contains("_L17_"));
+ }
+
+ public void testProcessRemainingCoordinatorLogForActions() throws IOException {
+ XLogStreamer.Filter.reset();
+ XLogStreamer.Filter.defineParameter("USER");
+ XLogStreamer.Filter.defineParameter("GROUP");
+ XLogStreamer.Filter.defineParameter("TOKEN");
+ XLogStreamer.Filter.defineParameter("APP");
+ XLogStreamer.Filter.defineParameter("JOB");
+ XLogStreamer.Filter.defineParameter("ACTION");
+ XLogStreamer.Filter xf = new XLogStreamer.Filter();
+ xf.setParameter("JOB", "14-200904160239--example-C");
+ xf.setParameter("ACTION", "14-200904160239--example-C@1");
+
+ File file = TestTimestampedMessageParser.prepareFile2(getTestCaseDir());
+ StringWriter sw = new StringWriter();
+ new SimpleTimestampedMessageParser(new BufferedReader(new FileReader(file)), xf).processRemaining(sw);
+ String[] matches = sw.toString().split("\n");
+ assertEquals(9, matches.length);
+ assertTrue(matches[0].contains("_L1_"));
+ assertTrue(matches[1].contains("_L2_"));
+ assertTrue(matches[2].contains("_L3_"));
+ assertTrue(matches[3].contains("_L3A_"));
+ assertTrue(matches[4].contains("_L3B_"));
+ assertTrue(matches[5].contains("_L4_"));
+ assertTrue(matches[6].contains("_L5_"));
+ assertTrue(matches[7].contains("_L6_"));
+ assertTrue(matches[8].contains("_L7_"));
+ }
+}
Added: oozie/trunk/core/src/test/java/org/apache/oozie/util/TestTimestampedMessageParser.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/test/java/org/apache/oozie/util/TestTimestampedMessageParser.java?rev=1518739&view=auto
==============================================================================
--- oozie/trunk/core/src/test/java/org/apache/oozie/util/TestTimestampedMessageParser.java (added)
+++ oozie/trunk/core/src/test/java/org/apache/oozie/util/TestTimestampedMessageParser.java Thu Aug 29 18:06:57 2013
@@ -0,0 +1,176 @@
+/**
+ * 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.util;
+
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import org.apache.oozie.test.XTestCase;
+
+public class TestTimestampedMessageParser extends XTestCase {
+
+ static File prepareFile1(String dir) throws IOException {
+ File file = new File(dir + "/test1.log");
+ FileWriter fw = new FileWriter(file);
+ StringBuilder sb = new StringBuilder();
+ sb.append("2009-06-24 02:43:13,958 DEBUG _L1_:323 - USER[oozie] GROUP[-] TOKEN[-] APP[example-forkjoinwf] "
+ + "JOB[14-200904160239--example-forkjoinwf] ACTION[-] End workflow state change");
+ sb.append("\n2009-06-24 02:43:13,961 INFO _L2_:317 - USER[-] GROUP[-] TOKEN[-] APP[example-forkjoinwf] "
+ + "JOB[14-200904160239--example-forkjoinwf] ACTION[-] "
+ + "[org.apache.oozie.core.command.WorkflowRunnerCallable] " + "released lock");
+ sb.append("\n2009-06-24 02:43:13,986 WARN _L3_:539 - USER[-] GROUP[-] TOKEN[-] APP[example-forkjoinwf] "
+ + "JOB[14-200904160239--example-forkjoinwf] ACTION[-] Use GenericOptionsParser for parsing "
+ + "the arguments. " + "\n_L3A_Applications should implement Tool for the same. \n_L3B_Multi line test");
+ sb.append("\n2009-06-24 02:43:14,431 WARN _L4_:661 - No job jar file set. User classes may not be found. "
+ + "See JobConf(Class) or JobConf#setJar(String).");
+ sb.append("\n2009-06-24 02:43:14,505 INFO _L5_:317 - USER[oozie] GROUP[oozie] TOKEN[-] APP[-] JOB[-] "
+ + "ACTION[-] " + "Released Lock");
+ sb.append("\n2009-06-24 02:43:19,344 DEBUG _L6_:323 - USER[oozie] GROUP[oozie] TOKEN[MYtoken] APP[-] "
+ + "JOB[-] ACTION[-] Number of pending signals to check [0]");
+ sb.append("\n2009-06-24 02:43:29,151 DEBUG _L7_:323 - USER[-] GROUP[-] TOKEN[-] APP[-] JOB[-] ACTION[-] "
+ + "Number of pending actions [0] ");
+ // a multiline message with a stack trace
+ sb.append("\n2013-06-10 10:26:30,202 WARN ActionStartXCommand:542 - USER[rkanter] GROUP[-] TOKEN[] APP[hive-wf] "
+ + "JOB[14-200904160239--example-forkjoinwf] ACTION[14-200904160239--example-forkjoinwf@hive-node] Error starting "
+ + "action [hive-node]. ErrorType [TRANSIENT], ErrorCode [JA009], Message [JA009: java.io.IOException: Unknown "
+ + "protocol to name node: org.apache.hadoop.mapred.JobSubmissionProtocol _L8_\n"
+ + " at org.apache.hadoop.hdfs.server.namenode.NameNode.getProtocolVersion(NameNode.java:156) _L9_\n"
+ + " at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)_L10_\n"
+ + " at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190) _L11_\n"
+ + " at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1426) _L12_\n"
+ + "] _L13_\n"
+ + "org.apache.oozie.action.ActionExecutorException: JA009: java.io.IOException: Unknown protocol to name node: "
+ + "org.apache.hadoop.mapred.JobSubmissionProtocol _L14_\n"
+ + " at org.apache.hadoop.hdfs.server.namenode.NameNode.getProtocolVersion(NameNode.java:156) _L15_\n"
+ + " at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) _L16_\n"
+ + " at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) _L17_\n");
+
+ fw.write(sb.toString());
+ fw.close();
+ return file;
+ }
+
+ static File prepareFile2(String dir) throws IOException {
+ File file = new File(dir + "/test2.log");
+ FileWriter fw = new FileWriter(file);
+ StringBuilder sb = new StringBuilder();
+ sb.append("2009-06-24 02:43:13,958 DEBUG _L1_:323 - USER[oozie] GROUP[-] TOKEN[-] APP[example-forkjoinwf] "
+ + "JOB[14-200904160239--example-C] ACTION[14-200904160239--example-C@1] End workflow state change");
+ sb.append("\n2009-06-24 02:43:13,961 INFO _L2_:317 - USER[-] GROUP[-] TOKEN[-] APP[example-forkjoinwf] "
+ + "JOB[14-200904160239--example-C] ACTION[14-200904160239--example-C@2] "
+ + "[org.apache.oozie.core.command.WorkflowRunnerCallable] released lock");
+ sb.append("\n2009-06-24 02:43:13,986 WARN _L3_:539 - USER[-] GROUP[-] TOKEN[-] APP[example-forkjoinwf] "
+ + "JOB[14-200904160239--example-C] ACTION[14-200904160239--example-C@2] Use GenericOptionsParser for "
+ + "parsing the arguments. \n_L3A_Applications should implement Tool for the same. \n_L3B_Multi line "
+ + "test");
+ sb.append("\n2009-06-24 02:43:14,431 WARN _L4_:661 - No job jar file set. User classes may not be found. "
+ + "See JobConf(Class) or JobConf#setJar(String).");
+ sb.append("\n2009-06-24 02:43:14,505 INFO _L5_:317 - USER[oozie] GROUP[oozie] TOKEN[-] APP[-] "
+ + "JOB[14-200904160239--example-C] ACTION[14-200904160239--example-C@1] Released Lock");
+ sb.append("\n2009-06-24 02:43:19,344 DEBUG _L6_:323 - USER[oozie] GROUP[oozie] TOKEN[MYtoken] APP[-] "
+ + "JOB[-] ACTION[-] Number of pending signals to check [0]");
+ sb.append("\n2009-06-24 02:43:29,151 DEBUG _L7_:323 - USER[-] GROUP[-] TOKEN[-] APP[-] JOB[-] "
+ + "ACTION[-] Number of pending actions [0] ");
+
+ fw.write(sb.toString());
+ fw.close();
+ return file;
+ }
+
+ public void testProcessRemainingLog() throws IOException {
+ XLogStreamer.Filter.reset();
+ XLogStreamer.Filter.defineParameter("USER");
+ XLogStreamer.Filter.defineParameter("GROUP");
+ XLogStreamer.Filter.defineParameter("TOKEN");
+ XLogStreamer.Filter.defineParameter("APP");
+ XLogStreamer.Filter.defineParameter("JOB");
+ XLogStreamer.Filter.defineParameter("ACTION");
+ XLogStreamer.Filter xf = new XLogStreamer.Filter();
+ xf.setParameter("JOB", "14-200904160239--example-forkjoinwf");
+ xf.setLogLevel("DEBUG|WARN");
+
+ File file = prepareFile1(getTestCaseDir());
+ StringWriter sw = new StringWriter();
+ new TimestampedMessageParser(new BufferedReader(new FileReader(file)), xf).processRemaining(sw);
+ String[] out = sw.toString().split("\n");
+ assertEquals(14, out.length);
+ assertTrue(out[0].contains("_L1_"));
+ assertTrue(out[1].contains("_L3_"));
+ assertTrue(out[2].contains("_L3A_"));
+ assertTrue(out[3].contains("_L3B_"));
+ assertTrue(out[4].contains("_L8_"));
+ assertTrue(out[5].contains("_L9_"));
+ assertTrue(out[6].contains("_L10_"));
+ assertTrue(out[7].contains("_L11_"));
+ assertTrue(out[8].contains("_L12_"));
+ assertTrue(out[9].contains("_L13_"));
+ assertTrue(out[10].contains("_L14_"));
+ assertTrue(out[11].contains("_L15_"));
+ assertTrue(out[12].contains("_L16_"));
+ assertTrue(out[13].contains("_L17_"));
+ }
+
+ public void testProcessRemainingCoordinatorLogForActions() throws IOException {
+ XLogStreamer.Filter.reset();
+ XLogStreamer.Filter.defineParameter("USER");
+ XLogStreamer.Filter.defineParameter("GROUP");
+ XLogStreamer.Filter.defineParameter("TOKEN");
+ XLogStreamer.Filter.defineParameter("APP");
+ XLogStreamer.Filter.defineParameter("JOB");
+ XLogStreamer.Filter.defineParameter("ACTION");
+ XLogStreamer.Filter xf = new XLogStreamer.Filter();
+ xf.setParameter("JOB", "14-200904160239--example-C");
+ xf.setParameter("ACTION", "14-200904160239--example-C@1");
+
+ File file = prepareFile2(getTestCaseDir());
+ StringWriter sw = new StringWriter();
+ new TimestampedMessageParser(new BufferedReader(new FileReader(file)), xf).processRemaining(sw);
+ String[] matches = sw.toString().split("\n");
+ assertEquals(2, matches.length);
+ assertTrue(matches[0].contains("_L1_"));
+ assertTrue(matches[1].contains("_L5_"));
+ }
+
+ public void testLifecycle() throws Exception {
+ XLogStreamer.Filter.reset();
+ XLogStreamer.Filter xf = new XLogStreamer.Filter();
+ String str1 = "2009-06-24 02:43:13,958 DEBUG _L1_:323 - USER[oozie] GROUP[-] TOKEN[-] APP[example-forkjoinwf] "
+ + "JOB[14-200904160239--example-forkjoinwf] ACTION[-] End workflow state change\n";
+ String str2 = "2009-06-24 02:43:13,961 INFO _L2_:317 - USER[-] GROUP[-] TOKEN[-] APP[example-forkjoinwf] "
+ + "JOB[14-200904160239--example-forkjoinwf] ACTION[-]\n";
+ BufferedReader reader = new BufferedReader(new StringReader(str1 + str2));
+ TimestampedMessageParser parser = new TimestampedMessageParser(reader, xf);
+ assertNull(parser.getLastMessage());
+ assertNull(parser.getLastTimestamp());
+ assertTrue(parser.increment());
+ assertEquals(str1, parser.getLastMessage());
+ assertEquals("2009-06-24 02:43:13,958", parser.getLastTimestamp());
+ assertTrue(parser.increment());
+ assertEquals(str2, parser.getLastMessage());
+ assertEquals("2009-06-24 02:43:13,961", parser.getLastTimestamp());
+ assertFalse(parser.increment());
+ assertEquals(str2, parser.getLastMessage());
+ assertEquals("2009-06-24 02:43:13,961", parser.getLastTimestamp());
+ parser.closeReader();
+ }
+}
Modified: oozie/trunk/core/src/test/java/org/apache/oozie/util/TestXLogFilter.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/test/java/org/apache/oozie/util/TestXLogFilter.java?rev=1518739&r1=1518738&r2=1518739&view=diff
==============================================================================
--- oozie/trunk/core/src/test/java/org/apache/oozie/util/TestXLogFilter.java (original)
+++ oozie/trunk/core/src/test/java/org/apache/oozie/util/TestXLogFilter.java Thu Aug 29 18:06:57 2013
@@ -33,7 +33,8 @@ public class TestXLogFilter extends XTes
XLogStreamer.Filter xf2 = new XLogStreamer.Filter();
xf2.constructPattern();
ArrayList<String> a = new ArrayList<String>();
- a.add("2009-06-24 02:43:13,958 DEBUG");
+ a.add("2009-06-24 02:43:13,958");
+ a.add(" DEBUG");
a.add(" WorkflowRunnerCallable:323 - " + XLog.Info.get().createPrefix() + " test log");
assertEquals(true, xf2.matches(a));
}
Added: oozie/trunk/core/src/test/java/org/apache/oozie/util/TestZKUtils.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/test/java/org/apache/oozie/util/TestZKUtils.java?rev=1518739&view=auto
==============================================================================
--- oozie/trunk/core/src/test/java/org/apache/oozie/util/TestZKUtils.java (added)
+++ oozie/trunk/core/src/test/java/org/apache/oozie/util/TestZKUtils.java Thu Aug 29 18:06:57 2013
@@ -0,0 +1,155 @@
+/**
+ * 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.util;
+
+import java.util.List;
+import java.util.Map;
+import static junit.framework.Assert.assertEquals;
+
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.x.discovery.ServiceDiscovery;
+import org.apache.curator.x.discovery.ServiceInstance;
+import org.apache.oozie.test.ZKXTestCase;
+
+
+public class TestZKUtils extends ZKXTestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ private class DummyUser {
+ private ZKUtils zk = null;
+ void register() throws Exception {
+ zk = ZKUtils.register(this);
+ sleep(1000); // Sleep to allow ZKUtils ServiceCache to update
+ }
+
+ void unregister() {
+ if (zk != null) {
+ zk.unregister(this);
+ sleep(1000); // Sleep to allow ZKUtils ServiceCache to update
+ }
+ zk = null;
+ }
+
+ ZKUtils getZKUtils() {
+ return zk;
+ }
+ }
+
+ public void testRegisterAdvertiseUnadvertiseUnregister() throws Exception {
+ CuratorFramework client = getClient();
+ ServiceDiscovery<Map> sDiscovery = getServiceDiscovery();
+
+ assertNull(client.checkExists().forPath("/services"));
+ assertEquals(0, sDiscovery.queryForInstances("servers").size());
+ assertNull(sDiscovery.queryForInstance("servers", ZK_ID));
+ DummyUser du = new DummyUser();
+ DummyUser du2 = new DummyUser();
+ try {
+ du.register();
+ assertNotNull(client.checkExists().forPath("/services"));
+ assertEquals(1, sDiscovery.queryForInstances("servers").size());
+ assertNotNull(sDiscovery.queryForInstance("servers", ZK_ID));
+ du2.register();
+ assertNotNull(client.checkExists().forPath("/services"));
+ assertEquals(1, sDiscovery.queryForInstances("servers").size());
+ assertNotNull(sDiscovery.queryForInstance("servers", ZK_ID));
+
+ du.unregister();
+ assertNotNull(client.checkExists().forPath("/services"));
+ assertEquals(1, sDiscovery.queryForInstances("servers").size());
+ assertNotNull(sDiscovery.queryForInstance("servers", ZK_ID));
+ du2.unregister();
+ assertNotNull(client.checkExists().forPath("/services"));
+ assertEquals(0, sDiscovery.queryForInstances("servers").size());
+ assertNull(sDiscovery.queryForInstance("servers", ZK_ID));
+ }
+ finally {
+ du.unregister();
+ du2.unregister();
+ }
+ }
+
+ public void testMetaData() throws Exception {
+ ServiceDiscovery<Map> sDiscovery = getServiceDiscovery();
+
+ assertNull(sDiscovery.queryForInstance("servers", ZK_ID));
+ DummyUser du = new DummyUser();
+ try {
+ du.register();
+ assertNotNull(sDiscovery.queryForInstance("servers", ZK_ID));
+ List<ServiceInstance<Map>> allMetaData = du.getZKUtils().getAllMetaData();
+ assertEquals(1, allMetaData.size());
+ ServiceInstance<Map> meta = allMetaData.get(0);
+ assertEquals(ZK_ID, meta.getId());
+ assertEquals("servers", meta.getName());
+ Map<String, String> data = meta.getPayload();
+ assertEquals(3, data.size());
+ assertEquals(ZK_ID, data.get("OOZIE_ID"));
+ String url = ConfigUtils.getOozieURL(false);
+ assertEquals(url, data.get("OOZIE_URL"));
+ assertEquals("java.util.HashMap", data.get("@class"));
+ }
+ finally {
+ du.unregister();
+ }
+ }
+
+ public void testGetZKId() throws Exception {
+ DummyUser du = new DummyUser();
+ try {
+ du.register();
+ assertEquals(ZK_ID, du.getZKUtils().getZKId());
+ }
+ finally {
+ du.unregister();
+ }
+ }
+
+ public void testGetZKIdIndex() throws Exception {
+ DummyUser du = new DummyUser();
+ DummyZKOozie dummyOozie = null;
+ DummyZKOozie dummyOozie2 = null;
+ try {
+ dummyOozie = new DummyZKOozie("a", "http://blah");
+ du.register();
+ assertEquals(1, du.getZKUtils().getZKIdIndex(du.getZKUtils().getAllMetaData()));
+ dummyOozie2 = new DummyZKOozie("b", "http://blah");
+ assertEquals(1, du.getZKUtils().getZKIdIndex(du.getZKUtils().getAllMetaData()));
+ dummyOozie.teardown();
+ assertEquals(0, du.getZKUtils().getZKIdIndex(du.getZKUtils().getAllMetaData()));
+ }
+ finally {
+ du.unregister();
+ if (dummyOozie != null) {
+ dummyOozie.teardown();
+ }
+ if (dummyOozie2 != null) {
+ dummyOozie2.teardown();
+ }
+ }
+ }
+}
Modified: oozie/trunk/distro/src/main/tomcat/ssl-web.xml
URL: http://svn.apache.org/viewvc/oozie/trunk/distro/src/main/tomcat/ssl-web.xml?rev=1518739&r1=1518738&r2=1518739&view=diff
==============================================================================
--- oozie/trunk/distro/src/main/tomcat/ssl-web.xml (original)
+++ oozie/trunk/distro/src/main/tomcat/ssl-web.xml Thu Aug 29 18:06:57 2013
@@ -45,4 +45,11 @@
</user-data-constraint>
</security-constraint>
+ <!-- Property used by Oozie to determine that SSL (HTTPS) has been enabled -->
+ <!-- Do not remove or change this -->
+ <context-param>
+ <param-name>ssl.enabled</param-name>
+ <param-value>true</param-value>
+ </context-param>
+
</web-app>
Modified: oozie/trunk/docs/src/site/twiki/AG_Install.twiki
URL: http://svn.apache.org/viewvc/oozie/trunk/docs/src/site/twiki/AG_Install.twiki?rev=1518739&r1=1518738&r2=1518739&view=diff
==============================================================================
--- oozie/trunk/docs/src/site/twiki/AG_Install.twiki (original)
+++ oozie/trunk/docs/src/site/twiki/AG_Install.twiki Thu Aug 29 18:06:57 2013
@@ -693,6 +693,101 @@ similar. You will probably have to add y
Refer to the [[./oozie-default.xml][oozie-default.xml]] for details.
+#HA
+---+++ High Availability (HA)
+
+Multiple Oozie Servers can be configured against the same database to provide High Availability (HA) of the Oozie service.
+
+---++++ Pre-requisites
+
+1. A database that supports multiple concurrent connections. In order to have full HA, the database should also have HA support, or
+it becomes a single point of failure.
+
+*NOTE:* The default derby database does not support this
+
+2. A ZooKeeper ensemble.
+
+Apache ZooKeeper is a distributed, open-source coordination service for distributed applications; the Oozie servers use it for
+coordinating access to the database and communicating with each other. In order to have full HA, there should be at least 3
+ZooKeeper servers.
+More information on ZooKeeper can be found [[http://zookeeper.apache.org][here]].
+
+3. Multiple Oozie servers.
+
+*IMPORTANT:* While not strictly required for all configuration properties, all of the servers should ideally have exactly the same
+configuration for consistency's sake.
+
+4. A Loadbalancer, Virtual IP, or Round-Robin DNS.
+
+This is used to provide a single entry-point for users and for callbacks from the JobTracker. The load balancer should be
+configured for round-robin between the Oozie servers to distribute the requests. Users (using either the Oozie client, a web
+browser, or the REST API) should connect through the load balancer. In order to have full HA, the load balancer should also have
+HA support, or it becomes a single point of failure.
+
+---++++ Installation/Configuration Steps
+
+1. Install identically configured Oozie servers normally. Make sure they are all configured against the same database and make sure
+that you DO NOT start them yet.
+
+2. Add the following services to the extension services configuration property in oozie-site.xml in all Oozie servers. This will
+make Oozie use the ZooKeeper versions of these services instead of the default implementations.
+
+<verbatim>
+<property>
+ <name>oozie.services.ext</name>
+ <value>
+ org.apache.oozie.service.ZKLocksService,
+ org.apache.oozie.service.ZKXLogStreamingService,
+ org.apache.oozie.service.ZKJobsConcurrencyService
+ </value>
+</property>
+</verbatim>
+
+3. Add the following property to oozie-site.xml in all Oozie servers. It should be a comma-separated list of host:port pairs of the
+ZooKeeper servers. The default value is shown below.
+
+<verbatim>
+<property>
+ <name>oozie.zookeeper.connection.string</name>
+ <value>localhost:2181</value>
+</property>
+</verbatim>
+
+4. (Optional) Add the following properties to oozie-site.xml in all Oozie servers.
+
+The namespace to use. All of the Oozie Servers that are planning on talking to each other should have the same namespace. If there
+are multiple Oozie setups each doing their own HA, they should have their own namespace. The default value is shown below.
+
+<verbatim>
+<property>
+ <name>oozie.zookeeper.namespace</name>
+ <value>oozie</value>
+</property>
+</verbatim>
+
+The ID for the Oozie server to use when talking to ZooKeeper and other Oozie servers. Each Oozie server must have a unique ID. If
+blank, Oozie will use the hostname.
+
+<verbatim>
+<property>
+ <name>oozie.zookeeper.oozie.id</name>
+ <value> </value>
+</property>
+</verbatim>
+
+5. Change the value of OOZIE_BASE_URL in oozie-env.sh to point to the loadbalancer or virtual IP, for example:
+
+<verbatim>
+export OOZIE_BASE_URL="http://my.loadbalancer.hostname:11000/oozie"
+</verbatim>
+
+6. Start the ZooKeeper servers.
+
+7. Start the Oozie servers.
+
+Note: If one of the Oozie servers becomes unavailable, querying Oozie for the logs from a job in the Web UI, REST API, or client may
+be missing information until that server comes back up.
+
---++ Starting and Stopping Oozie
Use the standard Tomcat commands to start and stop Oozie.
Modified: oozie/trunk/docs/src/site/twiki/DG_CommandLineTool.twiki
URL: http://svn.apache.org/viewvc/oozie/trunk/docs/src/site/twiki/DG_CommandLineTool.twiki?rev=1518739&r1=1518738&r2=1518739&view=diff
==============================================================================
--- oozie/trunk/docs/src/site/twiki/DG_CommandLineTool.twiki (original)
+++ oozie/trunk/docs/src/site/twiki/DG_CommandLineTool.twiki Thu Aug 29 18:06:57 2013
@@ -75,6 +75,7 @@ usage:
-doas <arg> doAs user, impersonates as the specified user.
-oozie <arg> Oozie URL
-queuedump show Oozie server queue elements
+ -servers list available Oozie servers (more than one only if HA is enabled)
-status show the current system status
-systemmode <arg> Supported in Oozie-2.0 or later versions ONLY. Change oozie
system mode [NORMAL|NOWEBSERVICE|SAFEMODE]
@@ -781,6 +782,19 @@ $ oozie admin -oozie http://localhost:11
It returns the Oozie server current queued commands.
+---+++ Displaying the list of available Oozie Servers
+
+Example:
+
+<verbatim>
+$ oozie admin http://localhost:11000/oozie -servers
+OozieA : http://localhost:11000/oozie
+OozieB : http://localhost:12000/oozie
+OozieC : http://localhost:13000/oozie
+</verbatim>
+
+It returns a list of available Oozie Servers. This is useful when Oozie is configured for [[AG_Install#HA][High Availability]]; if
+not, it will simply return the one Oozie Server.
---++ Validate Operations
Modified: oozie/trunk/docs/src/site/twiki/WebServicesAPI.twiki
URL: http://svn.apache.org/viewvc/oozie/trunk/docs/src/site/twiki/WebServicesAPI.twiki?rev=1518739&r1=1518738&r2=1518739&view=diff
==============================================================================
--- oozie/trunk/docs/src/site/twiki/WebServicesAPI.twiki (original)
+++ oozie/trunk/docs/src/site/twiki/WebServicesAPI.twiki Thu Aug 29 18:06:57 2013
@@ -357,6 +357,30 @@ A HTTP GET request returns the queue dum
GET /oozie/v1/admin/queue-dump
</verbatim>
+---++++ Available Oozie Servers
+
+A HTTP GET request returns the list of available Oozie Servers. This is useful when Oozie is configured
+for [[AG_Install#HA][High Availability]]; if not, it will simply return the one Oozie Server.
+
+*Request:*
+
+<verbatim>
+GET /oozie/v2/admin/available-oozie-servers
+</verbatim>
+
+*Response:*
+
+<verbatim>
+HTTP/1.1 200 OK
+Content-Type: application/json;charset=UTF-8
+.
+{
+ "OozieA": "http://localhost:11000/oozie",
+ "OozieB": "http://localhost:12000/oozie",
+ "OozieC": "http://localhost:13000/oozie",
+}
+</verbatim>
+
---+++ Job and Jobs End-Points
_Modified in Oozie v1 WS API_
Modified: oozie/trunk/pom.xml
URL: http://svn.apache.org/viewvc/oozie/trunk/pom.xml?rev=1518739&r1=1518738&r2=1518739&view=diff
==============================================================================
--- oozie/trunk/pom.xml (original)
+++ oozie/trunk/pom.xml Thu Aug 29 18:06:57 2013
@@ -699,6 +699,24 @@
<version>1.8.5</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.curator</groupId>
+ <artifactId>curator-recipes</artifactId>
+ <version>2.2.0-incubating</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.curator</groupId>
+ <artifactId>curator-x-discovery</artifactId>
+ <version>2.2.0-incubating</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.curator</groupId>
+ <artifactId>curator-test</artifactId>
+ <version>2.2.0-incubating</version>
+ </dependency>
+
<!-- examples -->
<dependency>
<groupId>commons-httpclient</groupId>
Modified: oozie/trunk/release-log.txt
URL: http://svn.apache.org/viewvc/oozie/trunk/release-log.txt?rev=1518739&r1=1518738&r2=1518739&view=diff
==============================================================================
--- oozie/trunk/release-log.txt (original)
+++ oozie/trunk/release-log.txt Thu Aug 29 18:06:57 2013
@@ -1,5 +1,6 @@
-- Oozie 4.1.0 release (trunk - unreleased)
+OOZIE-615 Support high availability for the Oozie service (rkanter)
OOZIE-1486 Cut down on number of small files created to track a running action (mona)
OOZIE-1476 Add ability to issue kill on Coordinator Action directly with id and nominal daterange (mona)
OOZIE-1495 inconsistent behavior of chmod/chgrp when path doesn't exist after glob support (ryota)