Skip to content
This repository has been archived by the owner on Sep 29, 2021. It is now read-only.

Commit

Permalink
Upgrade docker-client dep from 5.0.2 to 7.0.0-SNAPSHOT
Browse files Browse the repository at this point in the history
  • Loading branch information
davidxia committed Jan 9, 2017
1 parent b696f2c commit 34b746c
Show file tree
Hide file tree
Showing 17 changed files with 137 additions and 140 deletions.
1 change: 0 additions & 1 deletion helios-client/pom.xml
Expand Up @@ -49,7 +49,6 @@
<dependency> <dependency>
<groupId>org.apache.httpcomponents</groupId> <groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId> <artifactId>httpclient</artifactId>
<version>4.5</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.bouncycastle</groupId> <groupId>org.bouncycastle</groupId>
Expand Down
8 changes: 6 additions & 2 deletions helios-services/pom.xml
Expand Up @@ -196,7 +196,6 @@
<dependency> <dependency>
<groupId>org.apache.httpcomponents</groupId> <groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId> <artifactId>httpclient</artifactId>
<version>4.5</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>joda-time</groupId> <groupId>joda-time</groupId>
Expand Down Expand Up @@ -296,7 +295,6 @@
<dependency> <dependency>
<groupId>com.spotify</groupId> <groupId>com.spotify</groupId>
<artifactId>docker-client</artifactId> <artifactId>docker-client</artifactId>
<version>5.0.2</version>
<classifier>shaded</classifier> <classifier>shaded</classifier>
</dependency> </dependency>
<dependency> <dependency>
Expand All @@ -319,6 +317,12 @@
<version>0.8</version> <version>0.8</version>
</dependency> </dependency>


<!-- versions that we have to manage to avoid requireUpperBoundDeps violations -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>

