@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); }
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(expected = WebApplicationException.class) public void whenRunNowItForbidsMoreInstancesForOnDemandThanInRequest() { String deployID = "deploy"; Optional<String> userEmail = Optional.absent(); SingularityRequest request = new SingularityRequestBuilder("request2", RequestType.ON_DEMAND) .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 testQueueMultipleOneOffs() { SingularityRequestBuilder bldr = new SingularityRequestBuilder(requestId, RequestType.ON_DEMAND); requestResource.postRequest(bldr.build(), singularityUser); deploy("on_demand_deploy"); deployChecker.checkDeploys(); requestManager.addToPendingQueue(new SingularityPendingRequest(requestId, "on_demand_deploy", System.currentTimeMillis(), Optional.<String>absent(), PendingType.ONEOFF, Optional.<List<String>>absent(), Optional.<String>absent(), Optional.<Boolean>absent(), Optional.<String>absent(), Optional.<String>absent())); requestManager.addToPendingQueue(new SingularityPendingRequest(requestId, "on_demand_deploy", System.currentTimeMillis(), Optional.<String>absent(), PendingType.ONEOFF, Optional.<List<String>>absent(), Optional.<String>absent(), Optional.<Boolean>absent(), Optional.<String>absent(), Optional.<String>absent())); scheduler.drainPendingQueue(); Assert.assertEquals(2, taskManager.getPendingTaskIds().size()); }
@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()); }
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 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()); }
@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()); }
@Test(expected = WebApplicationException.class) public void testInvalidQuartzTimeZoneErrors() { SingularityRequest req = new SingularityRequestBuilder(requestId, RequestType.SCHEDULED) .setQuartzSchedule(Optional.of("*/1 * * * * ? 2020")) .setScheduleType(Optional.of(ScheduleType.QUARTZ)) .setScheduleTimeZone(Optional.of("invalid_timezone")) .build(); requestResource.postRequest(req, singularityUser); }
protected SingularityRequest createRequest(String requestId) { SingularityRequestBuilder bldr = new SingularityRequestBuilder(requestId, RequestType.SERVICE); bldr.setInstances(Optional.of(5)); bldr.setSlavePlacement(Optional.of(SlavePlacement.SEPARATE)); SingularityRequest request = bldr.build(); saveRequest(bldr.build()); return request; }
@Test(expected = WebApplicationException.class) public void whenDeployNotOneOffOrScheduledItForbidsRunImmediately() { String requestId = "request"; String deployID = "deploy"; SingularityRequest request = new SingularityRequestBuilder(requestId, RequestType.WORKER) .build(); Optional<SingularityRunNowRequest> runNowRequest = Optional.of(runNowRequest()); SingularityDeploy deploy = SingularityDeploy.newBuilder(requestId, deployID) .setCommand(Optional.of("printenv")) .setRunImmediately(runNowRequest) .build(); validator.checkDeploy(request, deploy, Collections.emptyList(), Collections.emptyList()); }
@Test(expected = WebApplicationException.class) public void itForbidsTooLongDeployId() { String requestId = "requestId"; SingularityRequest request = new SingularityRequestBuilder(requestId, RequestType.SCHEDULED) .build(); SingularityDeploy deploy = SingularityDeploy.newBuilder(requestId, tooLongId()) .build(); validator.checkDeploy(request, deploy, 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 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()); }