use of com.spotify.helios.common.descriptors.TaskStatus in project helios by spotify.
the class HealthCheckTest method testExec.
@Test
public void testExec() throws Exception {
// CircleCI uses lxc which doesn't support exec - https://circleci.com/docs/docker/#docker-exec
assumeFalse(isCircleCi());
final DockerClient dockerClient = getNewDockerClient();
assumeThat(dockerClient.version(), is(execCompatibleDockerVersion()));
startDefaultMaster();
final HeliosClient client = defaultClient();
startDefaultAgent(testHost(), "--service-registry=" + registryAddress);
awaitHostStatus(client, testHost(), UP, LONG_WAIT_SECONDS, SECONDS);
// check if "file" exists in the root directory as a healthcheck
final HealthCheck healthCheck = ExecHealthCheck.of("test", "-e", "file");
// start a container that listens on the service port
final String portName = "service";
final String serviceName = "foo_service";
final String serviceProtocol = "foo_proto";
final Job job = Job.newBuilder().setName(testJobName).setVersion(testJobVersion).setImage(BUSYBOX).setCommand(asList("sh", "-c", "nc -l -p 4711")).addPort(portName, PortMapping.of(4711)).addRegistration(ServiceEndpoint.of(serviceName, serviceProtocol), ServicePorts.of(portName)).setHealthCheck(healthCheck).build();
final JobId jobId = createJob(job);
deployJob(jobId, testHost());
final TaskStatus jobState = awaitTaskState(jobId, testHost(), HEALTHCHECKING);
// wait a few seconds to see if the service gets registered
Thread.sleep(3000);
// shouldn't be registered, since we haven't created the file yet
verify(registrar, never()).register(any(ServiceRegistration.class));
// create the file in the container to make the healthcheck succeed
final String[] makeFileCmd = new String[] { "touch", "file" };
final ExecCreation execCreation = dockerClient.execCreate(jobState.getContainerId(), makeFileCmd);
final String execId = execCreation.id();
dockerClient.execStart(execId);
awaitTaskState(jobId, testHost(), RUNNING);
dockerClient.close();
verify(registrar, timeout((int) SECONDS.toMillis(LONG_WAIT_SECONDS))).register(registrationCaptor.capture());
final ServiceRegistration serviceRegistration = registrationCaptor.getValue();
assertEquals(1, serviceRegistration.getEndpoints().size());
final Endpoint registeredEndpoint = serviceRegistration.getEndpoints().get(0);
assertEquals("wrong service", serviceName, registeredEndpoint.getName());
assertEquals("wrong protocol", serviceProtocol, registeredEndpoint.getProtocol());
}
use of com.spotify.helios.common.descriptors.TaskStatus in project helios by spotify.
the class ImageMissingTest method test.
@Test
public void test() throws Exception {
startDefaultMaster();
startDefaultAgent(testHost());
final HeliosClient client = defaultClient();
awaitHostStatus(client, testHost(), UP, LONG_WAIT_SECONDS, SECONDS);
final JobId jobId = createJob(testJobName, testJobVersion, "this_sould_not_exist", ImmutableList.of("/bin/true"));
deployJob(jobId, testHost());
awaitJobThrottle(client, testHost(), jobId, IMAGE_MISSING, LONG_WAIT_SECONDS, SECONDS);
final HostStatus hostStatus = client.hostStatus(testHost()).get();
final TaskStatus taskStatus = hostStatus.getStatuses().get(jobId);
assertEquals(TaskStatus.State.FAILED, taskStatus.getState());
}
use of com.spotify.helios.common.descriptors.TaskStatus in project helios by spotify.
the class DeploymentTest method test.
@Test
public void test() throws Exception {
final Map<String, PortMapping> ports = ImmutableMap.of("foos", PortMapping.of(17, externalPort));
startDefaultMaster();
final HeliosClient client = defaultClient();
startDefaultAgent(testHost());
// Create a job
final Job job = Job.newBuilder().setName(testJobName).setVersion(testJobVersion).setImage(BUSYBOX).setCommand(IDLE_COMMAND).setPorts(ports).setCreatingUser(TEST_USER).build();
final JobId jobId = job.getId();
final CreateJobResponse created = client.createJob(job).get();
assertEquals(CreateJobResponse.Status.OK, created.getStatus());
final CreateJobResponse duplicateJob = client.createJob(job).get();
assertEquals(CreateJobResponse.Status.JOB_ALREADY_EXISTS, duplicateJob.getStatus());
// Try querying for the job
final Map<JobId, Job> noMatchJobs = client.jobs(testJobName + "not_matching").get();
assertTrue(noMatchJobs.isEmpty());
final Map<JobId, Job> matchJobs1 = client.jobs(testJobName).get();
assertJobsEqual(ImmutableMap.of(jobId, job), matchJobs1);
final Map<JobId, Job> matchJobs2 = client.jobs(testJobName + ":" + testJobVersion).get();
assertJobsEqual(ImmutableMap.of(jobId, job), matchJobs2);
final Map<JobId, Job> matchJobs3 = client.jobs(job.getId().toString()).get();
assertJobsEqual(ImmutableMap.of(jobId, job), matchJobs3);
// Wait for agent to come up
awaitHostRegistered(client, testHost(), LONG_WAIT_SECONDS, SECONDS);
awaitHostStatus(client, testHost(), UP, LONG_WAIT_SECONDS, SECONDS);
// Deploy the job on the agent
final Deployment deployment = Deployment.of(jobId, START, TEST_USER);
final JobDeployResponse deployed = client.deploy(deployment, testHost()).get();
assertEquals(JobDeployResponse.Status.OK, deployed.getStatus());
final JobDeployResponse deployed2 = client.deploy(deployment, testHost()).get();
assertEquals(JobDeployResponse.Status.JOB_ALREADY_DEPLOYED, deployed2.getStatus());
final JobDeployResponse deployed3 = client.deploy(Deployment.of(BOGUS_JOB, START), testHost()).get();
assertEquals(JobDeployResponse.Status.JOB_NOT_FOUND, deployed3.getStatus());
final JobDeployResponse deployed4 = client.deploy(deployment, BOGUS_HOST).get();
assertEquals(JobDeployResponse.Status.HOST_NOT_FOUND, deployed4.getStatus());
// undeploy and redeploy to make sure things still work in the face of the tombstone
final JobUndeployResponse undeployResp = client.undeploy(jobId, testHost()).get();
assertEquals(JobUndeployResponse.Status.OK, undeployResp.getStatus());
final JobDeployResponse redeployed = client.deploy(deployment, testHost()).get();
assertEquals(JobDeployResponse.Status.OK, redeployed.getStatus());
// Check that the job is in the desired state
final Deployment fetchedDeployment = client.deployment(testHost(), jobId).get();
assertEquals(deployment, fetchedDeployment);
// Wait for the job to run
TaskStatus taskStatus;
taskStatus = awaitJobState(client, testHost(), jobId, RUNNING, LONG_WAIT_SECONDS, SECONDS);
assertJobEquals(job, taskStatus.getJob());
assertEquals(JobDeleteResponse.Status.STILL_IN_USE, client.deleteJob(jobId).get().getStatus());
// Wait for a while and make sure that the container is still running
Thread.sleep(5000);
final HostStatus hostStatus = client.hostStatus(testHost()).get();
taskStatus = hostStatus.getStatuses().get(jobId);
assertEquals(jobId.toString(), RUNNING, taskStatus.getState());
// Undeploy the job
final JobUndeployResponse undeployed = client.undeploy(jobId, testHost()).get();
assertEquals(JobUndeployResponse.Status.OK, undeployed.getStatus());
// Make sure that it is no longer in the desired state
final Deployment undeployedJob = client.deployment(testHost(), jobId).get();
assertTrue(undeployedJob == null);
// Wait for the task to disappear
awaitTaskGone(client, testHost(), jobId, LONG_WAIT_SECONDS, SECONDS);
// Verify that the job can be deleted
assertEquals(JobDeleteResponse.Status.OK, client.deleteJob(jobId).get().getStatus());
// Verify that a nonexistent job returns JOB_NOT_FOUND
assertEquals(JobDeleteResponse.Status.JOB_NOT_FOUND, client.deleteJob(jobId).get().getStatus());
}
use of com.spotify.helios.common.descriptors.TaskStatus in project helios by spotify.
the class DeploymentTest method testJobWithDigest.
@Test
public void testJobWithDigest() throws Exception {
startDefaultMaster();
final HeliosClient client = defaultClient();
startDefaultAgent(testHost());
// Create a job
final Job job = Job.newBuilder().setName(testJobName).setVersion(testJobVersion).setImage(BUSYBOX_WITH_DIGEST).setCommand(IDLE_COMMAND).setCreatingUser(TEST_USER).build();
final JobId jobId = job.getId();
final CreateJobResponse created = client.createJob(job).get();
assertEquals(CreateJobResponse.Status.OK, created.getStatus());
// Try querying for the job
final Map<JobId, Job> matchJobs = client.jobs(testJobName).get();
assertJobsEqual(ImmutableMap.of(jobId, job), matchJobs);
assertEquals(BUSYBOX_WITH_DIGEST, matchJobs.get(jobId).getImage());
// Wait for agent to come up
awaitHostRegistered(client, testHost(), LONG_WAIT_SECONDS, SECONDS);
awaitHostStatus(client, testHost(), UP, LONG_WAIT_SECONDS, SECONDS);
// Deploy the job on the agent
final Deployment deployment = Deployment.of(jobId, START, TEST_USER);
final JobDeployResponse deployed = client.deploy(deployment, testHost()).get();
assertEquals(JobDeployResponse.Status.OK, deployed.getStatus());
// Wait for the job to run
TaskStatus taskStatus;
taskStatus = awaitJobState(client, testHost(), jobId, RUNNING, LONG_WAIT_SECONDS, SECONDS);
assertJobEquals(job, taskStatus.getJob());
}
use of com.spotify.helios.common.descriptors.TaskStatus in project helios by spotify.
the class AgentTest method verifyAgentRecoversState.
@SuppressWarnings("unchecked")
@Test
public void verifyAgentRecoversState() throws Exception {
configure(FOO_JOB, START);
configure(BAR_JOB, STOP);
executions.setUnchecked(ImmutableMap.of(BAR_JOB.getId(), Execution.of(BAR_JOB).withGoal(START).withPorts(EMPTY_PORT_ALLOCATION), FOO_JOB.getId(), Execution.of(FOO_JOB).withGoal(START).withPorts(EMPTY_PORT_ALLOCATION)));
final String fooContainerId = "foo_container_id";
final String barContainerId = "bar_container_id";
final TaskStatus fooStatus = TaskStatus.newBuilder().setGoal(START).setJob(FOO_JOB).setContainerId(fooContainerId).setState(RUNNING).build();
final TaskStatus barStatus = TaskStatus.newBuilder().setGoal(START).setJob(BAR_JOB).setContainerId(barContainerId).setState(RUNNING).build();
jobStatuses.put(FOO_JOB.getId(), fooStatus);
jobStatuses.put(BAR_JOB.getId(), barStatus);
startAgent();
verify(portAllocator, never()).allocate(anyMap(), anySet());
verify(supervisorFactory).create(eq(BAR_JOB), eq(barContainerId), eq(EMPTY_PORT_ALLOCATION), any(Supervisor.Listener.class));
verify(supervisorFactory).create(eq(FOO_JOB), eq(fooContainerId), eq(EMPTY_PORT_ALLOCATION), any(Supervisor.Listener.class));
callback.run(false);
verify(fooSupervisor).setGoal(START);
verify(barSupervisor).setGoal(STOP);
when(fooSupervisor.isStarting()).thenReturn(true);
when(fooSupervisor.isStopping()).thenReturn(false);
when(fooSupervisor.isDone()).thenReturn(true);
when(barSupervisor.isStarting()).thenReturn(false);
when(barSupervisor.isStopping()).thenReturn(true);
when(barSupervisor.isDone()).thenReturn(true);
callback.run(false);
verify(fooSupervisor, atLeastOnce()).setGoal(START);
verify(barSupervisor, atLeastOnce()).setGoal(STOP);
}
Aggregations