YARN-1117. Improved help messages for "yarn application" and "yarn node" commands. Contributed by Xuan Gong.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1519117 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
bafd302208
commit
6d100eb794
|
@ -72,6 +72,9 @@ Release 2.1.1-beta - UNRELEASED
|
|||
YARN-771. AMRMClient support for resource blacklisting (Junping Du via
|
||||
bikas)
|
||||
|
||||
YARN-1117. Improved help messages for "yarn application" and "yarn node"
|
||||
commands. (Xuan Gong via vinodkv)
|
||||
|
||||
OPTIMIZATIONS
|
||||
|
||||
BUG FIXES
|
||||
|
|
|
@ -29,6 +29,7 @@ import java.util.Set;
|
|||
import org.apache.commons.cli.CommandLine;
|
||||
import org.apache.commons.cli.GnuParser;
|
||||
import org.apache.commons.cli.HelpFormatter;
|
||||
import org.apache.commons.cli.MissingArgumentException;
|
||||
import org.apache.commons.cli.Option;
|
||||
import org.apache.commons.cli.Options;
|
||||
import org.apache.hadoop.classification.InterfaceAudience.Private;
|
||||
|
@ -70,32 +71,38 @@ public class ApplicationCLI extends YarnCLI {
|
|||
Options opts = new Options();
|
||||
opts.addOption(STATUS_CMD, true, "Prints the status of the application.");
|
||||
opts.addOption(LIST_CMD, false, "List applications from the RM. " +
|
||||
"Supports optional use of --appTypes to filter applications " +
|
||||
"Supports optional use of -appTypes to filter applications " +
|
||||
"based on application type, " +
|
||||
"and --appStates to filter applications based on application state");
|
||||
"and -appStates to filter applications based on application state");
|
||||
opts.addOption(KILL_CMD, true, "Kills the application.");
|
||||
opts.addOption(HELP_CMD, false, "Displays help for all commands.");
|
||||
Option appTypeOpt = new Option(APP_TYPE_CMD, true,
|
||||
"Works with --list to filter applications based on their type.");
|
||||
Option appTypeOpt = new Option(APP_TYPE_CMD, true, "Works with -list to " +
|
||||
"filter applications based on " +
|
||||
"input comma-separated list of application types.");
|
||||
appTypeOpt.setValueSeparator(',');
|
||||
appTypeOpt.setArgs(Option.UNLIMITED_VALUES);
|
||||
appTypeOpt.setArgName("Comma-separated list of application types");
|
||||
appTypeOpt.setArgName("Types");
|
||||
opts.addOption(appTypeOpt);
|
||||
Option appStateOpt =
|
||||
new Option(
|
||||
APP_STATE_CMD,
|
||||
true,
|
||||
"Works with --list to filter applications based on their state. "
|
||||
+ getAllValidApplicationStates());
|
||||
Option appStateOpt = new Option(APP_STATE_CMD, true, "Works with -list " +
|
||||
"to filter applications based on input comma-separated list of " +
|
||||
"application states. " + getAllValidApplicationStates());
|
||||
appStateOpt.setValueSeparator(',');
|
||||
appStateOpt.setArgs(Option.UNLIMITED_VALUES);
|
||||
appStateOpt.setArgName("Comma-separated list of application states");
|
||||
appStateOpt.setArgName("States");
|
||||
opts.addOption(appStateOpt);
|
||||
opts.getOption(KILL_CMD).setArgName("Application ID");
|
||||
opts.getOption(STATUS_CMD).setArgName("Application ID");
|
||||
CommandLine cliParser = new GnuParser().parse(opts, args);
|
||||
|
||||
int exitCode = -1;
|
||||
CommandLine cliParser = null;
|
||||
try {
|
||||
cliParser = new GnuParser().parse(opts, args);
|
||||
} catch (MissingArgumentException ex) {
|
||||
sysout.println("Missing argument for options");
|
||||
printUsage(opts);
|
||||
return exitCode;
|
||||
}
|
||||
|
||||
if (cliParser.hasOption(STATUS_CMD)) {
|
||||
if (args.length != 2) {
|
||||
printUsage(opts);
|
||||
|
|
|
@ -28,6 +28,7 @@ import java.util.Set;
|
|||
import org.apache.commons.cli.CommandLine;
|
||||
import org.apache.commons.cli.GnuParser;
|
||||
import org.apache.commons.cli.HelpFormatter;
|
||||
import org.apache.commons.cli.MissingArgumentException;
|
||||
import org.apache.commons.cli.Option;
|
||||
import org.apache.commons.cli.Options;
|
||||
import org.apache.commons.lang.time.DateFormatUtils;
|
||||
|
@ -64,20 +65,29 @@ public class NodeCLI extends YarnCLI {
|
|||
Options opts = new Options();
|
||||
opts.addOption(STATUS_CMD, true, "Prints the status report of the node.");
|
||||
opts.addOption(LIST_CMD, false, "List all running nodes. " +
|
||||
"Supports optional use of --states to filter nodes " +
|
||||
"based on node state, all --all to list all nodes.");
|
||||
"Supports optional use of -states to filter nodes " +
|
||||
"based on node state, all -all to list all nodes.");
|
||||
Option nodeStateOpt = new Option(NODE_STATE_CMD, true,
|
||||
"Works with -list to filter nodes based on their states.");
|
||||
"Works with -list to filter nodes based on input comma-separated list of node states.");
|
||||
nodeStateOpt.setValueSeparator(',');
|
||||
nodeStateOpt.setArgs(Option.UNLIMITED_VALUES);
|
||||
nodeStateOpt.setArgName("Comma-separated list of node states");
|
||||
nodeStateOpt.setArgName("States");
|
||||
opts.addOption(nodeStateOpt);
|
||||
Option allOpt = new Option(NODE_ALL, false,
|
||||
"Works with -list to list all nodes.");
|
||||
opts.addOption(allOpt);
|
||||
CommandLine cliParser = new GnuParser().parse(opts, args);
|
||||
opts.getOption(STATUS_CMD).setArgName("NodeId");
|
||||
|
||||
int exitCode = -1;
|
||||
CommandLine cliParser = null;
|
||||
try {
|
||||
cliParser = new GnuParser().parse(opts, args);
|
||||
} catch (MissingArgumentException ex) {
|
||||
sysout.println("Missing argument for options");
|
||||
printUsage(opts);
|
||||
return exitCode;
|
||||
}
|
||||
|
||||
if (cliParser.hasOption("status")) {
|
||||
if (args.length != 2) {
|
||||
printUsage(opts);
|
||||
|
|
|
@ -86,6 +86,7 @@ public class TestYarnClient {
|
|||
client.init(conf);
|
||||
client.start();
|
||||
client.stop();
|
||||
rm.stop();
|
||||
}
|
||||
|
||||
@Test (timeout = 30000)
|
||||
|
|
|
@ -29,6 +29,7 @@ import static org.mockito.Mockito.when;
|
|||
import static org.mockito.Mockito.doThrow;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
|
@ -72,6 +73,7 @@ public class TestYarnCLI {
|
|||
sysOut = spy(new PrintStream(sysOutStream));
|
||||
sysErrStream = new ByteArrayOutputStream();
|
||||
sysErr = spy(new PrintStream(sysErrStream));
|
||||
System.setOut(sysOut);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -456,21 +458,40 @@ public class TestYarnCLI {
|
|||
}
|
||||
|
||||
@Test (timeout = 10000)
|
||||
public void testHelpCommand() throws Exception {
|
||||
public void testAppsHelpCommand() throws Exception {
|
||||
ApplicationCLI cli = createAndGetAppCLI();
|
||||
ApplicationCLI spyCli = spy(cli);
|
||||
int result = spyCli.run(new String[] { "-help" });
|
||||
Assert.assertTrue(result == 0);
|
||||
verify(spyCli).printUsage(any(Options.class));
|
||||
Assert.assertEquals(createApplicationCLIHelpMessage(),
|
||||
sysOutStream.toString());
|
||||
|
||||
sysOutStream.reset();
|
||||
ApplicationId applicationId = ApplicationId.newInstance(1234, 5);
|
||||
result =
|
||||
cli.run(new String[] { "-kill", applicationId.toString(), "args" });
|
||||
verify(spyCli).printUsage(any(Options.class));
|
||||
Assert.assertEquals(createApplicationCLIHelpMessage(),
|
||||
sysOutStream.toString());
|
||||
|
||||
sysOutStream.reset();
|
||||
NodeId nodeId = NodeId.newInstance("host0", 0);
|
||||
result = cli.run(new String[] { "-status", nodeId.toString(), "args" });
|
||||
verify(spyCli).printUsage(any(Options.class));
|
||||
Assert.assertEquals(createApplicationCLIHelpMessage(),
|
||||
sysOutStream.toString());
|
||||
}
|
||||
|
||||
@Test (timeout = 5000)
|
||||
public void testNodesHelpCommand() throws Exception {
|
||||
NodeCLI nodeCLI = new NodeCLI();
|
||||
nodeCLI.setClient(client);
|
||||
nodeCLI.setSysOutPrintStream(sysOut);
|
||||
nodeCLI.setSysErrPrintStream(sysErr);
|
||||
nodeCLI.run(new String[] {});
|
||||
Assert.assertEquals(createNodeCLIHelpMessage(),
|
||||
sysOutStream.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -806,6 +827,25 @@ public class TestYarnCLI {
|
|||
verifyUsageInfo(new NodeCLI());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMissingArguments() throws Exception {
|
||||
ApplicationCLI cli = createAndGetAppCLI();
|
||||
int result = cli.run(new String[] { "-status" });
|
||||
Assert.assertEquals(result, -1);
|
||||
Assert.assertEquals("Missing argument for options\n"
|
||||
+ createApplicationCLIHelpMessage(), sysOutStream.toString());
|
||||
|
||||
sysOutStream.reset();
|
||||
NodeCLI nodeCLI = new NodeCLI();
|
||||
nodeCLI.setClient(client);
|
||||
nodeCLI.setSysOutPrintStream(sysOut);
|
||||
nodeCLI.setSysErrPrintStream(sysErr);
|
||||
result = nodeCLI.run(new String[] { "-status" });
|
||||
Assert.assertEquals(result, -1);
|
||||
Assert.assertEquals("Missing argument for options\n"
|
||||
+ createNodeCLIHelpMessage(), sysOutStream.toString());
|
||||
}
|
||||
|
||||
private void verifyUsageInfo(YarnCLI cli) throws Exception {
|
||||
cli.setSysErrPrintStream(sysErr);
|
||||
cli.run(new String[0]);
|
||||
|
@ -832,4 +872,45 @@ public class TestYarnCLI {
|
|||
return cli;
|
||||
}
|
||||
|
||||
private String createApplicationCLIHelpMessage() throws IOException {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
PrintWriter pw = new PrintWriter(baos);
|
||||
pw.println("usage: application");
|
||||
pw.println(" -appStates <States> Works with -list to filter applications based");
|
||||
pw.println(" on input comma-separated list of application");
|
||||
pw.println(" states. The valid application state can be one");
|
||||
pw.println(" of the following:");
|
||||
pw.println(" ALL,NEW,NEW_SAVING,SUBMITTED,ACCEPTED,RUNNING,");
|
||||
pw.println(" FINISHED,FAILED,KILLED");
|
||||
pw.println(" -appTypes <Types> Works with -list to filter applications based");
|
||||
pw.println(" on input comma-separated list of application");
|
||||
pw.println(" types.");
|
||||
pw.println(" -help Displays help for all commands.");
|
||||
pw.println(" -kill <Application ID> Kills the application.");
|
||||
pw.println(" -list List applications from the RM. Supports");
|
||||
pw.println(" optional use of -appTypes to filter");
|
||||
pw.println(" applications based on application type, and");
|
||||
pw.println(" -appStates to filter applications based on");
|
||||
pw.println(" application state");
|
||||
pw.println(" -status <Application ID> Prints the status of the application.");
|
||||
pw.close();
|
||||
String appsHelpStr = baos.toString("UTF-8");
|
||||
return appsHelpStr;
|
||||
}
|
||||
|
||||
private String createNodeCLIHelpMessage() throws IOException {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
PrintWriter pw = new PrintWriter(baos);
|
||||
pw.println("usage: node");
|
||||
pw.println(" -all Works with -list to list all nodes.");
|
||||
pw.println(" -list List all running nodes. Supports optional use of");
|
||||
pw.println(" -states to filter nodes based on node state, all -all");
|
||||
pw.println(" to list all nodes.");
|
||||
pw.println(" -states <States> Works with -list to filter nodes based on input");
|
||||
pw.println(" comma-separated list of node states.");
|
||||
pw.println(" -status <NodeId> Prints the status report of the node.");
|
||||
pw.close();
|
||||
String nodesHelpStr = baos.toString("UTF-8");
|
||||
return nodesHelpStr;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -198,7 +198,8 @@ public class ConverterUtils {
|
|||
Iterator<String> it = _split(appIdStr).iterator();
|
||||
if (!it.next().equals(APPLICATION_PREFIX)) {
|
||||
throw new IllegalArgumentException("Invalid ApplicationId prefix: "
|
||||
+ appIdStr);
|
||||
+ appIdStr + ". The valid ApplicationId should start with prefix "
|
||||
+ APPLICATION_PREFIX);
|
||||
}
|
||||
try {
|
||||
return toApplicationId(it);
|
||||
|
|
Loading…
Reference in New Issue