Skip to content

Commit

Permalink
Set quarkus.datasource.db-kind automatically K8S Service Binding is used
Browse files Browse the repository at this point in the history
Relates to: #14327
  • Loading branch information
geoand committed Jan 19, 2021
1 parent 282b817 commit a84605c
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import io.quarkus.agroal.runtime.DataSources;
import io.quarkus.agroal.runtime.DataSourcesJdbcBuildTimeConfig;
import io.quarkus.agroal.runtime.TransactionIntegration;
import io.quarkus.agroal.spi.DefaultDataSourceDbKindBuildItem;
import io.quarkus.agroal.spi.JdbcDataSourceBuildItem;
import io.quarkus.agroal.spi.JdbcDriverBuildItem;
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
Expand Down Expand Up @@ -67,6 +68,7 @@ void agroal(BuildProducer<FeatureBuildItem> feature,
void build(
DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig,
DataSourcesJdbcBuildTimeConfig dataSourcesJdbcBuildTimeConfig,
List<DefaultDataSourceDbKindBuildItem> defaultDbKinds,
List<JdbcDriverBuildItem> jdbcDriverBuildItems,
BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
BuildProducer<NativeImageResourceBuildItem> resource,
Expand All @@ -81,7 +83,7 @@ void build(
List<AggregatedDataSourceBuildTimeConfigBuildItem> aggregatedDataSourceBuildTimeConfigs = getAggregatedConfigBuildItems(
dataSourcesBuildTimeConfig,
dataSourcesJdbcBuildTimeConfig,
jdbcDriverBuildItems);
jdbcDriverBuildItems, defaultDbKinds);

if (aggregatedDataSourceBuildTimeConfigs.isEmpty()) {
log.warn("The Agroal dependency is present but no JDBC datasources have been defined.");
Expand Down Expand Up @@ -255,16 +257,21 @@ void generateDataSourceBeans(AgroalRecorder recorder,
private List<AggregatedDataSourceBuildTimeConfigBuildItem> getAggregatedConfigBuildItems(
DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig,
DataSourcesJdbcBuildTimeConfig dataSourcesJdbcBuildTimeConfig,
List<JdbcDriverBuildItem> jdbcDriverBuildItems) {
List<JdbcDriverBuildItem> jdbcDriverBuildItems, List<DefaultDataSourceDbKindBuildItem> defaultDbKinds) {
List<AggregatedDataSourceBuildTimeConfigBuildItem> dataSources = new ArrayList<>();

if (dataSourcesBuildTimeConfig.defaultDataSource.dbKind.isPresent()) {
Optional<String> effectiveDbKind = dataSourcesBuildTimeConfig.defaultDataSource.dbKind;
if (!effectiveDbKind.isPresent() && (defaultDbKinds.size() == 1)) {
effectiveDbKind = Optional.of(defaultDbKinds.get(0).getDbKind());
}

if (effectiveDbKind.isPresent()) {
if (dataSourcesJdbcBuildTimeConfig.jdbc.enabled) {
dataSources.add(new AggregatedDataSourceBuildTimeConfigBuildItem(DataSourceUtil.DEFAULT_DATASOURCE_NAME,
dataSourcesBuildTimeConfig.defaultDataSource,
dataSourcesJdbcBuildTimeConfig.jdbc,
dataSourcesBuildTimeConfig.defaultDataSource.dbKind.get(),
resolveDriver(DataSourceUtil.DEFAULT_DATASOURCE_NAME, dataSourcesBuildTimeConfig.defaultDataSource,
effectiveDbKind.get(),
resolveDriver(DataSourceUtil.DEFAULT_DATASOURCE_NAME, effectiveDbKind.get(),
dataSourcesJdbcBuildTimeConfig.jdbc, jdbcDriverBuildItems)));
}
}
Expand All @@ -279,20 +286,20 @@ private List<AggregatedDataSourceBuildTimeConfigBuildItem> getAggregatedConfigBu
entry.getValue(),
jdbcBuildTimeConfig,
entry.getValue().dbKind.get(),
resolveDriver(entry.getKey(), entry.getValue(), jdbcBuildTimeConfig, jdbcDriverBuildItems)));
resolveDriver(entry.getKey(), entry.getValue().dbKind.get(), jdbcBuildTimeConfig, jdbcDriverBuildItems)));
}

return dataSources;
}

private String resolveDriver(String dataSourceName, DataSourceBuildTimeConfig dataSourceBuildTimeConfig,
private String resolveDriver(String dataSourceName, String dbKind,
DataSourceJdbcBuildTimeConfig dataSourceJdbcBuildTimeConfig, List<JdbcDriverBuildItem> jdbcDriverBuildItems) {
if (dataSourceJdbcBuildTimeConfig.driver.isPresent()) {
return dataSourceJdbcBuildTimeConfig.driver.get();
}

Optional<JdbcDriverBuildItem> matchingJdbcDriver = jdbcDriverBuildItems.stream()
.filter(i -> dataSourceBuildTimeConfig.dbKind.get().equals(i.getDbKind()))
.filter(i -> dbKind.equals(i.getDbKind()))
.findFirst();

if (matchingJdbcDriver.isPresent()) {
Expand All @@ -306,7 +313,7 @@ private String resolveDriver(String dataSourceName, DataSourceBuildTimeConfig da
}

throw new ConfigurationException("Unable to find a JDBC driver corresponding to the database kind '"
+ dataSourceBuildTimeConfig.dbKind.get() + "' for the "
+ dbKind + "' for the "
+ (DataSourceUtil.isDefault(dataSourceName) ? "default datasource"
: "datasource '" + dataSourceName + "'")
+ ". Either provide a suitable JDBC driver extension, define the driver manually, or disable the JDBC datasource by adding "
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.quarkus.agroal.spi;

import io.quarkus.builder.item.MultiBuildItem;

/**
* A build item that represents the "quarkus.datasource.db-kind" value.
* This is generated by specific extensions that are meant to take away the burden of
* configuring anything datasource related from the user.
*/
public final class DefaultDataSourceDbKindBuildItem extends MultiBuildItem {

private final String dbKind;

public DefaultDataSourceDbKindBuildItem(String dbKind) {
this.dbKind = dbKind;
}

public String getDbKind() {
return dbKind;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.quarkus.jdbc.postgresql.deployment;

import io.quarkus.agroal.spi.DefaultDataSourceDbKindBuildItem;
import io.quarkus.agroal.spi.JdbcDriverBuildItem;
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
import io.quarkus.arc.processor.BuiltinScope;
Expand Down Expand Up @@ -42,11 +43,14 @@ void configureAgroalConnection(BuildProducer<AdditionalBeanBuildItem> additional
}

@BuildStep
void registerServiceBinding(Capabilities capabilities, BuildProducer<ServiceProviderBuildItem> serviceProvider) {
void registerServiceBinding(Capabilities capabilities,
BuildProducer<ServiceProviderBuildItem> serviceProvider,
BuildProducer<DefaultDataSourceDbKindBuildItem> dbKind) {
if (capabilities.isPresent(Capability.KUBERNETES_SERVICE_BINDING)) {
serviceProvider.produce(
new ServiceProviderBuildItem("io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConverter",
PostgreSqlServiceBindingConverter.class.getName()));
dbKind.produce(new DefaultDataSourceDbKindBuildItem(DatabaseKind.POSTGRESQL));
}
}
}

0 comments on commit a84605c

Please sign in to comment.