-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for Docker networks. (#372)
Add support for Docker networks
- Loading branch information
Showing
7 changed files
with
249 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
78 changes: 78 additions & 0 deletions
78
core/src/main/java/org/testcontainers/containers/Network.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
package org.testcontainers.containers; | ||
|
||
import com.github.dockerjava.api.command.CreateNetworkCmd; | ||
import lombok.Builder; | ||
import lombok.Getter; | ||
import lombok.Singular; | ||
import org.junit.rules.ExternalResource; | ||
import org.junit.rules.TestRule; | ||
import org.testcontainers.DockerClientFactory; | ||
import org.testcontainers.utility.ResourceReaper; | ||
|
||
import java.util.LinkedHashSet; | ||
import java.util.Set; | ||
import java.util.UUID; | ||
import java.util.function.Consumer; | ||
|
||
public interface Network extends AutoCloseable, TestRule { | ||
|
||
String getId(); | ||
|
||
@Override | ||
default void close() { | ||
ResourceReaper.instance().removeNetworks(getId()); | ||
} | ||
|
||
static Network newNetwork() { | ||
return builder().build(); | ||
} | ||
|
||
static NetworkImpl.NetworkImplBuilder builder() { | ||
return NetworkImpl.builder(); | ||
} | ||
|
||
@Builder | ||
@Getter | ||
class NetworkImpl extends ExternalResource implements Network { | ||
|
||
private final String name = UUID.randomUUID().toString(); | ||
|
||
private Boolean enableIpv6; | ||
|
||
private String driver; | ||
|
||
@Singular | ||
private Set<Consumer<CreateNetworkCmd>> createNetworkCmdModifiers = new LinkedHashSet<>(); | ||
|
||
@Getter(lazy = true) | ||
private final String id = create(); | ||
|
||
private String create() { | ||
ResourceReaper.instance().registerNetworkForCleanup(name); | ||
|
||
CreateNetworkCmd createNetworkCmd = DockerClientFactory.instance().client().createNetworkCmd(); | ||
|
||
createNetworkCmd.withName(name); | ||
createNetworkCmd.withCheckDuplicate(true); | ||
|
||
if (enableIpv6 != null) { | ||
createNetworkCmd.withEnableIpv6(enableIpv6); | ||
} | ||
|
||
if (driver != null) { | ||
createNetworkCmd.withDriver(driver); | ||
} | ||
|
||
for (Consumer<CreateNetworkCmd> consumer : createNetworkCmdModifiers) { | ||
consumer.accept(createNetworkCmd); | ||
} | ||
|
||
return createNetworkCmd.exec().getId(); | ||
} | ||
|
||
@Override | ||
protected void after() { | ||
close(); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
94 changes: 94 additions & 0 deletions
94
core/src/test/java/org/testcontainers/containers/NetworkTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
package org.testcontainers.containers; | ||
|
||
import org.junit.Rule; | ||
import org.junit.Test; | ||
import org.junit.experimental.runners.Enclosed; | ||
import org.junit.runner.RunWith; | ||
import org.testcontainers.DockerClientFactory; | ||
|
||
import static org.rnorth.visibleassertions.VisibleAssertions.*; | ||
import static org.testcontainers.containers.Network.newNetwork; | ||
|
||
@RunWith(Enclosed.class) | ||
public class NetworkTest { | ||
|
||
public static class WithRules { | ||
|
||
@Rule | ||
public Network network = newNetwork(); | ||
|
||
@Rule | ||
public GenericContainer foo = new GenericContainer() | ||
.withNetwork(network) | ||
.withNetworkAliases("foo") | ||
.withCommand("/bin/sh", "-c", "while true ; do printf 'HTTP/1.1 200 OK\\n\\nyay' | nc -l -p 8080; done"); | ||
|
||
@Rule | ||
public GenericContainer bar = new GenericContainer() | ||
.withNetwork(network) | ||
.withCommand("top"); | ||
|
||
@Test | ||
public void testNetworkSupport() throws Exception { | ||
String response = bar.execInContainer("wget", "-O", "-", "http://foo:8080").getStdout(); | ||
assertEquals("received response", "yay", response); | ||
} | ||
} | ||
|
||
public static class WithoutRules { | ||
|
||
@Test | ||
public void testNetworkSupport() throws Exception { | ||
try ( | ||
Network network = newNetwork(); | ||
|
||
GenericContainer foo = new GenericContainer() | ||
.withNetwork(network) | ||
.withNetworkAliases("foo") | ||
.withCommand("/bin/sh", "-c", "while true ; do printf 'HTTP/1.1 200 OK\\n\\nyay' | nc -l -p 8080; done"); | ||
|
||
GenericContainer bar = new GenericContainer() | ||
.withNetwork(network) | ||
.withCommand("top") | ||
) { | ||
foo.start(); | ||
bar.start(); | ||
|
||
String response = bar.execInContainer("wget", "-O", "-", "http://foo:8080").getStdout(); | ||
assertEquals("received response", "yay", response); | ||
} | ||
} | ||
|
||
@Test | ||
public void testBuilder() throws Exception { | ||
try ( | ||
Network network = Network.builder() | ||
.driver("macvlan") | ||
.build(); | ||
) { | ||
String id = network.getId(); | ||
assertEquals( | ||
"Flag is set", | ||
"macvlan", | ||
DockerClientFactory.instance().client().inspectNetworkCmd().withNetworkId(id).exec().getDriver() | ||
); | ||
} | ||
} | ||
|
||
@Test | ||
public void testModifiers() throws Exception { | ||
try ( | ||
Network network = Network.builder() | ||
.createNetworkCmdModifier(cmd -> cmd.withDriver("macvlan")) | ||
.build(); | ||
) { | ||
String id = network.getId(); | ||
assertEquals( | ||
"Flag is set", | ||
"macvlan", | ||
DockerClientFactory.instance().client().inspectNetworkCmd().withNetworkId(id).exec().getDriver() | ||
); | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters