Skip to content

Commit

Permalink
HSEARCH-4674 Use Dockerfiles to create database test containers
Browse files Browse the repository at this point in the history
  • Loading branch information
marko-bekhta committed Nov 8, 2023
1 parent 61c83c2 commit f69a72f
Show file tree
Hide file tree
Showing 13 changed files with 77 additions and 110 deletions.
3 changes: 3 additions & 0 deletions build/container/cockroachdb.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# CockroachDB
# See https://hub.docker.com/r/cockroachdb/cockroach/tags
FROM docker.io/cockroachdb/cockroach:v23.1.11
3 changes: 3 additions & 0 deletions build/container/db2.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# DB2
# See https://hub.docker.com/r/ibmcom/db2/tags
FROM docker.io/ibmcom/db2:11.5.8.0
8 changes: 8 additions & 0 deletions build/container/elasticsearch.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Elasticsearch
# https://hub.docker.com/r/elastic/elasticsearch/tags
#
# IMPORTANT! When updating the version for Ryuk in this Dockerfile,
# make sure to update `version.org.elasticsearch.latest` property in a POM file.
#

FROM docker.io/elastic/elasticsearch:8.10.4
3 changes: 3 additions & 0 deletions build/container/mariadb.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# MariaDB
# See https://hub.docker.com/_/mariadb/tags
FROM docker.io/mariadb:11.1.2
3 changes: 3 additions & 0 deletions build/container/mssql.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# MS SQL Server
# See https://hub.docker.com/_/microsoft-mssql-server
FROM docker.io/mcr.microsoft.com/mssql/server:2022-CU9-ubuntu-20.04
3 changes: 3 additions & 0 deletions build/container/mysql.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# MySQL
# See https://hub.docker.com/_/mysql/tags
FROM docker.io/mysql:8.1.0
3 changes: 3 additions & 0 deletions build/container/opensearch.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# OpenSearch
# See https://hub.docker.com/r/opensearchproject/opensearch/tags
FROM docker.io/opensearchproject/opensearch:2.11.0
3 changes: 3 additions & 0 deletions build/container/oracle.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Oracle
# See https://hub.docker.com/r/gvenzl/oracle-free/tags
FROM docker.io/gvenzl/oracle-free:23.3-slim-faststart
3 changes: 3 additions & 0 deletions build/container/postgresql.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# PostgreSQL
# See https://hub.docker.com/_/postgres
FROM docker.io/postgres:16.0
4 changes: 2 additions & 2 deletions build/parents/build/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1194,8 +1194,8 @@
<org.hibernate.search.integrationtest.backend.elasticsearch.distribution>${test.elasticsearch.distribution}</org.hibernate.search.integrationtest.backend.elasticsearch.distribution>
<org.hibernate.search.integrationtest.backend.elasticsearch.name>${test.searchengine.run.image.name}</org.hibernate.search.integrationtest.backend.elasticsearch.name>
<org.hibernate.search.integrationtest.backend.elasticsearch.tag>${test.searchengine.run.image.tag}</org.hibernate.search.integrationtest.backend.elasticsearch.tag>
<org.hibernate.search.integrationtest.orm.database.image.name>${test.database.run.image.name}</org.hibernate.search.integrationtest.orm.database.image.name>
<org.hibernate.search.integrationtest.orm.database.image.tag>${test.database.run.image.tag}</org.hibernate.search.integrationtest.orm.database.image.tag>
<org.hibernate.search.integrationtest.orm.database.kind>${test.database.run.kind}</org.hibernate.search.integrationtest.orm.database.kind>
<org.hibernate.search.integrationtest.orm.project.root.directory>${rootProject.directory}</org.hibernate.search.integrationtest.orm.project.root.directory>
</systemPropertyVariables>
</configuration>
</plugin>
Expand Down
28 changes: 7 additions & 21 deletions build/parents/integrationtest/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -151,9 +151,7 @@
<properties>
<jdbc.driver.groupId>org.postgresql</jdbc.driver.groupId>
<jdbc.driver.artifactId>postgresql</jdbc.driver.artifactId>
<test.database.run.image.pull>true</test.database.run.image.pull>
<test.database.run.image.name>${test.database.run.postgres.image.name}</test.database.run.image.name>
<test.database.run.image.tag>${test.database.run.postgres.image.tag}</test.database.run.image.tag>
<test.database.run.kind>postgresql</test.database.run.kind>
</properties>
</profile>

