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.ArrayList; 018 import java.util.Collections; 019 import java.util.Iterator; 020 import java.util.List; 021 import java.util.Properties; 022 023 import org.apache.oozie.client.CoordinatorAction; 024 import org.apache.oozie.client.CoordinatorJob; 025 import org.apache.oozie.client.OozieClient; 026 import org.apache.oozie.client.OozieClientException; 027 import org.apache.oozie.client.WorkflowJob; 028 import org.apache.oozie.client.rest.JsonCoordinatorAction; 029 import org.apache.oozie.util.XConfiguration; 030 031 /** 032 * Client API to submit and manage Oozie coordinator jobs against an Oozie 033 * intance. 034 * <p/> 035 * This class is thread safe. 036 * <p/> 037 * Syntax for filter for the {@link #getJobsInfo(String)} 038 * {@link #getJobsInfo(String, int, int)} methods: 039 * <code>[NAME=VALUE][;NAME=VALUE]*</code>. 040 * <p/> 041 * Valid filter names are: 042 * <p/> 043 * <ul/> 044 * <li>name: the coordinator application name from the coordinator definition.</li> 045 * <li>user: the user that submitted the job.</li> 046 * <li>group: the group for the job.</li> 047 * <li>status: the status of the job.</li> 048 * </ul> 049 * <p/> 050 * The query will do an AND among all the filter names. The query will do an OR 051 * among all the filter values for the same name. Multiple values must be 052 * specified as different name value pairs. 053 */ 054 public class LocalOozieClientCoord extends OozieClient { 055 056 private CoordinatorEngine coordEngine; 057 058 /** 059 * Create a coordinator client for Oozie local use. 060 * <p/> 061 * 062 * @param coordEngine the engine instance to use. 063 */ 064 public LocalOozieClientCoord(CoordinatorEngine coordEngine) { 065 this.coordEngine = coordEngine; 066 } 067 068 /** 069 * Return the Oozie URL of the coordinator client instance. 070 * <p/> 071 * This URL is the base URL fo the Oozie system, with not protocol 072 * versioning. 073 * 074 * @return the Oozie URL of the coordinator client instance. 075 */ 076 @Override 077 public String getOozieUrl() { 078 return "localoozie"; 079 } 080 081 /** 082 * Return the Oozie URL used by the client and server for WS communications. 083 * <p/> 084 * This URL is the original URL plus the versioning element path. 085 * 086 * @return the Oozie URL used by the client and server for communication. 087 * @throws org.apache.oozie.client.OozieClientException thrown in the client 088 * and the server are not protocol compatible. 089 */ 090 @Override 091 public String getProtocolUrl() throws OozieClientException { 092 return "localoozie"; 093 } 094 095 /** 096 * Validate that the Oozie client and server instances are protocol 097 * compatible. 098 * 099 * @throws org.apache.oozie.client.OozieClientException thrown in the client 100 * and the server are not protocol compatible. 101 */ 102 @Override 103 public synchronized void validateWSVersion() throws OozieClientException { 104 } 105 106 /** 107 * Create an empty configuration with just the {@link #USER_NAME} set to the 108 * JVM user name and the {@link #GROUP_NAME} set to 'other'. 109 * 110 * @return an empty configuration. 111 */ 112 @Override 113 public Properties createConfiguration() { 114 Properties conf = new Properties(); 115 if (coordEngine != null) { 116 conf.setProperty(USER_NAME, coordEngine.getUser()); 117 } 118 conf.setProperty(GROUP_NAME, "users"); 119 return conf; 120 } 121 122 /** 123 * Set a HTTP header to be used in the WS requests by the coordinator 124 * instance. 125 * 126 * @param name header name. 127 * @param value header value. 128 */ 129 @Override 130 public void setHeader(String name, String value) { 131 } 132 133 /** 134 * Get the value of a set HTTP header from the coordinator instance. 135 * 136 * @param name header name. 137 * @return header value, <code>null</code> if not set. 138 */ 139 @Override 140 public String getHeader(String name) { 141 return null; 142 } 143 144 /** 145 * Remove a HTTP header from the coordinator client instance. 146 * 147 * @param name header name. 148 */ 149 @Override 150 public void removeHeader(String name) { 151 } 152 153 /** 154 * Return an iterator with all the header names set in the coordinator 155 * instance. 156 * 157 * @return header names. 158 */ 159 @Override 160 @SuppressWarnings("unchecked") 161 public Iterator<String> getHeaderNames() { 162 return Collections.EMPTY_SET.iterator(); 163 } 164 165 /** 166 * Submit a coordinator job. 167 * 168 * @param conf job configuration. 169 * @return the job Id. 170 * @throws org.apache.oozie.client.OozieClientException thrown if the job 171 * could not be submitted. 172 */ 173 @Override 174 public String submit(Properties conf) throws OozieClientException { 175 try { 176 return coordEngine.submitJob(new XConfiguration(conf), false); 177 } 178 catch (CoordinatorEngineException ex) { 179 throw new OozieClientException(ex.getErrorCode().toString(), ex); 180 } 181 } 182 183 /** 184 * Start a coordinator job. 185 * 186 * @param jobId job Id. 187 * @throws org.apache.oozie.client.OozieClientException thrown if the job 188 * could not be started. 189 */ 190 @Override 191 @Deprecated 192 public void start(String jobId) throws OozieClientException { 193 try { 194 coordEngine.start(jobId); 195 } 196 catch (CoordinatorEngineException ex) { 197 throw new OozieClientException(ex.getErrorCode().toString(), ex); 198 } 199 catch (BaseEngineException bex) { 200 throw new OozieClientException(bex.getErrorCode().toString(), bex); 201 } 202 } 203 204 /** 205 * Submit and start a coordinator job. 206 * 207 * @param conf job configuration. 208 * @return the job Id. 209 * @throws org.apache.oozie.client.OozieClientException thrown if the job 210 * could not be submitted. 211 */ 212 @Override 213 public String run(Properties conf) throws OozieClientException { 214 try { 215 return coordEngine.submitJob(new XConfiguration(conf), true); 216 } 217 catch (CoordinatorEngineException ex) { 218 throw new OozieClientException(ex.getErrorCode().toString(), ex); 219 } 220 } 221 222 /** 223 * Rerun a workflow job. 224 * 225 * @param jobId job Id to rerun. 226 * @param conf configuration information for the rerun. 227 * @throws org.apache.oozie.client.OozieClientException thrown if the job 228 * could not be started. 229 */ 230 @Override 231 @Deprecated 232 public void reRun(String jobId, Properties conf) throws OozieClientException { 233 throw new OozieClientException(ErrorCode.E0301.toString(), "no-op"); 234 } 235 236 /** 237 * Rerun coordinator actions. 238 * 239 * @param jobId coordinator jobId 240 * @param rerunType rerun type 'date' if -date is used, 'action-id' if 241 * -action is used 242 * @param scope rerun scope for date or actionIds 243 * @param refresh true if -refresh is given in command option 244 * @param noCleanup true if -nocleanup is given in command option 245 * @throws OozieClientException 246 */ 247 @Override 248 public List<CoordinatorAction> reRunCoord(String jobId, String rerunType, String scope, boolean refresh, 249 boolean noCleanup) throws OozieClientException { 250 try { 251 CoordinatorActionInfo coordInfo = coordEngine.reRun(jobId, rerunType, scope, Boolean.valueOf(refresh), 252 Boolean.valueOf(noCleanup)); 253 List<CoordinatorActionBean> actionBeans = coordInfo.getCoordActions(); 254 List<CoordinatorAction> actions = new ArrayList<CoordinatorAction>(); 255 for (CoordinatorActionBean actionBean : actionBeans) { 256 actions.add(actionBean); 257 } 258 return actions; 259 } 260 catch (BaseEngineException ex) { 261 throw new OozieClientException(ex.getErrorCode().toString(), ex); 262 } 263 } 264 265 /** 266 * Suspend a coordinator job. 267 * 268 * @param jobId job Id. 269 * @throws org.apache.oozie.client.OozieClientException thrown if the job 270 * could not be suspended. 271 */ 272 @Override 273 public void suspend(String jobId) throws OozieClientException { 274 try { 275 coordEngine.suspend(jobId); 276 } 277 catch (CoordinatorEngineException ex) { 278 throw new OozieClientException(ex.getErrorCode().toString(), ex); 279 } 280 } 281 282 /** 283 * Resume a coordinator job. 284 * 285 * @param jobId job Id. 286 * @throws org.apache.oozie.client.OozieClientException thrown if the job 287 * could not be resume. 288 */ 289 @Override 290 public void resume(String jobId) throws OozieClientException { 291 try { 292 coordEngine.resume(jobId); 293 } 294 catch (CoordinatorEngineException ex) { 295 throw new OozieClientException(ex.getErrorCode().toString(), ex); 296 } 297 } 298 299 /** 300 * Kill a coordinator job. 301 * 302 * @param jobId job Id. 303 * @throws org.apache.oozie.client.OozieClientException thrown if the job 304 * could not be killed. 305 */ 306 @Override 307 public void kill(String jobId) throws OozieClientException { 308 try { 309 coordEngine.kill(jobId); 310 } 311 catch (CoordinatorEngineException ex) { 312 throw new OozieClientException(ex.getErrorCode().toString(), ex); 313 } 314 } 315 316 /** 317 * Get the info of a workflow job. 318 * 319 * @param jobId job Id. 320 * @return the job info. 321 * @throws org.apache.oozie.client.OozieClientException thrown if the job 322 * info could not be retrieved. 323 */ 324 @Override 325 @Deprecated 326 public WorkflowJob getJobInfo(String jobId) throws OozieClientException { 327 throw new OozieClientException(ErrorCode.E0301.toString(), "no-op"); 328 } 329 330 /** 331 * Get the info of a coordinator job. 332 * 333 * @param jobId job Id. 334 * @return the job info. 335 * @throws org.apache.oozie.client.OozieClientException thrown if the job 336 * info could not be retrieved. 337 */ 338 @Override 339 public CoordinatorJob getCoordJobInfo(String jobId) throws OozieClientException { 340 try { 341 return coordEngine.getCoordJob(jobId); 342 } 343 catch (CoordinatorEngineException ex) { 344 throw new OozieClientException(ex.getErrorCode().toString(), ex); 345 } 346 catch (BaseEngineException bex) { 347 throw new OozieClientException(bex.getErrorCode().toString(), bex); 348 } 349 } 350 351 /** 352 * Get the info of a coordinator action. 353 * 354 * @param actionId Id. 355 * @return the coordinator action info. 356 * @throws OozieClientException thrown if the job info could not be 357 * retrieved. 358 */ 359 @Override 360 public CoordinatorAction getCoordActionInfo(String actionId) throws OozieClientException { 361 try { 362 return coordEngine.getCoordAction(actionId); 363 } 364 catch (CoordinatorEngineException ex) { 365 throw new OozieClientException(ex.getErrorCode().toString(), ex); 366 } 367 catch (BaseEngineException bex) { 368 throw new OozieClientException(bex.getErrorCode().toString(), bex); 369 } 370 } 371 372 /** 373 * Return the info of the workflow jobs that match the filter. 374 * 375 * @param filter job filter. Refer to the {@link OozieClient} for the filter 376 * syntax. 377 * @param start jobs offset, base 1. 378 * @param len number of jobs to return. 379 * @return a list with the workflow jobs info, without node details. 380 * @throws OozieClientException thrown if the jobs info could not be 381 * retrieved. 382 */ 383 @Override 384 @Deprecated 385 public List<WorkflowJob> getJobsInfo(String filter, int start, int len) throws OozieClientException { 386 throw new OozieClientException(ErrorCode.E0301.toString(), "no-op"); 387 } 388 389 /** 390 * Return the info of the coordinator jobs that match the filter. 391 * 392 * @param filter job filter. Refer to the {@link OozieClient} for the filter 393 * syntax. 394 * @param start jobs offset, base 1. 395 * @param len number of jobs to return. 396 * @return a list with the coordinator jobs info 397 * @throws OozieClientException thrown if the jobs info could not be 398 * retrieved. 399 */ 400 @Override 401 public List<CoordinatorJob> getCoordJobsInfo(String filter, int start, int len) throws OozieClientException { 402 try { 403 CoordinatorJobInfo info = coordEngine.getCoordJobs(filter, start, len); 404 List<CoordinatorJob> jobs = new ArrayList<CoordinatorJob>(); 405 List<CoordinatorJobBean> jobBeans = info.getCoordJobs(); 406 for (CoordinatorJobBean jobBean : jobBeans) { 407 jobs.add(jobBean); 408 } 409 return jobs; 410 411 } 412 catch (CoordinatorEngineException ex) { 413 throw new OozieClientException(ex.getErrorCode().toString(), ex); 414 } 415 } 416 417 /** 418 * Return the info of the workflow jobs that match the filter. 419 * <p/> 420 * It returns the first 100 jobs that match the filter. 421 * 422 * @param filter job filter. Refer to the {@link LocalOozieClient} for the 423 * filter syntax. 424 * @return a list with the workflow jobs info, without node details. 425 * @throws org.apache.oozie.client.OozieClientException thrown if the jobs 426 * info could not be retrieved. 427 */ 428 @Override 429 @Deprecated 430 public List<WorkflowJob> getJobsInfo(String filter) throws OozieClientException { 431 throw new OozieClientException(ErrorCode.E0301.toString(), "no-op"); 432 } 433 434 }