private void submitScaleRequest(SingularityRequestWithState oldRequestWithState, Integer newRequestedInstances) { SingularityRequest oldRequest = oldRequestWithState.getRequest(); SingularityRequest newRequest = oldRequest.toBuilder().setInstances(Optional.of((newRequestedInstances))).build(); Optional<SingularityRequestHistory.RequestHistoryType> historyType = Optional.of(SingularityRequestHistory.RequestHistoryType.SCALED); Optional<String> message = Optional.of(String.format("Auto scale number of instances to spread to all %d available slaves", newRequestedInstances)); requestHelper.updateRequest(newRequest, Optional.of(oldRequest), oldRequestWithState.getState(), historyType, Optional.<String>absent(), oldRequest.getSkipHealthchecks(), message, Optional.<SingularityBounceRequest>absent()); }
@Override protected void handleExpiringObject(SingularityExpiringSkipHealthchecks expiringObject, SingularityRequestWithState requestWithState, String message) { final SingularityRequest oldRequest = requestWithState.getRequest(); final SingularityRequest newRequest = oldRequest.toBuilder().setSkipHealthchecks(expiringObject.getRevertToSkipHealthchecks()).build(); try { requestHelper.updateRequest(newRequest, Optional.of(oldRequest), requestWithState.getState(), Optional.<RequestHistoryType>absent(), expiringObject.getUser(), Optional.<Boolean>absent(), Optional.of(message), Optional.<SingularityBounceRequest>absent()); } catch (WebApplicationException wae) { LOG.error("While trying to apply {} for {}", expiringObject, expiringObject.getRequestId(), wae); } } }
public SingularityRequestParent skipHealthchecks(String requestId, SingularitySkipHealthchecksRequest skipHealthchecksRequest, SingularityUser user) { SingularityRequestWithState oldRequestWithState = fetchRequestWithState(requestId, user); SingularityRequest oldRequest = oldRequestWithState.getRequest(); SingularityRequest newRequest = oldRequest.toBuilder().setSkipHealthchecks(skipHealthchecksRequest.getSkipHealthchecks()).build(); submitRequest(newRequest, Optional.of(oldRequestWithState), Optional.absent(), Optional.absent(), skipHealthchecksRequest.getMessage(), Optional.absent(), user); if (skipHealthchecksRequest.getDurationMillis().isPresent()) { requestManager.saveExpiringObject(new SingularityExpiringSkipHealthchecks(requestId, user.getEmail(), System.currentTimeMillis(), skipHealthchecksRequest, oldRequest.getSkipHealthchecks(), skipHealthchecksRequest.getActionId().or(UUID.randomUUID().toString()))); } return fillEntireRequest(fetchRequestWithState(requestId, user)); }
private SingularityRequestParent updateAuthorizedGroups(SingularityUser user, String requestId, SingularityUpdateGroupsRequest updateGroupsRequest) { SingularityRequestWithState oldRequestWithState = fetchRequestWithState(requestId, user); authorizationHelper.checkForAuthorization(oldRequestWithState.getRequest(), user, SingularityAuthorizationScope.WRITE); SingularityRequest newRequest = oldRequestWithState.getRequest().toBuilder() .setGroup(updateGroupsRequest.getGroup()) .setReadWriteGroups(Optional.of(updateGroupsRequest.getReadWriteGroups())) .setReadOnlyGroups(Optional.of(updateGroupsRequest.getReadOnlyGroups())) .build(); submitRequest(newRequest, Optional.of(oldRequestWithState), Optional.of(RequestHistoryType.UPDATED), Optional.absent(), updateGroupsRequest.getMessage(), Optional.absent(), user); return fillEntireRequest(fetchRequestWithState(requestId, user)); }
@Test public void testReservedSlaveAttribute() { Map<String, List<String>> reservedAttributes = new HashMap<>(); reservedAttributes.put("reservedKey", Arrays.asList("reservedValue1")); configuration.setReserveSlavesWithAttributes(reservedAttributes); initRequest(); initFirstDeploy(); saveAndSchedule(request.toBuilder().setInstances(Optional.of(1))); sms.resourceOffers(Arrays.asList(createOffer(20, 20000, 50000, "slave1", "host1", Optional.<String>absent(), ImmutableMap.of("reservedKey", "reservedValue1")))); Assert.assertTrue(taskManager.getActiveTaskIds().size() == 0); sms.resourceOffers(Arrays.asList(createOffer(20, 20000, 50000, "slave2", "host2", Optional.<String>absent(), ImmutableMap.of("reservedKey", "notAReservedValue")))); Assert.assertTrue(taskManager.getActiveTaskIds().size() == 1); }
@Test public void testRequiredSlaveAttributesForRequest() { Map<String, String> requiredAttributes = new HashMap<>(); requiredAttributes.put("requiredKey", "requiredValue1"); initRequest(); initFirstDeploy(); saveAndSchedule(request.toBuilder().setInstances(Optional.of(1)).setRequiredSlaveAttributes(Optional.of(requiredAttributes))); sms.resourceOffers(Arrays.asList(createOffer(20, 20000, 50000, "slave1", "host1", Optional.<String>absent(), ImmutableMap.of("requiredKey", "notTheRightValue")))); sms.resourceOffers(Arrays.asList(createOffer(20, 20000, 50000, "slave2", "host2", Optional.<String>absent(), ImmutableMap.of("notTheRightKey", "requiredValue1")))); Assert.assertTrue(taskManager.getActiveTaskIds().size() == 0); sms.resourceOffers(Arrays.asList(createOffer(20, 20000, 50000, "slave2", "host2", Optional.<String>absent(), requiredAttributes))); Assert.assertTrue(taskManager.getActiveTaskIds().size() == 1); }
@Test public void testMultipleRequiredAttributes() { Map<String, String> requiredAttributes = new HashMap<>(); requiredAttributes.put("requiredKey1", "requiredValue1"); requiredAttributes.put("requiredKey2", "requiredValue2"); initRequest(); initFirstDeploy(); saveAndSchedule(request.toBuilder().setInstances(Optional.of(1)).setRequiredSlaveAttributes(Optional.of(requiredAttributes))); sms.resourceOffers(Arrays.asList(createOffer(20, 20000, 50000, "slave1", "host1", Optional.<String>absent(), ImmutableMap.of("requiredKey1", "requiredValue1")))); sms.resourceOffers(Arrays.asList(createOffer(20, 20000, 50000, "slave2", "host2", Optional.<String>absent(), ImmutableMap.of("requiredKey1", "requiredValue1", "someotherkey", "someothervalue")))); Assert.assertTrue(taskManager.getActiveTaskIds().size() == 0); sms.resourceOffers(Arrays.asList(createOffer(20, 20000, 50000, "slave2", "host2", Optional.<String>absent(), requiredAttributes))); Assert.assertTrue(taskManager.getActiveTaskIds().size() == 1); }
@Test public void testReservedSlaveWithMatchinRequestAttribute() { Map<String, List<String>> reservedAttributes = new HashMap<>(); reservedAttributes.put("reservedKey", Arrays.asList("reservedValue1")); configuration.setReserveSlavesWithAttributes(reservedAttributes); Map<String, String> reservedAttributesMap = ImmutableMap.of("reservedKey", "reservedValue1"); initRequest(); initFirstDeploy(); saveAndSchedule(request.toBuilder().setInstances(Optional.of(1))); sms.resourceOffers(Arrays.asList(createOffer(20, 20000, 50000, "slave1", "host1", Optional.<String>absent(), reservedAttributesMap))); Assert.assertTrue(taskManager.getActiveTaskIds().size() == 0); saveAndSchedule(request.toBuilder().setInstances(Optional.of(1)).setRequiredSlaveAttributes(Optional.of(reservedAttributesMap))); sms.resourceOffers(Arrays.asList(createOffer(20, 20000, 50000, "slave1", "host1", Optional.<String>absent(), ImmutableMap.of("reservedKey", "reservedValue1")))); Assert.assertTrue(taskManager.getActiveTaskIds().size() == 1); }
@Test public void testSlavePlacementGreedy() { initRequest(); initFirstDeploy(); saveAndSchedule(request.toBuilder().setInstances(Optional.of(3)).setSlavePlacement(Optional.of(SlavePlacement.GREEDY))); sms.resourceOffers(Arrays.asList(createOffer(20, 20000, 50000, "slave1", "host1"))); Assert.assertTrue(taskManager.getActiveTaskIds().size() == 3); }
@Test public void testSchedulerRandomizesOffers() { initRequest(); initFirstDeploy(); requestResource.postRequest(request.toBuilder().setInstances(Optional.of(15)).build(), singularityUser); scheduler.drainPendingQueue(); sms.resourceOffers(Arrays.asList(createOffer(20, 1024, 20000), createOffer(20, 1024, 20000))); Assert.assertEquals(15, taskManager.getActiveTaskIds().size()); Set<String> offerIds = Sets.newHashSet(); for (SingularityTask activeTask : taskManager.getActiveTasks()) { offerIds.addAll(activeTask.getOffers().stream().map((o) -> o.getId().getValue()).collect(Collectors.toList())); } Assert.assertEquals(2, offerIds.size()); }
@Test public void itDoesntFlagPendingRequestsForUnderOrOverProvisioning() { initRequest(); initFirstDeploy(); SingularityRequest request = requestResource.getRequest(requestId, singularityUser).getRequest(); requestManager.activate(request.toBuilder().setInstances(Optional.of(0)).build(), RequestHistoryType.UPDATED, System.currentTimeMillis(), Optional.<String> absent(), Optional.<String> absent()); requestManager.addToPendingQueue(new SingularityPendingRequest(request.getId(), firstDeployId, System.currentTimeMillis(), Optional.<String> absent(), PendingType.ONEOFF, Optional.<Boolean> absent(), Optional.<String> absent())); Assert.assertEquals(0, taskManager.getActiveTaskIds().size()); SingularityState state = stateManager.getState(true, false); Assert.assertEquals(0, state.getOverProvisionedRequests()); Assert.assertEquals(0, state.getUnderProvisionedRequests()); } }
@Test(expected = WebApplicationException.class) public void testCannotUpdateRequestDuringPendingDeployWithNewData() { initRequest(); SingularityRequest request = requestResource.getRequest(requestId, singularityUser).getRequest(); SingularityRequest newRequest = request.toBuilder().setInstances(Optional.of(1)).build(); String deployId = "test_new_request_data"; SingularityDeploy deploy = new SingularityDeployBuilder(request.getId(), deployId).setCommand(Optional.of("sleep 100")).build(); deployResource.deploy(new SingularityDeployRequest(deploy, Optional.absent(), Optional.absent(), Optional.of(newRequest)), singularityUser); requestResource.postRequest(newRequest, singularityUser); }
@Test public void testFrozenSlaveDoesntLaunchTasks() { initRequest(); initFirstDeploy(); resourceOffers(); Assert.assertEquals(StateChangeResult.SUCCESS, slaveManager.changeState("slave1", MachineState.FROZEN, Optional.absent(), Optional.of("user1"))); saveAndSchedule(request.toBuilder().setInstances(Optional.of(2))); resourceOffers(); Assert.assertEquals(0, taskManager.getTasksOnSlave(taskManager.getActiveTaskIds(), slaveManager.getObject("slave1").get()).size()); Assert.assertEquals(2, taskManager.getTasksOnSlave(taskManager.getActiveTaskIds(), slaveManager.getObject("slave2").get()).size()); }
@Test public void testSchedulerCanBatchOnOffers() { initRequest(); initFirstDeploy(); requestResource.postRequest(request.toBuilder().setInstances(Optional.of(3)).build(), singularityUser); scheduler.drainPendingQueue(); List<Offer> oneOffer = Arrays.asList(createOffer(12, 1024, 5000)); sms.resourceOffers(oneOffer); Assert.assertTrue(taskManager.getActiveTasks().size() == 3); Assert.assertTrue(taskManager.getPendingTaskIds().isEmpty()); Assert.assertTrue(requestManager.getPendingRequests().isEmpty()); }
@Test public void testUnfrozenSlaveLaunchesTasks() { initRequest(); initFirstDeploy(); resourceOffers(); Assert.assertEquals(StateChangeResult.SUCCESS, slaveManager.changeState("slave1", MachineState.FROZEN, Optional.absent(), Optional.of("user1"))); saveAndSchedule(request.toBuilder().setInstances(Optional.of(2)).setSlavePlacement(Optional.of(SlavePlacement.SEPARATE))); resourceOffers(); Assert.assertEquals(0, taskManager.getTasksOnSlave(taskManager.getActiveTaskIds(), slaveManager.getObject("slave1").get()).size()); Assert.assertEquals(1, taskManager.getTasksOnSlave(taskManager.getActiveTaskIds(), slaveManager.getObject("slave2").get()).size()); Assert.assertEquals(StateChangeResult.SUCCESS, slaveManager.changeState("slave1", MachineState.ACTIVE, Optional.absent(), Optional.of("user1"))); resourceOffers(); Assert.assertEquals(1, taskManager.getTasksOnSlave(taskManager.getActiveTaskIds(), slaveManager.getObject("slave1").get()).size()); Assert.assertEquals(1, taskManager.getTasksOnSlave(taskManager.getActiveTaskIds(), slaveManager.getObject("slave2").get()).size()); }
@Test public void testSchedulerExhaustsOffers() { initRequest(); initFirstDeploy(); requestResource.postRequest(request.toBuilder().setInstances(Optional.of(10)).build(), singularityUser); scheduler.drainPendingQueue(); sms.resourceOffers(Arrays.asList(createOffer(2, 1024, 2048), createOffer(1, 1024, 2048))); Assert.assertEquals(3, taskManager.getActiveTaskIds().size()); Assert.assertEquals(7, taskManager.getPendingTaskIds().size()); }
@Test public void testFinishedRequestCanBeDeployed() { initScheduledRequest(); initFirstDeploy(); schedule = "*/1 * * * * ? 1995"; // cause it to be pending requestResource.postRequest(request.toBuilder().setQuartzSchedule(Optional.of(schedule)).build(), singularityUser); scheduler.drainPendingQueue(); Assert.assertTrue(requestResource.getActiveRequests(singularityUser, false, false, false, 10, Collections.emptyList()).isEmpty()); Assert.assertTrue(requestManager.getRequest(requestId).get().getState() == RequestState.FINISHED); SingularityDeployBuilder db = new SingularityDeployBuilder(requestId, secondDeployId); initDeploy(db, System.currentTimeMillis()); deployChecker.checkDeploys(); Assert.assertEquals(RequestState.ACTIVE, requestManager.getRequest(requestId).get().getState()); Assert.assertEquals(1, requestManager.getPendingRequests().size()); }
@Test public void testOfferCache() { configuration.setCacheOffers(true); configuration.setOfferCacheSize(2); List<Offer> offers2 = resourceOffers(); sms.rescind(offers2.get(0).getId()); initRequest(); initFirstDeploy(); requestResource.postRequest(request.toBuilder().setSlavePlacement(Optional.of(SlavePlacement.SEPARATE)).setInstances(Optional.of(2)).build(), singularityUser); schedulerPoller.runActionOnPoll(); Assert.assertEquals(1, taskManager.getActiveTasks().size()); resourceOffers(); Assert.assertEquals(2, taskManager.getActiveTasks().size()); }
@Test public void testMaxTasksPerOffer() { configuration.setMaxTasksPerOffer(3); initRequest(); initFirstDeploy(); requestResource.postRequest(request.toBuilder().setInstances(Optional.of(20)).build(), singularityUser); scheduler.drainPendingQueue(); sms.resourceOffers(Arrays.asList(createOffer(36, 12024, 50000))); Assert.assertTrue(taskManager.getActiveTasks().size() == 3); sms.resourceOffers(Arrays.asList(createOffer(20, 20000, 50000, "slave1", "host1"), createOffer(20, 20000, 50000, "slave2", "host2"))); Assert.assertTrue(taskManager.getActiveTasks().size() == 9); configuration.setMaxTasksPerOffer(0); resourceOffers(); Assert.assertTrue(taskManager.getActiveTasks().size() == 20); }
@Test public void testCleanupsCreatedOnScaleDown() { initRequest(); SingularityRequestBuilder bldr = request.toBuilder(); bldr.setInstances(Optional.of(2)); requestResource.postRequest(bldr.build(), singularityUser); initFirstDeploy(); SingularityTask firstTask = launchTask(request, firstDeploy, 1, TaskState.TASK_RUNNING); SingularityTask secondTask = launchTask(request, firstDeploy, 2, TaskState.TASK_RUNNING); Assert.assertEquals(0, taskManager.getNumCleanupTasks()); bldr.setInstances(Optional.of(1)); requestResource.postRequest(bldr.build(), singularityUser); Assert.assertEquals(1, taskManager.getNumCleanupTasks()); Assert.assertEquals(taskManager.getCleanupTaskIds().get(0), secondTask.getTaskId()); } }