Expand All @@ -164,9 +162,7 @@
<properties>
<jdbc.driver.groupId>org.mariadb.jdbc</jdbc.driver.groupId>
<jdbc.driver.artifactId>mariadb-java-client</jdbc.driver.artifactId>
<test.database.run.image.pull>true</test.database.run.image.pull>
<test.database.run.image.name>${test.database.run.mariadb.image.name}</test.database.run.image.name>
<test.database.run.image.tag>${test.database.run.mariadb.image.tag}</test.database.run.image.tag>
<test.database.run.kind>mariadb</test.database.run.kind>
</properties>
</profile>

Expand All @@ -177,9 +173,7 @@
<properties>
<jdbc.driver.groupId>com.mysql</jdbc.driver.groupId>
<jdbc.driver.artifactId>mysql-connector-j</jdbc.driver.artifactId>
<test.database.run.image.pull>true</test.database.run.image.pull>
<test.database.run.image.name>${test.database.run.mysql.image.name}</test.database.run.image.name>
<test.database.run.image.tag>${test.database.run.mysql.image.tag}</test.database.run.image.tag>
<test.database.run.kind>mysql</test.database.run.kind>
</properties>
</profile>

Expand All @@ -190,9 +184,7 @@
<properties>
<jdbc.driver.groupId>com.ibm.db2</jdbc.driver.groupId>
<jdbc.driver.artifactId>jcc</jdbc.driver.artifactId>
<test.database.run.image.pull>true</test.database.run.image.pull>
<test.database.run.image.name>${test.database.run.db2.image.name}</test.database.run.image.name>
<test.database.run.image.tag>${test.database.run.db2.image.tag}</test.database.run.image.tag>
<test.database.run.kind>db2</test.database.run.kind>
</properties>
</profile>

Expand All @@ -203,9 +195,7 @@
<properties>
<jdbc.driver.groupId>com.oracle.database.jdbc</jdbc.driver.groupId>
<jdbc.driver.artifactId>ojdbc11</jdbc.driver.artifactId>
<test.database.run.image.pull>true</test.database.run.image.pull>
<test.database.run.image.name>${test.database.run.oracle.image.name}</test.database.run.image.name>
<test.database.run.image.tag>${test.database.run.oracle.image.tag}</test.database.run.image.tag>
<test.database.run.kind>oracle</test.database.run.kind>
<!-- avoid `ORA-01882: timezone region not found` exception on CI -->
<failsafe.jvm.args.jdbc>-Doracle.jdbc.timezoneAsRegion=false</failsafe.jvm.args.jdbc>
</properties>
Expand All @@ -218,9 +208,7 @@
<properties>
<jdbc.driver.groupId>com.microsoft.sqlserver</jdbc.driver.groupId>
<jdbc.driver.artifactId>mssql-jdbc</jdbc.driver.artifactId>
<test.database.run.image.pull>true</test.database.run.image.pull>
<test.database.run.image.name>${test.database.run.mssql.image.name}</test.database.run.image.name>
<test.database.run.image.tag>${test.database.run.mssql.image.tag}</test.database.run.image.tag>
<test.database.run.kind>mssql</test.database.run.kind>
</properties>
</profile>

Expand All @@ -232,9 +220,7 @@
<!-- CockroachDB uses the same client protocol as PostgreSQL (pgwire), so the driver is the same. -->
<jdbc.driver.groupId>org.postgresql</jdbc.driver.groupId>
<jdbc.driver.artifactId>postgresql</jdbc.driver.artifactId>
<test.database.run.image.pull>true</test.database.run.image.pull>
<test.database.run.image.name>${test.database.run.cockroachdb.image.name}</test.database.run.image.name>
<test.database.run.image.tag>${test.database.run.cockroachdb.image.tag}</test.database.run.image.tag>
<test.database.run.kind>cockroachdb</test.database.run.kind>
</properties>
</profile>
</profiles>
Expand Down
53 changes: 7 additions & 46 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -387,51 +387,9 @@
<test.elasticsearch.run.opensearch.image.name>docker.io/opensearchproject/opensearch</test.elasticsearch.run.opensearch.image.name>
<test.elasticsearch.run.opensearch.image.tag>${test.elasticsearch.version}</test.elasticsearch.run.opensearch.image.tag>

