|
@@ -25,7 +25,10 @@ import static org.junit.Assert.assertFalse;
|
|
|
import static org.junit.Assert.assertNotNull;
|
|
|
import static org.junit.Assert.assertTrue;
|
|
|
import static org.junit.Assert.fail;
|
|
|
+import static org.junit.jupiter.api.Assertions.assertThrows;
|
|
|
import static org.mockito.ArgumentMatchers.any;
|
|
|
+import static org.mockito.Mockito.doNothing;
|
|
|
+import static org.mockito.Mockito.doThrow;
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
import static org.mockito.Mockito.spy;
|
|
|
import static org.mockito.Mockito.times;
|
|
@@ -33,6 +36,8 @@ import static org.mockito.Mockito.verify;
|
|
|
import static org.mockito.Mockito.when;
|
|
|
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.runtime.LinuxContainerRuntime;
|
|
|
+import org.apache.hadoop.yarn.server.nodemanager.containermanager.runtime.ContainerExecutionException;
|
|
|
+import org.apache.hadoop.yarn.server.nodemanager.containermanager.runtime.ContainerRuntimeContext;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.executor.ContainerExecContext;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.executor.ContainerReapContext;
|
|
|
import org.slf4j.Logger;
|
|
@@ -41,6 +46,7 @@ import org.slf4j.LoggerFactory;
|
|
|
import java.io.File;
|
|
|
import java.io.FileOutputStream;
|
|
|
import java.io.IOException;
|
|
|
+import java.io.InterruptedIOException;
|
|
|
import java.io.PrintWriter;
|
|
|
import java.net.InetSocketAddress;
|
|
|
import java.util.ArrayList;
|
|
@@ -725,6 +731,44 @@ public class TestLinuxContainerExecutor {
|
|
|
verify(lce, times(1)).getLocalResources(container);
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ public void testSignalContainerFailureWhenExitCodeIsPresentInTheException()
|
|
|
+ throws ContainerExecutionException {
|
|
|
+ LinuxContainerRuntime containerRuntime = mock(LinuxContainerRuntime.class);
|
|
|
+ LinuxContainerExecutor containerExecutor = spy(new LinuxContainerExecutor(
|
|
|
+ containerRuntime));
|
|
|
+ ContainerSignalContext signalContext = new ContainerSignalContext.Builder().build();
|
|
|
+ ContainerExecutionException testException =
|
|
|
+ new ContainerExecutionException("exceptionWithExitCode", 123);
|
|
|
+
|
|
|
+ doNothing().when(containerExecutor).verifyUsernamePattern(any());
|
|
|
+ doThrow(testException)
|
|
|
+ .when(containerRuntime)
|
|
|
+ .signalContainer(any(ContainerRuntimeContext.class));
|
|
|
+
|
|
|
+ assertThrows(IOException.class,
|
|
|
+ () -> containerExecutor.signalContainer(signalContext));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testSignalContainerFailureWhenExitCodeIsNotPresentInTheException()
|
|
|
+ throws ContainerExecutionException {
|
|
|
+ LinuxContainerRuntime containerRuntime = mock(LinuxContainerRuntime.class);
|
|
|
+ LinuxContainerExecutor containerExecutor = spy(new LinuxContainerExecutor(
|
|
|
+ containerRuntime));
|
|
|
+ ContainerSignalContext signalContext = new ContainerSignalContext.Builder().build();
|
|
|
+ ContainerExecutionException testException =
|
|
|
+ new ContainerExecutionException("exceptionWithoutExitCode");
|
|
|
+
|
|
|
+ doNothing().when(containerExecutor).verifyUsernamePattern(any());
|
|
|
+ doThrow(testException)
|
|
|
+ .when(containerRuntime)
|
|
|
+ .signalContainer(any(ContainerRuntimeContext.class));
|
|
|
+
|
|
|
+ assertThrows(InterruptedIOException.class,
|
|
|
+ () -> containerExecutor.signalContainer(signalContext));
|
|
|
+ }
|
|
|
+
|
|
|
@Deprecated
|
|
|
private static class TestResourceHandler implements LCEResourcesHandler {
|
|
|
static Set<ContainerId> postExecContainers = new HashSet<ContainerId>();
|