YARN-1126. Add validation of users input nodes-states options to nodes CLI. Contributed by Wei Yan.

This commit is contained in:
Rohith Sharma K S 2016-07-21 12:20:47 +05:30
parent 521f34317a
commit be34b2a8fd
2 changed files with 48 additions and 15 deletions

View File

@ -76,7 +76,8 @@ public class NodeCLI extends YarnCLI {
"based on node state, all -all to list all nodes, " +
"-showDetails to display more details about each node.");
Option nodeStateOpt = new Option(NODE_STATE_CMD, true,
"Works with -list to filter nodes based on input comma-separated list of node states.");
"Works with -list to filter nodes based on input comma-separated " +
"list of node states. " + getAllValidNodeStates());
nodeStateOpt.setValueSeparator(',');
nodeStateOpt.setArgs(Option.UNLIMITED_VALUES);
nodeStateOpt.setArgName("States");
@ -89,6 +90,14 @@ public class NodeCLI extends YarnCLI {
opts.addOption(showDetailsOpt);
opts.getOption(STATUS_CMD).setArgName("NodeId");
if (args != null && args.length > 0) {
for (int i = args.length - 1; i >= 0; i--) {
if (args[i].equalsIgnoreCase("-" + NODE_ALL)) {
args[i] = "-" + NODE_ALL;
}
}
}
int exitCode = -1;
CommandLine cliParser = null;
try {
@ -116,8 +125,15 @@ public class NodeCLI extends YarnCLI {
if (types != null) {
for (String type : types) {
if (!type.trim().isEmpty()) {
try {
nodeStates.add(NodeState.valueOf(
org.apache.hadoop.util.StringUtils.toUpperCase(type.trim())));
org.apache.hadoop.util.StringUtils.toUpperCase(
type.trim())));
} catch (IllegalArgumentException ex) {
sysout.println("The node state " + type + " is invalid.");
sysout.println(getAllValidNodeStates());
return exitCode;
}
}
}
}
@ -320,4 +336,14 @@ public class NodeCLI extends YarnCLI {
nodeReportStr.close();
sysout.println(baos.toString("UTF-8"));
}
private String getAllValidNodeStates() {
StringBuilder sb = new StringBuilder();
sb.append("The valid node state can be one of the following: ");
for (NodeState state : NodeState.values()) {
sb.append(state).append(",");
}
String output = sb.toString();
return output.substring(0, output.length() - 1) + ".";
}
}

View File