<!-- Test containers ryuk image for container management-->
<test.testcontainers.run.image.name>testcontainers/ryuk</test.testcontainers.run.image.name>
<test.testcontainers.run.image.tag>0.5.1</test.testcontainers.run.image.tag>

<!-- PostgreSQL -->
<!-- See https://hub.docker.com/_/postgres -->
<test.database.run.postgres.skip>true</test.database.run.postgres.skip>
<test.database.run.postgres.image.name>docker.io/postgres</test.database.run.postgres.image.name>
<test.database.run.postgres.image.tag>15.1</test.database.run.postgres.image.tag>
<!-- MariaDB -->
<!-- See https://hub.docker.com/_/mariadb -->
<test.database.run.mariadb.skip>true</test.database.run.mariadb.skip>
<test.database.run.mariadb.image.name>docker.io/mariadb</test.database.run.mariadb.image.name>
<test.database.run.mariadb.image.tag>10.10.2</test.database.run.mariadb.image.tag>
<!-- MySQL -->
<!-- See https://hub.docker.com/_/mysql -->
<test.database.run.mysql.skip>true</test.database.run.mysql.skip>
<test.database.run.mysql.image.name>docker.io/mysql</test.database.run.mysql.image.name>
<test.database.run.mysql.image.tag>8.0.31</test.database.run.mysql.image.tag>
<!-- DB2 -->
<!-- See https://hub.docker.com/r/ibmcom/db2 -->
<test.database.run.db2.skip>true</test.database.run.db2.skip>
<test.database.run.db2.image.name>docker.io/ibmcom/db2</test.database.run.db2.image.name>
<test.database.run.db2.image.tag>11.5.8.0</test.database.run.db2.image.tag>
<!-- Oracle -->
<!-- See https://hub.docker.com/r/gvenzl/oracle-xe -->
<test.database.run.oracle.skip>true</test.database.run.oracle.skip>
<test.database.run.oracle.image.name>docker.io/gvenzl/oracle-xe</test.database.run.oracle.image.name>
<test.database.run.oracle.image.tag>21.3.0-slim-faststart</test.database.run.oracle.image.tag>
<!-- MS SQL Server -->
<!-- See https://hub.docker.com/_/microsoft-mssql-server -->
<test.database.run.mssql.skip>true</test.database.run.mssql.skip>
<test.database.run.mssql.image.name>mcr.microsoft.com/mssql/server</test.database.run.mssql.image.name>
<test.database.run.mssql.image.tag>2019-CU18-ubuntu-20.04</test.database.run.mssql.image.tag>
<!-- CockroachDB -->
<!-- See https://hub.docker.com/r/cockroachdb/cockroach/tags -->
<test.database.run.cockroachdb.skip>true</test.database.run.cockroachdb.skip>
<test.database.run.cockroachdb.image.name>docker.io/cockroachdb/cockroach</test.database.run.cockroachdb.image.name>
<test.database.run.cockroachdb.image.tag>v23.1.4</test.database.run.cockroachdb.image.tag>

<!-- Docker images to be pulled. To be redefined in specific profiles of Elasticsearch/OpenSearch \
or database specific ones. -->
<test.database.run.image.pull>false</test.database.run.image.pull>
<test.database.run.image.name>h2</test.database.run.image.name>
<test.database.run.image.tag></test.database.run.image.tag>
<test.database.run.kind>h2</test.database.run.kind>

