Skip to content

Commit

Permalink
K8S service binding support for Reactive SQL Clients
Browse files Browse the repository at this point in the history
This commit introduces support for K8S service binding when using Reactive SQL Clients.
  • Loading branch information
tsegismont committed May 18, 2022
1 parent cf92045 commit 0d08b98
Show file tree
Hide file tree
Showing 35 changed files with 623 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package io.quarkus.kubernetes.service.binding.runtime;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

import org.jboss.logging.Logger;

public class ReactiveDatasourceServiceBindingConfigSourceFactory
implements Function<ServiceBinding, ServiceBindingConfigSource> {

private static final Logger log = Logger.getLogger(ReactiveDatasourceServiceBindingConfigSourceFactory.class);

private final String type;

public ReactiveDatasourceServiceBindingConfigSourceFactory(String type) {
this.type = type;
}

@Override
public ServiceBindingConfigSource apply(ServiceBinding serviceBinding) {
return new ServiceBindingConfigSource("reactive-" + type + "-k8s-service-binding-source",
getServiceBindingProperties(serviceBinding));
}

private Map<String, String> getServiceBindingProperties(ServiceBinding binding) {
Map<String, String> properties = new HashMap<>();
Map<String, String> bindingProperties = binding.getProperties();

String username = bindingProperties.get("username");
if (username != null) {
properties.put("quarkus.datasource.username", username);
} else {
log.debugf("Property 'username' was not found for datasource of type %s", type);
}
String password = bindingProperties.get("password");
if (password != null) {
properties.put("quarkus.datasource.password", password);
} else {
log.debugf("Property 'password' was not found for datasource of type %s", type);
}

String host = bindingProperties.get("host");
String port = bindingProperties.get("port");
String database = bindingProperties.get("database");
if ((host != null) && (database != null)) {
String portPart = "";
if (port != null) {
portPart = ":" + port;
}
properties.put(urlPropertyName(), formatUrl(host, database, portPart));
} else {
log.debugf("One or more of 'host' or 'database' properties were not found for datasource of type %s", type);
}

return properties;
}

protected String urlPropertyName() {
return "quarkus.datasource.reactive.url";
}

protected String formatUrl(String host, String database, String portPart) {
return String.format("%s://%s%s/%s", type, host, portPart, database);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,15 @@
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.ServiceStartBuildItem;
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
import io.quarkus.reactive.datasource.ReactiveDataSource;
import io.quarkus.reactive.datasource.deployment.VertxPoolBuildItem;
import io.quarkus.reactive.datasource.runtime.DataSourceReactiveBuildTimeConfig;
import io.quarkus.reactive.datasource.runtime.DataSourcesReactiveBuildTimeConfig;
import io.quarkus.reactive.datasource.runtime.DataSourcesReactiveRuntimeConfig;
import io.quarkus.reactive.db2.client.runtime.DB2PoolRecorder;
import io.quarkus.reactive.db2.client.runtime.DB2ServiceBindingConverter;
import io.quarkus.reactive.db2.client.runtime.DataSourcesReactiveDB2Config;
import io.quarkus.runtime.RuntimeValue;
import io.quarkus.smallrye.health.deployment.spi.HealthBuildItem;
Expand Down Expand Up @@ -87,7 +89,13 @@ DevServicesDatasourceConfigurationHandlerBuildItem devDbHandler() {
}

@BuildStep
void registerServiceBinding(BuildProducer<DefaultDataSourceDbKindBuildItem> dbKind) {
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",
DB2ServiceBindingConverter.class.getName()));
}
dbKind.produce(new DefaultDataSourceDbKindBuildItem(DatabaseKind.DB2));
}

Expand Down
5 changes: 5 additions & 0 deletions extensions/reactive-db2-client/runtime/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@
<artifactId>quarkus-smallrye-health</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-kubernetes-service-binding</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.quarkus.reactive.db2.client.runtime;

import java.util.List;
import java.util.Optional;

import io.quarkus.kubernetes.service.binding.runtime.ReactiveDatasourceServiceBindingConfigSourceFactory;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBinding;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConfigSource;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConverter;

