|
@@ -30,14 +30,18 @@ import static org.mockito.Mockito.times;
|
|
|
import static org.mockito.Mockito.verify;
|
|
|
import static org.mockito.Mockito.when;
|
|
|
|
|
|
+import java.net.URI;
|
|
|
+import java.net.URISyntaxException;
|
|
|
import java.util.Arrays;
|
|
|
import java.util.Collection;
|
|
|
import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
import org.apache.commons.logging.Log;
|
|
|
import org.apache.commons.logging.LogFactory;
|
|
|
import org.apache.hadoop.conf.Configuration;
|
|
|
+import org.apache.hadoop.http.HttpConfig;
|
|
|
import org.apache.hadoop.security.SecurityUtil;
|
|
|
import org.apache.hadoop.security.UserGroupInformation;
|
|
|
import org.apache.hadoop.security.UserGroupInformation.AuthenticationMethod;
|
|
@@ -85,8 +89,10 @@ import org.apache.hadoop.yarn.server.resourcemanager.security.ClientToAMTokenSec
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.security.NMTokenSecretManagerInRM;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.security.RMContainerTokenSecretManager;
|
|
|
import org.apache.hadoop.yarn.server.utils.BuilderUtils;
|
|
|
+import org.apache.hadoop.yarn.server.webproxy.ProxyUriUtils;
|
|
|
import org.apache.hadoop.yarn.webapp.util.WebAppUtils;
|
|
|
import org.junit.After;
|
|
|
+import org.junit.Assert;
|
|
|
import org.junit.Before;
|
|
|
import org.junit.Test;
|
|
|
import org.junit.runner.RunWith;
|
|
@@ -261,8 +267,22 @@ public class TestRMAppAttemptTransitions {
|
|
|
|
|
|
|
|
|
private String getProxyUrl(RMAppAttempt appAttempt) {
|
|
|
- return pjoin(RM_WEBAPP_ADDR, "proxy",
|
|
|
- appAttempt.getAppAttemptId().getApplicationId(), "");
|
|
|
+ String url = null;
|
|
|
+ try {
|
|
|
+ URI trackingUri =
|
|
|
+ StringUtils.isEmpty(appAttempt.getOriginalTrackingUrl()) ? null :
|
|
|
+ ProxyUriUtils
|
|
|
+ .getUriFromAMUrl(appAttempt.getOriginalTrackingUrl());
|
|
|
+ String proxy = WebAppUtils.getProxyHostAndPort(conf);
|
|
|
+ URI proxyUri = ProxyUriUtils.getUriFromAMUrl(proxy);
|
|
|
+ URI result = ProxyUriUtils.getProxyUri(trackingUri, proxyUri,
|
|
|
+ appAttempt.getAppAttemptId().getApplicationId());
|
|
|
+ url = result.toASCIIString().substring(
|
|
|
+ HttpConfig.getSchemePrefix().length());
|
|
|
+ } catch (URISyntaxException ex) {
|
|
|
+ Assert.fail();
|
|
|
+ }
|
|
|
+ return url;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -448,9 +468,9 @@ public class TestRMAppAttemptTransitions {
|
|
|
assertEquals(container, applicationAttempt.getMasterContainer());
|
|
|
assertEquals(host, applicationAttempt.getHost());
|
|
|
assertEquals(rpcPort, applicationAttempt.getRpcPort());
|
|
|
- assertEquals(trackingUrl, applicationAttempt.getOriginalTrackingUrl());
|
|
|
+ verifyUrl(trackingUrl, applicationAttempt.getOriginalTrackingUrl());
|
|
|
if (unmanagedAM) {
|
|
|
- assertEquals("oldtrackingurl", applicationAttempt.getTrackingUrl());
|
|
|
+ verifyUrl(trackingUrl, applicationAttempt.getTrackingUrl());
|
|
|
} else {
|
|
|
assertEquals(getProxyUrl(applicationAttempt),
|
|
|
applicationAttempt.getTrackingUrl());
|
|
@@ -468,7 +488,7 @@ public class TestRMAppAttemptTransitions {
|
|
|
assertEquals(RMAppAttemptState.FINISHING,
|
|
|
applicationAttempt.getAppAttemptState());
|
|
|
assertEquals(diagnostics, applicationAttempt.getDiagnostics());
|
|
|
- assertEquals(trackingUrl, applicationAttempt.getOriginalTrackingUrl());
|
|
|
+ verifyUrl(trackingUrl, applicationAttempt.getOriginalTrackingUrl());
|
|
|
assertEquals(getProxyUrl(applicationAttempt),
|
|
|
applicationAttempt.getTrackingUrl());
|
|
|
assertEquals(container, applicationAttempt.getMasterContainer());
|
|
@@ -487,9 +507,9 @@ public class TestRMAppAttemptTransitions {
|
|
|
assertEquals(RMAppAttemptState.FINISHED,
|
|
|
applicationAttempt.getAppAttemptState());
|
|
|
assertEquals(diagnostics, applicationAttempt.getDiagnostics());
|
|
|
- assertEquals(trackingUrl, applicationAttempt.getOriginalTrackingUrl());
|
|
|
+ verifyUrl(trackingUrl, applicationAttempt.getOriginalTrackingUrl());
|
|
|
if (unmanagedAM) {
|
|
|
- assertEquals("mytrackingurl", applicationAttempt.getTrackingUrl());
|
|
|
+ verifyUrl(trackingUrl, applicationAttempt.getTrackingUrl());
|
|
|
|
|
|
} else {
|
|
|
assertEquals(getProxyUrl(applicationAttempt),
|
|
@@ -603,9 +623,7 @@ public class TestRMAppAttemptTransitions {
|
|
|
trackingUrl, diagnostics);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- @Test
|
|
|
- public void testUnmanagedAMSuccess() {
|
|
|
+ private void testUnmanagedAMSuccess(String url) {
|
|
|
unmanagedAM = true;
|
|
|
when(submissionContext.getUnmanagedAM()).thenReturn(true);
|
|
|
// submit AM and check it goes to LAUNCHED state
|
|
@@ -615,7 +633,7 @@ public class TestRMAppAttemptTransitions {
|
|
|
applicationAttempt.getAppAttemptId());
|
|
|
|
|
|
// launch AM
|
|
|
- runApplicationAttempt(null, "host", 8042, "oldtrackingurl", true);
|
|
|
+ runApplicationAttempt(null, "host", 8042, url, true);
|
|
|
|
|
|
// complete a container
|
|
|
applicationAttempt.handle(new RMAppAttemptContainerAcquiredEvent(
|
|
@@ -623,13 +641,12 @@ public class TestRMAppAttemptTransitions {
|
|
|
applicationAttempt.handle(new RMAppAttemptContainerFinishedEvent(
|
|
|
applicationAttempt.getAppAttemptId(), mock(ContainerStatus.class)));
|
|
|
// complete AM
|
|
|
- String trackingUrl = "mytrackingurl";
|
|
|
String diagnostics = "Successful";
|
|
|
FinalApplicationStatus finalStatus = FinalApplicationStatus.SUCCEEDED;
|
|
|
applicationAttempt.handle(new RMAppAttemptUnregistrationEvent(
|
|
|
- applicationAttempt.getAppAttemptId(), trackingUrl, finalStatus,
|
|
|
+ applicationAttempt.getAppAttemptId(), url, finalStatus,
|
|
|
diagnostics));
|
|
|
- testAppAttemptFinishedState(null, finalStatus, trackingUrl, diagnostics, 1,
|
|
|
+ testAppAttemptFinishedState(null, finalStatus, url, diagnostics, 1,
|
|
|
true);
|
|
|
}
|
|
|
|
|
@@ -824,12 +841,42 @@ public class TestRMAppAttemptTransitions {
|
|
|
"Killed by user");
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ public void testTrackingUrlUnmanagedAM() {
|
|
|
+ testUnmanagedAMSuccess("oldTrackingUrl");
|
|
|
+ }
|
|
|
|
|
|
@Test
|
|
|
- public void testNoTrackingUrl() {
|
|
|
+ public void testEmptyTrackingUrlUnmanagedAM() {
|
|
|
+ testUnmanagedAMSuccess("");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testNullTrackingUrlUnmanagedAM() {
|
|
|
+ testUnmanagedAMSuccess(null);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testManagedAMWithTrackingUrl() {
|
|
|
+ testTrackingUrlManagedAM("theTrackingUrl");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testManagedAMWithEmptyTrackingUrl() {
|
|
|
+ testTrackingUrlManagedAM("");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testManagedAMWithNullTrackingUrl() {
|
|
|
+ testTrackingUrlManagedAM(null);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void testTrackingUrlManagedAM(String url) {
|
|
|
Container amContainer = allocateApplicationAttempt();
|
|
|
launchApplicationAttempt(amContainer);
|
|
|
- runApplicationAttempt(amContainer, "host", 8042, "", false);
|
|
|
+ runApplicationAttempt(amContainer, "host", 8042, url, false);
|
|
|
+ unregisterApplicationAttempt(amContainer,
|
|
|
+ FinalApplicationStatus.SUCCEEDED, url, "Successful");
|
|
|
}
|
|
|
|
|
|
@Test
|
|
@@ -927,4 +974,12 @@ public class TestRMAppAttemptTransitions {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private void verifyUrl(String url1, String url2) {
|
|
|
+ if (url1 == null || url1.trim().isEmpty()) {
|
|
|
+ assertEquals("N/A", url2);
|
|
|
+ } else {
|
|
|
+ assertEquals(url1, url2);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|