-
Notifications
You must be signed in to change notification settings - Fork 41.6k
Provide configuration properties for Flyway's Vault and Conjur support #25456
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
c1a7d5f
72044e1
e7490bb
8a5800f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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; | ||
|
|
@@ -82,6 +84,7 @@ | |
| * @author Dominic Gunn | ||
| * @author András Deák | ||
| * @author Takaaki Shimbo | ||
| * @author Chris Bono | ||
| */ | ||
| @ExtendWith(OutputCaptureExtension.class) | ||
| class FlywayAutoConfigurationTests { | ||
|
|
@@ -413,34 +416,21 @@ 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 "); | ||
| }); | ||
| .withPropertyValues("spring.flyway.batch=true").run(validateTeamsPropertyCorrectlyMapped("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 "); | ||
| }); | ||
| .withPropertyValues("spring.flyway.dryRunOutput=dryrun.sql") | ||
| .run(validateTeamsPropertyCorrectlyMapped("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 "); | ||
| }); | ||
| .withPropertyValues("spring.flyway.errorOverrides=D12345") | ||
| .run(validateTeamsPropertyCorrectlyMapped("errorOverrides")); | ||
| } | ||
|
|
||
| @Test | ||
|
|
@@ -453,45 +443,28 @@ 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 "); | ||
| }); | ||
| .withPropertyValues("spring.flyway.oracle-sqlplus=true") | ||
| .run(validateTeamsPropertyCorrectlyMapped("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 "); | ||
| }); | ||
| .withPropertyValues("spring.flyway.oracle-sqlplus-warn=true") | ||
| .run(validateTeamsPropertyCorrectlyMapped("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 "); | ||
| }); | ||
| .withPropertyValues("spring.flyway.stream=true").run(validateTeamsPropertyCorrectlyMapped("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 "); | ||
| }); | ||
| .withPropertyValues("spring.flyway.undo-sql-migration-prefix=undo") | ||
| .run(validateTeamsPropertyCorrectlyMapped("undoSqlMigrationPrefix")); | ||
| } | ||
|
|
||
| @Test | ||
|
|
@@ -526,67 +499,78 @@ 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 "); | ||
| }); | ||
| .withPropertyValues("spring.flyway.cherry-pick=1.1") | ||
| .run(validateTeamsPropertyCorrectlyMapped("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 "); | ||
| }); | ||
| .withPropertyValues("spring.flyway.jdbc-properties.prop=value") | ||
| .run(validateTeamsPropertyCorrectlyMapped("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 "); | ||
| }); | ||
| .withPropertyValues("spring.flyway.oracle-kerberos-cache-file=/tmp/cache") | ||
| .run(validateTeamsPropertyCorrectlyMapped("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 "); | ||
| }); | ||
| .withPropertyValues("spring.flyway.oracle-kerberos-config-file=/tmp/config") | ||
| .run(validateTeamsPropertyCorrectlyMapped("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 "); | ||
| }); | ||
| .withPropertyValues("spring.flyway.output-query-results=false") | ||
| .run(validateTeamsPropertyCorrectlyMapped("outputQueryResults")); | ||
| } | ||
|
|
||
| @Test | ||
| void skipExecutingMigrationsIsCorrectlyMapped() { | ||
| this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) | ||
| .withPropertyValues("spring.flyway.skip-executing-migrations=true").run((context) -> { | ||
| assertThat(context).hasFailed(); | ||
| Throwable failure = context.getStartupFailure(); | ||
| assertThat(failure).hasRootCauseInstanceOf(FlywayTeamsUpgradeRequiredException.class); | ||
| assertThat(failure).hasMessageContaining(" skipExecutingMigrations "); | ||
| }); | ||
| .withPropertyValues("spring.flyway.skip-executing-migrations=true") | ||
| .run(validateTeamsPropertyCorrectlyMapped("skipExecutingMigrations")); | ||
| } | ||
|
|
||
| @Test | ||
| void conjurUrlIsCorrectlyMapped() { | ||
| this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) | ||
| .withPropertyValues("spring.flyway.conjur-url=http://foo.com/secrets") | ||
| .run(validateTeamsPropertyCorrectlyMapped("conjurUrl")); | ||
| } | ||
|
|
||
| @Test | ||
| void conjurTokenIsCorrectlyMapped() { | ||
| this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) | ||
| .withPropertyValues("spring.flyway.conjur-token=5150") | ||
| .run(validateTeamsPropertyCorrectlyMapped("conjurToken")); | ||
| } | ||
|
|
||
| @Test | ||
| void vaultUrlIsCorrectlyMapped() { | ||
| this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) | ||
| .withPropertyValues("spring.flyway.vault-url=http://foo.com/secrets") | ||
| .run(validateTeamsPropertyCorrectlyMapped("vaultUrl")); | ||
| } | ||
|
|
||
| @Test | ||
| void vaultTokenIsCorrectlyMapped() { | ||
| this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) | ||
| .withPropertyValues("spring.flyway.vault-token=5150") | ||
| .run(validateTeamsPropertyCorrectlyMapped("vaultToken")); | ||
| } | ||
|
|
||
| @Test | ||
| void vaultSecretsIsCorrectlyMapped() { | ||
| this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @snicoll thx for the suggestion. Keeping the setup in each test makes it easy to see what the test is doing from first glance. Sharing only the common validation reduces the duplicated lines (and that was the main goal of the first attempt). 👍🏻 |
||
| .withPropertyValues("spring.flyway.vault-secrets=kv/test/1/config,kv/test/2/config") | ||
| .run(validateTeamsPropertyCorrectlyMapped("vaultSecrets")); | ||
| } | ||
|
|
||
| @Test | ||
|
|
@@ -616,6 +600,15 @@ void whenCustomFlywayIsDefinedThenJooqDslContextDependsOnIt() { | |
| }); | ||
| } | ||
|
|
||
| private ContextConsumer<AssertableApplicationContext> 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 { | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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"); | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.