YARN-3601. Fix UT TestRMFailover.testRMWebAppRedirect. Contributed by Weiwei Yang

This commit is contained in:
Xuan 2015-05-19 09:56:01 -07:00
parent de30d66b26
commit 5009ad4a7f
2 changed files with 40 additions and 40 deletions

View File

@ -509,6 +509,8 @@ Release 2.7.1 - UNRELEASED
YARN-3526. ApplicationMaster tracking URL is incorrectly redirected
on a QJM cluster. (Weiwei Yang via xgong)
YARN-3601. Fix UT TestRMFailover.testRMWebAppRedirect. (Weiwei Yang via xgong)
Release 2.7.0 - 2015-04-20
INCOMPATIBLE CHANGES

View File

@ -21,13 +21,13 @@ package org.apache.hadoop.yarn.client;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -48,7 +48,6 @@ import org.apache.hadoop.yarn.server.webproxy.WebAppProxyServer;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public class TestRMFailover extends ClientBaseWithFixes {
@ -275,10 +274,6 @@ public class TestRMFailover extends ClientBaseWithFixes {
assertEquals(404, response.getResponseCode());
}
// ignore this testcase, Always gets "too many redirect loops" exception
// Probably because of the limitation of MiniYARNCluster.
// Verified the behavior in a single node cluster.
@Ignore
@Test
public void testRMWebAppRedirect() throws YarnException,
InterruptedException, IOException {
@ -290,59 +285,62 @@ public class TestRMFailover extends ClientBaseWithFixes {
getAdminService(0).transitionToActive(req);
String rm1Url = "http://0.0.0.0:18088";
String rm2Url = "http://0.0.0.0:28088";
String header = getHeader("Refresh", rm2Url);
assertTrue(header.contains("; url=" + rm1Url));
String redirectURL = getRedirectURL(rm2Url);
// if uri is null, RMWebAppFilter will append a slash at the trail of the redirection url
assertEquals(redirectURL,rm1Url+"/");
header = getHeader("Refresh", rm2Url + "/metrics");
assertTrue(header.contains("; url=" + rm1Url));
redirectURL = getRedirectURL(rm2Url + "/metrics");
assertEquals(redirectURL,rm1Url + "/metrics");
header = getHeader("Refresh", rm2Url + "/jmx");
assertTrue(header.contains("; url=" + rm1Url));
redirectURL = getRedirectURL(rm2Url + "/jmx");
assertEquals(redirectURL,rm1Url + "/jmx");
// standby RM links /conf, /stacks, /logLevel, /static, /logs,
// /cluster/cluster as well as webService
// /ws/v1/cluster/info should not be redirected to active RM
header = getHeader("Refresh", rm2Url + "/cluster/cluster");
assertEquals(null, header);
redirectURL = getRedirectURL(rm2Url + "/cluster/cluster");
assertNull(redirectURL);
header = getHeader("Refresh", rm2Url + "/conf");
assertEquals(null, header);
redirectURL = getRedirectURL(rm2Url + "/conf");
assertNull(redirectURL);
header = getHeader("Refresh", rm2Url + "/stacks");
assertEquals(null, header);
redirectURL = getRedirectURL(rm2Url + "/stacks");
assertNull(redirectURL);
header = getHeader("Refresh", rm2Url + "/logLevel");
assertEquals(null, header);
redirectURL = getRedirectURL(rm2Url + "/logLevel");
assertNull(redirectURL);
header = getHeader("Refresh", rm2Url + "/static");
assertEquals(null, header);
redirectURL = getRedirectURL(rm2Url + "/static");
assertNull(redirectURL);
header = getHeader("Refresh", rm2Url + "/logs");
assertEquals(null, header);
redirectURL = getRedirectURL(rm2Url + "/logs");
assertNull(redirectURL);
header = getHeader("Refresh", rm2Url + "/ws/v1/cluster/info");
assertEquals(null, header);
redirectURL = getRedirectURL(rm2Url + "/ws/v1/cluster/info");
assertNull(redirectURL);
header = getHeader("Refresh", rm2Url + "/ws/v1/cluster/apps");
assertTrue(header.contains("; url=" + rm1Url));
redirectURL = getRedirectURL(rm2Url + "/ws/v1/cluster/apps");
assertEquals(redirectURL, rm1Url + "/ws/v1/cluster/apps");
header = getHeader("Refresh", rm2Url + "/proxy/" + fakeAppId);
assertEquals(null, header);
// Due to the limitation of MiniYARNCluster and dispatcher is a singleton,
// we couldn't add the test case after explicitFailover();
redirectURL = getRedirectURL(rm2Url + "/proxy/" + fakeAppId);
assertNull(redirectURL);
}
static String getHeader(String field, String url) {
String fieldHeader = null;
// set up http connection with the given url and get the redirection url from the response
// return null if the url is not redirected
static String getRedirectURL(String url) {
String redirectUrl = null;
try {
Map<String, List<String>> map =
new URL(url).openConnection().getHeaderFields();
fieldHeader = map.get(field).get(0);
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
// do not automatically follow the redirection
// otherwise we get too many redirections exception
conn.setInstanceFollowRedirects(false);
if(conn.getResponseCode() == HttpServletResponse.SC_TEMPORARY_REDIRECT)
redirectUrl = conn.getHeaderField("Location");
} catch (Exception e) {
// throw new RuntimeException(e);
}
return fieldHeader;
return redirectUrl;
}
}