package com.hubspot.singularity.mesos; import java.util.List; import org.junit.Assert; import org.junit.Test; import com.google.common.base.Optional; import com.google.inject.Inject; import com.hubspot.singularity.RequestType; import com.hubspot.singularity.SingularityPendingRequest; import com.hubspot.singularity.SingularityPendingRequest.PendingType; import com.hubspot.singularity.SingularityPendingTask; import com.hubspot.singularity.SingularityRequestBuilder; import com.hubspot.singularity.SingularityTask; import com.hubspot.singularity.scheduler.SingularitySchedulerTestBase; public class SingularityStartupTest extends SingularitySchedulerTestBase { public SingularityStartupTest() { super(false); } @Inject private SingularityStartup startup; @Test public void testFailuresInLaunchPath() { initRequest(); initFirstDeploy(); SingularityTask task = prepTask(); taskManager.createTaskAndDeletePendingTask(task); resourceOffers(); Assert.assertTrue(taskManager.getActiveTaskIds().size() == 1); startup.checkSchedulerForInconsistentState(); resourceOffers(); Assert.assertTrue(taskManager.getActiveTaskIds().size() == 1); taskManager.deleteActiveTask(task.getTaskId().getId()); resourceOffers(); Assert.assertTrue(taskManager.getActiveTaskIds().size() == 0); startup.checkSchedulerForInconsistentState(); resourceOffers(); Assert.assertTrue(taskManager.getActiveTaskIds().size() == 1); } @Test public void testScheduledTasksDontGetRescheduled() { initScheduledRequest(); deploy(firstDeployId); deployChecker.checkDeploys(); Assert.assertTrue(requestManager.getPendingRequests().size() == 1); Assert.assertTrue(taskManager.getPendingTaskIds().isEmpty()); startup.checkSchedulerForInconsistentState(); Assert.assertTrue(requestManager.getPendingRequests().size() == 1); Assert.assertTrue(requestManager.getPendingRequests().get(0).getPendingType() == PendingType.NEW_DEPLOY); Assert.assertTrue(taskManager.getPendingTaskIds().isEmpty()); scheduler.drainPendingQueue(stateCacheProvider.get()); Assert.assertTrue(requestManager.getPendingRequests().isEmpty()); List<SingularityPendingTask> pending = taskManager.getPendingTasks(); Assert.assertTrue(taskManager.getPendingTaskIds().size() == 1); startup.checkSchedulerForInconsistentState(); scheduler.drainPendingQueue(stateCacheProvider.get()); Assert.assertTrue(requestManager.getPendingRequests().isEmpty()); Assert.assertTrue(taskManager.getPendingTaskIds().size() == 1); Assert.assertTrue(taskManager.getActiveTaskIds().isEmpty()); Assert.assertTrue(pending.equals(taskManager.getPendingTasks())); taskManager.deletePendingTask(pending.get(0).getPendingTaskId()); startup.checkSchedulerForInconsistentState(); Assert.assertTrue(requestManager.getPendingRequests().size() == 1); Assert.assertTrue(taskManager.getPendingTaskIds().isEmpty()); } @Test public void testScheduledTasksDontGetRescheduledDuringRun() { initScheduledRequest(); initFirstDeploy(); startTask(firstDeploy); startup.checkSchedulerForInconsistentState(); scheduler.drainPendingQueue(stateCacheProvider.get()); Assert.assertTrue(taskManager.getPendingTaskIds().isEmpty()); Assert.assertTrue(requestManager.getPendingRequests().isEmpty()); boolean caughtException = false; try { requestResource.scheduleImmediately(requestId); } catch (Exception e) { caughtException = true; } Assert.assertTrue(caughtException); Assert.assertTrue(taskManager.getPendingTaskIds().isEmpty()); Assert.assertTrue(requestManager.getPendingRequests().isEmpty()); } @Test public void testOnDemandDoesntGetRescheduled() { saveRequest(new SingularityRequestBuilder(requestId, RequestType.ON_DEMAND).build()); deploy(firstDeployId); deployChecker.checkDeploys(); Assert.assertTrue(requestManager.getPendingRequests().isEmpty()); Assert.assertTrue(taskManager.getPendingTaskIds().isEmpty()); startup.checkSchedulerForInconsistentState(); Assert.assertTrue(requestManager.getPendingRequests().isEmpty()); Assert.assertTrue(taskManager.getPendingTaskIds().isEmpty()); requestManager.addToPendingQueue(new SingularityPendingRequest(requestId, firstDeployId, System.currentTimeMillis(), Optional.<String> absent(), PendingType.ONEOFF, Optional.<Boolean> absent(), Optional.<String> absent())); startup.checkSchedulerForInconsistentState(); Assert.assertTrue(requestManager.getPendingRequests().get(0).getPendingType() == PendingType.ONEOFF); } @Test public void testRunOnceDoesntGetRescheduled() { saveRequest(new SingularityRequestBuilder(requestId, RequestType.RUN_ONCE).build()); deploy(firstDeployId); deployChecker.checkDeploys(); scheduler.drainPendingQueue(stateCacheProvider.get()); resourceOffers(); Assert.assertTrue(requestManager.getPendingRequests().isEmpty()); Assert.assertTrue(taskManager.getPendingTaskIds().isEmpty()); startup.checkSchedulerForInconsistentState(); // assert that SingularityStartup does not enqueue a SingularityPendingRequest (pendingType=STARTUP) for the RUN_ONCE request Assert.assertTrue(requestManager.getPendingRequests().isEmpty()); } }