// 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
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);
assertEquals(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(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);