|
@@ -28,6 +28,7 @@ import static org.mockito.Mockito.mock;
|
|
import static org.mockito.Mockito.times;
|
|
import static org.mockito.Mockito.times;
|
|
import static org.mockito.Mockito.verify;
|
|
import static org.mockito.Mockito.verify;
|
|
import static org.mockito.Mockito.when;
|
|
import static org.mockito.Mockito.when;
|
|
|
|
+import static org.mockito.Mockito.spy;
|
|
|
|
|
|
import java.util.Collections;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
@@ -35,6 +36,7 @@ import java.util.List;
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.LogFactory;
|
|
import org.apache.commons.logging.LogFactory;
|
|
import org.apache.hadoop.conf.Configuration;
|
|
import org.apache.hadoop.conf.Configuration;
|
|
|
|
+import org.apache.hadoop.security.UserGroupInformation;
|
|
import org.apache.hadoop.yarn.MockApps;
|
|
import org.apache.hadoop.yarn.MockApps;
|
|
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
|
|
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
|
|
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
|
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
|
@@ -102,6 +104,11 @@ public class TestRMAppAttemptTransitions {
|
|
|
|
|
|
private RMApp application;
|
|
private RMApp application;
|
|
private RMAppAttempt applicationAttempt;
|
|
private RMAppAttempt applicationAttempt;
|
|
|
|
+
|
|
|
|
+ private Configuration conf = new Configuration();
|
|
|
|
+ private AMRMTokenSecretManager amRMTokenManager = spy(new AMRMTokenSecretManager(conf));
|
|
|
|
+ private ClientToAMTokenSecretManagerInRM clientToAMTokenManager =
|
|
|
|
+ spy(new ClientToAMTokenSecretManagerInRM());
|
|
|
|
|
|
private final class TestApplicationAttemptEventDispatcher implements
|
|
private final class TestApplicationAttemptEventDispatcher implements
|
|
EventHandler<RMAppAttemptEvent> {
|
|
EventHandler<RMAppAttemptEvent> {
|
|
@@ -163,14 +170,13 @@ public class TestRMAppAttemptTransitions {
|
|
mock(ContainerAllocationExpirer.class);
|
|
mock(ContainerAllocationExpirer.class);
|
|
amLivelinessMonitor = mock(AMLivelinessMonitor.class);
|
|
amLivelinessMonitor = mock(AMLivelinessMonitor.class);
|
|
amFinishingMonitor = mock(AMLivelinessMonitor.class);
|
|
amFinishingMonitor = mock(AMLivelinessMonitor.class);
|
|
- Configuration conf = new Configuration();
|
|
|
|
rmContext =
|
|
rmContext =
|
|
new RMContextImpl(rmDispatcher,
|
|
new RMContextImpl(rmDispatcher,
|
|
containerAllocationExpirer, amLivelinessMonitor, amFinishingMonitor,
|
|
containerAllocationExpirer, amLivelinessMonitor, amFinishingMonitor,
|
|
- null, new AMRMTokenSecretManager(conf),
|
|
|
|
|
|
+ null, amRMTokenManager,
|
|
new RMContainerTokenSecretManager(conf),
|
|
new RMContainerTokenSecretManager(conf),
|
|
new NMTokenSecretManagerInRM(conf),
|
|
new NMTokenSecretManagerInRM(conf),
|
|
- new ClientToAMTokenSecretManagerInRM());
|
|
|
|
|
|
+ clientToAMTokenManager);
|
|
|
|
|
|
RMStateStore store = mock(RMStateStore.class);
|
|
RMStateStore store = mock(RMStateStore.class);
|
|
((RMContextImpl) rmContext).setStateStore(store);
|
|
((RMContextImpl) rmContext).setStateStore(store);
|
|
@@ -261,7 +267,11 @@ public class TestRMAppAttemptTransitions {
|
|
assertEquals(0.0, (double)applicationAttempt.getProgress(), 0.0001);
|
|
assertEquals(0.0, (double)applicationAttempt.getProgress(), 0.0001);
|
|
assertEquals(0, applicationAttempt.getRanNodes().size());
|
|
assertEquals(0, applicationAttempt.getRanNodes().size());
|
|
assertNull(applicationAttempt.getFinalApplicationStatus());
|
|
assertNull(applicationAttempt.getFinalApplicationStatus());
|
|
-
|
|
|
|
|
|
+ if (UserGroupInformation.isSecurityEnabled()) {
|
|
|
|
+ verify(clientToAMTokenManager).registerApplication(
|
|
|
|
+ applicationAttempt.getAppAttemptId());
|
|
|
|
+ }
|
|
|
|
+ assertNotNull(applicationAttempt.getAMRMToken());
|
|
// Check events
|
|
// Check events
|
|
verify(masterService).
|
|
verify(masterService).
|
|
registerAppAttempt(applicationAttempt.getAppAttemptId());
|
|
registerAppAttempt(applicationAttempt.getAppAttemptId());
|
|
@@ -288,6 +298,7 @@ public class TestRMAppAttemptTransitions {
|
|
// this works for unmanaged and managed AM's because this is actually doing
|
|
// this works for unmanaged and managed AM's because this is actually doing
|
|
// verify(application).handle(anyObject());
|
|
// verify(application).handle(anyObject());
|
|
verify(application).handle(any(RMAppRejectedEvent.class));
|
|
verify(application).handle(any(RMAppRejectedEvent.class));
|
|
|
|
+ verifyTokenCount(applicationAttempt.getAppAttemptId(), 1);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -303,6 +314,7 @@ public class TestRMAppAttemptTransitions {
|
|
assertEquals(0.0, (double)applicationAttempt.getProgress(), 0.0001);
|
|
assertEquals(0.0, (double)applicationAttempt.getProgress(), 0.0001);
|
|
assertEquals(0, applicationAttempt.getRanNodes().size());
|
|
assertEquals(0, applicationAttempt.getRanNodes().size());
|
|
assertNull(applicationAttempt.getFinalApplicationStatus());
|
|
assertNull(applicationAttempt.getFinalApplicationStatus());
|
|
|
|
+ verifyTokenCount(applicationAttempt.getAppAttemptId(), 1);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -377,6 +389,8 @@ public class TestRMAppAttemptTransitions {
|
|
|
|
|
|
// Check events
|
|
// Check events
|
|
verify(application, times(2)).handle(any(RMAppFailedAttemptEvent.class));
|
|
verify(application, times(2)).handle(any(RMAppFailedAttemptEvent.class));
|
|
|
|
+
|
|
|
|
+ verifyTokenCount(applicationAttempt.getAppAttemptId(), 1);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -422,6 +436,7 @@ public class TestRMAppAttemptTransitions {
|
|
applicationAttempt.getTrackingUrl());
|
|
applicationAttempt.getTrackingUrl());
|
|
assertEquals(container, applicationAttempt.getMasterContainer());
|
|
assertEquals(container, applicationAttempt.getMasterContainer());
|
|
assertEquals(finalStatus, applicationAttempt.getFinalApplicationStatus());
|
|
assertEquals(finalStatus, applicationAttempt.getFinalApplicationStatus());
|
|
|
|
+ verifyTokenCount(applicationAttempt.getAppAttemptId(), 0);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -442,6 +457,7 @@ public class TestRMAppAttemptTransitions {
|
|
.getJustFinishedContainers().size());
|
|
.getJustFinishedContainers().size());
|
|
assertEquals(container, applicationAttempt.getMasterContainer());
|
|
assertEquals(container, applicationAttempt.getMasterContainer());
|
|
assertEquals(finalStatus, applicationAttempt.getFinalApplicationStatus());
|
|
assertEquals(finalStatus, applicationAttempt.getFinalApplicationStatus());
|
|
|
|
+ verifyTokenCount(applicationAttempt.getAppAttemptId(), 1);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -592,6 +608,7 @@ public class TestRMAppAttemptTransitions {
|
|
applicationAttempt.getAppAttemptId(),
|
|
applicationAttempt.getAppAttemptId(),
|
|
RMAppAttemptEventType.KILL));
|
|
RMAppAttemptEventType.KILL));
|
|
testAppAttemptKilledState(null, EMPTY_DIAGNOSTICS);
|
|
testAppAttemptKilledState(null, EMPTY_DIAGNOSTICS);
|
|
|
|
+ verifyTokenCount(applicationAttempt.getAppAttemptId(), 1);
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -666,6 +683,7 @@ public class TestRMAppAttemptTransitions {
|
|
applicationAttempt.getAppAttemptId(), cs));
|
|
applicationAttempt.getAppAttemptId(), cs));
|
|
assertEquals(RMAppAttemptState.FAILED,
|
|
assertEquals(RMAppAttemptState.FAILED,
|
|
applicationAttempt.getAppAttemptState());
|
|
applicationAttempt.getAppAttemptState());
|
|
|
|
+ verifyTokenCount(applicationAttempt.getAppAttemptId(), 1);
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -709,6 +727,7 @@ public class TestRMAppAttemptTransitions {
|
|
applicationAttempt.getAppAttemptId().getApplicationId());
|
|
applicationAttempt.getAppAttemptId().getApplicationId());
|
|
assertEquals(rmAppPageUrl, applicationAttempt.getOriginalTrackingUrl());
|
|
assertEquals(rmAppPageUrl, applicationAttempt.getOriginalTrackingUrl());
|
|
assertEquals(rmAppPageUrl, applicationAttempt.getTrackingUrl());
|
|
assertEquals(rmAppPageUrl, applicationAttempt.getTrackingUrl());
|
|
|
|
+ verifyTokenCount(applicationAttempt.getAppAttemptId(), 1);
|
|
}
|
|
}
|
|
|
|
|
|
@Test(timeout=10000)
|
|
@Test(timeout=10000)
|
|
@@ -725,6 +744,7 @@ public class TestRMAppAttemptTransitions {
|
|
applicationAttempt.getAppAttemptId().getApplicationId());
|
|
applicationAttempt.getAppAttemptId().getApplicationId());
|
|
assertEquals(rmAppPageUrl, applicationAttempt.getOriginalTrackingUrl());
|
|
assertEquals(rmAppPageUrl, applicationAttempt.getOriginalTrackingUrl());
|
|
assertEquals(rmAppPageUrl, applicationAttempt.getTrackingUrl());
|
|
assertEquals(rmAppPageUrl, applicationAttempt.getTrackingUrl());
|
|
|
|
+ verifyTokenCount(applicationAttempt.getAppAttemptId(), 1);
|
|
}
|
|
}
|
|
|
|
|
|
@Test(timeout=20000)
|
|
@Test(timeout=20000)
|
|
@@ -742,6 +762,7 @@ public class TestRMAppAttemptTransitions {
|
|
applicationAttempt.getAppAttemptId().getApplicationId());
|
|
applicationAttempt.getAppAttemptId().getApplicationId());
|
|
assertEquals(rmAppPageUrl, applicationAttempt.getOriginalTrackingUrl());
|
|
assertEquals(rmAppPageUrl, applicationAttempt.getOriginalTrackingUrl());
|
|
assertEquals(rmAppPageUrl, applicationAttempt.getTrackingUrl());
|
|
assertEquals(rmAppPageUrl, applicationAttempt.getTrackingUrl());
|
|
|
|
+ verifyTokenCount(applicationAttempt.getAppAttemptId(), 1);
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -848,4 +869,10 @@ public class TestRMAppAttemptTransitions {
|
|
diagnostics, 0);
|
|
diagnostics, 0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private void verifyTokenCount(ApplicationAttemptId appAttemptId, int count) {
|
|
|
|
+ verify(amRMTokenManager, times(count)).applicationMasterFinished(appAttemptId);
|
|
|
|
+ if (UserGroupInformation.isSecurityEnabled()) {
|
|
|
|
+ verify(clientToAMTokenManager, times(count)).unRegisterApplication(appAttemptId);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|