diff --git a/docs/src/main/asciidoc/spring-cloud-vault.adoc b/docs/src/main/asciidoc/spring-cloud-vault.adoc index a17a2503..22bba735 100644 --- a/docs/src/main/asciidoc/spring-cloud-vault.adoc +++ b/docs/src/main/asciidoc/spring-cloud-vault.adoc @@ -1308,6 +1308,7 @@ spring.cloud.vault: enabled: true min-renewal: 10s expiry-threshold: 1m + lease-endpoints: Legacy ---- ==== @@ -1315,5 +1316,6 @@ spring.cloud.vault: * `enabled` controls whether leases associated with secrets are considered to be renewed and expired secrets are rotated. Enabled by default. * `min-renewal` sets the duration that is at least required before renewing a lease. This setting prevents renewals from happening too often. * `expiry-threshold` sets the expiry threshold. A lease is renewed the configured period of time before it expires. +* `lease-endpoints` sets the endpoints for renew and revoke. Legacy for vault versions before 0.8 and SysLeases for later. See also: https://www.vaultproject.io/docs/concepts/lease.html[Vault Documentation: Lease, Renew, and Revoke] diff --git a/spring-cloud-vault-config/src/main/java/org/springframework/cloud/vault/config/VaultBootstrapPropertySourceConfiguration.java b/spring-cloud-vault-config/src/main/java/org/springframework/cloud/vault/config/VaultBootstrapPropertySourceConfiguration.java index 7fab5936..e592cf89 100644 --- a/spring-cloud-vault-config/src/main/java/org/springframework/cloud/vault/config/VaultBootstrapPropertySourceConfiguration.java +++ b/spring-cloud-vault-config/src/main/java/org/springframework/cloud/vault/config/VaultBootstrapPropertySourceConfiguration.java @@ -107,6 +107,10 @@ public class VaultBootstrapPropertySourceConfiguration implements InitializingBe secretLeaseContainer.setExpiryThreshold(lifecycle.getExpiryThreshold()); } + if (lifecycle.getLeaseEndpoints() != null) { + secretLeaseContainer.setLeaseEndpoints(lifecycle.getLeaseEndpoints()); + } + secretLeaseContainer.start(); return new LeasingVaultPropertySourceLocator(vaultProperties, configuration, diff --git a/spring-cloud-vault-config/src/main/java/org/springframework/cloud/vault/config/VaultProperties.java b/spring-cloud-vault-config/src/main/java/org/springframework/cloud/vault/config/VaultProperties.java index 7c4bed70..0fe12ae1 100644 --- a/spring-cloud-vault-config/src/main/java/org/springframework/cloud/vault/config/VaultProperties.java +++ b/spring-cloud-vault-config/src/main/java/org/springframework/cloud/vault/config/VaultProperties.java @@ -29,6 +29,7 @@ import org.springframework.core.env.Environment; import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; +import org.springframework.vault.core.lease.LeaseEndpoints; /** * @author Spencer Gibb @@ -499,6 +500,17 @@ public class VaultProperties implements EnvironmentAware { */ private Duration expiryThreshold; + /** + * Set the {@link LeaseEndpoints} to delegate renewal/revocation calls to. + * {@link LeaseEndpoints} encapsulates differences between Vault versions that affect + * the location of renewal/revocation endpoints. + * + * Can be SysLeases for version 0.8 or above of vault or Legacy for older versions (the default) + * + * @since 2.3 + */ + + private LeaseEndpoints leaseEndpoints; } } diff --git a/spring-cloud-vault-config/src/test/java/org/springframework/cloud/vault/config/VaultBootstrapPropertySourceConfigurationTests.java b/spring-cloud-vault-config/src/test/java/org/springframework/cloud/vault/config/VaultBootstrapPropertySourceConfigurationTests.java index 2353a0fa..eb9b98a5 100644 --- a/spring-cloud-vault-config/src/test/java/org/springframework/cloud/vault/config/VaultBootstrapPropertySourceConfigurationTests.java +++ b/spring-cloud-vault-config/src/test/java/org/springframework/cloud/vault/config/VaultBootstrapPropertySourceConfigurationTests.java @@ -16,20 +16,20 @@ package org.springframework.cloud.vault.config; -import java.time.Duration; - import org.junit.Test; - import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.vault.core.VaultOperations; +import org.springframework.vault.core.lease.LeaseEndpoints; import org.springframework.vault.core.lease.SecretLeaseContainer; -import static org.assertj.core.api.Assertions.assertThat; +import java.time.Duration; + import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; /** * Unit tests for {@link VaultBootstrapPropertySourceConfiguration}. @@ -48,15 +48,15 @@ public class VaultBootstrapPropertySourceConfigurationTests { this.contextRunner.withUserConfiguration(MockConfiguration.class) .withPropertyValues("spring.cloud.vault.generic.enabled=false", "spring.cloud.vault.config.lifecycle.expiry-threshold=5m", - "spring.cloud.vault.config.lifecycle.min-renewal=6m") + "spring.cloud.vault.config.lifecycle.min-renewal=6m", + "spring.cloud.vault.config.lifecycle.lease-endpoints=SysLeases") .run(context -> { SecretLeaseContainer container = context .getBean(SecretLeaseContainer.class); - assertThat(container.getExpiryThreshold()) - .isEqualTo(Duration.ofMinutes(5)); - assertThat(container.getMinRenewal()) - .isEqualTo(Duration.ofMinutes(6)); + verify(container).setExpiryThreshold(Duration.ofMinutes(5)); + verify(container).setMinRenewal(Duration.ofMinutes(6)); + verify(container).setLeaseEndpoints(LeaseEndpoints.SysLeases); }); } @@ -74,6 +74,10 @@ public class VaultBootstrapPropertySourceConfigurationTests { mock(ThreadPoolTaskScheduler.class)); } + @Bean + SecretLeaseContainer secretLeaseContainer() { + return mock(SecretLeaseContainer.class); + } } }