From c1a7d5ff053856b039d142c8a5c9271618ae007c Mon Sep 17 00:00:00 2001 From: bono007 Date: Fri, 26 Feb 2021 22:55:30 -0600 Subject: [PATCH 1/4] Add configuration properties for Flyway Vault and Conjur support Fixes gh-24969 --- .../flyway/FlywayAutoConfiguration.java | 10 ++ .../flyway/FlywayProperties.java | 68 ++++++++ .../flyway/FlywayAutoConfigurationTests.java | 146 +++++++----------- .../flyway/FlywayPropertiesTests.java | 3 +- 4 files changed, 139 insertions(+), 88 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java index fd851026ac3b..6d370abbb66a 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java @@ -91,6 +91,7 @@ * @author Dan Zheng * @author András Deák * @author Semyon Danilov + * @author Chris Bono * @since 1.1.0 */ @Configuration(proxyBeanMethods = false) @@ -245,6 +246,15 @@ private void configureProperties(FluentConfiguration configuration, FlywayProper // No method reference for compatibility with Flyway 6.x map.from(properties.getSkipExecutingMigrations()).whenNonNull() .to((skipExecutingMigrations) -> configuration.skipExecutingMigrations(skipExecutingMigrations)); + // Teams secrets management properties (all non-method reference for + // compatibility with Flyway 6.x) + map.from(properties.getConjurUrl()).whenNonNull().to((conjurUrl) -> configuration.conjurUrl(conjurUrl)); + map.from(properties.getConjurToken()).whenNonNull() + .to((conjurToken) -> configuration.conjurToken(conjurToken)); + map.from(properties.getVaultUrl()).whenNonNull().to((vaultUrl) -> configuration.vaultUrl(vaultUrl)); + map.from(properties.getVaultToken()).whenNonNull().to((vaultToken) -> configuration.vaultToken(vaultToken)); + map.from(properties.getVaultSecrets()).whenNonNull() + .to((vaultSecrets) -> configuration.vaultSecrets(vaultSecrets)); } private void configureCreateSchemas(FluentConfiguration configuration, boolean createSchemas) { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java index 142a45957617..70ef570ad44f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java @@ -33,6 +33,7 @@ * @author Dave Syer * @author Eddú Meléndez * @author Stephane Nicoll + * @author Chris Bono * @since 1.1.0 */ @ConfigurationProperties(prefix = "spring.flyway") @@ -328,6 +329,33 @@ public class FlywayProperties { */ private Boolean skipExecutingMigrations; + /** + * The REST API URL of the Conjur server. Requires Flyway teams. + */ + private String conjurUrl; + + /** + * The Conjur token required to access secrets. Requires Flyway teams. + */ + private String conjurToken; + + /** + * The REST API URL of the Vault server. Requires Flyway teams. + */ + private String vaultUrl; + + /** + * The Vault token required to access secrets. Requires Flyway teams. + */ + private String vaultToken; + + /** + * A comma-separated list of paths to secrets that contain Flyway configurations. Each + * path must start with the name of the engine and end with the name of the secret + * such 'kv/test/1/config'. Requires Flyway teams. + */ + private String vaultSecrets; + public boolean isEnabled() { return this.enabled; } @@ -772,4 +800,44 @@ public void setSkipExecutingMigrations(Boolean skipExecutingMigrations) { this.skipExecutingMigrations = skipExecutingMigrations; } + public String getConjurUrl() { + return conjurUrl; + } + + public void setConjurUrl(String conjurUrl) { + this.conjurUrl = conjurUrl; + } + + public String getConjurToken() { + return conjurToken; + } + + public void setConjurToken(String conjurToken) { + this.conjurToken = conjurToken; + } + + public String getVaultUrl() { + return vaultUrl; + } + + public void setVaultUrl(String vaultUrl) { + this.vaultUrl = vaultUrl; + } + + public String getVaultToken() { + return vaultToken; + } + + public void setVaultToken(String vaultToken) { + this.vaultToken = vaultToken; + } + + public String getVaultSecrets() { + return vaultSecrets; + } + + public void setVaultSecrets(String vaultSecrets) { + this.vaultSecrets = vaultSecrets; + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java index 9e60ef80bf82..2284953c9b7d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java @@ -82,6 +82,7 @@ * @author Dominic Gunn * @author András Deák * @author Takaaki Shimbo + * @author Chris Bono */ @ExtendWith(OutputCaptureExtension.class) class FlywayAutoConfigurationTests { @@ -412,35 +413,19 @@ void configurationCustomizersAreConfiguredAndOrdered() { @Test void batchIsCorrectlyMapped() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.batch=true").run((context) -> { - assertThat(context).hasFailed(); - Throwable failure = context.getStartupFailure(); - assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(" batch "); - }); + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.batch=true", "batch"); } @Test void dryRunOutputIsCorrectlyMapped() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.dryRunOutput=dryrun.sql").run((context) -> { - assertThat(context).hasFailed(); - Throwable failure = context.getStartupFailure(); - assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(" dryRunOutput "); - }); + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.dryRunOutput=dryrun.sql", + "dryRunOutput"); } @Test void errorOverridesIsCorrectlyMapped() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.errorOverrides=D12345").run((context) -> { - assertThat(context).hasFailed(); - Throwable failure = context.getStartupFailure(); - assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(" errorOverrides "); - }); + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.errorOverrides=D12345", + "errorOverrides"); } @Test @@ -452,46 +437,25 @@ void licenseKeyIsCorrectlyMapped(CapturedOutput output) { @Test void oracleSqlplusIsCorrectlyMapped() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.oracle-sqlplus=true").run((context) -> { - assertThat(context).hasFailed(); - Throwable failure = context.getStartupFailure(); - assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(" oracle.sqlplus "); - }); + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.oracle-sqlplus=true", + "oracle.sqlplus"); } @Test void oracleSqlplusWarnIsCorrectlyMapped() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.oracle-sqlplus-warn=true").run((context) -> { - assertThat(context).hasFailed(); - Throwable failure = context.getStartupFailure(); - assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(" oracle.sqlplusWarn "); - }); + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.oracle-sqlplus-warn=true", + "oracle.sqlplusWarn"); } @Test void streamIsCorrectlyMapped() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.stream=true").run((context) -> { - assertThat(context).hasFailed(); - Throwable failure = context.getStartupFailure(); - assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(" stream "); - }); + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.stream=true", "stream"); } @Test void undoSqlMigrationPrefix() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.undo-sql-migration-prefix=undo").run((context) -> { - assertThat(context).hasFailed(); - Throwable failure = context.getStartupFailure(); - assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(" undoSqlMigrationPrefix "); - }); + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.undo-sql-migration-prefix=undo", + "undoSqlMigrationPrefix"); } @Test @@ -525,67 +489,77 @@ void initSqlsWithFlywayUrl() { @Test void cherryPickIsCorrectlyMapped() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.cherry-pick=1.1").run((context) -> { - assertThat(context).hasFailed(); - Throwable failure = context.getStartupFailure(); - assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(" cherryPick "); - }); + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.cherry-pick=1.1", "cherryPick"); } @Test void jdbcPropertiesAreCorrectlyMapped() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.jdbc-properties.prop=value").run((context) -> { - assertThat(context).hasFailed(); - Throwable failure = context.getStartupFailure(); - assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(" jdbcProperties "); - }); + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.jdbc-properties.prop=value", + "jdbcProperties"); } @Test void oracleKerberosCacheFileIsCorrectlyMapped() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.oracle-kerberos-cache-file=/tmp/cache").run((context) -> { - assertThat(context).hasFailed(); - Throwable failure = context.getStartupFailure(); - assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(" oracle.kerberosCacheFile "); - }); + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException( + "spring.flyway.oracle-kerberos-cache-file=/tmp/cache", "oracle.kerberosCacheFile"); } @Test void oracleKerberosConfigFileIsCorrectlyMapped() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.oracle-kerberos-config-file=/tmp/config").run((context) -> { - assertThat(context).hasFailed(); - Throwable failure = context.getStartupFailure(); - assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(" oracle.kerberosConfigFile "); - }); + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException( + "spring.flyway.oracle-kerberos-config-file=/tmp/config", "oracle.kerberosConfigFile"); } @Test void outputQueryResultsIsCorrectlyMapped() { - this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.output-query-results=false").run((context) -> { - assertThat(context).hasFailed(); - Throwable failure = context.getStartupFailure(); - assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(" outputQueryResults "); - }); + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.output-query-results=false", + "outputQueryResults"); } @Test void skipExecutingMigrationsIsCorrectlyMapped() { + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.skip-executing-migrations=true", + "skipExecutingMigrations"); + } + + @Test + void conjurUrlIsCorrectlyMapped() { + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException( + "spring.flyway.conjur-url=http://foo.com/secrets", "conjurUrl"); + } + + @Test + void conjurTokenIsCorrectlyMapped() { + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.conjur-token=5150", + "conjurToken"); + } + + @Test + void vaultUrlIsCorrectlyMapped() { + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.vault-url=http://foo.com/secrets", + "vaultUrl"); + } + + @Test + void vaultTokenIsCorrectlyMapped() { + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.vault-token=5150", "vaultToken"); + } + + @Test + void vaultSecretsIsCorrectlyMapped() { + assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.vault-secrets=kv/test/1/config", + "vaultSecrets"); + } + + @Test + private void assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException(String propertyKeyAndValue, + String flywayPropertyNameInException) { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.skip-executing-migrations=true").run((context) -> { + .withPropertyValues(propertyKeyAndValue).run((context) -> { assertThat(context).hasFailed(); Throwable failure = context.getStartupFailure(); assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(" skipExecutingMigrations "); + assertThat(failure).hasMessageContaining(String.format(" %s ", flywayPropertyNameInException)); }); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayPropertiesTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayPropertiesTests.java index f2c039997f95..aced00f80d74 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayPropertiesTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayPropertiesTests.java @@ -40,6 +40,7 @@ * Tests for {@link FlywayProperties}. * * @author Stephane Nicoll + * @author Chris Bono */ class FlywayPropertiesTests { @@ -108,9 +109,7 @@ void expectedPropertiesAreManaged() { // Handled by the conversion service ignoreProperties(configuration, "baselineVersionAsString", "encodingAsString", "locationsAsStrings", "targetAsString"); - // Teams-only properties that we cannot detect as no exception is thrown and // getters return null - ignoreProperties(configuration, "conjurToken", "conjurUrl", "vaultSecrets", "vaultToken", "vaultUrl"); // Handled as initSql array ignoreProperties(configuration, "initSql"); ignoreProperties(properties, "initSqls"); From 72044e1914e2dd73ce5dd8a548ae2ff3029e539c Mon Sep 17 00:00:00 2001 From: bono007 Date: Sat, 27 Feb 2021 13:28:35 -0600 Subject: [PATCH 2/4] Implement suggestions from code review --- .../flyway/FlywayAutoConfiguration.java | 2 +- .../flyway/FlywayProperties.java | 16 +-- .../flyway/FlywayAutoConfigurationTests.java | 105 +++++++++++------- 3 files changed, 71 insertions(+), 52 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java index 6d370abbb66a..93be73ff97f1 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java @@ -254,7 +254,7 @@ private void configureProperties(FluentConfiguration configuration, FlywayProper map.from(properties.getVaultUrl()).whenNonNull().to((vaultUrl) -> configuration.vaultUrl(vaultUrl)); map.from(properties.getVaultToken()).whenNonNull().to((vaultToken) -> configuration.vaultToken(vaultToken)); map.from(properties.getVaultSecrets()).whenNonNull() - .to((vaultSecrets) -> configuration.vaultSecrets(vaultSecrets)); + .to((vaultSecrets) -> configuration.vaultSecrets(vaultSecrets.toArray(new String[0]))); } private void configureCreateSchemas(FluentConfiguration configuration, boolean createSchemas) { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java index 70ef570ad44f..50ab27677196 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java @@ -330,31 +330,31 @@ public class FlywayProperties { private Boolean skipExecutingMigrations; /** - * The REST API URL of the Conjur server. Requires Flyway teams. + * REST API URL of the Conjur server. Requires Flyway teams. */ private String conjurUrl; /** - * The Conjur token required to access secrets. Requires Flyway teams. + * Conjur token required to access secrets. Requires Flyway teams. */ private String conjurToken; /** - * The REST API URL of the Vault server. Requires Flyway teams. + * REST API URL of the Vault server. Requires Flyway teams. */ private String vaultUrl; /** - * The Vault token required to access secrets. Requires Flyway teams. + * Vault token required to access secrets. Requires Flyway teams. */ private String vaultToken; /** - * A comma-separated list of paths to secrets that contain Flyway configurations. Each + * Comma-separated list of paths to secrets that contain Flyway configurations. Each * path must start with the name of the engine and end with the name of the secret * such 'kv/test/1/config'. Requires Flyway teams. */ - private String vaultSecrets; + private List vaultSecrets; public boolean isEnabled() { return this.enabled; @@ -832,11 +832,11 @@ public void setVaultToken(String vaultToken) { this.vaultToken = vaultToken; } - public String getVaultSecrets() { + public List getVaultSecrets() { return vaultSecrets; } - public void setVaultSecrets(String vaultSecrets) { + public void setVaultSecrets(List vaultSecrets) { this.vaultSecrets = vaultSecrets; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java index 2284953c9b7d..7f8d3c604730 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java @@ -46,7 +46,9 @@ import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.jdbc.SchemaManagement; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.context.annotation.Bean; @@ -413,19 +415,22 @@ void configurationCustomizersAreConfiguredAndOrdered() { @Test void batchIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.batch=true", "batch"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.batch=true").run(validateTeamsPropertyCorrectlyMapped("batch")); } @Test void dryRunOutputIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.dryRunOutput=dryrun.sql", - "dryRunOutput"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.dryRunOutput=dryrun.sql") + .run(validateTeamsPropertyCorrectlyMapped("dryRunOutput")); } @Test void errorOverridesIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.errorOverrides=D12345", - "errorOverrides"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.errorOverrides=D12345") + .run(validateTeamsPropertyCorrectlyMapped("errorOverrides")); } @Test @@ -437,25 +442,29 @@ void licenseKeyIsCorrectlyMapped(CapturedOutput output) { @Test void oracleSqlplusIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.oracle-sqlplus=true", - "oracle.sqlplus"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.oracle-sqlplus=true") + .run(validateTeamsPropertyCorrectlyMapped("oracle.sqlplus")); } @Test void oracleSqlplusWarnIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.oracle-sqlplus-warn=true", - "oracle.sqlplusWarn"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.oracle-sqlplus-warn=true") + .run(validateTeamsPropertyCorrectlyMapped("oracle.sqlplusWarn")); } @Test void streamIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.stream=true", "stream"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.stream=true").run(validateTeamsPropertyCorrectlyMapped("stream")); } @Test void undoSqlMigrationPrefix() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.undo-sql-migration-prefix=undo", - "undoSqlMigrationPrefix"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.undo-sql-migration-prefix=undo") + .run(validateTeamsPropertyCorrectlyMapped("undoSqlMigrationPrefix")); } @Test @@ -489,78 +498,79 @@ void initSqlsWithFlywayUrl() { @Test void cherryPickIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.cherry-pick=1.1", "cherryPick"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.cherry-pick=1.1") + .run(validateTeamsPropertyCorrectlyMapped("cherryPick")); } @Test void jdbcPropertiesAreCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.jdbc-properties.prop=value", - "jdbcProperties"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.jdbc-properties.prop=value") + .run(validateTeamsPropertyCorrectlyMapped("jdbcProperties")); } @Test void oracleKerberosCacheFileIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException( - "spring.flyway.oracle-kerberos-cache-file=/tmp/cache", "oracle.kerberosCacheFile"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.oracle-kerberos-cache-file=/tmp/cache") + .run(validateTeamsPropertyCorrectlyMapped("oracle.kerberosCacheFile")); } @Test void oracleKerberosConfigFileIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException( - "spring.flyway.oracle-kerberos-config-file=/tmp/config", "oracle.kerberosConfigFile"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.oracle-kerberos-config-file=/tmp/config") + .run(validateTeamsPropertyCorrectlyMapped("oracle.kerberosConfigFile")); } @Test void outputQueryResultsIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.output-query-results=false", - "outputQueryResults"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.output-query-results=false") + .run(validateTeamsPropertyCorrectlyMapped("outputQueryResults")); } @Test void skipExecutingMigrationsIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.skip-executing-migrations=true", - "skipExecutingMigrations"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.skip-executing-migrations=true") + .run(validateTeamsPropertyCorrectlyMapped("skipExecutingMigrations")); } @Test void conjurUrlIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException( - "spring.flyway.conjur-url=http://foo.com/secrets", "conjurUrl"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.conjur-url=http://foo.com/secrets") + .run(validateTeamsPropertyCorrectlyMapped("conjurUrl")); } @Test void conjurTokenIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.conjur-token=5150", - "conjurToken"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.conjur-token=5150") + .run(validateTeamsPropertyCorrectlyMapped("conjurToken")); } @Test void vaultUrlIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.vault-url=http://foo.com/secrets", - "vaultUrl"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.vault-url=http://foo.com/secrets") + .run(validateTeamsPropertyCorrectlyMapped("vaultUrl")); } @Test void vaultTokenIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.vault-token=5150", "vaultToken"); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withPropertyValues("spring.flyway.vault-token=5150") + .run(validateTeamsPropertyCorrectlyMapped("vaultToken")); } @Test void vaultSecretsIsCorrectlyMapped() { - assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException("spring.flyway.vault-secrets=kv/test/1/config", - "vaultSecrets"); - } - - @Test - private void assertThatPropertyResultsInFlywayTeamsUpgradeRequiredException(String propertyKeyAndValue, - String flywayPropertyNameInException) { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues(propertyKeyAndValue).run((context) -> { - assertThat(context).hasFailed(); - Throwable failure = context.getStartupFailure(); - assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); - assertThat(failure).hasMessageContaining(String.format(" %s ", flywayPropertyNameInException)); - }); + .withPropertyValues("spring.flyway.vault-secrets=kv/test/1/config,kv/test/2/config") + .run(validateTeamsPropertyCorrectlyMapped("vaultSecrets")); } @Test @@ -590,6 +600,15 @@ void whenCustomFlywayIsDefinedThenJooqDslContextDependsOnIt() { }); } + private ContextConsumer validateTeamsPropertyCorrectlyMapped(String propertyName) { + return (context) -> { + assertThat(context).hasFailed(); + Throwable failure = context.getStartupFailure(); + assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); + assertThat(failure).hasMessageContaining(String.format(" %s ", propertyName)); + }; + } + @Configuration(proxyBeanMethods = false) static class FlywayDataSourceConfiguration { From e7490bb0e3fc89a400cc9856be0940c020c9acfa Mon Sep 17 00:00:00 2001 From: bono007 Date: Sat, 27 Feb 2021 19:36:34 -0600 Subject: [PATCH 3/4] Removed old comment that was missed during removal of teams property ignores --- .../boot/autoconfigure/flyway/FlywayPropertiesTests.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayPropertiesTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayPropertiesTests.java index aced00f80d74..5a1ae774cd42 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayPropertiesTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayPropertiesTests.java @@ -109,7 +109,6 @@ void expectedPropertiesAreManaged() { // Handled by the conversion service ignoreProperties(configuration, "baselineVersionAsString", "encodingAsString", "locationsAsStrings", "targetAsString"); - // getters return null // Handled as initSql array ignoreProperties(configuration, "initSql"); ignoreProperties(properties, "initSqls"); From 8a5800f23df2ce6406ec83534917d63af1a48edd Mon Sep 17 00:00:00 2001 From: bono007 Date: Sat, 27 Feb 2021 22:31:47 -0600 Subject: [PATCH 4/4] Fix checkstyle issues w/ IDEA auto-gened getters (no this. ) --- .../boot/autoconfigure/flyway/FlywayProperties.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java index 50ab27677196..518531d30b28 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java @@ -801,7 +801,7 @@ public void setSkipExecutingMigrations(Boolean skipExecutingMigrations) { } public String getConjurUrl() { - return conjurUrl; + return this.conjurUrl; } public void setConjurUrl(String conjurUrl) { @@ -809,7 +809,7 @@ public void setConjurUrl(String conjurUrl) { } public String getConjurToken() { - return conjurToken; + return this.conjurToken; } public void setConjurToken(String conjurToken) { @@ -817,7 +817,7 @@ public void setConjurToken(String conjurToken) { } public String getVaultUrl() { - return vaultUrl; + return this.vaultUrl; } public void setVaultUrl(String vaultUrl) { @@ -825,7 +825,7 @@ public void setVaultUrl(String vaultUrl) { } public String getVaultToken() { - return vaultToken; + return this.vaultToken; } public void setVaultToken(String vaultToken) { @@ -833,7 +833,7 @@ public void setVaultToken(String vaultToken) { } public List getVaultSecrets() { - return vaultSecrets; + return this.vaultSecrets; } public void setVaultSecrets(List vaultSecrets) {