<test.elasticsearch.run.image.pull>true</test.elasticsearch.run.image.pull>
<test.elasticsearch.run.image.name></test.elasticsearch.run.image.name>
Expand Down Expand Up @@ -996,9 +954,12 @@
def isTrueString = { string -> string && Boolean.parseBoolean( string ) }
def isNotBlankString = { string -> string?.trim() }
images += '${test.testcontainers.run.image.name}:${test.testcontainers.run.image.tag}'
if ( isTrueString( '${test.database.run.image.pull}' ) && isNotBlankString( '${test.database.run.image.name}' ) ) {
images += '${test.database.run.image.name}:${test.database.run.image.tag}'
if ( isNotBlankString( '${test.database.run.kind}' ) && '${test.database.run.kind}' != 'h2') {
def dockerFileContent = new File('./build/container/${test.database.run.kind}.Dockerfile').text
if ((match = dockerFileContent =~ /FROM (.+)/)) {
def image = match.group(1).trim()
images += image
}
}
if ( isTrueString( '${test.elasticsearch.run.image.pull}' ) && isNotBlankString( '${test.elasticsearch.run.image.name}' ) ) {
images += '${test.elasticsearch.run.image.name}:${test.elasticsearch.run.image.tag}'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,19 @@
*/
package org.hibernate.search.util.impl.integrationtest.mapper.orm;

import java.nio.file.Path;
import java.time.Duration;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.Future;
import java.util.function.Consumer;

import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.Ulimit;

import org.testcontainers.containers.JdbcDatabaseContainer;
import org.testcontainers.utility.DockerImageName;
import org.testcontainers.images.builder.ImageFromDockerfile;

/*
* Suppress "Resource leak: '<unassigned Closeable value>' is never closed". Testcontainers take care of closing
Expand All @@ -40,14 +40,16 @@ private DatabaseContainer() {


static {
String name = System.getProperty( "org.hibernate.search.integrationtest.orm.database.image.name", "" );
String tag = System.getProperty( "org.hibernate.search.integrationtest.orm.database.image.tag" );
String name = System.getProperty( "org.hibernate.search.integrationtest.orm.database.kind", "" );
Path root = Path.of( System.getProperty( "org.hibernate.search.integrationtest.orm.project.root.directory", "" ) );
DATABASE = SupportedDatabase.from( name );

DATABASE_CONTAINER = DATABASE.container( name, tag );
DATABASE_CONTAINER = DATABASE.container(
root.resolve( "build" ).resolve( "container" ).resolve( name + ".Dockerfile" ),
name
);
}


public static Configuration configuration() {
return configure( Configuration::addAsSystemProperties );
}
Expand Down Expand Up @@ -102,7 +104,7 @@ Configuration configuration(JdbcDatabaseContainer<?> container) {
}

@Override
HibernateSearchJdbcDatabaseContainer container(String name, String tag) {
HibernateSearchJdbcDatabaseContainer container(Path dockerfile, String name) {
return null;
}
},
Expand All @@ -113,9 +115,9 @@ String dialect() {
}

@Override
HibernateSearchJdbcDatabaseContainer container(String name, String tag) {
HibernateSearchJdbcDatabaseContainer container(Path dockerfile, String name) {
return new HibernateSearchJdbcDatabaseContainer(
DockerImageName.parse( name ).withTag( tag ),
dockerfile, name,
"org.postgresql.Driver",
"jdbc:postgresql://%s:%d/hibernate_orm_test",
5432,
Expand All @@ -134,9 +136,9 @@ String dialect() {
}

@Override
HibernateSearchJdbcDatabaseContainer container(String name, String tag) {
HibernateSearchJdbcDatabaseContainer container(Path dockerfile, String name) {
return new HibernateSearchJdbcDatabaseContainer(
DockerImageName.parse( name ).withTag( tag ),
dockerfile, name,
"org.mariadb.jdbc.Driver",
"jdbc:mariadb://%s:%d/hibernate_orm_test",
3306,
Expand All @@ -158,9 +160,9 @@ String dialect() {
}

@Override
HibernateSearchJdbcDatabaseContainer container(String name, String tag) {
HibernateSearchJdbcDatabaseContainer container(Path dockerfile, String name) {
return new HibernateSearchJdbcDatabaseContainer(
DockerImageName.parse( name ).withTag( tag ),
dockerfile, name,
"com.mysql.jdbc.Driver",
"jdbc:mysql://%s:%d/hibernate_orm_test",
3306,
Expand All @@ -182,9 +184,9 @@ String dialect() {
}

@Override
HibernateSearchJdbcDatabaseContainer container(String name, String tag) {
HibernateSearchJdbcDatabaseContainer container(Path dockerfile, String name) {
return new HibernateSearchJdbcDatabaseContainer(
DockerImageName.parse( name ).withTag( tag ),
dockerfile, name,
"com.ibm.db2.jcc.DB2Driver",
"jdbc:db2://%s:%d/hreact",
50000,
Expand Down Expand Up @@ -214,11 +216,11 @@ String dialect() {
}

@Override
HibernateSearchJdbcDatabaseContainer container(String name, String tag) {
HibernateSearchJdbcDatabaseContainer container(Path dockerfile, String name) {
return new HibernateSearchJdbcDatabaseContainer(
DockerImageName.parse( name ).withTag( tag ),
dockerfile, name,
"oracle.jdbc.OracleDriver",
"jdbc:oracle:thin:@%s:%d/XE",
"jdbc:oracle:thin:@%s:%d/FREEPDB1",
1521,
"SYSTEM",
"hibernate_orm_test",
Expand All @@ -234,9 +236,9 @@ String dialect() {
}

@Override
HibernateSearchJdbcDatabaseContainer container(String name, String tag) {
HibernateSearchJdbcDatabaseContainer container(Path dockerfile, String name) {
return new HibernateSearchJdbcDatabaseContainer(
DockerImageName.parse( name ).withTag( tag ),
dockerfile, name,
"com.microsoft.sqlserver.jdbc.SQLServerDriver",
"jdbc:sqlserver://%s:%d;databaseName=tempdb",
1433,
Expand All @@ -255,9 +257,9 @@ String dialect() {
}

@Override
HibernateSearchJdbcDatabaseContainer container(String name, String tag) {
HibernateSearchJdbcDatabaseContainer container(Path dockerfile, String name) {
return new HibernateSearchJdbcDatabaseContainer(
DockerImageName.parse( name ).withTag( tag ),
dockerfile, name,
"org.postgresql.Driver",
"jdbc:postgresql://%s:%d/defaultdb?sslmode=disable",
26257,
Expand Down Expand Up @@ -289,7 +291,7 @@ Configuration configuration(JdbcDatabaseContainer<?> container) {

abstract String dialect();

abstract HibernateSearchJdbcDatabaseContainer container(String name, String tag);
abstract HibernateSearchJdbcDatabaseContainer container(Path dockerfile, String name);

static SupportedDatabase from(String name) {
for ( SupportedDatabase database : values() ) {
Expand All @@ -311,31 +313,18 @@ private static class HibernateSearchJdbcDatabaseContainer
private final String password;
private final String testQueryString;

public HibernateSearchJdbcDatabaseContainer(Future<String> image, String driverClassName, String jdbcUrlPattern,
public HibernateSearchJdbcDatabaseContainer(Path dockerfile, String name, String driverClassName, String jdbcUrlPattern,
int port, String username, String password, String testQueryString) {
super( image );
// IMPORTANT: we do not want to delete the image on exit as then we cannot use container reuse.
// (these two options are somewhat mutually exclusive).
super( new ImageFromDockerfile( "hibernate-search-" + name, false ).withDockerfile( dockerfile ) );
this.driverClassName = driverClassName;
this.jdbcUrlPattern = jdbcUrlPattern;
this.port = port;
this.username = username;
this.password = password;
this.testQueryString = testQueryString;
posInit();
}

public HibernateSearchJdbcDatabaseContainer(DockerImageName dockerImageName, String driverClassName,
String jdbcUrlPattern, int port, String username, String password, String testQueryString) {
super( dockerImageName );
this.driverClassName = driverClassName;
this.jdbcUrlPattern = jdbcUrlPattern;
this.port = port;
this.username = username;
this.password = password;
this.testQueryString = testQueryString;
posInit();
}

private void posInit() {
withExposedPorts( port );
withReuse( true );
withStartupTimeout( REGULAR_TIMEOUT );
Expand Down Expand Up @@ -412,5 +401,4 @@ private void addAsSpringSystemProperties() {
System.setProperty( "JDBC_ISOLATION", this.isolation );
}
}

}

0 comments on commit f69a72f

Please sign in to comment.