Skip to content

Commit f1c2ce2

Browse files
committed
Introduce quarkus.datasource.devservices.init-script-path
- This enables specifying a SQL initialization script for Dev Services Databases Added tests
1 parent 29617d4 commit f1c2ce2

File tree

15 files changed

+205
-3
lines changed

15 files changed

+205
-3
lines changed

extensions/datasource/deployment-spi/src/main/java/io/quarkus/datasource/deployment/spi/DevServicesDatasourceContainerConfig.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class DevServicesDatasourceContainerConfig {
1414
private final Optional<String> dbName;
1515
private final Optional<String> username;
1616
private final Optional<String> password;
17+
private final Optional<String> initScriptPath;
1718

1819
public DevServicesDatasourceContainerConfig(Optional<String> imageName,
1920
Map<String, String> containerProperties,
@@ -22,7 +23,8 @@ public DevServicesDatasourceContainerConfig(Optional<String> imageName,
2223
Optional<String> command,
2324
Optional<String> dbName,
2425
Optional<String> username,
25-
Optional<String> password) {
26+
Optional<String> password,
27+
Optional<String> initScriptPath) {
2628
this.imageName = imageName;
2729
this.containerProperties = containerProperties;
2830
this.additionalJdbcUrlProperties = additionalJdbcUrlProperties;
@@ -31,6 +33,7 @@ public DevServicesDatasourceContainerConfig(Optional<String> imageName,
3133
this.dbName = dbName;
3234
this.username = username;
3335
this.password = password;
36+
this.initScriptPath = initScriptPath;
3437
}
3538

3639
public Optional<String> getImageName() {
@@ -64,4 +67,8 @@ public Optional<String> getUsername() {
6467
public Optional<String> getPassword() {
6568
return password;
6669
}
70+
71+
public Optional<String> getInitScriptPath() {
72+
return initScriptPath;
73+
}
6774
}

extensions/datasource/deployment/src/main/java/io/quarkus/datasource/deployment/devservices/DevServicesDatasourceProcessor.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,8 @@ private RunningDevService startDevDb(String dbName,
275275
dataSourceBuildTimeConfig.devservices.command,
276276
dataSourceBuildTimeConfig.devservices.dbName,
277277
dataSourceBuildTimeConfig.devservices.username,
278-
dataSourceBuildTimeConfig.devservices.password);
278+
dataSourceBuildTimeConfig.devservices.password,
279+
dataSourceBuildTimeConfig.devservices.initScriptPath);
279280

280281
DevServicesDatasourceProvider.RunningDevServicesDatasource datasource = devDbProvider
281282
.startDatabase(

extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DevServicesBuildTimeConfig.java

+8
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,12 @@ public class DevServicesBuildTimeConfig {
7676
*/
7777
@ConfigItem
7878
public Optional<String> password;
79+
80+
/**
81+
* Path to a SQL script that will be loaded from the classpath and applied to the Dev Service database
82+
*
83+
* If the provider is not container based (e.g. a H2 or Derby Database) then this has no effect.
84+
*/
85+
@ConfigItem
86+
public Optional<String> initScriptPath;
7987
}

extensions/devservices/db2/src/main/java/io/quarkus/devservices/db2/deployment/DB2DevServicesProcessor.java

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
5353

5454
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
5555
containerConfig.getCommand().ifPresent(container::setCommand);
56+
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
5657
container.start();
5758

5859
LOG.info("Dev Services for IBM Db2 started.");

extensions/devservices/mariadb/src/main/java/io/quarkus/devservices/mariadb/deployment/MariaDBDevServicesProcessor.java

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
6161

6262
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
6363
containerConfig.getCommand().ifPresent(container::setCommand);
64+
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
6465

6566
container.start();
6667

extensions/devservices/mssql/src/main/java/io/quarkus/devservices/mssql/deployment/MSSQLDevServicesProcessor.java

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
4949

5050
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
5151
containerConfig.getCommand().ifPresent(container::setCommand);
52+
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
5253

5354
container.start();
5455

extensions/devservices/mysql/src/main/java/io/quarkus/devservices/mysql/deployment/MySQLDevServicesProcessor.java

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
6060

6161
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
6262
containerConfig.getCommand().ifPresent(container::setCommand);
63+
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
6364

6465
container.start();
6566

extensions/devservices/oracle/src/main/java/io/quarkus/devservices/oracle/deployment/OracleDevServicesProcessor.java

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
6363

6464
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
6565
containerConfig.getCommand().ifPresent(container::setCommand);
66+
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
6667

6768
container.start();
6869

extensions/devservices/postgresql/src/main/java/io/quarkus/devservices/postgresql/deployment/PostgresqlDevServicesProcessor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
4747
containerConfig.getFixedExposedPort(),
4848
!devServicesSharedNetworkBuildItem.isEmpty());
4949
startupTimeout.ifPresent(container::withStartupTimeout);
50-
5150
String effectiveUsername = containerConfig.getUsername().orElse(username.orElse(DEFAULT_DATABASE_USERNAME));
5251
String effectivePassword = containerConfig.getPassword().orElse(password.orElse(DEFAULT_DATABASE_PASSWORD));
5352
String effectiveDbName = containerConfig.getDbName().orElse(datasourceName.orElse(DEFAULT_DATABASE_NAME));
@@ -60,6 +59,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
6059

6160
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
6261
containerConfig.getCommand().ifPresent(container::setCommand);
62+
containerConfig.getInitScriptPath().ifPresent(container::withInitScript);
6363

6464
container.start();
6565

+126
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xmlns="http://maven.apache.org/POM/4.0.0"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>quarkus-integration-tests-parent</artifactId>
7+
<groupId>io.quarkus</groupId>
8+
<version>999-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>quarkus-integration-test-jdbc-postgresql</artifactId>
13+
<name>Quarkus - Integration Tests - JDBC - PostgreSQL</name>
14+
<description>Module that contains PostgreSQL related tests</description>
15+
<dependencies>
16+
<dependency>
17+
<groupId>io.quarkus</groupId>
18+
<artifactId>quarkus-agroal</artifactId>
19+
</dependency>
20+
<dependency>
21+
<groupId>io.quarkus</groupId>
22+
<artifactId>quarkus-jdbc-postgresql</artifactId>
23+
</dependency>
24+
<dependency>
25+
<groupId>io.quarkus</groupId>
26+
<artifactId>quarkus-resteasy</artifactId>
27+
</dependency>
28+
<dependency>
29+
<groupId>io.quarkus</groupId>
30+
<artifactId>quarkus-resteasy-jackson</artifactId>
31+
</dependency>
32+
<!-- test dependencies -->
33+
<dependency>
34+
<groupId>io.quarkus</groupId>
35+
<artifactId>quarkus-junit5</artifactId>
36+
<scope>test</scope>
37+
</dependency>
38+
<dependency>
39+
<groupId>io.rest-assured</groupId>
40+
<artifactId>rest-assured</artifactId>
41+
<scope>test</scope>
42+
<exclusions>
43+
<exclusion>
44+
<groupId>org.apache.commons</groupId>
45+
<artifactId>commons-lang3</artifactId>
46+
</exclusion>
47+
</exclusions>
48+
</dependency>
49+
50+
<!-- Minimal test dependencies to *-deployment artifacts for consistent build order -->
51+
<dependency>
52+
<groupId>io.quarkus</groupId>
53+
<artifactId>quarkus-agroal-deployment</artifactId>
54+
<version>${project.version}</version>
55+
<type>pom</type>
56+
<scope>test</scope>
57+
<exclusions>
58+
<exclusion>
59+
<groupId>*</groupId>
60+
<artifactId>*</artifactId>
61+
</exclusion>
62+
</exclusions>
63+
</dependency>
64+
<dependency>
65+
<groupId>io.quarkus</groupId>
66+
<artifactId>quarkus-jdbc-postgresql-deployment</artifactId>
67+
<version>${project.version}</version>
68+
<type>pom</type>
69+
<scope>test</scope>
70+
<exclusions>
71+
<exclusion>
72+
<groupId>*</groupId>
73+
<artifactId>*</artifactId>
74+
</exclusion>
75+
</exclusions>
76+
</dependency>
77+
<dependency>
78+
<groupId>io.quarkus</groupId>
79+
<artifactId>quarkus-resteasy-deployment</artifactId>
80+
<version>${project.version}</version>
81+
<type>pom</type>
82+
<scope>test</scope>
83+
<exclusions>
84+
<exclusion>
85+
<groupId>*</groupId>
86+
<artifactId>*</artifactId>
87+
</exclusion>
88+
</exclusions>
89+
</dependency>
90+
<dependency>
91+
<groupId>io.quarkus</groupId>
92+
<artifactId>quarkus-resteasy-jackson-deployment</artifactId>
93+
<version>${project.version}</version>
94+
<type>pom</type>
95+
<scope>test</scope>
96+
<exclusions>
97+
<exclusion>
98+
<groupId>*</groupId>
99+
<artifactId>*</artifactId>
100+
</exclusion>
101+
</exclusions>
102+
</dependency>
103+
</dependencies>
104+
105+
<build>
106+
<resources>
107+
<resource>
108+
<directory>src/main/resources</directory>
109+
<filtering>true</filtering>
110+
</resource>
111+
</resources>
112+
<plugins>
113+
<plugin>
114+
<groupId>io.quarkus</groupId>
115+
<artifactId>quarkus-maven-plugin</artifactId>
116+
<executions>
117+
<execution>
118+
<goals>
119+
<goal>build</goal>
120+
</goals>
121+
</execution>
122+
</executions>
123+
</plugin>
124+
</plugins>
125+
</build>
126+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.quarkus.it.jdbc.postgresql;
2+
3+
import java.sql.CallableStatement;
4+
import java.sql.Connection;
5+
import java.sql.ResultSet;
6+
import java.sql.SQLException;
7+
8+
import javax.inject.Inject;
9+
import javax.sql.DataSource;
10+
import javax.ws.rs.GET;
11+
import javax.ws.rs.Path;
12+
13+
@Path("/postgresql")
14+
public class PostgreSQLResource {
15+
16+
@Inject
17+
DataSource ds;
18+
19+
@GET
20+
@Path("/init-script-execution")
21+
public int checkInitScriptExecution() throws SQLException {
22+
int result = 0;
23+
try (Connection con = ds.getConnection();
24+
CallableStatement cs = con.prepareCall("SELECT my_func()");
25+
ResultSet rs = cs.executeQuery()) {
26+
if (rs.next()) {
27+
result = rs.getInt(1);
28+
}
29+
}
30+
return result;
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Agroal config
2+
quarkus.datasource.db-kind=postgresql
3+
quarkus.datasource.devservices.init-script-path=init.sql
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CREATE OR REPLACE FUNCTION my_func() RETURNS integer LANGUAGE plpgsql as $func$ BEGIN return 100; END $func$;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.quarkus.it.jdbc.postgresql;
2+
3+
import static io.restassured.RestAssured.when;
4+
import static org.hamcrest.Matchers.is;
5+
6+
import org.junit.jupiter.api.DisplayName;
7+
import org.junit.jupiter.api.Test;
8+
9+
import io.quarkus.test.junit.QuarkusTest;
10+
11+
@QuarkusTest
12+
public class DevServicesTest {
13+
@Test
14+
@DisplayName("Returns whether the init-sql-path executed successfully or not")
15+
public void testReturnInitSql() {
16+
when().get("/postgresql/init-script-execution").then().log().ifValidationFails().body(is("100"));
17+
}
18+
}

integration-tests/pom.xml

+1
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@
169169
<module>kafka-avro-apicurio2</module>
170170
<module>kafka-streams</module>
171171
<module>kafka-devservices</module>
172+
<module>jdbc-postgresql</module>
172173
<module>jpa</module>
173174
<module>jpa-mapping-xml</module>
174175
<module>jpa-db2</module>

0 commit comments

Comments
 (0)