Skip to content

Commit a848498

Browse files
authored
Merge pull request #9390 from Sanne/multitenancy-ci
Enable Hibernate ORM multitenancy IT on CI
2 parents caf9ad1 + 3201928 commit a848498

File tree

9 files changed

+38
-23
lines changed

9 files changed

+38
-23
lines changed

.github/workflows/ci-actions.yml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ on:
3434
env:
3535
# Workaround testsuite locale issue
3636
LANG: en_US.UTF-8
37-
NATIVE_TEST_MAVEN_OPTS: "-B --settings .github/mvn-settings.xml --fail-at-end -Dquarkus.native.container-build=true -Dquarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-native-image:19.3.1-java11 -Dtest-postgresql -Dtest-elasticsearch -Dtest-keycloak -Dtest-amazon-services -Dtest-mysql -Dtest-mariadb -Dmariadb.url='jdbc:mariadb://localhost:3308/hibernate_orm_test' -Dtest-mssql -Dtest-vault -Dtest-neo4j -Dtest-kafka -Dnative-image.xmx=5g -Dnative -Dformat.skip install"
38-
JVM_TEST_MAVEN_OPTS: "-e -B --settings .github/mvn-settings.xml -Dtest-postgresql -Dtest-elasticsearch -Dtest-mysql -Dtest-mariadb -Dmariadb.url='jdbc:mariadb://localhost:3308/hibernate_orm_test' -Dtest-mssql -Dtest-amazon-services -Dtest-vault -Dtest-neo4j -Dtest-kafka -Dtest-keycloak -Dformat.skip"
37+
NATIVE_TEST_MAVEN_OPTS: "-B --settings .github/mvn-settings.xml --fail-at-end -Dquarkus.native.container-build=true -Dquarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-native-image:19.3.1-java11 -Dtest-postgresql -Dtest-elasticsearch -Dtest-keycloak -Dtest-amazon-services -Dtest-mysql -Dtest-mariadb -Dmariadb.base_url='jdbc:mariadb://localhost:3308' -Dmariadb.url='jdbc:mariadb://localhost:3308/hibernate_orm_test' -Dtest-mssql -Dtest-vault -Dtest-neo4j -Dtest-kafka -Dnative-image.xmx=5g -Dnative -Dformat.skip install"
38+
JVM_TEST_MAVEN_OPTS: "-e -B --settings .github/mvn-settings.xml -Dtest-postgresql -Dtest-elasticsearch -Dtest-mysql -Dtest-mariadb -Dmariadb.base_url='jdbc:mariadb://localhost:3308' -Dmariadb.url='jdbc:mariadb://localhost:3308/hibernate_orm_test' -Dtest-mssql -Dtest-amazon-services -Dtest-vault -Dtest-neo4j -Dtest-kafka -Dtest-keycloak -Dformat.skip"
3939
DB_USER: hibernate_orm_test
4040
DB_PASSWORD: hibernate_orm_test
4141
DB_NAME: hibernate_orm_test
@@ -144,7 +144,7 @@ jobs:
144144
MYSQL_USER: hibernate_orm_test
145145
MYSQL_PASSWORD: hibernate_orm_test
146146
MYSQL_DATABASE: hibernate_orm_test
147-
MYSQL_RANDOM_ROOT_PASSWORD: true
147+
MYSQL_ROOT_PASSWORD: secret
148148
ports:
149149
- 127.0.0.1:3308:3306
150150
mssql:
@@ -320,6 +320,7 @@ jobs:
320320
jpa-mssql
321321
jpa-derby
322322
jpa-without-entity
323+
hibernate-tenancy
323324
- category: Data2
324325
mysql: "true"
325326
postgres: "true"
@@ -476,7 +477,7 @@ jobs:
476477
- name: Maria DB Service
477478
run: |
478479
docker run --rm --publish 3308:3306 --name build-mariadb \
479-
-e MYSQL_USER=$DB_USER -e MYSQL_PASSWORD=$DB_PASSWORD -e MYSQL_DATABASE=$DB_NAME -e MYSQL_RANDOM_ROOT_PASSWORD=true \
480+
-e MYSQL_USER=$DB_USER -e MYSQL_PASSWORD=$DB_PASSWORD -e MYSQL_DATABASE=$DB_NAME -e MYSQL_ROOT_PASSWORD=secret \
480481
-d mariadb:10.4
481482
if: matrix.mariadb
482483
- name: MS-SQL Service

extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/DataSourceTenantConnectionResolver.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,6 @@ private static AgroalDataSource tenantDataSource(JPAConfig jpaConfig, String ten
8989

9090
private static class TenantConnectionProvider extends QuarkusConnectionProvider {
9191

92-
private static final long serialVersionUID = 1L;
93-
9492
private final String tenantId;
9593

9694
public TenantConnectionProvider(String tenantId, AgroalDataSource dataSource) {

extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/HibernateCurrentTenantIdentifierResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* @author Michael Schnell
1313
*
1414
*/
15-
public class HibernateCurrentTenantIdentifierResolver implements CurrentTenantIdentifierResolver {
15+
public final class HibernateCurrentTenantIdentifierResolver implements CurrentTenantIdentifierResolver {
1616

1717
private static final Logger LOG = Logger.getLogger(HibernateCurrentTenantIdentifierResolver.class);
1818

extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/HibernateMultiTenantConnectionProvider.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
* @author Michael Schnell
1717
*
1818
*/
19-
public class HibernateMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider {
19+
public final class HibernateMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider {
2020

2121
private static final Logger LOG = Logger.getLogger(HibernateMultiTenantConnectionProvider.class);
2222

@@ -33,12 +33,14 @@ protected ConnectionProvider getAnyConnectionProvider() {
3333
}
3434

3535
@Override
36-
protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) {
36+
protected ConnectionProvider selectConnectionProvider(final String tenantIdentifier) {
3737
LOG.debugv("selectConnectionProvider({0})", tenantIdentifier);
3838

3939
ConnectionProvider provider = providerMap.get(tenantIdentifier);
4040
if (provider == null) {
41-
return providerMap.computeIfAbsent(tenantIdentifier, tid -> resolveConnectionProvider(tid));
41+
final ConnectionProvider connectionProvider = resolveConnectionProvider(tenantIdentifier);
42+
providerMap.put(tenantIdentifier, connectionProvider);
43+
return connectionProvider;
4244
}
4345
return provider;
4446

integration-tests/hibernate-tenancy/README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,22 @@ You can then run the tests as follows (either with `-Dnative` or not):
2727
mvn clean install -Dtest-mariadb
2828
```
2929

30-
If you have specific requirements, you can define a specific connection URL with `-Djdbc:mariadb://localhost:3306/hibernate_orm_test`.
30+
If you have specific requirements, you can define a specific connection URL with `-Dmariadb.base_url=jdbc:mariadb://...`.
31+
Note that this specific integration test module module requires permissions to create additional users and databases, hence the `mariadb.base_url` variable
32+
should not include the database name: check the `application.properties` to see how it's used.
3133

3234
To run the MariaDB server "manually" via command line for testing, the following command line could be useful:
3335

3436
```
3537
docker run --ulimit memlock=-1:-1 -it --rm=true --memory-swappiness=0 --name quarkus_test_mariadb -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=secret -p 3306:3306 mariadb:10.4
3638
```
3739

40+
or if you prefer podman, this won't need root permissions:
41+
42+
```
43+
podman run --rm=true --net=host --memory-swappiness=0 --tmpfs /var/lib/mysql:rw --tmpfs /var/log:rw --name mariadb_demo -e MYSQL_USER=hibernate_orm_test -e MYSQL_PASSWORD=hibernate_orm_test -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=secret -p 3306:3306 mariadb:10.4
44+
```
45+
3846
N.B. it takes a while for MariaDB to be actually booted and accepting connections.
3947

4048
After it's fully booted, you can run all integration tests via

integration-tests/hibernate-tenancy/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<description>Module that contains Hibernate Multitenancy related tests running with the MariaDB database</description>
1717

1818
<properties>
19-
<mariadb.url>jdbc:mariadb://localhost:3306</mariadb.url>
19+
<mariadb.base_url>jdbc:mariadb://localhost:3306</mariadb.base_url>
2020
<mariadb.image>mariadb:10.4</mariadb.image>
2121
</properties>
2222

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,38 @@
11
# Hibernate ORM settings
22
quarkus.hibernate-orm.database.generation=none
33
quarkus.hibernate-orm.multitenant=DATABASE
4-
quarkus.hibernate-orm.validate-tenant-in-current-sessions=false
5-
6-
# Maria DB URL
7-
mariadb.url=jdbc:mariadb://localhost:3306
84

95
# Default DB Configuration
106
quarkus.datasource.db-kind=mariadb
117
quarkus.datasource.username=root
128
quarkus.datasource.password=secret
13-
quarkus.datasource.jdbc.url=${mariadb.url}/hibernate_orm_test
9+
quarkus.datasource.jdbc.url=${mariadb.base_url}/hibernate_orm_test
1410
quarkus.datasource.jdbc.max-size=1
1511
quarkus.datasource.jdbc.min-size=1
1612
quarkus.flyway.migrate-at-start=true
13+
#Reset Flyway metadata at boot, as the database might have been tainted by previous integration tests:
14+
quarkus.flyway.clean-at-start=true
1715
quarkus.flyway.locations=classpath:database/default
1816

1917
# DATABASE Tenant 'base' Configuration
2018
quarkus.datasource.base.db-kind=mariadb
2119
quarkus.datasource.base.username=jane
2220
quarkus.datasource.base.password=abc
23-
quarkus.datasource.base.jdbc.url=${mariadb.url}/base
21+
quarkus.datasource.base.jdbc.url=${mariadb.base_url}/base
2422
quarkus.datasource.base.jdbc.max-size=1
2523
quarkus.datasource.base.jdbc.min-size=1
2624
quarkus.flyway.base.migrate-at-start=true
25+
quarkus.flyway.base.clean-at-start=true
2726
quarkus.flyway.base.locations=classpath:database/base
2827

2928
# DATABASE Tenant 'mycompany' Configuration
3029
quarkus.datasource.mycompany.db-kind=mariadb
3130
quarkus.datasource.mycompany.username=john
3231
quarkus.datasource.mycompany.password=def
33-
quarkus.datasource.mycompany.jdbc.url=${mariadb.url}/mycompany
32+
quarkus.datasource.mycompany.jdbc.url=${mariadb.base_url}/mycompany
3433
quarkus.datasource.mycompany.jdbc.max-size=1
3534
quarkus.datasource.mycompany.jdbc.min-size=1
3635
quarkus.flyway.mycompany.migrate-at-start=true
36+
quarkus.flyway.mycompany.clean-at-start=true
3737
quarkus.flyway.mycompany.locations=classpath:database/mycompany
3838

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
CREATE DATABASE base;
2-
CREATE USER 'jane'@'%' IDENTIFIED BY 'abc';
1+
CREATE DATABASE IF NOT EXISTS base;
2+
CREATE USER IF NOT EXISTS 'jane'@'%' IDENTIFIED BY 'abc';
33
GRANT ALL privileges ON base.* TO 'jane'@'%';
44

5-
CREATE DATABASE mycompany;
6-
CREATE USER 'john'@'%' IDENTIFIED BY 'def';
5+
CREATE DATABASE IF NOT EXISTS mycompany;
6+
CREATE USER IF NOT EXISTS 'john'@'%' IDENTIFIED BY 'def';
77
GRANT ALL privileges ON mycompany.* TO 'john'@'%';
88

99
FLUSH PRIVILEGES;

integration-tests/jpa-mariadb/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ To run the MariaDB server "manually" via command line for testing, the following
3535
docker run --ulimit memlock=-1:-1 -it --rm=true --memory-swappiness=0 --name quarkus_test_mariadb -e MYSQL_USER=hibernate_orm_test -e MYSQL_PASSWORD=hibernate_orm_test -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_RANDOM_ROOT_PASSWORD=true -p 3306:3306 mariadb:10.4
3636
```
3737

38+
or if you prefer podman, this won't need root permissions:
39+
40+
```
41+
podman run --rm=true --net=host --memory-swappiness=0 --tmpfs /var/lib/mysql:rw --tmpfs /var/log:rw --name mariadb_demo -e MYSQL_USER=hibernate_orm_test -e MYSQL_PASSWORD=hibernate_orm_test -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=secret -p 3306:3306 mariadb:10.4
42+
```
43+
3844
N.B. it takes a while for MariaDB to be actually booted and accepting connections.
3945

4046
After it's fully booted, you can run all integration tests via

0 commit comments

Comments
 (0)