Skip to content

Commit 3b1bbeb

Browse files
bsideuprnorth
authored andcommitted
workaround listNetwork's filter until it's fixed in docker-java (#385)
* workaround listNetwork's filter until it's fixed in docker-java (see docker-java/docker-java#857 ) * Delete Docker Compose's networks by id instead of name
1 parent 46b652e commit 3b1bbeb

File tree

5 files changed

+61
-6
lines changed

5 files changed

+61
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file.
77
- Fix erroneous version reference used during CI testing of shaded dependencies
88
- Fix leakage of Vibur and Tomcat JDBC test dependencies in `jdbc-test` and `mysql` modules (#382)
99
- Add timeout and retries for creation of `RemoteWebDriver` (#381, #373, #257)
10+
- Fixed double encoding of listNetwork's filter until it's fixed in docker-java (#385)
1011

1112
### Changed
1213
- Added support for Docker networks (#372)

core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ private void registerContainersForShutdown() {
176176
// Compose can define their own networks as well; ensure these are cleaned up
177177
dockerClient.listNetworksCmd().exec().forEach(network -> {
178178
if (network.getName().contains(identifier)) {
179-
ResourceReaper.instance().registerNetworkForCleanup(network.getName());
179+
ResourceReaper.instance().registerNetworkForCleanup(network.getId());
180180
}
181181
});
182182

core/src/main/java/org/testcontainers/containers/Network.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ class NetworkImpl extends ExternalResource implements Network {
4848
private final String id = create();
4949

5050
private String create() {
51-
ResourceReaper.instance().registerNetworkForCleanup(name);
52-
5351
CreateNetworkCmd createNetworkCmd = DockerClientFactory.instance().client().createNetworkCmd();
5452

5553
createNetworkCmd.withName(name);
@@ -67,7 +65,9 @@ private String create() {
6765
consumer.accept(createNetworkCmd);
6866
}
6967

70-
return createNetworkCmd.exec().getId();
68+
String id = createNetworkCmd.exec().getId();
69+
ResourceReaper.instance().registerNetworkForCleanup(id);
70+
return id;
7171
}
7272

7373
@Override

core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.github.dockerjava.api.DockerClient;
44
import com.github.dockerjava.core.DockerClientBuilder;
55
import com.github.dockerjava.core.DockerClientConfig;
6-
import com.github.dockerjava.netty.NettyDockerCmdExecFactory;
76
import com.google.common.base.Throwables;
87
import org.apache.commons.io.IOUtils;
98
import org.jetbrains.annotations.Nullable;
@@ -142,7 +141,7 @@ public DockerClient getClient() {
142141
protected DockerClient getClientForConfig(DockerClientConfig config) {
143142
return DockerClientBuilder
144143
.getInstance(config)
145-
.withDockerCmdExecFactory(new NettyDockerCmdExecFactory())
144+
.withDockerCmdExecFactory(new TestcontainersDockerCmdExecFactory())
146145
.build();
147146
}
148147

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.testcontainers.dockerclient;
2+
3+
import com.fasterxml.jackson.core.type.TypeReference;
4+
import com.github.dockerjava.api.command.ListNetworksCmd;
5+
import com.github.dockerjava.api.model.Network;
6+
import com.github.dockerjava.core.DockerClientConfig;
7+
import com.github.dockerjava.core.util.FiltersEncoder;
8+
import com.github.dockerjava.netty.MediaType;
9+
import com.github.dockerjava.netty.NettyDockerCmdExecFactory;
10+
import com.github.dockerjava.netty.WebTarget;
11+
import com.github.dockerjava.netty.exec.AbstrSyncDockerCmdExec;
12+
import lombok.SneakyThrows;
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
15+
16+
import java.lang.reflect.Field;
17+
import java.util.List;
18+
19+
class TestcontainersDockerCmdExecFactory extends NettyDockerCmdExecFactory {
20+
21+
@Override
22+
@SneakyThrows
23+
public ListNetworksCmd.Exec createListNetworksCmdExec() {
24+
Field baseResourceField = NettyDockerCmdExecFactory.class.getDeclaredField("baseResource");
25+
baseResourceField.setAccessible(true);
26+
27+
// FIXME Workaround for https://github.com/docker-java/docker-java/issues/857
28+
return new ListNetworksCmdExec((WebTarget) baseResourceField.get(this), getDockerClientConfig());
29+
}
30+
31+
private static class ListNetworksCmdExec extends AbstrSyncDockerCmdExec<ListNetworksCmd, List<Network>> implements ListNetworksCmd.Exec {
32+
33+
private static final Logger LOGGER = LoggerFactory.getLogger(com.github.dockerjava.netty.exec.ListNetworksCmdExec.class);
34+
35+
public ListNetworksCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
36+
super(baseResource, dockerClientConfig);
37+
}
38+
39+
@Override
40+
protected List<Network> execute(ListNetworksCmd command) {
41+
WebTarget webTarget = getBaseResource().path("/networks");
42+
43+
if (command.getFilters() != null && !command.getFilters().isEmpty()) {
44+
// Next line was changed (urlPathSegmentEscaper was removed)
45+
webTarget = webTarget.queryParam("filters", FiltersEncoder.jsonEncode(command.getFilters()));
46+
}
47+
48+
LOGGER.trace("GET: {}", webTarget);
49+
50+
return webTarget.request().accept(MediaType.APPLICATION_JSON).get(new TypeReference<List<Network>>() {
51+
});
52+
}
53+
}
54+
55+
}

0 commit comments

Comments
 (0)