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.cli; 016 017 import java.io.File; 018 import java.io.FileInputStream; 019 import java.io.FileReader; 020 import java.io.IOException; 021 import java.io.InputStream; 022 import java.text.SimpleDateFormat; 023 import java.util.ArrayList; 024 import java.util.Date; 025 import java.util.List; 026 import java.util.Locale; 027 import java.util.Map; 028 import java.util.Properties; 029 import java.util.TimeZone; 030 031 import javax.xml.XMLConstants; 032 import javax.xml.parsers.DocumentBuilder; 033 import javax.xml.parsers.DocumentBuilderFactory; 034 import javax.xml.parsers.ParserConfigurationException; 035 import javax.xml.transform.stream.StreamSource; 036 import javax.xml.validation.Schema; 037 import javax.xml.validation.SchemaFactory; 038 import javax.xml.validation.Validator; 039 040 import org.apache.commons.cli.CommandLine; 041 import org.apache.commons.cli.Option; 042 import org.apache.commons.cli.OptionGroup; 043 import org.apache.commons.cli.Options; 044 import org.apache.commons.cli.ParseException; 045 import org.apache.oozie.BuildInfo; 046 import org.apache.oozie.client.CoordinatorAction; 047 import org.apache.oozie.client.CoordinatorJob; 048 import org.apache.oozie.client.OozieClient; 049 import org.apache.oozie.client.OozieClientException; 050 import org.apache.oozie.client.WorkflowAction; 051 import org.apache.oozie.client.WorkflowJob; 052 import org.apache.oozie.client.XOozieClient; 053 import org.apache.oozie.client.OozieClient.SYSTEM_MODE; 054 import org.apache.oozie.client.rest.JsonCoordinatorAction; 055 import org.apache.oozie.client.rest.RestConstants; 056 import org.w3c.dom.DOMException; 057 import org.w3c.dom.Document; 058 import org.w3c.dom.Element; 059 import org.w3c.dom.Node; 060 import org.w3c.dom.NodeList; 061 import org.w3c.dom.Text; 062 import org.xml.sax.SAXException; 063 064 /** 065 * Oozie command line utility. 066 */ 067 public class OozieCLI { 068 public static final String ENV_OOZIE_URL = "OOZIE_URL"; 069 public static final String WS_HEADER_PREFIX = "header:"; 070 071 public static final String HELP_CMD = "help"; 072 public static final String VERSION_CMD = "version"; 073 public static final String JOB_CMD = "job"; 074 public static final String JOBS_CMD = "jobs"; 075 public static final String ADMIN_CMD = "admin"; 076 public static final String VALIDATE_CMD = "validate"; 077 public static final String SLA_CMD = "sla"; 078 public static final String PIG_CMD = "pig"; 079 080 public static final String OOZIE_OPTION = "oozie"; 081 public static final String CONFIG_OPTION = "config"; 082 public static final String SUBMIT_OPTION = "submit"; 083 public static final String OFFSET_OPTION = "offset"; 084 public static final String START_OPTION = "start"; 085 public static final String RUN_OPTION = "run"; 086 public static final String DRYRUN_OPTION = "dryrun"; 087 public static final String SUSPEND_OPTION = "suspend"; 088 public static final String RESUME_OPTION = "resume"; 089 public static final String KILL_OPTION = "kill"; 090 public static final String CHANGE_OPTION = "change"; 091 public static final String CHANGE_VALUE_OPTION = "value"; 092 public static final String RERUN_OPTION = "rerun"; 093 public static final String INFO_OPTION = "info"; 094 public static final String LOG_OPTION = "log"; 095 public static final String DEFINITION_OPTION = "definition"; 096 097 public static final String LEN_OPTION = "len"; 098 public static final String FILTER_OPTION = "filter"; 099 public static final String JOBTYPE_OPTION = "jobtype"; 100 public static final String SYSTEM_MODE_OPTION = "systemmode"; 101 public static final String VERSION_OPTION = "version"; 102 public static final String STATUS_OPTION = "status"; 103 public static final String LOCAL_TIME_OPTION = "localtime"; 104 public static final String QUEUE_DUMP_OPTION = "queuedump"; 105 public static final String RERUN_ACTION_OPTION = "action"; 106 public static final String RERUN_DATE_OPTION = "date"; 107 public static final String RERUN_REFRESH_OPTION = "refresh"; 108 public static final String RERUN_NOCLEANUP_OPTION = "nocleanup"; 109 110 public static final String VERBOSE_OPTION = "verbose"; 111 public static final String VERBOSE_DELIMITER = "\t"; 112 113 public static final String PIGFILE_OPTION = "file"; 114 115 private static final String[] OOZIE_HELP = { 116 "the env variable '" + ENV_OOZIE_URL + "' is used as default value for the '-" + OOZIE_OPTION + "' option", 117 "custom headers for Oozie web services can be specified using '-D" + WS_HEADER_PREFIX + "NAME=VALUE'" }; 118 119 private static final String RULER; 120 private static final int LINE_WIDTH = 132; 121 122 private boolean used; 123 124 static { 125 StringBuilder sb = new StringBuilder(); 126 for (int i = 0; i < LINE_WIDTH; i++) { 127 sb.append("-"); 128 } 129 RULER = sb.toString(); 130 } 131 132 /** 133 * Entry point for the Oozie CLI when invoked from the command line. 134 * <p/> 135 * Upon completion this method exits the JVM with '0' (success) or '-1' 136 * (failure). 137 * 138 * @param args options and arguments for the Oozie CLI. 139 */ 140 public static void main(String[] args) { 141 System.exit(new OozieCLI().run(args)); 142 } 143 144 /** 145 * Create an Oozie CLI instance. 146 */ 147 public OozieCLI() { 148 used = false; 149 } 150 151 /** 152 * Return Oozie CLI top help lines. 153 * 154 * @return help lines. 155 */ 156 protected String[] getCLIHelp() { 157 return OOZIE_HELP; 158 } 159 160 protected Options createAdminOptions() { 161 Option oozie = new Option(OOZIE_OPTION, true, "Oozie URL"); 162 Option system_mode = new Option(SYSTEM_MODE_OPTION, true, 163 "Supported in Oozie-2.0 or later versions ONLY. Change oozie system mode [NORMAL|NOWEBSERVICE|SAFEMODE]"); 164 Option status = new Option(STATUS_OPTION, false, "show the current system status"); 165 Option version = new Option(VERSION_OPTION, false, "show Oozie server build version"); 166 Option queuedump = new Option(QUEUE_DUMP_OPTION, false, "show Oozie server queue elements"); 167 Options adminOptions = new Options(); 168 adminOptions.addOption(oozie); 169 OptionGroup group = new OptionGroup(); 170 group.addOption(system_mode); 171 group.addOption(status); 172 group.addOption(version); 173 group.addOption(queuedump); 174 adminOptions.addOptionGroup(group); 175 return adminOptions; 176 } 177 178 protected Options createJobOptions() { 179 Option oozie = new Option(OOZIE_OPTION, true, "Oozie URL"); 180 Option config = new Option(CONFIG_OPTION, true, "job configuration file '.xml' or '.properties'"); 181 Option submit = new Option(SUBMIT_OPTION, false, "submit a job (requires -config)"); 182 Option run = new Option(RUN_OPTION, false, "run a job (requires -config)"); 183 Option rerun = new Option(RERUN_OPTION, true, 184 "rerun a job (workflow requires -config, coordinator requires -action or -date)"); 185 Option dryrun = new Option(DRYRUN_OPTION, false, 186 "Supported in Oozie-2.0 or later versions ONLY - dryrun or test run a coordinator job (requires -config) - job is not queued"); 187 Option start = new Option(START_OPTION, true, "start a job"); 188 Option suspend = new Option(SUSPEND_OPTION, true, "suspend a job"); 189 Option resume = new Option(RESUME_OPTION, true, "resume a job"); 190 Option kill = new Option(KILL_OPTION, true, "kill a job"); 191 Option change = new Option(CHANGE_OPTION, true, "change a coordinator job"); 192 Option changeValue = new Option(CHANGE_VALUE_OPTION, true, "new endtime/concurrency/pausetime value for changing a coordinator job"); 193 Option info = new Option(INFO_OPTION, true, "info of a job"); 194 Option offset = new Option(OFFSET_OPTION, true, "job info offset of actions (default '1', requires -info)"); 195 Option len = new Option(LEN_OPTION, true, "number of actions (default TOTAL ACTIONS, requires -info)"); 196 Option localtime = new Option(LOCAL_TIME_OPTION, false, "use local time (default GMT)"); 197 Option log = new Option(LOG_OPTION, true, "job log"); 198 Option definition = new Option(DEFINITION_OPTION, true, "job definition"); 199 Option verbose = new Option(VERBOSE_OPTION, false, "verbose mode"); 200 Option rerun_action = new Option(RERUN_ACTION_OPTION, true, "coordinator rerun on action ids (requires -rerun)"); 201 Option rerun_date = new Option(RERUN_DATE_OPTION, true, "coordinator rerun on action dates (requires -rerun)"); 202 Option rerun_refresh = new Option(RERUN_REFRESH_OPTION, false, 203 "re-materialize the coordinator rerun actions (requires -rerun)"); 204 Option rerun_nocleanup = new Option(RERUN_NOCLEANUP_OPTION, false, 205 "do not clean up output-events of the coordiantor rerun actions (requires -rerun)"); 206 207 OptionGroup actions = new OptionGroup(); 208 actions.addOption(submit); 209 actions.addOption(start); 210 actions.addOption(run); 211 actions.addOption(dryrun); 212 actions.addOption(suspend); 213 actions.addOption(resume); 214 actions.addOption(kill); 215 actions.addOption(change); 216 actions.addOption(info); 217 actions.addOption(rerun); 218 actions.addOption(log); 219 actions.addOption(definition); 220 actions.setRequired(true); 221 Options jobOptions = new Options(); 222 jobOptions.addOption(oozie); 223 jobOptions.addOption(config); 224 jobOptions.addOption(changeValue); 225 jobOptions.addOption(localtime); 226 jobOptions.addOption(verbose); 227 jobOptions.addOption(offset); 228 jobOptions.addOption(len); 229 jobOptions.addOption(rerun_action); 230 jobOptions.addOption(rerun_date); 231 jobOptions.addOption(rerun_refresh); 232 jobOptions.addOption(rerun_nocleanup); 233 jobOptions.addOptionGroup(actions); 234 return jobOptions; 235 } 236 237 protected Options createJobsOptions() { 238 Option oozie = new Option(OOZIE_OPTION, true, "Oozie URL"); 239 Option start = new Option(OFFSET_OPTION, true, "jobs offset (default '1')"); 240 Option jobtype = new Option(JOBTYPE_OPTION, true, "job type ('Supported in Oozie-2.0 or later versions ONLY - coordinator' or 'wf' (default))"); 241 Option len = new Option(LEN_OPTION, true, "number of jobs (default '100')"); 242 Option filter = new Option(FILTER_OPTION, true, "user=<U>;name=<N>;group=<G>;status=<S>;..."); 243 Option localtime = new Option(LOCAL_TIME_OPTION, false, "use local time (default GMT)"); 244 Option verbose = new Option(VERBOSE_OPTION, false, "verbose mode"); 245 start.setType(Integer.class); 246 len.setType(Integer.class); 247 Options jobsOptions = new Options(); 248 jobsOptions.addOption(oozie); 249 jobsOptions.addOption(localtime); 250 jobsOptions.addOption(start); 251 jobsOptions.addOption(len); 252 jobsOptions.addOption(oozie); 253 jobsOptions.addOption(filter); 254 jobsOptions.addOption(jobtype); 255 jobsOptions.addOption(verbose); 256 return jobsOptions; 257 } 258 259 protected Options createSlaOptions() { 260 Option oozie = new Option(OOZIE_OPTION, true, "Oozie URL"); 261 Option start = new Option(OFFSET_OPTION, true, "start offset (default '0')"); 262 Option len = new Option(LEN_OPTION, true, "number of results (default '100')"); 263 start.setType(Integer.class); 264 len.setType(Integer.class); 265 Options slaOptions = new Options(); 266 slaOptions.addOption(start); 267 slaOptions.addOption(len); 268 slaOptions.addOption(oozie); 269 return slaOptions; 270 } 271 272 protected Options createPigOptions() { 273 Option oozie = new Option(OOZIE_OPTION, true, "Oozie URL"); 274 Option config = new Option(CONFIG_OPTION, true, "job configuration file '.properties'"); 275 Option pigFile = new Option(PIGFILE_OPTION, true, "Pig script"); 276 Options pigOptions = new Options(); 277 pigOptions.addOption(oozie); 278 pigOptions.addOption(config); 279 pigOptions.addOption(pigFile); 280 return pigOptions; 281 } 282 283 /** 284 * Run a CLI programmatically. 285 * <p/> 286 * It does not exit the JVM. 287 * <p/> 288 * A CLI instance can be used only once. 289 * 290 * @param args options and arguments for the Oozie CLI. 291 * @return '0' (success), '-1' (failure). 292 */ 293 public synchronized int run(String[] args) { 294 if (used) { 295 throw new IllegalStateException("CLI instance already used"); 296 } 297 used = true; 298 299 CLIParser parser = new CLIParser(OOZIE_OPTION, getCLIHelp()); 300 parser.addCommand(HELP_CMD, "", "display usage", new Options(), false); 301 parser.addCommand(VERSION_CMD, "", "show client version", new Options(), false); 302 parser.addCommand(JOB_CMD, "", "job operations", createJobOptions(), false); 303 parser.addCommand(JOBS_CMD, "", "jobs status", createJobsOptions(), false); 304 parser.addCommand(ADMIN_CMD, "", "admin operations", createAdminOptions(), false); 305 parser.addCommand(VALIDATE_CMD, "", "validate a workflow XML file", new Options(), true); 306 parser.addCommand(SLA_CMD, "", "sla operations (Supported in Oozie-2.0 or later)", createSlaOptions(), false); 307 parser.addCommand(PIG_CMD, "-X ", "submit a pig job, everything after '-X' are pass-through parameters to pig", 308 createPigOptions(), true); 309 310 try { 311 CLIParser.Command command = parser.parse(args); 312 if (command.getName().equals(HELP_CMD)) { 313 parser.showHelp(); 314 } 315 else if (command.getName().equals(JOB_CMD)) { 316 jobCommand(command.getCommandLine()); 317 } 318 else if (command.getName().equals(JOBS_CMD)) { 319 jobsCommand(command.getCommandLine()); 320 } 321 else if (command.getName().equals(ADMIN_CMD)) { 322 adminCommand(command.getCommandLine()); 323 } 324 else if (command.getName().equals(VERSION_CMD)) { 325 versionCommand(); 326 } 327 else if (command.getName().equals(VALIDATE_CMD)) { 328 validateCommand(command.getCommandLine()); 329 } 330 else if (command.getName().equals(SLA_CMD)) { 331 slaCommand(command.getCommandLine()); 332 } 333 else if (command.getName().equals(PIG_CMD)) { 334 pigCommand(command.getCommandLine()); 335 } 336 337 return 0; 338 } 339 catch (OozieCLIException ex) { 340 System.err.println("Error: " + ex.getMessage()); 341 return -1; 342 } 343 catch (ParseException ex) { 344 System.err.println("Invalid sub-command: " + ex.getMessage()); 345 System.err.println(); 346 System.err.println(parser.shortHelp()); 347 return -1; 348 } 349 catch (Exception ex) { 350 ex.printStackTrace(); 351 System.err.println(ex.getMessage()); 352 return -1; 353 } 354 } 355 356 protected String getOozieUrl(CommandLine commandLine) { 357 String url = commandLine.getOptionValue(OOZIE_OPTION); 358 if (url == null) { 359 url = System.getenv(ENV_OOZIE_URL); 360 if (url == null) { 361 throw new IllegalArgumentException( 362 "Oozie URL is not available neither in command option or in the environment"); 363 } 364 } 365 return url; 366 } 367 368 // Canibalized from Hadoop <code>Configuration.loadResource()</code>. 369 private Properties parse(InputStream is, Properties conf) throws IOException { 370 try { 371 DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 372 // ignore all comments inside the xml file 373 docBuilderFactory.setIgnoringComments(true); 374 DocumentBuilder builder = docBuilderFactory.newDocumentBuilder(); 375 Document doc = builder.parse(is); 376 return parseDocument(doc, conf); 377 } 378 catch (SAXException e) { 379 throw new IOException(e); 380 } 381 catch (ParserConfigurationException e) { 382 throw new IOException(e); 383 } 384 } 385 386 // Canibalized from Hadoop <code>Configuration.loadResource()</code>. 387 private Properties parseDocument(Document doc, Properties conf) throws IOException { 388 try { 389 Element root = doc.getDocumentElement(); 390 if (!"configuration".equals(root.getTagName())) { 391 throw new RuntimeException("bad conf file: top-level element not <configuration>"); 392 } 393 NodeList props = root.getChildNodes(); 394 for (int i = 0; i < props.getLength(); i++) { 395 Node propNode = props.item(i); 396 if (!(propNode instanceof Element)) { 397 continue; 398 } 399 Element prop = (Element) propNode; 400 if (!"property".equals(prop.getTagName())) { 401 throw new RuntimeException("bad conf file: element not <property>"); 402 } 403 NodeList fields = prop.getChildNodes(); 404 String attr = null; 405 String value = null; 406 for (int j = 0; j < fields.getLength(); j++) { 407 Node fieldNode = fields.item(j); 408 if (!(fieldNode instanceof Element)) { 409 continue; 410 } 411 Element field = (Element) fieldNode; 412 if ("name".equals(field.getTagName()) && field.hasChildNodes()) { 413 attr = ((Text) field.getFirstChild()).getData(); 414 } 415 if ("value".equals(field.getTagName()) && field.hasChildNodes()) { 416 value = ((Text) field.getFirstChild()).getData(); 417 } 418 } 419 420 if (attr != null && value != null) { 421 conf.setProperty(attr, value); 422 } 423 } 424 return conf; 425 } 426 catch (DOMException e) { 427 throw new IOException(e); 428 } 429 } 430 431 private Properties getConfiguration(CommandLine commandLine) throws IOException { 432 Properties conf = new Properties(); 433 conf.setProperty("user.name", System.getProperty("user.name")); 434 String configFile = commandLine.getOptionValue(CONFIG_OPTION); 435 if (configFile == null) { 436 throw new IOException("configuration file not specified"); 437 } 438 else { 439 File file = new File(configFile); 440 if (!file.exists()) { 441 throw new IOException("configuration file [" + configFile + "] not found"); 442 } 443 if (configFile.endsWith(".properties")) { 444 conf.load(new FileReader(file)); 445 } 446 else if (configFile.endsWith(".xml")) { 447 parse(new FileInputStream(configFile), conf); 448 } 449 else { 450 throw new IllegalArgumentException("configuration must be a '.properties' or a '.xml' file"); 451 } 452 } 453 return conf; 454 } 455 456 /** 457 * @param commandLine command line string. 458 * @return change value specified by -value. 459 * @throws OozieCLIException 460 */ 461 private String getChangeValue(CommandLine commandLine) throws OozieCLIException { 462 String changeValue = commandLine.getOptionValue(CHANGE_VALUE_OPTION); 463 464 if (changeValue == null) { 465 throw new OozieCLIException("-value option needs to be specified for -change option"); 466 } 467 468 return changeValue; 469 } 470 471 private void addHeader(OozieClient wc) { 472 for (Map.Entry entry : System.getProperties().entrySet()) { 473 String key = (String) entry.getKey(); 474 if (key.startsWith(WS_HEADER_PREFIX)) { 475 String header = key.substring(WS_HEADER_PREFIX.length()); 476 wc.setHeader(header, (String) entry.getValue()); 477 } 478 } 479 } 480 481 /** 482 * Create a OozieClient. <p/> It injects any '-Dheader:' as header to the the {@link 483 * org.apache.oozie.client.OozieClient}. 484 * 485 * @param commandLine the parsed command line options. 486 * @return a pre configured eXtended workflow client. 487 * @throws OozieCLIException thrown if the OozieClient could not be 488 * configured. 489 */ 490 protected OozieClient createOozieClient(CommandLine commandLine) throws OozieCLIException { 491 OozieClient wc = new OozieClient(getOozieUrl(commandLine)); 492 addHeader(wc); 493 return wc; 494 } 495 496 /** 497 * Create a XOozieClient. <p/> It injects any '-Dheader:' as header to the the {@link 498 * org.apache.oozie.client.OozieClient}. 499 * 500 * @param commandLine the parsed command line options. 501 * @return a pre configured eXtended workflow client. 502 * @throws OozieCLIException thrown if the XOozieClient could not be 503 * configured. 504 */ 505 protected XOozieClient createXOozieClient(CommandLine commandLine) throws OozieCLIException { 506 XOozieClient wc = new XOozieClient(getOozieUrl(commandLine)); 507 addHeader(wc); 508 return wc; 509 } 510 511 private static String JOB_ID_PREFIX = "job: "; 512 513 private void jobCommand(CommandLine commandLine) throws IOException, OozieCLIException { 514 XOozieClient wc = createXOozieClient(commandLine); 515 516 List<String> options = new ArrayList<String>(); 517 for (Option option : commandLine.getOptions()) { 518 options.add(option.getOpt()); 519 } 520 521 try { 522 if (options.contains(SUBMIT_OPTION)) { 523 System.out.println(JOB_ID_PREFIX + wc.submit(getConfiguration(commandLine))); 524 } 525 else if (options.contains(START_OPTION)) { 526 wc.start(commandLine.getOptionValue(START_OPTION)); 527 } 528 else if (options.contains(DRYRUN_OPTION)) { 529 String[] dryrunStr = wc.dryrun(getConfiguration(commandLine)).split("action for new instance"); 530 int arraysize = dryrunStr.length; 531 System.out.println("***coordJob after parsing: ***"); 532 System.out.println(dryrunStr[0]); 533 int aLen = dryrunStr.length - 1; 534 if (aLen < 0) { 535 aLen = 0; 536 } 537 System.out.println("***total coord actions is " + aLen + " ***"); 538 for (int i = 1; i <= arraysize - 1; i++) { 539 System.out.println(RULER); 540 System.out.println("coordAction instance: " + i + ":"); 541 System.out.println(dryrunStr[i]); 542 } 543 } 544 else if (options.contains(SUSPEND_OPTION)) { 545 wc.suspend(commandLine.getOptionValue(SUSPEND_OPTION)); 546 } 547 else if (options.contains(RESUME_OPTION)) { 548 wc.resume(commandLine.getOptionValue(RESUME_OPTION)); 549 } 550 else if (options.contains(KILL_OPTION)) { 551 wc.kill(commandLine.getOptionValue(KILL_OPTION)); 552 } 553 else if (options.contains(CHANGE_OPTION)) { 554 wc.change(commandLine.getOptionValue(CHANGE_OPTION), getChangeValue(commandLine)); 555 } 556 else if (options.contains(RUN_OPTION)) { 557 System.out.println(JOB_ID_PREFIX + wc.run(getConfiguration(commandLine))); 558 } 559 else if (options.contains(RERUN_OPTION)) { 560 if (commandLine.getOptionValue(RERUN_OPTION).contains("-W")) { 561 wc.reRun(commandLine.getOptionValue(RERUN_OPTION), getConfiguration(commandLine)); 562 } else { 563 String coordJobId = commandLine.getOptionValue(RERUN_OPTION); 564 String scope = null; 565 String rerunType = null; 566 boolean refresh = false; 567 boolean noCleanup = false; 568 if (options.contains(RERUN_DATE_OPTION) && options.contains(RERUN_ACTION_OPTION)) { 569 throw new OozieCLIException("Invalid options provided for rerun: either" + RERUN_DATE_OPTION 570 + " or " + RERUN_ACTION_OPTION + " expected. Don't use both at the same time."); 571 } 572 if (options.contains(RERUN_DATE_OPTION)) { 573 rerunType = RestConstants.JOB_COORD_RERUN_DATE; 574 scope = commandLine.getOptionValue(RERUN_DATE_OPTION); 575 } else if (options.contains(RERUN_ACTION_OPTION)){ 576 rerunType = RestConstants.JOB_COORD_RERUN_ACTION; 577 scope = commandLine.getOptionValue(RERUN_ACTION_OPTION); 578 } 579 else { 580 throw new OozieCLIException("Invalid options provided for rerun: " + RERUN_DATE_OPTION + " or " 581 + RERUN_ACTION_OPTION + " expected."); 582 } 583 if (options.contains(RERUN_REFRESH_OPTION)) { 584 refresh = true; 585 } 586 if (options.contains(RERUN_NOCLEANUP_OPTION)) { 587 noCleanup = true; 588 } 589 printRerunCoordActions(wc.reRunCoord(coordJobId, rerunType, scope, refresh, noCleanup)); 590 } 591 } 592 else if (options.contains(INFO_OPTION)) { 593 if (commandLine.getOptionValue(INFO_OPTION).endsWith("-C")) { 594 String s = commandLine.getOptionValue(OFFSET_OPTION); 595 int start = Integer.parseInt((s != null) ? s : "0"); 596 s = commandLine.getOptionValue(LEN_OPTION); 597 int len = Integer.parseInt((s != null) ? s : "0"); 598 printCoordJob(wc.getCoordJobInfo(commandLine.getOptionValue(INFO_OPTION), start, len), options 599 .contains(LOCAL_TIME_OPTION), options.contains(VERBOSE_OPTION)); 600 } 601 else if (commandLine.getOptionValue(INFO_OPTION).contains("-C@")) { 602 printCoordAction(wc.getCoordActionInfo(commandLine.getOptionValue(INFO_OPTION)), options 603 .contains(LOCAL_TIME_OPTION)); 604 } 605 else if (commandLine.getOptionValue(INFO_OPTION).contains("-W@")) { 606 printWorkflowAction(wc.getWorkflowActionInfo(commandLine.getOptionValue(INFO_OPTION)), options 607 .contains(LOCAL_TIME_OPTION)); 608 } 609 else { 610 String s = commandLine.getOptionValue(OFFSET_OPTION); 611 int start = Integer.parseInt((s != null) ? s : "0"); 612 s = commandLine.getOptionValue(LEN_OPTION); 613 String jobtype = commandLine.getOptionValue(JOBTYPE_OPTION); 614 jobtype = (jobtype != null) ? jobtype : "wf"; 615 int len = Integer.parseInt((s != null) ? s : "0"); 616 printJob(wc.getJobInfo(commandLine.getOptionValue(INFO_OPTION), start, len), options 617 .contains(LOCAL_TIME_OPTION), options.contains(VERBOSE_OPTION)); 618 } 619 } 620 else if (options.contains(LOG_OPTION)) { 621 System.out.println(wc.getJobLog(commandLine.getOptionValue(LOG_OPTION))); 622 } 623 else if (options.contains(DEFINITION_OPTION)) { 624 System.out.println(wc.getJobDefinition(commandLine.getOptionValue(DEFINITION_OPTION))); 625 } 626 } 627 catch (OozieClientException ex) { 628 throw new OozieCLIException(ex.toString(), ex); 629 } 630 } 631 632 private void printCoordJob(CoordinatorJob coordJob, boolean localtime, boolean verbose) { 633 System.out.println("Job ID : " + coordJob.getId()); 634 635 System.out.println(RULER); 636 637 List<CoordinatorAction> actions = coordJob.getActions(); 638 System.out.println("Job Name : " + maskIfNull(coordJob.getAppName())); 639 System.out.println("App Path : " + maskIfNull(coordJob.getAppPath())); 640 System.out.println("Status : " + coordJob.getStatus()); 641 System.out.println(RULER); 642 643 if (verbose) { 644 System.out.println("ID" + VERBOSE_DELIMITER + "Action Number" + VERBOSE_DELIMITER + "Console URL" 645 + VERBOSE_DELIMITER + "Error Code" + VERBOSE_DELIMITER + "Error Message" + VERBOSE_DELIMITER 646 + "External ID" + VERBOSE_DELIMITER + "External Status" + VERBOSE_DELIMITER + "Job ID" 647 + VERBOSE_DELIMITER + "Tracker URI" + VERBOSE_DELIMITER + "Created" + VERBOSE_DELIMITER 648 + "Nominal Time" + VERBOSE_DELIMITER + "Status" + VERBOSE_DELIMITER + "Last Modified" + VERBOSE_DELIMITER + "Missing Dependencies"); 649 System.out.println(RULER); 650 651 for (CoordinatorAction action : actions) { 652 System.out.println(maskIfNull(action.getId()) + VERBOSE_DELIMITER + action.getActionNumber() 653 + VERBOSE_DELIMITER + maskIfNull(action.getConsoleUrl()) + VERBOSE_DELIMITER 654 + maskIfNull(action.getErrorCode()) + VERBOSE_DELIMITER + maskIfNull(action.getErrorMessage()) 655 + VERBOSE_DELIMITER + maskIfNull(action.getExternalId()) + VERBOSE_DELIMITER 656 + maskIfNull(action.getExternalStatus()) + VERBOSE_DELIMITER + maskIfNull(action.getJobId()) 657 + VERBOSE_DELIMITER + maskIfNull(action.getTrackerUri()) + VERBOSE_DELIMITER 658 + maskDate(action.getCreatedTime(), localtime) + VERBOSE_DELIMITER + maskDate(action.getNominalTime(), localtime) 659 + action.getStatus() + VERBOSE_DELIMITER + maskDate(action.getLastModifiedTime(), localtime) + VERBOSE_DELIMITER 660 + maskIfNull(action.getMissingDependencies())); 661 662 System.out.println(RULER); 663 } 664 } 665 else { 666 System.out.println(String.format(COORD_ACTION_FORMATTER, "ID", "Status", "Ext ID", "Err Code", "Created", 667 "Nominal Time", "Last Mod")); 668 669 for (CoordinatorAction action : actions) { 670 System.out.println(String 671 .format(COORD_ACTION_FORMATTER, maskIfNull(action.getId()), action.getStatus(), 672 maskIfNull(action.getExternalId()), maskIfNull(action.getErrorCode()), maskDate(action 673 .getCreatedTime(), localtime), maskDate(action.getNominalTime(), localtime), 674 maskDate(action.getLastModifiedTime(), localtime))); 675 676 System.out.println(RULER); 677 } 678 } 679 } 680 681 private void printCoordAction(CoordinatorAction coordAction, boolean contains) { 682 System.out.println("ID : " + maskIfNull(coordAction.getId())); 683 684 System.out.println(RULER); 685 686 System.out.println("Action Number : " + coordAction.getActionNumber()); 687 System.out.println("Console URL : " + maskIfNull(coordAction.getConsoleUrl())); 688 System.out.println("Error Code : " + maskIfNull(coordAction.getErrorCode())); 689 System.out.println("Error Message : " + maskIfNull(coordAction.getErrorMessage())); 690 System.out.println("External ID : " + maskIfNull(coordAction.getExternalId())); 691 System.out.println("External Status : " + maskIfNull(coordAction.getExternalStatus())); 692 System.out.println("Job ID : " + maskIfNull(coordAction.getJobId())); 693 System.out.println("Tracker URI : " + maskIfNull(coordAction.getTrackerUri())); 694 System.out.println("Created : " + maskDate(coordAction.getCreatedTime(), contains)); 695 System.out.println("Nominal Time : " + maskDate(coordAction.getNominalTime(), contains)); 696 System.out.println("Status : " + coordAction.getStatus()); 697 System.out.println("Last Modified : " + maskDate(coordAction.getLastModifiedTime(), contains)); 698 System.out.println("Missing Dependencies : " + maskIfNull(coordAction.getMissingDependencies())); 699 700 System.out.println(RULER); 701 } 702 703 private void printRerunCoordActions(List<JsonCoordinatorAction> actions) { 704 if (actions != null && actions.size() > 0) { 705 System.out.println("Action ID" + VERBOSE_DELIMITER + "Nominal Time"); 706 System.out.println(RULER); 707 for (CoordinatorAction action : actions) { 708 System.out.println(maskIfNull(action.getId()) + VERBOSE_DELIMITER 709 + maskDate(action.getNominalTime(), false)); 710 } 711 } 712 else { 713 System.out.println("No Actions match your rerun criteria!"); 714 } 715 } 716 717 private void printWorkflowAction(WorkflowAction action, boolean contains) { 718 System.out.println("ID : " + maskIfNull(action.getId())); 719 720 System.out.println(RULER); 721 722 System.out.println("Console URL : " + maskIfNull(action.getConsoleUrl())); 723 System.out.println("Error Code : " + maskIfNull(action.getErrorCode())); 724 System.out.println("Error Message : " + maskIfNull(action.getErrorMessage())); 725 System.out.println("External ID : " + maskIfNull(action.getExternalId())); 726 System.out.println("External Status : " + maskIfNull(action.getExternalStatus())); 727 System.out.println("Name : " + maskIfNull(action.getName())); 728 System.out.println("Retries : " + action.getRetries()); 729 System.out.println("Tracker URI : " + maskIfNull(action.getTrackerUri())); 730 System.out.println("Type : " + maskIfNull(action.getType())); 731 System.out.println("Started : " + maskDate(action.getStartTime(), contains)); 732 System.out.println("Status : " + action.getStatus()); 733 System.out.println("Ended : " + maskDate(action.getEndTime(), contains)); 734 735 System.out.println(RULER); 736 } 737 738 private static final String WORKFLOW_JOBS_FORMATTER = "%-41s%-13s%-10s%-10s%-10s%-24s%-24s"; 739 private static final String COORD_JOBS_FORMATTER = "%-41s%-15s%-10s%-5s%-13s%-24s%-24s"; 740 741 private static final String WORKFLOW_ACTION_FORMATTER = "%-78s%-10s%-23s%-11s%-10s"; 742 private static final String COORD_ACTION_FORMATTER = "%-41s%-10s%-37s%-10s%-17s%-17s"; 743 744 private void printJob(WorkflowJob job, boolean localtime, boolean verbose) throws IOException { 745 System.out.println("Job ID : " + maskIfNull(job.getId())); 746 747 System.out.println(RULER); 748 749 System.out.println("Workflow Name : " + maskIfNull(job.getAppName())); 750 System.out.println("App Path : " + maskIfNull(job.getAppPath())); 751 System.out.println("Status : " + job.getStatus()); 752 System.out.println("Run : " + job.getRun()); 753 System.out.println("User : " + maskIfNull(job.getUser())); 754 System.out.println("Group : " + maskIfNull(job.getGroup())); 755 System.out.println("Created : " + maskDate(job.getCreatedTime(), localtime)); 756 System.out.println("Started : " + maskDate(job.getStartTime(), localtime)); 757 System.out.println("Last Modified : " + maskDate(job.getLastModifiedTime(), localtime)); 758 System.out.println("Ended : " + maskDate(job.getEndTime(), localtime)); 759 760 List<WorkflowAction> actions = job.getActions(); 761 762 if (actions != null && actions.size() > 0) { 763 System.out.println(); 764 System.out.println("Actions"); 765 System.out.println(RULER); 766 767 if (verbose) { 768 System.out.println("ID" + VERBOSE_DELIMITER + "Console URL" + VERBOSE_DELIMITER + "Error Code" 769 + VERBOSE_DELIMITER + "Error Message" + VERBOSE_DELIMITER + "External ID" + VERBOSE_DELIMITER 770 + "External Status" + VERBOSE_DELIMITER + "Name" + VERBOSE_DELIMITER + "Retries" 771 + VERBOSE_DELIMITER + "Tracker URI" + VERBOSE_DELIMITER + "Type" + VERBOSE_DELIMITER 772 + "Started" + VERBOSE_DELIMITER + "Status" + VERBOSE_DELIMITER + "Ended"); 773 System.out.println(RULER); 774 775 for (WorkflowAction action : job.getActions()) { 776 System.out.println(maskIfNull(action.getId()) + VERBOSE_DELIMITER 777 + maskIfNull(action.getConsoleUrl()) + VERBOSE_DELIMITER 778 + maskIfNull(action.getErrorCode()) + VERBOSE_DELIMITER 779 + maskIfNull(action.getErrorMessage()) + VERBOSE_DELIMITER 780 + maskIfNull(action.getExternalId()) + VERBOSE_DELIMITER 781 + maskIfNull(action.getExternalStatus()) + VERBOSE_DELIMITER + maskIfNull(action.getName()) 782 + VERBOSE_DELIMITER + action.getRetries() + VERBOSE_DELIMITER 783 + maskIfNull(action.getTrackerUri()) + VERBOSE_DELIMITER + maskIfNull(action.getType()) 784 + VERBOSE_DELIMITER + maskDate(action.getStartTime(), localtime) + VERBOSE_DELIMITER 785 + action.getStatus() + VERBOSE_DELIMITER + maskDate(action.getEndTime(), localtime)); 786 787 System.out.println(RULER); 788 } 789 } 790 else { 791 System.out.println(String.format(WORKFLOW_ACTION_FORMATTER, "ID", "Status", "Ext ID", "Ext Status", 792 "Err Code")); 793 794 System.out.println(RULER); 795 796 for (WorkflowAction action : job.getActions()) { 797 System.out.println(String.format(WORKFLOW_ACTION_FORMATTER, maskIfNull(action.getId()), action 798 .getStatus(), maskIfNull(action.getExternalId()), maskIfNull(action.getExternalStatus()), 799 maskIfNull(action.getErrorCode()))); 800 801 System.out.println(RULER); 802 } 803 } 804 } 805 else { 806 System.out.println(RULER); 807 } 808 809 System.out.println(); 810 } 811 812 private void jobsCommand(CommandLine commandLine) throws IOException, OozieCLIException { 813 XOozieClient wc = createXOozieClient(commandLine); 814 815 String filter = commandLine.getOptionValue(FILTER_OPTION); 816 String s = commandLine.getOptionValue(OFFSET_OPTION); 817 int start = Integer.parseInt((s != null) ? s : "0"); 818 s = commandLine.getOptionValue(LEN_OPTION); 819 String jobtype = commandLine.getOptionValue(JOBTYPE_OPTION); 820 jobtype = (jobtype != null) ? jobtype : "wf"; 821 int len = Integer.parseInt((s != null) ? s : "0"); 822 try { 823 if (jobtype.contains("wf")) { 824 printJobs(wc.getJobsInfo(filter, start, len), commandLine.hasOption(LOCAL_TIME_OPTION), commandLine 825 .hasOption(VERBOSE_OPTION)); 826 } 827 else { 828 printCoordJobs(wc.getCoordJobsInfo(filter, start, len), commandLine.hasOption(LOCAL_TIME_OPTION), 829 commandLine.hasOption(VERBOSE_OPTION)); 830 } 831 832 } 833 catch (OozieClientException ex) { 834 throw new OozieCLIException(ex.toString(), ex); 835 } 836 } 837 838 private void printCoordJobs(List<CoordinatorJob> jobs, boolean localtime, boolean verbose) throws IOException { 839 if (jobs != null && jobs.size() > 0) { 840 if (verbose) { 841 System.out.println("Job ID" + VERBOSE_DELIMITER + "App Name" + VERBOSE_DELIMITER + "App Path" 842 + VERBOSE_DELIMITER + "Console URL" + VERBOSE_DELIMITER + "User" + VERBOSE_DELIMITER + "Group" 843 + VERBOSE_DELIMITER + "Concurrency" + VERBOSE_DELIMITER + "Frequency" + VERBOSE_DELIMITER 844 + "Time Unit" + VERBOSE_DELIMITER + "Time Zone" + VERBOSE_DELIMITER + "Time Out" 845 + VERBOSE_DELIMITER + "Started" + VERBOSE_DELIMITER + "Next Materialize" + VERBOSE_DELIMITER 846 + "Status" + VERBOSE_DELIMITER + "Last Action" + VERBOSE_DELIMITER + "Ended"); 847 System.out.println(RULER); 848 849 for (CoordinatorJob job : jobs) { 850 System.out.println(maskIfNull(job.getId()) + VERBOSE_DELIMITER + maskIfNull(job.getAppName()) 851 + VERBOSE_DELIMITER + maskIfNull(job.getAppPath()) + VERBOSE_DELIMITER 852 + maskIfNull(job.getConsoleUrl()) + VERBOSE_DELIMITER + maskIfNull(job.getUser()) 853 + VERBOSE_DELIMITER + maskIfNull(job.getGroup()) + VERBOSE_DELIMITER + job.getConcurrency() 854 + VERBOSE_DELIMITER + job.getFrequency() + VERBOSE_DELIMITER + job.getTimeUnit() 855 + VERBOSE_DELIMITER + maskIfNull(job.getTimeZone()) + VERBOSE_DELIMITER + job.getTimeout() 856 + VERBOSE_DELIMITER + maskDate(job.getStartTime(), localtime) + VERBOSE_DELIMITER 857 + maskDate(job.getNextMaterializedTime(), localtime) + VERBOSE_DELIMITER + job.getStatus() 858 + VERBOSE_DELIMITER + maskDate(job.getLastActionTime(), localtime) + VERBOSE_DELIMITER 859 + maskDate(job.getEndTime(), localtime)); 860 861 System.out.println(RULER); 862 } 863 } 864 else { 865 System.out.println(String.format(COORD_JOBS_FORMATTER, "Job ID", "App Name", "Status", "Freq", "Unit", 866 "Started", "Next Materialized")); 867 System.out.println(RULER); 868 869 for (CoordinatorJob job : jobs) { 870 System.out.println(String.format(COORD_JOBS_FORMATTER, maskIfNull(job.getId()), maskIfNull(job 871 .getAppName()), job.getStatus(), job.getFrequency(), job.getTimeUnit(), maskDate(job 872 .getStartTime(), localtime), maskDate(job.getNextMaterializedTime(), localtime))); 873 874 System.out.println(RULER); 875 } 876 } 877 } 878 else { 879 System.out.println("No Jobs match your criteria!"); 880 } 881 } 882 883 private void slaCommand(CommandLine commandLine) throws IOException, OozieCLIException { 884 XOozieClient wc = createXOozieClient(commandLine); 885 String s = commandLine.getOptionValue(OFFSET_OPTION); 886 int start = Integer.parseInt((s != null) ? s : "0"); 887 s = commandLine.getOptionValue(LEN_OPTION); 888 int len = Integer.parseInt((s != null) ? s : "100"); 889 try { 890 wc.getSlaInfo(start, len); 891 } 892 catch (OozieClientException ex) { 893 throw new OozieCLIException(ex.toString(), ex); 894 } 895 } 896 897 private void adminCommand(CommandLine commandLine) throws OozieCLIException { 898 XOozieClient wc = createXOozieClient(commandLine); 899 900 List<String> options = new ArrayList<String>(); 901 for (Option option : commandLine.getOptions()) { 902 options.add(option.getOpt()); 903 } 904 905 try { 906 SYSTEM_MODE status = SYSTEM_MODE.NORMAL; 907 if (options.contains(VERSION_OPTION)) { 908 System.out.println("Oozie server build version: " + wc.getServerBuildVersion()); 909 } 910 else if (options.contains(SYSTEM_MODE_OPTION)) { 911 String systemModeOption = commandLine.getOptionValue(SYSTEM_MODE_OPTION).toUpperCase(); 912 try { 913 status = SYSTEM_MODE.valueOf(systemModeOption); 914 } 915 catch (Exception e) { 916 throw new OozieCLIException("Invalid input provided for option: " + SYSTEM_MODE_OPTION 917 + " value given :" + systemModeOption 918 + " Expected values are: NORMAL/NOWEBSERVICE/SAFEMODE "); 919 } 920 wc.setSystemMode(status); 921 System.out.println("System mode: " + status); 922 } 923 else if (options.contains(STATUS_OPTION)) { 924 status = wc.getSystemMode(); 925 System.out.println("System mode: " + status); 926 } 927 else if (options.contains(QUEUE_DUMP_OPTION)) { 928 System.out.println("[Server Queue Dump]:"); 929 List<String> list = wc.getQueueDump(); 930 if (list != null && list.size() != 0) { 931 for (String str: list) { 932 System.out.println(str); 933 } 934 } 935 else { 936 System.out.println("QueueDump is null!"); 937 } 938 } 939 } 940 catch (OozieClientException ex) { 941 throw new OozieCLIException(ex.toString(), ex); 942 } 943 } 944 945 private void versionCommand() throws OozieCLIException { 946 System.out.println("Oozie client build version: " 947 + BuildInfo.getBuildInfo().getProperty(BuildInfo.BUILD_VERSION)); 948 } 949 950 private void printJobs(List<WorkflowJob> jobs, boolean localtime, boolean verbose) throws IOException { 951 if (jobs != null && jobs.size() > 0) { 952 if (verbose) { 953 System.out.println("Job ID" + VERBOSE_DELIMITER + "App Name" + VERBOSE_DELIMITER + "App Path" 954 + VERBOSE_DELIMITER + "Console URL" + VERBOSE_DELIMITER + "User" + VERBOSE_DELIMITER + "Group" 955 + VERBOSE_DELIMITER + "Run" + VERBOSE_DELIMITER + "Created" + VERBOSE_DELIMITER + "Started" 956 + VERBOSE_DELIMITER + "Status" + VERBOSE_DELIMITER + "Last Modified" + VERBOSE_DELIMITER 957 + "Ended"); 958 System.out.println(RULER); 959 960 for (WorkflowJob job : jobs) { 961 System.out.println(maskIfNull(job.getId()) + VERBOSE_DELIMITER + maskIfNull(job.getAppName()) 962 + VERBOSE_DELIMITER + maskIfNull(job.getAppPath()) + VERBOSE_DELIMITER 963 + maskIfNull(job.getConsoleUrl()) + VERBOSE_DELIMITER + maskIfNull(job.getUser()) 964 + VERBOSE_DELIMITER + maskIfNull(job.getGroup()) + VERBOSE_DELIMITER + job.getRun() 965 + VERBOSE_DELIMITER + maskDate(job.getCreatedTime(), localtime) + VERBOSE_DELIMITER 966 + maskDate(job.getStartTime(), localtime) + VERBOSE_DELIMITER + job.getStatus() 967 + VERBOSE_DELIMITER + maskDate(job.getLastModifiedTime(), localtime) + VERBOSE_DELIMITER 968 + maskDate(job.getEndTime(), localtime)); 969 970 System.out.println(RULER); 971 } 972 } 973 else { 974 System.out.println(String.format(WORKFLOW_JOBS_FORMATTER, "Job ID", "App Name", "Status", "User", 975 "Group", "Started", "Ended")); 976 System.out.println(RULER); 977 978 for (WorkflowJob job : jobs) { 979 System.out.println(String.format(WORKFLOW_JOBS_FORMATTER, maskIfNull(job.getId()), maskIfNull(job 980 .getAppName()), job.getStatus(), maskIfNull(job.getUser()), maskIfNull(job.getGroup()), 981 maskDate(job.getStartTime(), localtime), maskDate(job.getEndTime(), localtime))); 982 983 System.out.println(RULER); 984 } 985 } 986 } 987 else { 988 System.out.println("No Jobs match your criteria!"); 989 } 990 } 991 992 private String maskIfNull(String value) { 993 if (value != null && value.length() > 0) { 994 return value; 995 } 996 return "-"; 997 } 998 999 private String maskDate(Date date, boolean isLocalTimeZone) { 1000 if (date == null) { 1001 return "-"; 1002 } 1003 1004 // SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd 1005 // HH:mm Z", Locale.US); 1006 SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US); 1007 if (!isLocalTimeZone) { 1008 dateFormater.setTimeZone(TimeZone.getTimeZone("GMT")); 1009 } 1010 return dateFormater.format(date); 1011 } 1012 1013 private void validateCommand(CommandLine commandLine) throws OozieCLIException { 1014 String[] args = commandLine.getArgs(); 1015 if (args.length != 1) { 1016 throw new OozieCLIException("One file must be specified"); 1017 } 1018 File file = new File(args[0]); 1019 if (file.exists()) { 1020 try { 1021 List<StreamSource> sources = new ArrayList<StreamSource>(); 1022 sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream( 1023 "oozie-workflow-0.1.xsd"))); 1024 sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream( 1025 "hive-action-0.1.xsd"))); 1026 sources.add(new StreamSource(Thread.currentThread().getContextClassLoader().getResourceAsStream( 1027 "sqoop-action-0.1.xsd"))); 1028 SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 1029 Schema schema = factory.newSchema(sources.toArray(new StreamSource[sources.size()])); 1030 Validator validator = schema.newValidator(); 1031 validator.validate(new StreamSource(new FileReader(file))); 1032 System.out.println("Valid worflow-app"); 1033 } 1034 catch (Exception ex) { 1035 throw new OozieCLIException("Invalid workflow-app, " + ex.toString(), ex); 1036 } 1037 } 1038 else { 1039 throw new OozieCLIException("File does not exists"); 1040 } 1041 } 1042 1043 private void pigCommand(CommandLine commandLine) throws IOException, OozieCLIException { 1044 List<String> pigArgs = (List<String>) commandLine.getArgList(); 1045 if (pigArgs.size() > 0) { 1046 // checking is a pigArgs starts with -X (because CLIParser cannot check this) 1047 if (!pigArgs.get(0).equals("-X")) { 1048 throw new OozieCLIException("Unrecognized option: " + pigArgs.get(0) + " Expecting -X"); 1049 } 1050 pigArgs.remove(0); 1051 } 1052 1053 List<String> options = new ArrayList<String>(); 1054 for (Option option : commandLine.getOptions()) { 1055 options.add(option.getOpt()); 1056 } 1057 1058 if (!options.contains(PIGFILE_OPTION)) { 1059 throw new OozieCLIException("Need to specify -file <scriptfile>"); 1060 } 1061 1062 if (!options.contains(CONFIG_OPTION)) { 1063 throw new OozieCLIException("Need to specify -config <configfile>"); 1064 } 1065 1066 Properties conf = getConfiguration(commandLine); 1067 String script = commandLine.getOptionValue(PIGFILE_OPTION); 1068 1069 try { 1070 XOozieClient wc = createXOozieClient(commandLine); 1071 System.out.println(JOB_ID_PREFIX + wc.submitPig(conf, script, pigArgs.toArray(new String[pigArgs.size()]))); 1072 } 1073 catch (OozieClientException ex) { 1074 throw new OozieCLIException(ex.toString(), ex); 1075 } 1076 } 1077 }