From a71e9302a9dbbb702c8c50a4fdaa508f912561d6 Mon Sep 17 00:00:00 2001 From: Vinod Kumar Vavilapalli Date: Fri, 7 Nov 2014 11:56:11 -0800 Subject: [PATCH] YARN-2827. Fixed bugs in "yarn queue" CLI. Contributed by Wangda Tan. --- hadoop-yarn-project/CHANGES.txt | 2 + .../hadoop/yarn/client/cli/QueueCLI.java | 40 ++++++++++--------- .../hadoop/yarn/client/cli/TestYarnCLI.java | 21 +++++++++- 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index c48fb4fbe2..a26bfb2f1d 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -898,6 +898,8 @@ Release 2.6.0 - UNRELEASED not mapped to queues by making default capacities per label to be zero. (Wangda Tan via vinodkv) + YARN-2827. Fixed bugs in "yarn queue" CLI. (Wangda Tan via vinodkv) + Release 2.5.2 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/QueueCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/QueueCLI.java index 3c74f13f3a..4d50e7f13a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/QueueCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/QueueCLI.java @@ -52,16 +52,11 @@ public static void main(String[] args) throws Exception { @Override public int run(String[] args) throws Exception { Options opts = new Options(); - int exitCode = -1; - if (args.length > 0) { - opts.addOption(STATUS_CMD, true, - "List queue information about given queue."); - opts.addOption(HELP_CMD, false, "Displays help for all commands."); - opts.getOption(STATUS_CMD).setArgName("Queue Name"); - } else { - syserr.println("Invalid Command usage. Command must start with 'queue'"); - return exitCode; - } + + opts.addOption(STATUS_CMD, true, + "List queue information about given queue."); + opts.addOption(HELP_CMD, false, "Displays help for all commands."); + opts.getOption(STATUS_CMD).setArgName("Queue Name"); CommandLine cliParser = null; try { @@ -69,23 +64,23 @@ public int run(String[] args) throws Exception { } catch (MissingArgumentException ex) { sysout.println("Missing argument for options"); printUsage(opts); - return exitCode; + return -1; } if (cliParser.hasOption(STATUS_CMD)) { - if (args.length != 3) { + if (args.length != 2) { printUsage(opts); - return exitCode; + return -1; } - listQueue(cliParser.getOptionValue(STATUS_CMD)); + return listQueue(cliParser.getOptionValue(STATUS_CMD)); } else if (cliParser.hasOption(HELP_CMD)) { printUsage(opts); return 0; } else { syserr.println("Invalid Command Usage : "); printUsage(opts); + return -1; } - return 0; } /** @@ -105,13 +100,22 @@ void printUsage(Options opts) { * @throws YarnException * @throws IOException */ - private void listQueue(String queueName) throws YarnException, IOException { + private int listQueue(String queueName) throws YarnException, IOException { + int rc; PrintWriter writer = new PrintWriter(sysout); QueueInfo queueInfo = client.getQueueInfo(queueName); - writer.println("Queue Information : "); - printQueueInfo(writer, queueInfo); + if (queueInfo != null) { + writer.println("Queue Information : "); + printQueueInfo(writer, queueInfo); + rc = 0; + } else { + writer.println("Cannot get queue from RM by queueName = " + queueName + + ", please check."); + rc = -1; + } writer.flush(); + return rc; } private void printQueueInfo(PrintWriter writer, QueueInfo queueInfo) { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java index adb58e86f5..d87277a7a7 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java @@ -1247,7 +1247,7 @@ public void testGetQueueInfo() throws Exception { QueueInfo queueInfo = QueueInfo.newInstance("queueA", 0.4f, 0.8f, 0.5f, null, null, QueueState.RUNNING, nodeLabels, "GPU"); when(client.getQueueInfo(any(String.class))).thenReturn(queueInfo); - int result = cli.run(new String[] { "queue", "-status", "queueA" }); + int result = cli.run(new String[] { "-status", "queueA" }); assertEquals(0, result); verify(client).getQueueInfo("queueA"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -1271,7 +1271,7 @@ public void testGetQueueInfoWithEmptyNodeLabel() throws Exception { QueueInfo queueInfo = QueueInfo.newInstance("queueA", 0.4f, 0.8f, 0.5f, null, null, QueueState.RUNNING, null, null); when(client.getQueueInfo(any(String.class))).thenReturn(queueInfo); - int result = cli.run(new String[] { "queue", "-status", "queueA" }); + int result = cli.run(new String[] { "-status", "queueA" }); assertEquals(0, result); verify(client).getQueueInfo("queueA"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -1288,6 +1288,23 @@ public void testGetQueueInfoWithEmptyNodeLabel() throws Exception { String queueInfoStr = baos.toString("UTF-8"); Assert.assertEquals(queueInfoStr, sysOutStream.toString()); } + + @Test + public void testGetQueueInfoWithNonExistedQueue() throws Exception { + String queueName = "non-existed-queue"; + QueueCLI cli = createAndGetQueueCLI(); + when(client.getQueueInfo(any(String.class))).thenReturn(null); + int result = cli.run(new String[] { "-status", queueName }); + assertEquals(-1, result);; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + PrintWriter pw = new PrintWriter(baos); + pw.println("Cannot get queue from RM by queueName = " + queueName + + ", please check."); + pw.close(); + String queueInfoStr = baos.toString("UTF-8"); + Assert.assertEquals(queueInfoStr, sysOutStream.toString()); + } + private void verifyUsageInfo(YarnCLI cli) throws Exception { cli.setSysErrPrintStream(sysErr);