package com.hubspot.singularity.scheduler;
import org.apache.mesos.Protos.TaskState;
import org.junit.Assert;
import org.junit.Test;
import com.google.common.base.Optional;
import com.hubspot.singularity.RequestState;
import com.hubspot.singularity.SingularityShellCommand;
import com.hubspot.singularity.SingularityTask;
import com.hubspot.singularity.api.SingularityBounceRequest;
import com.hubspot.singularity.api.SingularityPauseRequest;
import com.hubspot.singularity.api.SingularityScaleRequest;
import com.hubspot.singularity.api.SingularitySkipHealthchecksRequest;
public class SingularityExpiringActionsTest extends SingularitySchedulerTestBase {
public SingularityExpiringActionsTest() {
super(false);
}
@Test
public void testExpiringPause() {
initRequest();
initFirstDeploy();
SingularityTask taskOne = startTask(firstDeploy);
requestResource.pause(requestId, Optional.of(new SingularityPauseRequest(Optional.<Boolean> absent(), Optional.of(1L), Optional.<String> absent(), Optional.<String>absent(), Optional.<SingularityShellCommand>absent())));
cleaner.drainCleanupQueue();
Assert.assertEquals(1, taskManager.getKilledTaskIdRecords().size());
statusUpdate(taskOne, TaskState.TASK_KILLED);
resourceOffers();
Assert.assertEquals(0, taskManager.getActiveTaskIds().size());
Assert.assertEquals(0, taskManager.getPendingTasks().size());
Assert.assertEquals(RequestState.PAUSED, requestManager.getRequest(requestId).get().getState());
Assert.assertEquals(requestId, requestManager.getPausedRequests(false).iterator().next().getRequest().getId());
try {
Thread.sleep(2);
} catch (InterruptedException ie){
}
expiringUserActionPoller.runActionOnPoll();
resourceOffers();
Assert.assertEquals(1, taskManager.getActiveTaskIds().size());
Assert.assertEquals(0, taskManager.getPendingTasks().size());
Assert.assertEquals(RequestState.ACTIVE, requestManager.getRequest(requestId).get().getState());
Assert.assertEquals(requestId, requestManager.getActiveRequests(false).iterator().next().getRequest().getId());
}
@Test
public void testExpiringBounceGoesAway() {
initRequest();
initFirstDeploy();
startTask(firstDeploy, 1);
requestResource.bounce(requestId,
Optional.of(new SingularityBounceRequest(Optional.of(false), Optional.<Boolean> absent(), Optional.of(1L), Optional.<String> absent(), Optional.of("msg"), Optional.<SingularityShellCommand>absent())));
cleaner.drainCleanupQueue();
resourceOffers();
runLaunchedTasks();
cleaner.drainCleanupQueue();
killKilledTasks();
Assert.assertTrue(taskManager.getCleanupTaskIds().isEmpty());
Assert.assertEquals(1, taskManager.getActiveTaskIds().size());
Assert.assertTrue(!requestManager.getExpiringBounce(requestId).isPresent());
}
@Test
public void testExpiringNonIncrementalBounce() {
initWithTasks(3);
requestResource.bounce(requestId,
Optional.of(new SingularityBounceRequest(Optional.<Boolean> absent(), Optional.<Boolean> absent(), Optional.of(1L), Optional.of("aid"), Optional.<String> absent(), Optional.<SingularityShellCommand>absent())));
Assert.assertTrue(!requestManager.getCleanupRequests().get(0).getMessage().isPresent());
Assert.assertEquals("aid", requestManager.getCleanupRequests().get(0).getActionId().get());
// creates cleanup tasks:
cleaner.drainCleanupQueue();
Assert.assertEquals(1, requestManager.getPendingRequests().size());
Assert.assertEquals(0, requestManager.getCleanupRequests().size());
Assert.assertEquals(3, taskManager.getCleanupTaskIds().size());
// should have 1 pending task and 2 launched
resourceOffersByNumTasks(2);
Assert.assertEquals(1, taskManager.getPendingTasks().size());
Assert.assertEquals(5, taskManager.getActiveTaskIds().size());
Assert.assertEquals(3, taskManager.getCleanupTaskIds().size());
Assert.assertEquals(0, requestManager.getPendingRequests().size());
Assert.assertEquals(0, requestManager.getCleanupRequests().size());
try {
Thread.sleep(1);
} catch (InterruptedException ie) {
}
expiringUserActionPoller.runActionOnPoll();
resourceOffers();
cleaner.drainCleanupQueue();
killKilledTasks();
Assert.assertEquals(3, taskManager.getActiveTaskIds().size());
Assert.assertEquals(0, taskManager.getPendingTasks().size());
Assert.assertEquals(0, taskManager.getCleanupTaskIds().size());
Assert.assertEquals(0, requestManager.getPendingRequests().size());
Assert.assertEquals(0, requestManager.getCleanupRequests().size());
}
@Test
public void testExpiringIncrementalBounce() {
initRequest();
requestResource.scale(requestId, new SingularityScaleRequest(Optional.of(3), Optional.<Long> absent(), Optional.<Boolean> absent(), Optional.<String> absent(), Optional.<String>absent(), Optional.<Boolean>absent(), Optional.<Boolean>absent()));
initFirstDeploy();
startTask(firstDeploy, 1);
startTask(firstDeploy, 2);
startTask(firstDeploy, 3);
requestResource.bounce(requestId,
Optional.of(new SingularityBounceRequest(Optional.of(true), Optional.<Boolean> absent(), Optional.of(1L), Optional.<String> absent(), Optional.of("msg"), Optional.<SingularityShellCommand>absent())));
Assert.assertTrue(requestManager.cleanupRequestExists(requestId));
Assert.assertEquals("msg", requestManager.getCleanupRequests().get(0).getMessage().get());
Assert.assertTrue(requestManager.getCleanupRequests().get(0).getActionId().isPresent());
String actionId = requestManager.getCleanupRequests().get(0).getActionId().get();
cleaner.drainCleanupQueue();
Assert.assertTrue(!requestManager.cleanupRequestExists(requestId));
Assert.assertTrue(taskManager.getCleanupTaskIds().size() == 3);
Assert.assertEquals("msg", taskManager.getCleanupTasks().get(0).getMessage().get());
Assert.assertEquals(actionId, taskManager.getCleanupTasks().get(0).getActionId().get());
startTask(firstDeploy, 4);
// launchTask(request, firstDeploy, 5, TaskState.TASK_STARTING);
cleaner.drainCleanupQueue();
Assert.assertEquals(1, taskManager.getKilledTaskIdRecords().size());
Assert.assertEquals(4, taskManager.getActiveTaskIds().size());
try {
Thread.sleep(2);
} catch (InterruptedException ie) {}
expiringUserActionPoller.runActionOnPoll();
cleaner.drainCleanupQueue();
resourceOffers();
killKilledTasks();
Assert.assertTrue(!requestManager.getExpiringBounce(requestId).isPresent());
Assert.assertTrue(requestManager.getPendingRequests().isEmpty());
Assert.assertTrue(taskManager.getPendingTaskIds().isEmpty());
Assert.assertTrue(taskManager.getActiveTaskIds().size() == 3);
Assert.assertTrue(!requestManager.cleanupRequestExists(requestId));
Assert.assertTrue(taskManager.getCleanupTasks().isEmpty());
}
@Test
public void testExpiringScale() {
initRequest();
initFirstDeploy();
requestResource.scale(requestId, new SingularityScaleRequest(Optional.of(5), Optional.of(1L), Optional.<Boolean> absent(), Optional.<String> absent(), Optional.<String>absent(), Optional.<Boolean>absent(), Optional.<Boolean>absent()));
try {
Thread.sleep(2);
} catch (InterruptedException e) {
}
expiringUserActionPoller.runActionOnPoll();
resourceOffers();
resourceOffers();
resourceOffers();
resourceOffers();
Assert.assertEquals(1, taskManager.getNumActiveTasks());
}
@Test
public void testExpiringSkipHealthchecks() {
initRequest();
initHCDeploy();
SingularityTask firstTask = startTask(firstDeploy);
Assert.assertTrue(healthchecker.cancelHealthcheck(firstTask.getTaskId().getId()));
requestResource.skipHealthchecks(requestId, new SingularitySkipHealthchecksRequest(Optional.of(true), Optional.of(1L), Optional.<String> absent(), Optional.<String>absent()));
statusUpdate(firstTask, TaskState.TASK_FAILED);
SingularityTask secondTask = startTask(firstDeploy);
Assert.assertFalse(healthchecker.cancelHealthcheck(secondTask.getTaskId().getId()));
statusUpdate(secondTask, TaskState.TASK_FAILED);
expiringUserActionPoller.runActionOnPoll();
SingularityTask thirdTask = startTask(firstDeploy);
Assert.assertTrue(healthchecker.cancelHealthcheck(thirdTask.getTaskId().getId()));
}
@Test
public void testExpiringScaleWithBounce() {
initRequest();
initFirstDeploy();
requestResource.postRequest(request.toBuilder().setBounceAfterScale(Optional.of(true)).build());
requestResource.scale(requestId, new SingularityScaleRequest(Optional.of(5), Optional.of(1L), Optional.<Boolean> absent(), Optional.<String> absent(), Optional.<String>absent(), Optional.<Boolean>absent(), Optional.<Boolean>absent()));
Assert.assertEquals(1, requestManager.getCleanupRequests().size());
cleaner.drainCleanupQueue();
resourceOffers();
resourceOffers();
resourceOffers();
resourceOffers();
cleaner.drainCleanupQueue();
killKilledTasks();
Assert.assertEquals(5, taskManager.getNumActiveTasks());
try {
Thread.sleep(2);
} catch (InterruptedException e) {
}
expiringUserActionPoller.runActionOnPoll();
Assert.assertEquals(1, requestManager.getCleanupRequests().size());
cleaner.drainCleanupQueue();
Assert.assertEquals(4, taskManager.getKilledTaskIdRecords().size());
launchTask(request, firstDeploy, 1, TaskState.TASK_RUNNING);
cleaner.drainCleanupQueue();
Assert.assertEquals(5, taskManager.getKilledTaskIdRecords().size());
}
}