private SingularityDeploy checkImmediateRunDeploy(SingularityRequest request, SingularityDeploy deploy, SingularityRunNowRequest runNowRequest, List<SingularityTaskId> activeTasks, List<SingularityPendingTaskId> pendingTasks) { if (!request.isScheduled() && !request.isOneOff()) { throw badRequest("Can not request an immediate run of a non-scheduled / always running request (%s)", request); } return deploy.toBuilder() .setRunImmediately(Optional.of(fillRunNowRequest(Optional.of(runNowRequest)))) .build(); }
protected SingularityDeployMarker initSecondDeploy() { secondDeployMarker = new SingularityDeployMarker(requestId, secondDeployId, System.currentTimeMillis(), Optional.<String> absent(), Optional.<String> absent()); secondDeploy = new SingularityDeployBuilder(requestId, secondDeployId).setCommand(Optional.of("sleep 100")).build(); deployManager.saveDeploy(request, secondDeployMarker, secondDeploy); startDeploy(secondDeployMarker, System.currentTimeMillis()); return secondDeployMarker; }
@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_.]"); }
protected SingularityDeploy initDeploy(SingularityDeployBuilder builder, long timestamp) { SingularityDeployMarker marker = new SingularityDeployMarker(requestId, builder.getId(), timestamp, Optional.<String> absent(), Optional.<String> absent()); builder.setCommand(Optional.of("sleep 100")); SingularityDeploy deploy = builder.build(); deployManager.saveDeploy(request, marker, deploy); startDeploy(marker, timestamp); return deploy; }
protected SingularityDeploy initAndFinishDeploy(SingularityRequest request, SingularityDeployBuilder builder, Optional<Resources> maybeResources) { SingularityDeploy deploy = builder.setResources(maybeResources).build(); SingularityDeployMarker marker = new SingularityDeployMarker(deploy.getRequestId(), deploy.getId(), System.currentTimeMillis(), Optional.<String> absent(), Optional.<String> absent()); deployManager.saveDeploy(request, marker, deploy); finishDeploy(marker, deploy); return deploy; }
@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 SingularityDeploy deployRequest(SingularityRequest request, double cpus, double memoryMb) { Resources r = new Resources(cpus, memoryMb, 0); SingularityDeploy deploy = new SingularityDeployBuilder(request.getId(), "deploy1") .setCommand(Optional.of("sleep 1")) .setResources(Optional.of(r)) .build(); deployResource.deploy(new SingularityDeployRequest(deploy, Optional.absent(), Optional.absent()), singularityUser); return deploy; }
protected void deploy(String deployId, Optional<Boolean> unpauseOnDeploy, Optional<Integer> deployRate, Optional<Boolean> autoAdvance, boolean loadBalanced) { SingularityDeployBuilder builder = new SingularityDeployBuilder(requestId, deployId); builder .setCommand(Optional.of("sleep 1")) .setDeployInstanceCountPerStep(deployRate) .setAutoAdvanceDeploySteps(autoAdvance) .setDeployStepWaitTimeMs(Optional.of(0)); if (loadBalanced) { Set<String> groups = new HashSet<>(Arrays.asList("group")); builder .setServiceBasePath(Optional.of("/basepath")) .setLoadBalancerGroups(Optional.of(groups)); } deployResource.deploy(new SingularityDeployRequest(builder.build(), unpauseOnDeploy, Optional.absent()), singularityUser); }
@Test public void itForbidsHealthCheckStartupDelaysLongerThanKillWait() { // Default kill wait time is 10 minutes (600 seconds) HealthcheckOptions healthCheck = new HealthcheckOptionsBuilder("/") .setPortNumber(Optional.of(8080L)) .setStartupDelaySeconds(Optional.of(10000)) .build(); SingularityDeploy deploy = SingularityDeploy .newBuilder("1234567", "1234567") .setHealthcheck(Optional.of(healthCheck)) .build(); SingularityRequest request = new SingularityRequestBuilder("1234567", RequestType.SERVICE).build(); WebApplicationException exn = (WebApplicationException) catchThrowable(() -> validator.checkDeploy(request, deploy, Collections.emptyList(), Collections.emptyList())); assertThat((String) exn.getResponse().getEntity()) .contains("Health check startup delay"); }
@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(expected = WebApplicationException.class) public void whenDeployHasRunNowSetItValidatesThatItIsLessThanACertaionLength() { String requestId = "request"; String deployID = "deploy"; SingularityRequest request = new SingularityRequestBuilder(requestId, RequestType.ON_DEMAND) .build(); Optional<SingularityRunNowRequest> runNowRequest = Optional.of(runNowRequest(tooLongId())); SingularityDeploy deploy = SingularityDeploy.newBuilder(requestId, deployID) .setCommand(Optional.of("printenv")) .setRunImmediately(runNowRequest) .build(); validator.checkDeploy(request, deploy, Collections.emptyList(), Collections.emptyList()); }
@Test public void whenDeployHasRunNowSetAndNotDeployedItWillRunImmediately() { String requestId = "request"; String deployID = "deploy"; SingularityRequest request = new SingularityRequestBuilder(requestId, RequestType.ON_DEMAND) .build(); Optional<SingularityRunNowRequest> runNowRequest = Optional.of(runNowRequest()); SingularityDeploy deploy = SingularityDeploy.newBuilder(requestId, deployID) .setCommand(Optional.of("printenv")) .setRunImmediately(runNowRequest) .build(); SingularityDeploy result = validator.checkDeploy(request, deploy, Collections.emptyList(), Collections.emptyList()); Assert.assertTrue(result.getRunImmediately().isPresent()); Assert.assertTrue(result.getRunImmediately().get().getRunId().isPresent()); }
@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 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 testImmediateRunReplacesScheduledTask() { initScheduledRequest(); SingularityDeploy deploy = SingularityDeploy.newBuilder(requestId, firstDeployId) .setCommand(Optional.of("sleep 100")) .build(); SingularityDeployRequest singularityDeployRequest = new SingularityDeployRequest(deploy, Optional.absent(), Optional.absent(), Optional.absent()); deployResource.deploy(singularityDeployRequest, singularityUser); scheduler.drainPendingQueue(); SingularityPendingTask task1 = createAndSchedulePendingTask(firstDeployId); Assert.assertEquals(1, taskManager.getPendingTaskIds().size()); Assert.assertEquals(PendingType.NEW_DEPLOY, taskManager.getPendingTaskIds().get(0).getPendingType()); requestManager.addToPendingQueue(new SingularityPendingRequest(requestId, deploy.getId(), System.currentTimeMillis(), Optional.absent(), PendingType.IMMEDIATE, deploy.getSkipHealthchecksOnDeploy(), Optional.absent())); scheduler.drainPendingQueue(); Assert.assertEquals(1, taskManager.getPendingTaskIds().size()); Assert.assertEquals(PendingType.IMMEDIATE, taskManager.getPendingTaskIds().get(0).getPendingType()); }
@Test public void testMultipleRunOnceTasks() { 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); deployChecker.checkDeploys(); Assert.assertEquals(1, requestManager.getSizeOfPendingQueue()); deployResource.deploy(new SingularityDeployRequest(new SingularityDeployBuilder(requestId, "d2").setCommand(Optional.of("cmd")).build(), Optional.absent(), Optional.absent()), singularityUser); deployChecker.checkDeploys(); Assert.assertEquals(2, requestManager.getSizeOfPendingQueue()); scheduler.drainPendingQueue(); resourceOffers(); Assert.assertEquals(2, taskManager.getActiveTaskIds().size()); }
@Test public void testArgumentCommand() { final SingularityRequest request = new SingularityRequestBuilder("test", RequestType.WORKER).build(); final SingularityDeploy deploy = new SingularityDeployBuilder("test", "1") .setCommand(Optional.of("/bin/echo")) .setArguments(Optional.of(Collections.singletonList("wat"))) .build(); final SingularityTaskRequest taskRequest = new SingularityTaskRequest(request, deploy, pendingTask); final SingularityMesosTaskHolder task = builder.buildTask(offerHolder, null, taskRequest, taskResources, executorResources); assertEquals("/bin/echo", task.getMesosTask().getCommand().getValue()); assertEquals(1, task.getMesosTask().getCommand().getArgumentsCount()); assertEquals("wat", task.getMesosTask().getCommand().getArguments(0)); assertFalse(task.getMesosTask().getCommand().getShell()); }
@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()); }