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)); }
@Test(expected = WebApplicationException.class) public void itDoesNotAllowOtherRequestTypesToChange() { SingularityRequest request = new SingularityRequestBuilder("test", RequestType.ON_DEMAND) .build(); SingularityRequest newRequest = new SingularityRequestBuilder("test", RequestType.SCHEDULED) .build(); validator.checkSingularityRequest(newRequest, Optional.of(request), Optional.absent(), Optional.absent()); } }
@Test(expected = WebApplicationException.class) public void whenRunNowItForbidsRequestsForLongRunningTasks() { String deployID = "deploy"; Optional<String> userEmail = Optional.absent(); SingularityRequest request = new SingularityRequestBuilder("request2", RequestType.SERVICE) .build(); Optional<SingularityRunNowRequest> runNowRequest = Optional.absent(); List<SingularityTaskId> activeTasks = Collections.emptyList(); List<SingularityPendingTaskId> pendingTasks = Collections.emptyList(); validator.checkRunNowRequest(deployID, userEmail, request, runNowRequest, activeTasks, pendingTasks); }
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)); }
protected SingularityRequest buildRequest(String requestId) { SingularityRequest request = new SingularityRequestBuilder(requestId, RequestType.WORKER).build(); saveRequest(request); return request; }
@Test(expected = WebApplicationException.class) public void itForbidsRunNowOfScheduledWhenAlreadyRunning() { String deployID = "deploy"; Optional<String> userEmail = Optional.absent(); SingularityRequest request = new SingularityRequestBuilder("request2", RequestType.SCHEDULED) .setInstances(Optional.of(1)) .build(); Optional<SingularityRunNowRequest> runNowRequest = Optional.absent(); List<SingularityTaskId> activeTasks = Collections.singletonList(activeTask()); List<SingularityPendingTaskId> pendingTasks = Collections.emptyList(); validator.checkRunNowRequest(deployID, userEmail, request, runNowRequest, activeTasks, pendingTasks); }
@Test public void itForbidsQuotesInDeployIds() throws Exception { final String badDeployId = "deployKey'"; SingularityDeploy singularityDeploy = SingularityDeploy.newBuilder(badDeployId, badDeployId).build(); SingularityRequest singularityRequest = new SingularityRequestBuilder(badDeployId, RequestType.SERVICE).build(); WebApplicationException exn = (WebApplicationException) catchThrowable(() -> validator.checkDeploy(singularityRequest, singularityDeploy, Collections.emptyList(), Collections.emptyList())); assertThat((String) exn.getResponse().getEntity()) .contains("[a-zA-Z0-9_.]"); }
@Test public void whenRunNowIfRunIdSetItWillBePropagated() { String deployID = "deploy"; Optional<String> userEmail = Optional.absent(); SingularityRequest request = new SingularityRequestBuilder("request2", RequestType.ON_DEMAND) .build(); Optional<SingularityRunNowRequest> runNowRequest = Optional.of(runNowRequest("runId")); List<SingularityTaskId> activeTasks = Collections.emptyList(); List<SingularityPendingTaskId> pendingTasks = Collections.emptyList(); SingularityPendingRequest pendingRequest = validator.checkRunNowRequest(deployID, userEmail, request, runNowRequest, activeTasks, pendingTasks); Assert.assertEquals("runId", pendingRequest.getRunId().get()); }
@Test public void itAllowsWorkerToServiceTransitionIfNotLoadBalanced() { SingularityRequest request = new SingularityRequestBuilder("test", RequestType.WORKER) .build(); SingularityRequest newRequest = new SingularityRequestBuilder("test", RequestType.SERVICE) .build(); SingularityRequest result = validator.checkSingularityRequest(newRequest, Optional.of(request), Optional.absent(), Optional.absent()); Assert.assertEquals(newRequest.getRequestType(), result.getRequestType()); }
@Test public void whenRunNowIfNoRunIdSetItWillGenerateAnId() { String deployID = "deploy"; Optional<String> userEmail = Optional.absent(); SingularityRequest request = new SingularityRequestBuilder("request2", RequestType.ON_DEMAND) .build(); Optional<SingularityRunNowRequest> runNowRequest = Optional.of(runNowRequest()); List<SingularityTaskId> activeTasks = Collections.emptyList(); List<SingularityPendingTaskId> pendingTasks = Collections.emptyList(); SingularityPendingRequest pendingRequest = validator.checkRunNowRequest(deployID, userEmail, request, runNowRequest, activeTasks, pendingTasks); Assert.assertTrue(pendingRequest.getRunId().isPresent()); }
protected void initRequestWithType(RequestType requestType, boolean isLoadBalanced) { SingularityRequestBuilder bldr = new SingularityRequestBuilder(requestId, requestType); bldr.setLoadBalanced(Optional.of(isLoadBalanced)); if (requestType == RequestType.SCHEDULED) { bldr.setQuartzSchedule(Optional.of(schedule)); } request = bldr.build(); saveRequest(request); }
@Test(expected = WebApplicationException.class) public void itForbidsBracketCharactersInDeployIds() throws Exception { final String badDeployId = "deployKey[["; SingularityDeploy singularityDeploy = SingularityDeploy.newBuilder(badDeployId, badDeployId).build(); SingularityRequest singularityRequest = new SingularityRequestBuilder(badDeployId, RequestType.SERVICE).build(); validator.checkDeploy(singularityRequest, singularityDeploy, Collections.emptyList(), Collections.emptyList()); }
protected SingularityRequest startAndDeploySecondRequest() { SingularityRequest request = new SingularityRequestBuilder(requestId + "2", RequestType.SERVICE).build(); saveRequest(request); SingularityDeploy deploy = new SingularityDeployBuilder(request.getId(), "d1").setCommand(Optional.of("sleep 1")).build(); deployResource.deploy(new SingularityDeployRequest(deploy, Optional.absent(), Optional.absent()), singularityUser); return request; }
@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 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 testRunOnceDontMoveDuringDecomission() { SingularityRequestBuilder bldr = new SingularityRequestBuilder(requestId, RequestType.RUN_ONCE); request = bldr.build(); saveRequest(request); deployResource.deploy(new SingularityDeployRequest(new SingularityDeployBuilder(requestId, "d1").setCommand(Optional.of("cmd")).build(), Optional.absent(), Optional.absent()), singularityUser); scheduler.drainPendingQueue(); deployChecker.checkDeploys(); validateTaskDoesntMoveDuringDecommission(); }
@Test public void testOneOffsDontMoveDuringDecomission() { SingularityRequestBuilder bldr = new SingularityRequestBuilder(requestId, RequestType.ON_DEMAND); requestResource.postRequest(bldr.build(), singularityUser); deploy("d2"); requestResource.scheduleImmediately(singularityUser, requestId, ((SingularityRunNowRequest) null)); validateTaskDoesntMoveDuringDecommission(); }
@Test public void testShellCommand() { final SingularityRequest request = new SingularityRequestBuilder("test", RequestType.WORKER).build(); final SingularityDeploy deploy = new SingularityDeployBuilder("test", "1") .setCommand(Optional.of("/bin/echo hi")) .build(); final SingularityTaskRequest taskRequest = new SingularityTaskRequest(request, deploy, pendingTask); final SingularityMesosTaskHolder task = builder.buildTask(offerHolder, null, taskRequest, taskResources, executorResources); assertEquals("/bin/echo hi", task.getMesosTask().getCommand().getValue()); assertEquals(0, task.getMesosTask().getCommand().getArgumentsCount()); assertTrue(task.getMesosTask().getCommand().getShell()); }