From 9dcdf20c6e52adc172551d381b378f71529bcbc2 Mon Sep 17 00:00:00 2001 From: Abel Salgado Romero Date: Thu, 22 Dec 2022 09:57:33 +0100 Subject: [PATCH 1/9] Bump Maven plugins --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2afa54c..08765f8 100644 --- a/pom.xml +++ b/pom.xml @@ -38,9 +38,9 @@ 2.3.3.RELEASE - 3.8.1 + 3.10.1 3.2.1 - 2.22.2 + 3.0.0-M7 3.0.1 3.4.1 From 909f3b5e0d02dec638df802bcff2e257a88f9e32 Mon Sep 17 00:00:00 2001 From: Abel Salgado Romero Date: Thu, 22 Dec 2022 09:58:43 +0100 Subject: [PATCH 2/9] Bump r2dbc-mariadb to 1.1.2 (fixes CVEs) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 08765f8..2f9aa08 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ 1.8 3.0.2 - 1.0.3 + 1.1.2 2.3.3.RELEASE From 3eb455dc2b2482bcf99f93a6fe999738dd947474 Mon Sep 17 00:00:00 2001 From: Anthony Dahanne Date: Mon, 13 Feb 2023 14:25:29 -0500 Subject: [PATCH 3/9] Bump to latest 2.5 spring boot release --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2f9aa08..789634c 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ 1.8 3.0.2 1.1.2 - 2.3.3.RELEASE + 2.5.14 3.10.1 From d0eede8855a52d0b0ece7674944d8fb6755ec05d Mon Sep 17 00:00:00 2001 From: Anthony Dahanne Date: Tue, 14 Feb 2023 18:34:46 -0500 Subject: [PATCH 4/9] Compat with Spring Boot 3 Contains feedback from @Kehrlann Original commit by @abelsromero - amended to keep compatibility with Spring Boot 2 * Artemis * Updated 'host' to 'broker-url' * Fixed some rabbitmq properties in ArtemisBindingsPropertiesProcessor * Cassandra * Fixed configuration properties: see https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#cassandra-properties * Added 'throttler' properties: see https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.5-Release-Notes#cassandra-throttling-properties * Couchbase * Updated based on https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties.data and spring-projects/spring-boot@abe43b2 * Elastic * Based on docs, clients have been consolidated, so most properties have been removed. * Updated based on https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.6-Release-Notes#elasticsearch-property-consolidation * Neo4j * Updated properties prefix: https://github.com/spring-projects/spring-data-neo4j/blob/main/src/main/asciidoc/appendix/migrating.adoc * Redis * Updated properties prefix: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#redis-properties * Vault, matched properties with https://github.com/spring-cloud/spring-cloud-vault/blob/main/spring-cloud-vault-config/src/main/java/org/springframework/cloud/vault/config/VaultProperties.java * NOTE: 'spring.cloud.vault.aws-iam.server-id' seems it never existed, it was alwasy serverName and spring-cloud/spring-cloud-vault@9cff9eb * Added new metadata-service and identity-token-service properties for AZURE_MSI * Added 'trust-store' configuration for CERT. * Ignored 'key-store-type' & 'trust-store-type' for simplicity. Current approach implies users need to convert to JKS. * Fixed 'gcp-service-account' * Added K8s token-file --- README.md | 182 +++++++++---- .../ArtemisBindingsPropertiesProcessor.java | 116 ++++++-- ...dingFlattenedEnvironmentPostProcessor.java | 10 +- ...ndingSpecificEnvironmentPostProcessor.java | 13 +- .../CassandraBindingsPropertiesProcessor.java | 93 +++++-- .../CouchbaseBindingsPropertiesProcessor.java | 82 ++++-- ...sticsearchBindingsPropertiesProcessor.java | 83 ++++-- .../Neo4JBindingsPropertiesProcessor.java | 70 ++++- ...PostgreSqlBindingsPropertiesProcessor.java | 3 +- .../RedisBindingsPropertiesProcessor.java | 97 +++++-- .../boot/SpringBootVersionResolver.java | 23 ++ .../VaultBindingsPropertiesProcessor.java | 249 +++++++++++++----- src/main/resources/META-INF/spring.factories | 24 +- ...rtemisBindingsPropertiesProcessorTest.java | 34 ++- ...FlattenedEnvironmentPostProcessorTest.java | 8 +- ...gSpecificEnvironmentPostProcessorTest.java | 6 +- ...sandraBindingsPropertiesProcessorTest.java | 39 ++- ...chbaseBindingsPropertiesProcessorTest.java | 34 ++- ...searchBindingsPropertiesProcessorTest.java | 33 ++- .../Neo4JBindingsPropertiesProcessorTest.java | 23 +- .../RedisBindingsPropertiesProcessorTest.java | 32 ++- .../boot/SpringBootVersionResolverTest.java | 33 +++ .../VaultBindingsPropertiesProcessorTest.java | 83 +++++- 23 files changed, 1077 insertions(+), 293 deletions(-) create mode 100644 src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java create mode 100644 src/test/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolverTest.java diff --git a/README.md b/README.md index 8a0b947..1ed4715 100644 --- a/README.md +++ b/README.md @@ -38,12 +38,25 @@ Each auto-configuration is triggered by the type of binding. Each auto-configur Type: `artemis` Disable Property: `org.springframework.cloud.bindings.boot.artemis.enable` +#### Spring Boot 2 properties + | Property | Value | | --------------------------------------------------- | -------------------------------------- | | `spring.artemis.host` | `{host}` | +| `spring.artemis.port` | `{port}` | + +#### Spring Boot 3 properties + +| Property | Value | +| --------------------------------------------------- | -------------------------------------- | +| `spring.artemis.broker-url` | `{broker-url}` | + +#### Common properties + +| Property | Value | +| --------------------------------------------------- | -------------------------------------- | | `spring.artemis.mode` | `{mode}` | | `spring.artemis.password` | `{password}` | -| `spring.artemis.port` | `{port}` | | `spring.artemis.user` | `{user}` | | `spring.artemis.embedded.cluster-password` | `{embedded.cluster-password}` | | `spring.artemis.embedded.data-directory` | `{embedded.data-directory}` | @@ -65,30 +78,67 @@ Disable Property: `org.springframework.cloud.bindings.boot.artemis.enable` Type: `cassandra` Disable Property: `org.springframework.cloud.bindings.boot.cassandra.enable` -| Property | Value | -| -------------------------------------- | ------------------ | -| `spring.data.cassandra.cluster-name` | `{cluster-name}` | -| `spring.data.cassandra.compression` | `{compression}` | -| `spring.data.cassandra.contact-points` | `{contact-points}` | -| `spring.data.cassandra.keyspace-name` | `{keyspace-name}` | -| `spring.data.cassandra.password` | `{password}` | -| `spring.data.cassandra.port` | `{port}` | -| `spring.data.cassandra.ssl` | `{ssl}` | -| `spring.data.cassandra.username` | `{username}` | +#### Spring Boot 2 properties + +| Property | Value | +|-------------------------------------------------------------------|-----------------------------------------------| +| `spring.data.cassandra.cluster-name` | `{cluster-name}` | +| `spring.data.cassandra.compression` | `{compression}` | +| `spring.data.cassandra.contact-points` | `{contact-points}` | +| `spring.data.cassandra.keyspace-name` | `{keyspace-name}` | +| `spring.data.cassandra.password` | `{password}` | +| `spring.data.cassandra.port` | `{port}` | +| `spring.data.cassandra.ssl` | `{ssl}` | +| `spring.data.cassandra.username` | `{username}` | +| `spring.data.cassandra.request.throttler.drain-interval` | `{request.throttler.drain-interval}` | +| `spring.data.cassandra.request.throttler.max-concurrent-requests` | `{request.throttler.max-concurrent-requests}` | +| `spring.data.cassandra.request.throttler.max-queue-size` | `{request.throttler.max-queue-size}` | +| `spring.data.cassandra.request.throttler.max-requests-per-second` | `{request.throttler.max-requests-per-second}` | + +#### Spring Boot 3 properties + +| Property | Value | +|--------------------------------------------------------------|-----------------------------------------------| +| `spring.cassandra.cluster-name` | `{cluster-name}` | +| `spring.cassandra.compression` | `{compression}` | +| `spring.cassandra.contact-points` | `{contact-points}` | +| `spring.cassandra.keyspace-name` | `{keyspace-name}` | +| `spring.cassandra.password` | `{password}` | +| `spring.cassandra.port` | `{port}` | +| `spring.cassandra.ssl` | `{ssl}` | +| `spring.cassandra.username` | `{username}` | +| `spring.cassandra.request.throttler.drain-interval` | `{request.throttler.drain-interval}` | +| `spring.cassandra.request.throttler.max-concurrent-requests` | `{request.throttler.max-concurrent-requests}` | +| `spring.cassandra.request.throttler.max-queue-size` | `{request.throttler.max-queue-size}` | +| `spring.cassandra.request.throttler.max-requests-per-second` | `{request.throttler.max-requests-per-second}` | ### Couchbase Type: `couchbase` Disable Property: `org.springframework.cloud.bindings.boot.couchbase.enable` +#### Spring Boot 2 properties + | Property | Value | -| ------------------------------------------------- | ---------------------------------- | +|---------------------------------------------------|------------------------------------| | `spring.couchbase.bootstrap-hosts` | `{bootstrap-hosts}` | | `spring.couchbase.bucket.name` | `{bucket.name}` | | `spring.couchbase.bucket.password` | `{bucket.passsword}` | | `spring.couchbase.env.bootstrap.http-direct-port` | `{env.bootstrap.http-direct-port}` | | `spring.couchbase.env.bootstrap.http-ssl-port` | `{env.bootstrap.http-ssl-port}` | -| `spring.couchbase.password` | `{password}` | -| `spring.couchbase.username` | `{username}` | + +#### Spring Boot 3 properties + +| Property | Value | +|--------------------------------------------------|---------------------------| +| `spring.couchbase.connection-string` | `{connection-string}` | +| `spring.data.couchbase.bucket-name` | `{bucket-name}` | + +#### Common properties + +| Property | Value | +|---------------------------------------------------|---------------------------| +| `spring.couchbase.password` | `{password}` | +| `spring.couchbase.username` | `{username}` | ### DB2 RDBMS Type: `db2` @@ -109,6 +159,8 @@ Disable Property: `org.springframework.cloud.bindings.boot.db2.enable` Type: `elasticsearch` Disable Property: `org.springframework.cloud.bindings.boot.elasticsearch.enable` +#### Spring Boot 2 properties + | Property | Value | | ----------------------------------------------------- | -------------- | | `spring.data.elasticsearch.client.reactive.endpoints` | `{endpoints}` | @@ -123,6 +175,14 @@ Disable Property: `org.springframework.cloud.bindings.boot.elasticsearch.enable` | `spring.elasticsearch.rest.uris` | `{uris}` | | `spring.elasticsearch.rest.username` | `{username}` | +#### Spring Boot 3 properties + +| Property | Value | +|---------------------------------|---------------| +| `spring.elasticsearch.password` | `{password}` | +| `spring.elasticsearch.uris` | `{uris}` | +| `spring.elasticsearch.username` | `{username}` | + ### Kafka Type: `kafka` Disable Property: `org.springframework.cloud.bindings.boot.kafka.enable` @@ -180,11 +240,21 @@ Disable Property: `org.springframework.cloud.bindings.boot.mysql.enable` Type: `neo4j` Disable Property: `org.springframework.cloud.bindings.boot.neo4j.enable` +#### Spring Boot 2 properties + | Property | Value | | ---------------------------- | ------------ | -| `spring.data.neo4j.password` | `{password}` | | `spring.data.neo4j.uri` | `{uri}` | | `spring.data.neo4j.username` | `{username}` | +| `spring.data.neo4j.password` | `{password}` | + +#### Spring Boot 3 properties + +| Property | Value | +|-----------------------------------------|----------------| +| `spring.neo4j.uri` | `{uri}` | +| `spring.neo4j.authentication.username` | `{username}` | +| `spring.neo4j.authentication.password` | `{password}` | ### Oracle RDBMS Type: `oracle` @@ -231,6 +301,8 @@ Disable Property: `org.springframework.cloud.bindings.boot.rabbitmq.enable` Type: `redis` Disable Property: `org.springframework.cloud.bindings.boot.redis.enable` +#### Spring Boot 2 properties + | Property | Value | | ------------------------------------ | ------------------------- | | `spring.redis.client-name` | `{client-name}` | @@ -245,6 +317,22 @@ Disable Property: `org.springframework.cloud.bindings.boot.redis.enable` | `spring.redis.ssl` | `{ssl}` | | `spring.redis.url` | `{url}` | +#### Spring Boot 3 properties + +| Property | Value | +|-------------------------------------------|---------------------------| +| `spring.data.redis.client-name` | `{client-name}` | +| `spring.data.redis.cluster.max-redirects` | `{cluster.max-redirects}` | +| `spring.data.redis.cluster.nodes` | `{cluster.nodes}` | +| `spring.data.redis.database` | `{database}` | +| `spring.data.redis.host` | `{host}` | +| `spring.data.redis.password` | `{password}` | +| `spring.data.redis.port` | `{port}` | +| `spring.data.redis.sentinel.master` | `{sentinel.master}` | +| `spring.data.redis.sentinel.nodes` | `{sentinel.nodes}` | +| `spring.data.redis.ssl` | `{ssl}` | +| `spring.data.redis.url` | `{url}` | + ### SAP Hana Type: `hana` Disable Property: `org.springframework.cloud.bindings.boot.hana.enable` @@ -361,25 +449,30 @@ If `{authentication-method}` is equal to `aws_ec2`: | `spring.cloud.vault.aws-ec2.role` | `{role}` | If `{authentication-method}` is equal to `aws_iam`: -| Property | Value | -| ----------------------------------------- | ------------------------ | -| `spring.cloud.vault.aws-iam.aws-path` | `{aws-path}` | -| `spring.cloud.vault.aws-iam.endpoint-uri` | `{aws-sts-endpoint-uri}` | -| `spring.cloud.vault.aws-iam.role` | `{role}` | -| `spring.cloud.vault.aws-iam.server-id` | `{aws-iam-server-id}` | +| Property | Value | +|-------------------------------------------|----------------------------------------| +| `spring.cloud.vault.aws-iam.aws-path` | `{aws-path}` | +| `spring.cloud.vault.aws-iam.endpoint-uri` | `{aws-sts-endpoint-uri}` | +| `spring.cloud.vault.aws-iam.role` | `{role}` | +| `spring.cloud.vault.aws-iam.server-id` | `{aws-iam-server-id}` Spring Boot 2 | +| `spring.cloud.vault.aws-iam.server-name` | `{aws-iam-server-name}` Spring Boot 3 | If `{authentication-method}` is equal to `azure_msi`: -| Property | Value | -| ----------------------------------------- | -------------- | -| `spring.cloud.vault.azure-msi.azure-path` | `{azure-path}` | -| `spring.cloud.vault.azure-msi.role` | `{role}` | +| Property | Value | +|-------------------------------------------------------|------------------------------------------| +| `spring.cloud.vault.azure-msi.azure-path` | `{azure-path}` | +| `spring.cloud.vault.azure-msi.role` | `{role}` | +| `spring.cloud.vault.azure-msi.metadata-service` | `{metadata-service}` Spring Boot 3 | +| `spring.cloud.vault.azure-msi.identity-token-service` | `{identity-token-service}` Spring Boot 3 | If `{authentication-method}` is equal to `cert`: -| Property | Value | -| ------------------------------------------- | --------------------------------------------- | -| `spring.cloud.vault.ssl.cert-auth-path` | `{cert-auth-path}` | -| `spring.cloud.vault.ssl.key-store-password` | `{key-store-password}` | -| `spring.cloud.vault.ssl.key-store` | `${SERVICE_BINDING_ROOT}/{name}/keystore.jks` | +| Property | Value | +|-----------------------------------------------|---------------------------------------------------------------| +| `spring.cloud.vault.ssl.cert-auth-path` | `{cert-auth-path}` | +| `spring.cloud.vault.ssl.key-store-password` | `{key-store-password}` | +| `spring.cloud.vault.ssl.key-store` | `${SERVICE_BINDING_ROOT}/{name}/keystore.jks` | +| `spring.cloud.vault.ssl.trust-store` | `${SERVICE_BINDING_ROOT}/{name}/truststore.jks` Spring Boot 3 | +| `spring.cloud.vault.ssl.trust-store-password` | `{trust-store-password}` Spring Boot 3 | If `{authentication-method}` is equal to `cubbyhole`: | Property | Value | @@ -393,23 +486,24 @@ If `{authentication-method}` is equal to `gcp_gce`: | `spring.cloud.vault.gcp-gce.role` | `{role}` | | `spring.cloud.vault.gcp-gce.service-account` | `{gcp-service-account}` | - If `{authentication-method}` is equal to `gcp_iam`: -| Property | Value | -| ---------------------------------------------------- | ------------------------------------------------- | -| `spring.cloud.vault.gcp-iam.credentials.encoded-key` | `{encoded-key}` | -| `spring.cloud.vault.gcp-iam.credentials.location` | `${SERVICE_BINDING_ROOT}/{name}/credentials.json` | -| `spring.cloud.vault.gcp-iam.gcp-path` | `{gcp-path}` | -| `spring.cloud.vault.gcp-iam.jwt-validity` | `{jwt-validity}` | -| `spring.cloud.vault.gcp-iam.project-id` | `{gcp-project-id}` | -| `spring.cloud.vault.gcp-iam.role` | `{role}` | -| `spring.cloud.vault.gcp-iam.service-account` | `{gcp-service-account}` | +| Property | Value | +|------------------------------------------------------|----------------------------------------------------| +| `spring.cloud.vault.gcp-iam.credentials.encoded-key` | `{encoded-key}` | +| `spring.cloud.vault.gcp-iam.credentials.location` | `${SERVICE_BINDING_ROOT}/{name}/credentials.json` | +| `spring.cloud.vault.gcp-iam.gcp-path` | `{gcp-path}` | +| `spring.cloud.vault.gcp-iam.jwt-validity` | `{jwt-validity}` | +| `spring.cloud.vault.gcp-iam.project-id` | `{gcp-project-id}` | +| `spring.cloud.vault.gcp-iam.role` | `{role}` | +| `spring.cloud.vault.gcp-iam.service-account` | `{gcp-service-account}` Spring Boot 2 | +| `spring.cloud.vault.gcp-iam.service-account-id` | `{gcp-service-account}` Spring Boot 3 | If `{authentication-method}` is equal to `kubernetes`: -| Property | Value | -| ----------------------------------------------- | ------------------- | -| `spring.cloud.vault.kubernetes.kubernetes-path` | `{kubernetes-path}` | -| `spring.cloud.vault.kubernetes.role` | `{role}` | +| Property | Value | +|-----------------------------------------------------------------------|---------------------------------------------------------| +| `spring.cloud.vault.kubernetes.role` | `{role}` | +| `spring.cloud.vault.kubernetes.kubernetes-path` | `{kubernetes-path}` | +| `spring.cloud.vault.kubernetes.kubernetes-service-account-token-file` | `{kubernetes-service-account-token-file}` Spring Boot 3 | If `{authentication-method}` is equal to `token`: | Property | Value | diff --git a/src/main/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessor.java b/src/main/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessor.java index 0461210..fb9e328 100644 --- a/src/main/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessor.java +++ b/src/main/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessor.java @@ -27,45 +27,105 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -public final class ArtemisBindingsPropertiesProcessor implements BindingsPropertiesProcessor { +public final class ArtemisBindingsPropertiesProcessor { /** * The {@link Binding} type that this processor is interested in: {@value}. **/ public static final String TYPE = "artemis"; - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; + public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { + + private static final int BOOT_VERSION = 2; + + Boot2(int forcedVersion) { + super(forcedVersion); } - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); + public Boot2() { + } - map.from("host").to("spring.artemis.host"); - map.from("mode").to("spring.artemis.mode"); - map.from("password").to("spring.artemis.password"); - map.from("port").to("spring.artemis.port"); - map.from("user").to("spring.artemis.user"); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; + } + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; + } - map.from("embedded.cluster-password").to("spring.artemis.embedded.cluster-password"); - map.from("embedded.data-directory").to("spring.artemis.embedded.data-directory"); - map.from("embedded.enabled").to("spring.artemis.embedded.enabled"); - map.from("embedded.persistent").to("spring.artemis.embedded.persistent"); - map.from("embedded.queues").to("spring.artemis.embedded.queues"); - map.from("embedded.server-id").to("spring.artemis.embedded.server-id"); - map.from("embedded.topics").to("spring.artemis.embedded.topics"); + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("host").to("spring.artemis.host"); + map.from("port").to("spring.artemis.port"); - map.from("pool.block-if-full").to("spring.rabbitmq.pool.block-if-full"); - map.from("pool.block-if-full-timeout").to("spring.rabbitmq.pool.block-if-full-timeout"); - map.from("pool.enabled").to("spring.rabbitmq.pool.enabled"); - map.from("pool.idle-timeout").to("spring.rabbitmq.pool.idle-timeout"); - map.from("pool.max-connections").to("spring.rabbitmq.pool.max-connections"); - map.from("pool.max-sessions-per-connection").to("spring.rabbitmq.pool.max-sessions-per-connection"); - map.from("pool.time-between-expiration-check").to("spring.rabbitmq.pool.time-between-expiration-check"); - map.from("pool.use-anonymous-producers").to("spring.rabbitmq.pool.use-anonymous-producers"); - }); + map.from("pool.block-if-full").to("spring.rabbitmq.pool.block-if-full"); + map.from("pool.block-if-full-timeout").to("spring.rabbitmq.pool.block-if-full-timeout"); + map.from("pool.enabled").to("spring.rabbitmq.pool.enabled"); + map.from("pool.idle-timeout").to("spring.rabbitmq.pool.idle-timeout"); + map.from("pool.max-connections").to("spring.rabbitmq.pool.max-connections"); + map.from("pool.max-sessions-per-connection").to("spring.rabbitmq.pool.max-sessions-per-connection"); + map.from("pool.time-between-expiration-check").to("spring.rabbitmq.pool.time-between-expiration-check"); + map.from("pool.use-anonymous-producers").to("spring.rabbitmq.pool.use-anonymous-producers"); + + commonProperties(map); + }); + } + } + + /** + * This is a special case for Boot 3. + */ + public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { + + private static final int BOOT_VERSION = 3; + + Boot3(int forcedVersion) { + super(forcedVersion); + } + + public Boot3() { + } + + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; + } + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; + } + + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("broker-url").to("spring.artemis.broker-url"); + + map.from("pool.block-if-full").to("spring.artemis.pool.block-if-full"); + map.from("pool.block-if-full-timeout").to("spring.artemis.pool.block-if-full-timeout"); + map.from("pool.enabled").to("spring.artemis.pool.enabled"); + map.from("pool.idle-timeout").to("spring.artemis.pool.idle-timeout"); + map.from("pool.max-connections").to("spring.artemis.pool.max-connections"); + map.from("pool.max-sessions-per-connection").to("spring.artemis.pool.max-sessions-per-connection"); + map.from("pool.time-between-expiration-check").to("spring.artemis.pool.time-between-expiration-check"); + map.from("pool.use-anonymous-producers").to("spring.artemis.pool.use-anonymous-producers"); + + commonProperties(map); + }); + } + } + + private static void commonProperties(MapMapper map) { + map.from("mode").to("spring.artemis.mode"); + map.from("password").to("spring.artemis.password"); + map.from("user").to("spring.artemis.user"); + + map.from("embedded.cluster-password").to("spring.artemis.embedded.cluster-password"); + map.from("embedded.data-directory").to("spring.artemis.embedded.data-directory"); + map.from("embedded.enabled").to("spring.artemis.embedded.enabled"); + map.from("embedded.persistent").to("spring.artemis.embedded.persistent"); + map.from("embedded.queues").to("spring.artemis.embedded.queues"); + map.from("embedded.server-id").to("spring.artemis.embedded.server-id"); + map.from("embedded.topics").to("spring.artemis.embedded.topics"); } } diff --git a/src/main/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessor.java b/src/main/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessor.java index 7f7d4a9..82ce617 100644 --- a/src/main/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessor.java +++ b/src/main/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessor.java @@ -16,8 +16,11 @@ package org.springframework.cloud.bindings.boot; +import java.util.HashMap; +import java.util.Map; + import org.springframework.boot.SpringApplication; -import org.springframework.boot.context.config.ConfigFileApplicationListener; +import org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor; import org.springframework.boot.context.event.ApplicationPreparedEvent; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.boot.logging.DeferredLog; @@ -26,9 +29,6 @@ import org.springframework.context.ApplicationListener; import org.springframework.core.Ordered; import org.springframework.core.env.ConfigurableEnvironment; -import java.util.HashMap; -import java.util.Map; - import static org.springframework.cloud.bindings.boot.PropertySourceContributor.contributePropertySource; /** @@ -59,7 +59,7 @@ public final class BindingFlattenedEnvironmentPostProcessor implements Applicati @Override public int getOrder() { // Before ConfigFileApplicationListener so values there can use values from {@link Bindings}. - return ConfigFileApplicationListener.DEFAULT_ORDER - 1; + return ConfigDataEnvironmentPostProcessor.ORDER - 1; } @Override diff --git a/src/main/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessor.java b/src/main/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessor.java index f02c588..2e86133 100644 --- a/src/main/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessor.java +++ b/src/main/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessor.java @@ -16,8 +16,13 @@ package org.springframework.cloud.bindings.boot; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.springframework.boot.SpringApplication; -import org.springframework.boot.context.config.ConfigFileApplicationListener; +import org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor; import org.springframework.boot.context.event.ApplicationPreparedEvent; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.boot.logging.DeferredLog; @@ -28,10 +33,6 @@ import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.PropertySource; import org.springframework.core.io.support.SpringFactoriesLoader; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import static org.springframework.cloud.bindings.boot.Guards.isGlobalEnabled; import static org.springframework.cloud.bindings.boot.PropertySourceContributor.contributePropertySource; @@ -77,7 +78,7 @@ public final class BindingSpecificEnvironmentPostProcessor implements Applicatio @Override public int getOrder() { // Before ConfigFileApplicationListener so values there can use values from {@link Bindings}. - return ConfigFileApplicationListener.DEFAULT_ORDER - 1; + return ConfigDataEnvironmentPostProcessor.ORDER - 1; } @Override diff --git a/src/main/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessor.java b/src/main/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessor.java index d6936c4..7955681 100644 --- a/src/main/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessor.java +++ b/src/main/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessor.java @@ -27,31 +27,92 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -public final class CassandraBindingsPropertiesProcessor implements BindingsPropertiesProcessor { +public final class CassandraBindingsPropertiesProcessor { /** * The {@link Binding} type that this processor is interested in: {@value}. **/ public static final String TYPE = "cassandra"; - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; + public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { + + private static final int BOOT_VERSION = 2; + + Boot2(int forcedVersion) { + super(forcedVersion); } - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); + public Boot2() { + } - map.from("cluster-name").to("spring.data.cassandra.cluster-name"); - map.from("compression").to("spring.data.cassandra.compression"); - map.from("contact-points").to("spring.data.cassandra.contact-points"); - map.from("keyspace-name").to("spring.data.cassandra.keyspace-name"); - map.from("password").to("spring.data.cassandra.password"); - map.from("port").to("spring.data.cassandra.port"); - map.from("ssl").to("spring.data.cassandra.ssl"); - map.from("username").to("spring.data.cassandra.username"); - }); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; + } + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; + } + + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("cluster-name").to("spring.data.cassandra.cluster-name"); + map.from("compression").to("spring.data.cassandra.compression"); + map.from("contact-points").to("spring.data.cassandra.contact-points"); + map.from("keyspace-name").to("spring.data.cassandra.keyspace-name"); + map.from("password").to("spring.data.cassandra.password"); + map.from("port").to("spring.data.cassandra.port"); + map.from("ssl").to("spring.data.cassandra.ssl"); + map.from("username").to("spring.data.cassandra.username"); + + map.from("request.throttler.drain-interval").to("spring.data.cassandra.request.throttler.drain-interval"); + map.from("request.throttler.max-concurrent-requests").to("spring.data.cassandra.request.throttler.max-concurrent-requests"); + map.from("request.throttler.max-queue-size").to("spring.data.cassandra.request.throttler.max-queue-size"); + map.from("request.throttler.max-requests-per-second").to("spring.data.cassandra.request.throttler.max-requests-per-second"); + }); + } + } + + /** + * This is a special case for Boot 3. + */ + public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { + + private static final int BOOT_VERSION = 3; + + Boot3(int forcedVersion) { + super(forcedVersion); + } + + public Boot3() { + } + + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; + } + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; + } + + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("cluster-name").to("spring.cassandra.cluster-name"); + map.from("compression").to("spring.cassandra.compression"); + map.from("contact-points").to("spring.cassandra.contact-points"); + map.from("keyspace-name").to("spring.cassandra.keyspace-name"); + map.from("password").to("spring.cassandra.password"); + map.from("port").to("spring.cassandra.port"); + map.from("ssl").to("spring.cassandra.ssl"); + map.from("username").to("spring.cassandra.username"); + + map.from("request.throttler.drain-interval").to("spring.cassandra.request.throttler.drain-interval"); + map.from("request.throttler.max-concurrent-requests").to("spring.cassandra.request.throttler.max-concurrent-requests"); + map.from("request.throttler.max-queue-size").to("spring.cassandra.request.throttler.max-queue-size"); + map.from("request.throttler.max-requests-per-second").to("spring.cassandra.request.throttler.max-requests-per-second"); + }); + } } } diff --git a/src/main/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessor.java b/src/main/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessor.java index 6602989..c595422 100644 --- a/src/main/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessor.java +++ b/src/main/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessor.java @@ -27,30 +27,82 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -final class CouchbaseBindingsPropertiesProcessor implements BindingsPropertiesProcessor { +final class CouchbaseBindingsPropertiesProcessor { /** * The {@link Binding} type that this processor is interested in: {@value}. **/ public static final String TYPE = "couchbase"; - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; + public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { + + private static final int BOOT_VERSION = 2; + + Boot2(int forcedVersion) { + super(forcedVersion); } - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); + public Boot2() { + } - map.from("bootstrap-hosts").to("spring.couchbase.bootstrap-hosts"); - map.from("bucket.name").to("spring.couchbase.bucket.name"); - map.from("bucket.password").to("spring.couchbase.bucket.password"); - map.from("env.bootstrap.http-direct-port").to("spring.couchbase.env.bootstrap.http-direct-port"); - map.from("env.bootstrap.http-ssl-port").to("spring.couchbase.env.bootstrap.http-ssl-port"); - map.from("password").to("spring.couchbase.password"); - map.from("username").to("spring.couchbase.username"); - }); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; + } + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; + } + + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("bootstrap-hosts").to("spring.couchbase.bootstrap-hosts"); + map.from("bucket.name").to("spring.couchbase.bucket.name"); + map.from("bucket.password").to("spring.couchbase.bucket.password"); + map.from("env.bootstrap.http-direct-port").to("spring.couchbase.env.bootstrap.http-direct-port"); + map.from("env.bootstrap.http-ssl-port").to("spring.couchbase.env.bootstrap.http-ssl-port"); + commonProperties(map); + + }); + } + } + + /** + * This is a special case for Boot 3. + */ + public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { + + private static final int BOOT_VERSION = 3; + + Boot3(int forcedVersion) { + super(forcedVersion); + } + + public Boot3() { + } + + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; + } + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; + } + + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("bucket-name").to("spring.data.couchbase.bucket-name"); + map.from("connection-string").to("spring.couchbase.connection-string"); + commonProperties(map); + + }); + } + } + + private static void commonProperties(MapMapper map) { + map.from("password").to("spring.couchbase.password"); + map.from("username").to("spring.couchbase.username"); } } diff --git a/src/main/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessor.java b/src/main/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessor.java index 1cc75df..0d21031 100644 --- a/src/main/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessor.java +++ b/src/main/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessor.java @@ -27,35 +27,80 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -final class ElasticsearchBindingsPropertiesProcessor implements BindingsPropertiesProcessor { +final class ElasticsearchBindingsPropertiesProcessor { /** * The {@link Binding} type that this processor is interested in: {@value}. **/ public static final String TYPE = "elasticsearch"; + public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; + private static final int BOOT_VERSION = 2; + + Boot2(int forcedVersion) { + super(forcedVersion); } - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); + public Boot2() { + } - map.from("endpoints").to("spring.data.elasticsearch.client.reactive.endpoints"); - map.from("password").to("spring.data.elasticsearch.client.reactive.password"); - map.from("use-ssl").to("spring.data.elasticsearch.client.reactive.use-ssl"); - map.from("username").to("spring.data.elasticsearch.client.reactive.username"); - map.from("password").to("spring.elasticsearch.jest.password"); - map.from("proxy.host").to("spring.elasticsearch.jest.proxy.host"); - map.from("proxy.port").to("spring.elasticsearch.jest.proxy.port"); - map.from("username").to("spring.elasticsearch.jest.username"); - map.from("password").to("spring.elasticsearch.rest.password"); - map.from("uris").to("spring.elasticsearch.rest.uris"); - map.from("username").to("spring.elasticsearch.rest.username"); - }); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; + } + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; + } + + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("endpoints").to("spring.data.elasticsearch.client.reactive.endpoints"); + map.from("password").to("spring.data.elasticsearch.client.reactive.password"); + map.from("use-ssl").to("spring.data.elasticsearch.client.reactive.use-ssl"); + map.from("username").to("spring.data.elasticsearch.client.reactive.username"); + map.from("password").to("spring.elasticsearch.jest.password"); + map.from("proxy.host").to("spring.elasticsearch.jest.proxy.host"); + map.from("proxy.port").to("spring.elasticsearch.jest.proxy.port"); + map.from("username").to("spring.elasticsearch.jest.username"); + map.from("password").to("spring.elasticsearch.rest.password"); + map.from("uris").to("spring.elasticsearch.rest.uris"); + map.from("username").to("spring.elasticsearch.rest.username"); + }); + } + } + + /** + * This is a special case for Boot 3. + */ + public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { + + private static final int BOOT_VERSION = 3; + + Boot3(int forcedVersion) { + super(forcedVersion); + } + + public Boot3() { + } + + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; + } + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; + } + + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("password").to("spring.elasticsearch.password"); + map.from("uris").to("spring.elasticsearch.uris"); + map.from("username").to("spring.elasticsearch.username"); + }); + } } } diff --git a/src/main/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessor.java b/src/main/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessor.java index b40be29..2daffb1 100644 --- a/src/main/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessor.java +++ b/src/main/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessor.java @@ -27,25 +27,73 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -final class Neo4JBindingsPropertiesProcessor implements BindingsPropertiesProcessor { +final class Neo4JBindingsPropertiesProcessor { /** * The {@link Binding} type that this processor is interested in: {@value}. **/ public static final String TYPE = "neo4j"; - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; + public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { + + private static final int BOOT_VERSION = 2; + + Boot2(int forcedVersion) { + super(forcedVersion); } - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); + public Boot2() { + } - map.from("password").to("spring.data.neo4j.password"); - map.from("uri").to("spring.data.neo4j.uri"); - map.from("username").to("spring.data.neo4j.username"); - }); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; + } + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; + } + + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("password").to("spring.data.neo4j.password"); + map.from("uri").to("spring.data.neo4j.uri"); + map.from("username").to("spring.data.neo4j.username"); + + }); + } + } + + /** + * This is a special case for Boot 3. + */ + public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { + + private static final int BOOT_VERSION = 3; + + Boot3(int forcedVersion) { + super(forcedVersion); + } + + public Boot3() { + } + + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; + } + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; + } + + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("password").to("spring.neo4j.authentication.password"); + map.from("uri").to("spring.neo4j.uri"); + map.from("username").to("spring.neo4j.authentication.username"); + + }); + } } } diff --git a/src/main/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessor.java b/src/main/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessor.java index b5dbe72..4cdd783 100644 --- a/src/main/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessor.java +++ b/src/main/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessor.java @@ -69,8 +69,7 @@ public final class PostgreSqlBindingsPropertiesProcessor implements BindingsProp (host, port, database) -> String.format("jdbc:postgresql://%s:%s/%s", host, port, database)); String sslParam = buildSslModeParam(binding); - String dbOptions = buildDbOptions(binding); - String sslModeOptions = dbOptions; + String sslModeOptions = buildDbOptions(binding); if (!"".equals(sslParam) && !"".equals(sslModeOptions)) { sslModeOptions = sslParam + "&" + sslModeOptions; } else if (!"".equals(sslParam) ) { diff --git a/src/main/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessor.java b/src/main/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessor.java index b1d1a71..1d54e1a 100644 --- a/src/main/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessor.java +++ b/src/main/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessor.java @@ -27,34 +27,93 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -public final class RedisBindingsPropertiesProcessor implements BindingsPropertiesProcessor { +public final class RedisBindingsPropertiesProcessor { /** * The {@link Binding} type that this processor is interested in: {@value}. **/ public static final String TYPE = "redis"; - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; + /** + * This is a special case for Boot 2. + */ + public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { + + private static final int BOOT_VERSION = 2; + + Boot2(int forcedVersion) { + super(forcedVersion); } - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); + public Boot2() { + } - map.from("client-name").to("spring.redis.client-name"); - map.from("cluster.max-redirects").to("spring.redis.cluster.max-redirects"); - map.from("cluster.nodes").to("spring.redis.cluster.nodes"); - map.from("database").to("spring.redis.database"); - map.from("host").to("spring.redis.host"); - map.from("password").to("spring.redis.password"); - map.from("port").to("spring.redis.port"); - map.from("sentinel.master").to("spring.redis.sentinel.master"); - map.from("sentinel.nodes").to("spring.redis.sentinel.nodes"); - map.from("ssl").to("spring.redis.ssl"); - map.from("url").to("spring.redis.url"); - }); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; + } + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; + } + + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + + map.from("client-name").to("spring.redis.client-name"); + map.from("cluster.max-redirects").to("spring.redis.cluster.max-redirects"); + map.from("cluster.nodes").to("spring.redis.cluster.nodes"); + map.from("database").to("spring.redis.database"); + map.from("host").to("spring.redis.host"); + map.from("password").to("spring.redis.password"); + map.from("port").to("spring.redis.port"); + map.from("sentinel.master").to("spring.redis.sentinel.master"); + map.from("sentinel.nodes").to("spring.redis.sentinel.nodes"); + map.from("ssl").to("spring.redis.ssl"); + map.from("url").to("spring.redis.url"); + }); + } + } + + /** + * This is a special case for Boot 3. + */ + public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { + + private static final int BOOT_VERSION = 3; + + Boot3(int forcedVersion) { + super(forcedVersion); + } + + public Boot3() { + } + + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; + } + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; + } + + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + + map.from("client-name").to("spring.data.redis.client-name"); + map.from("cluster.max-redirects").to("spring.data.redis.cluster.max-redirects"); + map.from("cluster.nodes").to("spring.data.redis.cluster.nodes"); + map.from("database").to("spring.data.redis.database"); + map.from("host").to("spring.data.redis.host"); + map.from("password").to("spring.data.redis.password"); + map.from("port").to("spring.data.redis.port"); + map.from("sentinel.master").to("spring.data.redis.sentinel.master"); + map.from("sentinel.nodes").to("spring.data.redis.sentinel.nodes"); + map.from("ssl").to("spring.data.redis.ssl"); + map.from("url").to("spring.data.redis.url"); + }); + } } } diff --git a/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java b/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java new file mode 100644 index 0000000..ba02cc9 --- /dev/null +++ b/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java @@ -0,0 +1,23 @@ +package org.springframework.cloud.bindings.boot; + +import org.springframework.boot.SpringBootVersion; + +public class SpringBootVersionResolver { + + private int forcedVersion; + + public SpringBootVersionResolver() { + } + + protected SpringBootVersionResolver(int forcedVersion) { + this.forcedVersion = forcedVersion; + } + + public boolean isBootMajorVersionEnabled(int bootVersion) { + if (forcedVersion != 0) { + return forcedVersion == bootVersion; + } + int major = Integer.parseInt(SpringBootVersion.getVersion().split("\\.")[0]); + return major == bootVersion; + } +} diff --git a/src/main/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessor.java b/src/main/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessor.java index f9e09a6..4a116c5 100644 --- a/src/main/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessor.java +++ b/src/main/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessor.java @@ -30,7 +30,7 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -public final class VaultBindingsPropertiesProcessor implements BindingsPropertiesProcessor, ApplicationListener { +public final class VaultBindingsPropertiesProcessor { /** * The {@link Binding} type that this processor is interested in: {@value}. @@ -39,83 +39,190 @@ public final class VaultBindingsPropertiesProcessor implements BindingsPropertie private static final DeferredLog LOG = new DeferredLog(); - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; + public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor, ApplicationListener { + + private static final int BOOT_VERSION = 2; + + Boot2(int forcedVersion) { + super(forcedVersion); } - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - map.from("uri").to("spring.cloud.vault.uri"); - map.from("namespace").to("spring.cloud.vault.namespace"); // vault enterprise feature + public Boot2() { + } - String authenticationMethod = binding.getSecret().get("authentication-method"); - if (authenticationMethod == null) { - LOG.warn(String.format("Key 'method' is missing from secret of binding '%s'", binding.getName())); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { return; } - properties.put("spring.cloud.vault.authentication", authenticationMethod); - switch (authenticationMethod.toUpperCase()) { - case "TOKEN": - case "CUBBYHOLE": - map.from("token").to("spring.cloud.vault.token"); - break; - case "APPROLE": - map.from("role-id").to("spring.cloud.vault.app-role.role-id"); - map.from("secret-id").to("spring.cloud.vault.app-role.secret-id"); - map.from("role").to("spring.cloud.vault.app-role.role"); - map.from("app-role-path").to("spring.cloud.vault.app-role.app-role-path"); - break; - case "AWS_EC2": - map.from("role").to("spring.cloud.vault.aws-ec2.role"); - map.from("aws-ec2-path").to("spring.cloud.vault.aws-ec2.aws-ec2-path"); - map.from("aws-ec2-instance-identity-document").to("spring.cloud.vault.aws-ec2.identity-document"); - map.from("nonce").to("spring.cloud.vault.aws-ec2.nonce"); - break; - case "AWS_IAM": - map.from("role").to("spring.cloud.vault.aws-iam.role"); - map.from("aws-path").to("spring.cloud.vault.aws-iam.aws-path"); - map.from("aws-iam-server-id").to("spring.cloud.vault.aws-iam.server-id"); - map.from("aws-sts-endpoint-uri").to("spring.cloud.vault.aws-iam.endpoint-uri"); - break; - case "AZURE_MSI": - map.from("role").to("spring.cloud.vault.azure-msi.role"); - map.from("azure-path").to("spring.cloud.vault.azure-msi.azure-path"); - break; - case "CERT": - properties.put("spring.cloud.vault.ssl.key-store", binding.getSecretFilePath("keystore.jks").toString()); - map.from("key-store-password").to("spring.cloud.vault.ssl.key-store-password"); - map.from("cert-auth-path").to("spring.cloud.vault.ssl.cert-auth-path"); - break; - case "GCP_GCE": - map.from("role").to("spring.cloud.vault.gcp-gce.role"); - map.from("gcp-path").to("spring.cloud.vault.gcp-gce.gcp-path"); - map.from("gcp-service-account").to("spring.cloud.vault.gcp-gce.service-account"); - break; - case "GCP_IAM": - if (binding.getSecret().containsKey("credentials.json")) { - properties.put("spring.cloud.vault.gcp-iam.credentials.location", binding.getSecretFilePath("credentials.json").toString()); - } - map.from("role").to("spring.cloud.vault.gcp-iam.role"); - map.from("encoded-key").to("spring.cloud.vault.gcp-iam.credentials.encoded-key"); - map.from("gcp-path").to("spring.cloud.vault.gcp-iam.gcp-path"); - map.from("jwt-validity").to("spring.cloud.vault.gcp-iam.jwt-validity"); - map.from("gcp-project-id").to("spring.cloud.vault.gcp-iam.project-id"); - map.from("gcp-service-account").to("spring.cloud.vault.gcp-iam.service-account"); - break; - case "KUBERNETES": - map.from("role").to("spring.cloud.vault.kubernetes.role"); - map.from("kubernetes-path").to("spring.cloud.vault.kubernetes.kubernetes-path"); - break; - default: - LOG.warn(String.format("Binding '%s' contains unrecognized 'method'", binding.getName())); + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; } - }); + + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("uri").to("spring.cloud.vault.uri"); + map.from("namespace").to("spring.cloud.vault.namespace"); // vault enterprise feature + + String authenticationMethod = binding.getSecret().get("authentication-method"); + if (authenticationMethod == null) { + LOG.warn(String.format("Key 'method' is missing from secret of binding '%s'", binding.getName())); + return; + } + properties.put("spring.cloud.vault.authentication", authenticationMethod); + switchCommonProperties(map, authenticationMethod); + switch (authenticationMethod.toUpperCase()) { + case "AWS_IAM": + map.from("role").to("spring.cloud.vault.aws-iam.role"); + map.from("aws-path").to("spring.cloud.vault.aws-iam.aws-path"); + map.from("aws-sts-endpoint-uri").to("spring.cloud.vault.aws-iam.endpoint-uri"); + map.from("aws-iam-server-id").to("spring.cloud.vault.aws-iam.server-id"); + break; + case "AZURE_MSI": + map.from("role").to("spring.cloud.vault.azure-msi.role"); + map.from("azure-path").to("spring.cloud.vault.azure-msi.azure-path"); + break; + case "CERT": + properties.put("spring.cloud.vault.ssl.key-store", binding.getSecretFilePath("keystore.jks").toString()); + map.from("key-store-password").to("spring.cloud.vault.ssl.key-store-password"); + map.from("cert-auth-path").to("spring.cloud.vault.ssl.cert-auth-path"); + break; + case "GCP_IAM": + if (binding.getSecret().containsKey("credentials.json")) { + properties.put("spring.cloud.vault.gcp-iam.credentials.location", binding.getSecretFilePath("credentials.json").toString()); + } + map.from("role").to("spring.cloud.vault.gcp-iam.role"); + map.from("encoded-key").to("spring.cloud.vault.gcp-iam.credentials.encoded-key"); + map.from("gcp-path").to("spring.cloud.vault.gcp-iam.gcp-path"); + map.from("jwt-validity").to("spring.cloud.vault.gcp-iam.jwt-validity"); + map.from("gcp-project-id").to("spring.cloud.vault.gcp-iam.project-id"); + map.from("gcp-service-account").to("spring.cloud.vault.gcp-iam.service-account"); + break; + case "KUBERNETES": + map.from("role").to("spring.cloud.vault.kubernetes.role"); + map.from("kubernetes-path").to("spring.cloud.vault.kubernetes.kubernetes-path"); + break; + default: + LOG.warn(String.format("Binding '%s' contains unrecognized 'method'", binding.getName())); + } + + }); + } + + @Override + public void onApplicationEvent(ApplicationPreparedEvent event) { + LOG.replayTo(getClass()); + } } - @Override - public void onApplicationEvent(ApplicationPreparedEvent event) { - LOG.replayTo(getClass()); + /** + * This is a special case for Boot 3. + */ + public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor, ApplicationListener { + + private static final int BOOT_VERSION = 3; + + Boot3(int forcedVersion) { + super(forcedVersion); + } + + public Boot3() { + } + + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; + } + if (!isBootMajorVersionEnabled(BOOT_VERSION)) { + return; + } + + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("uri").to("spring.cloud.vault.uri"); + map.from("namespace").to("spring.cloud.vault.namespace"); // vault enterprise feature + + String authenticationMethod = binding.getSecret().get("authentication-method"); + if (authenticationMethod == null) { + LOG.warn(String.format("Key 'method' is missing from secret of binding '%s'", binding.getName())); + return; + } + properties.put("spring.cloud.vault.authentication", authenticationMethod); + switchCommonProperties(map, authenticationMethod); + switch (authenticationMethod.toUpperCase()) { + case "AWS_IAM": + map.from("role").to("spring.cloud.vault.aws-iam.role"); + map.from("aws-path").to("spring.cloud.vault.aws-iam.aws-path"); + map.from("aws-sts-endpoint-uri").to("spring.cloud.vault.aws-iam.endpoint-uri"); + map.from("aws-iam-server-name").to("spring.cloud.vault.aws-iam.server-name"); + break; + case "AZURE_MSI": + map.from("role").to("spring.cloud.vault.azure-msi.role"); + map.from("azure-path").to("spring.cloud.vault.azure-msi.azure-path"); + map.from("metadata-service").to("spring.cloud.vault.azure-msi.metadata-service"); + map.from("identity-token-service").to("spring.cloud.vault.azure-msi.identity-token-service"); + break; + case "CERT": + properties.put("spring.cloud.vault.ssl.key-store", binding.getSecretFilePath("keystore.jks").toString()); + map.from("key-store-password").to("spring.cloud.vault.ssl.key-store-password"); + map.from("cert-auth-path").to("spring.cloud.vault.ssl.cert-auth-path"); + properties.put("spring.cloud.vault.ssl.trust-store", binding.getSecretFilePath("truststore.jks").toString()); + map.from("trust-store").to("spring.cloud.vault.ssl.trust-store"); + map.from("trust-store-password").to("spring.cloud.vault.ssl.trust-store-password"); + break; + case "GCP_IAM": + if (binding.getSecret().containsKey("credentials.json")) { + properties.put("spring.cloud.vault.gcp-iam.credentials.location", binding.getSecretFilePath("credentials.json").toString()); + } + map.from("role").to("spring.cloud.vault.gcp-iam.role"); + map.from("encoded-key").to("spring.cloud.vault.gcp-iam.credentials.encoded-key"); + map.from("gcp-path").to("spring.cloud.vault.gcp-iam.gcp-path"); + map.from("jwt-validity").to("spring.cloud.vault.gcp-iam.jwt-validity"); + map.from("gcp-project-id").to("spring.cloud.vault.gcp-iam.project-id"); + map.from("gcp-service-account").to("spring.cloud.vault.gcp-iam.service-account-id"); + break; + case "KUBERNETES": + map.from("role").to("spring.cloud.vault.kubernetes.role"); + map.from("kubernetes-path").to("spring.cloud.vault.kubernetes.kubernetes-path"); + map.from("kubernetes-service-account-token-file").to("spring.cloud.vault.kubernetes.kubernetes-service-account-token-file"); + break; + default: + LOG.warn(String.format("Binding '%s' contains unrecognized 'method'", binding.getName())); + } + }); + } + + @Override + public void onApplicationEvent(ApplicationPreparedEvent event) { + LOG.replayTo(getClass()); + } } + + private static void switchCommonProperties(MapMapper map, String authenticationMethod) { + switch (authenticationMethod.toUpperCase()) { + case "TOKEN": + case "CUBBYHOLE": + map.from("token").to("spring.cloud.vault.token"); + break; + case "APPROLE": + map.from("role-id").to("spring.cloud.vault.app-role.role-id"); + map.from("secret-id").to("spring.cloud.vault.app-role.secret-id"); + map.from("role").to("spring.cloud.vault.app-role.role"); + map.from("app-role-path").to("spring.cloud.vault.app-role.app-role-path"); + break; + case "AWS_EC2": + map.from("role").to("spring.cloud.vault.aws-ec2.role"); + map.from("aws-ec2-path").to("spring.cloud.vault.aws-ec2.aws-ec2-path"); + map.from("aws-ec2-instance-identity-document").to("spring.cloud.vault.aws-ec2.identity-document"); + map.from("nonce").to("spring.cloud.vault.aws-ec2.nonce"); + break; + case "GCP_GCE": + map.from("role").to("spring.cloud.vault.gcp-gce.role"); + map.from("gcp-path").to("spring.cloud.vault.gcp-gce.gcp-path"); + map.from("gcp-service-account").to("spring.cloud.vault.gcp-gce.service-account"); + break; + } + } + } diff --git a/src/main/resources/META-INF/spring.factories b/src/main/resources/META-INF/spring.factories index cde7fc3..d3780d2 100644 --- a/src/main/resources/META-INF/spring.factories +++ b/src/main/resources/META-INF/spring.factories @@ -2,30 +2,38 @@ org.springframework.context.ApplicationListener=\ org.springframework.cloud.bindings.boot.BindingFlattenedEnvironmentPostProcessor, \ org.springframework.cloud.bindings.boot.BindingSpecificEnvironmentPostProcessor, \ org.springframework.cloud.bindings.boot.SpringSecurityOAuth2BindingsPropertiesProcessor, \ - org.springframework.cloud.bindings.boot.VaultBindingsPropertiesProcessor + org.springframework.cloud.bindings.boot.VaultBindingsPropertiesProcessor.Boot2, \ + org.springframework.cloud.bindings.boot.VaultBindingsPropertiesProcessor.Boot3 org.springframework.boot.env.EnvironmentPostProcessor=\ org.springframework.cloud.bindings.boot.BindingFlattenedEnvironmentPostProcessor, \ org.springframework.cloud.bindings.boot.BindingSpecificEnvironmentPostProcessor # Included implementations org.springframework.cloud.bindings.boot.BindingsPropertiesProcessor=\ - org.springframework.cloud.bindings.boot.ArtemisBindingsPropertiesProcessor, \ - org.springframework.cloud.bindings.boot.CassandraBindingsPropertiesProcessor, \ + org.springframework.cloud.bindings.boot.ArtemisBindingsPropertiesProcessor.Boot2, \ + org.springframework.cloud.bindings.boot.ArtemisBindingsPropertiesProcessor.Boot3, \ + org.springframework.cloud.bindings.boot.CassandraBindingsPropertiesProcessor.Boot2, \ + org.springframework.cloud.bindings.boot.CassandraBindingsPropertiesProcessor.Boot3, \ org.springframework.cloud.bindings.boot.ConfigServerBindingsPropertiesProcessor, \ - org.springframework.cloud.bindings.boot.CouchbaseBindingsPropertiesProcessor, \ + org.springframework.cloud.bindings.boot.CouchbaseBindingsPropertiesProcessor.Boot2, \ + org.springframework.cloud.bindings.boot.CouchbaseBindingsPropertiesProcessor.Boot3, \ org.springframework.cloud.bindings.boot.Db2BindingsPropertiesProcessor, \ - org.springframework.cloud.bindings.boot.ElasticsearchBindingsPropertiesProcessor, \ + org.springframework.cloud.bindings.boot.ElasticsearchBindingsPropertiesProcessor.Boot2, \ + org.springframework.cloud.bindings.boot.ElasticsearchBindingsPropertiesProcessor.Boot3, \ org.springframework.cloud.bindings.boot.EurekaBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.KafkaBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.LDAPBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.MongoDbBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.MySqlBindingsPropertiesProcessor, \ - org.springframework.cloud.bindings.boot.Neo4JBindingsPropertiesProcessor, \ + org.springframework.cloud.bindings.boot.Neo4JBindingsPropertiesProcessor.Boot2, \ + org.springframework.cloud.bindings.boot.Neo4JBindingsPropertiesProcessor.Boot3, \ org.springframework.cloud.bindings.boot.OracleBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.PostgreSqlBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.RabbitMqBindingsPropertiesProcessor, \ - org.springframework.cloud.bindings.boot.RedisBindingsPropertiesProcessor, \ + org.springframework.cloud.bindings.boot.RedisBindingsPropertiesProcessor.Boot2, \ + org.springframework.cloud.bindings.boot.RedisBindingsPropertiesProcessor.Boot3, \ org.springframework.cloud.bindings.boot.SapHanaBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.SpringSecurityOAuth2BindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.SqlServerBindingsPropertiesProcessor, \ - org.springframework.cloud.bindings.boot.VaultBindingsPropertiesProcessor, \ + org.springframework.cloud.bindings.boot.VaultBindingsPropertiesProcessor.Boot2, \ + org.springframework.cloud.bindings.boot.VaultBindingsPropertiesProcessor.Boot3, \ org.springframework.cloud.bindings.boot.WavefrontBindingsPropertiesProcessor diff --git a/src/test/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessorTest.java b/src/test/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessorTest.java index 0dbb97e..b6a44cf 100644 --- a/src/test/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessorTest.java +++ b/src/test/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessorTest.java @@ -32,7 +32,7 @@ import static org.springframework.cloud.bindings.boot.ArtemisBindingsPropertiesP @DisplayName("ActiveMQ Artemis BindingsPropertiesProcessor") final class ArtemisBindingsPropertiesProcessorTest { - private final Bindings bindings = new Bindings( + private final Bindings bindingsSpringBoot2 = new Bindings( new Binding("test-name", Paths.get("test-path"), new FluentMap() .withEntry(Binding.TYPE, TYPE) @@ -44,14 +44,25 @@ final class ArtemisBindingsPropertiesProcessorTest { ) ); + private final Bindings bindingsSpringBoot3 = new Bindings( + new Binding("test-name", Paths.get("test-path"), + new FluentMap() + .withEntry(Binding.TYPE, TYPE) + .withEntry("mode", "EMBEDDED") + .withEntry("broker-url", "tcp://test-host:test-port") + .withEntry("user", "test-user") + .withEntry("password", "test-password") + ) + ); + private final MockEnvironment environment = new MockEnvironment(); private final HashMap properties = new HashMap<>(); @Test - @DisplayName("contributes properties") - void test() { - new ArtemisBindingsPropertiesProcessor().process(environment, bindings, properties); + @DisplayName("contributes properties - Spring Boot 2 flavor") + void testSb2() { + new ArtemisBindingsPropertiesProcessor.Boot2(2).process(environment, bindingsSpringBoot2, properties); assertThat(properties) .containsEntry("spring.artemis.mode", "EMBEDDED") .containsEntry("spring.artemis.host", "test-host") @@ -60,13 +71,26 @@ final class ArtemisBindingsPropertiesProcessorTest { .containsEntry("spring.artemis.user", "test-user"); } + @Test + @DisplayName("contributes properties - Spring Boot 3 flavor") + void testSb3() { + new ArtemisBindingsPropertiesProcessor.Boot3(3).process(environment, bindingsSpringBoot3, properties); + assertThat(properties) + .containsEntry("spring.artemis.mode", "EMBEDDED") + .containsEntry("spring.artemis.broker-url", "tcp://test-host:test-port") + .containsEntry("spring.artemis.password", "test-password") + .containsEntry("spring.artemis.user", "test-user"); + } + @Test @DisplayName("can be disabled") void disabled() { environment.setProperty("org.springframework.cloud.bindings.boot.artemis.enable", "false"); - new ArtemisBindingsPropertiesProcessor().process(environment, bindings, properties); + new ArtemisBindingsPropertiesProcessor.Boot2(2).process(environment, bindingsSpringBoot2, properties); + assertThat(properties).isEmpty(); + new ArtemisBindingsPropertiesProcessor.Boot3(3).process(environment, bindingsSpringBoot2, properties); assertThat(properties).isEmpty(); } diff --git a/src/test/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessorTest.java b/src/test/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessorTest.java index fe24d04..33bed83 100644 --- a/src/test/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessorTest.java +++ b/src/test/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessorTest.java @@ -16,17 +16,17 @@ package org.springframework.cloud.bindings.boot; +import java.nio.file.Paths; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.boot.SpringApplication; -import org.springframework.boot.context.config.ConfigFileApplicationListener; +import org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor; import org.springframework.cloud.bindings.Binding; import org.springframework.cloud.bindings.Bindings; import org.springframework.cloud.bindings.FluentMap; import org.springframework.mock.env.MockEnvironment; -import java.nio.file.Paths; - import static org.assertj.core.api.Assertions.assertThat; @DisplayName("Binding-flattened EnvironmentPostProcessor") @@ -82,7 +82,7 @@ final class BindingFlattenedEnvironmentPostProcessorTest { @DisplayName("has order before ConfigFileApplicationListener") void order() { assertThat(new BindingFlattenedEnvironmentPostProcessor(new Bindings()).getOrder()) - .isLessThan(ConfigFileApplicationListener.DEFAULT_ORDER); + .isLessThan(ConfigDataEnvironmentPostProcessor.ORDER); } } diff --git a/src/test/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessorTest.java b/src/test/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessorTest.java index 03a6151..416892f 100644 --- a/src/test/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessorTest.java +++ b/src/test/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessorTest.java @@ -19,7 +19,7 @@ package org.springframework.cloud.bindings.boot; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.boot.SpringApplication; -import org.springframework.boot.context.config.ConfigFileApplicationListener; +import org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor; import org.springframework.cloud.bindings.Binding; import org.springframework.cloud.bindings.Bindings; import org.springframework.cloud.bindings.FluentMap; @@ -98,13 +98,13 @@ final class BindingSpecificEnvironmentPostProcessorTest { @DisplayName("has order before ConfigFileApplicationListener") void order() { assertThat(new BindingSpecificEnvironmentPostProcessor(new Bindings()).getOrder()) - .isLessThan(ConfigFileApplicationListener.DEFAULT_ORDER); + .isLessThan(ConfigDataEnvironmentPostProcessor.ORDER); } @Test @DisplayName("included implementations are registered") void includedImplementations() { - assertThat(new BindingSpecificEnvironmentPostProcessor().processors).hasSize(21); + assertThat(new BindingSpecificEnvironmentPostProcessor().processors).hasSize(28); } } diff --git a/src/test/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessorTest.java b/src/test/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessorTest.java index e6624df..d17959b 100644 --- a/src/test/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessorTest.java +++ b/src/test/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessorTest.java @@ -44,6 +44,10 @@ final class CassandraBindingsPropertiesProcessorTest { .withEntry("port", "test-port") .withEntry("ssl", "test-ssl") .withEntry("username", "test-username") + .withEntry("request.throttler.drain-interval", "test-drain-interval") + .withEntry("request.throttler.max-concurrent-requests", "test-max-concurrent-requests") + .withEntry("request.throttler.max-queue-size", "test-max-queue-size") + .withEntry("request.throttler.max-requests-per-second", "test-max-requests-per-second") ) ); @@ -52,9 +56,9 @@ final class CassandraBindingsPropertiesProcessorTest { private final HashMap properties = new HashMap<>(); @Test - @DisplayName("contributes properties") - void test() { - new CassandraBindingsPropertiesProcessor().process(environment, bindings, properties); + @DisplayName("contributes properties - Spring Boot 2 flavor") + void testSb2() { + new CassandraBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.data.cassandra.cluster-name", "test-cluster-name") .containsEntry("spring.data.cassandra.compression", "test-compression") @@ -63,7 +67,30 @@ final class CassandraBindingsPropertiesProcessorTest { .containsEntry("spring.data.cassandra.password", "test-password") .containsEntry("spring.data.cassandra.port", "test-port") .containsEntry("spring.data.cassandra.ssl", "test-ssl") - .containsEntry("spring.data.cassandra.username", "test-username"); + .containsEntry("spring.data.cassandra.username", "test-username") + .containsEntry("spring.data.cassandra.request.throttler.drain-interval", "test-drain-interval") + .containsEntry("spring.data.cassandra.request.throttler.max-concurrent-requests", "test-max-concurrent-requests") + .containsEntry("spring.data.cassandra.request.throttler.max-queue-size", "test-max-queue-size") + .containsEntry("spring.data.cassandra.request.throttler.max-requests-per-second", "test-max-requests-per-second"); + } + + @Test + @DisplayName("contributes properties - Spring Boot 3 flavor") + void testSb3() { + new CassandraBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + assertThat(properties) + .containsEntry("spring.cassandra.cluster-name", "test-cluster-name") + .containsEntry("spring.cassandra.compression", "test-compression") + .containsEntry("spring.cassandra.contact-points", "test-contact-points") + .containsEntry("spring.cassandra.keyspace-name", "test-keyspace-name") + .containsEntry("spring.cassandra.password", "test-password") + .containsEntry("spring.cassandra.port", "test-port") + .containsEntry("spring.cassandra.ssl", "test-ssl") + .containsEntry("spring.cassandra.username", "test-username") + .containsEntry("spring.cassandra.request.throttler.drain-interval", "test-drain-interval") + .containsEntry("spring.cassandra.request.throttler.max-concurrent-requests", "test-max-concurrent-requests") + .containsEntry("spring.cassandra.request.throttler.max-queue-size", "test-max-queue-size") + .containsEntry("spring.cassandra.request.throttler.max-requests-per-second", "test-max-requests-per-second"); } @Test @@ -71,8 +98,10 @@ final class CassandraBindingsPropertiesProcessorTest { void disabled() { environment.setProperty("org.springframework.cloud.bindings.boot.cassandra.enable", "false"); - new CassandraBindingsPropertiesProcessor().process(environment, bindings, properties); + new CassandraBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); + assertThat(properties).isEmpty(); + new CassandraBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); assertThat(properties).isEmpty(); } diff --git a/src/test/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessorTest.java b/src/test/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessorTest.java index 4e55d9b..f79de94 100644 --- a/src/test/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessorTest.java +++ b/src/test/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessorTest.java @@ -32,7 +32,7 @@ import static org.springframework.cloud.bindings.boot.CouchbaseBindingsPropertie @DisplayName("Couchbase BindingsPropertiesProcessor") final class CouchbaseBindingsPropertiesProcessorTest { - private final Bindings bindings = new Bindings( + private final Bindings bindingsSpringBoot2 = new Bindings( new Binding("test-name", Paths.get("test-path"), new FluentMap() .withEntry(Binding.TYPE, TYPE) @@ -46,14 +46,25 @@ final class CouchbaseBindingsPropertiesProcessorTest { ) ); + private final Bindings bindingsSpringBoot3 = new Bindings( + new Binding("test-name", Paths.get("test-path"), + new FluentMap() + .withEntry(Binding.TYPE, TYPE) + .withEntry("connection-string", "test-connection-string") + .withEntry("bucket-name", "test-bucket-name") + .withEntry("username", "test-username") + .withEntry("password", "test-password") + ) + ); + private final MockEnvironment environment = new MockEnvironment(); private final HashMap properties = new HashMap<>(); @Test - @DisplayName("contributes properties") - void test() { - new CouchbaseBindingsPropertiesProcessor().process(environment, bindings, properties); + @DisplayName("contributes properties - Spring Boot 2 flavor") + void testSb2() { + new CouchbaseBindingsPropertiesProcessor.Boot2(2).process(environment, bindingsSpringBoot2, properties); assertThat(properties) .containsEntry("spring.couchbase.bootstrap-hosts", "test-bootstrap-hosts") .containsEntry("spring.couchbase.bucket.name", "test-bucket-name") @@ -64,13 +75,26 @@ final class CouchbaseBindingsPropertiesProcessorTest { .containsEntry("spring.couchbase.username", "test-username"); } + @Test + @DisplayName("contributes properties - Spring Boot 3 flavor") + void testSb3() { + new CouchbaseBindingsPropertiesProcessor.Boot3(3).process(environment, bindingsSpringBoot3, properties); + assertThat(properties) + .containsEntry("spring.couchbase.connection-string", "test-connection-string") + .containsEntry("spring.data.couchbase.bucket-name", "test-bucket-name") + .containsEntry("spring.couchbase.username", "test-username") + .containsEntry("spring.couchbase.password", "test-password"); + } + @Test @DisplayName("can be disabled") void disabled() { environment.setProperty("org.springframework.cloud.bindings.boot.couchbase.enable", "false"); - new CouchbaseBindingsPropertiesProcessor().process(environment, bindings, properties); + new CouchbaseBindingsPropertiesProcessor.Boot2(2).process(environment, bindingsSpringBoot2, properties); + assertThat(properties).isEmpty(); + new CouchbaseBindingsPropertiesProcessor.Boot3(3).process(environment, bindingsSpringBoot3, properties); assertThat(properties).isEmpty(); } diff --git a/src/test/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessorTest.java b/src/test/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessorTest.java index f7ae1cc..e7ef72f 100644 --- a/src/test/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessorTest.java +++ b/src/test/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessorTest.java @@ -32,7 +32,7 @@ import static org.springframework.cloud.bindings.boot.ElasticsearchBindingsPrope @DisplayName("Elasticsearch BindingsPropertiesProcessor") final class ElasticsearchBindingsPropertiesProcessorTest { - private final Bindings bindings = new Bindings( + private final Bindings bindingsSpringBoot2 = new Bindings( new Binding("test-name", Paths.get("test-path"), new FluentMap() .withEntry(Binding.TYPE, TYPE) @@ -46,14 +46,25 @@ final class ElasticsearchBindingsPropertiesProcessorTest { ) ); + private final Bindings bindingsSpringBoot3 = new Bindings( + new Binding("test-name", Paths.get("test-path"), + new FluentMap() + .withEntry(Binding.TYPE, TYPE) + .withEntry("password", "test-password") + .withEntry("uris", "test-uris") + .withEntry("username", "test-username") + ) + ); + + private final MockEnvironment environment = new MockEnvironment(); private final HashMap properties = new HashMap<>(); @Test - @DisplayName("contributes properties") - void test() { - new ElasticsearchBindingsPropertiesProcessor().process(environment, bindings, properties); + @DisplayName("contributes properties - Spring Boot 2 flavor") + void testSb2() { + new ElasticsearchBindingsPropertiesProcessor.Boot2(2).process(environment, bindingsSpringBoot2, properties); assertThat(properties) .containsEntry("spring.data.elasticsearch.client.reactive.endpoints", "test-endpoints") .containsEntry("spring.data.elasticsearch.client.reactive.password", "test-password") @@ -68,13 +79,25 @@ final class ElasticsearchBindingsPropertiesProcessorTest { .containsEntry("spring.elasticsearch.rest.username", "test-username"); } + @Test + @DisplayName("contributes properties - Spring Boot 2 flavor") + void testSb3() { + new ElasticsearchBindingsPropertiesProcessor.Boot3(3).process(environment, bindingsSpringBoot3, properties); + assertThat(properties) + .containsEntry("spring.elasticsearch.password", "test-password") + .containsEntry("spring.elasticsearch.uris", "test-uris") + .containsEntry("spring.elasticsearch.username", "test-username"); + } + @Test @DisplayName("can be disabled") void disabled() { environment.setProperty("org.springframework.cloud.bindings.boot.elasticsearch.enable", "false"); - new ElasticsearchBindingsPropertiesProcessor().process(environment, bindings, properties); + new ElasticsearchBindingsPropertiesProcessor.Boot2(2).process(environment, bindingsSpringBoot2, properties); + assertThat(properties).isEmpty(); + new ElasticsearchBindingsPropertiesProcessor.Boot3(3).process(environment, bindingsSpringBoot3, properties); assertThat(properties).isEmpty(); } diff --git a/src/test/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessorTest.java b/src/test/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessorTest.java index 85d351b..3e42673 100644 --- a/src/test/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessorTest.java +++ b/src/test/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessorTest.java @@ -47,23 +47,36 @@ final class Neo4JBindingsPropertiesProcessorTest { private final HashMap properties = new HashMap<>(); @Test - @DisplayName("contributes properties") - void test() { - new Neo4JBindingsPropertiesProcessor().process(environment, bindings, properties); + @DisplayName("contributes properties - Spring Boot 2 flavor") + void testSb2() { + new Neo4JBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.data.neo4j.password", "test-password") .containsEntry("spring.data.neo4j.uri", "test-uri") .containsEntry("spring.data.neo4j.username", "test-username"); } + @Test + @DisplayName("contributes properties - Spring Boot 3 flavor") + void testSb3() { + new Neo4JBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + assertThat(properties) + .containsEntry("spring.neo4j.authentication.password", "test-password") + .containsEntry("spring.neo4j.uri", "test-uri") + .containsEntry("spring.neo4j.authentication.username", "test-username"); + } + @Test @DisplayName("can be disabled") void disabled() { environment.setProperty("org.springframework.cloud.bindings.boot.neo4j.enable", "false"); - new Neo4JBindingsPropertiesProcessor().process(environment, bindings, properties); - + new Neo4JBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties).isEmpty(); + + new Neo4JBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + assertThat(properties).isEmpty(); + } } diff --git a/src/test/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessorTest.java b/src/test/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessorTest.java index 83de7fa..769ba8b 100644 --- a/src/test/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessorTest.java +++ b/src/test/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessorTest.java @@ -55,9 +55,9 @@ final class RedisBindingsPropertiesProcessorTest { private final HashMap properties = new HashMap<>(); @Test - @DisplayName("contributes properties") - void test() { - new RedisBindingsPropertiesProcessor().process(environment, bindings, properties); + @DisplayName("contributes properties - Spring Boot 2 flavor") + void testSb2() { + new RedisBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.redis.client-name", "test-client-name") .containsEntry("spring.redis.cluster.max-redirects", "test-cluster-max-redirects") @@ -72,14 +72,36 @@ final class RedisBindingsPropertiesProcessorTest { .containsEntry("spring.redis.url", "test-url"); } + @Test + @DisplayName("contributes properties - Spring Boot 3 flavor") + void testSb3() { + new RedisBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + + assertThat(properties) + .containsEntry("spring.data.redis.client-name", "test-client-name") + .containsEntry("spring.data.redis.cluster.max-redirects", "test-cluster-max-redirects") + .containsEntry("spring.data.redis.cluster.nodes", "test-cluster-nodes") + .containsEntry("spring.data.redis.database", "test-database") + .containsEntry("spring.data.redis.host", "test-host") + .containsEntry("spring.data.redis.password", "test-password") + .containsEntry("spring.data.redis.port", "test-port") + .containsEntry("spring.data.redis.sentinel.master", "test-sentinel-master") + .containsEntry("spring.data.redis.sentinel.nodes", "test-sentinel-nodes") + .containsEntry("spring.data.redis.ssl", "test-ssl") + .containsEntry("spring.data.redis.url", "test-url"); + } + @Test @DisplayName("can be disabled") void disabled() { environment.setProperty("org.springframework.cloud.bindings.boot.redis.enable", "false"); - new RedisBindingsPropertiesProcessor().process(environment, bindings, properties); - + new RedisBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties).isEmpty(); + + new RedisBindingsPropertiesProcessor.Boot2(3).process(environment, bindings, properties); + assertThat(properties).isEmpty(); + } } diff --git a/src/test/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolverTest.java b/src/test/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolverTest.java new file mode 100644 index 0000000..e76c275 --- /dev/null +++ b/src/test/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolverTest.java @@ -0,0 +1,33 @@ +package org.springframework.cloud.bindings.boot; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class SpringBootVersionResolverTest { + + @Test + @DisplayName("Should return Spring Boot 2 as Major Version since it's the provided runtime") + void isBootMajorVersionEnabled() { + SpringBootVersionResolver springBootVersionResolver = new SpringBootVersionResolver(); + assertTrue(springBootVersionResolver.isBootMajorVersionEnabled(2)); + assertFalse(springBootVersionResolver.isBootMajorVersionEnabled(3)); + } + + @Test + @DisplayName("Should return the forced version 2") + void isBootMajorVersionEnabled_forced_version2() { + SpringBootVersionResolver springBootVersionResolver = new SpringBootVersionResolver(2); + assertTrue(springBootVersionResolver.isBootMajorVersionEnabled(2)); + assertFalse(springBootVersionResolver.isBootMajorVersionEnabled(3)); + } + + @Test + @DisplayName("Should return the forced version 3") + void isBootMajorVersionEnabled_forced_version3() { + SpringBootVersionResolver springBootVersionResolver = new SpringBootVersionResolver(3); + assertFalse(springBootVersionResolver.isBootMajorVersionEnabled(2)); + assertTrue(springBootVersionResolver.isBootMajorVersionEnabled(3)); + } +} \ No newline at end of file diff --git a/src/test/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessorTest.java b/src/test/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessorTest.java index 59a435d..fd243f9 100644 --- a/src/test/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessorTest.java +++ b/src/test/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessorTest.java @@ -47,7 +47,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -69,7 +69,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -91,7 +91,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -108,11 +108,13 @@ final class VaultBindingsPropertiesProcessorTest { .withEntry("authentication-method", "cert") .withEntry("cert-auth-path", "test-cert-auth-path") .withEntry("key-store-password", "test-key-store-password") + .withEntry("truststore.jks", "trust store contents!") + .withEntry("trust-store-password", "test-trust-store-password") .withEntry("keystore.jks", "key store contents!") ) ); - new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -120,6 +122,17 @@ final class VaultBindingsPropertiesProcessorTest { .containsEntry("spring.cloud.vault.ssl.key-store", "test-path/keystore.jks") .containsEntry("spring.cloud.vault.ssl.key-store-password", "test-key-store-password") .containsEntry("spring.cloud.vault.ssl.cert-auth-path", "test-cert-auth-path"); + + new VaultBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + assertThat(properties) + .containsEntry("spring.cloud.vault.uri", "test-uri") + .containsEntry("spring.cloud.vault.namespace", "test-namespace") + .containsEntry("spring.cloud.vault.authentication", "cert") + .containsEntry("spring.cloud.vault.ssl.cert-auth-path", "test-cert-auth-path") + .containsEntry("spring.cloud.vault.ssl.key-store", "test-path/keystore.jks") + .containsEntry("spring.cloud.vault.ssl.key-store-password", "test-key-store-password") + .containsEntry("spring.cloud.vault.ssl.trust-store", "test-path/truststore.jks") + .containsEntry("spring.cloud.vault.ssl.trust-store-password", "test-trust-store-password"); } @Test @@ -136,7 +149,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -155,13 +168,14 @@ final class VaultBindingsPropertiesProcessorTest { baseSecret() .withEntry("authentication-method", "aws_iam") .withEntry("aws-iam-server-id", "test-server-id") + .withEntry("aws-iam-server-name", "test-server-name") .withEntry("aws-path", "test-aws-path") .withEntry("aws-sts-endpoint-uri", "test-endpoint-uri") .withEntry("role", "test-role") ) ); - new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -170,6 +184,16 @@ final class VaultBindingsPropertiesProcessorTest { .containsEntry("spring.cloud.vault.aws-iam.aws-path", "test-aws-path") .containsEntry("spring.cloud.vault.aws-iam.server-id", "test-server-id") .containsEntry("spring.cloud.vault.aws-iam.endpoint-uri", "test-endpoint-uri"); + + new VaultBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + assertThat(properties) + .containsEntry("spring.cloud.vault.uri", "test-uri") + .containsEntry("spring.cloud.vault.namespace", "test-namespace") + .containsEntry("spring.cloud.vault.authentication", "aws_iam") + .containsEntry("spring.cloud.vault.aws-iam.role", "test-role") + .containsEntry("spring.cloud.vault.aws-iam.aws-path", "test-aws-path") + .containsEntry("spring.cloud.vault.aws-iam.server-name", "test-server-name") + .containsEntry("spring.cloud.vault.aws-iam.endpoint-uri", "test-endpoint-uri"); } @Test @@ -181,16 +205,28 @@ final class VaultBindingsPropertiesProcessorTest { .withEntry("authentication-method", "azure_msi") .withEntry("azure-path", "test-azure-path") .withEntry("role", "test-role") + .withEntry("metadata-service", "test-metadata-service") + .withEntry("identity-token-service", "test-identity-token-service") ) ); - new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") .containsEntry("spring.cloud.vault.authentication", "azure_msi") .containsEntry("spring.cloud.vault.azure-msi.role", "test-role") .containsEntry("spring.cloud.vault.azure-msi.azure-path", "test-azure-path"); + + new VaultBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + assertThat(properties) + .containsEntry("spring.cloud.vault.uri", "test-uri") + .containsEntry("spring.cloud.vault.namespace", "test-namespace") + .containsEntry("spring.cloud.vault.authentication", "azure_msi") + .containsEntry("spring.cloud.vault.azure-msi.role", "test-role") + .containsEntry("spring.cloud.vault.azure-msi.azure-path", "test-azure-path") + .containsEntry("spring.cloud.vault.azure-msi.metadata-service", "test-metadata-service") + .containsEntry("spring.cloud.vault.azure-msi.identity-token-service", "test-identity-token-service"); } @Test @@ -206,7 +242,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -233,7 +269,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -245,6 +281,19 @@ final class VaultBindingsPropertiesProcessorTest { .containsEntry("spring.cloud.vault.gcp-iam.jwt-validity", "test-jwt-validity") .containsEntry("spring.cloud.vault.gcp-iam.project-id", "test-project-id") .containsEntry("spring.cloud.vault.gcp-iam.service-account", "test-service-account"); + + new VaultBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + assertThat(properties) + .containsEntry("spring.cloud.vault.uri", "test-uri") + .containsEntry("spring.cloud.vault.namespace", "test-namespace") + .containsEntry("spring.cloud.vault.authentication", "gcp_iam") + .containsEntry("spring.cloud.vault.gcp-iam.role", "test-role") + .containsEntry("spring.cloud.vault.gcp-iam.credentials.location", "test-path/credentials.json") + .containsEntry("spring.cloud.vault.gcp-iam.credentials.encoded-key", "test-encoded-key") + .containsEntry("spring.cloud.vault.gcp-iam.gcp-path", "test-gcp-path") + .containsEntry("spring.cloud.vault.gcp-iam.jwt-validity", "test-jwt-validity") + .containsEntry("spring.cloud.vault.gcp-iam.project-id", "test-project-id") + .containsEntry("spring.cloud.vault.gcp-iam.service-account-id", "test-service-account"); } @Test @@ -256,16 +305,26 @@ final class VaultBindingsPropertiesProcessorTest { .withEntry("authentication-method", "kubernetes") .withEntry("role", "test-role") .withEntry("kubernetes-path", "test-kubernetes-path") + .withEntry("kubernetes-service-account-token-file", "test-kubernetes-service-account-token-file") ) ); - new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") .containsEntry("spring.cloud.vault.authentication", "kubernetes") .containsEntry("spring.cloud.vault.kubernetes.role", "test-role") .containsEntry("spring.cloud.vault.kubernetes.kubernetes-path", "test-kubernetes-path"); + + new VaultBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + assertThat(properties) + .containsEntry("spring.cloud.vault.uri", "test-uri") + .containsEntry("spring.cloud.vault.namespace", "test-namespace") + .containsEntry("spring.cloud.vault.authentication", "kubernetes") + .containsEntry("spring.cloud.vault.kubernetes.role", "test-role") + .containsEntry("spring.cloud.vault.kubernetes.kubernetes-path", "test-kubernetes-path") + .containsEntry("spring.cloud.vault.kubernetes.kubernetes-service-account-token-file", "test-kubernetes-service-account-token-file"); } @Test @@ -277,7 +336,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -317,7 +376,7 @@ final class VaultBindingsPropertiesProcessorTest { environment.setProperty("org.springframework.cloud.bindings.boot.vault.enable", "false"); - new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); assertThat(properties).isEmpty(); } From 81739ee14fde7d968627180adcc0375202c267a2 Mon Sep 17 00:00:00 2001 From: Anthony Dahanne Date: Wed, 15 Feb 2023 16:53:15 -0500 Subject: [PATCH 5/9] Add integration tests for Spring Boot 2 and 3 * use Maven modules to do so * spring-cloud-bindings goes one level down * addition of a spring-cloud-bindings parent Inspired by @gregturn and spring-data-rest --- pom.xml | 184 ++--------------- spring-cloud-bindings-tests-boot-2/README.md | 23 +++ .../bindings/redis/host | 1 + .../bindings/redis/port | 1 + .../bindings/redis/type | 1 + spring-cloud-bindings-tests-boot-2/pom.xml | 72 +++++++ .../cloud/IntegrationTest.java | 21 ++ .../cloud/RedisServerTestConfiguration.java | 28 +++ .../cloud/SpringBoot2Application.java | 11 + spring-cloud-bindings-tests-boot-3/README.md | 23 +++ .../bindings/redis/host | 1 + .../bindings/redis/port | 1 + .../bindings/redis/type | 1 + spring-cloud-bindings-tests-boot-3/pom.xml | 77 +++++++ .../cloud/IntegrationTest.java | 21 ++ .../cloud/RedisServerTestConfiguration.java | 28 +++ .../cloud/SpringBoot3Application.java | 11 + spring-cloud-bindings/pom.xml | 192 ++++++++++++++++++ .../cloud/bindings/Binding.java | 0 .../cloud/bindings/Bindings.java | 0 .../ArtemisBindingsPropertiesProcessor.java | 0 ...dingFlattenedEnvironmentPostProcessor.java | 0 ...ndingSpecificEnvironmentPostProcessor.java | 0 .../boot/BindingsPropertiesProcessor.java | 0 .../CassandraBindingsPropertiesProcessor.java | 0 ...nfigServerBindingsPropertiesProcessor.java | 0 .../CouchbaseBindingsPropertiesProcessor.java | 0 .../boot/Db2BindingsPropertiesProcessor.java | 0 ...sticsearchBindingsPropertiesProcessor.java | 0 .../EurekaBindingsPropertiesProcessor.java | 0 .../cloud/bindings/boot/Guards.java | 0 .../KafkaBindingsPropertiesProcessor.java | 0 .../boot/LDAPBindingsPropertiesProcessor.java | 0 .../cloud/bindings/boot/MapMapper.java | 0 .../MongoDbBindingsPropertiesProcessor.java | 0 .../MySqlBindingsPropertiesProcessor.java | 0 .../Neo4JBindingsPropertiesProcessor.java | 0 .../OracleBindingsPropertiesProcessor.java | 0 ...PostgreSqlBindingsPropertiesProcessor.java | 0 .../boot/PropertySourceContributor.java | 0 .../RabbitMqBindingsPropertiesProcessor.java | 0 .../RedisBindingsPropertiesProcessor.java | 0 .../SapHanaBindingsPropertiesProcessor.java | 0 .../boot/SpringBootVersionResolver.java | 0 ...rityOAuth2BindingsPropertiesProcessor.java | 0 .../SqlServerBindingsPropertiesProcessor.java | 0 .../VaultBindingsPropertiesProcessor.java | 0 .../WavefrontBindingsPropertiesProcessor.java | 0 .../cloud/bindings/boot/package-info.java | 0 .../cloud/bindings/package-info.java | 0 .../main/resources/META-INF/spring.factories | 0 .../cloud/bindings/BindingTest.java | 0 .../cloud/bindings/BindingsTest.java | 0 .../cloud/bindings/FluentMap.java | 0 ...rtemisBindingsPropertiesProcessorTest.java | 0 ...FlattenedEnvironmentPostProcessorTest.java | 0 ...gSpecificEnvironmentPostProcessorTest.java | 0 ...sandraBindingsPropertiesProcessorTest.java | 0 ...ServerBindingsPropertiesProcessorTest.java | 0 ...chbaseBindingsPropertiesProcessorTest.java | 0 .../Db2BindingsPropertiesProcessorTest.java | 0 ...searchBindingsPropertiesProcessorTest.java | 0 ...EurekaBindingsPropertiesProcessorTest.java | 0 .../cloud/bindings/boot/GuardsTest.java | 0 .../KafkaBindingsPropertiesProcessorTest.java | 0 .../LDAPBindingsPropertiesProcessorTest.java | 0 .../cloud/bindings/boot/MapMapperTest.java | 0 ...ongoDbBindingsPropertiesProcessorTest.java | 0 .../MySqlBindingsPropertiesProcessorTest.java | 0 .../Neo4JBindingsPropertiesProcessorTest.java | 0 ...OracleBindingsPropertiesProcessorTest.java | 0 ...greSqlBindingsPropertiesProcessorTest.java | 0 .../boot/PropertySourceContributorTest.java | 0 ...bbitMqBindingsPropertiesProcessorTest.java | 0 .../RedisBindingsPropertiesProcessorTest.java | 0 ...apHanaBindingsPropertiesProcessorTest.java | 0 .../boot/SpringBootVersionResolverTest.java | 0 ...OAuth2BindingsPropertiesProcessorTest.java | 0 ...ServerBindingsPropertiesProcessorTest.java | 0 .../cloud/bindings/boot/TestHelper.java | 0 .../VaultBindingsPropertiesProcessorTest.java | 0 ...efrontBindingsPropertiesProcessorTest.java | 0 .../boot/pem/PemCertificateParserTests.java | 0 .../bindings/boot/pem/PemContentTests.java | 0 .../boot/pem/PemPrivateKeyParserTests.java | 0 .../boot/pem/PemSslStoreHelperTests.java | 0 .../cnb/test-k8s/metadata/.hidden-data | 0 .../cnb/test-k8s/metadata/.hidden-data-1/kind | 0 .../test-k8s/metadata/.hidden-data-1/provider | 0 .../metadata/.hidden-data-1/test-metadata-key | 0 .../test/resources/cnb/test-k8s/metadata/kind | 0 .../resources/cnb/test-k8s/metadata/provider | 0 .../cnb/test-k8s/metadata/test-metadata-key | 0 .../cnb/test-k8s/secret/.hidden-data | 0 .../secret/.hidden-data-1/test-secret-key | 0 .../cnb/test-k8s/secret/test-secret-key | 0 .../resources/cnb/test-name-1/metadata/kind | 0 .../cnb/test-name-1/metadata/provider | 0 .../test-name-1/metadata/test-metadata-key | 0 .../cnb/test-name-1/secret/test-secret-key | 0 .../resources/cnb/test-name-2/metadata/kind | 0 .../cnb/test-name-2/metadata/provider | 0 .../test-name-2/metadata/test-metadata-key | 0 .../cnb/test-name-2/secret/test-secret-key | 0 .../test/resources/k8s/test-k8s/.hidden-data | 0 .../k8s/test-k8s/.hidden-data-1/provider | 0 .../test-k8s/.hidden-data-1/test-secret-key | 0 .../k8s/test-k8s/.hidden-data-1/type | 0 .../src}/test/resources/k8s/test-k8s/provider | 0 .../resources/k8s/test-k8s/test-secret-key | 0 .../src}/test/resources/k8s/test-k8s/type | 0 .../test/resources/k8s/test-name-1/provider | 0 .../resources/k8s/test-name-1/test-secret-key | 0 .../src}/test/resources/k8s/test-name-1/type | 0 .../test/resources/k8s/test-name-2/provider | 0 .../resources/k8s/test-name-2/test-secret-key | 0 .../src}/test/resources/k8s/test-name-2/type | 0 117 files changed, 532 insertions(+), 165 deletions(-) create mode 100644 spring-cloud-bindings-tests-boot-2/README.md create mode 100644 spring-cloud-bindings-tests-boot-2/bindings/redis/host create mode 100644 spring-cloud-bindings-tests-boot-2/bindings/redis/port create mode 100644 spring-cloud-bindings-tests-boot-2/bindings/redis/type create mode 100644 spring-cloud-bindings-tests-boot-2/pom.xml create mode 100644 spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/IntegrationTest.java create mode 100644 spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java create mode 100644 spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/SpringBoot2Application.java create mode 100644 spring-cloud-bindings-tests-boot-3/README.md create mode 100644 spring-cloud-bindings-tests-boot-3/bindings/redis/host create mode 100644 spring-cloud-bindings-tests-boot-3/bindings/redis/port create mode 100644 spring-cloud-bindings-tests-boot-3/bindings/redis/type create mode 100644 spring-cloud-bindings-tests-boot-3/pom.xml create mode 100644 spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/IntegrationTest.java create mode 100644 spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java create mode 100644 spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/SpringBoot3Application.java create mode 100644 spring-cloud-bindings/pom.xml rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/Binding.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/Bindings.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/BindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/ConfigServerBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/Db2BindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/EurekaBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/Guards.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/KafkaBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/LDAPBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/MapMapper.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/MongoDbBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/MySqlBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/OracleBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/PropertySourceContributor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/RabbitMqBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/SapHanaBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/SqlServerBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/WavefrontBindingsPropertiesProcessor.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/package-info.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/package-info.java (100%) rename {src => spring-cloud-bindings/src}/main/resources/META-INF/spring.factories (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/BindingTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/BindingsTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/FluentMap.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/ConfigServerBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/Db2BindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/EurekaBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/GuardsTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/KafkaBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/LDAPBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/MapMapperTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/MongoDbBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/MySqlBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/OracleBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/PropertySourceContributorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/RabbitMqBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/SapHanaBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolverTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/SqlServerBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/TestHelper.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/WavefrontBindingsPropertiesProcessorTest.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/pem/PemCertificateParserTests.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/pem/PemContentTests.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/pem/PemPrivateKeyParserTests.java (100%) rename {src => spring-cloud-bindings/src}/test/java/org/springframework/cloud/bindings/boot/pem/PemSslStoreHelperTests.java (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-k8s/metadata/.hidden-data (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-k8s/metadata/.hidden-data-1/kind (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-k8s/metadata/.hidden-data-1/provider (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-k8s/metadata/.hidden-data-1/test-metadata-key (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-k8s/metadata/kind (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-k8s/metadata/provider (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-k8s/metadata/test-metadata-key (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-k8s/secret/.hidden-data (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-k8s/secret/.hidden-data-1/test-secret-key (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-k8s/secret/test-secret-key (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-name-1/metadata/kind (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-name-1/metadata/provider (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-name-1/metadata/test-metadata-key (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-name-1/secret/test-secret-key (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-name-2/metadata/kind (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-name-2/metadata/provider (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-name-2/metadata/test-metadata-key (100%) rename {src => spring-cloud-bindings/src}/test/resources/cnb/test-name-2/secret/test-secret-key (100%) rename {src => spring-cloud-bindings/src}/test/resources/k8s/test-k8s/.hidden-data (100%) rename {src => spring-cloud-bindings/src}/test/resources/k8s/test-k8s/.hidden-data-1/provider (100%) rename {src => spring-cloud-bindings/src}/test/resources/k8s/test-k8s/.hidden-data-1/test-secret-key (100%) rename {src => spring-cloud-bindings/src}/test/resources/k8s/test-k8s/.hidden-data-1/type (100%) rename {src => spring-cloud-bindings/src}/test/resources/k8s/test-k8s/provider (100%) rename {src => spring-cloud-bindings/src}/test/resources/k8s/test-k8s/test-secret-key (100%) rename {src => spring-cloud-bindings/src}/test/resources/k8s/test-k8s/type (100%) rename {src => spring-cloud-bindings/src}/test/resources/k8s/test-name-1/provider (100%) rename {src => spring-cloud-bindings/src}/test/resources/k8s/test-name-1/test-secret-key (100%) rename {src => spring-cloud-bindings/src}/test/resources/k8s/test-name-1/type (100%) rename {src => spring-cloud-bindings/src}/test/resources/k8s/test-name-2/provider (100%) rename {src => spring-cloud-bindings/src}/test/resources/k8s/test-name-2/test-secret-key (100%) rename {src => spring-cloud-bindings/src}/test/resources/k8s/test-name-2/type (100%) diff --git a/pom.xml b/pom.xml index 789634c..06ca0ce 100644 --- a/pom.xml +++ b/pom.xml @@ -5,13 +5,19 @@ 4.0.0 org.springframework.cloud - spring-cloud-bindings + spring-cloud-bindings-parent 1.13.0-SNAPSHOT + pom - Spring Cloud Cloud Native Buildpacks Bindings + Spring Cloud Cloud Native Buildpacks Bindings Parent Java Library and Auto-configuration for Cloud Native Buildpack Bindings https://github.com/spring-cloud/spring-cloud-bindings + + UTF-8 + UTF-8 + + Apache License, Version 2.0 @@ -19,173 +25,21 @@ + + spring-cloud-bindings + spring-cloud-bindings-tests-boot-2 + spring-cloud-bindings-tests-boot-3 + + https://github.com/spring-cloud/spring-cloud-bindings - - scb-team - Spring Cloud Bindings Team - https://github.com/spring-cloud/spring-cloud-bindings/graphs/contributors - + + scb-team + Spring Cloud Bindings Team + https://github.com/spring-cloud/spring-cloud-bindings/graphs/contributors + - - - 1.8 - 3.0.2 - 1.1.2 - 2.5.14 - - - 3.10.1 - 3.2.1 - 3.0.0-M7 - 3.0.1 - 3.4.1 - - ${java.version} - ${java.version} - UTF-8 - UTF-8 - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - - com.google.code.findbugs - jsr305 - ${jsr305.version} - provided - - - org.springframework.boot - spring-boot-starter - provided - - - - org.mariadb.jdbc - mariadb-java-client - test - - - org.mariadb - r2dbc-mariadb - ${mariadb-r2dbc.version} - test - - - org.mockito - mockito-core - test - - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.vintage - junit-vintage-engine - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - - -Werror - -Xlint:all - -Xlint:-options - -Xlint:-processing - -Xlint:-serial - - true - - - - org.apache.maven.plugins - maven-source-plugin - ${maven-source-plugin.version} - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven-javadoc-plugin.version} - - true - 1.8 - - - NonNullApi - X - - - - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-gpg-plugin - ${maven-gpg-plugin.version} - - - sign-artifacts - verify - - sign - - - - --pinentry-mode - loopback - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - random - - - - - diff --git a/spring-cloud-bindings-tests-boot-2/README.md b/spring-cloud-bindings-tests-boot-2/README.md new file mode 100644 index 0000000..0f1faf3 --- /dev/null +++ b/spring-cloud-bindings-tests-boot-2/README.md @@ -0,0 +1,23 @@ +# Spring Cloud Bindings Test Boot 2 + +## Purpose of this module + +For several Spring Cloud Bindings integrations, the properties bindings need to be different between Spring Boot 2 and Spring Boot 3. + +For example, we can take some Redis properties bindings; with Spring Boot 2, they need to be mapped this way: + +| Property | Value | +|---------------------|----------| +| `spring.redis.port` | `{port}` | +| `spring.redis.host` | `{host}` | + +But in a Spring Boot 3 application, the mapping needs to be different because of changes with Spring Data Redis: + +| Property | Value | +|--------------------------|----------| +| `spring.data.redis.port` | `{port}` | +| `spring.data.redis.host` | `{host}` | + +This module runs an application, based on Spring Boot 2, and checks whether the `RedisConnectionFactory` properly picked up the `spring.redis.port` and `spring.redis.host` values. + +Pay attention to the 2 environment variables set in the `pom.xml` that set the `JAVA_TOOL_OPTIONS` and `SERVICE_BINDING_ROOT` - they allow Spring Boot Bindings to load the proper configuration in `bindings/redis` \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-2/bindings/redis/host b/spring-cloud-bindings-tests-boot-2/bindings/redis/host new file mode 100644 index 0000000..d18580b --- /dev/null +++ b/spring-cloud-bindings-tests-boot-2/bindings/redis/host @@ -0,0 +1 @@ +localhost \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-2/bindings/redis/port b/spring-cloud-bindings-tests-boot-2/bindings/redis/port new file mode 100644 index 0000000..629d685 --- /dev/null +++ b/spring-cloud-bindings-tests-boot-2/bindings/redis/port @@ -0,0 +1 @@ +4242 \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-2/bindings/redis/type b/spring-cloud-bindings-tests-boot-2/bindings/redis/type new file mode 100644 index 0000000..74b362f --- /dev/null +++ b/spring-cloud-bindings-tests-boot-2/bindings/redis/type @@ -0,0 +1 @@ +redis \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-2/pom.xml b/spring-cloud-bindings-tests-boot-2/pom.xml new file mode 100644 index 0000000..71d9914 --- /dev/null +++ b/spring-cloud-bindings-tests-boot-2/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + + org.springframework.cloud + spring-cloud-bindings-parent + 1.12.0-SNAPSHOT + ../pom.xml + + spring-cloud-bindings-tests-boot-2 + Test project to verify Spring Cloud Bindings works properly with Spring Boot 2 + + 1.8 + 2.5.14 + + + + org.springframework.boot + spring-boot-starter + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-data-redis + ${spring-boot.version} + + + org.springframework.cloud + spring-cloud-bindings + ${version} + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + test + + + com.github.kstyrc + embedded-redis + 0.6 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.1 + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + 1 + false + + -Dorg.springframework.cloud.bindings.boot.enable=true + ${basedir}/bindings + + -Xmx1024m + + + + + + + diff --git a/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/IntegrationTest.java b/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/IntegrationTest.java new file mode 100644 index 0000000..f48f1b7 --- /dev/null +++ b/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/IntegrationTest.java @@ -0,0 +1,21 @@ +package org.springframework.cloud; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.redis.core.RedisTemplate; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +@SpringBootTest(classes = RedisServerTestConfiguration.class) +public class IntegrationTest { + + @Autowired + private RedisTemplate redisTemplate; + + @Test + public void shouldSaveUser_toRedis() { + redisTemplate.opsForValue().set("hello", "world"); + assertTrue(redisTemplate.hasKey("hello")); + } +} diff --git a/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java b/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java new file mode 100644 index 0000000..4fb8844 --- /dev/null +++ b/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java @@ -0,0 +1,28 @@ +package org.springframework.cloud; +import org.springframework.boot.test.context.TestConfiguration; +import redis.embedded.RedisServer; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import java.io.IOException; + +@TestConfiguration +public class RedisServerTestConfiguration { + + private RedisServer redisServer; + + public RedisServerTestConfiguration() throws IOException { + //this value should be set as well under bindings/redis/port so that the client configuration matches the server + this.redisServer = new RedisServer(4242); + } + + @PostConstruct + public void postConstruct() { + redisServer.start(); + } + + @PreDestroy + public void preDestroy() { + redisServer.stop(); + } +} \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/SpringBoot2Application.java b/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/SpringBoot2Application.java new file mode 100644 index 0000000..5945024 --- /dev/null +++ b/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/SpringBoot2Application.java @@ -0,0 +1,11 @@ +package org.springframework.cloud; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; + +@SpringBootApplication +@Configuration +@EnableRedisRepositories +public class SpringBoot2Application { +} diff --git a/spring-cloud-bindings-tests-boot-3/README.md b/spring-cloud-bindings-tests-boot-3/README.md new file mode 100644 index 0000000..4d6858a --- /dev/null +++ b/spring-cloud-bindings-tests-boot-3/README.md @@ -0,0 +1,23 @@ +# Spring Cloud Bindings Test Boot 2 + +## Purpose of this module + +For several Spring Cloud Bindings integrations, the properties bindings need to be different between Spring Boot 2 and Spring Boot 3. + +For example, we can take some Redis properties bindings; with Spring Boot 2, they need to be mapped this way: + +| Property | Value | +|---------------------|----------| +| `spring.redis.port` | `{port}` | +| `spring.redis.host` | `{host}` | + +But in a Spring Boot 3 application, the mapping needs to be different because of changes with Spring Data Redis: + +| Property | Value | +|--------------------------|----------| +| `spring.data.redis.port` | `{port}` | +| `spring.data.redis.host` | `{host}` | + +This module runs an application, based on Spring Boot 2, and checks whether the `RedisConnectionFactory` properly picked up the `spring.data.redis.port` and `spring.data.redis.host` values. + +Pay attention to the 2 environment variables set in the `pom.xml` that set the `JAVA_TOOL_OPTIONS` and `SERVICE_BINDING_ROOT` - they allow Spring Boot Bindings to load the proper configuration in `bindings/redis` \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-3/bindings/redis/host b/spring-cloud-bindings-tests-boot-3/bindings/redis/host new file mode 100644 index 0000000..d18580b --- /dev/null +++ b/spring-cloud-bindings-tests-boot-3/bindings/redis/host @@ -0,0 +1 @@ +localhost \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-3/bindings/redis/port b/spring-cloud-bindings-tests-boot-3/bindings/redis/port new file mode 100644 index 0000000..14eb34e --- /dev/null +++ b/spring-cloud-bindings-tests-boot-3/bindings/redis/port @@ -0,0 +1 @@ +4343 \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-3/bindings/redis/type b/spring-cloud-bindings-tests-boot-3/bindings/redis/type new file mode 100644 index 0000000..74b362f --- /dev/null +++ b/spring-cloud-bindings-tests-boot-3/bindings/redis/type @@ -0,0 +1 @@ +redis \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-3/pom.xml b/spring-cloud-bindings-tests-boot-3/pom.xml new file mode 100644 index 0000000..48264b5 --- /dev/null +++ b/spring-cloud-bindings-tests-boot-3/pom.xml @@ -0,0 +1,77 @@ + + + 4.0.0 + + org.springframework.cloud + spring-cloud-bindings-parent + 1.12.0-SNAPSHOT + ../pom.xml + + spring-cloud-bindings-tests-boot-3 + Test project to verify Spring Cloud Bindings works properly with Spring Boot 2 + + 17 + 3.0.2 + + + + org.springframework.boot + spring-boot-starter + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-data-redis + ${spring-boot.version} + + + javax.annotation + javax.annotation-api + 1.3.1 + + + org.springframework.cloud + spring-cloud-bindings + ${version} + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + test + + + com.github.kstyrc + embedded-redis + 0.6 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.1 + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + 1 + false + + -Dorg.springframework.cloud.bindings.boot.enable=true + ${basedir}/bindings + + -Xmx1024m + + + + + + + diff --git a/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/IntegrationTest.java b/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/IntegrationTest.java new file mode 100644 index 0000000..f48f1b7 --- /dev/null +++ b/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/IntegrationTest.java @@ -0,0 +1,21 @@ +package org.springframework.cloud; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.redis.core.RedisTemplate; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +@SpringBootTest(classes = RedisServerTestConfiguration.class) +public class IntegrationTest { + + @Autowired + private RedisTemplate redisTemplate; + + @Test + public void shouldSaveUser_toRedis() { + redisTemplate.opsForValue().set("hello", "world"); + assertTrue(redisTemplate.hasKey("hello")); + } +} diff --git a/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java b/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java new file mode 100644 index 0000000..3f1f1d0 --- /dev/null +++ b/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java @@ -0,0 +1,28 @@ +package org.springframework.cloud; +import org.springframework.boot.test.context.TestConfiguration; +import redis.embedded.RedisServer; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import java.io.IOException; + +@TestConfiguration +public class RedisServerTestConfiguration { + + private RedisServer redisServer; + + public RedisServerTestConfiguration() throws IOException { + //this value should be set as well under bindings/redis/port so that the client configuration matches the server + this.redisServer = new RedisServer(4343); + } + + @PostConstruct + public void postConstruct() { + redisServer.start(); + } + + @PreDestroy + public void preDestroy() { + redisServer.stop(); + } +} \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/SpringBoot3Application.java b/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/SpringBoot3Application.java new file mode 100644 index 0000000..4f4697e --- /dev/null +++ b/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/SpringBoot3Application.java @@ -0,0 +1,11 @@ +package org.springframework.cloud; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; + +@SpringBootApplication +@Configuration +@EnableRedisRepositories +public class SpringBoot3Application { +} diff --git a/spring-cloud-bindings/pom.xml b/spring-cloud-bindings/pom.xml new file mode 100644 index 0000000..cb8a43a --- /dev/null +++ b/spring-cloud-bindings/pom.xml @@ -0,0 +1,192 @@ + + + + 4.0.0 + + + org.springframework.cloud + spring-cloud-bindings-parent + 1.12.0-SNAPSHOT + ../pom.xml + + + spring-cloud-bindings + Spring Cloud Cloud Native Buildpacks Bindings + Java Library and Auto-configuration for Cloud Native Buildpack Bindings + https://github.com/spring-cloud/spring-cloud-bindings + + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0.txt + + + + + https://github.com/spring-cloud/spring-cloud-bindings + + + + + scb-team + Spring Cloud Bindings Team + https://github.com/spring-cloud/spring-cloud-bindings/graphs/contributors + + + + + 1.8 + 3.0.2 + 1.1.2 + 2.5.14 + + + 3.10.1 + 3.2.1 + 3.0.0-M7 + 3.0.1 + 3.4.1 + + ${java.version} + ${java.version} + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + + + com.google.code.findbugs + jsr305 + ${jsr305.version} + provided + + + org.springframework.boot + spring-boot-starter + provided + + + + org.mariadb.jdbc + mariadb-java-client + test + + + org.mariadb + r2dbc-mariadb + ${mariadb-r2dbc.version} + test + + + org.mockito + mockito-core + test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + + -Werror + -Xlint:all + -Xlint:-options + -Xlint:-processing + -Xlint:-serial + + true + + + + org.apache.maven.plugins + maven-source-plugin + ${maven-source-plugin.version} + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + true + 1.8 + + + NonNullApi + X + + + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-gpg-plugin + ${maven-gpg-plugin.version} + + + sign-artifacts + verify + + sign + + + + --pinentry-mode + loopback + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + random + + + + + diff --git a/src/main/java/org/springframework/cloud/bindings/Binding.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/Binding.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/Binding.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/Binding.java diff --git a/src/main/java/org/springframework/cloud/bindings/Bindings.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/Bindings.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/Bindings.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/Bindings.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/BindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/BindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/BindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/BindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/ConfigServerBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ConfigServerBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/ConfigServerBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ConfigServerBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/Db2BindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Db2BindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/Db2BindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Db2BindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/EurekaBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/EurekaBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/EurekaBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/EurekaBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/Guards.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Guards.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/Guards.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Guards.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/KafkaBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/KafkaBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/KafkaBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/KafkaBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/LDAPBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/LDAPBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/LDAPBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/LDAPBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/MapMapper.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/MapMapper.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/MapMapper.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/MapMapper.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/MongoDbBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/MongoDbBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/MongoDbBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/MongoDbBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/MySqlBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/MySqlBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/MySqlBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/MySqlBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/OracleBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/OracleBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/OracleBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/OracleBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/PropertySourceContributor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/PropertySourceContributor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/PropertySourceContributor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/PropertySourceContributor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/RabbitMqBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/RabbitMqBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/RabbitMqBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/RabbitMqBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/SapHanaBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SapHanaBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/SapHanaBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SapHanaBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/SqlServerBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SqlServerBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/SqlServerBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SqlServerBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/WavefrontBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/WavefrontBindingsPropertiesProcessor.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/WavefrontBindingsPropertiesProcessor.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/WavefrontBindingsPropertiesProcessor.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/package-info.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/package-info.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/package-info.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/package-info.java diff --git a/src/main/java/org/springframework/cloud/bindings/package-info.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/package-info.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/package-info.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/package-info.java diff --git a/src/main/resources/META-INF/spring.factories b/spring-cloud-bindings/src/main/resources/META-INF/spring.factories similarity index 100% rename from src/main/resources/META-INF/spring.factories rename to spring-cloud-bindings/src/main/resources/META-INF/spring.factories diff --git a/src/test/java/org/springframework/cloud/bindings/BindingTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/BindingTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/BindingTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/BindingTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/BindingsTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/BindingsTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/BindingsTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/BindingsTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/FluentMap.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/FluentMap.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/FluentMap.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/FluentMap.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/BindingFlattenedEnvironmentPostProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/ConfigServerBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ConfigServerBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/ConfigServerBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ConfigServerBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/Db2BindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/Db2BindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/Db2BindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/Db2BindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/EurekaBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/EurekaBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/EurekaBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/EurekaBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/GuardsTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/GuardsTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/GuardsTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/GuardsTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/KafkaBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/KafkaBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/KafkaBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/KafkaBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/LDAPBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/LDAPBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/LDAPBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/LDAPBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/MapMapperTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/MapMapperTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/MapMapperTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/MapMapperTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/MongoDbBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/MongoDbBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/MongoDbBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/MongoDbBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/MySqlBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/MySqlBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/MySqlBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/MySqlBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/OracleBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/OracleBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/OracleBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/OracleBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/PostgreSqlBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/PropertySourceContributorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/PropertySourceContributorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/PropertySourceContributorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/PropertySourceContributorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/RabbitMqBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/RabbitMqBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/RabbitMqBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/RabbitMqBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/SapHanaBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SapHanaBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/SapHanaBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SapHanaBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolverTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolverTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolverTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolverTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SpringSecurityOAuth2BindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/SqlServerBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SqlServerBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/SqlServerBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SqlServerBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/TestHelper.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/TestHelper.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/TestHelper.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/TestHelper.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/WavefrontBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/WavefrontBindingsPropertiesProcessorTest.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/WavefrontBindingsPropertiesProcessorTest.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/WavefrontBindingsPropertiesProcessorTest.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/pem/PemCertificateParserTests.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/pem/PemCertificateParserTests.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/pem/PemCertificateParserTests.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/pem/PemCertificateParserTests.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/pem/PemContentTests.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/pem/PemContentTests.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/pem/PemContentTests.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/pem/PemContentTests.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/pem/PemPrivateKeyParserTests.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/pem/PemPrivateKeyParserTests.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/pem/PemPrivateKeyParserTests.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/pem/PemPrivateKeyParserTests.java diff --git a/src/test/java/org/springframework/cloud/bindings/boot/pem/PemSslStoreHelperTests.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/pem/PemSslStoreHelperTests.java similarity index 100% rename from src/test/java/org/springframework/cloud/bindings/boot/pem/PemSslStoreHelperTests.java rename to spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/pem/PemSslStoreHelperTests.java diff --git a/src/test/resources/cnb/test-k8s/metadata/.hidden-data b/spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/.hidden-data similarity index 100% rename from src/test/resources/cnb/test-k8s/metadata/.hidden-data rename to spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/.hidden-data diff --git a/src/test/resources/cnb/test-k8s/metadata/.hidden-data-1/kind b/spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/.hidden-data-1/kind similarity index 100% rename from src/test/resources/cnb/test-k8s/metadata/.hidden-data-1/kind rename to spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/.hidden-data-1/kind diff --git a/src/test/resources/cnb/test-k8s/metadata/.hidden-data-1/provider b/spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/.hidden-data-1/provider similarity index 100% rename from src/test/resources/cnb/test-k8s/metadata/.hidden-data-1/provider rename to spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/.hidden-data-1/provider diff --git a/src/test/resources/cnb/test-k8s/metadata/.hidden-data-1/test-metadata-key b/spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/.hidden-data-1/test-metadata-key similarity index 100% rename from src/test/resources/cnb/test-k8s/metadata/.hidden-data-1/test-metadata-key rename to spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/.hidden-data-1/test-metadata-key diff --git a/src/test/resources/cnb/test-k8s/metadata/kind b/spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/kind similarity index 100% rename from src/test/resources/cnb/test-k8s/metadata/kind rename to spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/kind diff --git a/src/test/resources/cnb/test-k8s/metadata/provider b/spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/provider similarity index 100% rename from src/test/resources/cnb/test-k8s/metadata/provider rename to spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/provider diff --git a/src/test/resources/cnb/test-k8s/metadata/test-metadata-key b/spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/test-metadata-key similarity index 100% rename from src/test/resources/cnb/test-k8s/metadata/test-metadata-key rename to spring-cloud-bindings/src/test/resources/cnb/test-k8s/metadata/test-metadata-key diff --git a/src/test/resources/cnb/test-k8s/secret/.hidden-data b/spring-cloud-bindings/src/test/resources/cnb/test-k8s/secret/.hidden-data similarity index 100% rename from src/test/resources/cnb/test-k8s/secret/.hidden-data rename to spring-cloud-bindings/src/test/resources/cnb/test-k8s/secret/.hidden-data diff --git a/src/test/resources/cnb/test-k8s/secret/.hidden-data-1/test-secret-key b/spring-cloud-bindings/src/test/resources/cnb/test-k8s/secret/.hidden-data-1/test-secret-key similarity index 100% rename from src/test/resources/cnb/test-k8s/secret/.hidden-data-1/test-secret-key rename to spring-cloud-bindings/src/test/resources/cnb/test-k8s/secret/.hidden-data-1/test-secret-key diff --git a/src/test/resources/cnb/test-k8s/secret/test-secret-key b/spring-cloud-bindings/src/test/resources/cnb/test-k8s/secret/test-secret-key similarity index 100% rename from src/test/resources/cnb/test-k8s/secret/test-secret-key rename to spring-cloud-bindings/src/test/resources/cnb/test-k8s/secret/test-secret-key diff --git a/src/test/resources/cnb/test-name-1/metadata/kind b/spring-cloud-bindings/src/test/resources/cnb/test-name-1/metadata/kind similarity index 100% rename from src/test/resources/cnb/test-name-1/metadata/kind rename to spring-cloud-bindings/src/test/resources/cnb/test-name-1/metadata/kind diff --git a/src/test/resources/cnb/test-name-1/metadata/provider b/spring-cloud-bindings/src/test/resources/cnb/test-name-1/metadata/provider similarity index 100% rename from src/test/resources/cnb/test-name-1/metadata/provider rename to spring-cloud-bindings/src/test/resources/cnb/test-name-1/metadata/provider diff --git a/src/test/resources/cnb/test-name-1/metadata/test-metadata-key b/spring-cloud-bindings/src/test/resources/cnb/test-name-1/metadata/test-metadata-key similarity index 100% rename from src/test/resources/cnb/test-name-1/metadata/test-metadata-key rename to spring-cloud-bindings/src/test/resources/cnb/test-name-1/metadata/test-metadata-key diff --git a/src/test/resources/cnb/test-name-1/secret/test-secret-key b/spring-cloud-bindings/src/test/resources/cnb/test-name-1/secret/test-secret-key similarity index 100% rename from src/test/resources/cnb/test-name-1/secret/test-secret-key rename to spring-cloud-bindings/src/test/resources/cnb/test-name-1/secret/test-secret-key diff --git a/src/test/resources/cnb/test-name-2/metadata/kind b/spring-cloud-bindings/src/test/resources/cnb/test-name-2/metadata/kind similarity index 100% rename from src/test/resources/cnb/test-name-2/metadata/kind rename to spring-cloud-bindings/src/test/resources/cnb/test-name-2/metadata/kind diff --git a/src/test/resources/cnb/test-name-2/metadata/provider b/spring-cloud-bindings/src/test/resources/cnb/test-name-2/metadata/provider similarity index 100% rename from src/test/resources/cnb/test-name-2/metadata/provider rename to spring-cloud-bindings/src/test/resources/cnb/test-name-2/metadata/provider diff --git a/src/test/resources/cnb/test-name-2/metadata/test-metadata-key b/spring-cloud-bindings/src/test/resources/cnb/test-name-2/metadata/test-metadata-key similarity index 100% rename from src/test/resources/cnb/test-name-2/metadata/test-metadata-key rename to spring-cloud-bindings/src/test/resources/cnb/test-name-2/metadata/test-metadata-key diff --git a/src/test/resources/cnb/test-name-2/secret/test-secret-key b/spring-cloud-bindings/src/test/resources/cnb/test-name-2/secret/test-secret-key similarity index 100% rename from src/test/resources/cnb/test-name-2/secret/test-secret-key rename to spring-cloud-bindings/src/test/resources/cnb/test-name-2/secret/test-secret-key diff --git a/src/test/resources/k8s/test-k8s/.hidden-data b/spring-cloud-bindings/src/test/resources/k8s/test-k8s/.hidden-data similarity index 100% rename from src/test/resources/k8s/test-k8s/.hidden-data rename to spring-cloud-bindings/src/test/resources/k8s/test-k8s/.hidden-data diff --git a/src/test/resources/k8s/test-k8s/.hidden-data-1/provider b/spring-cloud-bindings/src/test/resources/k8s/test-k8s/.hidden-data-1/provider similarity index 100% rename from src/test/resources/k8s/test-k8s/.hidden-data-1/provider rename to spring-cloud-bindings/src/test/resources/k8s/test-k8s/.hidden-data-1/provider diff --git a/src/test/resources/k8s/test-k8s/.hidden-data-1/test-secret-key b/spring-cloud-bindings/src/test/resources/k8s/test-k8s/.hidden-data-1/test-secret-key similarity index 100% rename from src/test/resources/k8s/test-k8s/.hidden-data-1/test-secret-key rename to spring-cloud-bindings/src/test/resources/k8s/test-k8s/.hidden-data-1/test-secret-key diff --git a/src/test/resources/k8s/test-k8s/.hidden-data-1/type b/spring-cloud-bindings/src/test/resources/k8s/test-k8s/.hidden-data-1/type similarity index 100% rename from src/test/resources/k8s/test-k8s/.hidden-data-1/type rename to spring-cloud-bindings/src/test/resources/k8s/test-k8s/.hidden-data-1/type diff --git a/src/test/resources/k8s/test-k8s/provider b/spring-cloud-bindings/src/test/resources/k8s/test-k8s/provider similarity index 100% rename from src/test/resources/k8s/test-k8s/provider rename to spring-cloud-bindings/src/test/resources/k8s/test-k8s/provider diff --git a/src/test/resources/k8s/test-k8s/test-secret-key b/spring-cloud-bindings/src/test/resources/k8s/test-k8s/test-secret-key similarity index 100% rename from src/test/resources/k8s/test-k8s/test-secret-key rename to spring-cloud-bindings/src/test/resources/k8s/test-k8s/test-secret-key diff --git a/src/test/resources/k8s/test-k8s/type b/spring-cloud-bindings/src/test/resources/k8s/test-k8s/type similarity index 100% rename from src/test/resources/k8s/test-k8s/type rename to spring-cloud-bindings/src/test/resources/k8s/test-k8s/type diff --git a/src/test/resources/k8s/test-name-1/provider b/spring-cloud-bindings/src/test/resources/k8s/test-name-1/provider similarity index 100% rename from src/test/resources/k8s/test-name-1/provider rename to spring-cloud-bindings/src/test/resources/k8s/test-name-1/provider diff --git a/src/test/resources/k8s/test-name-1/test-secret-key b/spring-cloud-bindings/src/test/resources/k8s/test-name-1/test-secret-key similarity index 100% rename from src/test/resources/k8s/test-name-1/test-secret-key rename to spring-cloud-bindings/src/test/resources/k8s/test-name-1/test-secret-key diff --git a/src/test/resources/k8s/test-name-1/type b/spring-cloud-bindings/src/test/resources/k8s/test-name-1/type similarity index 100% rename from src/test/resources/k8s/test-name-1/type rename to spring-cloud-bindings/src/test/resources/k8s/test-name-1/type diff --git a/src/test/resources/k8s/test-name-2/provider b/spring-cloud-bindings/src/test/resources/k8s/test-name-2/provider similarity index 100% rename from src/test/resources/k8s/test-name-2/provider rename to spring-cloud-bindings/src/test/resources/k8s/test-name-2/provider diff --git a/src/test/resources/k8s/test-name-2/test-secret-key b/spring-cloud-bindings/src/test/resources/k8s/test-name-2/test-secret-key similarity index 100% rename from src/test/resources/k8s/test-name-2/test-secret-key rename to spring-cloud-bindings/src/test/resources/k8s/test-name-2/test-secret-key diff --git a/src/test/resources/k8s/test-name-2/type b/spring-cloud-bindings/src/test/resources/k8s/test-name-2/type similarity index 100% rename from src/test/resources/k8s/test-name-2/type rename to spring-cloud-bindings/src/test/resources/k8s/test-name-2/type From 34316c314eeee2b0e44facc0d4d62fc2ef3b350e Mon Sep 17 00:00:00 2001 From: Anthony Dahanne Date: Thu, 16 Feb 2023 09:39:58 -0500 Subject: [PATCH 6/9] help tooling detect which versions to use Co-authored-by: Daniel Garnier-Moiroux Enhance SpringBootVersionResolver [issue] Make this package-protected ; you don't want this class to be a part of your public API (same as MapMapper). [suggestion] set the default value for forcedVersion to -1, it's a usual convention for "this is invalid". Co-authored-by: Daniel Garnier-Moiroux --- spring-cloud-bindings-tests-boot-2/pom.xml | 2 ++ spring-cloud-bindings-tests-boot-3/pom.xml | 2 ++ .../cloud/bindings/boot/SpringBootVersionResolver.java | 10 +++++----- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/spring-cloud-bindings-tests-boot-2/pom.xml b/spring-cloud-bindings-tests-boot-2/pom.xml index 71d9914..039f202 100644 --- a/spring-cloud-bindings-tests-boot-2/pom.xml +++ b/spring-cloud-bindings-tests-boot-2/pom.xml @@ -12,6 +12,8 @@ Test project to verify Spring Cloud Bindings works properly with Spring Boot 2 1.8 + ${java.version} + ${java.version} 2.5.14 diff --git a/spring-cloud-bindings-tests-boot-3/pom.xml b/spring-cloud-bindings-tests-boot-3/pom.xml index 48264b5..d9ad93e 100644 --- a/spring-cloud-bindings-tests-boot-3/pom.xml +++ b/spring-cloud-bindings-tests-boot-3/pom.xml @@ -12,6 +12,8 @@ Test project to verify Spring Cloud Bindings works properly with Spring Boot 2 17 + ${java.version} + ${java.version} 3.0.2 diff --git a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java index ba02cc9..06ccbbe 100644 --- a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java +++ b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java @@ -2,19 +2,19 @@ package org.springframework.cloud.bindings.boot; import org.springframework.boot.SpringBootVersion; -public class SpringBootVersionResolver { +class SpringBootVersionResolver { - private int forcedVersion; + private int forcedVersion = -1; - public SpringBootVersionResolver() { + SpringBootVersionResolver() { } protected SpringBootVersionResolver(int forcedVersion) { this.forcedVersion = forcedVersion; } - public boolean isBootMajorVersionEnabled(int bootVersion) { - if (forcedVersion != 0) { + protected boolean isBootMajorVersionEnabled(int bootVersion) { + if (forcedVersion != -1) { return forcedVersion == bootVersion; } int major = Integer.parseInt(SpringBootVersion.getVersion().split("\\.")[0]); From be780f7a4b2514ce13402c142ee2e7deac98e127 Mon Sep 17 00:00:00 2001 From: Anthony Dahanne Date: Thu, 16 Feb 2023 10:04:07 -0500 Subject: [PATCH 7/9] Integrate PR#94 comments from @Kehrlann * move bindings to src/test/resources * get rid of unused / duplicate annotations * move all dependencies to test scope for test projects --- pom.xml | 2 +- spring-cloud-bindings-tests-boot-2/pom.xml | 7 +++++-- .../cloud/RedisServerTestConfiguration.java | 11 ++++++++--- .../springframework/cloud/SpringBoot2Application.java | 4 ---- .../{ => src/test/resources}/bindings/redis/host | 0 .../{ => src/test/resources}/bindings/redis/port | 0 .../{ => src/test/resources}/bindings/redis/type | 0 spring-cloud-bindings-tests-boot-3/pom.xml | 8 ++++++-- .../cloud/RedisServerTestConfiguration.java | 11 ++++++++--- .../springframework/cloud/SpringBoot3Application.java | 4 ---- .../{ => src/test/resources}/bindings/redis/host | 0 .../{ => src/test/resources}/bindings/redis/port | 0 .../{ => src/test/resources}/bindings/redis/type | 0 spring-cloud-bindings/pom.xml | 2 +- .../bindings/boot/SpringBootVersionResolver.java | 4 ++++ 15 files changed, 33 insertions(+), 20 deletions(-) rename spring-cloud-bindings-tests-boot-2/{ => src/test/resources}/bindings/redis/host (100%) rename spring-cloud-bindings-tests-boot-2/{ => src/test/resources}/bindings/redis/port (100%) rename spring-cloud-bindings-tests-boot-2/{ => src/test/resources}/bindings/redis/type (100%) rename spring-cloud-bindings-tests-boot-3/{ => src/test/resources}/bindings/redis/host (100%) rename spring-cloud-bindings-tests-boot-3/{ => src/test/resources}/bindings/redis/port (100%) rename spring-cloud-bindings-tests-boot-3/{ => src/test/resources}/bindings/redis/type (100%) diff --git a/pom.xml b/pom.xml index 06ca0ce..780a261 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-bindings-parent - 1.13.0-SNAPSHOT + 2.0.0-SNAPSHOT pom Spring Cloud Cloud Native Buildpacks Bindings Parent diff --git a/spring-cloud-bindings-tests-boot-2/pom.xml b/spring-cloud-bindings-tests-boot-2/pom.xml index 039f202..b77e6f5 100644 --- a/spring-cloud-bindings-tests-boot-2/pom.xml +++ b/spring-cloud-bindings-tests-boot-2/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-bindings-parent - 1.12.0-SNAPSHOT + 2.0.0-SNAPSHOT ../pom.xml spring-cloud-bindings-tests-boot-2 @@ -21,16 +21,19 @@ org.springframework.boot spring-boot-starter ${spring-boot.version} + test org.springframework.boot spring-boot-starter-data-redis ${spring-boot.version} + test org.springframework.cloud spring-cloud-bindings ${version} + test org.springframework.boot @@ -62,7 +65,7 @@ false -Dorg.springframework.cloud.bindings.boot.enable=true - ${basedir}/bindings + ${basedir}/src/test/resources/bindings -Xmx1024m diff --git a/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java b/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java index 4fb8844..fe3ba38 100644 --- a/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java +++ b/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java @@ -1,19 +1,24 @@ package org.springframework.cloud; + import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.core.io.ClassPathResource; import redis.embedded.RedisServer; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.io.IOException; +import java.util.Scanner; @TestConfiguration public class RedisServerTestConfiguration { - private RedisServer redisServer; + private final RedisServer redisServer; public RedisServerTestConfiguration() throws IOException { - //this value should be set as well under bindings/redis/port so that the client configuration matches the server - this.redisServer = new RedisServer(4242); + try (Scanner scanner = new Scanner(new ClassPathResource("bindings/redis/port").getInputStream())) { + int port = scanner.nextInt(); + this.redisServer = new RedisServer(port); + } } @PostConstruct diff --git a/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/SpringBoot2Application.java b/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/SpringBoot2Application.java index 5945024..41e430a 100644 --- a/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/SpringBoot2Application.java +++ b/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/SpringBoot2Application.java @@ -1,11 +1,7 @@ package org.springframework.cloud; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; @SpringBootApplication -@Configuration -@EnableRedisRepositories public class SpringBoot2Application { } diff --git a/spring-cloud-bindings-tests-boot-2/bindings/redis/host b/spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/host similarity index 100% rename from spring-cloud-bindings-tests-boot-2/bindings/redis/host rename to spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/host diff --git a/spring-cloud-bindings-tests-boot-2/bindings/redis/port b/spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/port similarity index 100% rename from spring-cloud-bindings-tests-boot-2/bindings/redis/port rename to spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/port diff --git a/spring-cloud-bindings-tests-boot-2/bindings/redis/type b/spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/type similarity index 100% rename from spring-cloud-bindings-tests-boot-2/bindings/redis/type rename to spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/type diff --git a/spring-cloud-bindings-tests-boot-3/pom.xml b/spring-cloud-bindings-tests-boot-3/pom.xml index d9ad93e..5da0fda 100644 --- a/spring-cloud-bindings-tests-boot-3/pom.xml +++ b/spring-cloud-bindings-tests-boot-3/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-bindings-parent - 1.12.0-SNAPSHOT + 2.0.0-SNAPSHOT ../pom.xml spring-cloud-bindings-tests-boot-3 @@ -21,21 +21,25 @@ org.springframework.boot spring-boot-starter ${spring-boot.version} + test org.springframework.boot spring-boot-starter-data-redis ${spring-boot.version} + test javax.annotation javax.annotation-api 1.3.1 + test org.springframework.cloud spring-cloud-bindings ${version} + test org.springframework.boot @@ -67,7 +71,7 @@ false -Dorg.springframework.cloud.bindings.boot.enable=true - ${basedir}/bindings + ${basedir}/src/test/resources/bindings -Xmx1024m diff --git a/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java b/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java index 3f1f1d0..fe3ba38 100644 --- a/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java +++ b/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java @@ -1,19 +1,24 @@ package org.springframework.cloud; + import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.core.io.ClassPathResource; import redis.embedded.RedisServer; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.io.IOException; +import java.util.Scanner; @TestConfiguration public class RedisServerTestConfiguration { - private RedisServer redisServer; + private final RedisServer redisServer; public RedisServerTestConfiguration() throws IOException { - //this value should be set as well under bindings/redis/port so that the client configuration matches the server - this.redisServer = new RedisServer(4343); + try (Scanner scanner = new Scanner(new ClassPathResource("bindings/redis/port").getInputStream())) { + int port = scanner.nextInt(); + this.redisServer = new RedisServer(port); + } } @PostConstruct diff --git a/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/SpringBoot3Application.java b/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/SpringBoot3Application.java index 4f4697e..4bf7b7e 100644 --- a/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/SpringBoot3Application.java +++ b/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/SpringBoot3Application.java @@ -1,11 +1,7 @@ package org.springframework.cloud; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; @SpringBootApplication -@Configuration -@EnableRedisRepositories public class SpringBoot3Application { } diff --git a/spring-cloud-bindings-tests-boot-3/bindings/redis/host b/spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/host similarity index 100% rename from spring-cloud-bindings-tests-boot-3/bindings/redis/host rename to spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/host diff --git a/spring-cloud-bindings-tests-boot-3/bindings/redis/port b/spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/port similarity index 100% rename from spring-cloud-bindings-tests-boot-3/bindings/redis/port rename to spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/port diff --git a/spring-cloud-bindings-tests-boot-3/bindings/redis/type b/spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/type similarity index 100% rename from spring-cloud-bindings-tests-boot-3/bindings/redis/type rename to spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/type diff --git a/spring-cloud-bindings/pom.xml b/spring-cloud-bindings/pom.xml index cb8a43a..64b9b06 100644 --- a/spring-cloud-bindings/pom.xml +++ b/spring-cloud-bindings/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-bindings-parent - 1.12.0-SNAPSHOT + 2.0.0-SNAPSHOT ../pom.xml diff --git a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java index 06ccbbe..0a29284 100644 --- a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java +++ b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java @@ -2,6 +2,10 @@ package org.springframework.cloud.bindings.boot; import org.springframework.boot.SpringBootVersion; +/** + * This class is used to allow, in unit tests for example, + * to fake the resolution of which major version of spring boot is used + */ class SpringBootVersionResolver { private int forcedVersion = -1; From 3b43462fc4ad3d4f895b1cee62283dba92ecbcae Mon Sep 17 00:00:00 2001 From: Anthony Dahanne Date: Mon, 5 Jun 2023 17:23:22 -0400 Subject: [PATCH 8/9] Spring Boot 3 support * only in main branch, SB2 support will be continued in 1.x branch --- README.md | 128 +++------ pom.xml | 8 +- spring-cloud-bindings-tests-boot-2/README.md | 23 -- spring-cloud-bindings-tests-boot-2/pom.xml | 77 ------ .../cloud/SpringBoot2Application.java | 7 - .../src/test/resources/bindings/redis/port | 1 - .../cloud/IntegrationTest.java | 21 -- .../cloud/RedisServerTestConfiguration.java | 33 --- .../src/test/resources/bindings/redis/host | 1 - .../src/test/resources/bindings/redis/type | 1 - .../README.md | 13 +- .../pom.xml | 8 +- .../cloud/IntegrationTest.java | 0 .../cloud/RedisServerTestConfiguration.java | 0 .../cloud/SpringBoot3Application.java | 0 .../src/test/resources/bindings/redis/host | 0 .../src/test/resources/bindings/redis/port | 0 .../src/test/resources/bindings/redis/type | 0 spring-cloud-bindings/pom.xml | 5 - .../ArtemisBindingsPropertiesProcessor.java | 116 ++------ .../CassandraBindingsPropertiesProcessor.java | 99 ++----- .../CouchbaseBindingsPropertiesProcessor.java | 81 +----- ...sticsearchBindingsPropertiesProcessor.java | 78 +----- .../Neo4JBindingsPropertiesProcessor.java | 72 +---- .../RedisBindingsPropertiesProcessor.java | 97 ++----- .../boot/SpringBootVersionResolver.java | 27 -- .../VaultBindingsPropertiesProcessor.java | 255 ++++++------------ .../boot/pem/PemCertificateParser.java | 0 .../cloud/bindings/boot/pem/PemContent.java | 0 .../boot/pem/PemPrivateKeyParser.java | 0 .../bindings/boot/pem/PemSslStoreHelper.java | 0 .../cloud/bindings/boot/pem/package-info.java | 0 .../main/resources/META-INF/spring.factories | 24 +- ...rtemisBindingsPropertiesProcessorTest.java | 33 +-- ...gSpecificEnvironmentPostProcessorTest.java | 2 +- ...sandraBindingsPropertiesProcessorTest.java | 28 +- ...chbaseBindingsPropertiesProcessorTest.java | 37 +-- ...searchBindingsPropertiesProcessorTest.java | 39 +-- .../Neo4JBindingsPropertiesProcessorTest.java | 19 +- .../RedisBindingsPropertiesProcessorTest.java | 28 +- .../boot/SpringBootVersionResolverTest.java | 33 --- .../VaultBindingsPropertiesProcessorTest.java | 89 +----- .../src}/test/resources/pem/test-banner.txt | 0 .../test/resources/pem/test-cert-chain.pem | 0 .../src}/test/resources/pem/test-cert.pem | 0 .../src}/test/resources/pem/test-ec-key.pem | 0 .../src}/test/resources/pem/test-key.pem | 0 47 files changed, 252 insertions(+), 1231 deletions(-) delete mode 100644 spring-cloud-bindings-tests-boot-2/README.md delete mode 100644 spring-cloud-bindings-tests-boot-2/pom.xml delete mode 100644 spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/SpringBoot2Application.java delete mode 100644 spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/port delete mode 100644 spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/IntegrationTest.java delete mode 100644 spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java delete mode 100644 spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/host delete mode 100644 spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/type rename {spring-cloud-bindings-tests-boot-3 => spring-cloud-bindings-tests}/README.md (58%) rename {spring-cloud-bindings-tests-boot-3 => spring-cloud-bindings-tests}/pom.xml (89%) rename {spring-cloud-bindings-tests-boot-2 => spring-cloud-bindings-tests}/src/test/java/org/springframework/cloud/IntegrationTest.java (100%) rename {spring-cloud-bindings-tests-boot-2 => spring-cloud-bindings-tests}/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java (100%) rename {spring-cloud-bindings-tests-boot-3 => spring-cloud-bindings-tests}/src/test/java/org/springframework/cloud/SpringBoot3Application.java (100%) rename {spring-cloud-bindings-tests-boot-2 => spring-cloud-bindings-tests}/src/test/resources/bindings/redis/host (100%) rename {spring-cloud-bindings-tests-boot-3 => spring-cloud-bindings-tests}/src/test/resources/bindings/redis/port (100%) rename {spring-cloud-bindings-tests-boot-2 => spring-cloud-bindings-tests}/src/test/resources/bindings/redis/type (100%) delete mode 100644 spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/pem/PemCertificateParser.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/pem/PemContent.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/pem/PemPrivateKeyParser.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/pem/PemSslStoreHelper.java (100%) rename {src => spring-cloud-bindings/src}/main/java/org/springframework/cloud/bindings/boot/pem/package-info.java (100%) delete mode 100644 spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolverTest.java rename {src => spring-cloud-bindings/src}/test/resources/pem/test-banner.txt (100%) rename {src => spring-cloud-bindings/src}/test/resources/pem/test-cert-chain.pem (100%) rename {src => spring-cloud-bindings/src}/test/resources/pem/test-cert.pem (100%) rename {src => spring-cloud-bindings/src}/test/resources/pem/test-ec-key.pem (100%) rename {src => spring-cloud-bindings/src}/test/resources/pem/test-key.pem (100%) diff --git a/README.md b/README.md index 1ed4715..ec61e9d 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,12 @@ The Spring Cloud Bindings library exposes a rich Java language binding for the [ [s]: https://github.com/servicebinding/spec +## Features +* Java 17 +* Spring Boot 3 + +For Spring Boot 2 compatibility, please have a look at the [1.x releases](https://github.com/spring-cloud/spring-cloud-bindings/tree/1.x). + ## Library Usage While less used, explicit binding access can be achieved through the `Bindings` type. @@ -38,23 +44,11 @@ Each auto-configuration is triggered by the type of binding. Each auto-configur Type: `artemis` Disable Property: `org.springframework.cloud.bindings.boot.artemis.enable` -#### Spring Boot 2 properties - -| Property | Value | -| --------------------------------------------------- | -------------------------------------- | -| `spring.artemis.host` | `{host}` | -| `spring.artemis.port` | `{port}` | - -#### Spring Boot 3 properties +#### Properties | Property | Value | | --------------------------------------------------- | -------------------------------------- | | `spring.artemis.broker-url` | `{broker-url}` | - -#### Common properties - -| Property | Value | -| --------------------------------------------------- | -------------------------------------- | | `spring.artemis.mode` | `{mode}` | | `spring.artemis.password` | `{password}` | | `spring.artemis.user` | `{user}` | @@ -78,24 +72,7 @@ Disable Property: `org.springframework.cloud.bindings.boot.artemis.enable` Type: `cassandra` Disable Property: `org.springframework.cloud.bindings.boot.cassandra.enable` -#### Spring Boot 2 properties - -| Property | Value | -|-------------------------------------------------------------------|-----------------------------------------------| -| `spring.data.cassandra.cluster-name` | `{cluster-name}` | -| `spring.data.cassandra.compression` | `{compression}` | -| `spring.data.cassandra.contact-points` | `{contact-points}` | -| `spring.data.cassandra.keyspace-name` | `{keyspace-name}` | -| `spring.data.cassandra.password` | `{password}` | -| `spring.data.cassandra.port` | `{port}` | -| `spring.data.cassandra.ssl` | `{ssl}` | -| `spring.data.cassandra.username` | `{username}` | -| `spring.data.cassandra.request.throttler.drain-interval` | `{request.throttler.drain-interval}` | -| `spring.data.cassandra.request.throttler.max-concurrent-requests` | `{request.throttler.max-concurrent-requests}` | -| `spring.data.cassandra.request.throttler.max-queue-size` | `{request.throttler.max-queue-size}` | -| `spring.data.cassandra.request.throttler.max-requests-per-second` | `{request.throttler.max-requests-per-second}` | - -#### Spring Boot 3 properties +#### Properties | Property | Value | |--------------------------------------------------------------|-----------------------------------------------| @@ -116,29 +93,14 @@ Disable Property: `org.springframework.cloud.bindings.boot.cassandra.enable` Type: `couchbase` Disable Property: `org.springframework.cloud.bindings.boot.couchbase.enable` -#### Spring Boot 2 properties - -| Property | Value | -|---------------------------------------------------|------------------------------------| -| `spring.couchbase.bootstrap-hosts` | `{bootstrap-hosts}` | -| `spring.couchbase.bucket.name` | `{bucket.name}` | -| `spring.couchbase.bucket.password` | `{bucket.passsword}` | -| `spring.couchbase.env.bootstrap.http-direct-port` | `{env.bootstrap.http-direct-port}` | -| `spring.couchbase.env.bootstrap.http-ssl-port` | `{env.bootstrap.http-ssl-port}` | - -#### Spring Boot 3 properties +#### Properties | Property | Value | |--------------------------------------------------|---------------------------| | `spring.couchbase.connection-string` | `{connection-string}` | | `spring.data.couchbase.bucket-name` | `{bucket-name}` | - -#### Common properties - -| Property | Value | -|---------------------------------------------------|---------------------------| -| `spring.couchbase.password` | `{password}` | -| `spring.couchbase.username` | `{username}` | +| `spring.couchbase.password` | `{password}` | +| `spring.couchbase.username` | `{username}` | ### DB2 RDBMS Type: `db2` @@ -159,23 +121,7 @@ Disable Property: `org.springframework.cloud.bindings.boot.db2.enable` Type: `elasticsearch` Disable Property: `org.springframework.cloud.bindings.boot.elasticsearch.enable` -#### Spring Boot 2 properties - -| Property | Value | -| ----------------------------------------------------- | -------------- | -| `spring.data.elasticsearch.client.reactive.endpoints` | `{endpoints}` | -| `spring.data.elasticsearch.client.reactive.password` | `{password}` | -| `spring.data.elasticsearch.client.reactive.use-ssl` | `{use-ssl}` | -| `spring.data.elasticsearch.client.reactive.username` | `{username}` | -| `spring.elasticsearch.jest.password` | `{password}` | -| `spring.elasticsearch.jest.proxy.host` | `{proxy.host}` | -| `spring.elasticsearch.jest.proxy.port` | `{proxy.port}` | -| `spring.elasticsearch.jest.username` | `{username}` | -| `spring.elasticsearch.rest.password` | `{password}` | -| `spring.elasticsearch.rest.uris` | `{uris}` | -| `spring.elasticsearch.rest.username` | `{username}` | - -#### Spring Boot 3 properties +#### Properties | Property | Value | |---------------------------------|---------------| @@ -240,15 +186,7 @@ Disable Property: `org.springframework.cloud.bindings.boot.mysql.enable` Type: `neo4j` Disable Property: `org.springframework.cloud.bindings.boot.neo4j.enable` -#### Spring Boot 2 properties - -| Property | Value | -| ---------------------------- | ------------ | -| `spring.data.neo4j.uri` | `{uri}` | -| `spring.data.neo4j.username` | `{username}` | -| `spring.data.neo4j.password` | `{password}` | - -#### Spring Boot 3 properties +#### Properties | Property | Value | |-----------------------------------------|----------------| @@ -301,23 +239,7 @@ Disable Property: `org.springframework.cloud.bindings.boot.rabbitmq.enable` Type: `redis` Disable Property: `org.springframework.cloud.bindings.boot.redis.enable` -#### Spring Boot 2 properties - -| Property | Value | -| ------------------------------------ | ------------------------- | -| `spring.redis.client-name` | `{client-name}` | -| `spring.redis.cluster.max-redirects` | `{cluster.max-redirects}` | -| `spring.redis.cluster.nodes` | `{cluster.nodes}` | -| `spring.redis.database` | `{database}` | -| `spring.redis.host` | `{host}` | -| `spring.redis.password` | `{password}` | -| `spring.redis.port` | `{port}` | -| `spring.redis.sentinel.master` | `{sentinel.master}` | -| `spring.redis.sentinel.nodes` | `{sentinel.nodes}` | -| `spring.redis.ssl` | `{ssl}` | -| `spring.redis.url` | `{url}` | - -#### Spring Boot 3 properties +#### Properties | Property | Value | |-------------------------------------------|---------------------------| @@ -426,6 +348,7 @@ Type: `vault` Disable Property: `org.springframework.cloud.bindings.boot.vault.enable` Any Provider: + | Property | Value | | ----------------------------------- | ------------------------- | | `spring.cloud.vault.authentication` | `{authentication-method}` | @@ -433,6 +356,7 @@ Any Provider: | `spring.cloud.vault.uri` | `{uri}` | If `{authentication-method}` is equal to `approle`: + | Property | Value | | ------------------------------------------- | ----------------- | | `spring.cloud.vault.app-role.app-role-path` | `{app-role-path}` | @@ -441,6 +365,7 @@ If `{authentication-method}` is equal to `approle`: | `spring.cloud.vault.app-role.secret-id` | `{secret-id}` | If `{authentication-method}` is equal to `aws_ec2`: + | Property | Value | | ---------------------------------------------- | -------------------------------------- | | `spring.cloud.vault.aws-ec2.aws-ec2-path` | `{aws-ec2-path}` | @@ -449,37 +374,41 @@ If `{authentication-method}` is equal to `aws_ec2`: | `spring.cloud.vault.aws-ec2.role` | `{role}` | If `{authentication-method}` is equal to `aws_iam`: + | Property | Value | |-------------------------------------------|----------------------------------------| | `spring.cloud.vault.aws-iam.aws-path` | `{aws-path}` | | `spring.cloud.vault.aws-iam.endpoint-uri` | `{aws-sts-endpoint-uri}` | | `spring.cloud.vault.aws-iam.role` | `{role}` | -| `spring.cloud.vault.aws-iam.server-id` | `{aws-iam-server-id}` Spring Boot 2 | -| `spring.cloud.vault.aws-iam.server-name` | `{aws-iam-server-name}` Spring Boot 3 | +| `spring.cloud.vault.aws-iam.server-name` | `{aws-iam-server-name}` | If `{authentication-method}` is equal to `azure_msi`: + | Property | Value | |-------------------------------------------------------|------------------------------------------| | `spring.cloud.vault.azure-msi.azure-path` | `{azure-path}` | | `spring.cloud.vault.azure-msi.role` | `{role}` | -| `spring.cloud.vault.azure-msi.metadata-service` | `{metadata-service}` Spring Boot 3 | -| `spring.cloud.vault.azure-msi.identity-token-service` | `{identity-token-service}` Spring Boot 3 | +| `spring.cloud.vault.azure-msi.metadata-service` | `{metadata-service}` | +| `spring.cloud.vault.azure-msi.identity-token-service` | `{identity-token-service}` | If `{authentication-method}` is equal to `cert`: + | Property | Value | |-----------------------------------------------|---------------------------------------------------------------| | `spring.cloud.vault.ssl.cert-auth-path` | `{cert-auth-path}` | | `spring.cloud.vault.ssl.key-store-password` | `{key-store-password}` | | `spring.cloud.vault.ssl.key-store` | `${SERVICE_BINDING_ROOT}/{name}/keystore.jks` | -| `spring.cloud.vault.ssl.trust-store` | `${SERVICE_BINDING_ROOT}/{name}/truststore.jks` Spring Boot 3 | -| `spring.cloud.vault.ssl.trust-store-password` | `{trust-store-password}` Spring Boot 3 | +| `spring.cloud.vault.ssl.trust-store` | `${SERVICE_BINDING_ROOT}/{name}/truststore.jks` | +| `spring.cloud.vault.ssl.trust-store-password` | `{trust-store-password}` | If `{authentication-method}` is equal to `cubbyhole`: + | Property | Value | | -------------------------- | --------- | | `spring.cloud.vault.token` | `{token}` | If `{authentication-method}` is equal to `gcp_gce`: + | Property | Value | | -------------------------------------------- | ----------------------- | | `spring.cloud.vault.gcp-gce.gcp-path` | `{gcp-path}` | @@ -487,6 +416,7 @@ If `{authentication-method}` is equal to `gcp_gce`: | `spring.cloud.vault.gcp-gce.service-account` | `{gcp-service-account}` | If `{authentication-method}` is equal to `gcp_iam`: + | Property | Value | |------------------------------------------------------|----------------------------------------------------| | `spring.cloud.vault.gcp-iam.credentials.encoded-key` | `{encoded-key}` | @@ -499,6 +429,7 @@ If `{authentication-method}` is equal to `gcp_iam`: | `spring.cloud.vault.gcp-iam.service-account-id` | `{gcp-service-account}` Spring Boot 3 | If `{authentication-method}` is equal to `kubernetes`: + | Property | Value | |-----------------------------------------------------------------------|---------------------------------------------------------| | `spring.cloud.vault.kubernetes.role` | `{role}` | @@ -506,6 +437,7 @@ If `{authentication-method}` is equal to `kubernetes`: | `spring.cloud.vault.kubernetes.kubernetes-service-account-token-file` | `{kubernetes-service-account-token-file}` Spring Boot 3 | If `{authentication-method}` is equal to `token`: + | Property | Value | | -------------------------- | --------- | | `spring.cloud.vault.token` | `{token}` | diff --git a/pom.xml b/pom.xml index 780a261..60c081b 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,10 @@ UTF-8 UTF-8 + 17 + ${java.version} + ${java.version} + 3.1.0 @@ -27,10 +31,8 @@ spring-cloud-bindings - spring-cloud-bindings-tests-boot-2 - spring-cloud-bindings-tests-boot-3 + spring-cloud-bindings-tests - https://github.com/spring-cloud/spring-cloud-bindings diff --git a/spring-cloud-bindings-tests-boot-2/README.md b/spring-cloud-bindings-tests-boot-2/README.md deleted file mode 100644 index 0f1faf3..0000000 --- a/spring-cloud-bindings-tests-boot-2/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# Spring Cloud Bindings Test Boot 2 - -## Purpose of this module - -For several Spring Cloud Bindings integrations, the properties bindings need to be different between Spring Boot 2 and Spring Boot 3. - -For example, we can take some Redis properties bindings; with Spring Boot 2, they need to be mapped this way: - -| Property | Value | -|---------------------|----------| -| `spring.redis.port` | `{port}` | -| `spring.redis.host` | `{host}` | - -But in a Spring Boot 3 application, the mapping needs to be different because of changes with Spring Data Redis: - -| Property | Value | -|--------------------------|----------| -| `spring.data.redis.port` | `{port}` | -| `spring.data.redis.host` | `{host}` | - -This module runs an application, based on Spring Boot 2, and checks whether the `RedisConnectionFactory` properly picked up the `spring.redis.port` and `spring.redis.host` values. - -Pay attention to the 2 environment variables set in the `pom.xml` that set the `JAVA_TOOL_OPTIONS` and `SERVICE_BINDING_ROOT` - they allow Spring Boot Bindings to load the proper configuration in `bindings/redis` \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-2/pom.xml b/spring-cloud-bindings-tests-boot-2/pom.xml deleted file mode 100644 index b77e6f5..0000000 --- a/spring-cloud-bindings-tests-boot-2/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - 4.0.0 - - org.springframework.cloud - spring-cloud-bindings-parent - 2.0.0-SNAPSHOT - ../pom.xml - - spring-cloud-bindings-tests-boot-2 - Test project to verify Spring Cloud Bindings works properly with Spring Boot 2 - - 1.8 - ${java.version} - ${java.version} - 2.5.14 - - - - org.springframework.boot - spring-boot-starter - ${spring-boot.version} - test - - - org.springframework.boot - spring-boot-starter-data-redis - ${spring-boot.version} - test - - - org.springframework.cloud - spring-cloud-bindings - ${version} - test - - - org.springframework.boot - spring-boot-starter-test - ${spring-boot.version} - test - - - com.github.kstyrc - embedded-redis - 0.6 - test - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.10.1 - - - org.apache.maven.plugins - maven-surefire-plugin - 2.22.2 - - 1 - false - - -Dorg.springframework.cloud.bindings.boot.enable=true - ${basedir}/src/test/resources/bindings - - -Xmx1024m - - - - - - - diff --git a/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/SpringBoot2Application.java b/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/SpringBoot2Application.java deleted file mode 100644 index 41e430a..0000000 --- a/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/SpringBoot2Application.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.springframework.cloud; - -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class SpringBoot2Application { -} diff --git a/spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/port b/spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/port deleted file mode 100644 index 629d685..0000000 --- a/spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/port +++ /dev/null @@ -1 +0,0 @@ -4242 \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/IntegrationTest.java b/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/IntegrationTest.java deleted file mode 100644 index f48f1b7..0000000 --- a/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/IntegrationTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.springframework.cloud; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.redis.core.RedisTemplate; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -@SpringBootTest(classes = RedisServerTestConfiguration.class) -public class IntegrationTest { - - @Autowired - private RedisTemplate redisTemplate; - - @Test - public void shouldSaveUser_toRedis() { - redisTemplate.opsForValue().set("hello", "world"); - assertTrue(redisTemplate.hasKey("hello")); - } -} diff --git a/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java b/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java deleted file mode 100644 index fe3ba38..0000000 --- a/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.springframework.cloud; - -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.core.io.ClassPathResource; -import redis.embedded.RedisServer; - -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import java.io.IOException; -import java.util.Scanner; - -@TestConfiguration -public class RedisServerTestConfiguration { - - private final RedisServer redisServer; - - public RedisServerTestConfiguration() throws IOException { - try (Scanner scanner = new Scanner(new ClassPathResource("bindings/redis/port").getInputStream())) { - int port = scanner.nextInt(); - this.redisServer = new RedisServer(port); - } - } - - @PostConstruct - public void postConstruct() { - redisServer.start(); - } - - @PreDestroy - public void preDestroy() { - redisServer.stop(); - } -} \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/host b/spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/host deleted file mode 100644 index d18580b..0000000 --- a/spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/host +++ /dev/null @@ -1 +0,0 @@ -localhost \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/type b/spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/type deleted file mode 100644 index 74b362f..0000000 --- a/spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/type +++ /dev/null @@ -1 +0,0 @@ -redis \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-3/README.md b/spring-cloud-bindings-tests/README.md similarity index 58% rename from spring-cloud-bindings-tests-boot-3/README.md rename to spring-cloud-bindings-tests/README.md index 4d6858a..cabe47e 100644 --- a/spring-cloud-bindings-tests-boot-3/README.md +++ b/spring-cloud-bindings-tests/README.md @@ -1,23 +1,16 @@ -# Spring Cloud Bindings Test Boot 2 +# Spring Cloud Bindings Test Boot 3 ## Purpose of this module For several Spring Cloud Bindings integrations, the properties bindings need to be different between Spring Boot 2 and Spring Boot 3. -For example, we can take some Redis properties bindings; with Spring Boot 2, they need to be mapped this way: - -| Property | Value | -|---------------------|----------| -| `spring.redis.port` | `{port}` | -| `spring.redis.host` | `{host}` | - -But in a Spring Boot 3 application, the mapping needs to be different because of changes with Spring Data Redis: +In a Spring Boot 3 application, the mapping needs to be different because of changes with Spring Data Redis: | Property | Value | |--------------------------|----------| | `spring.data.redis.port` | `{port}` | | `spring.data.redis.host` | `{host}` | -This module runs an application, based on Spring Boot 2, and checks whether the `RedisConnectionFactory` properly picked up the `spring.data.redis.port` and `spring.data.redis.host` values. +This module runs an application, based on Spring Boot 3, and checks whether the `RedisConnectionFactory` properly picked up the `spring.data.redis.port` and `spring.data.redis.host` values. Pay attention to the 2 environment variables set in the `pom.xml` that set the `JAVA_TOOL_OPTIONS` and `SERVICE_BINDING_ROOT` - they allow Spring Boot Bindings to load the proper configuration in `bindings/redis` \ No newline at end of file diff --git a/spring-cloud-bindings-tests-boot-3/pom.xml b/spring-cloud-bindings-tests/pom.xml similarity index 89% rename from spring-cloud-bindings-tests-boot-3/pom.xml rename to spring-cloud-bindings-tests/pom.xml index 5da0fda..6be8093 100644 --- a/spring-cloud-bindings-tests-boot-3/pom.xml +++ b/spring-cloud-bindings-tests/pom.xml @@ -8,14 +8,8 @@ 2.0.0-SNAPSHOT ../pom.xml - spring-cloud-bindings-tests-boot-3 + spring-cloud-bindings-tests Test project to verify Spring Cloud Bindings works properly with Spring Boot 2 - - 17 - ${java.version} - ${java.version} - 3.0.2 - org.springframework.boot diff --git a/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/IntegrationTest.java b/spring-cloud-bindings-tests/src/test/java/org/springframework/cloud/IntegrationTest.java similarity index 100% rename from spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/IntegrationTest.java rename to spring-cloud-bindings-tests/src/test/java/org/springframework/cloud/IntegrationTest.java diff --git a/spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java b/spring-cloud-bindings-tests/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java similarity index 100% rename from spring-cloud-bindings-tests-boot-2/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java rename to spring-cloud-bindings-tests/src/test/java/org/springframework/cloud/RedisServerTestConfiguration.java diff --git a/spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/SpringBoot3Application.java b/spring-cloud-bindings-tests/src/test/java/org/springframework/cloud/SpringBoot3Application.java similarity index 100% rename from spring-cloud-bindings-tests-boot-3/src/test/java/org/springframework/cloud/SpringBoot3Application.java rename to spring-cloud-bindings-tests/src/test/java/org/springframework/cloud/SpringBoot3Application.java diff --git a/spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/host b/spring-cloud-bindings-tests/src/test/resources/bindings/redis/host similarity index 100% rename from spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/host rename to spring-cloud-bindings-tests/src/test/resources/bindings/redis/host diff --git a/spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/port b/spring-cloud-bindings-tests/src/test/resources/bindings/redis/port similarity index 100% rename from spring-cloud-bindings-tests-boot-3/src/test/resources/bindings/redis/port rename to spring-cloud-bindings-tests/src/test/resources/bindings/redis/port diff --git a/spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/type b/spring-cloud-bindings-tests/src/test/resources/bindings/redis/type similarity index 100% rename from spring-cloud-bindings-tests-boot-2/src/test/resources/bindings/redis/type rename to spring-cloud-bindings-tests/src/test/resources/bindings/redis/type diff --git a/spring-cloud-bindings/pom.xml b/spring-cloud-bindings/pom.xml index 64b9b06..5b88452 100644 --- a/spring-cloud-bindings/pom.xml +++ b/spring-cloud-bindings/pom.xml @@ -36,10 +36,8 @@ - 1.8 3.0.2 1.1.2 - 2.5.14 3.10.1 @@ -47,9 +45,6 @@ 3.0.0-M7 3.0.1 3.4.1 - - ${java.version} - ${java.version} diff --git a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessor.java index fb9e328..9fb01ac 100644 --- a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessor.java +++ b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessor.java @@ -27,105 +27,43 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -public final class ArtemisBindingsPropertiesProcessor { +public final class ArtemisBindingsPropertiesProcessor implements BindingsPropertiesProcessor { /** * The {@link Binding} type that this processor is interested in: {@value}. **/ public static final String TYPE = "artemis"; - public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { - - private static final int BOOT_VERSION = 2; - - Boot2(int forcedVersion) { - super(forcedVersion); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; } - public Boot2() { - } + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("broker-url").to("spring.artemis.broker-url"); - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; - } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; - } + map.from("pool.block-if-full").to("spring.artemis.pool.block-if-full"); + map.from("pool.block-if-full-timeout").to("spring.artemis.pool.block-if-full-timeout"); + map.from("pool.enabled").to("spring.artemis.pool.enabled"); + map.from("pool.idle-timeout").to("spring.artemis.pool.idle-timeout"); + map.from("pool.max-connections").to("spring.artemis.pool.max-connections"); + map.from("pool.max-sessions-per-connection").to("spring.artemis.pool.max-sessions-per-connection"); + map.from("pool.time-between-expiration-check").to("spring.artemis.pool.time-between-expiration-check"); + map.from("pool.use-anonymous-producers").to("spring.artemis.pool.use-anonymous-producers"); - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - map.from("host").to("spring.artemis.host"); - map.from("port").to("spring.artemis.port"); + map.from("mode").to("spring.artemis.mode"); + map.from("password").to("spring.artemis.password"); + map.from("user").to("spring.artemis.user"); - map.from("pool.block-if-full").to("spring.rabbitmq.pool.block-if-full"); - map.from("pool.block-if-full-timeout").to("spring.rabbitmq.pool.block-if-full-timeout"); - map.from("pool.enabled").to("spring.rabbitmq.pool.enabled"); - map.from("pool.idle-timeout").to("spring.rabbitmq.pool.idle-timeout"); - map.from("pool.max-connections").to("spring.rabbitmq.pool.max-connections"); - map.from("pool.max-sessions-per-connection").to("spring.rabbitmq.pool.max-sessions-per-connection"); - map.from("pool.time-between-expiration-check").to("spring.rabbitmq.pool.time-between-expiration-check"); - map.from("pool.use-anonymous-producers").to("spring.rabbitmq.pool.use-anonymous-producers"); - - commonProperties(map); - }); - } + map.from("embedded.cluster-password").to("spring.artemis.embedded.cluster-password"); + map.from("embedded.data-directory").to("spring.artemis.embedded.data-directory"); + map.from("embedded.enabled").to("spring.artemis.embedded.enabled"); + map.from("embedded.persistent").to("spring.artemis.embedded.persistent"); + map.from("embedded.queues").to("spring.artemis.embedded.queues"); + map.from("embedded.server-id").to("spring.artemis.embedded.server-id"); + map.from("embedded.topics").to("spring.artemis.embedded.topics"); + }); } - - /** - * This is a special case for Boot 3. - */ - public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { - - private static final int BOOT_VERSION = 3; - - Boot3(int forcedVersion) { - super(forcedVersion); - } - - public Boot3() { - } - - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; - } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; - } - - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - map.from("broker-url").to("spring.artemis.broker-url"); - - map.from("pool.block-if-full").to("spring.artemis.pool.block-if-full"); - map.from("pool.block-if-full-timeout").to("spring.artemis.pool.block-if-full-timeout"); - map.from("pool.enabled").to("spring.artemis.pool.enabled"); - map.from("pool.idle-timeout").to("spring.artemis.pool.idle-timeout"); - map.from("pool.max-connections").to("spring.artemis.pool.max-connections"); - map.from("pool.max-sessions-per-connection").to("spring.artemis.pool.max-sessions-per-connection"); - map.from("pool.time-between-expiration-check").to("spring.artemis.pool.time-between-expiration-check"); - map.from("pool.use-anonymous-producers").to("spring.artemis.pool.use-anonymous-producers"); - - commonProperties(map); - }); - } - } - - private static void commonProperties(MapMapper map) { - map.from("mode").to("spring.artemis.mode"); - map.from("password").to("spring.artemis.password"); - map.from("user").to("spring.artemis.user"); - - map.from("embedded.cluster-password").to("spring.artemis.embedded.cluster-password"); - map.from("embedded.data-directory").to("spring.artemis.embedded.data-directory"); - map.from("embedded.enabled").to("spring.artemis.embedded.enabled"); - map.from("embedded.persistent").to("spring.artemis.embedded.persistent"); - map.from("embedded.queues").to("spring.artemis.embedded.queues"); - map.from("embedded.server-id").to("spring.artemis.embedded.server-id"); - map.from("embedded.topics").to("spring.artemis.embedded.topics"); - } - } diff --git a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessor.java index 7955681..fff749c 100644 --- a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessor.java +++ b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessor.java @@ -27,92 +27,33 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -public final class CassandraBindingsPropertiesProcessor { - +public final class CassandraBindingsPropertiesProcessor implements BindingsPropertiesProcessor { /** * The {@link Binding} type that this processor is interested in: {@value}. **/ public static final String TYPE = "cassandra"; - public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { - - private static final int BOOT_VERSION = 2; - - Boot2(int forcedVersion) { - super(forcedVersion); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; } - public Boot2() { - } + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("cluster-name").to("spring.cassandra.cluster-name"); + map.from("compression").to("spring.cassandra.compression"); + map.from("contact-points").to("spring.cassandra.contact-points"); + map.from("keyspace-name").to("spring.cassandra.keyspace-name"); + map.from("password").to("spring.cassandra.password"); + map.from("port").to("spring.cassandra.port"); + map.from("ssl").to("spring.cassandra.ssl"); + map.from("username").to("spring.cassandra.username"); - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; - } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; - } - - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - map.from("cluster-name").to("spring.data.cassandra.cluster-name"); - map.from("compression").to("spring.data.cassandra.compression"); - map.from("contact-points").to("spring.data.cassandra.contact-points"); - map.from("keyspace-name").to("spring.data.cassandra.keyspace-name"); - map.from("password").to("spring.data.cassandra.password"); - map.from("port").to("spring.data.cassandra.port"); - map.from("ssl").to("spring.data.cassandra.ssl"); - map.from("username").to("spring.data.cassandra.username"); - - map.from("request.throttler.drain-interval").to("spring.data.cassandra.request.throttler.drain-interval"); - map.from("request.throttler.max-concurrent-requests").to("spring.data.cassandra.request.throttler.max-concurrent-requests"); - map.from("request.throttler.max-queue-size").to("spring.data.cassandra.request.throttler.max-queue-size"); - map.from("request.throttler.max-requests-per-second").to("spring.data.cassandra.request.throttler.max-requests-per-second"); - }); - } + map.from("request.throttler.drain-interval").to("spring.cassandra.request.throttler.drain-interval"); + map.from("request.throttler.max-concurrent-requests").to("spring.cassandra.request.throttler.max-concurrent-requests"); + map.from("request.throttler.max-queue-size").to("spring.cassandra.request.throttler.max-queue-size"); + map.from("request.throttler.max-requests-per-second").to("spring.cassandra.request.throttler.max-requests-per-second"); + }); } - - /** - * This is a special case for Boot 3. - */ - public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { - - private static final int BOOT_VERSION = 3; - - Boot3(int forcedVersion) { - super(forcedVersion); - } - - public Boot3() { - } - - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; - } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; - } - - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - map.from("cluster-name").to("spring.cassandra.cluster-name"); - map.from("compression").to("spring.cassandra.compression"); - map.from("contact-points").to("spring.cassandra.contact-points"); - map.from("keyspace-name").to("spring.cassandra.keyspace-name"); - map.from("password").to("spring.cassandra.password"); - map.from("port").to("spring.cassandra.port"); - map.from("ssl").to("spring.cassandra.ssl"); - map.from("username").to("spring.cassandra.username"); - - map.from("request.throttler.drain-interval").to("spring.cassandra.request.throttler.drain-interval"); - map.from("request.throttler.max-concurrent-requests").to("spring.cassandra.request.throttler.max-concurrent-requests"); - map.from("request.throttler.max-queue-size").to("spring.cassandra.request.throttler.max-queue-size"); - map.from("request.throttler.max-requests-per-second").to("spring.cassandra.request.throttler.max-requests-per-second"); - }); - } - } - } diff --git a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessor.java index c595422..a766546 100644 --- a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessor.java +++ b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessor.java @@ -27,82 +27,25 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -final class CouchbaseBindingsPropertiesProcessor { - +final class CouchbaseBindingsPropertiesProcessor implements BindingsPropertiesProcessor { /** * The {@link Binding} type that this processor is interested in: {@value}. **/ public static final String TYPE = "couchbase"; - public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { - - private static final int BOOT_VERSION = 2; - - Boot2(int forcedVersion) { - super(forcedVersion); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; } - public Boot2() { - } + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("bucket-name").to("spring.data.couchbase.bucket-name"); + map.from("connection-string").to("spring.couchbase.connection-string"); + map.from("password").to("spring.couchbase.password"); + map.from("username").to("spring.couchbase.username"); - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; - } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; - } - - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - map.from("bootstrap-hosts").to("spring.couchbase.bootstrap-hosts"); - map.from("bucket.name").to("spring.couchbase.bucket.name"); - map.from("bucket.password").to("spring.couchbase.bucket.password"); - map.from("env.bootstrap.http-direct-port").to("spring.couchbase.env.bootstrap.http-direct-port"); - map.from("env.bootstrap.http-ssl-port").to("spring.couchbase.env.bootstrap.http-ssl-port"); - commonProperties(map); - - }); - } + }); } - - /** - * This is a special case for Boot 3. - */ - public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { - - private static final int BOOT_VERSION = 3; - - Boot3(int forcedVersion) { - super(forcedVersion); - } - - public Boot3() { - } - - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; - } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; - } - - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - map.from("bucket-name").to("spring.data.couchbase.bucket-name"); - map.from("connection-string").to("spring.couchbase.connection-string"); - commonProperties(map); - - }); - } - } - - private static void commonProperties(MapMapper map) { - map.from("password").to("spring.couchbase.password"); - map.from("username").to("spring.couchbase.username"); - } - } diff --git a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessor.java index 0d21031..e450be1 100644 --- a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessor.java +++ b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessor.java @@ -27,80 +27,24 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -final class ElasticsearchBindingsPropertiesProcessor { +final class ElasticsearchBindingsPropertiesProcessor implements BindingsPropertiesProcessor { /** * The {@link Binding} type that this processor is interested in: {@value}. **/ public static final String TYPE = "elasticsearch"; - public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { - - private static final int BOOT_VERSION = 2; - - Boot2(int forcedVersion) { - super(forcedVersion); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; } - public Boot2() { - } - - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; - } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; - } - - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - map.from("endpoints").to("spring.data.elasticsearch.client.reactive.endpoints"); - map.from("password").to("spring.data.elasticsearch.client.reactive.password"); - map.from("use-ssl").to("spring.data.elasticsearch.client.reactive.use-ssl"); - map.from("username").to("spring.data.elasticsearch.client.reactive.username"); - map.from("password").to("spring.elasticsearch.jest.password"); - map.from("proxy.host").to("spring.elasticsearch.jest.proxy.host"); - map.from("proxy.port").to("spring.elasticsearch.jest.proxy.port"); - map.from("username").to("spring.elasticsearch.jest.username"); - map.from("password").to("spring.elasticsearch.rest.password"); - map.from("uris").to("spring.elasticsearch.rest.uris"); - map.from("username").to("spring.elasticsearch.rest.username"); - }); - } + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("password").to("spring.elasticsearch.password"); + map.from("uris").to("spring.elasticsearch.uris"); + map.from("username").to("spring.elasticsearch.username"); + }); } - - /** - * This is a special case for Boot 3. - */ - public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { - - private static final int BOOT_VERSION = 3; - - Boot3(int forcedVersion) { - super(forcedVersion); - } - - public Boot3() { - } - - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; - } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; - } - - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - map.from("password").to("spring.elasticsearch.password"); - map.from("uris").to("spring.elasticsearch.uris"); - map.from("username").to("spring.elasticsearch.username"); - }); - } - } - } diff --git a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessor.java index 2daffb1..3e27dc7 100644 --- a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessor.java +++ b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessor.java @@ -27,73 +27,25 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -final class Neo4JBindingsPropertiesProcessor { +final class Neo4JBindingsPropertiesProcessor implements BindingsPropertiesProcessor { /** * The {@link Binding} type that this processor is interested in: {@value}. **/ public static final String TYPE = "neo4j"; - public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { - - private static final int BOOT_VERSION = 2; - - Boot2(int forcedVersion) { - super(forcedVersion); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; } - public Boot2() { - } + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("password").to("spring.neo4j.authentication.password"); + map.from("uri").to("spring.neo4j.uri"); + map.from("username").to("spring.neo4j.authentication.username"); - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; - } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; - } - - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - map.from("password").to("spring.data.neo4j.password"); - map.from("uri").to("spring.data.neo4j.uri"); - map.from("username").to("spring.data.neo4j.username"); - - }); - } + }); } - - /** - * This is a special case for Boot 3. - */ - public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { - - private static final int BOOT_VERSION = 3; - - Boot3(int forcedVersion) { - super(forcedVersion); - } - - public Boot3() { - } - - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; - } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; - } - - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - map.from("password").to("spring.neo4j.authentication.password"); - map.from("uri").to("spring.neo4j.uri"); - map.from("username").to("spring.neo4j.authentication.username"); - - }); - } - } - } + diff --git a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessor.java index 1d54e1a..cb586d9 100644 --- a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessor.java +++ b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessor.java @@ -27,93 +27,34 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -public final class RedisBindingsPropertiesProcessor { +public final class RedisBindingsPropertiesProcessor implements BindingsPropertiesProcessor { /** * The {@link Binding} type that this processor is interested in: {@value}. **/ public static final String TYPE = "redis"; - /** - * This is a special case for Boot 2. - */ - public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { - - private static final int BOOT_VERSION = 2; - - Boot2(int forcedVersion) { - super(forcedVersion); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; } - public Boot2() { - } + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; - } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; - } - - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - - map.from("client-name").to("spring.redis.client-name"); - map.from("cluster.max-redirects").to("spring.redis.cluster.max-redirects"); - map.from("cluster.nodes").to("spring.redis.cluster.nodes"); - map.from("database").to("spring.redis.database"); - map.from("host").to("spring.redis.host"); - map.from("password").to("spring.redis.password"); - map.from("port").to("spring.redis.port"); - map.from("sentinel.master").to("spring.redis.sentinel.master"); - map.from("sentinel.nodes").to("spring.redis.sentinel.nodes"); - map.from("ssl").to("spring.redis.ssl"); - map.from("url").to("spring.redis.url"); - }); - } - } - - /** - * This is a special case for Boot 3. - */ - public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor { - - private static final int BOOT_VERSION = 3; - - Boot3(int forcedVersion) { - super(forcedVersion); - } - - public Boot3() { - } - - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; - } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; - } - - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - - map.from("client-name").to("spring.data.redis.client-name"); - map.from("cluster.max-redirects").to("spring.data.redis.cluster.max-redirects"); - map.from("cluster.nodes").to("spring.data.redis.cluster.nodes"); - map.from("database").to("spring.data.redis.database"); - map.from("host").to("spring.data.redis.host"); - map.from("password").to("spring.data.redis.password"); - map.from("port").to("spring.data.redis.port"); - map.from("sentinel.master").to("spring.data.redis.sentinel.master"); - map.from("sentinel.nodes").to("spring.data.redis.sentinel.nodes"); - map.from("ssl").to("spring.data.redis.ssl"); - map.from("url").to("spring.data.redis.url"); - }); - } + map.from("client-name").to("spring.data.redis.client-name"); + map.from("cluster.max-redirects").to("spring.data.redis.cluster.max-redirects"); + map.from("cluster.nodes").to("spring.data.redis.cluster.nodes"); + map.from("database").to("spring.data.redis.database"); + map.from("host").to("spring.data.redis.host"); + map.from("password").to("spring.data.redis.password"); + map.from("port").to("spring.data.redis.port"); + map.from("sentinel.master").to("spring.data.redis.sentinel.master"); + map.from("sentinel.nodes").to("spring.data.redis.sentinel.nodes"); + map.from("ssl").to("spring.data.redis.ssl"); + map.from("url").to("spring.data.redis.url"); + }); } } diff --git a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java deleted file mode 100644 index 0a29284..0000000 --- a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolver.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.springframework.cloud.bindings.boot; - -import org.springframework.boot.SpringBootVersion; - -/** - * This class is used to allow, in unit tests for example, - * to fake the resolution of which major version of spring boot is used - */ -class SpringBootVersionResolver { - - private int forcedVersion = -1; - - SpringBootVersionResolver() { - } - - protected SpringBootVersionResolver(int forcedVersion) { - this.forcedVersion = forcedVersion; - } - - protected boolean isBootMajorVersionEnabled(int bootVersion) { - if (forcedVersion != -1) { - return forcedVersion == bootVersion; - } - int major = Integer.parseInt(SpringBootVersion.getVersion().split("\\.")[0]); - return major == bootVersion; - } -} diff --git a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessor.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessor.java index 4a116c5..2ea0e6d 100644 --- a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessor.java +++ b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessor.java @@ -30,8 +30,7 @@ import static org.springframework.cloud.bindings.boot.Guards.isTypeEnabled; /** * An implementation of {@link BindingsPropertiesProcessor} that detects {@link Binding}s of type: {@value TYPE}. */ -public final class VaultBindingsPropertiesProcessor { - +public final class VaultBindingsPropertiesProcessor implements BindingsPropertiesProcessor, ApplicationListener { /** * The {@link Binding} type that this processor is interested in: {@value}. **/ @@ -39,190 +38,90 @@ public final class VaultBindingsPropertiesProcessor { private static final DeferredLog LOG = new DeferredLog(); - public final static class Boot2 extends SpringBootVersionResolver implements BindingsPropertiesProcessor, ApplicationListener { - - private static final int BOOT_VERSION = 2; - - Boot2(int forcedVersion) { - super(forcedVersion); + @Override + public void process(Environment environment, Bindings bindings, Map properties) { + if (!isTypeEnabled(environment, TYPE)) { + return; } - public Boot2() { - } + bindings.filterBindings(TYPE).forEach(binding -> { + MapMapper map = new MapMapper(binding.getSecret(), properties); + map.from("uri").to("spring.cloud.vault.uri"); + map.from("namespace").to("spring.cloud.vault.namespace"); // vault enterprise feature - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { + String authenticationMethod = binding.getSecret().get("authentication-method"); + if (authenticationMethod == null) { + LOG.warn(String.format("Key 'method' is missing from secret of binding '%s'", binding.getName())); return; } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; + properties.put("spring.cloud.vault.authentication", authenticationMethod); + switch (authenticationMethod.toUpperCase()) { + case "TOKEN": + case "CUBBYHOLE": + map.from("token").to("spring.cloud.vault.token"); + break; + case "APPROLE": + map.from("role-id").to("spring.cloud.vault.app-role.role-id"); + map.from("secret-id").to("spring.cloud.vault.app-role.secret-id"); + map.from("role").to("spring.cloud.vault.app-role.role"); + map.from("app-role-path").to("spring.cloud.vault.app-role.app-role-path"); + break; + case "AWS_EC2": + map.from("role").to("spring.cloud.vault.aws-ec2.role"); + map.from("aws-ec2-path").to("spring.cloud.vault.aws-ec2.aws-ec2-path"); + map.from("aws-ec2-instance-identity-document").to("spring.cloud.vault.aws-ec2.identity-document"); + map.from("nonce").to("spring.cloud.vault.aws-ec2.nonce"); + break; + case "GCP_GCE": + map.from("role").to("spring.cloud.vault.gcp-gce.role"); + map.from("gcp-path").to("spring.cloud.vault.gcp-gce.gcp-path"); + map.from("gcp-service-account").to("spring.cloud.vault.gcp-gce.service-account"); + break; + case "AWS_IAM": + map.from("role").to("spring.cloud.vault.aws-iam.role"); + map.from("aws-path").to("spring.cloud.vault.aws-iam.aws-path"); + map.from("aws-sts-endpoint-uri").to("spring.cloud.vault.aws-iam.endpoint-uri"); + map.from("aws-iam-server-name").to("spring.cloud.vault.aws-iam.server-name"); + break; + case "AZURE_MSI": + map.from("role").to("spring.cloud.vault.azure-msi.role"); + map.from("azure-path").to("spring.cloud.vault.azure-msi.azure-path"); + map.from("metadata-service").to("spring.cloud.vault.azure-msi.metadata-service"); + map.from("identity-token-service").to("spring.cloud.vault.azure-msi.identity-token-service"); + break; + case "CERT": + properties.put("spring.cloud.vault.ssl.key-store", binding.getSecretFilePath("keystore.jks").toString()); + map.from("key-store-password").to("spring.cloud.vault.ssl.key-store-password"); + map.from("cert-auth-path").to("spring.cloud.vault.ssl.cert-auth-path"); + properties.put("spring.cloud.vault.ssl.trust-store", binding.getSecretFilePath("truststore.jks").toString()); + map.from("trust-store").to("spring.cloud.vault.ssl.trust-store"); + map.from("trust-store-password").to("spring.cloud.vault.ssl.trust-store-password"); + break; + case "GCP_IAM": + if (binding.getSecret().containsKey("credentials.json")) { + properties.put("spring.cloud.vault.gcp-iam.credentials.location", binding.getSecretFilePath("credentials.json").toString()); + } + map.from("role").to("spring.cloud.vault.gcp-iam.role"); + map.from("encoded-key").to("spring.cloud.vault.gcp-iam.credentials.encoded-key"); + map.from("gcp-path").to("spring.cloud.vault.gcp-iam.gcp-path"); + map.from("jwt-validity").to("spring.cloud.vault.gcp-iam.jwt-validity"); + map.from("gcp-project-id").to("spring.cloud.vault.gcp-iam.project-id"); + map.from("gcp-service-account").to("spring.cloud.vault.gcp-iam.service-account-id"); + break; + case "KUBERNETES": + map.from("role").to("spring.cloud.vault.kubernetes.role"); + map.from("kubernetes-path").to("spring.cloud.vault.kubernetes.kubernetes-path"); + map.from("kubernetes-service-account-token-file").to("spring.cloud.vault.kubernetes.kubernetes-service-account-token-file"); + break; + default: + LOG.warn(String.format("Binding '%s' contains unrecognized 'method'", binding.getName())); } - - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - map.from("uri").to("spring.cloud.vault.uri"); - map.from("namespace").to("spring.cloud.vault.namespace"); // vault enterprise feature - - String authenticationMethod = binding.getSecret().get("authentication-method"); - if (authenticationMethod == null) { - LOG.warn(String.format("Key 'method' is missing from secret of binding '%s'", binding.getName())); - return; - } - properties.put("spring.cloud.vault.authentication", authenticationMethod); - switchCommonProperties(map, authenticationMethod); - switch (authenticationMethod.toUpperCase()) { - case "AWS_IAM": - map.from("role").to("spring.cloud.vault.aws-iam.role"); - map.from("aws-path").to("spring.cloud.vault.aws-iam.aws-path"); - map.from("aws-sts-endpoint-uri").to("spring.cloud.vault.aws-iam.endpoint-uri"); - map.from("aws-iam-server-id").to("spring.cloud.vault.aws-iam.server-id"); - break; - case "AZURE_MSI": - map.from("role").to("spring.cloud.vault.azure-msi.role"); - map.from("azure-path").to("spring.cloud.vault.azure-msi.azure-path"); - break; - case "CERT": - properties.put("spring.cloud.vault.ssl.key-store", binding.getSecretFilePath("keystore.jks").toString()); - map.from("key-store-password").to("spring.cloud.vault.ssl.key-store-password"); - map.from("cert-auth-path").to("spring.cloud.vault.ssl.cert-auth-path"); - break; - case "GCP_IAM": - if (binding.getSecret().containsKey("credentials.json")) { - properties.put("spring.cloud.vault.gcp-iam.credentials.location", binding.getSecretFilePath("credentials.json").toString()); - } - map.from("role").to("spring.cloud.vault.gcp-iam.role"); - map.from("encoded-key").to("spring.cloud.vault.gcp-iam.credentials.encoded-key"); - map.from("gcp-path").to("spring.cloud.vault.gcp-iam.gcp-path"); - map.from("jwt-validity").to("spring.cloud.vault.gcp-iam.jwt-validity"); - map.from("gcp-project-id").to("spring.cloud.vault.gcp-iam.project-id"); - map.from("gcp-service-account").to("spring.cloud.vault.gcp-iam.service-account"); - break; - case "KUBERNETES": - map.from("role").to("spring.cloud.vault.kubernetes.role"); - map.from("kubernetes-path").to("spring.cloud.vault.kubernetes.kubernetes-path"); - break; - default: - LOG.warn(String.format("Binding '%s' contains unrecognized 'method'", binding.getName())); - } - - }); - } - - @Override - public void onApplicationEvent(ApplicationPreparedEvent event) { - LOG.replayTo(getClass()); - } + }); } - /** - * This is a special case for Boot 3. - */ - public final static class Boot3 extends SpringBootVersionResolver implements BindingsPropertiesProcessor, ApplicationListener { - - private static final int BOOT_VERSION = 3; - - Boot3(int forcedVersion) { - super(forcedVersion); - } - - public Boot3() { - } - - @Override - public void process(Environment environment, Bindings bindings, Map properties) { - if (!isTypeEnabled(environment, TYPE)) { - return; - } - if (!isBootMajorVersionEnabled(BOOT_VERSION)) { - return; - } - - bindings.filterBindings(TYPE).forEach(binding -> { - MapMapper map = new MapMapper(binding.getSecret(), properties); - map.from("uri").to("spring.cloud.vault.uri"); - map.from("namespace").to("spring.cloud.vault.namespace"); // vault enterprise feature - - String authenticationMethod = binding.getSecret().get("authentication-method"); - if (authenticationMethod == null) { - LOG.warn(String.format("Key 'method' is missing from secret of binding '%s'", binding.getName())); - return; - } - properties.put("spring.cloud.vault.authentication", authenticationMethod); - switchCommonProperties(map, authenticationMethod); - switch (authenticationMethod.toUpperCase()) { - case "AWS_IAM": - map.from("role").to("spring.cloud.vault.aws-iam.role"); - map.from("aws-path").to("spring.cloud.vault.aws-iam.aws-path"); - map.from("aws-sts-endpoint-uri").to("spring.cloud.vault.aws-iam.endpoint-uri"); - map.from("aws-iam-server-name").to("spring.cloud.vault.aws-iam.server-name"); - break; - case "AZURE_MSI": - map.from("role").to("spring.cloud.vault.azure-msi.role"); - map.from("azure-path").to("spring.cloud.vault.azure-msi.azure-path"); - map.from("metadata-service").to("spring.cloud.vault.azure-msi.metadata-service"); - map.from("identity-token-service").to("spring.cloud.vault.azure-msi.identity-token-service"); - break; - case "CERT": - properties.put("spring.cloud.vault.ssl.key-store", binding.getSecretFilePath("keystore.jks").toString()); - map.from("key-store-password").to("spring.cloud.vault.ssl.key-store-password"); - map.from("cert-auth-path").to("spring.cloud.vault.ssl.cert-auth-path"); - properties.put("spring.cloud.vault.ssl.trust-store", binding.getSecretFilePath("truststore.jks").toString()); - map.from("trust-store").to("spring.cloud.vault.ssl.trust-store"); - map.from("trust-store-password").to("spring.cloud.vault.ssl.trust-store-password"); - break; - case "GCP_IAM": - if (binding.getSecret().containsKey("credentials.json")) { - properties.put("spring.cloud.vault.gcp-iam.credentials.location", binding.getSecretFilePath("credentials.json").toString()); - } - map.from("role").to("spring.cloud.vault.gcp-iam.role"); - map.from("encoded-key").to("spring.cloud.vault.gcp-iam.credentials.encoded-key"); - map.from("gcp-path").to("spring.cloud.vault.gcp-iam.gcp-path"); - map.from("jwt-validity").to("spring.cloud.vault.gcp-iam.jwt-validity"); - map.from("gcp-project-id").to("spring.cloud.vault.gcp-iam.project-id"); - map.from("gcp-service-account").to("spring.cloud.vault.gcp-iam.service-account-id"); - break; - case "KUBERNETES": - map.from("role").to("spring.cloud.vault.kubernetes.role"); - map.from("kubernetes-path").to("spring.cloud.vault.kubernetes.kubernetes-path"); - map.from("kubernetes-service-account-token-file").to("spring.cloud.vault.kubernetes.kubernetes-service-account-token-file"); - break; - default: - LOG.warn(String.format("Binding '%s' contains unrecognized 'method'", binding.getName())); - } - }); - } - - @Override - public void onApplicationEvent(ApplicationPreparedEvent event) { - LOG.replayTo(getClass()); - } - } - - private static void switchCommonProperties(MapMapper map, String authenticationMethod) { - switch (authenticationMethod.toUpperCase()) { - case "TOKEN": - case "CUBBYHOLE": - map.from("token").to("spring.cloud.vault.token"); - break; - case "APPROLE": - map.from("role-id").to("spring.cloud.vault.app-role.role-id"); - map.from("secret-id").to("spring.cloud.vault.app-role.secret-id"); - map.from("role").to("spring.cloud.vault.app-role.role"); - map.from("app-role-path").to("spring.cloud.vault.app-role.app-role-path"); - break; - case "AWS_EC2": - map.from("role").to("spring.cloud.vault.aws-ec2.role"); - map.from("aws-ec2-path").to("spring.cloud.vault.aws-ec2.aws-ec2-path"); - map.from("aws-ec2-instance-identity-document").to("spring.cloud.vault.aws-ec2.identity-document"); - map.from("nonce").to("spring.cloud.vault.aws-ec2.nonce"); - break; - case "GCP_GCE": - map.from("role").to("spring.cloud.vault.gcp-gce.role"); - map.from("gcp-path").to("spring.cloud.vault.gcp-gce.gcp-path"); - map.from("gcp-service-account").to("spring.cloud.vault.gcp-gce.service-account"); - break; - } + @Override + public void onApplicationEvent(ApplicationPreparedEvent event) { + LOG.replayTo(getClass()); } } diff --git a/src/main/java/org/springframework/cloud/bindings/boot/pem/PemCertificateParser.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/pem/PemCertificateParser.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/pem/PemCertificateParser.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/pem/PemCertificateParser.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/pem/PemContent.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/pem/PemContent.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/pem/PemContent.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/pem/PemContent.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/pem/PemPrivateKeyParser.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/pem/PemPrivateKeyParser.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/pem/PemPrivateKeyParser.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/pem/PemPrivateKeyParser.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/pem/PemSslStoreHelper.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/pem/PemSslStoreHelper.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/pem/PemSslStoreHelper.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/pem/PemSslStoreHelper.java diff --git a/src/main/java/org/springframework/cloud/bindings/boot/pem/package-info.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/pem/package-info.java similarity index 100% rename from src/main/java/org/springframework/cloud/bindings/boot/pem/package-info.java rename to spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/pem/package-info.java diff --git a/spring-cloud-bindings/src/main/resources/META-INF/spring.factories b/spring-cloud-bindings/src/main/resources/META-INF/spring.factories index d3780d2..cde7fc3 100644 --- a/spring-cloud-bindings/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-bindings/src/main/resources/META-INF/spring.factories @@ -2,38 +2,30 @@ org.springframework.context.ApplicationListener=\ org.springframework.cloud.bindings.boot.BindingFlattenedEnvironmentPostProcessor, \ org.springframework.cloud.bindings.boot.BindingSpecificEnvironmentPostProcessor, \ org.springframework.cloud.bindings.boot.SpringSecurityOAuth2BindingsPropertiesProcessor, \ - org.springframework.cloud.bindings.boot.VaultBindingsPropertiesProcessor.Boot2, \ - org.springframework.cloud.bindings.boot.VaultBindingsPropertiesProcessor.Boot3 + org.springframework.cloud.bindings.boot.VaultBindingsPropertiesProcessor org.springframework.boot.env.EnvironmentPostProcessor=\ org.springframework.cloud.bindings.boot.BindingFlattenedEnvironmentPostProcessor, \ org.springframework.cloud.bindings.boot.BindingSpecificEnvironmentPostProcessor # Included implementations org.springframework.cloud.bindings.boot.BindingsPropertiesProcessor=\ - org.springframework.cloud.bindings.boot.ArtemisBindingsPropertiesProcessor.Boot2, \ - org.springframework.cloud.bindings.boot.ArtemisBindingsPropertiesProcessor.Boot3, \ - org.springframework.cloud.bindings.boot.CassandraBindingsPropertiesProcessor.Boot2, \ - org.springframework.cloud.bindings.boot.CassandraBindingsPropertiesProcessor.Boot3, \ + org.springframework.cloud.bindings.boot.ArtemisBindingsPropertiesProcessor, \ + org.springframework.cloud.bindings.boot.CassandraBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.ConfigServerBindingsPropertiesProcessor, \ - org.springframework.cloud.bindings.boot.CouchbaseBindingsPropertiesProcessor.Boot2, \ - org.springframework.cloud.bindings.boot.CouchbaseBindingsPropertiesProcessor.Boot3, \ + org.springframework.cloud.bindings.boot.CouchbaseBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.Db2BindingsPropertiesProcessor, \ - org.springframework.cloud.bindings.boot.ElasticsearchBindingsPropertiesProcessor.Boot2, \ - org.springframework.cloud.bindings.boot.ElasticsearchBindingsPropertiesProcessor.Boot3, \ + org.springframework.cloud.bindings.boot.ElasticsearchBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.EurekaBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.KafkaBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.LDAPBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.MongoDbBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.MySqlBindingsPropertiesProcessor, \ - org.springframework.cloud.bindings.boot.Neo4JBindingsPropertiesProcessor.Boot2, \ - org.springframework.cloud.bindings.boot.Neo4JBindingsPropertiesProcessor.Boot3, \ + org.springframework.cloud.bindings.boot.Neo4JBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.OracleBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.PostgreSqlBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.RabbitMqBindingsPropertiesProcessor, \ - org.springframework.cloud.bindings.boot.RedisBindingsPropertiesProcessor.Boot2, \ - org.springframework.cloud.bindings.boot.RedisBindingsPropertiesProcessor.Boot3, \ + org.springframework.cloud.bindings.boot.RedisBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.SapHanaBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.SpringSecurityOAuth2BindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.SqlServerBindingsPropertiesProcessor, \ - org.springframework.cloud.bindings.boot.VaultBindingsPropertiesProcessor.Boot2, \ - org.springframework.cloud.bindings.boot.VaultBindingsPropertiesProcessor.Boot3, \ + org.springframework.cloud.bindings.boot.VaultBindingsPropertiesProcessor, \ org.springframework.cloud.bindings.boot.WavefrontBindingsPropertiesProcessor diff --git a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessorTest.java index b6a44cf..78ad63b 100644 --- a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessorTest.java +++ b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ArtemisBindingsPropertiesProcessorTest.java @@ -32,18 +32,6 @@ import static org.springframework.cloud.bindings.boot.ArtemisBindingsPropertiesP @DisplayName("ActiveMQ Artemis BindingsPropertiesProcessor") final class ArtemisBindingsPropertiesProcessorTest { - private final Bindings bindingsSpringBoot2 = new Bindings( - new Binding("test-name", Paths.get("test-path"), - new FluentMap() - .withEntry(Binding.TYPE, TYPE) - .withEntry("mode", "EMBEDDED") - .withEntry("host", "test-host") - .withEntry("port", "test-port") - .withEntry("user", "test-user") - .withEntry("password", "test-password") - ) - ); - private final Bindings bindingsSpringBoot3 = new Bindings( new Binding("test-name", Paths.get("test-path"), new FluentMap() @@ -60,21 +48,9 @@ final class ArtemisBindingsPropertiesProcessorTest { private final HashMap properties = new HashMap<>(); @Test - @DisplayName("contributes properties - Spring Boot 2 flavor") - void testSb2() { - new ArtemisBindingsPropertiesProcessor.Boot2(2).process(environment, bindingsSpringBoot2, properties); - assertThat(properties) - .containsEntry("spring.artemis.mode", "EMBEDDED") - .containsEntry("spring.artemis.host", "test-host") - .containsEntry("spring.artemis.password", "test-password") - .containsEntry("spring.artemis.port", "test-port") - .containsEntry("spring.artemis.user", "test-user"); - } - - @Test - @DisplayName("contributes properties - Spring Boot 3 flavor") + @DisplayName("contributes properties") void testSb3() { - new ArtemisBindingsPropertiesProcessor.Boot3(3).process(environment, bindingsSpringBoot3, properties); + new ArtemisBindingsPropertiesProcessor().process(environment, bindingsSpringBoot3, properties); assertThat(properties) .containsEntry("spring.artemis.mode", "EMBEDDED") .containsEntry("spring.artemis.broker-url", "tcp://test-host:test-port") @@ -87,10 +63,7 @@ final class ArtemisBindingsPropertiesProcessorTest { void disabled() { environment.setProperty("org.springframework.cloud.bindings.boot.artemis.enable", "false"); - new ArtemisBindingsPropertiesProcessor.Boot2(2).process(environment, bindingsSpringBoot2, properties); - assertThat(properties).isEmpty(); - - new ArtemisBindingsPropertiesProcessor.Boot3(3).process(environment, bindingsSpringBoot2, properties); + new ArtemisBindingsPropertiesProcessor().process(environment, bindingsSpringBoot3, properties); assertThat(properties).isEmpty(); } diff --git a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessorTest.java index 416892f..85a7d7b 100644 --- a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessorTest.java +++ b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/BindingSpecificEnvironmentPostProcessorTest.java @@ -104,7 +104,7 @@ final class BindingSpecificEnvironmentPostProcessorTest { @Test @DisplayName("included implementations are registered") void includedImplementations() { - assertThat(new BindingSpecificEnvironmentPostProcessor().processors).hasSize(28); + assertThat(new BindingSpecificEnvironmentPostProcessor().processors).hasSize(21); } } diff --git a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessorTest.java index d17959b..c64b4ba 100644 --- a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessorTest.java +++ b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/CassandraBindingsPropertiesProcessorTest.java @@ -56,28 +56,9 @@ final class CassandraBindingsPropertiesProcessorTest { private final HashMap properties = new HashMap<>(); @Test - @DisplayName("contributes properties - Spring Boot 2 flavor") - void testSb2() { - new CassandraBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); - assertThat(properties) - .containsEntry("spring.data.cassandra.cluster-name", "test-cluster-name") - .containsEntry("spring.data.cassandra.compression", "test-compression") - .containsEntry("spring.data.cassandra.contact-points", "test-contact-points") - .containsEntry("spring.data.cassandra.keyspace-name", "test-keyspace-name") - .containsEntry("spring.data.cassandra.password", "test-password") - .containsEntry("spring.data.cassandra.port", "test-port") - .containsEntry("spring.data.cassandra.ssl", "test-ssl") - .containsEntry("spring.data.cassandra.username", "test-username") - .containsEntry("spring.data.cassandra.request.throttler.drain-interval", "test-drain-interval") - .containsEntry("spring.data.cassandra.request.throttler.max-concurrent-requests", "test-max-concurrent-requests") - .containsEntry("spring.data.cassandra.request.throttler.max-queue-size", "test-max-queue-size") - .containsEntry("spring.data.cassandra.request.throttler.max-requests-per-second", "test-max-requests-per-second"); - } - - @Test - @DisplayName("contributes properties - Spring Boot 3 flavor") + @DisplayName("contributes properties") void testSb3() { - new CassandraBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + new CassandraBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cassandra.cluster-name", "test-cluster-name") .containsEntry("spring.cassandra.compression", "test-compression") @@ -98,10 +79,7 @@ final class CassandraBindingsPropertiesProcessorTest { void disabled() { environment.setProperty("org.springframework.cloud.bindings.boot.cassandra.enable", "false"); - new CassandraBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); - assertThat(properties).isEmpty(); - - new CassandraBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + new CassandraBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties).isEmpty(); } diff --git a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessorTest.java index f79de94..7fde0f8 100644 --- a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessorTest.java +++ b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/CouchbaseBindingsPropertiesProcessorTest.java @@ -32,20 +32,6 @@ import static org.springframework.cloud.bindings.boot.CouchbaseBindingsPropertie @DisplayName("Couchbase BindingsPropertiesProcessor") final class CouchbaseBindingsPropertiesProcessorTest { - private final Bindings bindingsSpringBoot2 = new Bindings( - new Binding("test-name", Paths.get("test-path"), - new FluentMap() - .withEntry(Binding.TYPE, TYPE) - .withEntry("bootstrap-hosts", "test-bootstrap-hosts") - .withEntry("bucket.name", "test-bucket-name") - .withEntry("bucket.password", "test-bucket-password") - .withEntry("env.bootstrap.http-direct-port", "test-env-bootstrap-http-direct-port") - .withEntry("env.bootstrap.http-ssl-port", "test-env-bootstrap-http-ssl-port") - .withEntry("password", "test-password") - .withEntry("username", "test-username") - ) - ); - private final Bindings bindingsSpringBoot3 = new Bindings( new Binding("test-name", Paths.get("test-path"), new FluentMap() @@ -62,23 +48,9 @@ final class CouchbaseBindingsPropertiesProcessorTest { private final HashMap properties = new HashMap<>(); @Test - @DisplayName("contributes properties - Spring Boot 2 flavor") - void testSb2() { - new CouchbaseBindingsPropertiesProcessor.Boot2(2).process(environment, bindingsSpringBoot2, properties); - assertThat(properties) - .containsEntry("spring.couchbase.bootstrap-hosts", "test-bootstrap-hosts") - .containsEntry("spring.couchbase.bucket.name", "test-bucket-name") - .containsEntry("spring.couchbase.bucket.password", "test-bucket-password") - .containsEntry("spring.couchbase.env.bootstrap.http-direct-port", "test-env-bootstrap-http-direct-port") - .containsEntry("spring.couchbase.env.bootstrap.http-ssl-port", "test-env-bootstrap-http-ssl-port") - .containsEntry("spring.couchbase.password", "test-password") - .containsEntry("spring.couchbase.username", "test-username"); - } - - @Test - @DisplayName("contributes properties - Spring Boot 3 flavor") + @DisplayName("contributes properties") void testSb3() { - new CouchbaseBindingsPropertiesProcessor.Boot3(3).process(environment, bindingsSpringBoot3, properties); + new CouchbaseBindingsPropertiesProcessor().process(environment, bindingsSpringBoot3, properties); assertThat(properties) .containsEntry("spring.couchbase.connection-string", "test-connection-string") .containsEntry("spring.data.couchbase.bucket-name", "test-bucket-name") @@ -91,10 +63,7 @@ final class CouchbaseBindingsPropertiesProcessorTest { void disabled() { environment.setProperty("org.springframework.cloud.bindings.boot.couchbase.enable", "false"); - new CouchbaseBindingsPropertiesProcessor.Boot2(2).process(environment, bindingsSpringBoot2, properties); - assertThat(properties).isEmpty(); - - new CouchbaseBindingsPropertiesProcessor.Boot3(3).process(environment, bindingsSpringBoot3, properties); + new CouchbaseBindingsPropertiesProcessor().process(environment, bindingsSpringBoot3, properties); assertThat(properties).isEmpty(); } diff --git a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessorTest.java index e7ef72f..24ac8c0 100644 --- a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessorTest.java +++ b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/ElasticsearchBindingsPropertiesProcessorTest.java @@ -32,20 +32,6 @@ import static org.springframework.cloud.bindings.boot.ElasticsearchBindingsPrope @DisplayName("Elasticsearch BindingsPropertiesProcessor") final class ElasticsearchBindingsPropertiesProcessorTest { - private final Bindings bindingsSpringBoot2 = new Bindings( - new Binding("test-name", Paths.get("test-path"), - new FluentMap() - .withEntry(Binding.TYPE, TYPE) - .withEntry("endpoints", "test-endpoints") - .withEntry("password", "test-password") - .withEntry("use-ssl", "test-use-ssl") - .withEntry("username", "test-username") - .withEntry("proxy.host", "test-proxy-host") - .withEntry("proxy.port", "test-proxy-port") - .withEntry("uris", "test-uris") - ) - ); - private final Bindings bindingsSpringBoot3 = new Bindings( new Binding("test-name", Paths.get("test-path"), new FluentMap() @@ -61,28 +47,10 @@ final class ElasticsearchBindingsPropertiesProcessorTest { private final HashMap properties = new HashMap<>(); - @Test - @DisplayName("contributes properties - Spring Boot 2 flavor") - void testSb2() { - new ElasticsearchBindingsPropertiesProcessor.Boot2(2).process(environment, bindingsSpringBoot2, properties); - assertThat(properties) - .containsEntry("spring.data.elasticsearch.client.reactive.endpoints", "test-endpoints") - .containsEntry("spring.data.elasticsearch.client.reactive.password", "test-password") - .containsEntry("spring.data.elasticsearch.client.reactive.use-ssl", "test-use-ssl") - .containsEntry("spring.data.elasticsearch.client.reactive.username", "test-username") - .containsEntry("spring.elasticsearch.jest.password", "test-password") - .containsEntry("spring.elasticsearch.jest.proxy.host", "test-proxy-host") - .containsEntry("spring.elasticsearch.jest.proxy.port", "test-proxy-port") - .containsEntry("spring.elasticsearch.jest.username", "test-username") - .containsEntry("spring.elasticsearch.rest.password", "test-password") - .containsEntry("spring.elasticsearch.rest.uris", "test-uris") - .containsEntry("spring.elasticsearch.rest.username", "test-username"); - } - @Test @DisplayName("contributes properties - Spring Boot 2 flavor") void testSb3() { - new ElasticsearchBindingsPropertiesProcessor.Boot3(3).process(environment, bindingsSpringBoot3, properties); + new ElasticsearchBindingsPropertiesProcessor().process(environment, bindingsSpringBoot3, properties); assertThat(properties) .containsEntry("spring.elasticsearch.password", "test-password") .containsEntry("spring.elasticsearch.uris", "test-uris") @@ -94,10 +62,7 @@ final class ElasticsearchBindingsPropertiesProcessorTest { void disabled() { environment.setProperty("org.springframework.cloud.bindings.boot.elasticsearch.enable", "false"); - new ElasticsearchBindingsPropertiesProcessor.Boot2(2).process(environment, bindingsSpringBoot2, properties); - assertThat(properties).isEmpty(); - - new ElasticsearchBindingsPropertiesProcessor.Boot3(3).process(environment, bindingsSpringBoot3, properties); + new ElasticsearchBindingsPropertiesProcessor().process(environment, bindingsSpringBoot3, properties); assertThat(properties).isEmpty(); } diff --git a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessorTest.java index 3e42673..9eab145 100644 --- a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessorTest.java +++ b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/Neo4JBindingsPropertiesProcessorTest.java @@ -47,19 +47,9 @@ final class Neo4JBindingsPropertiesProcessorTest { private final HashMap properties = new HashMap<>(); @Test - @DisplayName("contributes properties - Spring Boot 2 flavor") - void testSb2() { - new Neo4JBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); - assertThat(properties) - .containsEntry("spring.data.neo4j.password", "test-password") - .containsEntry("spring.data.neo4j.uri", "test-uri") - .containsEntry("spring.data.neo4j.username", "test-username"); - } - - @Test - @DisplayName("contributes properties - Spring Boot 3 flavor") + @DisplayName("contributes properties") void testSb3() { - new Neo4JBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + new Neo4JBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.neo4j.authentication.password", "test-password") .containsEntry("spring.neo4j.uri", "test-uri") @@ -71,10 +61,7 @@ final class Neo4JBindingsPropertiesProcessorTest { void disabled() { environment.setProperty("org.springframework.cloud.bindings.boot.neo4j.enable", "false"); - new Neo4JBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); - assertThat(properties).isEmpty(); - - new Neo4JBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + new Neo4JBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties).isEmpty(); } diff --git a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessorTest.java index 769ba8b..d47833e 100644 --- a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessorTest.java +++ b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/RedisBindingsPropertiesProcessorTest.java @@ -55,27 +55,9 @@ final class RedisBindingsPropertiesProcessorTest { private final HashMap properties = new HashMap<>(); @Test - @DisplayName("contributes properties - Spring Boot 2 flavor") - void testSb2() { - new RedisBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); - assertThat(properties) - .containsEntry("spring.redis.client-name", "test-client-name") - .containsEntry("spring.redis.cluster.max-redirects", "test-cluster-max-redirects") - .containsEntry("spring.redis.cluster.nodes", "test-cluster-nodes") - .containsEntry("spring.redis.database", "test-database") - .containsEntry("spring.redis.host", "test-host") - .containsEntry("spring.redis.password", "test-password") - .containsEntry("spring.redis.port", "test-port") - .containsEntry("spring.redis.sentinel.master", "test-sentinel-master") - .containsEntry("spring.redis.sentinel.nodes", "test-sentinel-nodes") - .containsEntry("spring.redis.ssl", "test-ssl") - .containsEntry("spring.redis.url", "test-url"); - } - - @Test - @DisplayName("contributes properties - Spring Boot 3 flavor") + @DisplayName("contributes properties") void testSb3() { - new RedisBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + new RedisBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.data.redis.client-name", "test-client-name") @@ -96,12 +78,8 @@ final class RedisBindingsPropertiesProcessorTest { void disabled() { environment.setProperty("org.springframework.cloud.bindings.boot.redis.enable", "false"); - new RedisBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); + new RedisBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties).isEmpty(); - - new RedisBindingsPropertiesProcessor.Boot2(3).process(environment, bindings, properties); - assertThat(properties).isEmpty(); - } } diff --git a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolverTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolverTest.java deleted file mode 100644 index e76c275..0000000 --- a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/SpringBootVersionResolverTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.springframework.cloud.bindings.boot; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -class SpringBootVersionResolverTest { - - @Test - @DisplayName("Should return Spring Boot 2 as Major Version since it's the provided runtime") - void isBootMajorVersionEnabled() { - SpringBootVersionResolver springBootVersionResolver = new SpringBootVersionResolver(); - assertTrue(springBootVersionResolver.isBootMajorVersionEnabled(2)); - assertFalse(springBootVersionResolver.isBootMajorVersionEnabled(3)); - } - - @Test - @DisplayName("Should return the forced version 2") - void isBootMajorVersionEnabled_forced_version2() { - SpringBootVersionResolver springBootVersionResolver = new SpringBootVersionResolver(2); - assertTrue(springBootVersionResolver.isBootMajorVersionEnabled(2)); - assertFalse(springBootVersionResolver.isBootMajorVersionEnabled(3)); - } - - @Test - @DisplayName("Should return the forced version 3") - void isBootMajorVersionEnabled_forced_version3() { - SpringBootVersionResolver springBootVersionResolver = new SpringBootVersionResolver(3); - assertFalse(springBootVersionResolver.isBootMajorVersionEnabled(2)); - assertTrue(springBootVersionResolver.isBootMajorVersionEnabled(3)); - } -} \ No newline at end of file diff --git a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessorTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessorTest.java index fd243f9..e8ea374 100644 --- a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessorTest.java +++ b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/VaultBindingsPropertiesProcessorTest.java @@ -47,12 +47,6 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); - assertThat(properties) - .containsEntry("spring.cloud.vault.uri", "test-uri") - .containsEntry("spring.cloud.vault.namespace", "test-namespace") - .containsEntry("spring.cloud.vault.authentication", "token") - .containsEntry("spring.cloud.vault.token", "test-token"); } @Test @@ -69,7 +63,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -91,7 +85,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -114,16 +108,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); - assertThat(properties) - .containsEntry("spring.cloud.vault.uri", "test-uri") - .containsEntry("spring.cloud.vault.namespace", "test-namespace") - .containsEntry("spring.cloud.vault.authentication", "cert") - .containsEntry("spring.cloud.vault.ssl.key-store", "test-path/keystore.jks") - .containsEntry("spring.cloud.vault.ssl.key-store-password", "test-key-store-password") - .containsEntry("spring.cloud.vault.ssl.cert-auth-path", "test-cert-auth-path"); - - new VaultBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -149,15 +134,6 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); - assertThat(properties) - .containsEntry("spring.cloud.vault.uri", "test-uri") - .containsEntry("spring.cloud.vault.namespace", "test-namespace") - .containsEntry("spring.cloud.vault.authentication", "aws_ec2") - .containsEntry("spring.cloud.vault.aws-ec2.role", "test-role") - .containsEntry("spring.cloud.vault.aws-ec2.aws-ec2-path", "test-aws-ec2-path") - .containsEntry("spring.cloud.vault.aws-ec2.identity-document", "test-identity-document") - .containsEntry("spring.cloud.vault.aws-ec2.nonce", "test-nonce"); } @Test @@ -175,17 +151,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); - assertThat(properties) - .containsEntry("spring.cloud.vault.uri", "test-uri") - .containsEntry("spring.cloud.vault.namespace", "test-namespace") - .containsEntry("spring.cloud.vault.authentication", "aws_iam") - .containsEntry("spring.cloud.vault.aws-iam.role", "test-role") - .containsEntry("spring.cloud.vault.aws-iam.aws-path", "test-aws-path") - .containsEntry("spring.cloud.vault.aws-iam.server-id", "test-server-id") - .containsEntry("spring.cloud.vault.aws-iam.endpoint-uri", "test-endpoint-uri"); - - new VaultBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -210,15 +176,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); - assertThat(properties) - .containsEntry("spring.cloud.vault.uri", "test-uri") - .containsEntry("spring.cloud.vault.namespace", "test-namespace") - .containsEntry("spring.cloud.vault.authentication", "azure_msi") - .containsEntry("spring.cloud.vault.azure-msi.role", "test-role") - .containsEntry("spring.cloud.vault.azure-msi.azure-path", "test-azure-path"); - - new VaultBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -242,14 +200,6 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); - assertThat(properties) - .containsEntry("spring.cloud.vault.uri", "test-uri") - .containsEntry("spring.cloud.vault.namespace", "test-namespace") - .containsEntry("spring.cloud.vault.authentication", "gcp_gce") - .containsEntry("spring.cloud.vault.gcp-gce.role", "test-role") - .containsEntry("spring.cloud.vault.gcp-gce.gcp-path", "test-gcp-path") - .containsEntry("spring.cloud.vault.gcp-gce.service-account", "test-service-account"); } @Test @@ -269,20 +219,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); - assertThat(properties) - .containsEntry("spring.cloud.vault.uri", "test-uri") - .containsEntry("spring.cloud.vault.namespace", "test-namespace") - .containsEntry("spring.cloud.vault.authentication", "gcp_iam") - .containsEntry("spring.cloud.vault.gcp-iam.role", "test-role") - .containsEntry("spring.cloud.vault.gcp-iam.credentials.location", "test-path/credentials.json") - .containsEntry("spring.cloud.vault.gcp-iam.credentials.encoded-key", "test-encoded-key") - .containsEntry("spring.cloud.vault.gcp-iam.gcp-path", "test-gcp-path") - .containsEntry("spring.cloud.vault.gcp-iam.jwt-validity", "test-jwt-validity") - .containsEntry("spring.cloud.vault.gcp-iam.project-id", "test-project-id") - .containsEntry("spring.cloud.vault.gcp-iam.service-account", "test-service-account"); - - new VaultBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -309,15 +246,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); - assertThat(properties) - .containsEntry("spring.cloud.vault.uri", "test-uri") - .containsEntry("spring.cloud.vault.namespace", "test-namespace") - .containsEntry("spring.cloud.vault.authentication", "kubernetes") - .containsEntry("spring.cloud.vault.kubernetes.role", "test-role") - .containsEntry("spring.cloud.vault.kubernetes.kubernetes-path", "test-kubernetes-path"); - - new VaultBindingsPropertiesProcessor.Boot3(3).process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -336,7 +265,7 @@ final class VaultBindingsPropertiesProcessorTest { ) ); - new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties) .containsEntry("spring.cloud.vault.uri", "test-uri") .containsEntry("spring.cloud.vault.namespace", "test-namespace") @@ -376,7 +305,7 @@ final class VaultBindingsPropertiesProcessorTest { environment.setProperty("org.springframework.cloud.bindings.boot.vault.enable", "false"); - new VaultBindingsPropertiesProcessor.Boot2(2).process(environment, bindings, properties); + new VaultBindingsPropertiesProcessor().process(environment, bindings, properties); assertThat(properties).isEmpty(); } diff --git a/src/test/resources/pem/test-banner.txt b/spring-cloud-bindings/src/test/resources/pem/test-banner.txt similarity index 100% rename from src/test/resources/pem/test-banner.txt rename to spring-cloud-bindings/src/test/resources/pem/test-banner.txt diff --git a/src/test/resources/pem/test-cert-chain.pem b/spring-cloud-bindings/src/test/resources/pem/test-cert-chain.pem similarity index 100% rename from src/test/resources/pem/test-cert-chain.pem rename to spring-cloud-bindings/src/test/resources/pem/test-cert-chain.pem diff --git a/src/test/resources/pem/test-cert.pem b/spring-cloud-bindings/src/test/resources/pem/test-cert.pem similarity index 100% rename from src/test/resources/pem/test-cert.pem rename to spring-cloud-bindings/src/test/resources/pem/test-cert.pem diff --git a/src/test/resources/pem/test-ec-key.pem b/spring-cloud-bindings/src/test/resources/pem/test-ec-key.pem similarity index 100% rename from src/test/resources/pem/test-ec-key.pem rename to spring-cloud-bindings/src/test/resources/pem/test-ec-key.pem diff --git a/src/test/resources/pem/test-key.pem b/spring-cloud-bindings/src/test/resources/pem/test-key.pem similarity index 100% rename from src/test/resources/pem/test-key.pem rename to spring-cloud-bindings/src/test/resources/pem/test-key.pem From 7e452047bf583ab4e125fe7fbcd338c0b3c2e5aa Mon Sep 17 00:00:00 2001 From: Anthony Dahanne Date: Wed, 14 Jun 2023 11:16:55 -0400 Subject: [PATCH 9/9] Activate by default in Spring Boot 3 * Users used to provide this property to enable this library: -Dorg.springframework.cloud.bindings.boot.enable=true ; with this new major version (2), we default to enable true --- spring-cloud-bindings-tests/README.md | 2 +- spring-cloud-bindings-tests/pom.xml | 1 - .../java/org/springframework/cloud/bindings/boot/Guards.java | 2 +- .../org/springframework/cloud/bindings/boot/GuardsTest.java | 4 ++-- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/spring-cloud-bindings-tests/README.md b/spring-cloud-bindings-tests/README.md index cabe47e..d52988b 100644 --- a/spring-cloud-bindings-tests/README.md +++ b/spring-cloud-bindings-tests/README.md @@ -13,4 +13,4 @@ In a Spring Boot 3 application, the mapping needs to be different because of cha This module runs an application, based on Spring Boot 3, and checks whether the `RedisConnectionFactory` properly picked up the `spring.data.redis.port` and `spring.data.redis.host` values. -Pay attention to the 2 environment variables set in the `pom.xml` that set the `JAVA_TOOL_OPTIONS` and `SERVICE_BINDING_ROOT` - they allow Spring Boot Bindings to load the proper configuration in `bindings/redis` \ No newline at end of file +Pay attention to the 2 environment variables set in the `pom.xml` that set `SERVICE_BINDING_ROOT` - they allow Spring Boot Bindings to load the proper configuration in `bindings/redis` \ No newline at end of file diff --git a/spring-cloud-bindings-tests/pom.xml b/spring-cloud-bindings-tests/pom.xml index 6be8093..315917e 100644 --- a/spring-cloud-bindings-tests/pom.xml +++ b/spring-cloud-bindings-tests/pom.xml @@ -64,7 +64,6 @@ 1 false - -Dorg.springframework.cloud.bindings.boot.enable=true ${basedir}/src/test/resources/bindings -Xmx1024m diff --git a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Guards.java b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Guards.java index 6316a35..f7c858b 100644 --- a/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Guards.java +++ b/spring-cloud-bindings/src/main/java/org/springframework/cloud/bindings/boot/Guards.java @@ -21,7 +21,7 @@ import org.springframework.core.env.Environment; final class Guards { static boolean isGlobalEnabled(Environment environment) { - return environment.getProperty("org.springframework.cloud.bindings.boot.enable", Boolean.class, false); + return environment.getProperty("org.springframework.cloud.bindings.boot.enable", Boolean.class, true); } static boolean isTypeEnabled(Environment environment, String type) { diff --git a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/GuardsTest.java b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/GuardsTest.java index 33271a7..f221962 100644 --- a/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/GuardsTest.java +++ b/spring-cloud-bindings/src/test/java/org/springframework/cloud/bindings/boot/GuardsTest.java @@ -35,9 +35,9 @@ final class GuardsTest { private final MockEnvironment environment = new MockEnvironment(); @Test - @DisplayName("returns false if unset") + @DisplayName("returns true if unset") void unset() { - assertThat(isGlobalEnabled(environment)).isFalse(); + assertThat(isGlobalEnabled(environment)).isTrue(); } @Test