Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow to define a custom ImagePullPolicy via configuration #7520

Merged
merged 9 commits into from
Sep 27, 2023
Merged
Show file tree
Hide file tree
Changes from 2 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
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,23 @@
import lombok.SneakyThrows;
import lombok.ToString;
import lombok.With;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.testcontainers.DockerClientFactory;
import org.testcontainers.containers.ContainerFetchException;
import org.testcontainers.utility.DockerImageName;
import org.testcontainers.utility.DockerLoggerFactory;
import org.testcontainers.utility.ImageNameSubstitutor;
import org.testcontainers.utility.LazyFuture;
import org.testcontainers.utility.TestcontainersConfiguration;

import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

@Slf4j
@ToString
@AllArgsConstructor(access = AccessLevel.PACKAGE)
public class RemoteDockerImage extends LazyFuture<String> {
Expand All @@ -35,7 +38,35 @@ public class RemoteDockerImage extends LazyFuture<String> {
private Future<DockerImageName> imageNameFuture;

@With
private ImagePullPolicy imagePullPolicy = PullPolicy.defaultPolicy();
private ImagePullPolicy imagePullPolicy = getImagePullPolicy();

private ImagePullPolicy getImagePullPolicy() {
String imagePullPolicyClassName = TestcontainersConfiguration.getInstance().getImagePullPolicy();
if (imagePullPolicyClassName != null) {
log.debug("Attempting to instantiate an ImagePullPolicy with class: {}", imagePullPolicyClassName);
ImagePullPolicy configuredInstance;
try {
configuredInstance =
(ImagePullPolicy) Thread
.currentThread()
.getContextClassLoader()
.loadClass(imagePullPolicyClassName)
.getConstructor()
.newInstance();
} catch (Exception e) {
throw new IllegalArgumentException(
"Configured Pull Policy could not be loaded: " + imagePullPolicyClassName,
e
);
}

log.info("Found configured Pull Policy: {}", configuredInstance.getClass());

return configuredInstance;
} else {
return PullPolicy.defaultPolicy();
eddumelendez marked this conversation as resolved.
Show resolved Hide resolved
}
}

@With
private ImageNameSubstitutor imageNameSubstitutor = ImageNameSubstitutor.instance();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,10 @@ public String getImageSubstitutorClassName() {
return getEnvVarOrProperty("image.substitutor", null);
}

public String getImagePullPolicy() {
return getEnvVarOrProperty("pull.policy", null);
}

public Integer getClientPingTimeout() {
return Integer.parseInt(getEnvVarOrProperty("client.ping.timeout", "10"));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.github.dockerjava.api.exception.NotFoundException;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mockito;
import org.testcontainers.DockerClientFactory;
Expand All @@ -10,12 +11,19 @@
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy;
import org.testcontainers.utility.DockerImageName;
import org.testcontainers.utility.FakeImagePullPolicy;
import org.testcontainers.utility.MockTestcontainersConfigurationRule;
import org.testcontainers.utility.TestcontainersConfiguration;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.mockito.ArgumentMatchers.any;

public class ImagePullPolicyTest {

@Rule
public MockTestcontainersConfigurationRule config = new MockTestcontainersConfigurationRule();

@ClassRule
public static DockerRegistryContainer registry = new DockerRegistryContainer();

Expand Down Expand Up @@ -103,6 +111,21 @@ public void shouldNotForcePulling() {
}
}

@Test
public void simpleConfigurationTest() {
Mockito
.doReturn(FakeImagePullPolicy.class.getCanonicalName())
.when(TestcontainersConfiguration.getInstance())
.getImagePullPolicy();

try (GenericContainer<?> container = new GenericContainer<>(imageName).withExposedPorts(8080)) {
container.start();
assertThat(container.getImage())
.asString()
.contains("imagePullPolicy=org.testcontainers.utility.FakeImagePullPolicy");
}
}

private void expectToFailWithNotFoundException(GenericContainer<?> container) {
try {
container.start();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.testcontainers.utility;

import org.testcontainers.images.AbstractImagePullPolicy;
import org.testcontainers.images.ImageData;

public class FakeImagePullPolicy extends AbstractImagePullPolicy {

@Override
protected boolean shouldPullCached(DockerImageName imageName, ImageData localImageData) {
return false;
}
}
Loading