diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java index 908d379..2272987 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java @@ -137,6 +137,11 @@ private int runCommand(String[] args) throws Exception { long bytes = Long.MAX_VALUE; try { CommandLine commandLine = parser.parse(opts, args, true); + String unknownOptions = StringUtils.join(commandLine.getArgs(), ' '); + if (StringUtils.isNotBlank(unknownOptions)) { + System.err.println("Invalid option(s) specified " + unknownOptions); + return -1; + } appIdStr = commandLine.getOptionValue(APPLICATION_ID_OPTION); containerIdStr = commandLine.getOptionValue(CONTAINER_ID_OPTION); nodeAddress = commandLine.getOptionValue(NODE_ADDRESS_OPTION); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestLogsCLI.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestLogsCLI.java index 19ddb2f..ac8a436 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestLogsCLI.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestLogsCLI.java @@ -135,6 +135,47 @@ public void testInvalidApplicationId() throws Exception { } @Test(timeout = 5000L) + public void testInvalidOption() throws Exception { + Configuration conf = new YarnConfiguration(); + YarnClient mockYarnClient = createMockYarnClient( + YarnApplicationState.FINISHED, + UserGroupInformation.getCurrentUser().getShortUserName()); + LogsCLI cli = new LogsCLIForTest(mockYarnClient); + cli.setConf(conf); + + String invalidOption = "-invalid_option"; + String invalidOptionValue = "xyz"; + int exitCode = cli.run(new String[] {invalidOption, invalidOptionValue }); + assertTrue(exitCode == -1); + String errorStream = sysErrStream.toString(); + assertTrue(errorStream.startsWith("Invalid option(s) specified ")); + assertTrue(errorStream.contains(invalidOption)); + assertTrue(errorStream.contains(invalidOptionValue)); + } + + @Test(timeout = 5000L) + public void testInvalidOptionWithValidOptions() throws Exception { + Configuration conf = new YarnConfiguration(); + YarnClient mockYarnClient = createMockYarnClient( + YarnApplicationState.FINISHED, + UserGroupInformation.getCurrentUser().getShortUserName()); + LogsCLI cli = new LogsCLIForTest(mockYarnClient); + cli.setConf(conf); + + String invalidOption = "-logFiles"; + String invalidOptionValue = "xyz"; + int exitCode = cli + .run(new String[] {invalidOption, invalidOptionValue, + "-applicationId", "application_1465862913885_0027", + "-log_files", "stdout" }); + assertTrue(exitCode == -1); + String errorStream = sysErrStream.toString(); + assertTrue(errorStream.startsWith("Invalid option(s) specified ")); + assertTrue(errorStream.contains(invalidOption)); + assertTrue(errorStream.contains(invalidOptionValue)); + } + + @Test(timeout = 5000L) public void testInvalidAMContainerId() throws Exception { Configuration conf = new YarnConfiguration(); conf.setBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED, true);