Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 45 additions & 4 deletions core/src/main/java/org/testcontainers/containers/Network.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.testcontainers.containers;

import com.github.dockerjava.api.command.CreateNetworkCmd;
import com.github.dockerjava.api.command.ListNetworksCmd;
import lombok.Builder;
import lombok.Getter;
import lombok.Singular;
Expand All @@ -11,15 +12,24 @@

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;

public interface Network extends AutoCloseable, TestRule {

Network SHARED = new NetworkImpl(false, null, Collections.emptySet(), null) {
Network SHARED = new NetworkImpl(
UUID.randomUUID().toString(),
false,
false,
null,
Collections.emptySet(),
null
) {
@Override
public void close() {
// Do not allow users to close SHARED network, only ResourceReaper is allowed to close (destroy) it
Expand All @@ -35,6 +45,13 @@ static Network newNetwork() {
return builder().build();
}

static Network newNetwork(String networkName) {
return builder()
.name(networkName)
.withReuse(true)
.build();
}

static NetworkImpl.NetworkImplBuilder builder() {
return NetworkImpl.builder();
}
Expand All @@ -43,7 +60,11 @@ static NetworkImpl.NetworkImplBuilder builder() {
@Getter
class NetworkImpl extends ExternalResource implements Network {

private final String name = UUID.randomUUID().toString();
@Builder.Default
private String name = UUID.randomUUID().toString();

@Builder.Default
private Boolean withReuse = false;

private Boolean enableIpv6;

Expand All @@ -66,7 +87,25 @@ public synchronized String getId() {
return id;
}

private Optional<String> get() {
ListNetworksCmd listNetworksCmd = DockerClientFactory.instance().client().listNetworksCmd();
listNetworksCmd.withNameFilter(name);
List<com.github.dockerjava.api.model.Network> networks = listNetworksCmd.exec();
for(com.github.dockerjava.api.model.Network network : networks){
if(network.getName().equals(name)){
return Optional.of(network.getId());
}
}
return Optional.empty();
}

private String create() {

Optional<String> existingNetwork = get();
if(existingNetwork.isPresent()) {
return existingNetwork.get();
}

CreateNetworkCmd createNetworkCmd = DockerClientFactory.instance().client().createNetworkCmd();

createNetworkCmd.withName(name);
Expand Down Expand Up @@ -99,8 +138,10 @@ protected void after() {

@Override
public synchronized void close() {
if (initialized.getAndSet(false)) {
ResourceReaper.instance().removeNetworkById(id);
if(!withReuse) {
if (initialized.getAndSet(false)) {
ResourceReaper.instance().removeNetworkById(id);
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.junit.runner.RunWith;
import org.testcontainers.DockerClientFactory;
import org.testcontainers.TestImages;
import org.testcontainers.utility.ResourceReaper;

import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
import static org.rnorth.visibleassertions.VisibleAssertions.assertNotEquals;
Expand Down Expand Up @@ -96,6 +97,28 @@ public void testModifiers() {
}
}

@Test
public void testResuableNamedNetwork() {
try (Network network = Network.newNetwork("random-network-87hf8f")) {
String firstId = network.getId();
assertNotNull(
"Network exists",
DockerClientFactory.instance().client().inspectNetworkCmd().withNetworkId(firstId).exec()
);

network.close();

assertEquals(
"Same network reused, network close didn't work",
firstId,
DockerClientFactory.instance().client().inspectNetworkCmd().withNetworkId(network.getId()).exec().getId()
);

// cleanup
ResourceReaper.instance().removeNetworkById(network.getId());
}
}

@Test
public void testReusability() {
try (Network network = Network.newNetwork()) {
Expand Down