Distinguish between official (library) and non-official Docker Images in VMware Harbor Proxy (DockerHub cache).
This commit is contained in:
@@ -40,8 +40,9 @@ import org.testcontainers.utility.ImageNameSubstitutor;
|
||||
@SuppressWarnings("unused")
|
||||
public class VmwHarborProxyImageNameSubstitutor extends ImageNameSubstitutor {
|
||||
|
||||
private static final String CASSANDRA_KEYWORD = "cassandra";
|
||||
private static final String JENKINS_KEYWORD = "jenkins";
|
||||
static final String CASSANDRA_KEYWORD = "cassandra";
|
||||
static final String JENKINS_KEYWORD = "jenkins";
|
||||
static final String TEST_DOCKER_IMAGE = "test_docker_image";
|
||||
|
||||
// VMware Harbor Proxy (DockerHub Proxy Cache) Configuration
|
||||
private static final String VMWARE_HARBOR_PROXY_URL = "harbor-repo.vmware.com";
|
||||
@@ -52,11 +53,17 @@ public class VmwHarborProxyImageNameSubstitutor extends ImageNameSubstitutor {
|
||||
private static final String TESTCONTAINERS_NAMESPACE = "library/";
|
||||
|
||||
private static final String TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX =
|
||||
TESTCONTAINERS_REGISTRY.concat(TESTCONTAINERS_REPOSITORY).concat(TESTCONTAINERS_NAMESPACE);
|
||||
TESTCONTAINERS_REGISTRY.concat(TESTCONTAINERS_REPOSITORY);
|
||||
|
||||
protected static final String TESTCONTAINERS_HUB_IMAGE_NAME_TEMPLATE =
|
||||
TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX.concat("%s");
|
||||
|
||||
private static final String TESTCONTAINERS_OFFICIAL_HUB_IMAGE_NAME_PREFIX =
|
||||
TESTCONTAINERS_REGISTRY.concat(TESTCONTAINERS_REPOSITORY).concat(TESTCONTAINERS_NAMESPACE);
|
||||
|
||||
protected static final String TESTCONTAINERS_OFFICIAL_HUB_IMAGE_NAME_TEMPLATE =
|
||||
TESTCONTAINERS_OFFICIAL_HUB_IMAGE_NAME_PREFIX.concat("%s");
|
||||
|
||||
private static final String TESTCONTAINERS_SPRINGCI_HUB_IMAGE_NAME_PREFIX =
|
||||
TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX.concat("springci/");
|
||||
|
||||
@@ -74,11 +81,16 @@ public class VmwHarborProxyImageNameSubstitutor extends ImageNameSubstitutor {
|
||||
protected static final String DOCKER_IMAGE_NAME_WITH_VERSION_TEMPLATE = "%1$s:%2$s";
|
||||
|
||||
private static final Map<String, String> springManagedDockerImages = new ConcurrentHashMap<>();
|
||||
private static final Map<String, String> vmwHarborProxyOfficialDockerImages = new ConcurrentHashMap<>();
|
||||
|
||||
static {
|
||||
springManagedDockerImages.put(CASSANDRA_KEYWORD, SPRING_DATA_CASSANDRA_DOCKER_IMAGE_NAME);
|
||||
vmwHarborProxyOfficialDockerImages.put(CASSANDRA_KEYWORD, TESTCONTAINERS_OFFICIAL_HUB_IMAGE_NAME_TEMPLATE);
|
||||
vmwHarborProxyOfficialDockerImages.put(TEST_DOCKER_IMAGE, TESTCONTAINERS_OFFICIAL_HUB_IMAGE_NAME_TEMPLATE);
|
||||
}
|
||||
|
||||
private static final boolean IS_JENKINS_ENVIRONMENT = Boolean.getBoolean(JENKINS_KEYWORD);
|
||||
|
||||
private static final boolean USE_SPRING_MANAGED_DOCKER_IMAGES =
|
||||
Boolean.getBoolean("use-spring-managed-docker-images");
|
||||
|
||||
@@ -96,17 +108,31 @@ public class VmwHarborProxyImageNameSubstitutor extends ImageNameSubstitutor {
|
||||
}
|
||||
|
||||
protected boolean isJenkinsEnvironment() {
|
||||
return Boolean.getBoolean(JENKINS_KEYWORD);
|
||||
return IS_JENKINS_ENVIRONMENT;
|
||||
}
|
||||
|
||||
protected boolean isSpringManagedDockerImage(DockerImageName dockerImageName) {
|
||||
|
||||
return USE_SPRING_MANAGED_DOCKER_IMAGES
|
||||
return isUseSpringManagedDockerImages()
|
||||
&& (isJenkinsEnvironment() && springManagedDockerImages.containsKey(dockerImageName.getUnversionedPart()));
|
||||
}
|
||||
|
||||
protected boolean isVMwareHarborProxyAvailable(DockerImageName dockerImageName) {
|
||||
return isJenkinsEnvironment() || dockerImageName.getRegistry().contains(VMWARE_HARBOR_PROXY_URL);
|
||||
protected boolean isUseSpringManagedDockerImages() {
|
||||
return USE_SPRING_MANAGED_DOCKER_IMAGES;
|
||||
}
|
||||
|
||||
protected boolean isVMwareHarborProxyAvailable() {
|
||||
return isJenkinsEnvironment();
|
||||
}
|
||||
|
||||
protected boolean isVMwareHarborProxyManagedDockerImage(DockerImageName dockerImageName) {
|
||||
return isVMwareHarborProxyAvailable() || dockerImageName.getRegistry().contains(VMWARE_HARBOR_PROXY_URL);
|
||||
}
|
||||
|
||||
protected boolean isVmwareHarborProxyOfficialDockerImage(DockerImageName dockerImageName) {
|
||||
|
||||
return isVMwareHarborProxyAvailable() && vmwHarborProxyOfficialDockerImages
|
||||
.containsKey(toUnqualifiedDockerImageName(dockerImageName).getUnversionedPart());
|
||||
}
|
||||
|
||||
protected DockerImageName resolveCompatibleSubstituteFor(DockerImageName dockerImageName) {
|
||||
@@ -122,7 +148,7 @@ public class VmwHarborProxyImageNameSubstitutor extends ImageNameSubstitutor {
|
||||
|
||||
DockerImageName resolvedDockerImageName = originalDockerImageName;
|
||||
|
||||
if (isVMwareHarborProxyAvailable(originalDockerImageName)) {
|
||||
if (isVMwareHarborProxyManagedDockerImage(originalDockerImageName)) {
|
||||
logInfo("VMware Harbor Proxy detected [{}]", originalDockerImageName);
|
||||
originalDockerImageName = toUnqualifiedDockerImageName(originalDockerImageName);
|
||||
resolvedDockerImageName = doResolveDockerImageName(originalDockerImageName);
|
||||
@@ -134,11 +160,19 @@ public class VmwHarborProxyImageNameSubstitutor extends ImageNameSubstitutor {
|
||||
DockerImageName doResolveDockerImageName(DockerImageName originalDockerImageName) {
|
||||
|
||||
return Optional.ofNullable(originalDockerImageName)
|
||||
.filter(dockerImageName -> isUseSpringManagedDockerImages())
|
||||
.filter(dockerImageName -> springManagedDockerImages.containsKey(dockerImageName.getUnversionedPart()))
|
||||
.map(dockerImageName -> springManagedDockerImages.get(dockerImageName.getUnversionedPart()))
|
||||
.map(springManagedDockerImageName -> String.format(TESTCONTAINERS_SPRINGCI_HUB_IMAGE_NAME_TEMPLATE, springManagedDockerImageName))
|
||||
.map(DockerImageName::parse)
|
||||
.orElseGet(() -> DockerImageName.parse(String.format(TESTCONTAINERS_HUB_IMAGE_NAME_TEMPLATE, originalDockerImageName)));
|
||||
.orElseGet(() -> {
|
||||
|
||||
DockerImageName unqualifiedDockerImageName = toUnqualifiedDockerImageName(originalDockerImageName);
|
||||
|
||||
return isVmwareHarborProxyOfficialDockerImage(unqualifiedDockerImageName)
|
||||
? DockerImageName.parse(String.format(TESTCONTAINERS_OFFICIAL_HUB_IMAGE_NAME_TEMPLATE, originalDockerImageName))
|
||||
: DockerImageName.parse(String.format(TESTCONTAINERS_HUB_IMAGE_NAME_TEMPLATE, originalDockerImageName));
|
||||
});
|
||||
}
|
||||
|
||||
DockerImageName toUnqualifiedDockerImageName(DockerImageName dockerImageName) {
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
package example.app.crm.config.testcontainers;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@@ -26,6 +28,7 @@ import org.testcontainers.utility.DockerImageName;
|
||||
*
|
||||
* @author John Blum
|
||||
* @see org.junit.Test
|
||||
* @see org.mockito.Mockito
|
||||
* @see example.app.crm.config.testcontainers.VmwHarborProxyImageNameSubstitutor
|
||||
* @since 1.7.6
|
||||
*/
|
||||
@@ -36,7 +39,10 @@ public class VmwHarborProxyImageNameSubstitutorUnitTests {
|
||||
|
||||
DockerImageName cassandraDockerImage = DockerImageName.parse("cassandra:3.11.14");
|
||||
|
||||
VmwHarborProxyImageNameSubstitutor imageNameSubstitutor = new VmwHarborProxyImageNameSubstitutor();
|
||||
VmwHarborProxyImageNameSubstitutor imageNameSubstitutor = spy(new VmwHarborProxyImageNameSubstitutor());
|
||||
|
||||
doReturn(true).when(imageNameSubstitutor).isJenkinsEnvironment();
|
||||
doReturn(true).when(imageNameSubstitutor).isUseSpringManagedDockerImages();
|
||||
|
||||
assertThat(imageNameSubstitutor.doResolveDockerImageName(cassandraDockerImage)
|
||||
.asCanonicalNameString())
|
||||
@@ -45,11 +51,14 @@ public class VmwHarborProxyImageNameSubstitutorUnitTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void doResolveDockerImageNameForNonSpringManagedDockerImage() {
|
||||
public void doResolveDockerImageNameForNonSpringManagedNonOfficialDockerImage() {
|
||||
|
||||
DockerImageName cassandraDockerImage = DockerImageName.parse("testcontainers/ryuk:0.4.0");
|
||||
|
||||
VmwHarborProxyImageNameSubstitutor imageNameSubstitutor = new VmwHarborProxyImageNameSubstitutor();
|
||||
VmwHarborProxyImageNameSubstitutor imageNameSubstitutor = spy(new VmwHarborProxyImageNameSubstitutor());
|
||||
|
||||
doReturn(true).when(imageNameSubstitutor).isJenkinsEnvironment();
|
||||
doReturn(true).when(imageNameSubstitutor).isUseSpringManagedDockerImages();
|
||||
|
||||
assertThat(imageNameSubstitutor.doResolveDockerImageName(cassandraDockerImage)
|
||||
.asCanonicalNameString())
|
||||
@@ -57,6 +66,22 @@ public class VmwHarborProxyImageNameSubstitutorUnitTests {
|
||||
"testcontainers/ryuk:0.4.0"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void doResolveDockerImageNameForNonSpringManagedOfficialDockerImage() {
|
||||
|
||||
DockerImageName cassandraDockerImage = DockerImageName.parse(VmwHarborProxyImageNameSubstitutor.TEST_DOCKER_IMAGE);
|
||||
|
||||
VmwHarborProxyImageNameSubstitutor imageNameSubstitutor = spy(new VmwHarborProxyImageNameSubstitutor());
|
||||
|
||||
doReturn(true).when(imageNameSubstitutor).isJenkinsEnvironment();
|
||||
doReturn(true).when(imageNameSubstitutor).isUseSpringManagedDockerImages();
|
||||
|
||||
assertThat(imageNameSubstitutor.doResolveDockerImageName(cassandraDockerImage)
|
||||
.asCanonicalNameString())
|
||||
.isEqualTo(String.format(VmwHarborProxyImageNameSubstitutor.TESTCONTAINERS_OFFICIAL_HUB_IMAGE_NAME_TEMPLATE,
|
||||
VmwHarborProxyImageNameSubstitutor.TEST_DOCKER_IMAGE.concat(":latest")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void toUnqualifiedDockerImageNameFromQualifiedName() {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user