You are viewing a plain text version of this content. The canonical link for it is here.
Posted to yarn-commits@hadoop.apache.org by ju...@apache.org on 2014/05/03 15:03:28 UTC

svn commit: r1592197 - in /hadoop/common/trunk/hadoop-yarn-project: CHANGES.txt hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java

Author: junping_du
Date: Sat May  3 13:03:27 2014
New Revision: 1592197

URL: http://svn.apache.org/r1592197
Log:
YARN-1201. TestAMAuthorization fails with local hostname cannot be resolved. (Wangda Tan via junping_du)

Modified:
    hadoop/common/trunk/hadoop-yarn-project/CHANGES.txt
    hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java

Modified: hadoop/common/trunk/hadoop-yarn-project/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-yarn-project/CHANGES.txt?rev=1592197&r1=1592196&r2=1592197&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-yarn-project/CHANGES.txt (original)
+++ hadoop/common/trunk/hadoop-yarn-project/CHANGES.txt Sat May  3 13:03:27 2014
@@ -170,6 +170,9 @@ Release 2.4.1 - UNRELEASED
     YARN-1929. Fixed a deadlock in ResourceManager that occurs when failover
     happens right at the time of shutdown. (Karthik Kambatla via vinodkv)
 
+    YARN-1201. TestAMAuthorization fails with local hostname cannot be resolved. 
+    (Wangda Tan via junping_du)
+
 Release 2.4.0 - 2014-04-07 
 
   INCOMPATIBLE CHANGES

Modified: hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java?rev=1592197&r1=1592196&r2=1592197&view=diff
==============================================================================
--- hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java (original)
+++ hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java Sat May  3 13:03:27 2014
@@ -32,6 +32,7 @@ import org.apache.commons.logging.LogFac
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
 import org.apache.hadoop.io.DataInputByteBuffer;
+import org.apache.hadoop.security.AccessControlException;
 import org.apache.hadoop.security.Credentials;
 import org.apache.hadoop.security.SecurityUtil;
 import org.apache.hadoop.security.UserGroupInformation;
@@ -272,21 +273,62 @@ public class TestAMAuthorization {
       client.registerApplicationMaster(request);
       Assert.fail("Should fail with authorization error");
     } catch (Exception e) {
-      // Because there are no tokens, the request should be rejected as the
-      // server side will assume we are trying simple auth.
-      String expectedMessage = "";
-      if (UserGroupInformation.isSecurityEnabled()) {
-        expectedMessage = "Client cannot authenticate via:[TOKEN]";
+      if (isCause(AccessControlException.class, e)) {
+        // Because there are no tokens, the request should be rejected as the
+        // server side will assume we are trying simple auth.
+        String expectedMessage = "";
+        if (UserGroupInformation.isSecurityEnabled()) {
+          expectedMessage = "Client cannot authenticate via:[TOKEN]";
+        } else {
+          expectedMessage =
+              "SIMPLE authentication is not enabled.  Available:[TOKEN]";
+        }
+        Assert.assertTrue(e.getCause().getMessage().contains(expectedMessage)); 
       } else {
-        expectedMessage =
-            "SIMPLE authentication is not enabled.  Available:[TOKEN]";
+        throw e;
       }
-      Assert.assertTrue(e.getCause().getMessage().contains(expectedMessage));
     }
 
     // TODO: Add validation of invalid authorization when there's more data in
     // the AMRMToken
   }
+  
+  /**
+   * Identify if an expected throwable included in an exception stack. We use
+   * this because sometimes, an exception will be wrapped to another exception
+   * before thrown. Like,
+   * 
+   * <pre>
+   * {@code
+   * void methodA() throws IOException {
+   *   try {
+   *     // something
+   *   } catch (AccessControlException e) {
+   *     // do process
+   *     throw new IOException(e)
+   *   }
+   * }
+   * </pre>
+   * 
+   * So we cannot simply catch AccessControlException by using
+   * <pre>
+   * {@code
+   * try {
+   *   methodA()
+   * } catch (AccessControlException e) {
+   *   // do something
+   * }
+   * </pre>
+   * 
+   * This method is useful in such cases.
+   */
+  private static boolean isCause(
+      Class<? extends Throwable> expected,
+      Throwable e
+  ) {
+    return (e != null)
+        && (expected.isInstance(e) || isCause(expected, e.getCause()));
+  }
 
   private void waitForLaunchedState(RMAppAttempt attempt)
       throws InterruptedException {