YARN-1201. TestAMAuthorization fails with local hostname cannot be resolved. (Wangda Tan via junping_du)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1592197 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Junping Du 2014-05-03 13:03:27 +00:00
parent b2f65c276d
commit 2ad1cee5da
2 changed files with 53 additions and 8 deletions

View File

@ -170,6 +170,9 @@ Release 2.4.1 - UNRELEASED
YARN-1929. Fixed a deadlock in ResourceManager that occurs when failover YARN-1929. Fixed a deadlock in ResourceManager that occurs when failover
happens right at the time of shutdown. (Karthik Kambatla via vinodkv) 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 Release 2.4.0 - 2014-04-07
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -32,6 +32,7 @@ import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.CommonConfigurationKeysPublic; import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
import org.apache.hadoop.io.DataInputByteBuffer; import org.apache.hadoop.io.DataInputByteBuffer;
import org.apache.hadoop.security.AccessControlException;
import org.apache.hadoop.security.Credentials; import org.apache.hadoop.security.Credentials;
import org.apache.hadoop.security.SecurityUtil; import org.apache.hadoop.security.SecurityUtil;
import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.UserGroupInformation;
@ -272,21 +273,62 @@ public class TestAMAuthorization {
client.registerApplicationMaster(request); client.registerApplicationMaster(request);
Assert.fail("Should fail with authorization error"); Assert.fail("Should fail with authorization error");
} catch (Exception e) { } catch (Exception e) {
// Because there are no tokens, the request should be rejected as the if (isCause(AccessControlException.class, e)) {
// server side will assume we are trying simple auth. // Because there are no tokens, the request should be rejected as the
String expectedMessage = ""; // server side will assume we are trying simple auth.
if (UserGroupInformation.isSecurityEnabled()) { String expectedMessage = "";
expectedMessage = "Client cannot authenticate via:[TOKEN]"; 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 { } else {
expectedMessage = throw e;
"SIMPLE authentication is not enabled. Available:[TOKEN]";
} }
Assert.assertTrue(e.getCause().getMessage().contains(expectedMessage));
} }
// TODO: Add validation of invalid authorization when there's more data in // TODO: Add validation of invalid authorization when there's more data in
// the AMRMToken // 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) private void waitForLaunchedState(RMAppAttempt attempt)
throws InterruptedException { throws InterruptedException {