public class DB2ServiceBindingConverter implements ServiceBindingConverter {

@Override
public Optional<ServiceBindingConfigSource> convert(List<ServiceBinding> serviceBindings) {
return ServiceBinding.singleMatchingByType("db2", serviceBindings)
.map(new ReactiveDatasourceServiceBindingConfigSourceFactory("db2"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
io.quarkus.reactive.db2.client.runtime.DB2ServiceBindingConverter
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.ServiceStartBuildItem;
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
import io.quarkus.reactive.datasource.ReactiveDataSource;
import io.quarkus.reactive.datasource.deployment.VertxPoolBuildItem;
Expand All @@ -34,6 +35,7 @@
import io.quarkus.reactive.datasource.runtime.DataSourcesReactiveRuntimeConfig;
import io.quarkus.reactive.mssql.client.runtime.DataSourcesReactiveMSSQLConfig;
import io.quarkus.reactive.mssql.client.runtime.MSSQLPoolRecorder;
import io.quarkus.reactive.mssql.client.runtime.MsSQLServiceBindingConverter;
import io.quarkus.runtime.RuntimeValue;
import io.quarkus.smallrye.health.deployment.spi.HealthBuildItem;
import io.quarkus.vertx.core.deployment.EventLoopCountBuildItem;
Expand Down Expand Up @@ -87,7 +89,13 @@ DevServicesDatasourceConfigurationHandlerBuildItem devDbHandler() {
}

@BuildStep
void registerServiceBinding(BuildProducer<DefaultDataSourceDbKindBuildItem> dbKind) {
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",
MsSQLServiceBindingConverter.class.getName()));
}
dbKind.produce(new DefaultDataSourceDbKindBuildItem(DatabaseKind.MSSQL));
}

Expand Down
5 changes: 5 additions & 0 deletions extensions/reactive-mssql-client/runtime/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@
<artifactId>quarkus-smallrye-health</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-kubernetes-service-binding</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.quarkus.reactive.mssql.client.runtime;

import java.util.List;
import java.util.Optional;

import io.quarkus.kubernetes.service.binding.runtime.ReactiveDatasourceServiceBindingConfigSourceFactory;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBinding;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConfigSource;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConverter;

public class MsSQLServiceBindingConverter implements ServiceBindingConverter {

@Override
public Optional<ServiceBindingConfigSource> convert(List<ServiceBinding> serviceBindings) {
return ServiceBinding.singleMatchingByType("sqlserver", serviceBindings)
.map(new ReactiveDatasourceServiceBindingConfigSourceFactory("sqlserver"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
io.quarkus.reactive.mssql.client.runtime.MsSQLServiceBindingConverter
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.ServiceStartBuildItem;
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
import io.quarkus.reactive.datasource.ReactiveDataSource;
import io.quarkus.reactive.datasource.deployment.VertxPoolBuildItem;
Expand All @@ -34,6 +35,7 @@
import io.quarkus.reactive.datasource.runtime.DataSourcesReactiveRuntimeConfig;
import io.quarkus.reactive.mysql.client.runtime.DataSourcesReactiveMySQLConfig;
import io.quarkus.reactive.mysql.client.runtime.MySQLPoolRecorder;
import io.quarkus.reactive.mysql.client.runtime.MySQLServiceBindingConverter;
import io.quarkus.runtime.RuntimeValue;
import io.quarkus.smallrye.health.deployment.spi.HealthBuildItem;
import io.quarkus.vertx.core.deployment.EventLoopCountBuildItem;
Expand Down Expand Up @@ -87,7 +89,13 @@ DevServicesDatasourceConfigurationHandlerBuildItem devDbHandler() {
}

@BuildStep
void registerServiceBinding(BuildProducer<DefaultDataSourceDbKindBuildItem> dbKind) {
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",
MySQLServiceBindingConverter.class.getName()));
}
dbKind.produce(new DefaultDataSourceDbKindBuildItem(DatabaseKind.MYSQL));
}

Expand Down
5 changes: 5 additions & 0 deletions extensions/reactive-mysql-client/runtime/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@
<artifactId>quarkus-smallrye-health</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-kubernetes-service-binding</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.quarkus.reactive.mysql.client.runtime;

import java.util.List;
import java.util.Optional;

import io.quarkus.kubernetes.service.binding.runtime.ReactiveDatasourceServiceBindingConfigSourceFactory;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBinding;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConfigSource;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConverter;

public class MySQLServiceBindingConverter implements ServiceBindingConverter {

@Override
public Optional<ServiceBindingConfigSource> convert(List<ServiceBinding> serviceBindings) {
return ServiceBinding.singleMatchingByType("mysql", serviceBindings)
.map(new ReactiveDatasourceServiceBindingConfigSourceFactory("mysql"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
io.quarkus.reactive.mysql.client.runtime.MySQLServiceBindingConverter
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.ServiceStartBuildItem;
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
import io.quarkus.reactive.datasource.ReactiveDataSource;
import io.quarkus.reactive.datasource.deployment.VertxPoolBuildItem;
Expand All @@ -34,6 +35,7 @@
import io.quarkus.reactive.datasource.runtime.DataSourcesReactiveRuntimeConfig;
import io.quarkus.reactive.oracle.client.runtime.DataSourcesReactiveOracleConfig;
import io.quarkus.reactive.oracle.client.runtime.OraclePoolRecorder;
import io.quarkus.reactive.oracle.client.runtime.OracleServiceBindingConverter;
import io.quarkus.runtime.RuntimeValue;
import io.quarkus.smallrye.health.deployment.spi.HealthBuildItem;
import io.quarkus.vertx.core.deployment.EventLoopCountBuildItem;
Expand Down Expand Up @@ -88,7 +90,13 @@ DevServicesDatasourceConfigurationHandlerBuildItem devDbHandler() {
}

@BuildStep
void registerServiceBinding(BuildProducer<DefaultDataSourceDbKindBuildItem> dbKind) {
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",
OracleServiceBindingConverter.class.getName()));
}
dbKind.produce(new DefaultDataSourceDbKindBuildItem(DatabaseKind.ORACLE));
}

Expand Down
5 changes: 5 additions & 0 deletions extensions/reactive-oracle-client/runtime/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@
<artifactId>quarkus-smallrye-health</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-kubernetes-service-binding</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.quarkus.reactive.oracle.client.runtime;

import java.util.List;
import java.util.Optional;

import io.quarkus.kubernetes.service.binding.runtime.ReactiveDatasourceServiceBindingConfigSourceFactory;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBinding;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConfigSource;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConverter;

public class OracleServiceBindingConverter implements ServiceBindingConverter {

@Override
public Optional<ServiceBindingConfigSource> convert(List<ServiceBinding> serviceBindings) {
return ServiceBinding.singleMatchingByType("oracle", serviceBindings)
.map(new ReactiveDatasourceServiceBindingConfigSourceFactory("oracle"));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
io.quarkus.reactive.oracle.client.runtime.OracleServiceBindingConverter
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import io.quarkus.deployment.builditem.ServiceStartBuildItem;
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.deployment.builditem.nativeimage.NativeImageConfigBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
import io.quarkus.reactive.datasource.ReactiveDataSource;
import io.quarkus.reactive.datasource.deployment.VertxPoolBuildItem;
Expand All @@ -35,6 +36,7 @@
import io.quarkus.reactive.datasource.runtime.DataSourcesReactiveRuntimeConfig;
import io.quarkus.reactive.pg.client.runtime.DataSourcesReactivePostgreSQLConfig;
import io.quarkus.reactive.pg.client.runtime.PgPoolRecorder;
import io.quarkus.reactive.pg.client.runtime.PostgreSQLServiceBindingConverter;
import io.quarkus.runtime.RuntimeValue;
import io.quarkus.smallrye.health.deployment.spi.HealthBuildItem;
import io.quarkus.vertx.core.deployment.EventLoopCountBuildItem;
Expand Down Expand Up @@ -120,7 +122,13 @@ void addHealthCheck(
}

@BuildStep
void registerServiceBinding(BuildProducer<DefaultDataSourceDbKindBuildItem> dbKind) {
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));
}

Expand Down
5 changes: 5 additions & 0 deletions extensions/reactive-pg-client/runtime/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@
<artifactId>quarkus-smallrye-health</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-kubernetes-service-binding</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.quarkus.reactive.pg.client.runtime;

import java.util.List;
import java.util.Optional;

import io.quarkus.kubernetes.service.binding.runtime.ReactiveDatasourceServiceBindingConfigSourceFactory;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBinding;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConfigSource;
import io.quarkus.kubernetes.service.binding.runtime.ServiceBindingConverter;

public class PostgreSQLServiceBindingConverter implements ServiceBindingConverter {

@Override
public Optional<ServiceBindingConfigSource> convert(List<ServiceBinding> serviceBindings) {
return ServiceBinding.singleMatchingByType("postgresql", serviceBindings)
.map(new ReactiveDatasourceServiceBindingConfigSourceFactory("postgresql"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
io.quarkus.reactive.pg.client.runtime.PostgreSQLServiceBindingConverter

0 comments on commit 0d08b98

Please sign in to comment.