Skip to content

Commit

Permalink
Introduce DevServicesDatasourceContainerConfig
Browse files Browse the repository at this point in the history
Passing that many parameters was a bit problematic, especially when
having to add new ones.
  • Loading branch information
gsmet committed May 12, 2022
1 parent d80c704 commit 36f8e56
Show file tree
Hide file tree
Showing 11 changed files with 106 additions and 62 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package io.quarkus.datasource.deployment.spi;

import java.util.Map;
import java.util.Optional;
import java.util.OptionalInt;

public class DevServicesDatasourceContainerConfig {

private final Optional<String> imageName;
private final Map<String, String> containerProperties;
private final Map<String, String> additionalJdbcUrlProperties;
private final OptionalInt fixedExposedPort;

public DevServicesDatasourceContainerConfig(Optional<String> imageName,
Map<String, String> containerProperties,
Map<String, String> additionalJdbcUrlProperties,
OptionalInt port) {
this.imageName = imageName;
this.containerProperties = containerProperties;
this.additionalJdbcUrlProperties = additionalJdbcUrlProperties;
this.fixedExposedPort = port;
}

public Optional<String> getImageName() {
return imageName;
}

public Map<String, String> getContainerProperties() {
return containerProperties;
}

public Map<String, String> getAdditionalJdbcUrlProperties() {
return additionalJdbcUrlProperties;
}

public OptionalInt getFixedExposedPort() {
return fixedExposedPort;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,17 @@

import java.io.Closeable;
import java.time.Duration;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalInt;

import io.quarkus.runtime.LaunchMode;

public interface DevServicesDatasourceProvider {

RunningDevServicesDatasource startDatabase(Optional<String> username, Optional<String> password,
Optional<String> datasourceName,
Optional<String> imageName,
Map<String, String> containerProperties,
Map<String, String> additionalJdbcUrlProperties,
OptionalInt port, LaunchMode launchMode, Optional<Duration> startupTimeout);
DevServicesDatasourceContainerConfig devServicesDatasourceContainerConfig,
LaunchMode launchMode,
Optional<Duration> startupTimeout);

default boolean isDockerRequired() {
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

import io.quarkus.datasource.deployment.spi.DefaultDataSourceDbKindBuildItem;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceConfigurationHandlerBuildItem;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProviderBuildItem;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceResultBuildItem;
Expand Down Expand Up @@ -261,13 +262,17 @@ private RunningDevService startDevDb(String dbName,
prefix = prefix + dbName + ".";
}

DevServicesDatasourceContainerConfig containerConfig = new DevServicesDatasourceContainerConfig(
dataSourceBuildTimeConfig.devservices.imageName,
dataSourceBuildTimeConfig.devservices.containerProperties,
dataSourceBuildTimeConfig.devservices.properties,
dataSourceBuildTimeConfig.devservices.port);

DevServicesDatasourceProvider.RunningDevServicesDatasource datasource = devDbProvider
.startDatabase(ConfigProvider.getConfig().getOptionalValue(prefix + "username", String.class),
ConfigProvider.getConfig().getOptionalValue(prefix + "password", String.class),
Optional.ofNullable(dbName), dataSourceBuildTimeConfig.devservices.imageName,
dataSourceBuildTimeConfig.devservices.containerProperties,
dataSourceBuildTimeConfig.devservices.properties,
dataSourceBuildTimeConfig.devservices.port, launchMode, globalDevServicesConfig.timeout);
Optional.ofNullable(dbName), containerConfig,
launchMode, globalDevServicesConfig.timeout);

propertiesMap.put(prefix + "db-kind", dataSourceBuildTimeConfig.dbKind.orElse(null));
String devServicesPrefix = prefix + "devservices.";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import java.time.Duration;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalInt;

Expand All @@ -11,6 +10,7 @@
import org.testcontainers.utility.DockerImageName;

import io.quarkus.datasource.common.runtime.DatabaseKind;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProviderBuildItem;
import io.quarkus.deployment.annotations.BuildStep;
Expand All @@ -29,17 +29,17 @@ DevServicesDatasourceProviderBuildItem setupDB2(
return new DevServicesDatasourceProviderBuildItem(DatabaseKind.DB2, new DevServicesDatasourceProvider() {
@Override
public RunningDevServicesDatasource startDatabase(Optional<String> username, Optional<String> password,
Optional<String> datasourceName, Optional<String> imageName,
Map<String, String> containerProperties, Map<String, String> additionalJdbcUrlProperties,
OptionalInt fixedExposedPort, LaunchMode launchMode, Optional<Duration> startupTimeout) {
QuarkusDb2Container container = new QuarkusDb2Container(imageName, fixedExposedPort,
Optional<String> datasourceName, DevServicesDatasourceContainerConfig containerConfig,
LaunchMode launchMode, Optional<Duration> startupTimeout) {
QuarkusDb2Container container = new QuarkusDb2Container(containerConfig.getImageName(),
containerConfig.getFixedExposedPort(),
!devServicesSharedNetworkBuildItem.isEmpty());
startupTimeout.ifPresent(container::withStartupTimeout);
container.withPassword(password.orElse("quarkus"))
.withUsername(username.orElse("quarkus"))
.withDatabaseName(datasourceName.orElse("default"))
.withReuse(true);
additionalJdbcUrlProperties.forEach(container::withUrlParam);
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
container.start();

LOG.info("Dev Services for IBM Db2 started.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
import java.time.Duration;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalInt;

import org.apache.derby.drda.NetworkServerControl;
import org.jboss.logging.Logger;

import io.quarkus.datasource.common.runtime.DatabaseKind;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProviderBuildItem;
import io.quarkus.deployment.annotations.BuildStep;
Expand All @@ -30,11 +30,11 @@ DevServicesDatasourceProviderBuildItem setupDerby() {
return new DevServicesDatasourceProviderBuildItem(DatabaseKind.DERBY, new DevServicesDatasourceProvider() {
@Override
public RunningDevServicesDatasource startDatabase(Optional<String> username, Optional<String> password,
Optional<String> datasourceName, Optional<String> imageName,
Map<String, String> containerProperties, Map<String, String> additionalJdbcUrlProperties,
OptionalInt fixedExposedPort, LaunchMode launchMode, Optional<Duration> startupTimeout) {
Optional<String> datasourceName, DevServicesDatasourceContainerConfig containerConfig,
LaunchMode launchMode, Optional<Duration> startupTimeout) {
try {
int port = fixedExposedPort.isPresent() ? fixedExposedPort.getAsInt()
int port = containerConfig.getFixedExposedPort().isPresent()
? containerConfig.getFixedExposedPort().getAsInt()
: 1527 + (launchMode == LaunchMode.TEST ? 0 : 1);
NetworkServerControl server = new NetworkServerControl(InetAddress.getByName("localhost"), port);
server.start(new PrintWriter(System.out));
Expand All @@ -58,7 +58,7 @@ public RunningDevServicesDatasource startDatabase(Optional<String> username, Opt
LOG.info("Dev Services for Derby started.");

StringBuilder additionalArgs = new StringBuilder();
for (Map.Entry<String, String> i : additionalJdbcUrlProperties.entrySet()) {
for (Map.Entry<String, String> i : containerConfig.getAdditionalJdbcUrlProperties().entrySet()) {
additionalArgs.append(";");
additionalArgs.append(i.getKey());
additionalArgs.append("=");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@
import java.time.Duration;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalInt;

import org.h2.tools.Server;
import org.jboss.logging.Logger;

import io.quarkus.datasource.common.runtime.DatabaseKind;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProviderBuildItem;
import io.quarkus.deployment.annotations.BuildStep;
Expand All @@ -29,17 +29,18 @@ DevServicesDatasourceProviderBuildItem setupH2() {
return new DevServicesDatasourceProviderBuildItem(DatabaseKind.H2, new DevServicesDatasourceProvider() {
@Override
public RunningDevServicesDatasource startDatabase(Optional<String> username, Optional<String> password,
Optional<String> datasourceName, Optional<String> imageName,
Map<String, String> containerProperties, Map<String, String> additionalJdbcUrlProperties,
OptionalInt port, LaunchMode launchMode, Optional<Duration> startupTimeout) {
Optional<String> datasourceName, DevServicesDatasourceContainerConfig containerConfig,
LaunchMode launchMode, Optional<Duration> startupTimeout) {
try {
final Server tcpServer = Server.createTcpServer("-tcpPort",
port.isPresent() ? String.valueOf(port.getAsInt()) : "0",
containerConfig.getFixedExposedPort().isPresent()
? String.valueOf(containerConfig.getFixedExposedPort().getAsInt())
: "0",
"-ifNotExists");
tcpServer.start();

StringBuilder additionalArgs = new StringBuilder();
for (Map.Entry<String, String> i : additionalJdbcUrlProperties.entrySet()) {
for (Map.Entry<String, String> i : containerConfig.getAdditionalJdbcUrlProperties().entrySet()) {
additionalArgs.append(";");
additionalArgs.append(i.getKey());
additionalArgs.append("=");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import java.time.Duration;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalInt;

Expand All @@ -11,6 +10,7 @@
import org.testcontainers.utility.DockerImageName;

import io.quarkus.datasource.common.runtime.DatabaseKind;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProviderBuildItem;
import io.quarkus.deployment.annotations.BuildStep;
Expand All @@ -32,22 +32,23 @@ DevServicesDatasourceProviderBuildItem setupMariaDB(
return new DevServicesDatasourceProviderBuildItem(DatabaseKind.MARIADB, new DevServicesDatasourceProvider() {
@Override
public RunningDevServicesDatasource startDatabase(Optional<String> username, Optional<String> password,
Optional<String> datasourceName, Optional<String> imageName,
Map<String, String> containerProperties, Map<String, String> additionalJdbcUrlProperties,
OptionalInt fixedExposedPort, LaunchMode launchMode, Optional<Duration> startupTimeout) {
QuarkusMariaDBContainer container = new QuarkusMariaDBContainer(imageName, fixedExposedPort,
Optional<String> datasourceName, DevServicesDatasourceContainerConfig containerConfig,
LaunchMode launchMode, Optional<Duration> startupTimeout) {
QuarkusMariaDBContainer container = new QuarkusMariaDBContainer(containerConfig.getImageName(),
containerConfig.getFixedExposedPort(),
!devServicesSharedNetworkBuildItem.isEmpty());
startupTimeout.ifPresent(container::withStartupTimeout);
container.withPassword(password.orElse("quarkus"))
.withUsername(username.orElse("quarkus"))
.withDatabaseName(datasourceName.orElse("default"))
.withReuse(true);

if (containerProperties.containsKey(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME)) {
container.withConfigurationOverride(containerProperties.get(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME));
if (containerConfig.getContainerProperties().containsKey(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME)) {
container.withConfigurationOverride(
containerConfig.getContainerProperties().get(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME));
}

additionalJdbcUrlProperties.forEach(container::withUrlParam);
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
container.start();

LOG.info("Dev Services for MariaDB started.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import java.time.Duration;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalInt;

Expand All @@ -11,6 +10,7 @@
import org.testcontainers.utility.DockerImageName;

import io.quarkus.datasource.common.runtime.DatabaseKind;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProviderBuildItem;
import io.quarkus.deployment.annotations.BuildStep;
Expand All @@ -29,15 +29,15 @@ DevServicesDatasourceProviderBuildItem setupMSSQL(
return new DevServicesDatasourceProviderBuildItem(DatabaseKind.MSSQL, new DevServicesDatasourceProvider() {
@Override
public RunningDevServicesDatasource startDatabase(Optional<String> username, Optional<String> password,
Optional<String> datasourceName, Optional<String> imageName,
Map<String, String> containerProperties, Map<String, String> additionalJdbcUrlProperties,
OptionalInt fixedExposedPort, LaunchMode launchMode, Optional<Duration> startupTimeout) {
QuarkusMSSQLServerContainer container = new QuarkusMSSQLServerContainer(imageName, fixedExposedPort,
Optional<String> datasourceName, DevServicesDatasourceContainerConfig containerConfig,
LaunchMode launchMode, Optional<Duration> startupTimeout) {
QuarkusMSSQLServerContainer container = new QuarkusMSSQLServerContainer(containerConfig.getImageName(),
containerConfig.getFixedExposedPort(),
!devServicesSharedNetworkBuildItem.isEmpty());
startupTimeout.ifPresent(container::withStartupTimeout);
container.withPassword(password.orElse("Quarkuspassword1"))
.withReuse(true);
additionalJdbcUrlProperties.forEach(container::withUrlParam);
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);
container.start();

LOG.info("Dev Services for Microsoft SQL Server started.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import java.time.Duration;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalInt;

Expand All @@ -11,6 +10,7 @@
import org.testcontainers.utility.DockerImageName;

import io.quarkus.datasource.common.runtime.DatabaseKind;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceContainerConfig;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProvider;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceProviderBuildItem;
import io.quarkus.deployment.annotations.BuildStep;
Expand All @@ -31,22 +31,23 @@ DevServicesDatasourceProviderBuildItem setupMysql(
return new DevServicesDatasourceProviderBuildItem(DatabaseKind.MYSQL, new DevServicesDatasourceProvider() {
@Override
public RunningDevServicesDatasource startDatabase(Optional<String> username, Optional<String> password,
Optional<String> datasourceName, Optional<String> imageName,
Map<String, String> containerProperties, Map<String, String> additionalJdbcUrlProperties,
OptionalInt fixedExposedPort, LaunchMode launchMode, Optional<Duration> startupTimeout) {
QuarkusMySQLContainer container = new QuarkusMySQLContainer(imageName, fixedExposedPort,
Optional<String> datasourceName, DevServicesDatasourceContainerConfig containerConfig,
LaunchMode launchMode, Optional<Duration> startupTimeout) {
QuarkusMySQLContainer container = new QuarkusMySQLContainer(containerConfig.getImageName(),
containerConfig.getFixedExposedPort(),
!devServicesSharedNetworkBuildItem.isEmpty());
startupTimeout.ifPresent(container::withStartupTimeout);
container.withPassword(password.orElse("quarkus"))
.withUsername(username.orElse("quarkus"))
.withDatabaseName(datasourceName.orElse("default"))
.withReuse(true);

if (containerProperties.containsKey(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME)) {
container.withConfigurationOverride(containerProperties.get(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME));
if (containerConfig.getContainerProperties().containsKey(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME)) {
container.withConfigurationOverride(
containerConfig.getContainerProperties().get(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME));
}

additionalJdbcUrlProperties.forEach(container::withUrlParam);
containerConfig.getAdditionalJdbcUrlProperties().forEach(container::withUrlParam);

container.start();

Expand Down
Loading

0 comments on commit 36f8e56

Please sign in to comment.