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 93be73ff97f..b270d524aa9 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 @@ -248,12 +248,11 @@ public class FlywayAutoConfiguration { .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() + map.from(properties.getConjurUrl()).to((conjurUrl) -> configuration.conjurUrl(conjurUrl)); + map.from(properties.getConjurToken()).to((conjurToken) -> configuration.conjurToken(conjurToken)); + map.from(properties.getVaultUrl()).to((vaultUrl) -> configuration.vaultUrl(vaultUrl)); + map.from(properties.getVaultToken()).to((vaultToken) -> configuration.vaultToken(vaultToken)); + map.from(properties.getVaultSecrets()).whenNot(List::isEmpty) .to((vaultSecrets) -> configuration.vaultSecrets(vaultSecrets.toArray(new String[0]))); } 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 518531d30b2..1d4adb81523 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -350,9 +350,10 @@ public class FlywayProperties { private String vaultToken; /** - * 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. + * Comma-separated list of paths to secrets that contain Flyway configurations. This + * must start with the name of the engine followed by '/data/' and end with the name + * of the secret. The resulting form is '{engine}/data/{path}/{to}/{secret_name}'. + * Requires Flyway teams. */ private List 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 7f8d3c60473..fcd4dfe1a12 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 @@ -416,21 +416,21 @@ class FlywayAutoConfigurationTests { @Test void batchIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.batch=true").run(validateTeamsPropertyCorrectlyMapped("batch")); + .withPropertyValues("spring.flyway.batch=true").run(validateFlywayTeamsPropertyOnly("batch")); } @Test void dryRunOutputIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.dryRunOutput=dryrun.sql") - .run(validateTeamsPropertyCorrectlyMapped("dryRunOutput")); + .run(validateFlywayTeamsPropertyOnly("dryRunOutput")); } @Test void errorOverridesIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.errorOverrides=D12345") - .run(validateTeamsPropertyCorrectlyMapped("errorOverrides")); + .run(validateFlywayTeamsPropertyOnly("errorOverrides")); } @Test @@ -444,27 +444,27 @@ class FlywayAutoConfigurationTests { void oracleSqlplusIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.oracle-sqlplus=true") - .run(validateTeamsPropertyCorrectlyMapped("oracle.sqlplus")); + .run(validateFlywayTeamsPropertyOnly("oracle.sqlplus")); } @Test void oracleSqlplusWarnIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.oracle-sqlplus-warn=true") - .run(validateTeamsPropertyCorrectlyMapped("oracle.sqlplusWarn")); + .run(validateFlywayTeamsPropertyOnly("oracle.sqlplusWarn")); } @Test void streamIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.stream=true").run(validateTeamsPropertyCorrectlyMapped("stream")); + .withPropertyValues("spring.flyway.stream=true").run(validateFlywayTeamsPropertyOnly("stream")); } @Test void undoSqlMigrationPrefix() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.undo-sql-migration-prefix=undo") - .run(validateTeamsPropertyCorrectlyMapped("undoSqlMigrationPrefix")); + .run(validateFlywayTeamsPropertyOnly("undoSqlMigrationPrefix")); } @Test @@ -499,78 +499,77 @@ class FlywayAutoConfigurationTests { @Test void cherryPickIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.cherry-pick=1.1") - .run(validateTeamsPropertyCorrectlyMapped("cherryPick")); + .withPropertyValues("spring.flyway.cherry-pick=1.1").run(validateFlywayTeamsPropertyOnly("cherryPick")); } @Test void jdbcPropertiesAreCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.jdbc-properties.prop=value") - .run(validateTeamsPropertyCorrectlyMapped("jdbcProperties")); + .run(validateFlywayTeamsPropertyOnly("jdbcProperties")); } @Test void oracleKerberosCacheFileIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.oracle-kerberos-cache-file=/tmp/cache") - .run(validateTeamsPropertyCorrectlyMapped("oracle.kerberosCacheFile")); + .run(validateFlywayTeamsPropertyOnly("oracle.kerberosCacheFile")); } @Test void oracleKerberosConfigFileIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.oracle-kerberos-config-file=/tmp/config") - .run(validateTeamsPropertyCorrectlyMapped("oracle.kerberosConfigFile")); + .run(validateFlywayTeamsPropertyOnly("oracle.kerberosConfigFile")); } @Test void outputQueryResultsIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.output-query-results=false") - .run(validateTeamsPropertyCorrectlyMapped("outputQueryResults")); + .run(validateFlywayTeamsPropertyOnly("outputQueryResults")); } @Test void skipExecutingMigrationsIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.skip-executing-migrations=true") - .run(validateTeamsPropertyCorrectlyMapped("skipExecutingMigrations")); + .run(validateFlywayTeamsPropertyOnly("skipExecutingMigrations")); } @Test void conjurUrlIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.conjur-url=http://foo.com/secrets") - .run(validateTeamsPropertyCorrectlyMapped("conjurUrl")); + .run(validateFlywayTeamsPropertyOnly("conjurUrl")); } @Test void conjurTokenIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.conjur-token=5150") - .run(validateTeamsPropertyCorrectlyMapped("conjurToken")); + .run(validateFlywayTeamsPropertyOnly("conjurToken")); } @Test void vaultUrlIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.vault-url=http://foo.com/secrets") - .run(validateTeamsPropertyCorrectlyMapped("vaultUrl")); + .run(validateFlywayTeamsPropertyOnly("vaultUrl")); } @Test void vaultTokenIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.flyway.vault-token=5150") - .run(validateTeamsPropertyCorrectlyMapped("vaultToken")); + .run(validateFlywayTeamsPropertyOnly("vaultToken")); } @Test void vaultSecretsIsCorrectlyMapped() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) - .withPropertyValues("spring.flyway.vault-secrets=kv/test/1/config,kv/test/2/config") - .run(validateTeamsPropertyCorrectlyMapped("vaultSecrets")); + .withPropertyValues("spring.flyway.vault-secrets=kv/data/test/1/config,kv/data/test/2/config") + .run(validateFlywayTeamsPropertyOnly("vaultSecrets")); } @Test @@ -600,7 +599,7 @@ class FlywayAutoConfigurationTests { }); } - private ContextConsumer validateTeamsPropertyCorrectlyMapped(String propertyName) { + private ContextConsumer validateFlywayTeamsPropertyOnly(String propertyName) { return (context) -> { assertThat(context).hasFailed(); Throwable failure = context.getStartupFailure();