<!--test deps--> <!--test deps-->
<dependency> <dependency>
<groupId>com.spotify</groupId> <groupId>com.spotify</groupId>
Expand Down
Expand Up @@ -67,16 +67,18 @@ public static boolean isValidBind(final String bind) {


@Override @Override
public void decorateHostConfig(Job job, Optional<String> dockerVersion, public void decorateHostConfig(Job job, Optional<String> dockerVersion,
HostConfig.Builder hostConfig) { HostConfig.Builder hostConfigBuilder) {
final List<String> b = Lists.newArrayList(); final List<String> b = Lists.newArrayList();


final HostConfig hostConfig = hostConfigBuilder.build();

if (hostConfig.binds() != null) { if (hostConfig.binds() != null) {
b.addAll(hostConfig.binds()); b.addAll(hostConfig.binds());
} }


b.addAll(this.binds); b.addAll(this.binds);


hostConfig.binds(b); hostConfigBuilder.binds(b);
} }


@Override @Override
Expand Down
Expand Up @@ -30,10 +30,13 @@
import com.spotify.docker.client.DockerHost; import com.spotify.docker.client.DockerHost;
import com.spotify.docker.client.LogStream; import com.spotify.docker.client.LogStream;
import com.spotify.docker.client.exceptions.DockerException; import com.spotify.docker.client.exceptions.DockerException;
import com.spotify.docker.client.messages.ExecCreation;
import com.spotify.helios.common.descriptors.ExecHealthCheck; import com.spotify.helios.common.descriptors.ExecHealthCheck;
import com.spotify.helios.common.descriptors.HealthCheck; import com.spotify.helios.common.descriptors.HealthCheck;
import com.spotify.helios.common.descriptors.HttpHealthCheck; import com.spotify.helios.common.descriptors.HttpHealthCheck;
import com.spotify.helios.common.descriptors.TcpHealthCheck; import com.spotify.helios.common.descriptors.TcpHealthCheck;

import java.io.IOException;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.MalformedURLException; import java.net.MalformedURLException;
Expand Down Expand Up @@ -88,13 +91,17 @@ public boolean check(final String containerId) {


try { try {
final List<String> cmd = healthCheck.getCommand(); final List<String> cmd = healthCheck.getCommand();
final String execId = docker.execCreate(containerId, cmd.toArray(new String[cmd.size()]), final ExecCreation execCreation = docker.execCreate(
DockerClient.ExecCreateParam.attachStdout(), containerId, cmd.toArray(new String[cmd.size()]),
DockerClient.ExecCreateParam.attachStderr()); DockerClient.ExecCreateParam.attachStdout(),
DockerClient.ExecCreateParam.attachStderr());
final String execId = execCreation.id();


final String output; String output = "";
try (LogStream stream = docker.execStart(execId)) { try (LogStream stream = docker.execStart(execId)) {
output = stream.readFully(); output = stream.readFully();
} catch (IOException e) {
// thrown from implicit call to close(). Ignore.
} }


final int exitCode = docker.execInspect(execId).exitCode(); final int exitCode = docker.execInspect(execId).exitCode();
Expand Down
Expand Up @@ -58,7 +58,7 @@ public ContainerExit waitContainer(final String containerId)
while (true) { while (true) {
final ContainerInfo info = inspectContainer(containerId); final ContainerInfo info = inspectContainer(containerId);
if (!info.state().running()) { if (!info.state().running()) {
return new ContainerExit(info.state().exitCode()); return ContainerExit.create(info.state().exitCode());
} }
Thread.sleep(WAIT_INSPECT_INTERVAL_MILLIS); Thread.sleep(WAIT_INSPECT_INTERVAL_MILLIS);
} }
Expand Down
Expand Up @@ -29,7 +29,10 @@
import com.spotify.docker.client.messages.ImageInfo; import com.spotify.docker.client.messages.ImageInfo;
import com.spotify.docker.client.messages.LogConfig; import com.spotify.docker.client.messages.LogConfig;
import com.spotify.helios.common.descriptors.Job; import com.spotify.helios.common.descriptors.Job;

import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;


/** /**
Expand All @@ -46,14 +49,15 @@ public SyslogRedirectingContainerDecorator(final String syslogHostPort) {


@Override @Override
public void decorateHostConfig(Job job, Optional<String> dockerVersion, public void decorateHostConfig(Job job, Optional<String> dockerVersion,
HostConfig.Builder hostConfig) { HostConfig.Builder hostConfigBuilder) {
final HostConfig hostConfig = hostConfigBuilder.build();
if (useSyslogRedirector(dockerVersion)) { if (useSyslogRedirector(dockerVersion)) {
final List<String> binds = Lists.newArrayList(); final List<String> binds = Lists.newArrayList();
if (hostConfig.binds() != null) { if (hostConfig.binds() != null) {
binds.addAll(hostConfig.binds()); binds.addAll(hostConfig.binds());
} }
binds.add("/usr/lib/helios:/helios:ro"); binds.add("/usr/lib/helios:/helios:ro");
hostConfig.binds(binds); hostConfigBuilder.binds(binds);
} else { } else {
final ImmutableMap.Builder<String, String> logOpts = ImmutableMap.builder(); final ImmutableMap.Builder<String, String> logOpts = ImmutableMap.builder();


Expand All @@ -62,13 +66,13 @@ public void decorateHostConfig(Job job, Optional<String> dockerVersion,


logOpts.put("tag", job.getId().toString()); logOpts.put("tag", job.getId().toString());


hostConfig.logConfig(LogConfig.create("syslog", logOpts.build())); hostConfigBuilder.logConfig(LogConfig.create("syslog", logOpts.build()));
} }
} }


@Override @Override
public void decorateContainerConfig(Job job, ImageInfo imageInfo, Optional<String> dockerVersion, public void decorateContainerConfig(Job job, ImageInfo imageInfo, Optional<String> dockerVersion,
ContainerConfig.Builder containerConfig) { ContainerConfig.Builder containerConfigBuilder) {
if (!useSyslogRedirector(dockerVersion)) { if (!useSyslogRedirector(dockerVersion)) {
return; return;
} }
Expand All @@ -86,21 +90,23 @@ public void decorateContainerConfig(Job job, ImageInfo imageInfo, Optional<Strin
if (imageConfig.entrypoint() != null) { if (imageConfig.entrypoint() != null) {
entrypoint.addAll(imageConfig.entrypoint()); entrypoint.addAll(imageConfig.entrypoint());
} }
containerConfig.entrypoint(entrypoint); containerConfigBuilder.entrypoint(entrypoint);

final ContainerConfig containerConfig = containerConfigBuilder.build();


// If there's no explicit container cmd specified, copy over the one from the image. // If there's no explicit container cmd specified, copy over the one from the image.
// Only setting the entrypoint causes dockerd to not use the image cmd. // Only setting the entrypoint causes dockerd to not use the image cmd.
if ((containerConfig.cmd() == null || containerConfig.cmd().isEmpty()) if ((containerConfig.cmd() == null || containerConfig.cmd().isEmpty())
&& imageConfig.cmd() != null) { && imageConfig.cmd() != null) {
containerConfig.cmd(imageConfig.cmd()); containerConfigBuilder.cmd(imageConfig.cmd());
} }


final Set<String> volumes = Sets.newHashSet(); final ImmutableMap.Builder<String, Map> volumesBuilder = ImmutableMap.builder();
if (containerConfig.volumes() != null) { if (containerConfig.volumes() != null) {
volumes.addAll(containerConfig.volumes()); volumesBuilder.putAll(containerConfig.volumes());
} }
volumes.add("/helios"); volumesBuilder.put("/helios", new HashMap<>());
containerConfig.volumes(volumes); containerConfigBuilder.volumes(volumesBuilder.build());
} }


private boolean useSyslogRedirector(Optional<String> dockerVersion) { private boolean useSyslogRedirector(Optional<String> dockerVersion) {
Expand Down
Expand Up @@ -260,12 +260,12 @@ private Map<String, List<PortBinding>> portBindings() {
final Map<String, List<PortBinding>> bindings = Maps.newHashMap(); final Map<String, List<PortBinding>> bindings = Maps.newHashMap();
for (final Map.Entry<String, PortMapping> e : job.getPorts().entrySet()) { for (final Map.Entry<String, PortMapping> e : job.getPorts().entrySet()) {
final PortMapping mapping = e.getValue(); final PortMapping mapping = e.getValue();
final PortBinding binding = new PortBinding(); final PortBinding binding;
final Integer externalPort = mapping.getExternalPort(); final Integer externalPort = mapping.getExternalPort();
if (externalPort == null) { if (externalPort == null) {
binding.hostPort(ports.get(e.getKey()).toString()); binding = PortBinding.of(null, ports.get(e.getKey()).toString());
} else { } else {
binding.hostPort(externalPort.toString()); binding = PortBinding.of(null, externalPort.toString());
} }
final String entry = containerPort(mapping.getInternalPort(), mapping.getProtocol()); final String entry = containerPort(mapping.getInternalPort(), mapping.getProtocol());
bindings.put(entry, Collections.singletonList(binding)); bindings.put(entry, Collections.singletonList(binding));
Expand Down
Expand Up @@ -20,6 +20,7 @@


package com.spotify.helios.agent; package com.spotify.helios.agent;


import static java.util.Collections.emptyList;
import static org.hamcrest.core.Is.is; import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
Expand All @@ -31,6 +32,7 @@
import com.spotify.docker.client.DockerClient; import com.spotify.docker.client.DockerClient;
import com.spotify.docker.client.DockerClient.ExecStartParameter; import com.spotify.docker.client.DockerClient.ExecStartParameter;
import com.spotify.docker.client.LogStream; import com.spotify.docker.client.LogStream;
import com.spotify.docker.client.messages.ExecCreation;
import com.spotify.docker.client.messages.ExecState; import com.spotify.docker.client.messages.ExecState;
import com.spotify.docker.client.messages.Info; import com.spotify.docker.client.messages.Info;
import com.spotify.docker.client.messages.Version; import com.spotify.docker.client.messages.Version;
Expand Down Expand Up @@ -73,7 +75,7 @@ public void setUp() throws Exception {
when(docker.version()).thenReturn(version); when(docker.version()).thenReturn(version);
when(docker.execCreate(eq(CONTAINER_ID), any(String[].class), when(docker.execCreate(eq(CONTAINER_ID), any(String[].class),
(DockerClient.ExecCreateParam) anyVararg())) (DockerClient.ExecCreateParam) anyVararg()))
.thenReturn(EXEC_ID); .thenReturn(ExecCreation.create(EXEC_ID, emptyList()));
when(docker.execStart(eq(EXEC_ID), (ExecStartParameter) anyVararg())).thenReturn(log); when(docker.execStart(eq(EXEC_ID), (ExecStartParameter) anyVararg())).thenReturn(log);
when(docker.execInspect(EXEC_ID)).thenReturn(execState); when(docker.execInspect(EXEC_ID)).thenReturn(execState);


Expand Down
Expand Up @@ -35,6 +35,7 @@
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
Expand All @@ -51,7 +52,6 @@
import com.spotify.docker.client.messages.ContainerState; import com.spotify.docker.client.messages.ContainerState;
import com.spotify.docker.client.messages.ImageInfo; import com.spotify.docker.client.messages.ImageInfo;
import com.spotify.docker.client.messages.NetworkSettings; import com.spotify.docker.client.messages.NetworkSettings;
import com.spotify.docker.client.messages.PortBinding;
import com.spotify.helios.TemporaryPorts; import com.spotify.helios.TemporaryPorts;
import com.spotify.helios.common.descriptors.Job; import com.spotify.helios.common.descriptors.Job;
import com.spotify.helios.common.descriptors.JobId; import com.spotify.helios.common.descriptors.JobId;
Expand Down Expand Up @@ -120,30 +120,9 @@ public class GracePeriodTest {
static final Map<String, String> ENV = ImmutableMap.of("foo", "17", "bar", "4711"); static final Map<String, String> ENV = ImmutableMap.of("foo", "17", "bar", "4711");
static final Set<String> EXPECTED_CONTAINER_ENV = ImmutableSet.of("foo=17", "bar=4711"); static final Set<String> EXPECTED_CONTAINER_ENV = ImmutableSet.of("foo=17", "bar=4711");


public static final ContainerInfo RUNNING_RESPONSE = new ContainerInfo() { public final ContainerInfo runningResponse = mock(ContainerInfo.class);
@Override
public ContainerState state() {
final ContainerState state = Mockito.mock(ContainerState.class);
when(state.running()).thenReturn(true);
return state;
}


@Override public final ContainerInfo stoppedResponse = mock(ContainerInfo.class);
public NetworkSettings networkSettings() {
return NetworkSettings.builder()
.ports(Collections.<String, List<PortBinding>>emptyMap())
.build();
}
};

public static final ContainerInfo STOPPED_RESPONSE = new ContainerInfo() {
@Override
public ContainerState state() {
final ContainerState state = Mockito.mock(ContainerState.class);
when(state.running()).thenReturn(false);
return state;
}
};


@Mock public AgentModel model; @Mock public AgentModel model;
@Mock public DockerClient docker; @Mock public DockerClient docker;
Expand All @@ -159,6 +138,17 @@ public ContainerState state() {


@Before @Before
public void setup() throws Exception { public void setup() throws Exception {
final ContainerState runningState = Mockito.mock(ContainerState.class);
when(runningState.running()).thenReturn(true);
when(runningResponse.state()).thenReturn(runningState);
when(runningResponse.networkSettings()).thenReturn(NetworkSettings.builder()
.ports(Collections.emptyMap())
.build());

final ContainerState stoppedState = Mockito.mock(ContainerState.class);
when(stoppedState.running()).thenReturn(false);
when(stoppedResponse.state()).thenReturn(stoppedState);

when(retryPolicy.delay(any(ThrottleState.class))).thenReturn(10L); when(retryPolicy.delay(any(ThrottleState.class))).thenReturn(10L);
when(registrar.register(any(ServiceRegistration.class))) when(registrar.register(any(ServiceRegistration.class)))
.thenReturn(new NopServiceRegistrationHandle()); .thenReturn(new NopServiceRegistrationHandle());
Expand Down Expand Up @@ -230,7 +220,7 @@ public void teardown() throws Exception {
public void verifySupervisorStartsAndStopsDockerContainer() throws Exception { public void verifySupervisorStartsAndStopsDockerContainer() throws Exception {
final String containerId = "deadbeef"; final String containerId = "deadbeef";


final ContainerCreation createResponse = new ContainerCreation(containerId); final ContainerCreation createResponse = ContainerCreation.builder().id(containerId).build();


final SettableFuture<ContainerCreation> createFuture = SettableFuture.create(); final SettableFuture<ContainerCreation> createFuture = SettableFuture.create();
when(docker.createContainer(any(ContainerConfig.class), when(docker.createContainer(any(ContainerConfig.class),
Expand All @@ -240,7 +230,7 @@ public void verifySupervisorStartsAndStopsDockerContainer() throws Exception {
doAnswer(futureAnswer(startFuture)) doAnswer(futureAnswer(startFuture))
.when(docker).startContainer(eq(containerId)); .when(docker).startContainer(eq(containerId));


final ImageInfo imageInfo = new ImageInfo(); final ImageInfo imageInfo = mock(ImageInfo.class);
when(docker.inspectImage(IMAGE)).thenReturn(imageInfo); when(docker.inspectImage(IMAGE)).thenReturn(imageInfo);


final SettableFuture<ContainerExit> waitFuture = SettableFuture.create(); final SettableFuture<ContainerExit> waitFuture = SettableFuture.create();
Expand Down Expand Up @@ -294,7 +284,7 @@ public void verifySupervisorStartsAndStopsDockerContainer() throws Exception {
.setEnv(ENV) .setEnv(ENV)
.build()) .build())
); );
when(docker.inspectContainer(eq(containerId))).thenReturn(RUNNING_RESPONSE); when(docker.inspectContainer(eq(containerId))).thenReturn(runningResponse);
startFuture.set(null); startFuture.set(null);


verify(docker, timeout(30000)).waitContainer(containerId); verify(docker, timeout(30000)).waitContainer(containerId);
Expand Down Expand Up @@ -329,7 +319,7 @@ public Void call() throws Exception {
verify(sleeper).sleep(GRACE_PERIOD_MILLIS); verify(sleeper).sleep(GRACE_PERIOD_MILLIS);


// Change docker container state to stopped when it's killed // Change docker container state to stopped when it's killed
when(docker.inspectContainer(eq(containerId))).thenReturn(STOPPED_RESPONSE); when(docker.inspectContainer(eq(containerId))).thenReturn(stoppedResponse);
killFuture.set(null); killFuture.set(null);


// Verify that the stopping state is signalled // Verify that the stopping state is signalled
Expand Down

0 comments on commit 34b746c

Please sign in to comment.