@ -1070,7 +1070,7 @@ public class TestYarnCLI {
NodeState[] states = nodeStates.toArray(new NodeState[0]);
when(client.getNodeReports(states))
.thenReturn(getNodeReports(nodeReports, nodeStates));
int result = cli.run(new String[] { "-list", "--states", "NEW" });
int result = cli.run(new String[] {"-list", "-states", "NEW"});
assertEquals(0, result);
verify(client).getNodeReports(states);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
@ -1091,7 +1091,7 @@ public class TestYarnCLI {
states = nodeStates.toArray(new NodeState[0]);
when(client.getNodeReports(states))
.thenReturn(getNodeReports(nodeReports, nodeStates));
result = cli.run(new String[] { "-list", "--states", "RUNNING" });
result = cli.run(new String[] {"-list", "-states", "RUNNING"});
assertEquals(0, result);
verify(client).getNodeReports(states);
baos = new ByteArrayOutputStream();
@ -1109,13 +1109,13 @@ public class TestYarnCLI {
verify(sysOut, times(2)).write(any(byte[].class), anyInt(), anyInt());
sysOutStream.reset();
result = cli.run(new String[] { "-list" });
result = cli.run(new String[] {"-list"});
assertEquals(0, result);
Assert.assertEquals(nodesReportStr, sysOutStream.toString());
verify(sysOut, times(3)).write(any(byte[].class), anyInt(), anyInt());
sysOutStream.reset();
result = cli.run(new String[] { "-list", "-showDetails" });
result = cli.run(new String[] {"-list", "-showDetails"});
assertEquals(0, result);
baos = new ByteArrayOutputStream();
pw = new PrintWriter(baos);
@ -1149,7 +1149,7 @@ public class TestYarnCLI {
states = nodeStates.toArray(new NodeState[0]);
when(client.getNodeReports(states))
.thenReturn(getNodeReports(nodeReports, nodeStates));
result = cli.run(new String[] { "-list", "--states", "UNHEALTHY" });
result = cli.run(new String[] {"-list", "-states", "UNHEALTHY"});
assertEquals(0, result);
verify(client).getNodeReports(states);
baos = new ByteArrayOutputStream();
@ -1170,7 +1170,7 @@ public class TestYarnCLI {
states = nodeStates.toArray(new NodeState[0]);
when(client.getNodeReports(states))
.thenReturn(getNodeReports(nodeReports, nodeStates));
result = cli.run(new String[] { "-list", "--states", "DECOMMISSIONED" });
result = cli.run(new String[] {"-list", "-states", "DECOMMISSIONED"});
assertEquals(0, result);
verify(client).getNodeReports(states);
baos = new ByteArrayOutputStream();
@ -1191,7 +1191,7 @@ public class TestYarnCLI {
states = nodeStates.toArray(new NodeState[0]);
when(client.getNodeReports(states))
.thenReturn(getNodeReports(nodeReports, nodeStates));
result = cli.run(new String[] { "-list", "--states", "REBOOTED" });
result = cli.run(new String[] {"-list", "-states", "REBOOTED"});
assertEquals(0, result);
verify(client).getNodeReports(states);
baos = new ByteArrayOutputStream();
@ -1212,7 +1212,7 @@ public class TestYarnCLI {
states = nodeStates.toArray(new NodeState[0]);
when(client.getNodeReports(states))
.thenReturn(getNodeReports(nodeReports, nodeStates));
result = cli.run(new String[] { "-list", "--states", "LOST" });
result = cli.run(new String[] {"-list", "-states", "LOST"});
assertEquals(0, result);
verify(client).getNodeReports(states);
baos = new ByteArrayOutputStream();
@ -1236,8 +1236,8 @@ public class TestYarnCLI {
states = nodeStates.toArray(new NodeState[0]);
when(client.getNodeReports(states))
.thenReturn(getNodeReports(nodeReports, nodeStates));
result = cli.run(new String[] { "-list", "--states",
"NEW,RUNNING,LOST,REBOOTED" });
result = cli.run(new String[] {"-list", "-states",
"NEW,RUNNING,LOST,REBOOTED"});
assertEquals(0, result);
verify(client).getNodeReports(states);
baos = new ByteArrayOutputStream();
@ -1268,7 +1268,7 @@ public class TestYarnCLI {
states = nodeStates.toArray(new NodeState[0]);
when(client.getNodeReports(states))
.thenReturn(getNodeReports(nodeReports, nodeStates));
result = cli.run(new String[] { "-list", "--all" });
result = cli.run(new String[] {"-list", "-All"});
assertEquals(0, result);
verify(client).getNodeReports(states);
baos = new ByteArrayOutputStream();
@ -1294,6 +1294,10 @@ public class TestYarnCLI {
nodesReportStr = baos.toString("UTF-8");
Assert.assertEquals(nodesReportStr, sysOutStream.toString());
verify(sysOut, times(10)).write(any(byte[].class), anyInt(), anyInt());
sysOutStream.reset();
result = cli.run(new String[] { "-list", "-states", "InvalidState"});
assertEquals(-1, result);
}
private List<NodeReport> getNodeReports(
@ -1884,7 +1888,10 @@ public class TestYarnCLI {
pw.println(" details about each node.");
pw.println(" -showDetails Works with -list to show more details about each node.");
pw.println(" -states <States> Works with -list to filter nodes based on input");
pw.println(" comma-separated list of node states.");
pw.println(" comma-separated list of node states. The valid node");
pw.println(" state can be one of the following:");
pw.println(" NEW,RUNNING,UNHEALTHY,DECOMMISSIONED,LOST,REBOOTED,DEC");
pw.println(" OMMISSIONING,SHUTDOWN.");
pw.println(" -status <NodeId> Prints the status report of the node.");
pw.close();
String nodesHelpStr = baos.toString("UTF-8");