From d18050522c5c6bd9e32eb9a1be4ffe2288624c40 Mon Sep 17 00:00:00 2001 From: Vinod Kumar Vavilapalli Date: Wed, 13 Jul 2016 14:52:30 -0700 Subject: [PATCH] YARN-5339. Fixed "yarn logs" to fail when a file is passed to -out option instead of a directory. Contributed by Xuan Gong. --- .../hadoop/yarn/client/cli/LogsCLI.java | 10 +++ .../hadoop/yarn/client/cli/TestLogsCLI.java | 65 +++++++++++++++++-- 2 files changed, 68 insertions(+), 7 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java index 31395be71c..15605574bf 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java @@ -18,6 +18,7 @@ package org.apache.hadoop.yarn.client.cli; +import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; @@ -197,6 +198,15 @@ private int runCommand(String[] args) throws Exception { return -1; } + if (localDir != null) { + File file = new File(localDir); + if (file.exists() && file.isFile()) { + System.err.println("Invalid value for -out option. " + + "Please provide a directory."); + return -1; + } + } + LogCLIHelpers logCliHelper = new LogCLIHelpers(); logCliHelper.setConf(getConf()); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestLogsCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestLogsCLI.java index cb9a6633f3..3fe53d997b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestLogsCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestLogsCLI.java @@ -711,6 +711,64 @@ public void testFetchApplictionLogsAsAnotherUser() throws Exception { } } + @Test (timeout = 5000) + public void testLogsCLIWithInvalidArgs() throws Exception { + String localDir = "target/SaveLogs"; + Path localPath = new Path(localDir); + Configuration configuration = new Configuration(); + FileSystem fs = FileSystem.get(configuration); + ApplicationId appId = ApplicationId.newInstance(0, 1); + YarnClient mockYarnClient = + createMockYarnClient(YarnApplicationState.FINISHED, + UserGroupInformation.getCurrentUser().getShortUserName()); + LogsCLI cli = new LogsCLIForTest(mockYarnClient); + cli.setConf(configuration); + + // Specify an invalid applicationId + int exitCode = cli.run(new String[] {"-applicationId", + "123"}); + assertTrue(exitCode == -1); + assertTrue(sysErrStream.toString().contains( + "Invalid ApplicationId specified")); + sysErrStream.reset(); + + // Specify an invalid containerId + exitCode = cli.run(new String[] {"-containerId", + "123"}); + assertTrue(exitCode == -1); + assertTrue(sysErrStream.toString().contains( + "Invalid ContainerId specified")); + sysErrStream.reset(); + + // Specify show_container_log_info and show_application_log_info + // at the same time + exitCode = cli.run(new String[] {"-applicationId", appId.toString(), + "-show_container_log_info", "-show_application_log_info"}); + assertTrue(exitCode == -1); + assertTrue(sysErrStream.toString().contains("Invalid options. " + + "Can only accept one of show_application_log_info/" + + "show_container_log_info.")); + sysErrStream.reset(); + + // Specify a file name to the option -out + try { + fs.mkdirs(localPath); + Path tmpFilePath = new Path(localPath, "tmpFile"); + if (!fs.exists(tmpFilePath)) { + fs.createNewFile(tmpFilePath); + } + exitCode = cli.run(new String[] {"-applicationId", + appId.toString(), + "-out" , tmpFilePath.toString()}); + assertTrue(exitCode == -1); + assertTrue(sysErrStream.toString().contains( + "Invalid value for -out option. Please provide a directory.")); + } finally { + fs.delete(localPath, true); + } + } + + @Test (timeout = 15000) public void testSaveContainerLogsLocally() throws Exception { String remoteLogRootDir = "target/logs/"; @@ -845,13 +903,6 @@ public void testPrintContainerLogMetadata() throws Exception { LogsCLI cli = new LogsCLIForTest(mockYarnClient); cli.setConf(configuration); - int result = cli.run(new String[] {"-applicationId", appId.toString(), - "-show_container_log_info", "-show_application_log_info"}); - assertTrue(result == -1); - assertTrue(sysErrStream.toString().contains("Invalid options. " - + "Can only accept one of show_application_log_info/" - + "show_container_log_info.")); - cli.run(new String[] {"-applicationId", appId.toString(), "-show_container_log_info"}); assertTrue(sysOutStream.toString().contains(