001 /** 002 * Copyright (c) 2010 Yahoo! Inc. All rights reserved. 003 * Licensed under the Apache License, Version 2.0 (the "License"); 004 * you may not use this file except in compliance with the License. 005 * You may obtain a copy of the License at 006 * 007 * http://www.apache.org/licenses/LICENSE-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, software 010 * distributed under the License is distributed on an "AS IS" BASIS, 011 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 * See the License for the specific language governing permissions and 013 * limitations under the License. See accompanying LICENSE file. 014 */ 015 package org.apache.oozie; 016 017 import java.util.Collections; 018 import java.util.Iterator; 019 import java.util.List; 020 import java.util.Properties; 021 022 import org.apache.oozie.client.OozieClient; 023 import org.apache.oozie.client.OozieClientException; 024 import org.apache.oozie.client.WorkflowJob; 025 import org.apache.oozie.util.XConfiguration; 026 027 /** 028 * Client API to submit and manage Oozie workflow jobs against an Oozie intance. <p/> This class is thread safe. <p/> 029 * Syntax for filter for the {@link #getJobsInfo(String)} {@link #getJobsInfo(String, int, int)} methods: 030 * <code>[NAME=VALUE][;NAME=VALUE]*</code>. <p/> Valid filter names are: <p/> <ul/> <li>name: the workflow application 031 * name from the workflow definition.</li> <li>user: the user that submitted the job.</li> <li>group: the group for the 032 * job.</li> <li>status: the status of the job.</li> </ul> <p/> The query will do an AND among all the filter names. The 033 * query will do an OR among all the filter values for the same name. Multiple values must be specified as different 034 * name value pairs. 035 */ 036 public class LocalOozieClient extends OozieClient { 037 038 private DagEngine dagEngine; 039 040 /** 041 * Create a workflow client for Oozie local use. <p/> 042 * 043 * @param dagEngine the dag engine instance to use. 044 */ 045 public LocalOozieClient(DagEngine dagEngine) { 046 this.dagEngine = dagEngine; 047 } 048 049 /** 050 * Return the Oozie URL of the workflow client instance. <p/> This URL is the base URL fo the Oozie system, with not 051 * protocol versioning. 052 * 053 * @return the Oozie URL of the workflow client instance. 054 */ 055 @Override 056 public String getOozieUrl() { 057 return "localoozie"; 058 } 059 060 /** 061 * Return the Oozie URL used by the client and server for WS communications. <p/> This URL is the original URL plus 062 * the versioning element path. 063 * 064 * @return the Oozie URL used by the client and server for communication. 065 * @throws org.apache.oozie.client.OozieClientException thrown in the client and the server are not protocol 066 * compatible. 067 */ 068 @Override 069 public String getProtocolUrl() throws OozieClientException { 070 return "localoozie"; 071 } 072 073 /** 074 * Validate that the Oozie client and server instances are protocol compatible. 075 * 076 * @throws org.apache.oozie.client.OozieClientException thrown in the client and the server are not protocol 077 * compatible. 078 */ 079 @Override 080 public synchronized void validateWSVersion() throws OozieClientException { 081 } 082 083 /** 084 * Create an empty configuration with just the {@link #USER_NAME} set to the JVM user name and the {@link 085 * #GROUP_NAME} set to 'other'. 086 * 087 * @return an empty configuration. 088 */ 089 @Override 090 public Properties createConfiguration() { 091 Properties conf = new Properties(); 092 if (dagEngine != null) { 093 conf.setProperty(USER_NAME, dagEngine.getUser()); 094 } 095 conf.setProperty(GROUP_NAME, "users"); 096 return conf; 097 } 098 099 /** 100 * Set a HTTP header to be used in the WS requests by the workflow instance. 101 * 102 * @param name header name. 103 * @param value header value. 104 */ 105 @Override 106 public void setHeader(String name, String value) { 107 } 108 109 /** 110 * Get the value of a set HTTP header from the workflow instance. 111 * 112 * @param name header name. 113 * @return header value, <code>null</code> if not set. 114 */ 115 @Override 116 public String getHeader(String name) { 117 return null; 118 } 119 120 /** 121 * Remove a HTTP header from the workflow client instance. 122 * 123 * @param name header name. 124 */ 125 @Override 126 public void removeHeader(String name) { 127 } 128 129 /** 130 * Return an iterator with all the header names set in the workflow instance. 131 * 132 * @return header names. 133 */ 134 @Override 135 @SuppressWarnings("unchecked") 136 public Iterator<String> getHeaderNames() { 137 return Collections.EMPTY_SET.iterator(); 138 } 139 140 141 /** 142 * Submit a workflow job. 143 * 144 * @param conf job configuration. 145 * @return the job Id. 146 * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be submitted. 147 */ 148 @Override 149 public String submit(Properties conf) throws OozieClientException { 150 try { 151 return dagEngine.submitJob(new XConfiguration(conf), false); 152 } 153 catch (DagEngineException ex) { 154 throw new OozieClientException(ex.getErrorCode().toString(), ex); 155 } 156 } 157 158 /** 159 * Start a workflow job. 160 * 161 * @param jobId job Id. 162 * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be started. 163 */ 164 @Override 165 public void start(String jobId) throws OozieClientException { 166 try { 167 dagEngine.start(jobId); 168 } 169 catch (DagEngineException ex) { 170 throw new OozieClientException(ex.getErrorCode().toString(), ex); 171 } 172 } 173 174 /** 175 * Submit and start a workflow job. 176 * 177 * @param conf job configuration. 178 * @return the job Id. 179 * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be submitted. 180 */ 181 @Override 182 public String run(Properties conf) throws OozieClientException { 183 try { 184 return dagEngine.submitJob(new XConfiguration(conf), true); 185 } 186 catch (DagEngineException ex) { 187 throw new OozieClientException(ex.getErrorCode().toString(), ex); 188 } 189 } 190 191 /** 192 * Rerun a workflow job. 193 * 194 * @param jobId job Id to rerun. 195 * @param conf configuration information for the rerun. 196 * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be started. 197 */ 198 @Override 199 public void reRun(String jobId, Properties conf) throws OozieClientException { 200 try { 201 dagEngine.reRun(jobId, new XConfiguration(conf)); 202 } 203 catch (DagEngineException ex) { 204 throw new OozieClientException(ex.getErrorCode().toString(), ex); 205 } 206 } 207 208 /** 209 * Suspend a workflow job. 210 * 211 * @param jobId job Id. 212 * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be suspended. 213 */ 214 @Override 215 public void suspend(String jobId) throws OozieClientException { 216 try { 217 dagEngine.suspend(jobId); 218 } 219 catch (DagEngineException ex) { 220 throw new OozieClientException(ex.getErrorCode().toString(), ex); 221 } 222 } 223 224 /** 225 * Resume a workflow job. 226 * 227 * @param jobId job Id. 228 * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be resume. 229 */ 230 @Override 231 public void resume(String jobId) throws OozieClientException { 232 try { 233 dagEngine.resume(jobId); 234 } 235 catch (DagEngineException ex) { 236 throw new OozieClientException(ex.getErrorCode().toString(), ex); 237 } 238 } 239 240 /** 241 * Kill a workflow job. 242 * 243 * @param jobId job Id. 244 * @throws org.apache.oozie.client.OozieClientException thrown if the job could not be killed. 245 */ 246 @Override 247 public void kill(String jobId) throws OozieClientException { 248 try { 249 dagEngine.kill(jobId); 250 } 251 catch (DagEngineException ex) { 252 throw new OozieClientException(ex.getErrorCode().toString(), ex); 253 } 254 } 255 256 /** 257 * Get the info of a workflow job. 258 * 259 * @param jobId job Id. 260 * @return the job info. 261 * @throws org.apache.oozie.client.OozieClientException thrown if the job info could not be retrieved. 262 */ 263 @Override 264 public WorkflowJob getJobInfo(String jobId) throws OozieClientException { 265 try { 266 return dagEngine.getJob(jobId); 267 } 268 catch (DagEngineException ex) { 269 throw new OozieClientException(ex.getErrorCode().toString(), ex); 270 } 271 } 272 273 /** 274 * Return the info of the workflow jobs that match the filter. 275 * 276 * @param filter job filter. Refer to the {@link LocalOozieClient} for the filter syntax. 277 * @param start jobs offset, base 1. 278 * @param len number of jobs to return. 279 * @return a list with the workflow jobs info, without node details. 280 * @throws org.apache.oozie.client.OozieClientException thrown if the jobs info could not be retrieved. 281 */ 282 @Override 283 public List<WorkflowJob> getJobsInfo(String filter, int start, int len) throws OozieClientException { 284 try { 285 return (List) dagEngine.getJobs(filter, start, len).getWorkflows(); 286 } 287 catch (DagEngineException ex) { 288 throw new OozieClientException(ex.getErrorCode().toString(), ex); 289 } 290 } 291 292 /** 293 * Return the info of the workflow jobs that match the filter. <p/> It returns the first 100 jobs that match the 294 * filter. 295 * 296 * @param filter job filter. Refer to the {@link LocalOozieClient} for the filter syntax. 297 * @return a list with the workflow jobs info, without node details. 298 * @throws org.apache.oozie.client.OozieClientException thrown if the jobs info could not be retrieved. 299 */ 300 @Override 301 public List<WorkflowJob> getJobsInfo(String filter) throws OozieClientException { 302 return getJobsInfo(filter, 1, 100); 303 } 304 305 /** 306 * Return the workflow job Id for an external Id. <p/> The external Id must have provided at job creation time. 307 * 308 * @param externalId external Id given at job creation time. 309 * @return the workflow job Id for an external Id, <code>null</code> if none. 310 * @throws org.apache.oozie.client.OozieClientException thrown if the operation could not be done. 311 */ 312 @Override 313 public String getJobId(String externalId) throws OozieClientException { 314 try { 315 return dagEngine.getJobIdForExternalId(externalId); 316 } 317 catch (DagEngineException ex) { 318 throw new OozieClientException(ex.getErrorCode().toString(), ex); 319 } 320 } 321 322 /** 323 * Returns if Oozie is in safe mode or not. 324 * 325 * @return true if safe mode is ON<br> false if safe mode is OFF 326 * @throws org.apache.oozie.client.OozieClientException throw if it could not obtain the safe mode status. 327 */ 328 /*public SYSTEM_MODE isInSafeMode() throws OozieClientException { 329 //return Services.get().isSafeMode(); 330 return Services.get().getSystemMode() ; 331 }*/ 332 333 }