incubator-bigtop-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From r..@apache.org
Subject svn commit: r1326670 [5/47] - in /incubator/bigtop/trunk: ./ bigtop-deploy/puppet/manifests/ bigtop-deploy/puppet/modules/hadoop-hbase/manifests/ bigtop-deploy/puppet/modules/hadoop-hbase/templates/ bigtop-deploy/puppet/modules/hadoop-oozie/manifests/ ...
Date Mon, 16 Apr 2012 16:10:32 GMT
Added: incubator/bigtop/trunk/bigtop-packages/src/common/oozie/patch
URL: http://svn.apache.org/viewvc/incubator/bigtop/trunk/bigtop-packages/src/common/oozie/patch?rev=1326670&view=auto
==============================================================================
--- incubator/bigtop/trunk/bigtop-packages/src/common/oozie/patch (added)
+++ incubator/bigtop/trunk/bigtop-packages/src/common/oozie/patch Mon Apr 16 16:10:22 2012
@@ -0,0 +1,20476 @@
+diff --git .gitignore .gitignore
+index 1e2a1f6..84f6d75 100644
+--- .gitignore
++++ .gitignore
+@@ -16,12 +16,11 @@ target
+ 
+ # Oozie build
+ core/pig*
+-build
+-mem
++core/hive-*
+ core/build
+ core/mem
+ examples/oozietests
+ mkdistro-*.out
+ distro/downloads
+ SecurityAuth.audit
+-
++build
+diff --git client/pom.xml client/pom.xml
+index 9e2d26d..f5bc042 100644
+--- client/pom.xml
++++ client/pom.xml
+@@ -7,25 +7,28 @@
+   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.
+ -->
+-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
++         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+     <modelVersion>4.0.0</modelVersion>
+     <parent>
+         <groupId>org.apache.oozie</groupId>
+         <artifactId>oozie-main</artifactId>
+         <version>3.1.3-incubating</version>
+     </parent>
++    <groupId>org.apache.oozie</groupId>
+     <artifactId>oozie-client</artifactId>
+-    <description>Oozie Client</description>
+-    <name>Oozie Client</name>
++    <version>3.1.3-incubating</version>
++    <description>Apache Oozie Client</description>
++    <name>Apache Oozie Client</name>
+     <packaging>jar</packaging>
+ 
+     <dependencies>
+@@ -44,6 +47,18 @@
+             <artifactId>junit</artifactId>
+             <scope>test</scope>
+         </dependency>
++
++        <dependency>
++            <groupId>org.apache.hadoop</groupId>
++            <artifactId>hadoop-auth</artifactId>
++            <scope>compile</scope>
++            <exclusions>
++                <exclusion>
++                    <groupId>org.slf4j</groupId>
++                    <artifactId>slf4j-api</artifactId>
++                </exclusion>
++            </exclusions>
++        </dependency>
+     </dependencies>
+ 
+     <build>
+@@ -67,47 +82,47 @@
+     </build>
+ 
+     <profiles>
+-	     <profile>
+-	         <id>generateDocs</id>
+-	         <activation>
+-	             <activeByDefault>false</activeByDefault>
+-	             <property>
+-	                 <name>generateDocs</name>
+-	             </property>
+-	         </activation>
+-	         <build>
+-	             <plugins>
+-	                 <plugin>
+-	                     <groupId>org.apache.maven.plugins</groupId>
+-	                     <artifactId>maven-javadoc-plugin</artifactId>
+-	                     <configuration>
+-	                         <linksource>true</linksource>
+-			                 <quiet>true</quiet>
+-			                 <verbose>false</verbose>
+-			                 <source>${maven.compile.source}</source>
+-			                 <charset>${maven.compile.encoding}</charset>
+-			                 <groups>
+-			                     <group>
+-			                         <title>Client API</title>
+-			                         <packages>
+-			                             org.apache.oozie.client
+-			                         </packages>
+-			                     </group>
+-			                 </groups>
+-	                     </configuration>
+-		                 <executions>
+-	                         <execution>
+-	                             <goals>
+-	                                 <goal>javadoc</goal>
+-	                             </goals>
+-	                             <phase>package</phase>
+-	                         </execution>
+-		                 </executions>
+-	                 </plugin>
+-	             </plugins>
+-	         </build>
+-	     </profile>
++        <profile>
++            <id>generateDocs</id>
++            <activation>
++                <activeByDefault>false</activeByDefault>
++                <property>
++                    <name>generateDocs</name>
++                </property>
++            </activation>
++            <build>
++                <plugins>
++                    <plugin>
++                        <groupId>org.apache.maven.plugins</groupId>
++                        <artifactId>maven-javadoc-plugin</artifactId>
++                        <configuration>
++                            <linksource>true</linksource>
++                            <quiet>true</quiet>
++                            <verbose>false</verbose>
++                            <source>${maven.compile.source}</source>
++                            <charset>${maven.compile.encoding}</charset>
++                            <groups>
++                                <group>
++                                    <title>Client API</title>
++                                    <packages>
++                                        org.apache.oozie.client
++                                    </packages>
++                                </group>
++                            </groups>
++                        </configuration>
++                        <executions>
++                            <execution>
++                                <goals>
++                                    <goal>javadoc</goal>
++                                </goals>
++                                <phase>package</phase>
++                            </execution>
++                        </executions>
++                    </plugin>
++                </plugins>
++            </build>
++        </profile>
+     </profiles>
+-    
++
+ </project>
+ 
+diff --git client/src/main/bin/oozie client/src/main/bin/oozie
+index 9393f9f..21802a6 100644
+--- client/src/main/bin/oozie
++++ client/src/main/bin/oozie
+@@ -7,9 +7,9 @@
+ # 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.
+@@ -46,7 +46,6 @@ else
+     JAVA_BIN=${JAVA_HOME}/bin/java
+ fi
+ 
+-JAVA_PROPERTIES=""
+ while [[ ${1} =~ ^\-D ]]; do
+   JAVA_PROPERTIES="${JAVA_PROPERTIES} ${1}"
+   shift
+diff --git client/src/main/java/org/apache/oozie/cli/OozieCLI.java client/src/main/java/org/apache/oozie/cli/OozieCLI.java
+index bd35fdc..77fcdc1 100644
+--- client/src/main/java/org/apache/oozie/cli/OozieCLI.java
++++ client/src/main/java/org/apache/oozie/cli/OozieCLI.java
+@@ -6,9 +6,9 @@
+  * 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.
+@@ -31,6 +31,7 @@ import java.util.Locale;
+ import java.util.Map;
+ import java.util.Properties;
+ import java.util.TimeZone;
++import java.util.concurrent.Callable;
+ 
+ import javax.xml.XMLConstants;
+ import javax.xml.parsers.DocumentBuilder;
+@@ -48,6 +49,7 @@ import org.apache.commons.cli.OptionGroup;
+ import org.apache.commons.cli.Options;
+ import org.apache.commons.cli.ParseException;
+ import org.apache.oozie.BuildInfo;
++import org.apache.oozie.client.AuthOozieClient;
+ import org.apache.oozie.client.BundleJob;
+ import org.apache.oozie.client.CoordinatorAction;
+ import org.apache.oozie.client.CoordinatorJob;
+@@ -102,6 +104,8 @@ public class OozieCLI {
+     public static final String DEFINITION_OPTION = "definition";
+     public static final String CONFIG_CONTENT_OPTION = "configcontent";
+ 
++    public static final String DO_AS_OPTION = "doas";
++
+     public static final String LEN_OPTION = "len";
+     public static final String FILTER_OPTION = "filter";
+     public static final String JOBTYPE_OPTION = "jobtype";
+@@ -145,6 +149,9 @@ public class OozieCLI {
+      * @param args options and arguments for the Oozie CLI.
+      */
+     public static void main(String[] args) {
++        if (!System.getProperties().contains(AuthOozieClient.USE_AUTH_TOKEN_CACHE_SYS_PROP)) {
++            System.setProperty(AuthOozieClient.USE_AUTH_TOKEN_CACHE_SYS_PROP, "true");
++        }
+         System.exit(new OozieCLI().run(args));
+     }
+ 
+@@ -171,8 +178,10 @@ public class OozieCLI {
+         Option status = new Option(STATUS_OPTION, false, "show the current system status");
+         Option version = new Option(VERSION_OPTION, false, "show Oozie server build version");
+         Option queuedump = new Option(QUEUE_DUMP_OPTION, false, "show Oozie server queue elements");
++        Option doAs = new Option(DO_AS_OPTION, true, "doAs user, impersonates as the specified user");
+         Options adminOptions = new Options();
+         adminOptions.addOption(oozie);
++        adminOptions.addOption(doAs);
+         OptionGroup group = new OptionGroup();
+         group.addOption(system_mode);
+         group.addOption(status);
+@@ -218,6 +227,8 @@ public class OozieCLI {
+         Option property = OptionBuilder.withArgName("property=value").hasArgs(2).withValueSeparator().withDescription(
+                 "set/override value for given property").create("D");
+ 
++        Option doAs = new Option(DO_AS_OPTION, true, "doAs user, impersonates as the specified user");
++
+         OptionGroup actions = new OptionGroup();
+         actions.addOption(submit);
+         actions.addOption(start);
+@@ -235,6 +246,7 @@ public class OozieCLI {
+         actions.setRequired(true);
+         Options jobOptions = new Options();
+         jobOptions.addOption(oozie);
++        jobOptions.addOption(doAs);
+         jobOptions.addOption(config);
+         jobOptions.addOption(property);
+         jobOptions.addOption(changeValue);
+@@ -257,13 +269,16 @@ public class OozieCLI {
+         Option jobtype = new Option(JOBTYPE_OPTION, true,
+                 "job type ('Supported in Oozie-2.0 or later versions ONLY - 'coordinator' or 'bundle' or 'wf'(default))");
+         Option len = new Option(LEN_OPTION, true, "number of jobs (default '100')");
+-        Option filter = new Option(FILTER_OPTION, true, "user=<U>;name=<N>;group=<G>;status=<S>;...");
++        Option filter = new Option(FILTER_OPTION, true, "user=<U>;name=<N>;group=<G>;status=<S>;frequency=<F>;unit=<M> " +
++                        "(Valid unit values are 'months', 'days', 'hours' or 'minutes'.)");
+         Option localtime = new Option(LOCAL_TIME_OPTION, false, "use local time (default GMT)");
+         Option verbose = new Option(VERBOSE_OPTION, false, "verbose mode");
++        Option doAs = new Option(DO_AS_OPTION, true, "doAs user, impersonates as the specified user");
+         start.setType(Integer.class);
+         len.setType(Integer.class);
+         Options jobsOptions = new Options();
+         jobsOptions.addOption(oozie);
++        jobsOptions.addOption(doAs);
+         jobsOptions.addOption(localtime);
+         jobsOptions.addOption(start);
+         jobsOptions.addOption(len);
+@@ -293,8 +308,10 @@ public class OozieCLI {
+         Option pigFile = new Option(PIGFILE_OPTION, true, "Pig script");
+         Option property = OptionBuilder.withArgName("property=value").hasArgs(2).withValueSeparator().withDescription(
+                 "set/override value for given property").create("D");
++        Option doAs = new Option(DO_AS_OPTION, true, "doAs user, impersonates as the specified user");
+         Options pigOptions = new Options();
+         pigOptions.addOption(oozie);
++        pigOptions.addOption(doAs);
+         pigOptions.addOption(config);
+         pigOptions.addOption(property);
+         pigOptions.addOption(pigFile);
+@@ -317,7 +334,7 @@ public class OozieCLI {
+         }
+         used = true;
+ 
+-        CLIParser parser = new CLIParser(OOZIE_OPTION, getCLIHelp());
++        final CLIParser parser = new CLIParser(OOZIE_OPTION, getCLIHelp());
+         parser.addCommand(HELP_CMD, "", "display usage", new Options(), false);
+         parser.addCommand(VERSION_CMD, "", "show client version", new Options(), false);
+         parser.addCommand(JOB_CMD, "", "job operations", createJobOptions(), false);
+@@ -329,30 +346,21 @@ public class OozieCLI {
+                 createPigOptions(), true);
+ 
+         try {
+-            CLIParser.Command command = parser.parse(args);
+-            if (command.getName().equals(HELP_CMD)) {
+-                parser.showHelp();
+-            }
+-            else if (command.getName().equals(JOB_CMD)) {
+-                jobCommand(command.getCommandLine());
+-            }
+-            else if (command.getName().equals(JOBS_CMD)) {
+-                jobsCommand(command.getCommandLine());
+-            }
+-            else if (command.getName().equals(ADMIN_CMD)) {
+-                adminCommand(command.getCommandLine());
+-            }
+-            else if (command.getName().equals(VERSION_CMD)) {
+-                versionCommand();
+-            }
+-            else if (command.getName().equals(VALIDATE_CMD)) {
+-                validateCommand(command.getCommandLine());
+-            }
+-            else if (command.getName().equals(SLA_CMD)) {
+-                slaCommand(command.getCommandLine());
++            final CLIParser.Command command = parser.parse(args);
++
++            String doAsUser = command.getCommandLine().getOptionValue(DO_AS_OPTION);
++
++            if (doAsUser != null) {
++                OozieClient.doAs(doAsUser, new Callable<Void>() {
++                    @Override
++                    public Void call() throws Exception {
++                        processCommand(parser, command);
++                        return null;
++                    }
++                });
+             }
+-            else if (command.getName().equals(PIG_CMD)) {
+-                pigCommand(command.getCommandLine());
++            else {
++                processCommand(parser, command);
+             }
+ 
+             return 0;
+@@ -374,6 +382,32 @@ public class OozieCLI {
+         }
+     }
+ 
++    private void processCommand(CLIParser parser, CLIParser.Command command) throws Exception {
++        if (command.getName().equals(HELP_CMD)) {
++            parser.showHelp();
++        }
++        else if (command.getName().equals(JOB_CMD)) {
++            jobCommand(command.getCommandLine());
++        }
++        else if (command.getName().equals(JOBS_CMD)) {
++            jobsCommand(command.getCommandLine());
++        }
++        else if (command.getName().equals(ADMIN_CMD)) {
++            adminCommand(command.getCommandLine());
++        }
++        else if (command.getName().equals(VERSION_CMD)) {
++            versionCommand();
++        }
++        else if (command.getName().equals(VALIDATE_CMD)) {
++            validateCommand(command.getCommandLine());
++        }
++        else if (command.getName().equals(SLA_CMD)) {
++            slaCommand(command.getCommandLine());
++        }
++        else if (command.getName().equals(PIG_CMD)) {
++            pigCommand(command.getCommandLine());
++        }
++    }
+     protected String getOozieUrl(CommandLine commandLine) {
+         String url = commandLine.getOptionValue(OOZIE_OPTION);
+         if (url == null) {
+@@ -449,9 +483,8 @@ public class OozieCLI {
+         }
+     }
+ 
+-    private Properties getConfiguration(CommandLine commandLine) throws IOException {
+-        Properties conf = new Properties();
+-        conf.setProperty("user.name", System.getProperty("user.name"));
++    private Properties getConfiguration(OozieClient wc, CommandLine commandLine) throws IOException {
++        Properties conf = wc.createConfiguration();
+         String configFile = commandLine.getOptionValue(CONFIG_OPTION);
+         if (configFile == null) {
+             throw new IOException("configuration file not specified");
+@@ -493,7 +526,7 @@ public class OozieCLI {
+         return changeValue;
+     }
+ 
+-    private void addHeader(OozieClient wc) {
++    protected void addHeader(OozieClient wc) {
+         for (Map.Entry entry : System.getProperties().entrySet()) {
+             String key = (String) entry.getKey();
+             if (key.startsWith(WS_HEADER_PREFIX)) {
+@@ -513,10 +546,7 @@ public class OozieCLI {
+      * @throws OozieCLIException thrown if the OozieClient could not be configured.
+      */
+     protected OozieClient createOozieClient(CommandLine commandLine) throws OozieCLIException {
+-        OozieClient wc = new OozieClient(getOozieUrl(commandLine));
+-        addHeader(wc);
+-        setDebugMode(wc);
+-        return wc;
++        return createXOozieClient(commandLine);
+     }
+ 
+     /**
+@@ -529,7 +559,7 @@ public class OozieCLI {
+      * @throws OozieCLIException thrown if the XOozieClient could not be configured.
+      */
+     protected XOozieClient createXOozieClient(CommandLine commandLine) throws OozieCLIException {
+-        XOozieClient wc = new XOozieClient(getOozieUrl(commandLine));
++        XOozieClient wc = new AuthOozieClient(getOozieUrl(commandLine));
+         addHeader(wc);
+         setDebugMode(wc);
+         return wc;
+@@ -562,13 +592,13 @@ public class OozieCLI {
+ 
+         try {
+             if (options.contains(SUBMIT_OPTION)) {
+-                System.out.println(JOB_ID_PREFIX + wc.submit(getConfiguration(commandLine)));
++                System.out.println(JOB_ID_PREFIX + wc.submit(getConfiguration(wc, commandLine)));
+             }
+             else if (options.contains(START_OPTION)) {
+                 wc.start(commandLine.getOptionValue(START_OPTION));
+             }
+             else if (options.contains(DRYRUN_OPTION)) {
+-                String[] dryrunStr = wc.dryrun(getConfiguration(commandLine)).split("action for new instance");
++                String[] dryrunStr = wc.dryrun(getConfiguration(wc, commandLine)).split("action for new instance");
+                 int arraysize = dryrunStr.length;
+                 System.out.println("***coordJob after parsing: ***");
+                 System.out.println(dryrunStr[0]);
+@@ -596,11 +626,11 @@ public class OozieCLI {
+                 wc.change(commandLine.getOptionValue(CHANGE_OPTION), getChangeValue(commandLine));
+             }
+             else if (options.contains(RUN_OPTION)) {
+-                System.out.println(JOB_ID_PREFIX + wc.run(getConfiguration(commandLine)));
++                System.out.println(JOB_ID_PREFIX + wc.run(getConfiguration(wc, commandLine)));
+             }
+             else if (options.contains(RERUN_OPTION)) {
+                 if (commandLine.getOptionValue(RERUN_OPTION).contains("-W")) {
+-                    wc.reRun(commandLine.getOptionValue(RERUN_OPTION), getConfiguration(commandLine));
++                    wc.reRun(commandLine.getOptionValue(RERUN_OPTION), getConfiguration(wc, commandLine));
+                 }
+                 else if (commandLine.getOptionValue(RERUN_OPTION).contains("-B")) {
+                     String bundleJobId = commandLine.getOptionValue(RERUN_OPTION);
+@@ -685,8 +715,8 @@ public class OozieCLI {
+                             .contains(LOCAL_TIME_OPTION));
+                 }
+                 else if (commandLine.getOptionValue(INFO_OPTION).contains("-W@")) {
+-                    printWorkflowAction(wc.getWorkflowActionInfo(commandLine.getOptionValue(INFO_OPTION)), options
+-                            .contains(LOCAL_TIME_OPTION));
++                    printWorkflowAction(wc.getWorkflowActionInfo(commandLine.getOptionValue(INFO_OPTION)),
++                            options.contains(LOCAL_TIME_OPTION), options.contains(VERBOSE_OPTION));
+                 }
+                 else {
+                     String s = commandLine.getOptionValue(OFFSET_OPTION);
+@@ -865,23 +895,28 @@ public class OozieCLI {
+         }
+     }
+ 
+-    private void printWorkflowAction(WorkflowAction action, boolean contains) {
++    private void printWorkflowAction(WorkflowAction action, boolean contains, boolean verbose) {
+         System.out.println("ID : " + maskIfNull(action.getId()));
+ 
+         System.out.println(RULER);
+ 
+-        System.out.println("Console URL     : " + maskIfNull(action.getConsoleUrl()));
+-        System.out.println("Error Code      : " + maskIfNull(action.getErrorCode()));
+-        System.out.println("Error Message   : " + maskIfNull(action.getErrorMessage()));
+-        System.out.println("External ID     : " + maskIfNull(action.getExternalId()));
+-        System.out.println("External Status : " + maskIfNull(action.getExternalStatus()));
+-        System.out.println("Name            : " + maskIfNull(action.getName()));
+-        System.out.println("Retries         : " + action.getRetries());
+-        System.out.println("Tracker URI     : " + maskIfNull(action.getTrackerUri()));
+-        System.out.println("Type            : " + maskIfNull(action.getType()));
+-        System.out.println("Started         : " + maskDate(action.getStartTime(), contains));
+-        System.out.println("Status          : " + action.getStatus());
+-        System.out.println("Ended           : " + maskDate(action.getEndTime(), contains));
++        System.out.println("Console URL       : " + maskIfNull(action.getConsoleUrl()));
++        System.out.println("Error Code        : " + maskIfNull(action.getErrorCode()));
++        System.out.println("Error Message     : " + maskIfNull(action.getErrorMessage()));
++        System.out.println("External ID       : " + maskIfNull(action.getExternalId()));
++        System.out.println("External Status   : " + maskIfNull(action.getExternalStatus()));
++        System.out.println("Name              : " + maskIfNull(action.getName()));
++        System.out.println("Retries           : " + action.getRetries());
++        System.out.println("Tracker URI       : " + maskIfNull(action.getTrackerUri()));
++        System.out.println("Type              : " + maskIfNull(action.getType()));
++        System.out.println("Started           : " + maskDate(action.getStartTime(), contains));
++        System.out.println("Status            : " + action.getStatus());
++        System.out.println("Ended             : " + maskDate(action.getEndTime(), contains));
++
++        if (verbose) {
++            System.out.println("External Stats    : " + action.getStats());
++            System.out.println("External ChildIDs : " + action.getExternalChildIDs());
++        }
+ 
+         System.out.println(RULER);
+     }
+@@ -1220,6 +1255,8 @@ public class OozieCLI {
+                 sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
+                         "oozie-workflow-0.1.xsd")));
+                 sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
++                        "shell-action-0.1.xsd")));
++                sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
+                         "email-action-0.1.xsd")));
+                 sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
+                         "distcp-action-0.1.xsd")));
+@@ -1239,6 +1276,12 @@ public class OozieCLI {
+                         "oozie-bundle-0.1.xsd")));
+                 sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
+                         "oozie-sla-0.1.xsd")));
++                sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
++                        "hive-action-0.2.xsd")));
++                sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
++                        "sqoop-action-0.2.xsd")));
++                sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream(
++                        "ssh-action-0.1.xsd")));
+                 SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+                 Schema schema = factory.newSchema(sources.toArray(new StreamSource[sources.size()]));
+                 Validator validator = schema.newValidator();
+@@ -1277,11 +1320,11 @@ public class OozieCLI {
+             throw new OozieCLIException("Need to specify -config <configfile>");
+         }
+ 
+-        Properties conf = getConfiguration(commandLine);
+-        String script = commandLine.getOptionValue(PIGFILE_OPTION);
+ 
+         try {
+             XOozieClient wc = createXOozieClient(commandLine);
++            Properties conf = getConfiguration(wc, commandLine);
++            String script = commandLine.getOptionValue(PIGFILE_OPTION);
+             System.out.println(JOB_ID_PREFIX + wc.submitPig(conf, script, pigArgs.toArray(new String[pigArgs.size()])));
+         }
+         catch (OozieClientException ex) {
+diff --git client/src/main/java/org/apache/oozie/client/AuthOozieClient.java client/src/main/java/org/apache/oozie/client/AuthOozieClient.java
+new file mode 100644
+index 0000000..0853c88
+--- /dev/null
++++ client/src/main/java/org/apache/oozie/client/AuthOozieClient.java
+@@ -0,0 +1,208 @@
++/**
++ * 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.client;
++
++import org.apache.hadoop.security.authentication.client.AuthenticatedURL;
++import org.apache.hadoop.security.authentication.client.AuthenticationException;
++import org.apache.hadoop.security.authentication.client.Authenticator;
++import org.apache.hadoop.security.authentication.client.KerberosAuthenticator;
++
++import java.io.BufferedReader;
++import java.io.File;
++import java.io.FileReader;
++import java.io.FileWriter;
++import java.io.IOException;
++import java.io.Writer;
++import java.net.HttpURLConnection;
++import java.net.URL;
++
++/**
++ * This subclass of {@link XOozieClient} supports Kerberos HTTP SPNEGO and simple authentication.
++ */
++public class AuthOozieClient extends XOozieClient {
++
++    /**
++     * Java system property to specify a custom Authenticator implementation.
++     */
++    public static final String AUTHENTICATOR_CLASS_SYS_PROP = "authenticator.class";
++
++    /**
++     * Java system property that, if set the authentication token will be cached in the user home directory in a hidden
++     * file <code>.oozie-auth-token</code> with user read/write permissions only.
++     */
++    public static final String USE_AUTH_TOKEN_CACHE_SYS_PROP = "oozie.auth.token.cache";
++
++    /**
++     * File constant that defines the location of the authentication token cache file.
++     * <p/>
++     * It resolves to <code>${user.home}/.oozie-auth-token</code>.
++     */
++    public static final File AUTH_TOKEN_CACHE_FILE = new File(System.getProperty("user.home"), ".oozie-auth-token");
++
++    /**
++     * Create an instance of the AuthOozieClient.
++     *
++     * @param oozieUrl the Oozie URL
++     */
++    public AuthOozieClient(String oozieUrl) {
++        super(oozieUrl);
++    }
++
++    /**
++     * Create an authenticated connection to the Oozie server.
++     * <p/>
++     * It uses Hadoop-auth client authentication which by default supports
++     * Kerberos HTTP SPNEGO, Pseudo/Simple and anonymous.
++     * <p/>
++     * if the Java system property {@link #USE_AUTH_TOKEN_CACHE_SYS_PROP} is set to true Hadoop-auth
++     * authentication token will be cached/used in/from the '.oozie-auth-token' file in the user
++     * home directory.
++     *
++     * @param url the URL to open a HTTP connection to.
++     * @param method the HTTP method for the HTTP connection.
++     * @return an authenticated connection to the Oozie server.
++     * @throws IOException if an IO error occurred.
++     * @throws OozieClientException if an oozie client error occurred.
++     */
++    @Override
++    protected HttpURLConnection createConnection(URL url, String method) throws IOException, OozieClientException {
++        boolean useAuthFile = System.getProperty(USE_AUTH_TOKEN_CACHE_SYS_PROP, "false").equalsIgnoreCase("true");
++        AuthenticatedURL.Token readToken = new AuthenticatedURL.Token();
++        AuthenticatedURL.Token currentToken = new AuthenticatedURL.Token();
++
++        if (useAuthFile) {
++            readToken = readAuthToken();
++            if (readToken != null) {
++                currentToken = new AuthenticatedURL.Token(readToken.toString());
++            }
++        }
++
++        if (currentToken.isSet()) {
++            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
++            conn.setRequestMethod("OPTIONS");
++            AuthenticatedURL.injectToken(conn, currentToken);
++            if (conn.getResponseCode() == HttpURLConnection.HTTP_UNAUTHORIZED) {
++                AUTH_TOKEN_CACHE_FILE.delete();
++                currentToken = new AuthenticatedURL.Token();
++            }
++        }
++
++        if (!currentToken.isSet()) {
++            Authenticator authenticator = getAuthenticator();
++            try {
++                new AuthenticatedURL(authenticator).openConnection(url, currentToken);
++            }
++            catch (AuthenticationException ex) {
++                AUTH_TOKEN_CACHE_FILE.delete();
++                throw new OozieClientException(OozieClientException.AUTHENTICATION,
++                                               "Could not authenticate, " + ex.getMessage(), ex);
++            }
++        }
++        if (useAuthFile && !currentToken.equals(readToken)) {
++            writeAuthToken(currentToken);
++        }
++        HttpURLConnection conn = super.createConnection(url, method);
++
++        AuthenticatedURL.injectToken(conn, currentToken);
++        return conn;
++    }
++
++
++    /**
++     * Read a authentication token cached in the user home directory.
++     * <p/>
++     *
++     * @return the authentication token cached in the user home directory, NULL if none.
++     */
++    protected AuthenticatedURL.Token readAuthToken() {
++        AuthenticatedURL.Token authToken = null;
++        if (AUTH_TOKEN_CACHE_FILE.exists()) {
++            try {
++                BufferedReader reader = new BufferedReader(new FileReader(AUTH_TOKEN_CACHE_FILE));
++                String line = reader.readLine();
++                reader.close();
++                if (line != null) {
++                    authToken = new AuthenticatedURL.Token(line);
++                }
++            }
++            catch (IOException ex) {
++                //NOP
++            }
++        }
++        return authToken;
++    }
++
++    /**
++     * Write the current authenthication token to the user home directory.
++     * <p/>
++     * The file is written with user only read/write permissions.
++     * <p/>
++     * If the file cannot be updated or the user only ready/write permissions cannot be set the file is deleted.
++     *
++     * @param authToken the authentication token to cache.
++     */
++    protected void writeAuthToken(AuthenticatedURL.Token authToken) {
++        try {
++            Writer writer = new FileWriter(AUTH_TOKEN_CACHE_FILE);
++            writer.write(authToken.toString());
++            writer.close();
++            // sets read-write permissions to owner only
++            AUTH_TOKEN_CACHE_FILE.setReadable(false, false);
++            AUTH_TOKEN_CACHE_FILE.setReadable(true, true);
++            AUTH_TOKEN_CACHE_FILE.setWritable(true, true);
++        }
++        catch (Exception ex) {
++            // if case of any error we just delete the cache, if user-only
++            // write permissions are not properly set a security exception
++            // is thrown and the file will be deleted.
++            AUTH_TOKEN_CACHE_FILE.delete();
++        }
++    }
++
++    /**
++     * Return the Hadoop-auth Authenticator to use.
++     * <p/>
++     * It looks for value of the {@link #AUTHENTICATOR_CLASS_SYS_PROP} Java system property, if not set it uses
++     * Hadoop-auth <code>KerberosAuthenticator</code> which supports both Kerberos HTTP SPNEGO and Pseudo/simple
++     * authentication.
++     *
++     * @return the Authenticator to use, <code>NULL</code> if none.
++     *
++     * @throws OozieClientException thrown if the authenticator could not be instatiated.
++     */
++    protected Authenticator getAuthenticator() throws OozieClientException {
++        String className = System.getProperty(AUTHENTICATOR_CLASS_SYS_PROP, KerberosAuthenticator.class.getName());
++        if (className != null) {
++            try {
++                ClassLoader cl = Thread.currentThread().getContextClassLoader();
++                Class klass = (cl != null) ? cl.loadClass(className) : getClass().getClassLoader().loadClass(className);
++                return (Authenticator) klass.newInstance();
++            }
++            catch (Exception ex) {
++                throw new OozieClientException(OozieClientException.AUTHENTICATION,
++                                               "Could not instantiate Authenticator [" + className + "], " +
++                                               ex.getMessage(), ex);
++            }
++        }
++        else {
++            throw new OozieClientException(OozieClientException.AUTHENTICATION,
++                                           "Authenticator class not found [" + className + "]");
++        }
++    }
++
++}
+diff --git client/src/main/java/org/apache/oozie/client/OozieClient.java client/src/main/java/org/apache/oozie/client/OozieClient.java
+index dd3b962..1272f75 100644
+--- client/src/main/java/org/apache/oozie/client/OozieClient.java
++++ client/src/main/java/org/apache/oozie/client/OozieClient.java
+@@ -32,6 +32,7 @@ import java.util.Collections;
+ import java.util.Enumeration;
+ import java.util.HashMap;
+ import java.util.Iterator;
++import java.util.LinkedHashMap;
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Properties;
+@@ -120,6 +121,8 @@ public class OozieClient {
+     public static final String FILTER_FREQUENCY = "frequency";
+ 
+     public static final String FILTER_ID = "id";
++    
++    public static final String FILTER_UNIT = "unit";
+ 
+     public static final String CHANGE_VALUE_ENDTIME = "endtime";
+ 
+@@ -145,6 +148,32 @@ public class OozieClient {
+     private boolean validatedVersion = false;
+     private final Map<String, String> headers = new HashMap<String, String>();
+ 
++    private static ThreadLocal<String> USER_NAME_TL = new ThreadLocal<String>();
++
++    /**
++     * Allows to impersonate other users in the Oozie server. The current user
++     * must be configured as a proxyuser in Oozie.
++     * <p/>
++     * IMPORTANT: impersonation happens only with Oozie client requests done within
++     * doAs() calls.
++     *
++     * @param userName user to impersonate.
++     * @param callable callable with {@link OozieClient} calls impersonating the specified user.
++     * @return any response returned by the {@link Callable#call()} method.
++     * @throws Exception thrown by the {@link Callable#call()} method.
++     */
++    public static <T> T doAs(String userName, Callable<T> callable) throws Exception {
++        notEmpty(userName, "userName");
++        notNull(callable, "callable");
++        try {
++            USER_NAME_TL.set(userName);
++            return callable.call();
++        }
++        finally {
++            USER_NAME_TL.remove();
++        }
++    }
++
+     protected OozieClient() {
+     }
+ 
+@@ -253,7 +282,11 @@ public class OozieClient {
+      */
+     public Properties createConfiguration() {
+         Properties conf = new Properties();
+-        conf.setProperty(USER_NAME, System.getProperty("user.name"));
++        String userName = USER_NAME_TL.get();
++        if (userName == null) {
++            userName = System.getProperty("user.name");
++        }
++        conf.setProperty(USER_NAME, userName);
+         return conf;
+     }
+ 
+@@ -411,10 +444,14 @@ public class OozieClient {
+     }
+ 
+     static Map<String, String> prepareParams(String... params) {
+-        Map<String, String> map = new HashMap<String, String>();
++        Map<String, String> map = new LinkedHashMap<String, String>();
+         for (int i = 0; i < params.length; i = i + 2) {
+             map.put(params[i], params[i + 1]);
+         }
++        String doAsUserName = USER_NAME_TL.get();
++        if (doAsUserName != null) {
++            map.put(RestConstants.DO_AS_PARAM, doAsUserName);
++        }
+         return map;
+     }
+ 
+diff --git client/src/main/java/org/apache/oozie/client/WorkflowAction.java client/src/main/java/org/apache/oozie/client/WorkflowAction.java
+index 4fab81f..ed84063 100644
+--- client/src/main/java/org/apache/oozie/client/WorkflowAction.java
++++ client/src/main/java/org/apache/oozie/client/WorkflowAction.java
+@@ -141,6 +141,20 @@ public interface WorkflowAction {
+     String getData();
+ 
+     /**
++     * Return the action statistics.
++     *
++     * @return the action statistics.
++     */
++    String getStats();
++
++    /**
++     * Return the external child IDs of the action.
++     *
++     * @return the external child IDs of the action.
++     */
++    String getExternalChildIDs();
++
++    /**
+      * Return the external ID of the action.
+      *
+      * @return the external ID of the action.
+diff --git client/src/main/java/org/apache/oozie/client/rest/JsonTags.java client/src/main/java/org/apache/oozie/client/rest/JsonTags.java
+index 249d1f1..b8ae77f 100644
+--- client/src/main/java/org/apache/oozie/client/rest/JsonTags.java
++++ client/src/main/java/org/apache/oozie/client/rest/JsonTags.java
+@@ -65,6 +65,8 @@ public interface JsonTags {
+     public static final String WORKFLOW_ACTION_STATUS = "status";
+     public static final String WORKFLOW_ACTION_TRANSITION = "transition";
+     public static final String WORKFLOW_ACTION_DATA = "data";
++    public static final String WORKFLOW_ACTION_STATS = "stats";
++    public static final String WORKFLOW_ACTION_EXTERNAL_CHILD_IDS = "externalChildIDs";
+     public static final String WORKFLOW_ACTION_EXTERNAL_ID = "externalId";
+     public static final String WORKFLOW_ACTION_EXTERNAL_STATUS = "externalStatus";
+     public static final String WORKFLOW_ACTION_TRACKER_URI = "trackerUri";
+diff --git client/src/main/java/org/apache/oozie/client/rest/JsonToBean.java client/src/main/java/org/apache/oozie/client/rest/JsonToBean.java
+index 5c688a7..1454a72 100644
+--- client/src/main/java/org/apache/oozie/client/rest/JsonToBean.java
++++ client/src/main/java/org/apache/oozie/client/rest/JsonToBean.java
+@@ -75,6 +75,8 @@ public class JsonToBean {
+         WF_ACTION.put("getEndTime", new Property(JsonTags.WORKFLOW_ACTION_END_TIME, Date.class));
+         WF_ACTION.put("getTransition", new Property(JsonTags.WORKFLOW_ACTION_TRANSITION, String.class));
+         WF_ACTION.put("getData", new Property(JsonTags.WORKFLOW_ACTION_DATA, String.class));
++        WF_ACTION.put("getStats", new Property(JsonTags.WORKFLOW_ACTION_STATS, String.class));
++        WF_ACTION.put("getExternalChildIDs", new Property(JsonTags.WORKFLOW_ACTION_EXTERNAL_CHILD_IDS, String.class));
+         WF_ACTION.put("getExternalId", new Property(JsonTags.WORKFLOW_ACTION_EXTERNAL_ID, String.class));
+         WF_ACTION.put("getExternalStatus", new Property(JsonTags.WORKFLOW_ACTION_EXTERNAL_STATUS, String.class));
+         WF_ACTION.put("getTrackerUri", new Property(JsonTags.WORKFLOW_ACTION_TRACKER_URI, String.class));
+diff --git client/src/main/java/org/apache/oozie/client/rest/RestConstants.java client/src/main/java/org/apache/oozie/client/rest/RestConstants.java
+index c899258..305eb6f 100644
+--- client/src/main/java/org/apache/oozie/client/rest/RestConstants.java
++++ client/src/main/java/org/apache/oozie/client/rest/RestConstants.java
+@@ -134,4 +134,6 @@ public interface RestConstants {
+     public static final String MAX_EVENTS = "max-events";
+ 
+     public static final String SLA = "sla";
++
++    public static final String DO_AS_PARAM = "doAs";
+ }
+diff --git client/src/main/resources/hive-action-0.2.xsd client/src/main/resources/hive-action-0.2.xsd
+new file mode 100644
+index 0000000..884bd5f
+--- /dev/null
++++ client/src/main/resources/hive-action-0.2.xsd
+@@ -0,0 +1,68 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++  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.
++-->
++<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
++           xmlns:hive="uri:oozie:hive-action:0.2" elementFormDefault="qualified"
++           targetNamespace="uri:oozie:hive-action:0.2">
++
++    <xs:element name="hive" type="hive:ACTION"/>
++
++    <xs:complexType name="ACTION">
++        <xs:sequence>
++            <xs:element name="job-tracker" type="xs:string" minOccurs="1" maxOccurs="1"/>
++            <xs:element name="name-node" type="xs:string" minOccurs="1" maxOccurs="1"/>
++            <xs:element name="prepare" type="hive:PREPARE" minOccurs="0" maxOccurs="1"/>
++            <xs:element name="job-xml" type="xs:string" minOccurs="0" maxOccurs="1"/>
++            <xs:element name="configuration" type="hive:CONFIGURATION" minOccurs="0" maxOccurs="1"/>
++            <xs:element name="script" type="xs:string" minOccurs="1" maxOccurs="1"/>
++            <xs:element name="param" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++            <xs:element name="file" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++            <xs:element name="archive" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++        </xs:sequence>
++    </xs:complexType>
++
++    <xs:complexType name="CONFIGURATION">
++        <xs:sequence>
++            <xs:element name="property" minOccurs="1" maxOccurs="unbounded">
++                <xs:complexType>
++                    <xs:sequence>
++                        <xs:element name="name" minOccurs="1" maxOccurs="1" type="xs:string"/>
++                        <xs:element name="value" minOccurs="1" maxOccurs="1" type="xs:string"/>
++                        <xs:element name="description" minOccurs="0" maxOccurs="1" type="xs:string"/>
++                    </xs:sequence>
++                </xs:complexType>
++            </xs:element>
++        </xs:sequence>
++    </xs:complexType>
++
++    <xs:complexType name="PREPARE">
++        <xs:sequence>
++            <xs:element name="delete" type="hive:DELETE" minOccurs="0" maxOccurs="unbounded"/>
++            <xs:element name="mkdir" type="hive:MKDIR" minOccurs="0" maxOccurs="unbounded"/>
++        </xs:sequence>
++    </xs:complexType>
++
++    <xs:complexType name="DELETE">
++        <xs:attribute name="path" type="xs:string" use="required"/>
++    </xs:complexType>
++
++    <xs:complexType name="MKDIR">
++        <xs:attribute name="path" type="xs:string" use="required"/>
++    </xs:complexType>
++
++</xs:schema>
+diff --git client/src/main/resources/shell-action-0.1.xsd client/src/main/resources/shell-action-0.1.xsd
+new file mode 100644
+index 0000000..4794c0d
+--- /dev/null
++++ client/src/main/resources/shell-action-0.1.xsd
+@@ -0,0 +1,73 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++  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.
++-->
++
++<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
++           xmlns:shell="uri:oozie:shell-action:0.1" elementFormDefault="qualified"
++           targetNamespace="uri:oozie:shell-action:0.1">
++
++    <xs:element name="shell" type="shell:ACTION"/>
++
++    <xs:complexType name="ACTION">
++      <xs:sequence>
++            <xs:element name="job-tracker" type="xs:string" minOccurs="1" maxOccurs="1"/>
++            <xs:element name="name-node" type="xs:string" minOccurs="1" maxOccurs="1"/>
++            <xs:element name="prepare" type="shell:PREPARE" minOccurs="0" maxOccurs="1"/>
++            <xs:element name="job-xml" type="xs:string" minOccurs="0" maxOccurs="1"/>
++            <xs:element name="configuration" type="shell:CONFIGURATION" minOccurs="0" maxOccurs="1"/>
++            <xs:element name="exec" type="xs:string" minOccurs="1" maxOccurs="1"/>
++            <xs:element name="argument" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++            <xs:element name="env-var" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++            <xs:element name="file" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++            <xs:element name="archive" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++            <xs:element name="capture-output" type="shell:FLAG" minOccurs="0" maxOccurs="1"/>
++        </xs:sequence>
++    </xs:complexType>
++
++    <xs:complexType name="FLAG"/>
++
++    <xs:complexType name="CONFIGURATION">
++        <xs:sequence>
++            <xs:element name="property" minOccurs="1" maxOccurs="unbounded">
++                <xs:complexType>
++                    <xs:sequence>
++                        <xs:element name="name" minOccurs="1" maxOccurs="1" type="xs:string"/>
++                        <xs:element name="value" minOccurs="1" maxOccurs="1" type="xs:string"/>
++                        <xs:element name="description" minOccurs="0" maxOccurs="1" type="xs:string"/>
++                    </xs:sequence>
++                </xs:complexType>
++            </xs:element>
++        </xs:sequence>
++    </xs:complexType>
++
++    <xs:complexType name="PREPARE">
++        <xs:sequence>
++            <xs:element name="delete" type="shell:DELETE" minOccurs="0" maxOccurs="unbounded"/>
++            <xs:element name="mkdir" type="shell:MKDIR" minOccurs="0" maxOccurs="unbounded"/>
++        </xs:sequence>
++    </xs:complexType>
++
++    <xs:complexType name="DELETE">
++        <xs:attribute name="path" type="xs:string" use="required"/>
++    </xs:complexType>
++
++    <xs:complexType name="MKDIR">
++        <xs:attribute name="path" type="xs:string" use="required"/>
++    </xs:complexType>
++
++</xs:schema>
+diff --git client/src/main/resources/sqoop-action-0.2.xsd client/src/main/resources/sqoop-action-0.2.xsd
+new file mode 100644
+index 0000000..8e2ebd3
+--- /dev/null
++++ client/src/main/resources/sqoop-action-0.2.xsd
+@@ -0,0 +1,70 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++  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.
++-->
++<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
++           xmlns:sqoop="uri:oozie:sqoop-action:0.2" elementFormDefault="qualified"
++           targetNamespace="uri:oozie:sqoop-action:0.2">
++
++    <xs:element name="sqoop" type="sqoop:ACTION"/>
++
++    <xs:complexType name="ACTION">
++        <xs:sequence>
++            <xs:element name="job-tracker" type="xs:string" minOccurs="1" maxOccurs="1"/>
++            <xs:element name="name-node" type="xs:string" minOccurs="1" maxOccurs="1"/>
++            <xs:element name="prepare" type="sqoop:PREPARE" minOccurs="0" maxOccurs="1"/>
++            <xs:element name="job-xml" type="xs:string" minOccurs="0" maxOccurs="1"/>
++            <xs:element name="configuration" type="sqoop:CONFIGURATION" minOccurs="0" maxOccurs="1"/>
++            <xs:choice>
++                <xs:element name="command" type="xs:string" minOccurs="1" maxOccurs="1"/>
++                <xs:element name="arg" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
++            </xs:choice>
++            <xs:element name="file" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++            <xs:element name="archive" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++        </xs:sequence>
++    </xs:complexType>
++
++    <xs:complexType name="CONFIGURATION">
++        <xs:sequence>
++            <xs:element name="property" minOccurs="1" maxOccurs="unbounded">
++                <xs:complexType>
++                    <xs:sequence>
++                        <xs:element name="name" minOccurs="1" maxOccurs="1" type="xs:string"/>
++                        <xs:element name="value" minOccurs="1" maxOccurs="1" type="xs:string"/>
++                        <xs:element name="description" minOccurs="0" maxOccurs="1" type="xs:string"/>
++                    </xs:sequence>
++                </xs:complexType>
++            </xs:element>
++        </xs:sequence>
++    </xs:complexType>
++
++    <xs:complexType name="PREPARE">
++        <xs:sequence>
++            <xs:element name="delete" type="sqoop:DELETE" minOccurs="0" maxOccurs="unbounded"/>
++            <xs:element name="mkdir" type="sqoop:MKDIR" minOccurs="0" maxOccurs="unbounded"/>
++        </xs:sequence>
++    </xs:complexType>
++
++    <xs:complexType name="DELETE">
++        <xs:attribute name="path" type="xs:string" use="required"/>
++    </xs:complexType>
++
++    <xs:complexType name="MKDIR">
++        <xs:attribute name="path" type="xs:string" use="required"/>
++    </xs:complexType>
++
++</xs:schema>
+diff --git client/src/main/resources/ssh-action-0.1.xsd client/src/main/resources/ssh-action-0.1.xsd
+new file mode 100644
+index 0000000..e8a6f9e
+--- /dev/null
++++ client/src/main/resources/ssh-action-0.1.xsd
+@@ -0,0 +1,36 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!--
++  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.
++-->
++<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
++           xmlns:ssh="uri:oozie:ssh-action:0.1" elementFormDefault="qualified"
++           targetNamespace="uri:oozie:ssh-action:0.1">
++
++    <xs:element name="ssh" type="ssh:ACTION"/>
++
++    <xs:complexType name="ACTION">
++        <xs:sequence>
++            <xs:element name="host" type="xs:string" minOccurs="1" maxOccurs="1"/>
++            <xs:element name="command" type="xs:string" minOccurs="1" maxOccurs="1"/>
++            <xs:element name="args" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
++            <xs:element name="capture-output" type="ssh:FLAG" minOccurs="0" maxOccurs="1"/>
++        </xs:sequence>
++    </xs:complexType>
++
++    <xs:complexType name="FLAG"/>
++
++</xs:schema>
+diff --git core/pom.xml core/pom.xml
+index 106893d..a56227d 100644
+--- core/pom.xml
++++ core/pom.xml
+@@ -16,22 +16,37 @@
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ -->
+-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
++<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
++         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+     <modelVersion>4.0.0</modelVersion>
+     <parent>
+         <groupId>org.apache.oozie</groupId>
+         <artifactId>oozie-main</artifactId>
+         <version>3.1.3-incubating</version>
+     </parent>
++    <groupId>org.apache.oozie</groupId>
+     <artifactId>oozie-core</artifactId>
+-    <description>Oozie Core</description>
+-    <name>Oozie Core</name>
++    <version>3.1.3-incubating</version>
++    <description>Apache Oozie Core</description>
++    <name>Apache Oozie Core</name>
+     <packaging>jar</packaging>
+ 
+     <dependencies>
+ 
+         <dependency>
+             <groupId>org.apache.oozie</groupId>
++            <artifactId>oozie-hadoop-test</artifactId>
++            <scope>test</scope>
++        </dependency>
++
++        <dependency>
++            <groupId>org.apache.oozie</groupId>
++            <artifactId>oozie-hadoop</artifactId>
++            <scope>provided</scope>
++        </dependency>
++
++        <dependency>
++            <groupId>org.apache.oozie</groupId>
+             <artifactId>oozie-client</artifactId>
+             <scope>compile</scope>
+         </dependency>
+@@ -57,7 +72,18 @@
+         <dependency>
+             <groupId>javax.persistence</groupId>
+             <artifactId>persistence-api</artifactId>
+-            <scope>compile</scope>
++            <scope>provided</scope>
++            <exclusions>
++                <exclusion>
++                    <groupId>commons-lang</groupId>
++                    <artifactId>commons-lang</artifactId>
++                </exclusion>
++            </exclusions>
++        </dependency>
++
++        <dependency>
++            <groupId>commons-lang</groupId>
++            <artifactId>commons-lang</artifactId>
+         </dependency>
+ 
+         <dependency>
+@@ -73,34 +99,6 @@
+         </dependency>
+ 
+         <dependency>
+-            <groupId>org.apache.hadoop</groupId>
+-            <artifactId>hadoop-core</artifactId>
+-            <scope>provided</scope>
+-        </dependency>
+-        <dependency>
+-            <groupId>org.apache.hadoop</groupId>
+-            <artifactId>hadoop-test</artifactId>
+-            <scope>test</scope>
+-        </dependency>
+-        <dependency>
+-            <groupId>com.sun.jersey</groupId>
+-            <artifactId>jersey-server</artifactId>
+-            <scope>test</scope>
+-        </dependency>
+-
+-        <dependency>
+-            <groupId>org.apache.oozie</groupId>
+-            <artifactId>oozie-sharelib</artifactId>
+-            <scope>provided</scope>
+-        </dependency>
+-
+-        <dependency>
+-           <groupId>org.slf4j</groupId>
+-           <artifactId>slf4j-log4j12</artifactId>
+-           <scope>test</scope>
+-        </dependency>
+-
+-        <dependency>
+             <groupId>com.googlecode.json-simple</groupId>
+             <artifactId>json-simple</artifactId>
+             <scope>compile</scope>
+@@ -143,24 +141,6 @@
+             <scope>compile</scope>
+         </dependency>
+ 
+-		<dependency>
+-			<groupId>org.python</groupId>
+-			<artifactId>jython</artifactId>
+-			<scope>test</scope>
+-		</dependency>
+-
+-		<dependency>
+-			<groupId>org.antlr</groupId>
+-			<artifactId>antlr-runtime</artifactId>
+-			<scope>test</scope>
+-		</dependency>
+-
+-		<dependency>
+-			<groupId>com.google.guava</groupId>
+-			<artifactId>guava</artifactId>
+-			<scope>test</scope>
+-		</dependency>
+-
+         <!--
+         Oozie web-app module must exclude it.
+          -->
+@@ -190,6 +170,11 @@
+         <dependency>
+             <groupId>javax.mail</groupId>
+             <artifactId>mail</artifactId>
++        </dependency>
++
++        <dependency>
++            <groupId>org.apache.hadoop</groupId>
++            <artifactId>hadoop-auth</artifactId>
+             <scope>compile</scope>
+         </dependency>
+ 
+@@ -205,6 +190,54 @@
+             <scope>compile</scope>
+         </dependency>
+ 
++        <dependency>
++            <groupId>org.slf4j</groupId>
++            <artifactId>slf4j-api</artifactId>
++            <scope>compile</scope>
++        </dependency>
++
++        <dependency>
++            <groupId>org.slf4j</groupId>
++            <artifactId>slf4j-log4j12</artifactId>
++            <scope>compile</scope>
++        </dependency>
++
++        <dependency>
++            <groupId>org.apache.oozie</groupId>
++            <artifactId>oozie-sharelib-pig</artifactId>
++            <scope>provided</scope>
++        </dependency>
++
++        <dependency>
++            <groupId>org.apache.oozie</groupId>
++            <artifactId>oozie-sharelib-streaming</artifactId>
++            <scope>provided</scope>
++        </dependency>
++
++        <dependency>
++            <groupId>org.apache.oozie</groupId>
++            <artifactId>oozie-sharelib-hive</artifactId>
++            <scope>provided</scope>
++        </dependency>
++
++        <dependency>
++            <groupId>org.apache.oozie</groupId>
++            <artifactId>oozie-sharelib-sqoop</artifactId>
++            <scope>provided</scope>
++        </dependency>
++
++        <dependency>
++            <groupId>org.apache.oozie</groupId>
++            <artifactId>oozie-sharelib-oozie</artifactId>
++            <scope>provided</scope>
++        </dependency>
++
++        <dependency>
++            <groupId>org.mockito</groupId>
++            <artifactId>mockito-all</artifactId>
++            <scope>test</scope>
++        </dependency>
++
+     </dependencies>
+ 
+     <build>
+@@ -234,6 +267,23 @@
+                 </configuration>
+             </plugin>
+             <plugin>
++              <artifactId>maven-dependency-plugin</artifactId>
++              <executions>
++                <execution>
++                  <id>create-mrapp-generated-classpath</id>
++                  <phase>generate-test-resources</phase>
++                  <goals>
++                    <goal>build-classpath</goal>
++                  </goals>
++                  <configuration>
++                    <!-- needed to run the unit test for DS to generate the required classpath
++                         that is required in the env of the launch container in the mini mr/yarn cluster -->
++                    <outputFile>${project.build.directory}/test-classes/mrapp-generated-classpath</outputFile>
++                  </configuration>
++                </execution>
++              </executions>
++            </plugin>
++            <plugin>
+                 <groupId>org.apache.maven.plugins</groupId>
+                 <artifactId>maven-antrun-plugin</artifactId>
+                 <executions>
+@@ -242,32 +292,32 @@
+                         <configuration>
+                             <target>
+                                 <path id="cp">
+-                                    <path refid="maven.test.classpath" />
+-                                    <path refid="maven.compile.classpath" />
+-                                    <path refid="maven.dependency.classpath" />
++                                    <path refid="maven.test.classpath"/>
++                                    <path refid="maven.compile.classpath"/>
++                                    <path refid="maven.dependency.classpath"/>
+                                 </path>
+                                 <taskdef name="openjpac" classname="org.apache.openjpa.ant.PCEnhancerTask">
+-                                    <classpath refid="cp" />
++                                    <classpath refid="cp"/>
+                                 </taskdef>
+                                 <fileset id="enhance.path.ref" dir="../core/target/classes">
+-                                    <include name="**/JsonWorkflowJob.class" />
+-                                    <include name="**/JsonWorkflowAction.class" />
+-                                    <include name="**/JsonCoordinatorJob.class" />
+-                                    <include name="**/JsonCoordinatorAction.class" />
+-                                    <include name="**/JsonSLAEvent.class" />
++                                    <include name="**/JsonWorkflowJob.class"/>
++                                    <include name="**/JsonWorkflowAction.class"/>
++                                    <include name="**/JsonCoordinatorJob.class"/>
++                                    <include name="**/JsonCoordinatorAction.class"/>
++                                    <include name="**/JsonSLAEvent.class"/>
+                                     <include name="**/JsonBundleJob.class"/>
+ 
+-                                    <include name="**/WorkflowJobBean.class" />
+-                                    <include name="**/WorkflowActionBean.class" />
+-                                    <include name="**/CoordinatorJobBean.class" />
+-                                    <include name="**/CoordinatorActionBean.class" />
+-                                    <include name="**/SLAEventBean.class" />
++                                    <include name="**/WorkflowJobBean.class"/>
++                                    <include name="**/WorkflowActionBean.class"/>
++                                    <include name="**/CoordinatorJobBean.class"/>
++                                    <include name="**/CoordinatorActionBean.class"/>
++                                    <include name="**/SLAEventBean.class"/>
+                                     <include name="**/BundleJobBean.class"/>
+                                     <include name="**/BundleActionBean.class"/>
+                                 </fileset>
+                                 <openjpac>
+-                                    <classpath refid="cp" />
+-                                    <fileset refid="enhance.path.ref" />
++                                    <classpath refid="cp"/>
++                                    <fileset refid="enhance.path.ref"/>
+                                 </openjpac>
+                             </target>
+                         </configuration>
+@@ -278,17 +328,17 @@
+                 </executions>
+             </plugin>
+             <plugin>
+-                 <groupId>org.apache.rat</groupId>
+-                 <artifactId>apache-rat-plugin</artifactId>
+-                 <configuration>
+-                       <excludes>
+-                       <exclude>src/test/resources/PigMain.txt</exclude>
+-                       <exclude>src/test/resources/test-ioutils.txt</exclude>
+-                       <exclude>.gitignore</exclude>
+-                       <exclude>./SecurityAuth.audit</exclude>
+-                       </excludes>
+-                  </configuration>
+-	     </plugin>
++                <groupId>org.apache.rat</groupId>
++                <artifactId>apache-rat-plugin</artifactId>
++                <configuration>
++                    <excludes>
++                        <exclude>src/test/resources/PigMain.txt</exclude>
++                        <exclude>src/test/resources/test-ioutils.txt</exclude>
++                        <exclude>.gitignore</exclude>
++                        <exclude>./SecurityAuth.audit</exclude>
++                    </excludes>
++                </configuration>
++            </plugin>
+         </plugins>
+     </build>
+ 
+@@ -307,26 +357,26 @@
+                         <groupId>org.apache.maven.plugins</groupId>
+                         <artifactId>maven-javadoc-plugin</artifactId>
+                         <configuration>
+-		                    <linksource>true</linksource>
+-		                    <quiet>true</quiet>
+-		                    <verbose>false</verbose>
+-		                    <source>${maven.compile.source}</source>
+-		                    <charset>${maven.compile.encoding}</charset>
+-		                    <groups>
+-		                        <group>
+-		                            <title>Action Executor API</title>
+-		                            <packages>
+-		                                org.apache.oozie.action
+-		                            </packages>
+-		                        </group>
+-		                        <group>
+-		                            <title>Local Oozie (for application development/testing)</title>
+-		                            <packages>
+-		                                org.apache.oozie.local
+-		                            </packages>
+-		                        </group>
+-		                    </groups>
+-		                </configuration>
++                            <linksource>true</linksource>
++                            <quiet>true</quiet>
++                            <verbose>false</verbose>
++                            <source>${maven.compile.source}</source>
++                            <charset>${maven.compile.encoding}</charset>
++                            <groups>
++                                <group>
++                                    <title>Action Executor API</title>
++                                    <packages>
++                                        org.apache.oozie.action
++                                    </packages>
++                                </group>
++                                <group>
++                                    <title>Local Oozie (for application development/testing)</title>
++                                    <packages>
++                                        org.apache.oozie.local
++                                    </packages>
++                                </group>
++                            </groups>
++                        </configuration>
+                         <executions>
+                             <execution>
+                                 <goals>
+@@ -341,22 +391,25 @@
+         </profile>
+ 
+         <profile>
+-            <id>hadoop20</id>
++            <id>oozieci</id>
+             <activation>
+                 <activeByDefault>false</activeByDefault>
+                 <property>
+-                    <name>hadoop20</name>
+-                    <value>true</value>
++                    <name>oozieci</name>
+                 </property>
+             </activation>
+             <build>
+                 <plugins>
+                     <plugin>
+                         <groupId>org.apache.maven.plugins</groupId>
+-                        <artifactId>maven-compiler-plugin</artifactId>
++                        <artifactId>maven-surefire-plugin</artifactId>
+                         <configuration>
+                             <excludes>
+-                                <exclude>**/Kerberos*.java</exclude>
++                                <exclude>**/TestRerun.java</exclude>
++                                <exclude>**/TestCallableQueueService.java</exclude>
++                                <exclude>**/TestPigActionExecutor.java</exclude>
++                                <exclude>**/TestCallableQueueService.java</exclude>
++                                <exclude>**/TestSshActionExecutor.java</exclude>
+                             </excludes>
+                         </configuration>
+                     </plugin>
+@@ -364,91 +417,64 @@
+             </build>
+         </profile>
+ 
+-		<profile>
+-			<id>oozieci</id>
+-			<activation>
+-				<activeByDefault>false</activeByDefault>
+-				<property>
+-					<name>oozieci</name>
+-				</property>
+-			</activation>
+-			<build>
+-				<plugins>
+-					<plugin>
+-						<groupId>org.apache.maven.plugins</groupId>
+-						<artifactId>maven-surefire-plugin</artifactId>
+-						<configuration>
+-						    <excludes>
+-						        <exclude>**/TestRerun.java</exclude>
+-						        <exclude>**/TestCallableQueueService.java</exclude>
+-						        <exclude>**/TestPigActionExecutor.java</exclude>
+-						        <exclude>**/TestCallableQueueService.java</exclude>
+-						        <exclude>**/TestSshActionExecutor.java</exclude>
+-						    </excludes>
+-						</configuration>
+-					</plugin>
+-				</plugins>
+-			</build>
+-		</profile>
+-
+-		<profile>
+-			<id>test-jar-all</id>
+-			<activation>
+-				<activeByDefault>true</activeByDefault>
+-				<property>
+-					<name>testJarAll</name>
+-				</property>
+-			</activation>
+-			<build>
+-				<plugins>
+-					<plugin>
+-						<groupId>org.apache.maven.plugins</groupId>
+-						<artifactId>maven-jar-plugin</artifactId>
+-						<executions>
+-							<execution>
+-								<goals>
+-									<goal>test-jar</goal>
+-								</goals>
+-							</execution>
+-						</executions>
+-					</plugin>
+-				</plugins>
+-			</build>
+-		</profile>
+-
+-		<profile>
+-			<id>test-jar-simple</id>
+-			<activation>
+-				<activeByDefault>false</activeByDefault>
+-				<property>
+-					<name>testJarSimple</name>
+-				</property>
+-			</activation>
+-			<build>
+-				<plugins>
+-					<plugin>
+-						<groupId>org.apache.maven.plugins</groupId>
+-						<artifactId>maven-jar-plugin</artifactId>
+-						<executions>
+-							<execution>
+-								<goals>
+-									<goal>test-jar</goal>
+-								</goals>
+-								<configuration>
+-									<includes>
+-										<include>**/XTestCase.class</include>
+-										<include>**/XTestCase$1.class</include>
+-										<include>**/XFsTestCase.class</include>
+-										<include>**/MiniOozieTestCase.class</include>
+-										<include>**/XTestCase$Predicate.class</include>										
+-									</includes>
+-								</configuration>
+-							</execution>
+-						</executions>
+-					</plugin>
+-				</plugins>
+-			</build>
+-		</profile>
++        <profile>
++            <id>test-jar-all</id>
++            <activation>
++                <activeByDefault>true</activeByDefault>
++                <property>
++                    <name>testJarAll</name>
++                </property>
++            </activation>
++            <build>
++                <plugins>
++                    <plugin>
++                        <groupId>org.apache.maven.plugins</groupId>
++                        <artifactId>maven-jar-plugin</artifactId>
++                        <executions>
++                            <execution>
++                                <goals>
++                                    <goal>test-jar</goal>
++                                </goals>
++                            </execution>
++                        </executions>
++                    </plugin>
++                </plugins>
++            </build>
++        </profile>
++
++        <profile>
++            <id>test-jar-simple</id>
++            <activation>
++                <activeByDefault>false</activeByDefault>
++                <property>
++                    <name>testJarSimple</name>
++                </property>
++            </activation>
++            <build>
++                <plugins>
++                    <plugin>
++                        <groupId>org.apache.maven.plugins</groupId>
++                        <artifactId>maven-jar-plugin</artifactId>
++                        <executions>
++                            <execution>
++                                <goals>
++                                    <goal>test-jar</goal>
++                                </goals>
++                                <configuration>
++                                    <includes>
++                                        <include>**/XTestCase.class</include>
++                                        <include>**/XTestCase$1.class</include>
++                                        <include>**/XFsTestCase.class</include>
++                                        <include>**/MiniOozieTestCase.class</include>
++                                        <include>**/XTestCase$Predicate.class</include>
++                                    </includes>
++                                </configuration>
++                            </execution>
++                        </executions>
++                    </plugin>
++                </plugins>
++            </build>
++        </profile>
+ 
+         <!-- Include MySQL JDBC driver -->
+         <profile>
+@@ -456,7 +482,8 @@
+             <activation>
+                 <activeByDefault>false</activeByDefault>
+                 <property>
+-                    <name>mysql</name>
++                    <name>oozie.test.db</name>
++                    <value>mysql</value>
+                 </property>
+             </activation>
+             <dependencies>
+@@ -476,7 +503,8 @@
+             <activation>
+                 <activeByDefault>false</activeByDefault>
+                 <property>
+-                    <name>oracle</name>
++                    <name>oozie.test.db</name>
++                    <value>oracle</value>
+                 </property>
+             </activation>
+             <dependencies>
+@@ -487,6 +515,54 @@
+             </dependencies>
+         </profile>
+ 
++        <!-- Forcing antlr-runtime 3.0.1 for Hive action testcases -->
++        <!-- This is required because Pig 0.9.0 requires 3.4  and  -->
++        <!-- Hive 0.9.0-SNAPSHOT requires 3.0.1                    -->
++        <profile>
++            <id>testHive</id>
++            <activation>
++                <activeByDefault>false</activeByDefault>
++                <property>
++                    <name>testHive</name>
++                </property>
++            </activation>
++            <dependencies>
++                <dependency>
++                    <groupId>org.antlr</groupId>
++                    <artifactId>antlr-runtime</artifactId>
++                    <version>3.0.1</version>
++                    <scope>test</scope>
++                </dependency>
++            </dependencies>
++        </profile>
++
++        <!-- Forcing Hadoop 0.20.2-cdh3u2 version because Sqoop    -->
++        <!-- uses Hadoop API that is avail 0.21 onwards and the    -->
++        <!-- Hadoop CDH version is the only stable version that    -->
++        <!-- currently has such API (SQOOP-384) and published      -->
++        <!-- in public Maven repos. This is a temporary fix        -->
++        <profile>
++            <id>testSqoop</id>
++            <activation>
++                <activeByDefault>false</activeByDefault>
++                <property>
++                    <name>testSqoop</name>
++                </property>
++            </activation>
++            <properties>
++                <hadoop.version>0.20.2-cdh3u2</hadoop.version>
++            </properties>
++            <repositories>
++                <repository>
++                    <id>cdh.releases.repo</id>
++                    <url>https://repository.cloudera.com/content/groups/cdh-releases-rcs</url>
++                    <name>CDH Releases Repository</name>
++                    <snapshots>
++                        <enabled>false</enabled>
++                    </snapshots>
++                </repository>
++            </repositories>
++        </profile>
+     </profiles>
+ 
+ </project>
+diff --git core/src/main/conf/oozie-log4j.properties core/src/main/conf/oozie-log4j.properties
+index 3db1419..a14ae89 100644
+--- core/src/main/conf/oozie-log4j.properties
++++ core/src/main/conf/oozie-log4j.properties
+@@ -6,9 +6,9 @@
+ # 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.
+@@ -71,3 +71,4 @@ log4j.logger.org.apache.oozie=DEBUG, oozie
+ log4j.logger.org.apache.hadoop=WARN, oozie
+ log4j.logger.org.mortbay=WARN, oozie
+ log4j.logger.org.hsqldb=WARN, oozie
++log4j.logger.org.apache.hadoop.security.authentication.server=DEBUG, oozie
+diff --git core/src/main/conf/oozie-site.xml core/src/main/conf/oozie-site.xml
+index e17ba7b..fd58686 100644
+--- core/src/main/conf/oozie-site.xml
++++ core/src/main/conf/oozie-site.xml
+@@ -18,24 +18,29 @@
+ -->
+ <configuration>
+ 
+-<!--
+-    Refer to the oozie-default.xml file for the complete list of
+-    Oozie configuration properties and their default values.
+--->
++    <!--
++        Refer to the oozie-default.xml file for the complete list of
++        Oozie configuration properties and their default values.
++    -->
++
++    <!-- Uncomment the following  properties to enable Email & Hive actions
+ 
+-<!-- Uncomment to enable additional actions (email).
+     <property>
+         <name>oozie.service.ActionService.executor.ext.classes</name>
+         <value>
+-        org.apache.oozie.action.email.EmailActionExecutor
++            org.apache.oozie.action.email.EmailActionExecutor,
++            org.apache.oozie.action.hadoop.HiveActionExecutor,
++            org.apache.oozie.action.hadoop.ShellActionExecutor,
++            org.apache.oozie.action.hadoop.SqoopActionExecutor
+         </value>
+     </property>
+ 
+     <property>
+         <name>oozie.service.SchemaService.wf.ext.schemas</name>
+-        <value>email-action-0.1.xsd</value>
++        <value>shell-action-0.1.xsd,email-action-0.1.xsd,hive-action-0.2.xsd,sqoop-action-0.2.xsd,ssh-action-0.1.xsd</value>
+     </property>
+--->
++
++    -->
+ 
+     <property>
+         <name>oozie.system.id</name>
+@@ -80,7 +85,7 @@
+ 
+     <property>
+         <name>oozie.service.CallableQueueService.queue.size</name>
+-        <value>1000</value>
++        <value>10000</value>
+         <description>Max callable queue size</description>
+     </property>
+ 
+@@ -120,7 +125,7 @@
+ 
+     <property>
+         <name>oozie.service.StoreService.create.db.schema</name>
+-        <value>true</value>
++        <value>false</value>
+         <description>
+             Creates Oozie DB.
+ 
+@@ -244,5 +249,110 @@
+         </description>
+     </property>
+ 
+-</configuration>
++    <property>
++        <name>oozie.authentication.type</name>
++        <value>simple</value>
++        <description>
++            Defines authentication used for Oozie HTTP endpoint.
++            Supported values are: simple | kerberos | #AUTHENTICATION_HANDLER_CLASSNAME#
++        </description>
++    </property>
++
++    <property>
++        <name>oozie.authentication.token.validity</name>
++        <value>36000</value>
++        <description>
++            Indicates how long (in seconds) an authentication token is valid before it has
++            to be renewed.
++        </description>
++    </property>
++
++    <property>
++        <name>oozie.authentication.signature.secret</name>
++        <value>oozie</value>
++        <description>
++            The signature secret for signing the authentication tokens.
++            If not set a random secret is generated at startup time.
++            In order to authentiation to work correctly across multiple hosts
++            the secret must be the same across al the hosts.
++        </description>
++    </property>
++
++    <property>
++      <name>oozie.authentication.cookie.domain</name>
++      <value></value>
++      <description>
++        The domain to use for the HTTP cookie that stores the authentication token.
++        In order to authentiation to work correctly across multiple hosts
++        the domain must be correctly set.
++      </description>
++    </property>
++
++    <property>
++        <name>oozie.authentication.simple.anonymous.allowed</name>
++        <value>true</value>
++        <description>
++            Indicates if anonymous requests are allowed.
++            This setting is meaningful only when using 'simple' authentication.
++        </description>
++    </property>
++
++    <property>
++        <name>oozie.authentication.kerberos.principal</name>
++        <value>HTTP/localhost@${local.realm}</value>
++        <description>
++            Indicates the Kerberos principal to be used for HTTP endpoint.
++            The principal MUST start with 'HTTP/' as per Kerberos HTTP SPNEGO specification.
++        </description>
++    </property>
++
++    <property>
++        <name>oozie.authentication.kerberos.keytab</name>
++        <value>${oozie.service.HadoopAccessorService.keytab.file}</value>
++        <description>
++            Location of the keytab file with the credentials for the principal.
++            Referring to the same keytab file Oozie uses for its Kerberos credentials for Hadoop.
++        </description>
++    </property>
++
++    <!-- Proxyuser Configuration -->
++
++    <!--
++
++    <property>
++        <name>oozie.service.ProxyUserService.proxyuser.#USER#.hosts</name>
++        <value>*</value>
++        <description>
++            List of hosts the '#USER#' user is allowed to perform 'doAs'
++            operations.
+ 
++            The '#USER#' must be replaced with the username o the user who is
++            allowed to perform 'doAs' operations.
++
++            The value can be the '*' wildcard or a list of hostnames.
++
++            For multiple users copy this property and replace the user name
++            in the property name.
++        </description>
++    </property>
++
++    <property>
++        <name>oozie.service.ProxyUserService.proxyuser.#USER#.groups</name>
++        <value>*</value>
++        <description>
++            List of groups the '#USER#' user is allowed to impersonate users
++            from to perform 'doAs' operations.
++
++            The '#USER#' must be replaced with the username o the user who is
++            allowed to perform 'doAs' operations.
++
++            The value can be the '*' wildcard or a list of groups.
++
++            For multiple users copy this property and replace the user name
++            in the property name.
++        </description>
++    </property>
++
++    -->
++
++</configuration>
+diff --git core/src/main/java/org/apache/oozie/CoordinatorActionBean.java core/src/main/java/org/apache/oozie/CoordinatorActionBean.java
+index 54f36cd..b058097 100644
+--- core/src/main/java/org/apache/oozie/CoordinatorActionBean.java
++++ core/src/main/java/org/apache/oozie/CoordinatorActionBean.java
+@@ -78,8 +78,10 @@ import org.apache.openjpa.persistence.jdbc.Index;
+     @NamedQuery(name = "GET_COORD_ACTIONS_PENDING_FALSE_STATUS_COUNT", query = "select count(a) from CoordinatorActionBean a where a.jobId = :jobId AND a.pending = 0 AND a.status = :status"),
+ 
+     @NamedQuery(name = "GET_ACTIONS_FOR_COORD_JOB", query = "select OBJECT(a) from CoordinatorActionBean a where a.jobId = :jobId"),
+-
+-    @NamedQuery(name = "GET_COORD_ACTION_FOR_COORD_JOB_BY_ACTION_NUMBER", query = "select OBJECT(a) from CoordinatorActionBean a where a.jobId = :jobId AND a.actionNumber = :actionNumber"),
++    // Query to retrieve Coordinator actions sorted by nominal time
++    @NamedQuery(name = "GET_ACTIONS_FOR_COORD_JOB_ORDER_BY_NOMINAL_TIME", query = "select OBJECT(a) from CoordinatorActionBean a where a.jobId = :jobId order by a.nominalTimestamp"),
++    // Query to retrieve action id, action status, pending status and external Id of not completed Coordinator actions
++    @NamedQuery(name = "GET_COORD_ACTIONS_NOT_COMPLETED", query = "select a.id, a.status, a.pending, a.externalId from CoordinatorActionBean a where a.jobId = :jobId AND a.status <> 'FAILED' AND a.status <> 'TIMEDOUT' AND a.status <> 'SUCCEEDED' AND a.status <> 'KILLED'"),
+ 
+     @NamedQuery(name = "GET_COORD_ACTIONS_BY_LAST_MODIFIED_TIME", query = "select OBJECT(w) from CoordinatorActionBean w where w.lastModifiedTimestamp >= :lastModifiedTime"),
+ 
+@@ -114,6 +116,7 @@ public class CoordinatorActionBean extends JsonCoordinatorAction implements
+     private String status = null;
+ 
+     @Basic
++    @Index
+     @Column(name = "nominal_time")
+     private java.sql.Timestamp nominalTimestamp = null;
+ 
+diff --git core/src/main/java/org/apache/oozie/CoordinatorEngine.java core/src/main/java/org/apache/oozie/CoordinatorEngine.java
+index 26b2f97..adbf893 100644
+--- core/src/main/java/org/apache/oozie/CoordinatorEngine.java
++++ core/src/main/java/org/apache/oozie/CoordinatorEngine.java
+@@ -505,6 +505,7 @@ public class CoordinatorEngine extends BaseEngine {
+         FILTER_NAMES.add(OozieClient.FILTER_STATUS);
+         FILTER_NAMES.add(OozieClient.FILTER_ID);
+         FILTER_NAMES.add(OozieClient.FILTER_FREQUENCY);
++        FILTER_NAMES.add(OozieClient.FILTER_UNIT);
+     }
+ 
+     /**
+@@ -537,6 +538,10 @@ public class CoordinatorEngine extends BaseEngine {
+      */
+     private Map<String, List<String>> parseFilter(String filter) throws CoordinatorEngineException {
+         Map<String, List<String>> map = new HashMap<String, List<String>>();
++        boolean isTimeUnitSpecified = false;
++        String timeUnit = "MINUTE";
++        boolean isFrequencySpecified = false;
++        String frequency = "";
+         if (filter != null) {
+             StringTokenizer st = new StringTokenizer(filter, ";");
+             while (st.hasMoreTokens()) {
+@@ -547,10 +552,32 @@ public class CoordinatorEngine extends BaseEngine {
+                         throw new CoordinatorEngineException(ErrorCode.E0420, filter,
+                                 "elements must be name=value pairs");
+                     }
+-                    if (!FILTER_NAMES.contains(pair[0])) {
++                    if (!FILTER_NAMES.contains(pair[0].toLowerCase())) {
+                         throw new CoordinatorEngineException(ErrorCode.E0420, filter, XLog.format("invalid name [{0}]",
+                                 pair[0]));
+                     }
++                    if (pair[0].equalsIgnoreCase("frequency")) {
++                        isFrequencySpecified = true;
++                        try {
++                            frequency = (int) Float.parseFloat(pair[1]) + "";
++                            continue;
++                        }
++                        catch (NumberFormatException NANException) {
++                            throw new CoordinatorEngineException(ErrorCode.E0420, filter, XLog.format(
++                                    "invalid value [{0}] for frequency. A numerical value is expected", pair[1]));

[... 18446 lines stripped ...]


Mime
View raw message