@Override protected boolean matchesSafely(final TaskStatusEvent item) { return item.getStatus().getContainerId() != null; } };
@Override public TaskStatus call() throws Exception { final HostStatus hostStatus = client.hostStatus(testHost()).get(); final TaskStatus taskStatus = hostStatus.getStatuses().get(jobId); return (taskStatus != null && taskStatus.getContainerId() != null && taskStatus.getState() == RUNNING && !taskStatus.getContainerId().equals(firstTaskStatus.getContainerId())) ? taskStatus : null; } });
@Override public TaskStatus call() throws Exception { final HostStatus hostStatus = client.hostStatus(testHost()).get(); final TaskStatus taskStatus = hostStatus.getStatuses().get(jobId); return (taskStatus != null && taskStatus.getContainerId() != null && taskStatus.getState() == RUNNING && !taskStatus.getContainerId().equals(secondTaskStatus.getContainerId())) ? taskStatus : null; } });
@Override public TaskStatus call() throws Exception { final HostStatus hostStatus = client.hostStatus(testHost()).get(); final TaskStatus taskStatus = hostStatus.getStatuses().get(jobId1); return (taskStatus != null && taskStatus.getState() == RUNNING && !Objects.equals(taskStatus.getContainerId(), firstTaskStatus1.getContainerId())) ? taskStatus : null; } });
@Override public TaskStatus call() throws Exception { final HostStatus hostStatus = client.hostStatus(testHost()).get(); final TaskStatus taskStatus = hostStatus.getStatuses().get(jobId2); return (taskStatus != null && taskStatus.getState() == RUNNING && !Objects.equals(taskStatus.getContainerId(), firstTaskStatus2.getContainerId())) ? taskStatus : null; } });
@Override public TaskStatus call() throws Exception { final JobStatus jobStatus = client.jobStatus(jobId).get(); final TaskStatus taskStatus = jobStatus.getTaskStatuses().get(testHost()); return taskStatus != null && Objects.equals(taskStatus.getContainerId(), secondRestartedContainerId) ? taskStatus : null; } });
/** * Create a job supervisor. * * @param job The job . */ private Supervisor createSupervisor(final Job job, final Map<String, Integer> portAllocation) { log.debug("creating job supervisor: {}", job); final TaskStatus taskStatus = model.getTaskStatus(job.getId()); final String containerId = (taskStatus == null) ? null : taskStatus.getContainerId(); final Supervisor supervisor = supervisorFactory.create(job, containerId, portAllocation, supervisorListener); supervisors.put(job.getId(), supervisor); return supervisor; }
public void task(final JobId jobId, final String host, final TaskStatus ts, final Deployment deployment) { final String goal = (deployment == null) ? "" : deployment.getGoal().toString(); final int maxContainerId = full ? Integer.MAX_VALUE : 7; final String jobIdString = full ? jobId.toString() : jobId.toShortString(); if (ts == null) { table.row(jobIdString, host, goal, "", "", ""); } else { final List<String> portMappings = new ArrayList<>(); for (final Map.Entry<String, PortMapping> entry : ts.getPorts().entrySet()) { final PortMapping portMapping = entry.getValue(); portMappings.add(String.format("%s=%d:%d", entry.getKey(), portMapping.getInternalPort(), portMapping.getExternalPort())); } String state = ts.getState().toString(); if (ts.getThrottled() != ThrottleState.NO) { state += " (" + ts.getThrottled() + ")"; } final String ports = Joiner.on(" ").join(portMappings); final String cid = truncate(fromNullable(ts.getContainerId()).or(""), maxContainerId, ""); table.row(jobIdString, host, goal, state, cid, ports); } }
@Test public void testDnsParam() throws Exception { final String server1 = "127.0.0.1"; final String server2 = "127.0.0.2"; startDefaultMaster(); startDefaultAgent(testHost(), "--dns", server1, "--dns", server2); awaitHostStatus(testHost(), UP, LONG_WAIT_SECONDS, SECONDS); final JobId jobId = createJob(testJobName, testJobVersion, BUSYBOX, asList("cat", "/etc/resolv.conf")); deployJob(jobId, testHost()); final TaskStatus taskStatus = awaitTaskState(jobId, testHost(), EXITED); try (final DockerClient dockerClient = getNewDockerClient()) { final LogStream logs = dockerClient.logs(taskStatus.getContainerId(), stdout(), stderr()); final String log = logs.readFully(); assertThat(log, containsString(server1)); assertThat(log, containsString(server2)); } }
@Test public void testNoDnsParam() throws Exception { startDefaultMaster(); startDefaultAgent(testHost()); awaitHostStatus(testHost(), UP, LONG_WAIT_SECONDS, SECONDS); final JobId jobId = createJob(testJobName, testJobVersion, BUSYBOX, asList("cat", "/etc/resolv.conf")); deployJob(jobId, testHost()); final TaskStatus taskStatus = awaitTaskState(jobId, testHost(), EXITED); try (final DockerClient dockerClient = getNewDockerClient()) { final LogStream logs = dockerClient.logs(taskStatus.getContainerId(), stdout(), stderr()); final String log = logs.readFully(); // Verify that a nameserver is set even if we don't specify the --dns param assertThat(log, containsString("nameserver")); } }
@Test public void testPortEnvVars() throws Exception { startDefaultMaster(); startDefaultAgent(testHost()); awaitHostStatus(testHost(), UP, LONG_WAIT_SECONDS, SECONDS); final Map<String, PortMapping> ports = ImmutableMap.of("bar", staticMapping1); try (final DockerClient dockerClient = getNewDockerClient()) { final JobId jobId = createJob(testJobName + 1, testJobVersion, BUSYBOX, asList("sh", "-c", "echo $HELIOS_PORT_bar"), EMPTY_ENV, ports); deployJob(jobId, testHost()); final TaskStatus taskStatus = awaitTaskState(jobId, testHost(), EXITED); final String log; try (final LogStream logs = dockerClient.logs(taskStatus.getContainerId(), stdout(), stderr())) { log = logs.readFully(); } assertEquals(testHost() + ":" + externalPort1, log.trim()); } } }
@Test public void test() throws Exception { try (final DockerClient docker = getNewDockerClient()) { // Start Helios agent, configured to bind host /etc/hostname into container /mnt/hostname startDefaultMaster(); startDefaultAgent(testHost(), "--add-host", "secrethost:169.254.169.254"); awaitHostStatus(testHost(), UP, LONG_WAIT_SECONDS, SECONDS); // a job that cat's /etc/hosts final List<String> command = ImmutableList.of("cat", "/etc/hosts"); final JobId jobId = createJob(testJobName, testJobVersion, BUSYBOX, command); deployJob(jobId, testHost()); final TaskStatus taskStatus = awaitTaskState(jobId, testHost(), EXITED); final String log; try (LogStream logs = docker.logs(taskStatus.getContainerId(), stdout(), stderr())) { log = logs.readFully(); assertThat(log, containsString("169.254.169.254\tsecrethost")); } } } }
final ContainerExit exit = docker.waitContainer(taskStatus.getContainerId()); assertThat(exit.statusCode(), is(0L));
@Test public void test() throws Exception { try (final DockerClient docker = getNewDockerClient()) { // Start Helios agent, configured to bind host /etc/hostname into container /mnt/hostname startDefaultMaster(); startDefaultAgent(testHost(), "--bind", "/etc/hostname:/mnt/hostname:ro"); awaitHostStatus(testHost(), UP, LONG_WAIT_SECONDS, SECONDS); // Figure out the host kernel version final String hostname = docker.info().name(); // Run a job that cat's /mnt/hostname, which should be the host's name final List<String> command = ImmutableList.of("cat", "/mnt/hostname"); final JobId jobId = createJob(testJobName, testJobVersion, BUSYBOX, command); deployJob(jobId, testHost()); final TaskStatus taskStatus = awaitTaskState(jobId, testHost(), EXITED); final String log; try (LogStream logs = docker.logs(taskStatus.getContainerId(), stdout(), stderr())) { log = logs.readFully(); } // the kernel version from the host should be in the log assertThat(log, containsString(hostname)); } }
@Test public void testAgent() throws Exception { startDefaultMaster("--zk-cluster-id=" + zkClusterId); startDefaultAgent(testHost(), "--zk-cluster-id=" + zkClusterId); awaitHostStatus(testHost(), UP, LONG_WAIT_SECONDS, SECONDS); // Create job and deploy it final JobId jobId = createJob(testJobName, testJobVersion, BUSYBOX, IDLE_COMMAND); deployJob(jobId, testHost()); final TaskStatus runningStatus = awaitTaskState(jobId, testHost(), RUNNING); final String containerId = runningStatus.getContainerId(); // Delete the config node which contains the cluster ID and all the job definitions zk().curatorWithSuperAuth().delete().deletingChildrenIfNeeded().forPath("/config"); // Sleep for a second so agent has a chance to react to deletion Thread.sleep(1000); // Make sure the agent didn't stop the job try (final DockerClient docker = getNewDockerClient()) { final List<Container> containers = docker.listContainers(); final CustomTypeSafeMatcher<Container> containerIdMatcher = new CustomTypeSafeMatcher<Container>("Container with id " + containerId) { @Override protected boolean matchesSafely(Container container) { return container.id().equals(containerId); } }; assertContainersMatch(containers, containerIdMatcher); } }
taskStatus.getContainerId(), stdout(), stderr())) { log = logs.readFully();
@Test public void test() throws Exception { final CreateJobResponse created = client.createJob(job).get(); assertEquals(CreateJobResponse.Status.OK, created.getStatus()); final JobId jobId = job.getId(); // 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); final JobDeployResponse deployed = client.deploy(deployment, testHost()).get(); assertEquals(JobDeployResponse.Status.OK, deployed.getStatus()); // Wait for the job to run final TaskStatus taskStatus = awaitJobState( client, testHost(), jobId, RUNNING, LONG_WAIT_SECONDS, SECONDS); try (final DockerClient docker = getNewDockerClient()) { final HostConfig hostConfig = docker.inspectContainer(taskStatus.getContainerId()).hostConfig(); assertEquals(NETWORK_MODE, hostConfig.networkMode()); } } }
@Test public void testTermOnExit() throws Exception { startDefaultMaster(); final String host = testHost(); startDefaultAgent(host); final HeliosClient client = defaultClient(); awaitHostStatus(client, host, UP, LONG_WAIT_SECONDS, SECONDS); // Note: signal 15 is SIGTERM final Job jobToInterrupt = Job.newBuilder() .setName(testJobName) .setVersion(testJobVersion) .setImage(BUSYBOX) .setCommand(asList("/bin/sh", "-c", "trap handle 15; handle() { echo term; exit 0; }; " + "while true; do sleep 1; done")) .build(); final JobId jobId = createJob(jobToInterrupt); deployJob(jobId, host); awaitTaskState(jobId, host, RUNNING); client.setGoal(new Deployment(jobId, Goal.STOP, Deployment.EMTPY_DEPLOYER_USER, Deployment.EMPTY_DEPLOYER_MASTER, Deployment.EMPTY_DEPLOYMENT_GROUP_NAME), host); final TaskStatus taskStatus = awaitTaskState(jobId, host, STOPPED); final String log; try (final DockerClient dockerClient = getNewDockerClient(); LogStream logs = dockerClient.logs(taskStatus.getContainerId(), stdout())) { log = logs.readFully(); } // Message expected, because the SIGTERM handler in the script should have run assertEquals("term\n", log); }
@Test public void testNoIntOnExit() throws Exception { startDefaultMaster(); final String host = testHost(); startDefaultAgent(host); final HeliosClient client = defaultClient(); awaitHostStatus(client, host, UP, LONG_WAIT_SECONDS, SECONDS); // Note: signal 2 is SIGINT final Job jobToInterrupt = Job.newBuilder() .setName(testJobName) .setVersion(testJobVersion) .setImage(BUSYBOX) .setCommand(asList("/bin/sh", "-c", "trap handle 2; handle() { echo int; exit 0; }; " + "while true; do sleep 1; done")) .build(); final JobId jobId = createJob(jobToInterrupt); deployJob(jobId, host); awaitTaskState(jobId, host, RUNNING); client.setGoal(new Deployment(jobId, Goal.STOP, Deployment.EMTPY_DEPLOYER_USER, Deployment.EMPTY_DEPLOYER_MASTER, Deployment.EMPTY_DEPLOYMENT_GROUP_NAME), host); final TaskStatus taskStatus = awaitTaskState(jobId, host, STOPPED); final String log; try (final DockerClient dockerClient = getNewDockerClient(); LogStream logs = dockerClient.logs(taskStatus.getContainerId(), stdout())) { log = logs.readFully(); } // No message expected, since SIGINT should not be sent assertEquals("", log); }
getNewDockerClient().killContainer(taskStatus.getContainerId());