浏览代码

HADOOP-12442. Display help if the command option to 'hdfs dfs' is not valid (Contributed by nijel)

(cherry picked from commit 861b52db242f238d7e36ad75c158025be959a696)
Vinayakumar B 9 年之前
父节点
当前提交
b46e4ceafd

+ 3 - 0
hadoop-common-project/hadoop-common/CHANGES.txt

@@ -651,6 +651,9 @@ Release 2.8.0 - UNRELEASED
     HADOOP-12437. Allow SecurityUtil to lookup alternate hostnames.
     HADOOP-12437. Allow SecurityUtil to lookup alternate hostnames.
     (Arpit Agarwal)
     (Arpit Agarwal)
 
 
+    HADOOP-12442. Display help if the command option to 'hdfs dfs' is not valid
+    (nijel via vinayakumarb)
+
 Release 2.7.2 - UNRELEASED
 Release 2.7.2 - UNRELEASED
 
 
   INCOMPATIBLE CHANGES
   INCOMPATIBLE CHANGES

+ 1 - 0
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FsShell.java

@@ -313,6 +313,7 @@ public class FsShell extends Configured implements Tool {
         }
         }
       } catch (IllegalArgumentException e) {
       } catch (IllegalArgumentException e) {
         displayError(cmd, e.getLocalizedMessage());
         displayError(cmd, e.getLocalizedMessage());
+        printUsage(System.err);
         if (instance != null) {
         if (instance != null) {
           printInstanceUsage(System.err, instance);
           printInstanceUsage(System.err, instance);
         }
         }

+ 33 - 0
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFsShell.java

@@ -17,8 +17,12 @@
  */
  */
 package org.apache.hadoop.fs;
 package org.apache.hadoop.fs;
 
 
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
 import junit.framework.AssertionFailedError;
 import junit.framework.AssertionFailedError;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.io.IOUtils;
 import org.apache.hadoop.tracing.SetSpanReceiver;
 import org.apache.hadoop.tracing.SetSpanReceiver;
 import org.apache.hadoop.tracing.SpanReceiverHost;
 import org.apache.hadoop.tracing.SpanReceiverHost;
 import org.apache.hadoop.util.ToolRunner;
 import org.apache.hadoop.util.ToolRunner;
@@ -67,4 +71,33 @@ public class TestFsShell {
         SetSpanReceiver.getMap()
         SetSpanReceiver.getMap()
             .get("help").get(0).getKVAnnotations().get("args"));
             .get("help").get(0).getKVAnnotations().get("args"));
   }
   }
+
+  @Test
+  public void testDFSWithInvalidCommmand() throws Throwable {
+    Configuration conf = new Configuration();
+    FsShell shell = new FsShell(conf);
+    String[] args = new String[1];
+    args[0] = "dfs -mkdirs";
+    final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+    final PrintStream out = new PrintStream(bytes);
+    final PrintStream oldErr = System.err;
+    try {
+      System.setErr(out);
+      ToolRunner.run(shell, args);
+      String errorValue=new String(bytes.toString());
+      Assert
+      .assertTrue(
+          "FSShell dfs command did not print the error " +
+          "message when invalid command is passed",
+          errorValue.contains("-mkdirs: Unknown command"));
+      Assert
+          .assertTrue(
+              "FSShell dfs command did not print help " +
+              "message when invalid command is passed",
+          errorValue.contains("Usage: hadoop fs [generic options]"));
+    } finally {
+      IOUtils.closeStream(out);
+      System.setErr(oldErr);
+    }
+  }
 }
 }