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:
parent
b2f65c276d
commit
2ad1cee5da
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue