Java Code Examples for org.apache.hadoop.yarn.api.records.ContainerState#COMPLETE
The following examples show how to use
org.apache.hadoop.yarn.api.records.ContainerState#COMPLETE .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: NodeStatusUpdaterImpl.java From hadoop with Apache License 2.0 | 6 votes |
private List<NMContainerStatus> getNMContainerStatuses() throws IOException { List<NMContainerStatus> containerStatuses = new ArrayList<NMContainerStatus>(); for (Container container : this.context.getContainers().values()) { ContainerId containerId = container.getContainerId(); ApplicationId applicationId = containerId.getApplicationAttemptId() .getApplicationId(); if (!this.context.getApplications().containsKey(applicationId)) { context.getContainers().remove(containerId); continue; } NMContainerStatus status = container.getNMContainerStatus(); containerStatuses.add(status); if (status.getContainerState() == ContainerState.COMPLETE) { // Adding to finished containers cache. Cache will keep it around at // least for #durationToTrackStoppedContainers duration. In the // subsequent call to stop container it will get removed from cache. addCompletedContainer(containerId); } } LOG.info("Sending out " + containerStatuses.size() + " NM container statuses: " + containerStatuses); return containerStatuses; }
Example 2
Source File: NMClientImpl.java From hadoop with Apache License 2.0 | 6 votes |
@Override public void stopContainer(ContainerId containerId, NodeId nodeId) throws YarnException, IOException { StartedContainer startedContainer = getStartedContainer(containerId); // Only allow one request of stopping the container to move forward // When entering the block, check whether the precursor has already stopped // the container if (startedContainer != null) { synchronized (startedContainer) { if (startedContainer.state != ContainerState.RUNNING) { return; } stopContainerInternal(containerId, nodeId); // Only after successful startedContainer.state = ContainerState.COMPLETE; removeStartedContainer(startedContainer); } } else { stopContainerInternal(containerId, nodeId); } }
Example 3
Source File: Hadoop21YarnNMClient.java From twill with Apache License 2.0 | 6 votes |
@Override public void cancel() { LOG.info("Request to stop container {}.", container.getId()); try { nmClient.stopContainer(container.getId(), container.getNodeId()); while (true) { ContainerStatus status = nmClient.getContainerStatus(container.getId(), container.getNodeId()); LOG.trace("Container status: {} {}", status, status.getDiagnostics()); if (status.getState() == ContainerState.COMPLETE) { break; } Uninterruptibles.sleepUninterruptibly(200, TimeUnit.MILLISECONDS); } LOG.info("Container {} stopped.", container.getId()); } catch (Exception e) { LOG.error("Fail to stop container {}", container.getId(), e); throw Throwables.propagate(e); } }
Example 4
Source File: NodeStatusUpdaterImpl.java From big-c with Apache License 2.0 | 6 votes |
private List<NMContainerStatus> getNMContainerStatuses() throws IOException { List<NMContainerStatus> containerStatuses = new ArrayList<NMContainerStatus>(); for (Container container : this.context.getContainers().values()) { ContainerId containerId = container.getContainerId(); ApplicationId applicationId = containerId.getApplicationAttemptId() .getApplicationId(); if (!this.context.getApplications().containsKey(applicationId)) { context.getContainers().remove(containerId); continue; } NMContainerStatus status = container.getNMContainerStatus(); containerStatuses.add(status); if (status.getContainerState() == ContainerState.COMPLETE) { // Adding to finished containers cache. Cache will keep it around at // least for #durationToTrackStoppedContainers duration. In the // subsequent call to stop container it will get removed from cache. addCompletedContainer(containerId); } } LOG.info("Sending out " + containerStatuses.size() + " NM container statuses: " + containerStatuses); return containerStatuses; }
Example 5
Source File: NMClientImpl.java From big-c with Apache License 2.0 | 6 votes |
@Override public void stopContainer(ContainerId containerId, NodeId nodeId) throws YarnException, IOException { StartedContainer startedContainer = getStartedContainer(containerId); // Only allow one request of stopping the container to move forward // When entering the block, check whether the precursor has already stopped // the container if (startedContainer != null) { synchronized (startedContainer) { if (startedContainer.state != ContainerState.RUNNING) { return; } stopContainerInternal(containerId, nodeId); // Only after successful startedContainer.state = ContainerState.COMPLETE; removeStartedContainer(startedContainer); } } else { stopContainerInternal(containerId, nodeId); } }
Example 6
Source File: NodeStatusUpdaterImpl.java From hadoop with Apache License 2.0 | 5 votes |
@VisibleForTesting protected List<ContainerStatus> getContainerStatuses() throws IOException { List<ContainerStatus> containerStatuses = new ArrayList<ContainerStatus>(); for (Container container : this.context.getContainers().values()) { ContainerId containerId = container.getContainerId(); ApplicationId applicationId = containerId.getApplicationAttemptId() .getApplicationId(); org.apache.hadoop.yarn.api.records.ContainerStatus containerStatus = container.cloneAndGetContainerStatus(); if (containerStatus.getState() == ContainerState.COMPLETE) { if (isApplicationStopped(applicationId)) { if (LOG.isDebugEnabled()) { LOG.debug(applicationId + " is completing, " + " remove " + containerId + " from NM context."); } context.getContainers().remove(containerId); pendingCompletedContainers.put(containerId, containerStatus); } else { if (!isContainerRecentlyStopped(containerId)) { pendingCompletedContainers.put(containerId, containerStatus); // Adding to finished containers cache. Cache will keep it around at // least for #durationToTrackStoppedContainers duration. In the // subsequent call to stop container it will get removed from cache. addCompletedContainer(containerId); } } } else { containerStatuses.add(containerStatus); } } containerStatuses.addAll(pendingCompletedContainers.values()); if (LOG.isDebugEnabled()) { LOG.debug("Sending out " + containerStatuses.size() + " container statuses: " + containerStatuses); } return containerStatuses; }
Example 7
Source File: ResourceTrackerService.java From hadoop with Apache License 2.0 | 5 votes |
/** * Helper method to handle received ContainerStatus. If this corresponds to * the completion of a master-container of a managed AM, * we call the handler for RMAppAttemptContainerFinishedEvent. */ @SuppressWarnings("unchecked") @VisibleForTesting void handleNMContainerStatus(NMContainerStatus containerStatus, NodeId nodeId) { ApplicationAttemptId appAttemptId = containerStatus.getContainerId().getApplicationAttemptId(); RMApp rmApp = rmContext.getRMApps().get(appAttemptId.getApplicationId()); if (rmApp == null) { LOG.error("Received finished container : " + containerStatus.getContainerId() + " for unknown application " + appAttemptId.getApplicationId() + " Skipping."); return; } if (rmApp.getApplicationSubmissionContext().getUnmanagedAM()) { if (LOG.isDebugEnabled()) { LOG.debug("Ignoring container completion status for unmanaged AM " + rmApp.getApplicationId()); } return; } RMAppAttempt rmAppAttempt = rmApp.getRMAppAttempt(appAttemptId); Container masterContainer = rmAppAttempt.getMasterContainer(); if (masterContainer.getId().equals(containerStatus.getContainerId()) && containerStatus.getContainerState() == ContainerState.COMPLETE) { ContainerStatus status = ContainerStatus.newInstance(containerStatus.getContainerId(), containerStatus.getContainerState(), containerStatus.getDiagnostics(), containerStatus.getContainerExitStatus()); // sending master container finished event. RMAppAttemptContainerFinishedEvent evt = new RMAppAttemptContainerFinishedEvent(appAttemptId, status, nodeId); rmContext.getDispatcher().getEventHandler().handle(evt); } }
Example 8
Source File: NodeStatusUpdaterImpl.java From big-c with Apache License 2.0 | 5 votes |
@VisibleForTesting protected List<ContainerStatus> getContainerStatuses() throws IOException { List<ContainerStatus> containerStatuses = new ArrayList<ContainerStatus>(); for (Container container : this.context.getContainers().values()) { ContainerId containerId = container.getContainerId(); ApplicationId applicationId = containerId.getApplicationAttemptId() .getApplicationId(); org.apache.hadoop.yarn.api.records.ContainerStatus containerStatus = container.cloneAndGetContainerStatus(); if (containerStatus.getState() == ContainerState.COMPLETE) { if (isApplicationStopped(applicationId)) { if (LOG.isDebugEnabled()) { LOG.debug(applicationId + " is completing, " + " remove " + containerId + " from NM context."); } context.getContainers().remove(containerId); pendingCompletedContainers.put(containerId, containerStatus); } else { if (!isContainerRecentlyStopped(containerId)) { pendingCompletedContainers.put(containerId, containerStatus); // Adding to finished containers cache. Cache will keep it around at // least for #durationToTrackStoppedContainers duration. In the // subsequent call to stop container it will get removed from cache. addCompletedContainer(containerId); } } } else { containerStatuses.add(containerStatus); } } containerStatuses.addAll(pendingCompletedContainers.values()); if (LOG.isDebugEnabled()) { LOG.debug("Sending out " + containerStatuses.size() + " container statuses: " + containerStatuses); } return containerStatuses; }
Example 9
Source File: ResourceTrackerService.java From big-c with Apache License 2.0 | 5 votes |
/** * Helper method to handle received ContainerStatus. If this corresponds to * the completion of a master-container of a managed AM, * we call the handler for RMAppAttemptContainerFinishedEvent. */ @SuppressWarnings("unchecked") @VisibleForTesting void handleNMContainerStatus(NMContainerStatus containerStatus, NodeId nodeId) { ApplicationAttemptId appAttemptId = containerStatus.getContainerId().getApplicationAttemptId(); RMApp rmApp = rmContext.getRMApps().get(appAttemptId.getApplicationId()); if (rmApp == null) { LOG.error("Received finished container : " + containerStatus.getContainerId() + " for unknown application " + appAttemptId.getApplicationId() + " Skipping."); return; } if (rmApp.getApplicationSubmissionContext().getUnmanagedAM()) { if (LOG.isDebugEnabled()) { LOG.debug("Ignoring container completion status for unmanaged AM " + rmApp.getApplicationId()); } return; } RMAppAttempt rmAppAttempt = rmApp.getRMAppAttempt(appAttemptId); Container masterContainer = rmAppAttempt.getMasterContainer(); if (masterContainer.getId().equals(containerStatus.getContainerId()) && containerStatus.getContainerState() == ContainerState.COMPLETE) { ContainerStatus status = ContainerStatus.newInstance(containerStatus.getContainerId(), containerStatus.getContainerState(), containerStatus.getDiagnostics(), containerStatus.getContainerExitStatus()); // sending master container finished event. RMAppAttemptContainerFinishedEvent evt = new RMAppAttemptContainerFinishedEvent(appAttemptId, status, nodeId); rmContext.getDispatcher().getEventHandler().handle(evt); } }
Example 10
Source File: ContainerManagerImpl.java From hadoop with Apache License 2.0 | 4 votes |
public void cleanupContainersOnNMResync() { Map<ContainerId, Container> containers = context.getContainers(); if (containers.isEmpty()) { return; } LOG.info("Containers still running on " + CMgrCompletedContainersEvent.Reason.ON_NODEMANAGER_RESYNC + " : " + containers.keySet()); List<ContainerId> containerIds = new ArrayList<ContainerId>(containers.keySet()); LOG.info("Waiting for containers to be killed"); this.handle(new CMgrCompletedContainersEvent(containerIds, CMgrCompletedContainersEvent.Reason.ON_NODEMANAGER_RESYNC)); /* * We will wait till all the containers change their state to COMPLETE. We * will not remove the container statuses from nm context because these * are used while re-registering node manager with resource manager. */ boolean allContainersCompleted = false; while (!containers.isEmpty() && !allContainersCompleted) { allContainersCompleted = true; for (Entry<ContainerId, Container> container : containers.entrySet()) { if (((ContainerImpl) container.getValue()).getCurrentState() != ContainerState.COMPLETE) { allContainersCompleted = false; try { Thread.sleep(1000); } catch (InterruptedException ex) { LOG.warn("Interrupted while sleeping on container kill on resync", ex); } break; } } } // All containers killed if (allContainersCompleted) { LOG.info("All containers in DONE state"); } else { LOG.info("Done waiting for containers to be killed. Still alive: " + containers.keySet()); } }
Example 11
Source File: TestNodeStatusUpdater.java From hadoop with Apache License 2.0 | 4 votes |
@Test(timeout = 90000) public void testRemovePreviousCompletedContainersFromContext() throws Exception { NodeManager nm = new NodeManager(); YarnConfiguration conf = new YarnConfiguration(); conf.set( NodeStatusUpdaterImpl .YARN_NODEMANAGER_DURATION_TO_TRACK_STOPPED_CONTAINERS, "10000"); nm.init(conf); NodeStatusUpdaterImpl nodeStatusUpdater = (NodeStatusUpdaterImpl) nm.getNodeStatusUpdater(); ApplicationId appId = ApplicationId.newInstance(0, 0); ApplicationAttemptId appAttemptId = ApplicationAttemptId.newInstance(appId, 0); ContainerId cId = ContainerId.newContainerId(appAttemptId, 1); Token containerToken = BuilderUtils.newContainerToken(cId, "anyHost", 1234, "anyUser", BuilderUtils.newResource(1024, 1), 0, 123, "password".getBytes(), 0); Container anyCompletedContainer = new ContainerImpl(conf, null, null, null, null, null, BuilderUtils.newContainerTokenIdentifier(containerToken)) { @Override public ContainerState getCurrentState() { return ContainerState.COMPLETE; } @Override public org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerState getContainerState() { return org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerState.DONE; } }; ContainerId runningContainerId = ContainerId.newContainerId(appAttemptId, 3); Token runningContainerToken = BuilderUtils.newContainerToken(runningContainerId, "anyHost", 1234, "anyUser", BuilderUtils.newResource(1024, 1), 0, 123, "password".getBytes(), 0); Container runningContainer = new ContainerImpl(conf, null, null, null, null, null, BuilderUtils.newContainerTokenIdentifier(runningContainerToken)) { @Override public ContainerState getCurrentState() { return ContainerState.RUNNING; } @Override public org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerState getContainerState() { return org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerState.RUNNING; } }; nm.getNMContext().getApplications().putIfAbsent(appId, mock(Application.class)); nm.getNMContext().getContainers().put(cId, anyCompletedContainer); nm.getNMContext().getContainers() .put(runningContainerId, runningContainer); Assert.assertEquals(2, nodeStatusUpdater.getContainerStatuses().size()); List<ContainerId> ackedContainers = new ArrayList<ContainerId>(); ackedContainers.add(cId); ackedContainers.add(runningContainerId); nodeStatusUpdater.removeOrTrackCompletedContainersFromContext(ackedContainers); Set<ContainerId> containerIdSet = new HashSet<ContainerId>(); List<ContainerStatus> containerStatuses = nodeStatusUpdater.getContainerStatuses(); for (ContainerStatus status : containerStatuses) { containerIdSet.add(status.getContainerId()); } Assert.assertEquals(1, containerStatuses.size()); // completed container is removed; Assert.assertFalse(containerIdSet.contains(cId)); // running container is not removed; Assert.assertTrue(containerIdSet.contains(runningContainerId)); }
Example 12
Source File: TestNodeStatusUpdater.java From hadoop with Apache License 2.0 | 4 votes |
@Test public void testCleanedupApplicationContainerCleanup() throws IOException { NodeManager nm = new NodeManager(); YarnConfiguration conf = new YarnConfiguration(); conf.set(NodeStatusUpdaterImpl .YARN_NODEMANAGER_DURATION_TO_TRACK_STOPPED_CONTAINERS, "1000000"); nm.init(conf); NodeStatusUpdaterImpl nodeStatusUpdater = (NodeStatusUpdaterImpl) nm.getNodeStatusUpdater(); ApplicationId appId = ApplicationId.newInstance(0, 0); ApplicationAttemptId appAttemptId = ApplicationAttemptId.newInstance(appId, 0); ContainerId cId = ContainerId.newContainerId(appAttemptId, 1); Token containerToken = BuilderUtils.newContainerToken(cId, "anyHost", 1234, "anyUser", BuilderUtils.newResource(1024, 1), 0, 123, "password".getBytes(), 0); Container anyCompletedContainer = new ContainerImpl(conf, null, null, null, null, null, BuilderUtils.newContainerTokenIdentifier(containerToken)) { @Override public ContainerState getCurrentState() { return ContainerState.COMPLETE; } }; Application application = mock(Application.class); when(application.getApplicationState()).thenReturn(ApplicationState.RUNNING); nm.getNMContext().getApplications().putIfAbsent(appId, application); nm.getNMContext().getContainers().put(cId, anyCompletedContainer); Assert.assertEquals(1, nodeStatusUpdater.getContainerStatuses().size()); when(application.getApplicationState()).thenReturn( ApplicationState.FINISHING_CONTAINERS_WAIT); // The completed container will be saved in case of lost heartbeat. Assert.assertEquals(1, nodeStatusUpdater.getContainerStatuses().size()); Assert.assertEquals(1, nodeStatusUpdater.getContainerStatuses().size()); nm.getNMContext().getContainers().put(cId, anyCompletedContainer); nm.getNMContext().getApplications().remove(appId); // The completed container will be saved in case of lost heartbeat. Assert.assertEquals(1, nodeStatusUpdater.getContainerStatuses().size()); Assert.assertEquals(1, nodeStatusUpdater.getContainerStatuses().size()); }
Example 13
Source File: ContainerManagerImpl.java From big-c with Apache License 2.0 | 4 votes |
public void cleanupContainersOnNMResync() { Map<ContainerId, Container> containers = context.getContainers(); if (containers.isEmpty()) { return; } LOG.info("Containers still running on " + CMgrCompletedContainersEvent.Reason.ON_NODEMANAGER_RESYNC + " : " + containers.keySet()); List<ContainerId> containerIds = new ArrayList<ContainerId>(containers.keySet()); LOG.info("Waiting for containers to be killed"); this.handle(new CMgrCompletedContainersEvent(containerIds, CMgrCompletedContainersEvent.Reason.ON_NODEMANAGER_RESYNC)); /* * We will wait till all the containers change their state to COMPLETE. We * will not remove the container statuses from nm context because these * are used while re-registering node manager with resource manager. */ boolean allContainersCompleted = false; while (!containers.isEmpty() && !allContainersCompleted) { allContainersCompleted = true; for (Entry<ContainerId, Container> container : containers.entrySet()) { if (((ContainerImpl) container.getValue()).getCurrentState() != ContainerState.COMPLETE) { allContainersCompleted = false; try { Thread.sleep(1000); } catch (InterruptedException ex) { LOG.warn("Interrupted while sleeping on container kill on resync", ex); } break; } } } // All containers killed if (allContainersCompleted) { LOG.info("All containers in DONE state"); } else { LOG.info("Done waiting for containers to be killed. Still alive: " + containers.keySet()); } }
Example 14
Source File: TestNodeStatusUpdater.java From big-c with Apache License 2.0 | 4 votes |
@Test(timeout = 90000) public void testRemovePreviousCompletedContainersFromContext() throws Exception { NodeManager nm = new NodeManager(); YarnConfiguration conf = new YarnConfiguration(); conf.set( NodeStatusUpdaterImpl .YARN_NODEMANAGER_DURATION_TO_TRACK_STOPPED_CONTAINERS, "10000"); nm.init(conf); NodeStatusUpdaterImpl nodeStatusUpdater = (NodeStatusUpdaterImpl) nm.getNodeStatusUpdater(); ApplicationId appId = ApplicationId.newInstance(0, 0); ApplicationAttemptId appAttemptId = ApplicationAttemptId.newInstance(appId, 0); ContainerId cId = ContainerId.newContainerId(appAttemptId, 1); Token containerToken = BuilderUtils.newContainerToken(cId, "anyHost", 1234, "anyUser", BuilderUtils.newResource(1024, 1), 0, 123, "password".getBytes(), 0); Container anyCompletedContainer = new ContainerImpl(null, conf, null, null, null, null, null, BuilderUtils.newContainerTokenIdentifier(containerToken), null, heartBeatID, null, triggered, null) { @Override public ContainerState getCurrentState() { return ContainerState.COMPLETE; } @Override public org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerState getContainerState() { return org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerState.DONE; } }; ContainerId runningContainerId = ContainerId.newContainerId(appAttemptId, 3); Token runningContainerToken = BuilderUtils.newContainerToken(runningContainerId, "anyHost", 1234, "anyUser", BuilderUtils.newResource(1024, 1), 0, 123, "password".getBytes(), 0); Container runningContainer = new ContainerImpl(null, conf, null, null, null, null, null, BuilderUtils.newContainerTokenIdentifier(runningContainerToken), null, heartBeatID, null, triggered, null) { @Override public ContainerState getCurrentState() { return ContainerState.RUNNING; } @Override public org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerState getContainerState() { return org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerState.RUNNING; } }; nm.getNMContext().getApplications().putIfAbsent(appId, mock(Application.class)); nm.getNMContext().getContainers().put(cId, anyCompletedContainer); nm.getNMContext().getContainers() .put(runningContainerId, runningContainer); Assert.assertEquals(2, nodeStatusUpdater.getContainerStatuses().size()); List<ContainerId> ackedContainers = new ArrayList<ContainerId>(); ackedContainers.add(cId); ackedContainers.add(runningContainerId); nodeStatusUpdater.removeOrTrackCompletedContainersFromContext(ackedContainers); Set<ContainerId> containerIdSet = new HashSet<ContainerId>(); List<ContainerStatus> containerStatuses = nodeStatusUpdater.getContainerStatuses(); for (ContainerStatus status : containerStatuses) { containerIdSet.add(status.getContainerId()); } Assert.assertEquals(1, containerStatuses.size()); // completed container is removed; Assert.assertFalse(containerIdSet.contains(cId)); // running container is not removed; Assert.assertTrue(containerIdSet.contains(runningContainerId)); }
Example 15
Source File: TestNodeStatusUpdater.java From big-c with Apache License 2.0 | 4 votes |
@Test public void testCleanedupApplicationContainerCleanup() throws IOException { NodeManager nm = new NodeManager(); YarnConfiguration conf = new YarnConfiguration(); conf.set(NodeStatusUpdaterImpl .YARN_NODEMANAGER_DURATION_TO_TRACK_STOPPED_CONTAINERS, "1000000"); nm.init(conf); NodeStatusUpdaterImpl nodeStatusUpdater = (NodeStatusUpdaterImpl) nm.getNodeStatusUpdater(); ApplicationId appId = ApplicationId.newInstance(0, 0); ApplicationAttemptId appAttemptId = ApplicationAttemptId.newInstance(appId, 0); ContainerId cId = ContainerId.newContainerId(appAttemptId, 1); Token containerToken = BuilderUtils.newContainerToken(cId, "anyHost", 1234, "anyUser", BuilderUtils.newResource(1024, 1), 0, 123, "password".getBytes(), 0); Container anyCompletedContainer = new ContainerImpl(null, conf, null, null, null, null, null, BuilderUtils.newContainerTokenIdentifier(containerToken), null, heartBeatID, null, triggered, null) { @Override public ContainerState getCurrentState() { return ContainerState.COMPLETE; } }; Application application = mock(Application.class); when(application.getApplicationState()).thenReturn(ApplicationState.RUNNING); nm.getNMContext().getApplications().putIfAbsent(appId, application); nm.getNMContext().getContainers().put(cId, anyCompletedContainer); Assert.assertEquals(1, nodeStatusUpdater.getContainerStatuses().size()); when(application.getApplicationState()).thenReturn( ApplicationState.FINISHING_CONTAINERS_WAIT); // The completed container will be saved in case of lost heartbeat. Assert.assertEquals(1, nodeStatusUpdater.getContainerStatuses().size()); Assert.assertEquals(1, nodeStatusUpdater.getContainerStatuses().size()); nm.getNMContext().getContainers().put(cId, anyCompletedContainer); nm.getNMContext().getApplications().remove(appId); // The completed container will be saved in case of lost heartbeat. Assert.assertEquals(1, nodeStatusUpdater.getContainerStatuses().size()); Assert.assertEquals(1, nodeStatusUpdater.getContainerStatuses().size()); }
Example 16
Source File: YarnResourceManagerTest.java From flink with Apache License 2.0 | 4 votes |
ContainerStatus createTestingContainerStatus(final ContainerId containerId) { return new TestingContainerStatus(containerId, ContainerState.COMPLETE, "Test exit", -1); }