HDFS-10599. DiskBalancer: Execute CLI via Shell. Contributed by Manoj Govindassamy.
This commit is contained in:
parent
e793309735
commit
e3f7f58a5f
@ -135,13 +135,20 @@ public class DiskBalancerCLI extends Configured implements Tool {
|
||||
private static final Options CANCEL_OPTIONS = new Options();
|
||||
private static final Options REPORT_OPTIONS = new Options();
|
||||
|
||||
private final PrintStream printStream;
|
||||
|
||||
/**
|
||||
* Construct a DiskBalancer.
|
||||
*
|
||||
* @param conf
|
||||
*/
|
||||
public DiskBalancerCLI(Configuration conf) {
|
||||
this(conf, System.out);
|
||||
}
|
||||
|
||||
public DiskBalancerCLI(Configuration conf, final PrintStream printStream) {
|
||||
super(conf);
|
||||
this.printStream = printStream;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -171,21 +178,9 @@ public static void main(String[] argv) throws Exception {
|
||||
*/
|
||||
@Override
|
||||
public int run(String[] args) throws Exception {
|
||||
return run(args, System.out);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the command with the given arguments.
|
||||
*
|
||||
* @param args command specific arguments.
|
||||
* @param out the output stream used for printing
|
||||
* @return exit code.
|
||||
* @throws Exception
|
||||
*/
|
||||
public int run(String[] args, final PrintStream out) throws Exception {
|
||||
Options opts = getOpts();
|
||||
CommandLine cmd = parseArgs(args, opts);
|
||||
return dispatch(cmd, opts, out);
|
||||
return dispatch(cmd, opts);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -443,7 +438,7 @@ private CommandLine parseArgs(String[] argv, Options opts)
|
||||
* @param opts options of command line
|
||||
* @param out the output stream used for printing
|
||||
*/
|
||||
private int dispatch(CommandLine cmd, Options opts, final PrintStream out)
|
||||
private int dispatch(CommandLine cmd, Options opts)
|
||||
throws Exception {
|
||||
Command currentCommand = null;
|
||||
if (cmd.hasOption(DiskBalancerCLI.PLAN)) {
|
||||
@ -463,7 +458,7 @@ private int dispatch(CommandLine cmd, Options opts, final PrintStream out)
|
||||
}
|
||||
|
||||
if (cmd.hasOption(DiskBalancerCLI.REPORT)) {
|
||||
currentCommand = new ReportCommand(getConf(), out);
|
||||
currentCommand = new ReportCommand(getConf(), this.printStream);
|
||||
}
|
||||
|
||||
if (cmd.hasOption(DiskBalancerCLI.HELP)) {
|
||||
|
@ -43,6 +43,8 @@
|
||||
import org.apache.hadoop.hdfs.server.diskbalancer.datamodel.DiskBalancerCluster;
|
||||
import org.apache.hadoop.hdfs.server.diskbalancer.datamodel.DiskBalancerDataNode;
|
||||
import org.apache.hadoop.hdfs.tools.DiskBalancerCLI;
|
||||
import org.apache.hadoop.util.Tool;
|
||||
import org.apache.hadoop.util.ToolRunner;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@ -140,6 +142,27 @@ public void testReportLessThanTotal() throws Exception {
|
||||
containsString("9 volumes with node data density 1.97"))));
|
||||
}
|
||||
|
||||
/**
|
||||
* This test simulates DiskBalancerCLI Report command run from a shell
|
||||
* with a generic option 'fs'.
|
||||
* @throws Exception
|
||||
*/
|
||||
@Test(timeout = 60000)
|
||||
public void testReportWithGenericOptionFS() throws Exception {
|
||||
final String topReportArg = "5";
|
||||
final String reportArgs = String.format("-%s file:%s -%s -%s %s",
|
||||
"fs", clusterJson.getPath(),
|
||||
REPORT, "top", topReportArg);
|
||||
final String cmdLine = String.format("%s", reportArgs);
|
||||
final List<String> outputs = runCommand(cmdLine);
|
||||
|
||||
assertThat(outputs.get(0), containsString("Processing report command"));
|
||||
assertThat(outputs.get(1),
|
||||
is(allOf(containsString("Reporting top"), containsString(topReportArg),
|
||||
containsString(
|
||||
"DataNode(s) benefiting from running DiskBalancer"))));
|
||||
}
|
||||
|
||||
/* test more than 64 DataNode(s) as total, e.g., -report -top 128 */
|
||||
@Test(timeout = 60000)
|
||||
public void testReportMoreThanTotal() throws Exception {
|
||||
@ -389,11 +412,11 @@ public void testHelpCommand() throws Exception {
|
||||
private List<String> runCommandInternal(final String cmdLine) throws
|
||||
Exception {
|
||||
String[] cmds = StringUtils.split(cmdLine, ' ');
|
||||
DiskBalancerCLI db = new DiskBalancerCLI(conf);
|
||||
|
||||
ByteArrayOutputStream bufOut = new ByteArrayOutputStream();
|
||||
PrintStream out = new PrintStream(bufOut);
|
||||
db.run(cmds, out);
|
||||
|
||||
Tool diskBalancerTool = new DiskBalancerCLI(conf, out);
|
||||
ToolRunner.run(conf, diskBalancerTool, cmds);
|
||||
|
||||
Scanner scanner = new Scanner(bufOut.toString());
|
||||
List<String> outputs = Lists.newArrayList();
|
||||
|
Loading…
Reference in New Issue
Block a user