/** * Copyright (c) 2010 Yahoo! Inc. All rights reserved. * Licensed 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. See accompanying LICENSE file. */ package org.apache.oozie; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Properties; import org.apache.oozie.client.OozieClient; import org.apache.oozie.client.OozieClientException; import org.apache.oozie.client.WorkflowJob; import org.apache.oozie.util.XConfiguration; /** * Client API to submit and manage Oozie workflow jobs against an Oozie intance. <p/> This class is thread safe. <p/> * Syntax for filter for the {@link #getJobsInfo(String)} {@link #getJobsInfo(String, int, int)} methods: * <code>[NAME=VALUE][;NAME=VALUE]*</code>. <p/> Valid filter names are: <p/> <ul/> <li>name: the workflow application * name from the workflow definition.</li> <li>user: the user that submitted the job.</li> <li>group: the group for the * job.</li> <li>status: the status of the job.</li> </ul> <p/> The query will do an AND among all the filter names. The * query will do an OR among all the filter values for the same name. Multiple values must be specified as different * name value pairs. */ public class LocalOozieClient extends OozieClient { private DagEngine dagEngine; /** * Create a workflow client for Oozie local use. <p/> * * @param dagEngine the dag engine instance to use. */ public LocalOozieClient(DagEngine dagEngine) { this.dagEngine = dagEngine; } /** * Return the Oozie URL of the workflow client instance. <p/> This URL is the base URL fo the Oozie system, with not * protocol versioning. * * @return the Oozie URL of the workflow client instance. */ @Override public String getOozieUrl() { return "localoozie"; } /** * Return the Oozie URL used by the client and server for WS communications. <p/> This URL is the original URL plus * the versioning element path. * * @return the Oozie URL used by the client and server for communication. * @throws org.apache.oozie.client.OozieClientException thrown in the client and the server are not protocol * compatible. */ @Override public String getProtocolUrl() throws OozieClientException { return "localoozie"; } /** * Validate that the Oozie client and server instances are protocol compatible. * * @throws org.apache.oozie.client.OozieClientException thrown in the client and the server are not protocol * compatible. */ @Override public synchronized void validateWSVersion() throws OozieClientException { } /** * Create an empty configuration with just the {@link #USER_NAME} set to the JVM user name and the {@link * #GROUP_NAME} set to 'other'. * * @return an empty configuration. */ @Override public Properties createConfiguration() { Properties conf = new Properties(); if (dagEngine != null) { conf.setProperty(USER_NAME, dagEngine.getUser()); } conf.setProperty(GROUP_NAME, "users"); return conf; } /** * Set a HTTP header to be used in the WS requests by the workflow instance. * * @param name header name. * @param value header value. */ @Override public void setHeader(String name, String value) { } /** * Get the value of a set HTTP header from the workflow instance. * * @param name header name. * @return header value, <code>null</code> if not set. */ @Override public String getHeader(String name) { return null; } /** * Remove a HTTP header from the workflow client instance. * * @param name header name. */ @Override public void removeHeader(String name) { } /** * Return an iterator with all the header names set in the workflow instance. * * @return header names. */ @Override @SuppressWarnings("unchecked") public Iterator<String> getHeaderNames() { return Collections.EMPTY_SET.iterator(); } /** * Submit a workflow job. * * @param conf job configuration. * @return the job Id. * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be submitted. */ @Override public String submit(Properties conf) throws OozieClientException { try { return dagEngine.submitJob(new XConfiguration(conf), false); } catch (DagEngineException ex) { throw new OozieClientException(ex.getErrorCode().toString(), ex); } } /** * Start a workflow job. * * @param jobId job Id. * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be started. */ @Override public void start(String jobId) throws OozieClientException { try { dagEngine.start(jobId); } catch (DagEngineException ex) { throw new OozieClientException(ex.getErrorCode().toString(), ex); } } /** * Submit and start a workflow job. * * @param conf job configuration. * @return the job Id. * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be submitted. */ @Override public String run(Properties conf) throws OozieClientException { try { return dagEngine.submitJob(new XConfiguration(conf), true); } catch (DagEngineException ex) { throw new OozieClientException(ex.getErrorCode().toString(), ex); } } /** * Rerun a workflow job. * * @param jobId job Id to rerun. * @param conf configuration information for the rerun. * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be started. */ @Override public void reRun(String jobId, Properties conf) throws OozieClientException { try { dagEngine.reRun(jobId, new XConfiguration(conf)); } catch (DagEngineException ex) { throw new OozieClientException(ex.getErrorCode().toString(), ex); } } /** * Suspend a workflow job. * * @param jobId job Id. * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be suspended. */ @Override public void suspend(String jobId) throws OozieClientException { try { dagEngine.suspend(jobId); } catch (DagEngineException ex) { throw new OozieClientException(ex.getErrorCode().toString(), ex); } } /** * Resume a workflow job. * * @param jobId job Id. * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be resume. */ @Override public void resume(String jobId) throws OozieClientException { try { dagEngine.resume(jobId); } catch (DagEngineException ex) { throw new OozieClientException(ex.getErrorCode().toString(), ex); } } /** * Kill a workflow job. * * @param jobId job Id. * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be killed. */ @Override public void kill(String jobId) throws OozieClientException { try { dagEngine.kill(jobId); } catch (DagEngineException ex) { throw new OozieClientException(ex.getErrorCode().toString(), ex); } } /** * Get the info of a workflow job. * * @param jobId job Id. * @return the job info. * @throws org.apache.oozie.client.OozieClientException thrown if the job info could not be retrieved. */ @Override public WorkflowJob getJobInfo(String jobId) throws OozieClientException { try { return dagEngine.getJob(jobId); } catch (DagEngineException ex) { throw new OozieClientException(ex.getErrorCode().toString(), ex); } } /** * Return the info of the workflow jobs that match the filter. * * @param filter job filter. Refer to the {@link LocalOozieClient} for the filter syntax. * @param start jobs offset, base 1. * @param len number of jobs to return. * @return a list with the workflow jobs info, without node details. * @throws org.apache.oozie.client.OozieClientException thrown if the jobs info could not be retrieved. */ @Override public List<WorkflowJob> getJobsInfo(String filter, int start, int len) throws OozieClientException { try { return (List) dagEngine.getJobs(filter, start, len).getWorkflows(); } catch (DagEngineException ex) { throw new OozieClientException(ex.getErrorCode().toString(), ex); } } /** * Return the info of the workflow jobs that match the filter. <p/> It returns the first 100 jobs that match the * filter. * * @param filter job filter. Refer to the {@link LocalOozieClient} for the filter syntax. * @return a list with the workflow jobs info, without node details. * @throws org.apache.oozie.client.OozieClientException thrown if the jobs info could not be retrieved. */ @Override public List<WorkflowJob> getJobsInfo(String filter) throws OozieClientException { return getJobsInfo(filter, 1, 100); } /** * Return the workflow job Id for an external Id. <p/> The external Id must have provided at job creation time. * * @param externalId external Id given at job creation time. * @return the workflow job Id for an external Id, <code>null</code> if none. * @throws org.apache.oozie.client.OozieClientException thrown if the operation could not be done. */ @Override public String getJobId(String externalId) throws OozieClientException { try { return dagEngine.getJobIdForExternalId(externalId); } catch (DagEngineException ex) { throw new OozieClientException(ex.getErrorCode().toString(), ex); } } /** * Returns if Oozie is in safe mode or not. * * @return true if safe mode is ON<br> false if safe mode is OFF * @throws org.apache.oozie.client.OozieClientException throw if it could not obtain the safe mode status. */ /*public SYSTEM_MODE isInSafeMode() throws OozieClientException { //return Services.get().isSafeMode(); return Services.get().getSystemMode() ; }*/ }