diff --git a/spring-geode-project/spring-geode/src/test/java/example/app/crm/config/testcontainers/VmwHarborProxyImageNameSubstitutor.java b/spring-geode-project/spring-geode/src/test/java/example/app/crm/config/testcontainers/VmwHarborProxyImageNameSubstitutor.java index 40ff2539..77c52b20 100644 --- a/spring-geode-project/spring-geode/src/test/java/example/app/crm/config/testcontainers/VmwHarborProxyImageNameSubstitutor.java +++ b/spring-geode-project/spring-geode/src/test/java/example/app/crm/config/testcontainers/VmwHarborProxyImageNameSubstitutor.java @@ -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 springManagedDockerImages = new ConcurrentHashMap<>(); + private static final Map 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) { diff --git a/spring-geode-project/spring-geode/src/test/java/example/app/crm/config/testcontainers/VmwHarborProxyImageNameSubstitutorUnitTests.java b/spring-geode-project/spring-geode/src/test/java/example/app/crm/config/testcontainers/VmwHarborProxyImageNameSubstitutorUnitTests.java index c306b92d..c5a3e0fb 100644 --- a/spring-geode-project/spring-geode/src/test/java/example/app/crm/config/testcontainers/VmwHarborProxyImageNameSubstitutorUnitTests.java +++ b/spring-geode-project/spring-geode/src/test/java/example/app/crm/config/testcontainers/VmwHarborProxyImageNameSubstitutorUnitTests.java @@ -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() {