Refactor TestcontainersCassandraConfiguration class to use the springci cached Java 17/Cassandra-3.11 Docker Image in VMW Harbor Proxy.

This commit is contained in:
John Blum
2023-05-13 10:35:18 -07:00
parent 29187eb3e3
commit 2c69d9dff5
2 changed files with 47 additions and 14 deletions

View File

@@ -68,11 +68,15 @@ import example.app.crm.model.Customer;
public class TestcontainersCassandraConfiguration extends TestCassandraConfiguration { public class TestcontainersCassandraConfiguration extends TestCassandraConfiguration {
// Apache Cassandra Constants // Apache Cassandra Constants
private static final String CASSANDRA_VERSION = System.getProperty("cassandra.version", "3.11.15"); private static final String CASSANDRA_VERSION = System.getProperty("cassandra.version", "3.11.14");
private static final String LOCAL_DATACENTER_NAME = System.getProperty("cassandra.datacenter.name", "datacenter1"); private static final String LOCAL_DATACENTER_NAME = System.getProperty("cassandra.datacenter.name", "datacenter1");
// Java (JVM/JRE) Constants
private static final String SPRING_JAVA_VERSION = System.getProperty("spring.java.version", "17.0.6_10-jdk-focal");
// Testcontainers Constants // Testcontainers Constants
private static final String TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX = "harbor-repo.vmware.com/dockerhub-proxy-cache/"; private static final String TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX = "harbor-repo.vmware.com/dockerhub-proxy-cache/";
private static final String TESTCONTAINERS_SPRINGCI_HUB_IMAGE_NAME_PREFIX = TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX.concat("springci/");
private static final String TESTCONTAINERS_HTTPS_PROXY = String.format("https://%s", TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX); private static final String TESTCONTAINERS_HTTPS_PROXY = String.format("https://%s", TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX);
private static final String TESTCONTAINERS_PULL_PAUSE_TIMEOUT = "5"; // 5 seconds private static final String TESTCONTAINERS_PULL_PAUSE_TIMEOUT = "5"; // 5 seconds
private static final String TESTCONTAINERS_RYUK_DISABLED = "true"; private static final String TESTCONTAINERS_RYUK_DISABLED = "true";
@@ -82,14 +86,16 @@ public class TestcontainersCassandraConfiguration extends TestCassandraConfigura
private static final DockerImageName CASSANDRA_DOCKER_IMAGE_NAME = private static final DockerImageName CASSANDRA_DOCKER_IMAGE_NAME =
DockerImageName.parse(String.format("cassandra:%s", CASSANDRA_VERSION)); DockerImageName.parse(String.format("cassandra:%s", CASSANDRA_VERSION));
//private static final DockerImageName CASSANDRA_DOCKER_IMAGE_NAME = //private static final DockerImageName CASSANDRA_DOCKER_IMAGE_NAME =
// DockerImageName.parse(String.format("%scassandra:3.11.15", TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX)); // DockerImageName.parse(String.format("%1$sspring-data-with-cassandra-3.11:%2$s",
// TESTCONTAINERS_SPRINGCI_HUB_IMAGE_NAME_PREFIX, SPRING_JAVA_VERSION))
// .asCompatibleSubstituteFor("cassandra");
private final Logger logger = LoggerFactory.getLogger(getClass()); private final Logger logger = LoggerFactory.getLogger(getClass());
@Bean("CassandraContainer") @Bean("CassandraContainer")
GenericContainer<?> cassandraContainer(Environment environment) { GenericContainer<?> cassandraContainer(Environment environment) {
GenericContainer<?> cassandraContainer = newEnvironmentOptimizedCassandraContainer(environment); GenericContainer<?> cassandraContainer = newEnvironmentCustomizedCassandraContainer(environment);
cassandraContainer.start(); cassandraContainer.start();
cassandraContainer.followOutput(new Slf4jLogConsumer(getLogger())); cassandraContainer.followOutput(new Slf4jLogConsumer(getLogger()));
@@ -139,7 +145,7 @@ public class TestcontainersCassandraConfiguration extends TestCassandraConfigura
.withReuse(true); .withReuse(true);
} }
private @NonNull GenericContainer<?> newEnvironmentOptimizedCassandraContainer(@NonNull Environment environment) { private @NonNull GenericContainer<?> newEnvironmentCustomizedCassandraContainer(@NonNull Environment environment) {
return withCassandraEnvironmentConfiguration(newCassandraContainer(environment), environment); return withCassandraEnvironmentConfiguration(newCassandraContainer(environment), environment);
} }
@@ -156,7 +162,7 @@ public class TestcontainersCassandraConfiguration extends TestCassandraConfigura
} }
private boolean isJenkinsEnvironment() { private boolean isJenkinsEnvironment() {
return Boolean.TRUE.equals(Boolean.getBoolean("jenkins")); return Boolean.getBoolean("jenkins");
} }
private boolean isNotJenkinsEnvironment() { private boolean isNotJenkinsEnvironment() {
@@ -169,7 +175,7 @@ public class TestcontainersCassandraConfiguration extends TestCassandraConfigura
return isNotJenkinsEnvironment() return isNotJenkinsEnvironment()
? cassandraContainer.withEnv("TESTCONTAINERS_RYUK_DISABLED", TESTCONTAINERS_RYUK_DISABLED) ? cassandraContainer.withEnv("TESTCONTAINERS_RYUK_DISABLED", TESTCONTAINERS_RYUK_DISABLED)
.withEnv("TESTCONTAINERS_PULL_PAUSE_TIMEOUT", TESTCONTAINERS_PULL_PAUSE_TIMEOUT) .withEnv("TESTCONTAINERS_PULL_PAUSE_TIMEOUT", TESTCONTAINERS_PULL_PAUSE_TIMEOUT)
: cassandraContainer.withEnv("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX) : cassandraContainer.withEnv("TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX", TESTCONTAINERS_SPRINGCI_HUB_IMAGE_NAME_PREFIX)
.withEnv("TESTCONTAINERS_PULL_PAUSE_TIMEOUT", TESTCONTAINERS_PULL_PAUSE_TIMEOUT); .withEnv("TESTCONTAINERS_PULL_PAUSE_TIMEOUT", TESTCONTAINERS_PULL_PAUSE_TIMEOUT);
//: cassandraContainer; //: cassandraContainer;
} }

View File

@@ -15,6 +15,8 @@
*/ */
package example.app.crm.config.testcontainers; package example.app.crm.config.testcontainers;
import org.springframework.lang.NonNull;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.DockerImageName;
@@ -24,6 +26,7 @@ import org.testcontainers.utility.ImageNameSubstitutor;
* Testcontainers {@link ImageNameSubstitutor} for {@literal VMware Harbor Proxy}. * Testcontainers {@link ImageNameSubstitutor} for {@literal VMware Harbor Proxy}.
* *
* @author John Blum * @author John Blum
* @see org.testcontainers.utility.DockerImageName
* @see org.testcontainers.utility.ImageNameSubstitutor * @see org.testcontainers.utility.ImageNameSubstitutor
* @see <a href="https://github.com/testcontainers/testcontainers-java/issues/4605">Image Name Substitution not applied for DockerComposeContainers</a> * @see <a href="https://github.com/testcontainers/testcontainers-java/issues/4605">Image Name Substitution not applied for DockerComposeContainers</a>
* @since 1.7.6 * @since 1.7.6
@@ -34,15 +37,24 @@ public class VmwHarborProxyImageNameSubstitutor extends ImageNameSubstitutor {
private static final String VMWARE_HARBOR_PROXY_URL = "harbor-repo.vmware.com"; private static final String VMWARE_HARBOR_PROXY_URL = "harbor-repo.vmware.com";
private static final String TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX = private static final String TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX =
String.format("%s/dockerhub-proxy-cache/", VMWARE_HARBOR_PROXY_URL); VMWARE_HARBOR_PROXY_URL.concat("/dockerhub-proxy-cache/");
private static final String TESTCONTAINERS_HUB_IMAGE_NAME_TEMPLATE = private static final String TESTCONTAINERS_SPRINGCI_HUB_IMAGE_NAME_PREFIX =
TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX.concat("%s"); TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX.concat("springci/");
private static final String TESTCONTAINERS_SPRINGCI_HUB_IMAGE_NAME_TEMPLATE =
TESTCONTAINERS_SPRINGCI_HUB_IMAGE_NAME_PREFIX.concat("%s");
private static final String SPRING_JAVA_VERSION =
System.getProperty("spring.java.version", "17.0.6_10-jdk-focal");
private static final String SPRING_DATA_CASSANDRA_DOCKER_IMAGE_NAME =
String.format("spring-data-with-cassandra-3.11:%s", SPRING_JAVA_VERSION);
private final Logger logger = LoggerFactory.getLogger(getClass()); private final Logger logger = LoggerFactory.getLogger(getClass());
@Override @Override
public DockerImageName apply(DockerImageName original) { public @NonNull DockerImageName apply(@NonNull DockerImageName original) {
logInfo("Is Jenkins Environment [{}]", isJenkinsEnvironment()); logInfo("Is Jenkins Environment [{}]", isJenkinsEnvironment());
@@ -52,7 +64,11 @@ public class VmwHarborProxyImageNameSubstitutor extends ImageNameSubstitutor {
logInfo("Original Docker Image Name [%s]", originalDockerImageName); logInfo("Original Docker Image Name [%s]", originalDockerImageName);
logInfo("Resolved Docker Image Name [{}]", resolvedDockerImageName); logInfo("Resolved Docker Image Name [{}]", resolvedDockerImageName);
return DockerImageName.parse(resolvedDockerImageName); DockerImageName dockerImageName = DockerImageName.parse(resolvedDockerImageName);
return dockerImageName.asCanonicalNameString().contains("cassandra")
? dockerImageName.asCompatibleSubstituteFor("cassandra")
: dockerImageName;
} }
private boolean isJenkinsEnvironment() { private boolean isJenkinsEnvironment() {
@@ -64,16 +80,27 @@ public class VmwHarborProxyImageNameSubstitutor extends ImageNameSubstitutor {
String resolvedDockerImageName = originalDockerImageName; String resolvedDockerImageName = originalDockerImageName;
if (originalDockerImageName.contains(VMWARE_HARBOR_PROXY_URL)) { if (originalDockerImageName.contains(VMWARE_HARBOR_PROXY_URL)) {
originalDockerImageName = originalDockerImageName.substring(TESTCONTAINERS_HUB_IMAGE_NAME_PREFIX.length() - 1); logInfo("VMware Harbor Proxy URL detected");
resolvedDockerImageName = String.format(TESTCONTAINERS_HUB_IMAGE_NAME_TEMPLATE, originalDockerImageName); originalDockerImageName = originalDockerImageName.substring(originalDockerImageName.lastIndexOf("/") + 1);
resolvedDockerImageName = String.format(TESTCONTAINERS_SPRINGCI_HUB_IMAGE_NAME_TEMPLATE,
substituteCassandraDockerImageName(originalDockerImageName));
} }
else if (isJenkinsEnvironment()) { else if (isJenkinsEnvironment()) {
resolvedDockerImageName = String.format(TESTCONTAINERS_HUB_IMAGE_NAME_TEMPLATE, originalDockerImageName); logInfo("VMware Jenkins CI environment detected");
resolvedDockerImageName = String.format(TESTCONTAINERS_SPRINGCI_HUB_IMAGE_NAME_TEMPLATE,
substituteCassandraDockerImageName(originalDockerImageName));
} }
return resolvedDockerImageName; return resolvedDockerImageName;
} }
private String substituteCassandraDockerImageName(String originalDockerImageName) {
return originalDockerImageName.contains("cassandra")
? SPRING_DATA_CASSANDRA_DOCKER_IMAGE_NAME
: originalDockerImageName;
}
@Override @Override
protected String getDescription() { protected String getDescription() {
return "VMware Harbor Proxy Image Name Substitutor"; return "VMware Harbor Proxy Image Name Substitutor";